kopia lustrzana https://github.com/glidernet/python-ogn-client
Split new OGFLR parser from old APRS parser
rodzic
b7458fa021
commit
6e0271cfc1
|
@ -1,6 +1,6 @@
|
||||||
import re
|
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 ogn.parser.utils import fpm2ms
|
||||||
|
|
||||||
from .base import BaseParser
|
from .base import BaseParser
|
||||||
|
@ -12,20 +12,18 @@ class FlarmParser(BaseParser):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_position(aprs_comment):
|
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,
|
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('id'),
|
||||||
'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,
|
||||||
'turn_rate': float(ac_match.group('turn_rate')) if ac_match.group('turn_rate') else None,
|
'turn_rate': float(ac_match.group('turn_rate')),
|
||||||
'flightlevel': float(ac_match.group('flight_level')) if ac_match.group('flight_level') else None,
|
'signal_quality': float(ac_match.group('signal_quality')),
|
||||||
'signal_quality': float(ac_match.group('signal_quality')) if ac_match.group('signal_quality') else None,
|
'error_count': int(ac_match.group('errors')),
|
||||||
'error_count': int(ac_match.group('errors')) if ac_match.group('errors') else None,
|
'frequency_offset': float(ac_match.group('frequency_offset')),
|
||||||
'frequency_offset': float(ac_match.group('frequency_offset')) if ac_match.group('frequency_offset') else None,
|
|
||||||
'gps_status': ac_match.group('gps_accuracy') if ac_match.group('gps_accuracy') else None,
|
'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,
|
'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,
|
'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,
|
'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,
|
'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}
|
|
||||||
|
|
|
@ -11,6 +11,20 @@ PATTERN_FANET_POSITION_COMMENT = re.compile("""
|
||||||
(?:(?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"""
|
||||||
|
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("""
|
PATTERN_LT24_POSITION_COMMENT = re.compile("""
|
||||||
id(?P<id>\d+)\s
|
id(?P<id>\d+)\s
|
||||||
(?P<climb_rate>[+-]\d+)fpm\s
|
(?P<climb_rate>[+-]\d+)fpm\s
|
||||||
|
|
|
@ -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()
|
Ładowanie…
Reference in New Issue