From 6e0271cfc1c508e90db1bcf8fc86ede032036bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gru=CC=88ndger?= Date: Fri, 20 Apr 2018 18:51:18 +0200 Subject: [PATCH] Split new OGFLR parser from old APRS parser --- ogn/parser/aprs_comment/flarm_parser.py | 18 ++++++++--------- ogn/parser/pattern.py | 14 +++++++++++++ tests/parser/test_parse_flarm.py | 27 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 tests/parser/test_parse_flarm.py diff --git a/ogn/parser/aprs_comment/flarm_parser.py b/ogn/parser/aprs_comment/flarm_parser.py index 7a4eec8..eb90746 100644 --- a/ogn/parser/aprs_comment/flarm_parser.py +++ b/ogn/parser/aprs_comment/flarm_parser.py @@ -1,6 +1,6 @@ import re -from ogn.parser.pattern import PATTERN_AIRCRAFT_BEACON +from ogn.parser.pattern import PATTERN_FLARM_POSITION_COMMENT from ogn.parser.utils import fpm2ms from .base import BaseParser @@ -12,20 +12,18 @@ class FlarmParser(BaseParser): @staticmethod def parse_position(aprs_comment): - ac_match = re.search(PATTERN_AIRCRAFT_BEACON, aprs_comment) + ac_match = re.search(PATTERN_FLARM_POSITION_COMMENT, aprs_comment) return {'address_type': int(ac_match.group('details'), 16) & 0b00000011, 'aircraft_type': (int(ac_match.group('details'), 16) & 0b01111100) >> 2, 'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1, 'address': ac_match.group('id'), - '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, - 'flightlevel': float(ac_match.group('flight_level')) if ac_match.group('flight_level') else None, - 'signal_quality': float(ac_match.group('signal_quality')) if ac_match.group('signal_quality') else None, - 'error_count': int(ac_match.group('errors')) if ac_match.group('errors') else None, - 'frequency_offset': float(ac_match.group('frequency_offset')) if ac_match.group('frequency_offset') else None, + 'climb_rate': int(ac_match.group('climb_rate')) * fpm2ms, + 'turn_rate': float(ac_match.group('turn_rate')), + 'signal_quality': float(ac_match.group('signal_quality')), + 'error_count': int(ac_match.group('errors')), + 'frequency_offset': float(ac_match.group('frequency_offset')), 'gps_status': ac_match.group('gps_accuracy') if ac_match.group('gps_accuracy') else None, 'software_version': float(ac_match.group('flarm_software_version')) if ac_match.group('flarm_software_version') else None, 'hardware_version': int(ac_match.group('flarm_hardware_version'), 16) if ac_match.group('flarm_hardware_version') else None, 'real_address': ac_match.group('flarm_id') if ac_match.group('flarm_id') else None, - 'signal_power': float(ac_match.group('signal_power')) if ac_match.group('signal_power') else None, - 'proximity': [hear[4:] for hear in ac_match.group('proximity').split(" ")] if ac_match.group('proximity') else None} + 'signal_power': float(ac_match.group('signal_power')) if ac_match.group('signal_power') else None} diff --git a/ogn/parser/pattern.py b/ogn/parser/pattern.py index aa4c91e..cf22fe8 100644 --- a/ogn/parser/pattern.py +++ b/ogn/parser/pattern.py @@ -11,6 +11,20 @@ PATTERN_FANET_POSITION_COMMENT = re.compile(""" (?:(?P[+-]\d+)fpm)? """, re.VERBOSE | re.MULTILINE) +PATTERN_FLARM_POSITION_COMMENT = re.compile(r""" + id(?P
[\dA-F]{2})(?P[\dA-F]{6}?)\s? + (?:(?P[+-]\d+?)fpm\s)? + (?:(?P[+-][\d.]+?)rot\s)? + (?:(?P[\d.]+?)dB\s)? + (?:(?P\d+)e\s)? + (?:(?P[+-][\d.]+?)kHz\s?)? + (?:gps(?P\d+x\d+)\s?)? + (?:s(?P[\d.]+)\s?)? + (?:h(?P[\dA-F]{2})\s?)? + (?:r(?P[\dA-F]+)\s?)? + (?:(?P[+-][\d.]+)dBm\s?)? +""", re.VERBOSE | re.MULTILINE) + PATTERN_LT24_POSITION_COMMENT = re.compile(""" id(?P\d+)\s (?P[+-]\d+)fpm\s diff --git a/tests/parser/test_parse_flarm.py b/tests/parser/test_parse_flarm.py new file mode 100644 index 0000000..f146f0b --- /dev/null +++ b/tests/parser/test_parse_flarm.py @@ -0,0 +1,27 @@ +import unittest + +from ogn.parser.utils import ms2fpm +from ogn.parser.aprs_comment.flarm_parser import FlarmParser + + +class TestStringMethods(unittest.TestCase): + def test_position_comment(self): + message = FlarmParser.parse_position("id21A8CBA8 -039fpm +0.1rot 3.5dB 2e -8.7kHz gps1x2 s6.09 h43 rDF0267") + + self.assertEqual(message['address_type'], 1) + self.assertEqual(message['aircraft_type'], 8) + self.assertFalse(message['stealth']) + self.assertEqual(message['address'], "A8CBA8") + self.assertAlmostEqual(message['climb_rate'] * ms2fpm, -39, 2) + self.assertEqual(message['turn_rate'], 0.1) + self.assertEqual(message['signal_quality'], 3.5) + self.assertEqual(message['error_count'], 2) + self.assertEqual(message['frequency_offset'], -8.7) + self.assertEqual(message['gps_status'], '1x2') + self.assertEqual(message['software_version'], 6.09) + self.assertEqual(message['hardware_version'], 67) + self.assertEqual(message['real_address'], "DF0267") + + +if __name__ == '__main__': + unittest.main()