diff --git a/pyModeS/decoder/bds/bds05.py b/pyModeS/decoder/bds/bds05.py index 120c31c..2f620b3 100644 --- a/pyModeS/decoder/bds/bds05.py +++ b/pyModeS/decoder/bds/bds05.py @@ -34,13 +34,13 @@ def airborne_position(msg0, msg1, t0, t1): raise RuntimeError("Both even and odd CPR frames are required.") # 131072 is 2^17, since CPR lat and lon are 17 bits each. - cprlat_even = common.bin2int(mb0[22:39]) / 131072.0 - cprlon_even = common.bin2int(mb0[39:56]) / 131072.0 - cprlat_odd = common.bin2int(mb1[22:39]) / 131072.0 - cprlon_odd = common.bin2int(mb1[39:56]) / 131072.0 + cprlat_even = common.bin2int(mb0[22:39]) / 131072 + cprlon_even = common.bin2int(mb0[39:56]) / 131072 + cprlat_odd = common.bin2int(mb1[22:39]) / 131072 + cprlon_odd = common.bin2int(mb1[39:56]) / 131072 - air_d_lat_even = 360.0 / 60 - air_d_lat_odd = 360.0 / 59 + air_d_lat_even = 360 / 60 + air_d_lat_odd = 360 / 59 # compute latitude index 'j' j = common.floor(59 * cprlat_even - 60 * cprlat_odd + 0.5) @@ -64,13 +64,13 @@ def airborne_position(msg0, msg1, t0, t1): nl = common.cprNL(lat) ni = max(common.cprNL(lat) - 0, 1) m = common.floor(cprlon_even * (nl - 1) - cprlon_odd * nl + 0.5) - lon = (360.0 / ni) * (m % ni + cprlon_even) + lon = (360 / ni) * (m % ni + cprlon_even) else: lat = lat_odd nl = common.cprNL(lat) ni = max(common.cprNL(lat) - 1, 1) m = common.floor(cprlon_even * (nl - 1) - cprlon_odd * nl + 0.5) - lon = (360.0 / ni) * (m % ni + cprlon_odd) + lon = (360 / ni) * (m % ni + cprlon_odd) if lon > 180: lon = lon - 360 @@ -95,11 +95,11 @@ def airborne_position_with_ref(msg, lat_ref, lon_ref): mb = common.hex2bin(msg)[32:] - cprlat = common.bin2int(mb[22:39]) / 131072.0 - cprlon = common.bin2int(mb[39:56]) / 131072.0 + cprlat = common.bin2int(mb[22:39]) / 131072 + cprlon = common.bin2int(mb[39:56]) / 131072 i = int(mb[21]) - d_lat = 360.0 / 59 if i else 360.0 / 60 + d_lat = 360 / 59 if i else 360 / 60 j = common.floor(lat_ref / d_lat) + common.floor( 0.5 + ((lat_ref % d_lat) / d_lat) - cprlat @@ -110,9 +110,9 @@ def airborne_position_with_ref(msg, lat_ref, lon_ref): ni = common.cprNL(lat) - i if ni > 0: - d_lon = 360.0 / ni + d_lon = 360 / ni else: - d_lon = 360.0 + d_lon = 360 m = common.floor(lon_ref / d_lon) + common.floor( 0.5 + ((lon_ref % d_lon) / d_lon) - cprlon @@ -143,9 +143,8 @@ def altitude(msg): if tc < 19: altcode = altbin[0:6] + "0" + altbin[6:] + alt = common.altitude(altcode) else: - altcode = altbin[0:6] + "0" + altbin[6:] - - alt = common.altitude(altcode) + alt = common.bin2int(altbin) * 3.28084 return alt diff --git a/pyModeS/decoder/bds/bds09.py b/pyModeS/decoder/bds/bds09.py index 43acf00..c7302e4 100644 --- a/pyModeS/decoder/bds/bds09.py +++ b/pyModeS/decoder/bds/bds09.py @@ -24,7 +24,7 @@ def airborne_velocity(msg, source=False): - Angle (degree), either ground track or heading - Vertical rate (ft/min) - Speed type ('GS' for ground speed, 'AS' for airspeed) - - [Optional] Direction source ('TRUE_NORTH' or 'MAGENTIC_NORTH') + - [Optional] Direction source ('TRUE_NORTH' or 'MAGNETIC_NORTH') - [Optional] Vertical rate source ('BARO' or 'GNSS') """ @@ -35,29 +35,35 @@ def airborne_velocity(msg, source=False): subtype = common.bin2int(mb[5:8]) - if common.bin2int(mb[14:24]) == 0 or common.bin2int(mb[25:35]) == 0: - return None - if subtype in (1, 2): - v_ew_sign = -1 if mb[13] == "1" else 1 - v_ew = common.bin2int(mb[14:24]) - 1 # east-west velocity - if subtype == 2: # Supersonic - v_ew *= 4 - v_ns_sign = -1 if mb[24] == "1" else 1 - v_ns = common.bin2int(mb[25:35]) - 1 # north-south velocity - if subtype == 2: # Supersonic - v_ns *= 4 + v_ew = common.bin2int(mb[14:24]) + v_ns = common.bin2int(mb[25:35]) - v_we = v_ew_sign * v_ew - v_sn = v_ns_sign * v_ns + if v_ew == 0 or v_ns == 0: + spd = None + trk_or_hdg = None + vs = None + else: + v_ew_sign = -1 if mb[13] == "1" else 1 + v_ew = v_ew - 1 # east-west velocity + if subtype == 2: # Supersonic + v_ew *= 4 - spd = math.sqrt(v_sn * v_sn + v_we * v_we) # unit in kts - spd = int(spd) + v_ns_sign = -1 if mb[24] == "1" else 1 + v_ns = v_ns - 1 # north-south velocity + if subtype == 2: # Supersonic + v_ns *= 4 - trk = math.atan2(v_we, v_sn) - trk = math.degrees(trk) # convert to degrees - trk = trk if trk >= 0 else trk + 360 # no negative val + v_we = v_ew_sign * v_ew + v_sn = v_ns_sign * v_ns + + spd = math.sqrt(v_sn * v_sn + v_we * v_we) # unit in kts + spd = int(spd) + + trk = math.atan2(v_we, v_sn) + trk = math.degrees(trk) # convert to degrees + trk = trk if trk >= 0 else trk + 360 # no negative val spd_type = "GS" trk_or_hdg = round(trk, 2) @@ -67,13 +73,15 @@ def airborne_velocity(msg, source=False): if mb[13] == "0": hdg = None else: - hdg = common.bin2int(mb[14:24]) / 1024.0 * 360.0 + hdg = common.bin2int(mb[14:24]) / 1024 * 360.0 hdg = round(hdg, 2) trk_or_hdg = hdg spd = common.bin2int(mb[25:35]) + spd = None if spd == 0 else spd - 1 + if subtype == 4: # Supersonic spd *= 4 @@ -82,7 +90,7 @@ def airborne_velocity(msg, source=False): else: spd_type = "TAS" - dir_type = "MAGENTIC_NORTH" + dir_type = "MAGNETIC_NORTH" vr_source = "GNSS" if mb[35] == "0" else "BARO" vr_sign = -1 if mb[36] == "1" else 1 @@ -96,7 +104,7 @@ def airborne_velocity(msg, source=False): def altitude_diff(msg): - """Decode the differece between GNSS and barometric altitude. + """Decode the difference between GNSS and barometric altitude. Args: msg (str): 28 hexdigits string, TC=19