diff --git a/pyModeS/__init__.py b/pyModeS/__init__.py index 894af68..31b6ee8 100644 --- a/pyModeS/__init__.py +++ b/pyModeS/__init__.py @@ -2,9 +2,11 @@ from __future__ import absolute_import, print_function, division from .decoder.common import * from .decoder import adsb -from .decoder import els -from .decoder import ehs +from .decoder import commb from .decoder import common from .decoder import bds from .extra import aero from .extra import beastclient + +from .decoder import els # depricated +from .decoder import ehs # depricated diff --git a/pyModeS/decoder/bds/__init__.py b/pyModeS/decoder/bds/__init__.py index 48e1572..b18d7ed 100644 --- a/pyModeS/decoder/bds/__init__.py +++ b/pyModeS/decoder/bds/__init__.py @@ -22,7 +22,7 @@ from __future__ import absolute_import, print_function, division import numpy as np from pyModeS.extra import aero -from pyModeS.decoder.common import allzeros +from pyModeS.decoder import common from pyModeS.decoder.bds import bds05, bds06, bds08, bds09, \ bds10, bds17, bds20, bds30, bds40, bds44, bds50, bds53, bds60 @@ -98,9 +98,33 @@ def infer(msg): String or None: BDS version, or possible versions, or None if nothing matches. """ - if allzeros(msg): + df = common.df(msg) + + if common.allzeros(msg): return None + # For ADS-B / Mode-S extended squitter + if df == 17: + tc = common.typecode(msg) + + if 1 <= tc <= 4: + return 'BDS08' # indentification and category + if 5 <= tc <= 8: + return 'BDS06' # surface movement + if 9 <= tc <= 18: + return 'BDS05' # airborne position, baro-alt + if tc == 19: + return 'BDS09' # airborne velocity + if 20 <= tc <= 22: + return 'BDS05' # airborne position, gnss-alt + if tc == 28: + return 'BDS61' # aircraft status + if tc == 29: + return 'BDS62' # target state and status + if tc == 31: + return 'BDS65' # operational status + + # For Comm-B replies, ELS + EHS only IS10 = bds10.is10(msg) IS17 = bds17.is17(msg) IS20 = bds20.is20(msg) diff --git a/pyModeS/decoder/commb.py b/pyModeS/decoder/commb.py new file mode 100644 index 0000000..f33040f --- /dev/null +++ b/pyModeS/decoder/commb.py @@ -0,0 +1,15 @@ +from __future__ import absolute_import, print_function, division + +# ELS - elementary surveillance +from pyModeS.decoder.bds.bds10 import * +from pyModeS.decoder.bds.bds17 import * +from pyModeS.decoder.bds.bds20 import * +from pyModeS.decoder.bds.bds30 import * + +# ELS - enhanced surveillance +from pyModeS.decoder.bds.bds40 import * +from pyModeS.decoder.bds.bds50 import * +from pyModeS.decoder.bds.bds60 import * + +# MRAR +from pyModeS.decoder.bds.bds44 import * diff --git a/pyModeS/decoder/ehs.py b/pyModeS/decoder/ehs.py index 05451d2..18fa98e 100644 --- a/pyModeS/decoder/ehs.py +++ b/pyModeS/decoder/ehs.py @@ -1,12 +1,14 @@ from __future__ import absolute_import, print_function, division import warnings -warnings.simplefilter('once', DeprecationWarning) from pyModeS.decoder.bds.bds40 import * from pyModeS.decoder.bds.bds50 import * from pyModeS.decoder.bds.bds60 import * from pyModeS.decoder.bds import infer +warnings.simplefilter('once', DeprecationWarning) +warnings.warn("pms.ehs module is deprecated. Please use pms.commb instead.", DeprecationWarning) + def BDS(msg): warnings.warn("pms.ehs.BDS() is deprecated, use pms.bds.infer() instead.", DeprecationWarning) return infer(msg) diff --git a/pyModeS/decoder/els.py b/pyModeS/decoder/els.py index 1e9f0b0..e040306 100644 --- a/pyModeS/decoder/els.py +++ b/pyModeS/decoder/els.py @@ -4,3 +4,7 @@ from pyModeS.decoder.bds.bds10 import * from pyModeS.decoder.bds.bds17 import * from pyModeS.decoder.bds.bds20 import * from pyModeS.decoder.bds.bds30 import * + +import warnings +warnings.simplefilter('once', DeprecationWarning) +warnings.warn("pms.els module is deprecated. Please use pms.commb instead.", DeprecationWarning) diff --git a/tests/data/sample_data_ehs_df20.csv b/tests/data/sample_data_commb_df20.csv similarity index 100% rename from tests/data/sample_data_ehs_df20.csv rename to tests/data/sample_data_commb_df20.csv diff --git a/tests/data/sample_data_ehs_df21.csv b/tests/data/sample_data_commb_df21.csv similarity index 100% rename from tests/data/sample_data_ehs_df21.csv rename to tests/data/sample_data_commb_df21.csv diff --git a/tests/sample_run_bds.py b/tests/sample_run_commb.py similarity index 54% rename from tests/sample_run_bds.py rename to tests/sample_run_commb.py index 5548173..2ef3036 100644 --- a/tests/sample_run_bds.py +++ b/tests/sample_run_commb.py @@ -1,32 +1,32 @@ from __future__ import print_function -from pyModeS import ehs, common, bds +from pyModeS import commb, common, bds # === Decode sample data file === def bds_info(BDS, m): if BDS == "BDS10": - info = [bds.bds10.ovc10(m)] + info = [commb.ovc10(m)] elif BDS == "BDS17": - info = ([i[-2:] for i in bds.bds17.cap17(m)]) + info = ([i[-2:] for i in commb.cap17(m)]) elif BDS == "BDS20": - info = [bds.bds20.cs20(m)] + info = [commb.cs20(m)] elif BDS == "BDS40": - info = (bds.bds40.alt40mcp(m), bds.bds40.alt40fms(m), bds.bds40.p40baro(m)) + info = (commb.alt40mcp(m), commb.alt40fms(m), commb.p40baro(m)) elif BDS == "BDS44": - info = (bds.bds44.wind44(m), bds.bds44.temp44(m), bds.bds44.p44(m), bds.bds44.hum44(m)) + info = (commb.wind44(m), commb.temp44(m), commb.p44(m), commb.hum44(m)) elif BDS == "BDS44REV": - info = (bds.bds44.wind44(m, rev=True), bds.bds44.temp44(m, rev=True), bds.bds44.p44(m, rev=True), bds.bds44.hum44(m, rev=True)) + info = (commb.wind44(m, rev=True), commb.temp44(m, rev=True), commb.p44(m, rev=True), commb.hum44(m, rev=True)) elif BDS == "BDS50": - info = (bds.bds50.roll50(m), bds.bds50.trk50(m), bds.bds50.gs50(m), bds.bds50.rtrk50(m), bds.bds50.tas50(m)) + info = (commb.roll50(m), commb.trk50(m), commb.gs50(m), commb.rtrk50(m), commb.tas50(m)) elif BDS == "BDS60": - info = (bds.bds60.hdg60(m), bds.bds60.ias60(m), bds.bds60.mach60(m), bds.bds60.vr60baro(m), bds.bds60.vr60ins(m)) + info = (commb.hdg60(m), commb.ias60(m), commb.mach60(m), commb.vr60baro(m), commb.vr60ins(m)) else: info = None @@ -34,12 +34,12 @@ def bds_info(BDS, m): return info -def ehs_decode_all(df, n=None): +def commb_decode_all(df, n=None): import csv - print("===== Decode EHS sample data (DF=%s)=====" % df) + print("===== Decode Comm-B sample data (DF=%s)=====" % df) - f = open('tests/data/sample_data_ehs_df%s.csv' % df, 'rt') + f = open('tests/data/sample_data_commb_df%s.csv' % df, 'rt') for i, r in enumerate(csv.reader(f)): @@ -50,7 +50,7 @@ def ehs_decode_all(df, n=None): m = r[2] df = common.df(m) - icao = ehs.icao(m) + icao = common.icao(m) BDS = bds.infer(m) code = common.altcode(m) if df == 20 else common.idcode(m) @@ -69,6 +69,7 @@ def ehs_decode_all(df, n=None): else: print(ts, m, icao, df, '%5s'%code, BDS, *bds_info(BDS, m)) + if __name__ == '__main__': - ehs_decode_all(df=20, n=100) - ehs_decode_all(df=21, n=100) + commb_decode_all(df=20, n=100) + commb_decode_all(df=21, n=100) diff --git a/tests/test_bds_inference.py b/tests/test_bds_inference.py new file mode 100644 index 0000000..f7b8f2f --- /dev/null +++ b/tests/test_bds_inference.py @@ -0,0 +1,20 @@ +from pyModeS import bds + +def test_bds_infer(): + assert bds.infer("8D406B902015A678D4D220AA4BDA") == 'BDS08' + assert bds.infer("8FC8200A3AB8F5F893096B000000") == 'BDS06' + assert bds.infer("8D40058B58C901375147EFD09357") == 'BDS05' + assert bds.infer("8D485020994409940838175B284F") == 'BDS09' + + assert bds.infer("A800178D10010080F50000D5893C") == 'BDS10' + assert bds.infer("A0000638FA81C10000000081A92F") == 'BDS17' + assert bds.infer("A0001838201584F23468207CDFA5") == 'BDS20' + assert bds.infer("A0001839CA3800315800007448D9") == 'BDS40' + assert bds.infer("A000139381951536E024D4CCF6B5") == 'BDS50' + assert bds.infer("A00004128F39F91A7E27C46ADC21") == 'BDS60' + + +def test_bds_is50or60(): + assert bds.is50or60("A0001838201584F23468207CDFA5", 0, 0, 0) == None + assert bds.is50or60("A0000000FFDA9517000464000000", 182, 237, 1250) == 'BDS50' + assert bds.is50or60("A0000000919A5927E23444000000", 413, 54, 18700) == 'BDS60' diff --git a/tests/test_bds.py b/tests/test_commb.py similarity index 63% rename from tests/test_bds.py rename to tests/test_commb.py index 951802c..1858017 100644 --- a/tests/test_bds.py +++ b/tests/test_commb.py @@ -1,37 +1,46 @@ -from pyModeS import bds, ehs, els +from pyModeS import bds, commb +from pyModeS import ehs, els # depricated -def test_bds_infer(): - assert bds.infer("A0001838201584F23468207CDFA5") == 'BDS20' - assert bds.infer("A0001839CA3800315800007448D9") == 'BDS40' - assert bds.infer("A000139381951536E024D4CCF6B5") == 'BDS50' - assert bds.infer("A00004128F39F91A7E27C46ADC21") == 'BDS60' - -def test_bds_is50or60(): - assert bds.is50or60("A0001838201584F23468207CDFA5", 0, 0, 0) == None - assert bds.is50or60("A0000000FFDA9517000464000000", 182, 237, 1250) == 'BDS50' - assert bds.is50or60("A0000000919A5927E23444000000", 413, 54, 18700) == 'BDS60' - -def test_els_BDS20_callsign(): +def test_bds20_callsign(): assert bds.bds20.cs20("A000083E202CC371C31DE0AA1CCF") == 'KLM1017_' assert bds.bds20.cs20("A0001993202422F2E37CE038738E") == 'IBK2873_' + + assert commb.cs20("A000083E202CC371C31DE0AA1CCF") == 'KLM1017_' + assert commb.cs20("A0001993202422F2E37CE038738E") == 'IBK2873_' + assert els.cs20("A000083E202CC371C31DE0AA1CCF") == 'KLM1017_' assert els.cs20("A0001993202422F2E37CE038738E") == 'IBK2873_' -def test_ehs_BDS40_functions(): + +def test_bds40_functions(): assert bds.bds40.alt40mcp("A000029C85E42F313000007047D3") == 3008 assert bds.bds40.alt40fms("A000029C85E42F313000007047D3") == 3008 assert bds.bds40.p40baro("A000029C85E42F313000007047D3") == 1020.0 + + assert commb.alt40mcp("A000029C85E42F313000007047D3") == 3008 + assert commb.alt40fms("A000029C85E42F313000007047D3") == 3008 + assert commb.p40baro("A000029C85E42F313000007047D3") == 1020.0 + assert ehs.alt40mcp("A000029C85E42F313000007047D3") == 3008 assert ehs.alt40fms("A000029C85E42F313000007047D3") == 3008 assert ehs.p40baro("A000029C85E42F313000007047D3") == 1020.0 -def test_ehs_BDS50_functions(): + +def test_bds50_functions(): assert bds.bds50.roll50("A000139381951536E024D4CCF6B5") == 2.1 assert bds.bds50.roll50("A0001691FFD263377FFCE02B2BF9") == -0.4 # signed value assert bds.bds50.trk50("A000139381951536E024D4CCF6B5") == 114.258 assert bds.bds50.gs50("A000139381951536E024D4CCF6B5") == 438 assert bds.bds50.rtrk50("A000139381951536E024D4CCF6B5") == 0.125 assert bds.bds50.tas50("A000139381951536E024D4CCF6B5") == 424 + + assert commb.roll50("A000139381951536E024D4CCF6B5") == 2.1 + assert commb.roll50("A0001691FFD263377FFCE02B2BF9") == -0.4 # signed value + assert commb.trk50("A000139381951536E024D4CCF6B5") == 114.258 + assert commb.gs50("A000139381951536E024D4CCF6B5") == 438 + assert commb.rtrk50("A000139381951536E024D4CCF6B5") == 0.125 + assert commb.tas50("A000139381951536E024D4CCF6B5") == 424 + assert ehs.roll50("A000139381951536E024D4CCF6B5") == 2.1 assert ehs.roll50("A0001691FFD263377FFCE02B2BF9") == -0.4 # signed value assert ehs.trk50("A000139381951536E024D4CCF6B5") == 114.258 @@ -39,12 +48,20 @@ def test_ehs_BDS50_functions(): assert ehs.rtrk50("A000139381951536E024D4CCF6B5") == 0.125 assert ehs.tas50("A000139381951536E024D4CCF6B5") == 424 -def test_ehs_BDS60_functions(): + +def test_bds60_functions(): assert bds.bds60.hdg60("A00004128F39F91A7E27C46ADC21") == 42.715 assert bds.bds60.ias60("A00004128F39F91A7E27C46ADC21") == 252 assert bds.bds60.mach60("A00004128F39F91A7E27C46ADC21") == 0.42 assert bds.bds60.vr60baro("A00004128F39F91A7E27C46ADC21") == -1920 assert bds.bds60.vr60ins("A00004128F39F91A7E27C46ADC21") == -1920 + + assert commb.hdg60("A00004128F39F91A7E27C46ADC21") == 42.715 + assert commb.ias60("A00004128F39F91A7E27C46ADC21") == 252 + assert commb.mach60("A00004128F39F91A7E27C46ADC21") == 0.42 + assert commb.vr60baro("A00004128F39F91A7E27C46ADC21") == -1920 + assert commb.vr60ins("A00004128F39F91A7E27C46ADC21") == -1920 + assert ehs.hdg60("A00004128F39F91A7E27C46ADC21") == 42.715 assert ehs.ias60("A00004128F39F91A7E27C46ADC21") == 252 assert ehs.mach60("A00004128F39F91A7E27C46ADC21") == 0.42