Merge pull request #11 from kerel-fs/fix/parser

Add aprs position enhancement before the sign adjustment
pull/12/head
Fabian P. Schmidt 2016-09-01 14:02:53 +02:00 zatwierdzone przez GitHub
commit a20be37f9b
5 zmienionych plików z 16 dodań i 22 usunięć

Wyświetl plik

@ -3,6 +3,7 @@
## Unreleased
- Added aprs destination callsign as `dstcall` to aprs beacon keys
- Changed aprs parser to allow other destination calls than `APRS`
- Fixed parsing of APRS precision and datum option (#7)
## 0.4.0 - 2016-03-29
- aprs client: Added the possibility of a timed callback

Wyświetl plik

@ -1,7 +1,7 @@
import re
from datetime import datetime
from ogn.parser.utils import createTimestamp, dmsToDeg, kts2kmh, feet2m, fpm2ms
from ogn.parser.utils import createTimestamp, parseAngle, kts2kmh, feet2m, fpm2ms
from ogn.parser.pattern import PATTERN_APRS, PATTERN_RECEIVER_BEACON, PATTERN_AIRCRAFT_BEACON
from ogn.parser.exceptions import AprsParseError, OgnParseError
@ -16,13 +16,11 @@ def parse_aprs(message, reference_date=None):
'receiver_name': match.group('receiver'),
'dstcall': match.group('dstcall'),
'timestamp': createTimestamp(match.group('time'), reference_date),
'latitude': dmsToDeg(float(match.group('latitude')) / 100) *
(-1 if match.group('latitude_sign') == 'S' else 1) +
(int(match.group('latitude_enhancement')) / 1000 / 60 if match.group('latitude_enhancement') else 0),
'latitude': parseAngle('0' + match.group('latitude') + (match.group('latitude_enhancement') or '0')) *
(-1 if match.group('latitude_sign') == 'S' else 1),
'symboltable': match.group('symbol_table'),
'longitude': dmsToDeg(float(match.group('longitude')) / 100) *
(-1 if match.group('longitude_sign') == 'W' else 1) +
(int(match.group('longitude_enhancement')) / 1000 / 60 if match.group('longitude_enhancement') else 0),
'longitude': parseAngle(match.group('longitude') + (match.group('longitude_enhancement') or '0')) *
(-1 if match.group('longitude_sign') == 'W' else 1),
'symbolcode': match.group('symbol'),
'track': int(match.group('course')) if match.group('course_extension') else 0,
'ground_speed': int(match.group('ground_speed')) * kts2kmh if match.group('ground_speed') else 0,

Wyświetl plik

@ -1,4 +1,3 @@
import math
from datetime import datetime, timedelta
from ogn.parser.exceptions import AmbigousTimeError
@ -13,11 +12,8 @@ m2feet = 1 / feet2m
fpm2ms = 1 / ms2fpm
def dmsToDeg(dms):
absDms = abs(dms)
d = math.floor(absDms)
m = (absDms - d) * 100 / 60
return d + m
def parseAngle(dddmmhht):
return float(dddmmhht[:3]) + float(dddmmhht[3:]) / 60
def createTimestamp(hhmmss, reference):

Wyświetl plik

@ -2,7 +2,7 @@ import unittest
from datetime import datetime
from ogn.parser.utils import dmsToDeg, kts2kmh, m2feet
from ogn.parser.utils import kts2kmh, m2feet
from ogn.parser.parse import parse_aprs
from ogn.parser.exceptions import AprsParseError
@ -18,9 +18,9 @@ class TestStringMethods(unittest.TestCase):
self.assertEqual(message['name'], "FLRDDA5BA")
self.assertEqual(message['receiver_name'], "LFMX")
self.assertEqual(message['timestamp'].strftime('%H:%M:%S'), "16:08:29")
self.assertAlmostEqual(message['latitude'], dmsToDeg(44.1541), 5)
self.assertAlmostEqual(message['latitude'], 44.25683, 5)
self.assertEqual(message['symboltable'], '/')
self.assertAlmostEqual(message['longitude'], dmsToDeg(6.0003), 5)
self.assertAlmostEqual(message['longitude'], 6.0005, 5)
self.assertEqual(message['symbolcode'], '\'')
self.assertEqual(message['track'], 342)
self.assertEqual(message['ground_speed'], 49 * kts2kmh)
@ -31,8 +31,8 @@ class TestStringMethods(unittest.TestCase):
raw_message = "FLRDDA5BA>APRS,qAS,LFMX:/160829h4415.41N/00600.03E'342/049/A=005524 !W26! id21400EA9 -2454fpm +0.9rot 19.5dB 0e -6.6kHz gps1x1 s6.02 h44 rDF0C56"
message = parse_aprs(raw_message, reference_date=datetime(2015, 1, 1, 16, 8, 29))
self.assertAlmostEqual(message['latitude'] - dmsToDeg(44.1541), 2 / 1000 / 60, 10)
self.assertAlmostEqual(message['longitude'] - dmsToDeg(6.0003), 6 / 1000 / 60, 10)
self.assertAlmostEqual(message['latitude'] - 44.2568 - 1 / 30000, 2 / 1000 / 60, 10)
self.assertAlmostEqual(message['longitude'] - 6.0005, 6 / 1000 / 60, 10)
if __name__ == '__main__':

Wyświetl plik

@ -1,14 +1,13 @@
import unittest
from datetime import datetime
from ogn.parser.utils import dmsToDeg, createTimestamp
from ogn.parser.utils import parseAngle, createTimestamp
from ogn.parser.exceptions import AmbigousTimeError
class TestStringMethods(unittest.TestCase):
def test_dmsToDeg(self):
dms = 50.4830
self.assertAlmostEqual(dmsToDeg(dms), 50.805, 5)
def test_parseAngle(self):
self.assertAlmostEqual(parseAngle('05048.30'), 50.805, 5)
def test_createTimestamp(self):
test_data = [