From 9d2b626e6feea98f295c8f83a0d660c0fa20b7a5 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 28 Aug 2023 22:35:34 +0200 Subject: [PATCH] implement gray decoder --- owrx/adsb/modes.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/owrx/adsb/modes.py b/owrx/adsb/modes.py index f6e81e55..c422f0bd 100644 --- a/owrx/adsb/modes.py +++ b/owrx/adsb/modes.py @@ -194,9 +194,8 @@ class ModeSParser(PickleModule): altitude = ((input[5] & 0b11111110) << 3) | ((input[6] & 0b11110000) >> 4) if q: message["altitude"] = altitude * 25 - 1000 - else: - # TODO: it's gray encoded - message["altitude"] = altitude * 100 + elif altitude > 0: + message["altitude"] = self._grayDecode(altitude) * 100 elif type == 19: # airborne velocity @@ -374,3 +373,13 @@ class ModeSParser(PickleModule): except StopIteration: # we don't have both CPR records. better luck next time. pass + + def _grayDecode(self, input: int): + l = input.bit_length() + previous_bit = 0 + output = 0 + for i in reversed(range(0, l)): + bit = (previous_bit ^ ((input >> i) & 1)) + output |= bit << i + previous_bit = bit + return output