From 7685f1590f69e2f51ea318053c2924436cb0ae7d Mon Sep 17 00:00:00 2001 From: JoseAndresMR Date: Mon, 25 Jun 2018 16:19:07 +0200 Subject: [PATCH 1/4] for first merge with upstream --- pyModeS/streamer/stream.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyModeS/streamer/stream.py b/pyModeS/streamer/stream.py index 174afab..0c618e6 100644 --- a/pyModeS/streamer/stream.py +++ b/pyModeS/streamer/stream.py @@ -106,7 +106,8 @@ class Stream(): self.acs[icao]['lat'] = latlon[0] self.acs[icao]['lon'] = latlon[1] self.acs[icao]['alt'] = adsb.altitude(msg) - local_updated_acs_buffer.append(icao)acs[icao]['adsb_version'] + # local_updated_acs_buffer.append(icao)acs[icao]['adsb_version'] + local_updated_acs_buffer.append(acs[icao]['adsb_version']) # Uncertainty & accuracy if (5 <= tc <= 8): From 715d0a3c6692765a520ee0dfb159d36277b53013 Mon Sep 17 00:00:00 2001 From: JoseAndresMR Date: Tue, 26 Jun 2018 16:22:42 +0200 Subject: [PATCH 2/4] implementation of uncertainty values from csv files --- pyModeS/decoder/adsb.py | 228 +++++++++--------- pyModeS/decoder/adsb_ua_parameters/NACp.csv | 13 + pyModeS/decoder/adsb_ua_parameters/NACv.csv | 6 + pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv | 22 ++ pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv | 26 ++ pyModeS/decoder/adsb_ua_parameters/NUCp.csv | 18 ++ pyModeS/decoder/adsb_ua_parameters/NUCv.csv | 6 + pyModeS/decoder/adsb_ua_parameters/SIL.csv | 5 + pyModeS/streamer/stream.py | 52 ++-- 9 files changed, 241 insertions(+), 135 deletions(-) create mode 100644 pyModeS/decoder/adsb_ua_parameters/NACp.csv create mode 100644 pyModeS/decoder/adsb_ua_parameters/NACv.csv create mode 100644 pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv create mode 100644 pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv create mode 100644 pyModeS/decoder/adsb_ua_parameters/NUCp.csv create mode 100644 pyModeS/decoder/adsb_ua_parameters/NUCv.csv create mode 100644 pyModeS/decoder/adsb_ua_parameters/SIL.csv diff --git a/pyModeS/decoder/adsb.py b/pyModeS/decoder/adsb.py index 3230706..a604040 100644 --- a/pyModeS/decoder/adsb.py +++ b/pyModeS/decoder/adsb.py @@ -19,6 +19,7 @@ The wrapper for decoding ADS-B messages from __future__ import absolute_import, print_function, division from pyModeS.decoder import common +import pandas as pd # JoseAndresMR: I suppose you already have pandas in a common function, just change all occurrencies # from pyModeS.decoder.bds import bds05, bds06, bds09 from pyModeS.decoder.bds.bds05 import airborne_position, airborne_position_with_ref, altitude @@ -197,63 +198,30 @@ def version(msg): return version -def nic_v1(msg, nic_sup_b): - """Calculate NIC, navigation integrity category for ADS-B version 1 +def nic_v1(msg,nic_sup_b): + """Calculate NIC, navigation integrity category, for ADS-B version 1 Args: msg (string): 28 bytes hexadecimal message string nic_sup_b (int or string): NIC supplement Returns: - int: NIC number (from 0 to 11), -1 if not applicable + int or string: Horizontal Radius of Containment + int or string: Vertical Protection Limit """ if typecode(msg) < 5 or typecode(msg) > 22: raise RuntimeError("%s: Not a surface position message (5 22: raise RuntimeError("%s: Not a surface position message (5 22: + raise RuntimeError("%s: Not a surface position message (5>>>>>> upstream/master # Uncertainty & accuracy ac = self.acs[icao] if (5 <= tc <= 8) or (9 <= tc <= 18) or (20 <= tc <= 22): + if 20 <= tc <= 22: + ac['HPL'], ac['RCu'], ac['RCv'] = pms.adsb.nuc_p(msg) + else: + ac['HPL'], ac['RCu'] = pms.adsb.nuc_p(msg) + if (ac['ver'] == 1) and ('nic_s' in ac.keys()): - self.acs[icao]['NIC'] = pms.adsb.nic_v1(msg, ac['nic_s']) + ac['Rc'], ac['VPL'] = pms.adsb.nic_v1(msg, ac['nic_s']) elif (ac['ver'] == 2) and ('nic_a' in ac.keys()) and ('nic_b' in ac.keys()): - self.acs[icao]['NIC'] = pms.adsb.nic_v2(msg, ac['nic_a'], ac['nic_b'], ac['nic_c']) + ac['Rc'], ac['VPL'] = pms.adsb.nic_v2(msg, ac['nic_a'], ac['nic_b'], ac['nic_c']) + if tc == 19: + ac['HVE'], ac['VVE'] = pms.adsb.nuc_v(msg) if ac['ver'] in [1, 2]: - self.acs[icao]['NACv'] = pms.adsb.nac_v(msg) + ac['HFU'], ac['VEPU'] = pms.adsb.nac_v(msg) + if tc == 29: - if ac['ver'] != None: - self.acs[icao]['SIL'], self.acs[icao]['sil_s'] = pms.adsb.sil(msg, ac['ver']) - self.acs[icao]['NACp'] = pms.adsb.nac_p(msg) + if ac['ver'] == 1: + ac['PR_RCu'], ac['PE_VPL'] = pms.adsb.sil(msg, ac['ver']) + elif ac['ver'] == 2: + ac['PR_RCu'], ac['PE_VPL'], ac['sil_base'] = pms.adsb.sil(msg, ac['ver']) + ac['HFOMr'], ac['VFOMr'] = pms.adsb.nac_p(msg) + if tc == 31: - self.acs[icao]['ver'] = pms.adsb.version(msg) - self.acs[icao]['SIL'] = pms.adsb.version(msg) - self.acs[icao]['NACp'] = pms.adsb.nac_p(msg) - if self.acs[icao]['ver'] == 1: - self.acs[icao]['nic_s'] = pms.adsb.nic_s(msg) - elif self.acs[icao]['ver'] == 2: - self.acs[icao]['nic_a'], self.acs[icao]['nic_c'] = pms.adsb.nic_a_c(msg) + ac['ver'] = pms.adsb.version(msg) + ac['HFOMr'], ac['VFOMr'] = pms.adsb.nac_p(msg) + if ac['ver'] == 1: + ac['nic_s'] = pms.adsb.nic_s(msg) + ac['PR_RCu'], ac['PE_VPL'] = pms.adsb.sil(msg, ac['ver']) + elif ac['ver'] == 2: + ac['nic_a'], ac['nic_c'] = pms.adsb.nic_a_c(msg) + ac['PR_RCu'], ac['PE_VPL'], ac['sil_base'] = pms.adsb.sil(msg, ac['ver']) # process commb message From 44b277f0adea3cc8f6b99c220d855eae2a3e2d04 Mon Sep 17 00:00:00 2001 From: JoseAndresMR Date: Tue, 26 Jun 2018 23:15:57 +0200 Subject: [PATCH 3/4] various fixing --- pyModeS/decoder/adsb.py | 10 +++++----- pyModeS/decoder/adsb_ua_parameters/NACv.csv | 8 ++++---- pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv | 16 ++++++++-------- pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv | 6 +++--- pyModeS/decoder/adsb_ua_parameters/NUCp.csv | 6 +++--- pyModeS/decoder/adsb_ua_parameters/NUCv.csv | 8 ++++---- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pyModeS/decoder/adsb.py b/pyModeS/decoder/adsb.py index a604040..ec0d9d2 100644 --- a/pyModeS/decoder/adsb.py +++ b/pyModeS/decoder/adsb.py @@ -246,11 +246,11 @@ def nic_v2(msg, nic_a, nic_b, nic_c): nic_df = pd.read_csv('/home/josmilrom/Libraries/pyModeS/pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv', sep=',') if tc in range(5,9): - nic_df_extract = [(nic_df.TC == tc) & (nic_df.NICa == nic_a) & (nic_df.NICc == nic_c)] + nic_df_extract = nic_df[(nic_df.TC == tc) & (nic_df.NICa == nic_a) & (nic_df.NICc == nic_c)] elif tc in range(9,19): - nic_df_extract = [(nic_df.TC == tc) & (nic_df.NICa == nic_a) & (nic_df.NICb == nic_b)] + nic_df_extract = nic_df[(nic_df.TC == tc) & (nic_df.NICa == nic_a) & (nic_df.NICb == nic_b)] elif tc in range(20,23): - nic_df_extract = [nic_df.TC == tc] + nic_df_extract = nic_df[nic_df.TC == tc] Rc = nic_df_extract['Rc'][0] @@ -341,10 +341,10 @@ def nac_p(msg): if tc == 29: nac_p = common.bin2int(msgbin[71:75]) - nacp_df_extract = nac_p[nacp_df.NACp == nac_p] + nacp_df_extract = nacp_df[nacp_df.NACp == nac_p] elif tc == 31: nac_p = common.bin2int(msgbin[76:80]) - nacp_df_extract = nac_p[nacp_df.NACp == nac_p] + nacp_df_extract = nacp_df[nacp_df.NACp == nac_p] HFU = nacp_df_extract['HFU'][0] VEPU = nacp_df_extract['VEPU'][0] diff --git a/pyModeS/decoder/adsb_ua_parameters/NACv.csv b/pyModeS/decoder/adsb_ua_parameters/NACv.csv index d5a8d25..ea2c325 100644 --- a/pyModeS/decoder/adsb_ua_parameters/NACv.csv +++ b/pyModeS/decoder/adsb_ua_parameters/NACv.csv @@ -1,6 +1,6 @@ NAVc,HFOMr,VFOMr 0,'unknown’,'unknown’ -1,10,"15,2" -2,3,"4,5" -3,1,"1,5" -4,"0,3","0,46" +1,10,15.2 +2,3,4.5 +3,1,1.5 +4,0.3,0.46 diff --git a/pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv b/pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv index d5fe23a..6befdfb 100644 --- a/pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv +++ b/pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv @@ -1,11 +1,11 @@ TC,NICs,NIC,Rc,VPL -5,0,12,"7,5",'undefined’ -6,0,11,25,'undefined’ -7,1,10,75,'undefined’ -7,0,9,185,'undefined’ +5,0,11,7.5,'undefined’ +6,0,10,25,'undefined’ +7,1,9,75,'undefined’ +7,0,8,185,'undefined’ 8,0,1,'unknown’,'undefined’ -9,0,11,"7,5",11 -10,0,10,25,"37,5" +9,0,11,7.5,11 +10,0,10,25,37.5 11,1,9,75,112 11,0,8,185,'undefined’ 12,0,7,370,'undefined’ @@ -17,6 +17,6 @@ TC,NICs,NIC,Rc,VPL 16,0,2,14008,'undefined’ 17,0,1,37000,'undefined’ 18,0,0,'unknown’,'undefined’ -20,0,11,"7,5",11 -21,0,10,25,"37,5" +20,0,11,7.5,11 +21,0,10,25,37.5 22,0,0,'unknown’,112 diff --git a/pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv b/pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv index 47eb6cf..d2d0119 100644 --- a/pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv +++ b/pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv @@ -1,5 +1,5 @@ TC,NICa,NICb,NICc,NIC,Rc -5,0,0,0,11,"7,5" +5,0,0,0,11,7.5 6,0,0,0,10,25 7,1,0,0,9,75 7,0,0,0,8,185 @@ -7,7 +7,7 @@ TC,NICa,NICb,NICc,NIC,Rc 8,1,0,0,6,556 8,0,0,1,6,1111 8,0,0,0,0,'unknown’ -9,0,0,0,11,"7,5" +9,0,0,0,11,7.5 10,0,0,0,10,25 11,1,1,0,9,75 11,0,0,0,8,185 @@ -21,6 +21,6 @@ TC,NICa,NICb,NICc,NIC,Rc 16,0,0,0,2,14800 17,0,0,0,1,37000 18,0,0,0,0,'unknown’ -20,0,0,0,11,"7,5" +20,0,0,0,11,7.5 21,0,0,0,10,25 22,0,0,0,0,'unknown’ diff --git a/pyModeS/decoder/adsb_ua_parameters/NUCp.csv b/pyModeS/decoder/adsb_ua_parameters/NUCp.csv index e131e4c..2a84020 100644 --- a/pyModeS/decoder/adsb_ua_parameters/NUCp.csv +++ b/pyModeS/decoder/adsb_ua_parameters/NUCp.csv @@ -1,9 +1,9 @@ TC,NUCp,HPL,Rcu,Rcv -5,9,"7,5",3,'undefined’ +5,9,7.5,3,'undefined’ 6,8,25,10,'undefined’ 7,7,185,93,'undefined’ 8,6,'unknown’,'unknown’,'undefined’ -9,9,"7,5",3,'undefined’ +9,9,7.5,3,'undefined’ 10,8,25,10,'undefined’ 11,7,185,93,'undefined’ 12,6,370,185,'undefined’ @@ -13,6 +13,6 @@ TC,NUCp,HPL,Rcu,Rcv 16,2,18520,9260,'undefined’ 17,1,37040,18520,'undefined’ 18,0,'unknown’,'unknown’,'undefined’ -20,9,"7,5",3,4 +20,9,7.5,3,4 21,8,25,10,15 22,0,'unknown’,'unknown’,'unknown’ diff --git a/pyModeS/decoder/adsb_ua_parameters/NUCv.csv b/pyModeS/decoder/adsb_ua_parameters/NUCv.csv index bf45a30..f5645a5 100644 --- a/pyModeS/decoder/adsb_ua_parameters/NUCv.csv +++ b/pyModeS/decoder/adsb_ua_parameters/NUCv.csv @@ -1,6 +1,6 @@ NUCp,HVE,VVE 0,'unknown’,'unknown’ -1,10,"15,2" -2,3,"4,5" -3,1,"1,5" -4,"0,3","1,46" +1,10,15.2 +2,3,4.5 +3,1,1.5 +4,0.3,1.46 From 0df6a664a35e54413f9bc27576773ab4dcefd8cb Mon Sep 17 00:00:00 2001 From: Junzi Sun Date: Wed, 27 Jun 2018 22:08:13 +0200 Subject: [PATCH 4/4] resturctue the uncertainty module, and some additional fixings. --- pyModeS/__init__.py | 5 +- pyModeS/decoder/adsb.py | 246 +++++++++--------- pyModeS/decoder/adsb_ua_parameters/NACp.csv | 13 - pyModeS/decoder/adsb_ua_parameters/NACv.csv | 6 - pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv | 22 -- pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv | 26 -- pyModeS/decoder/adsb_ua_parameters/NUCp.csv | 18 -- pyModeS/decoder/adsb_ua_parameters/NUCv.csv | 6 - pyModeS/decoder/adsb_ua_parameters/SIL.csv | 5 - pyModeS/decoder/uncertainty.py | 120 +++++++++ pyModeS/streamer/pmslive | 1 + pyModeS/streamer/screen.py | 17 +- pyModeS/streamer/stream.py | 42 +-- tests/test_adsb.py | 26 +- 14 files changed, 298 insertions(+), 255 deletions(-) delete mode 100644 pyModeS/decoder/adsb_ua_parameters/NACp.csv delete mode 100644 pyModeS/decoder/adsb_ua_parameters/NACv.csv delete mode 100644 pyModeS/decoder/adsb_ua_parameters/NIC_v1.csv delete mode 100644 pyModeS/decoder/adsb_ua_parameters/NIC_v2.csv delete mode 100644 pyModeS/decoder/adsb_ua_parameters/NUCp.csv delete mode 100644 pyModeS/decoder/adsb_ua_parameters/NUCv.csv delete mode 100644 pyModeS/decoder/adsb_ua_parameters/SIL.csv create mode 100644 pyModeS/decoder/uncertainty.py diff --git a/pyModeS/__init__.py b/pyModeS/__init__.py index 31b6ee8..3cf9c09 100644 --- a/pyModeS/__init__.py +++ b/pyModeS/__init__.py @@ -6,7 +6,10 @@ from .decoder import commb from .decoder import common from .decoder import bds from .extra import aero -from .extra import beastclient +from .extra import tcpclient from .decoder import els # depricated from .decoder import ehs # depricated + +import os +dirpath = os.path.dirname(os.path.realpath(__file__)) diff --git a/pyModeS/decoder/adsb.py b/pyModeS/decoder/adsb.py index ec0d9d2..ce1b1bb 100644 --- a/pyModeS/decoder/adsb.py +++ b/pyModeS/decoder/adsb.py @@ -18,10 +18,12 @@ The wrapper for decoding ADS-B messages """ from __future__ import absolute_import, print_function, division -from pyModeS.decoder import common -import pandas as pd # JoseAndresMR: I suppose you already have pandas in a common function, just change all occurrencies -# from pyModeS.decoder.bds import bds05, bds06, bds09 +import pyModeS as pms +from pyModeS.decoder import common +from pyModeS.decoder import uncertainty + +# from pyModeS.decoder.bds import bds05, bds06, bds09 from pyModeS.decoder.bds.bds05 import airborne_position, airborne_position_with_ref, altitude from pyModeS.decoder.bds.bds06 import surface_position, surface_position_with_ref, surface_velocity from pyModeS.decoder.bds.bds08 import category, callsign @@ -198,65 +200,127 @@ def version(msg): return version -def nic_v1(msg,nic_sup_b): +def nuc_p(msg): + """Calculate NUCp, Navigation Uncertainty Category - Position (ADS-B version 1) + + Args: + msg (string): 28 bytes hexadecimal message string, + + Returns: + int: Horizontal Protection Limit + int: 95% Containment Radius - Horizontal (meters) + int: 95% Containment Radius - Vertical (meters) + + """ + tc = typecode(msg) + + if typecode(msg) < 5 or typecode(msg) > 22: + raise RuntimeError( + "%s: Not a surface position message (5 22: - raise RuntimeError("%s: Not a surface position message (5 22: - raise RuntimeError("%s: Not a surface position message (5 22: - raise RuntimeError("%s: Not a surface position message (5