kopia lustrzana https://github.com/glidernet/python-ogn-client
Change <id> to <address>
rodzic
572d8bbc54
commit
c8d739eccd
|
@ -13,5 +13,8 @@ class FanetParser(BaseParser):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_position(aprs_comment):
|
def parse_position(aprs_comment):
|
||||||
ac_match = re.search(PATTERN_FANET_POSITION_COMMENT, aprs_comment)
|
ac_match = re.search(PATTERN_FANET_POSITION_COMMENT, aprs_comment)
|
||||||
return {'id': ac_match.group('id') if ac_match.group('id') else None,
|
return {'address_type': int(ac_match.group('details'), 16) & 0b00000011 if ac_match.group('details') else None,
|
||||||
|
'aircraft_type': (int(ac_match.group('details'), 16) & 0b01111100) >> 2 if ac_match.group('details') else None,
|
||||||
|
'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1 if ac_match.group('details') else None,
|
||||||
|
'address': ac_match.group('address') if ac_match.group('address') else None,
|
||||||
'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms if ac_match.group('climb_rate') else None}
|
'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms if ac_match.group('climb_rate') else None}
|
||||||
|
|
|
@ -16,7 +16,7 @@ class FlarmParser(BaseParser):
|
||||||
return {'address_type': int(ac_match.group('details'), 16) & 0b00000011,
|
return {'address_type': int(ac_match.group('details'), 16) & 0b00000011,
|
||||||
'aircraft_type': (int(ac_match.group('details'), 16) & 0b01111100) >> 2,
|
'aircraft_type': (int(ac_match.group('details'), 16) & 0b01111100) >> 2,
|
||||||
'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1,
|
'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1,
|
||||||
'address': ac_match.group('id'),
|
'address': ac_match.group('address'),
|
||||||
'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms,
|
'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms,
|
||||||
'turn_rate': float(ac_match.group('turn_rate')),
|
'turn_rate': float(ac_match.group('turn_rate')),
|
||||||
'signal_quality': float(ac_match.group('signal_quality')),
|
'signal_quality': float(ac_match.group('signal_quality')),
|
||||||
|
|
|
@ -18,6 +18,6 @@ class NaviterParser(BaseParser):
|
||||||
'aircraft_type': (int(match.group('details'), 16) & 0b0011110000000000) >> 10,
|
'aircraft_type': (int(match.group('details'), 16) & 0b0011110000000000) >> 10,
|
||||||
'address_type': (int(match.group('details'), 16) & 0b0000001111110000) >> 4,
|
'address_type': (int(match.group('details'), 16) & 0b0000001111110000) >> 4,
|
||||||
'reserved': (int(match.group('details'), 16) & 0b0000000000001111),
|
'reserved': (int(match.group('details'), 16) & 0b0000000000001111),
|
||||||
'address': match.group('id'),
|
'address': match.group('address'),
|
||||||
'climb_rate': int(match.group('climb_rate')) * fpm2ms if match.group('climb_rate') else None,
|
'climb_rate': int(match.group('climb_rate')) * fpm2ms if match.group('climb_rate') else None,
|
||||||
'turn_rate': float(match.group('turn_rate')) if match.group('turn_rate') else None}
|
'turn_rate': float(match.group('turn_rate')) if match.group('turn_rate') else None}
|
||||||
|
|
|
@ -34,7 +34,7 @@ class OgnParser(BaseParser):
|
||||||
return {'address_type': int(ac_match.group('details'), 16) & 0b00000011,
|
return {'address_type': int(ac_match.group('details'), 16) & 0b00000011,
|
||||||
'aircraft_type': (int(ac_match.group('details'), 16) & 0b01111100) >> 2,
|
'aircraft_type': (int(ac_match.group('details'), 16) & 0b01111100) >> 2,
|
||||||
'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1,
|
'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1,
|
||||||
'address': ac_match.group('id'),
|
'address': ac_match.group('address'),
|
||||||
'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms if ac_match.group('climb_rate') else None,
|
'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms if ac_match.group('climb_rate') else None,
|
||||||
'turn_rate': float(ac_match.group('turn_rate')) if ac_match.group('turn_rate') else None,
|
'turn_rate': float(ac_match.group('turn_rate')) if ac_match.group('turn_rate') else None,
|
||||||
'flightlevel': float(ac_match.group('flight_level')) if ac_match.group('flight_level') else None,
|
'flightlevel': float(ac_match.group('flight_level')) if ac_match.group('flight_level') else None,
|
||||||
|
|
|
@ -16,7 +16,7 @@ class TrackerParser(BaseParser):
|
||||||
return {'address_type': int(match.group('details'), 16) & 0b00000011,
|
return {'address_type': int(match.group('details'), 16) & 0b00000011,
|
||||||
'aircraft_type': (int(match.group('details'), 16) & 0b01111100) >> 2,
|
'aircraft_type': (int(match.group('details'), 16) & 0b01111100) >> 2,
|
||||||
'stealth': (int(match.group('details'), 16) & 0b10000000) >> 7 == 1,
|
'stealth': (int(match.group('details'), 16) & 0b10000000) >> 7 == 1,
|
||||||
'address': match.group('id'),
|
'address': match.group('address'),
|
||||||
'climb_rate': int(match.group('climb_rate')) * fpm2ms if match.group('climb_rate') else None,
|
'climb_rate': int(match.group('climb_rate')) * fpm2ms if match.group('climb_rate') else None,
|
||||||
'turn_rate': float(match.group('turn_rate')) if match.group('turn_rate') else None,
|
'turn_rate': float(match.group('turn_rate')) if match.group('turn_rate') else None,
|
||||||
'flightlevel': float(match.group('flight_level')) if match.group('flight_level') else None,
|
'flightlevel': float(match.group('flight_level')) if match.group('flight_level') else None,
|
||||||
|
|
|
@ -7,12 +7,12 @@ PATTERN_APRS_STATUS = re.compile(r"^(?P<time>(([0-1]\d|2[0-3])[0-5]\d[0-5]\dh|([
|
||||||
PATTERN_SERVER = re.compile(r"^# aprsc (?P<version>[a-z0-9\.\-]+) (?P<timestamp>\d+ [A-Za-z]+ \d+ \d{2}:\d{2}:\d{2} GMT) (?P<server>[A-Z0-9]+) (?P<ip_address>\d+\.\d+\.\d+\.\d+):(?P<port>\d+)$")
|
PATTERN_SERVER = re.compile(r"^# aprsc (?P<version>[a-z0-9\.\-]+) (?P<timestamp>\d+ [A-Za-z]+ \d+ \d{2}:\d{2}:\d{2} GMT) (?P<server>[A-Z0-9]+) (?P<ip_address>\d+\.\d+\.\d+\.\d+):(?P<port>\d+)$")
|
||||||
|
|
||||||
PATTERN_FANET_POSITION_COMMENT = re.compile("""
|
PATTERN_FANET_POSITION_COMMENT = re.compile("""
|
||||||
(?:id(?P<id>[\dA-F]+)\s)?
|
(id(?P<details>[\dA-F]{2})(?P<address>[\dA-F]{6}?)\s?)?
|
||||||
(?:(?P<climb_rate>[+-]\d+)fpm)?
|
(?:(?P<climb_rate>[+-]\d+)fpm)?
|
||||||
""", re.VERBOSE | re.MULTILINE)
|
""", re.VERBOSE | re.MULTILINE)
|
||||||
|
|
||||||
PATTERN_FLARM_POSITION_COMMENT = re.compile(r"""
|
PATTERN_FLARM_POSITION_COMMENT = re.compile(r"""
|
||||||
id(?P<details>[\dA-F]{2})(?P<id>[\dA-F]{6}?)\s?
|
id(?P<details>[\dA-F]{2})(?P<address>[\dA-F]{6}?)\s?
|
||||||
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
|
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
|
||||||
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
|
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
|
||||||
(?:(?P<signal_quality>[\d.]+?)dB\s)?
|
(?:(?P<signal_quality>[\d.]+?)dB\s)?
|
||||||
|
@ -32,7 +32,7 @@ PATTERN_LT24_POSITION_COMMENT = re.compile("""
|
||||||
""", re.VERBOSE | re.MULTILINE)
|
""", re.VERBOSE | re.MULTILINE)
|
||||||
|
|
||||||
PATTERN_NAVITER_POSITION_COMMENT = re.compile("""
|
PATTERN_NAVITER_POSITION_COMMENT = re.compile("""
|
||||||
id(?P<details>[\dA-F]{4})(?P<id>[\dA-F]{6})\s
|
id(?P<details>[\dA-F]{4})(?P<address>[\dA-F]{6})\s
|
||||||
(?P<climb_rate>[+-]\d+)fpm\s
|
(?P<climb_rate>[+-]\d+)fpm\s
|
||||||
(?P<turn_rate>[+-][\d.]+)rot
|
(?P<turn_rate>[+-][\d.]+)rot
|
||||||
""", re.VERBOSE | re.MULTILINE)
|
""", re.VERBOSE | re.MULTILINE)
|
||||||
|
@ -56,7 +56,7 @@ PATTERN_SPOT_POSITION_COMMENT = re.compile("""
|
||||||
""", re.VERBOSE | re.MULTILINE)
|
""", re.VERBOSE | re.MULTILINE)
|
||||||
|
|
||||||
PATTERN_TRACKER_POSITION_COMMENT = re.compile("""
|
PATTERN_TRACKER_POSITION_COMMENT = re.compile("""
|
||||||
id(?P<details>[\dA-F]{2})(?P<id>[\dA-F]{6}?)\s?
|
id(?P<details>[\dA-F]{2})(?P<address>[\dA-F]{6}?)\s?
|
||||||
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
|
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
|
||||||
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
|
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
|
||||||
(?:FL(?P<flight_level>[\d.]+)\s)?
|
(?:FL(?P<flight_level>[\d.]+)\s)?
|
||||||
|
@ -158,7 +158,7 @@ PATTERN_RECEIVER_BEACON = re.compile(r"""
|
||||||
|
|
||||||
|
|
||||||
PATTERN_AIRCRAFT_BEACON = re.compile(r"""
|
PATTERN_AIRCRAFT_BEACON = re.compile(r"""
|
||||||
id(?P<details>[\dA-F]{2})(?P<id>[\dA-F]{6}?)\s?
|
id(?P<details>[\dA-F]{2})(?P<address>[\dA-F]{6}?)\s?
|
||||||
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
|
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
|
||||||
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
|
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
|
||||||
(?:FL(?P<flight_level>[\d.]+)\s)?
|
(?:FL(?P<flight_level>[\d.]+)\s)?
|
||||||
|
|
|
@ -8,13 +8,19 @@ class TestStringMethods(unittest.TestCase):
|
||||||
def test_position_comment(self):
|
def test_position_comment(self):
|
||||||
message = FanetParser.parse_position("id1E1103CE -02fpm")
|
message = FanetParser.parse_position("id1E1103CE -02fpm")
|
||||||
|
|
||||||
self.assertEqual(message['id'], "1E1103CE")
|
self.assertEqual(message['address_type'], 2)
|
||||||
|
self.assertEqual(message['aircraft_type'], 7)
|
||||||
|
self.assertFalse(message['stealth'])
|
||||||
|
self.assertEqual(message['address'], "1103CE")
|
||||||
self.assertAlmostEqual(message['climb_rate'] * ms2fpm, -2, 0.1)
|
self.assertAlmostEqual(message['climb_rate'] * ms2fpm, -2, 0.1)
|
||||||
|
|
||||||
def test_pseudo_status_comment(self):
|
def test_pseudo_status_comment(self):
|
||||||
message = FanetParser.parse_position("")
|
message = FanetParser.parse_position("")
|
||||||
|
|
||||||
self.assertIsNone(message['id'])
|
self.assertIsNone(message['address_type'])
|
||||||
|
self.assertIsNone(message['aircraft_type'])
|
||||||
|
self.assertIsNone(message['stealth'])
|
||||||
|
self.assertIsNone(message['address'])
|
||||||
self.assertIsNone(message['climb_rate'])
|
self.assertIsNone(message['climb_rate'])
|
||||||
|
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue