* remove unused functions * cythonize common * add bds05 * separate cleanly cython and python, bds05, bds06, modulo issues * bds08 * bds09 * optimisations in bds09 * "make" things easier * clean up useless stuff * add make options * fix hidden altitude() call * minor updates to C code * update tests * update benchmark * consolidation * update clean script * reduce complexity and change default type to str Co-authored-by: Xavier Olive <1360812+xoolive@users.noreply.github.com>
210 lines
3.6 KiB
Python
210 lines
3.6 KiB
Python
# ------------------------------------------
|
|
# BDS 4,5
|
|
# Meteorological hazard report
|
|
# ------------------------------------------
|
|
|
|
from __future__ import absolute_import, print_function, division
|
|
from pyModeS.decoder.common import hex2bin, bin2int, data, allzeros, wrongstatus
|
|
|
|
|
|
def is45(msg):
|
|
"""Check if a message is likely to be BDS code 4,5.
|
|
|
|
Meteorological hazard report
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
bool: True or False
|
|
|
|
"""
|
|
if allzeros(msg):
|
|
return False
|
|
|
|
d = hex2bin(data(msg))
|
|
|
|
# status bit 1, 4, 7, 10, 13, 16, 27, 39
|
|
if wrongstatus(d, 1, 2, 3):
|
|
return False
|
|
|
|
if wrongstatus(d, 4, 5, 6):
|
|
return False
|
|
|
|
if wrongstatus(d, 7, 8, 9):
|
|
return False
|
|
|
|
if wrongstatus(d, 10, 11, 12):
|
|
return False
|
|
|
|
if wrongstatus(d, 13, 14, 15):
|
|
return False
|
|
|
|
if wrongstatus(d, 16, 17, 26):
|
|
return False
|
|
|
|
if wrongstatus(d, 27, 28, 38):
|
|
return False
|
|
|
|
if wrongstatus(d, 39, 40, 51):
|
|
return False
|
|
|
|
# reserved
|
|
if bin2int(d[51:56]) != 0:
|
|
return False
|
|
|
|
temp = temp45(msg)
|
|
if temp:
|
|
if temp > 60 or temp < -80:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def turb45(msg):
|
|
"""Turbulence.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: Turbulence level. 0=NIL, 1=Light, 2=Moderate, 3=Severe
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[0] == "0":
|
|
return None
|
|
|
|
turb = bin2int(d[1:3])
|
|
return turb
|
|
|
|
|
|
def ws45(msg):
|
|
"""Wind shear.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: Wind shear level. 0=NIL, 1=Light, 2=Moderate, 3=Severe
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[3] == "0":
|
|
return None
|
|
|
|
ws = bin2int(d[4:6])
|
|
return ws
|
|
|
|
|
|
def mb45(msg):
|
|
"""Microburst.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: Microburst level. 0=NIL, 1=Light, 2=Moderate, 3=Severe
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[6] == "0":
|
|
return None
|
|
|
|
mb = bin2int(d[7:9])
|
|
return mb
|
|
|
|
|
|
def ic45(msg):
|
|
"""Icing.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: Icing level. 0=NIL, 1=Light, 2=Moderate, 3=Severe
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[9] == "0":
|
|
return None
|
|
|
|
ic = bin2int(d[10:12])
|
|
return ic
|
|
|
|
|
|
def wv45(msg):
|
|
"""Wake vortex.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: Wake vortex level. 0=NIL, 1=Light, 2=Moderate, 3=Severe
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[12] == "0":
|
|
return None
|
|
|
|
ws = bin2int(d[13:15])
|
|
return ws
|
|
|
|
|
|
def temp45(msg):
|
|
"""Static air temperature.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
float: tmeperature in Celsius degree
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
|
|
sign = int(d[16])
|
|
value = bin2int(d[17:26])
|
|
|
|
if sign:
|
|
value = value - 512
|
|
|
|
temp = value * 0.25 # celsius
|
|
temp = round(temp, 1)
|
|
|
|
return temp
|
|
|
|
|
|
def p45(msg):
|
|
"""Average static pressure.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: static pressure in hPa
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[26] == "0":
|
|
return None
|
|
p = bin2int(d[27:38]) # hPa
|
|
return p
|
|
|
|
|
|
def rh45(msg):
|
|
"""Radio height.
|
|
|
|
Args:
|
|
msg (String): 28 bytes hexadecimal message string
|
|
|
|
Returns:
|
|
int: radio height in ft
|
|
|
|
"""
|
|
d = hex2bin(data(msg))
|
|
if d[38] == "0":
|
|
return None
|
|
rh = bin2int(d[39:51]) * 16
|
|
return rh
|