Add support for capturs (fixes #42)

pull/66/head
Konstantin Gründger 2019-06-08 14:48:42 +02:00
rodzic 37d089acac
commit 342af0a253
6 zmienionych plików z 25 dodań i 2 usunięć

Wyświetl plik

@ -3,6 +3,7 @@
- parser: Added support for OGINREACH (Garmin inReach) beacons
- parser: Added support for OGFLYM (Flymaster) beacons
- parser: Added support for comments in tracker beacons (OGNTRK)
- parser: Added support for OGCAPT (Capturs) beacons
## 0.9.3: - 2019-06-03
- parser: Added Generic parser for unknown formats

Wyświetl plik

@ -76,7 +76,7 @@ def parse_aprs(message, reference_timestamp=None):
'symbolcode': match_position.group('symbol'),
'track': int(match_position.group('course')) if match_position.group('course_extension') else None,
'ground_speed': int(match_position.group('ground_speed')) * KNOTS_TO_MS / KPH_TO_MS if match_position.group('ground_speed') else None,
'altitude': int(match_position.group('altitude')) * FEETS_TO_METER,
'altitude': int(match_position.group('altitude')) * FEETS_TO_METER if match_position.group('altitude') else None,
'comment': match_position.group('comment') if match_position.group('comment') else ""})
else:
raise AprsParseError(message)
@ -102,6 +102,7 @@ dstcall_parser_mapping = {'APRS': OgnParser(),
'OGFLR': FlarmParser(),
'OGNTRK': TrackerParser(),
'OGNSDR': ReceiverParser(),
'OGCAPT': GenericParser(beacon_type='capturs'),
'OGFLYM': GenericParser(beacon_type='flymaster'),
'OGINREACH': InreachParser(),
'OGLT24': LT24Parser(),

Wyświetl plik

@ -1,7 +1,7 @@
import re
PATTERN_APRS = re.compile(r"^(?P<callsign>.+?)>(?P<dstcall>[A-Z0-9]+),((?P<relay>[A-Za-z0-9]+)\*)?.*,(?P<receiver>.+?):(?P<aprs_type>(.))(?P<aprs_body>.*)$")
PATTERN_APRS_POSITION = re.compile(r"^(?P<time>(([0-1]\d|2[0-3])[0-5]\d[0-5]\dh|([0-2]\d|3[0-1])([0-1]\d|2[0-3])[0-5]\dz))(?P<latitude>9000\.00|[0-8]\d{3}\.\d{2})(?P<latitude_sign>N|S)(?P<symbol_table>.)(?P<longitude>18000\.00|1[0-7]\d{3}\.\d{2}|0\d{4}\.\d{2})(?P<longitude_sign>E|W)(?P<symbol>.)(?P<course_extension>(?P<course>\d{3})/(?P<ground_speed>\d{3}))?/A=(?P<altitude>(-\d{5}|\d{6}))(?P<pos_extension>\s!W((?P<latitude_enhancement>\d)(?P<longitude_enhancement>\d))!)?(?:\s(?P<comment>.*))?$")
PATTERN_APRS_POSITION = re.compile(r"^(?P<time>(([0-1]\d|2[0-3])[0-5]\d[0-5]\dh|([0-2]\d|3[0-1])([0-1]\d|2[0-3])[0-5]\dz))(?P<latitude>9000\.00|[0-8]\d{3}\.\d{2})(?P<latitude_sign>N|S)(?P<symbol_table>.)(?P<longitude>18000\.00|1[0-7]\d{3}\.\d{2}|0\d{4}\.\d{2})(?P<longitude_sign>E|W)(?P<symbol>.)(?P<course_extension>(?P<course>\d{3})/(?P<ground_speed>\d{3}))?/(A=(?P<altitude>(-\d{5}|\d{6})))?(?P<pos_extension>\s!W((?P<latitude_enhancement>\d)(?P<longitude_enhancement>\d))!)?(?:\s(?P<comment>.*))?$")
PATTERN_APRS_STATUS = re.compile(r"^(?P<time>(([0-1]\d|2[0-3])[0-5]\d[0-5]\dh|([0-2]\d|3[0-1])([0-1]\d|2[0-3])[0-5]\dz))\s(?P<comment>.*)$")
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+)$")

Wyświetl plik

@ -39,6 +39,9 @@ class TestStringMethods(unittest.TestCase):
def test_tracker_beacons(self):
self.parse_valid_beacon_data_file(filename='tracker.txt', beacon_type='tracker')
def test_capturs_beacons(self):
self.parse_valid_beacon_data_file(filename='capturs.txt', beacon_type='capturs')
def test_flymaster_beacons(self):
self.parse_valid_beacon_data_file(filename='flymaster.txt', beacon_type='flymaster')

Wyświetl plik

@ -77,6 +77,13 @@ class TestStringMethods(unittest.TestCase):
self.assertAlmostEqual(message['altitude'], -13 * FEETS_TO_METER, 5)
def test_no_altitude(self):
# altitude is not a 'must have'
raw_message = "FLRDDEEF1>OGCAPT,qAS,CAPTURS:/065511h4837.63N/00233.79E'000/000/"
message = parse_aprs(raw_message)
self.assertEqual(message['altitude'], None)
def test_invalid_coordinates(self):
# sometimes the coordinates leave their valid range: -90<=latitude<=90 or -180<=longitude<=180
with self.assertRaises(AprsParseError):

Wyświetl plik

@ -0,0 +1,11 @@
# The following beacons are example for the Capture APRS format
# source: https://github.com/glidernet/ogn-aprs-protocol
#
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/062744h4845.03N/00230.46E'000/000/
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/064243h4839.64N/00236.78E'000/085/A=000410
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/064548h4838.87N/00234.03E'000/042/A=000377
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/064847h4837.95N/00234.36E'000/000/
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/065144h4837.56N/00233.80E'000/000/
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/065511h4837.63N/00233.79E'000/000/
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/070016h4837.63N/00233.77E'000/001/A=000360
FLRDDEEF1>OGCAPT,qAS,CAPTURS:/070153h4837.62N/00233.77E'000/001/A=000344