Split new OGFLR parser from old APRS parser

pull/62/head
Konstantin Gründger 2018-04-20 18:51:18 +02:00
rodzic b7458fa021
commit 6e0271cfc1
3 zmienionych plików z 49 dodań i 10 usunięć

Wyświetl plik

@ -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}

Wyświetl plik

@ -11,6 +11,20 @@ PATTERN_FANET_POSITION_COMMENT = re.compile("""
(?:(?P<climb_rate>[+-]\d+)fpm)?
""", re.VERBOSE | re.MULTILINE)
PATTERN_FLARM_POSITION_COMMENT = re.compile(r"""
id(?P<details>[\dA-F]{2})(?P<id>[\dA-F]{6}?)\s?
(?:(?P<climb_rate>[+-]\d+?)fpm\s)?
(?:(?P<turn_rate>[+-][\d.]+?)rot\s)?
(?:(?P<signal_quality>[\d.]+?)dB\s)?
(?:(?P<errors>\d+)e\s)?
(?:(?P<frequency_offset>[+-][\d.]+?)kHz\s?)?
(?:gps(?P<gps_accuracy>\d+x\d+)\s?)?
(?:s(?P<flarm_software_version>[\d.]+)\s?)?
(?:h(?P<flarm_hardware_version>[\dA-F]{2})\s?)?
(?:r(?P<flarm_id>[\dA-F]+)\s?)?
(?:(?P<signal_power>[+-][\d.]+)dBm\s?)?
""", re.VERBOSE | re.MULTILINE)
PATTERN_LT24_POSITION_COMMENT = re.compile("""
id(?P<id>\d+)\s
(?P<climb_rate>[+-]\d+)fpm\s

Wyświetl plik

@ -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()