diff --git a/pyModeS/decoder/commb.py b/pyModeS/decoder/commb.py index 4957681..d49d293 100644 --- a/pyModeS/decoder/commb.py +++ b/pyModeS/decoder/commb.py @@ -36,3 +36,5 @@ from pyModeS.decoder.bds.bds60 import * # MRAR and MHR from pyModeS.decoder.bds.bds44 import * from pyModeS.decoder.bds.bds45 import * + +from pyModeS.py_common import fs, dr, um diff --git a/pyModeS/decoder/surv.py b/pyModeS/decoder/surv.py index ceec90c..4e54614 100644 --- a/pyModeS/decoder/surv.py +++ b/pyModeS/decoder/surv.py @@ -3,6 +3,7 @@ Decode short roll call surveillance replies, with downlink format 4 or 5 """ from pyModeS import common +from pyModeS.py_common import fs, dr, um def _checkdf(func): @@ -19,91 +20,6 @@ def _checkdf(func): return wrapper -@_checkdf -def fs(msg): - """Decode flight status. - - Args: - msg (str): 14 hexdigits string - Returns: - int, str: flight status, description - - """ - msgbin = common.hex2bin(msg) - fs = common.bin2int(msgbin[5:8]) - text = None - - if fs == 0: - text = "no alert, no SPI, aircraft is airborne" - elif fs == 1: - text = "no alert, no SPI, aircraft is on-ground" - elif fs == 2: - text = "alert, no SPI, aircraft is airborne" - elif fs == 3: - text = "alert, no SPI, aircraft is on-ground" - elif fs == 4: - text = "alert, SPI, aircraft is airborne or on-ground" - elif fs == 5: - text = "no alert, SPI, aircraft is airborne or on-ground" - - return fs, text - - -@_checkdf -def dr(msg): - """Decode downlink request. - - Args: - msg (str): 14 hexdigits string - Returns: - int, str: downlink request, description - - """ - msgbin = common.hex2bin(msg) - dr = common.bin2int(msgbin[8:13]) - - text = None - - if dr == 0: - text = "no downlink request" - elif dr == 1: - text = "request to send Comm-B message" - elif dr == 4: - text = "Comm-B broadcast 1 available" - elif dr == 5: - text = "Comm-B broadcast 2 available" - elif dr >= 16: - text = "ELM downlink segments available: {}".format(dr - 15) - - return dr, text - - -@_checkdf -def um(msg): - """Decode utility message. - - Utility message contains interrogator identifier and reservation type. - - Args: - msg (str): 14 hexdigits string - Returns: - int, str: interrogator identifier code that triggered the reply, and - reservation type made by the interrogator - """ - msgbin = common.hex2bin(msg) - iis = common.bin2int(msgbin[13:17]) - ids = common.bin2int(msgbin[17:19]) - if ids == 0: - ids_text = None - if ids == 1: - ids_text = "Comm-B interrogator identifier code" - if ids == 2: - ids_text = "Comm-C interrogator identifier code" - if ids == 3: - ids_text = "Comm-D interrogator identifier code" - return iis, ids, ids_text - - @_checkdf def altitude(msg): """Decode altitude. diff --git a/pyModeS/py_common.py b/pyModeS/py_common.py index 0b299ee..b6af728 100644 --- a/pyModeS/py_common.py +++ b/pyModeS/py_common.py @@ -404,3 +404,85 @@ def wrongstatus(data: str, sb: int, msb: int, lsb: int) -> bool: return True return False + + +def fs(msg): + """Decode flight status for DF 4, 5, 20, and 21. + + Args: + msg (str): 14 hexdigits string + Returns: + int, str: flight status, description + + """ + msgbin = hex2bin(msg) + fs = bin2int(msgbin[5:8]) + text = None + + if fs == 0: + text = "no alert, no SPI, aircraft is airborne" + elif fs == 1: + text = "no alert, no SPI, aircraft is on-ground" + elif fs == 2: + text = "alert, no SPI, aircraft is airborne" + elif fs == 3: + text = "alert, no SPI, aircraft is on-ground" + elif fs == 4: + text = "alert, SPI, aircraft is airborne or on-ground" + elif fs == 5: + text = "no alert, SPI, aircraft is airborne or on-ground" + + return fs, text + + +def dr(msg): + """Decode downlink request for DF 4, 5, 20, and 21. + + Args: + msg (str): 14 hexdigits string + Returns: + int, str: downlink request, description + + """ + msgbin = hex2bin(msg) + dr = bin2int(msgbin[8:13]) + + text = None + + if dr == 0: + text = "no downlink request" + elif dr == 1: + text = "request to send Comm-B message" + elif dr == 4: + text = "Comm-B broadcast 1 available" + elif dr == 5: + text = "Comm-B broadcast 2 available" + elif dr >= 16: + text = "ELM downlink segments available: {}".format(dr - 15) + + return dr, text + + +def um(msg): + """Decode utility message for DF 4, 5, 20, and 21. + + Utility message contains interrogator identifier and reservation type. + + Args: + msg (str): 14 hexdigits string + Returns: + int, str: interrogator identifier code that triggered the reply, and + reservation type made by the interrogator + """ + msgbin = hex2bin(msg) + iis = bin2int(msgbin[13:17]) + ids = bin2int(msgbin[17:19]) + if ids == 0: + ids_text = None + if ids == 1: + ids_text = "Comm-B interrogator identifier code" + if ids == 2: + ids_text = "Comm-C interrogator identifier code" + if ids == 3: + ids_text = "Comm-D interrogator identifier code" + return iis, ids, ids_text