fix DF4,20 altitude decoding
This commit is contained in:
parent
5f7e28950c
commit
cdbcf47bc2
@ -95,29 +95,37 @@ def altcode(msg):
|
|||||||
A4 = mbin[24]
|
A4 = mbin[24]
|
||||||
# _ = mbin[25]
|
# _ = mbin[25]
|
||||||
B1 = mbin[26]
|
B1 = mbin[26]
|
||||||
# _ = mbin[27]
|
# D1 = mbin[27] # always zero
|
||||||
B2 = mbin[28]
|
B2 = mbin[28]
|
||||||
D2 = mbin[29]
|
D2 = mbin[29]
|
||||||
B4 = mbin[30]
|
B4 = mbin[30]
|
||||||
D4 = mbin[31]
|
D4 = mbin[31]
|
||||||
|
|
||||||
# standard greycode
|
greystr = D2 + D4 + A1 + A2 + A4 + B1 + B2 + B4 + C1 + C2 + C4
|
||||||
gc5 = D2 + D4 + A1 + A2 + A4 + B1 + B2 + B4
|
alt = grey2alt(greystr)
|
||||||
N5 = int(util.gray2bin(gc5, 8), 2)
|
|
||||||
|
|
||||||
# in 100-ft step must be converted
|
|
||||||
gc1 = C1 + C2 + C4
|
|
||||||
N1 = int(util.gray2bin(gc1, 3), 2) - 1
|
|
||||||
|
|
||||||
if N1 == 6:
|
|
||||||
N1 = 4
|
|
||||||
|
|
||||||
if N5%2 != 0:
|
|
||||||
N1 = 4 - N1
|
|
||||||
|
|
||||||
alt = (N5*500 + N1*100) - 1200
|
|
||||||
if mbit == '1': # unit in meter
|
if mbit == '1': # unit in meter
|
||||||
vbin = mbin[19:25] + mbin[26:31]
|
vbin = mbin[19:25] + mbin[26:31]
|
||||||
alt = int(util.bin2int(vbin) * 3.28084) # convert to ft
|
alt = int(util.bin2int(vbin) * 3.28084) # convert to ft
|
||||||
|
|
||||||
return alt
|
return alt
|
||||||
|
|
||||||
|
def grey2alt(codestr):
|
||||||
|
gc500 = codestr[:8]
|
||||||
|
n500 = util.gray2int(gc500)
|
||||||
|
|
||||||
|
# in 100-ft step must be converted first
|
||||||
|
gc100 = codestr[8:]
|
||||||
|
n100 = util.gray2int(gc100)
|
||||||
|
|
||||||
|
if n100 in [0, 5, 6]:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if n100 == 7:
|
||||||
|
n100 = 5
|
||||||
|
|
||||||
|
if n500%2:
|
||||||
|
n100 = 6 - n100
|
||||||
|
|
||||||
|
alt = (n500*500 + n100*100) - 1300
|
||||||
|
return alt
|
||||||
|
@ -87,14 +87,11 @@ def floor(x):
|
|||||||
return int(math.floor(x))
|
return int(math.floor(x))
|
||||||
|
|
||||||
|
|
||||||
def bin2gray(binary, nbits):
|
def gray2int(graystr):
|
||||||
"""Convert binary to greycode"""
|
"""Convert greycode to binary (DF4, 20 altitude coding)"""
|
||||||
graycode = binary
|
num = bin2int(graystr)
|
||||||
for i in range(1, nbits):
|
num ^= (num >> 8)
|
||||||
bit = str(int(binary[i-1]) ^ int(binary[i]))
|
num ^= (num >> 4)
|
||||||
graycode = str(graycode[:i]) + str(bit)
|
num ^= (num >> 2)
|
||||||
return graycode
|
num ^= (num >> 1)
|
||||||
|
return num
|
||||||
def gray2bin(greycode, nbits):
|
|
||||||
"""Convert greycode to binary"""
|
|
||||||
return bin2gray(greycode, nbits) # simply XOR again
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from pyModeS import ehs
|
from pyModeS import ehs
|
||||||
|
from pyModeS import modes_common
|
||||||
|
|
||||||
def test_ehs_icao():
|
def test_ehs_icao():
|
||||||
assert ehs.icao("A0001839CA3800315800007448D9") == '400940'
|
assert ehs.icao("A0001839CA3800315800007448D9") == '400940'
|
||||||
@ -49,3 +49,20 @@ def test_ehs_BDS60_functions():
|
|||||||
assert ehs.mach60("A000029CFFBAA11E2004727281F1") == 0.48
|
assert ehs.mach60("A000029CFFBAA11E2004727281F1") == 0.48
|
||||||
assert ehs.vr60baro("A000029CFFBAA11E2004727281F1") == 0
|
assert ehs.vr60baro("A000029CFFBAA11E2004727281F1") == 0
|
||||||
assert ehs.vr60ins("A000029CFFBAA11E2004727281F1") == 3648
|
assert ehs.vr60ins("A000029CFFBAA11E2004727281F1") == 3648
|
||||||
|
|
||||||
|
def test_greycode_to_altitude():
|
||||||
|
assert modes_common.grey2alt('00000000010') == -1000
|
||||||
|
assert modes_common.grey2alt('00000001010') == -500
|
||||||
|
assert modes_common.grey2alt('00000011011') == -100
|
||||||
|
assert modes_common.grey2alt('00000011010') == 0
|
||||||
|
assert modes_common.grey2alt('00000011110') == 100
|
||||||
|
assert modes_common.grey2alt('00000010011') == 600
|
||||||
|
assert modes_common.grey2alt('00000110010') == 1000
|
||||||
|
assert modes_common.grey2alt('00001001001') == 5800
|
||||||
|
assert modes_common.grey2alt('00011100100') == 10300
|
||||||
|
assert modes_common.grey2alt('01100011010') == 32000
|
||||||
|
assert modes_common.grey2alt('01110000100') == 46300
|
||||||
|
assert modes_common.grey2alt('01010101100') == 50200
|
||||||
|
assert modes_common.grey2alt('11011110100') == 73200
|
||||||
|
assert modes_common.grey2alt('10000000011') == 126600
|
||||||
|
assert modes_common.grey2alt('10000000001') == 126700
|
||||||
|
Loading…
Reference in New Issue
Block a user