diff --git a/CHANGELOG.md b/CHANGELOG.md index f1a7ecb..9cac86b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - parser: Added support for OGNLT24 (LT24), OGSKYL (Skylines), OGSPID (Spider), OGSPOT (Spot) and OGNFNT (Fanet) - parser: Added support for (server) comments - parser: Added parser for local receiver output (port 50001) +- parser: Changed unit for rotation from "half turn per minute" to "degrees/s" ## 0.8.2: - 2018-01-20 - parser: Better validation of timestamp, lat/lon and altitude diff --git a/ogn/parser/aprs_comment/flarm_parser.py b/ogn/parser/aprs_comment/flarm_parser.py index ec65953..71e52da 100644 --- a/ogn/parser/aprs_comment/flarm_parser.py +++ b/ogn/parser/aprs_comment/flarm_parser.py @@ -1,7 +1,7 @@ import re from ogn.parser.pattern import PATTERN_FLARM_POSITION_COMMENT -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from .base import BaseParser @@ -18,7 +18,7 @@ class FlarmParser(BaseParser): 'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1, 'address': ac_match.group('address'), 'climb_rate': int(ac_match.group('climb_rate')) * FPM_TO_MS, - 'turn_rate': float(ac_match.group('turn_rate')), + 'turn_rate': float(ac_match.group('turn_rate')) * HPM_TO_DEGS, 'signal_quality': float(ac_match.group('signal_quality')), 'error_count': int(ac_match.group('error_count')), 'frequency_offset': float(ac_match.group('frequency_offset')), diff --git a/ogn/parser/aprs_comment/naviter_parser.py b/ogn/parser/aprs_comment/naviter_parser.py index 9f589e4..b411f9b 100644 --- a/ogn/parser/aprs_comment/naviter_parser.py +++ b/ogn/parser/aprs_comment/naviter_parser.py @@ -1,7 +1,7 @@ import re from ogn.parser.pattern import PATTERN_NAVITER_POSITION_COMMENT -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from .base import BaseParser @@ -20,4 +20,4 @@ class NaviterParser(BaseParser): 'reserved': (int(match.group('details'), 16) & 0b0000000000001111), 'address': match.group('address'), 'climb_rate': int(match.group('climb_rate')) * FPM_TO_MS if match.group('climb_rate') else None, - 'turn_rate': float(match.group('turn_rate')) if match.group('turn_rate') else None} + 'turn_rate': float(match.group('turn_rate')) * HPM_TO_DEGS if match.group('turn_rate') else None} diff --git a/ogn/parser/aprs_comment/ogn_parser.py b/ogn/parser/aprs_comment/ogn_parser.py index bf17331..0f8ddf4 100644 --- a/ogn/parser/aprs_comment/ogn_parser.py +++ b/ogn/parser/aprs_comment/ogn_parser.py @@ -1,6 +1,6 @@ import re -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from ogn.parser.pattern import PATTERN_RECEIVER_BEACON, PATTERN_AIRCRAFT_BEACON from .base import BaseParser @@ -36,7 +36,7 @@ class OgnParser(BaseParser): 'stealth': (int(ac_match.group('details'), 16) & 0b10000000) >> 7 == 1, 'address': ac_match.group('address'), 'climb_rate': int(ac_match.group('climb_rate')) * FPM_TO_MS if ac_match.group('climb_rate') else None, - 'turn_rate': float(ac_match.group('turn_rate')) if ac_match.group('turn_rate') else None, + 'turn_rate': float(ac_match.group('turn_rate')) * HPM_TO_DEGS 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, diff --git a/ogn/parser/aprs_comment/tracker_parser.py b/ogn/parser/aprs_comment/tracker_parser.py index 24297ce..1b0f2f5 100644 --- a/ogn/parser/aprs_comment/tracker_parser.py +++ b/ogn/parser/aprs_comment/tracker_parser.py @@ -1,7 +1,7 @@ import re from ogn.parser.pattern import PATTERN_TRACKER_POSITION_COMMENT, PATTERN_TRACKER_STATUS_COMMENT -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from .base import BaseParser @@ -18,7 +18,7 @@ class TrackerParser(BaseParser): 'stealth': (int(match.group('details'), 16) & 0b10000000) >> 7 == 1, 'address': match.group('address'), 'climb_rate': int(match.group('climb_rate')) * FPM_TO_MS if match.group('climb_rate') else None, - 'turn_rate': float(match.group('turn_rate')) if match.group('turn_rate') else None, + 'turn_rate': float(match.group('turn_rate')) * HPM_TO_DEGS if match.group('turn_rate') else None, 'flightlevel': float(match.group('flight_level')) if match.group('flight_level') else None, 'signal_quality': float(match.group('signal_quality')) if match.group('signal_quality') else None, 'error_count': int(match.group('error_count')) if match.group('error_count') else None, diff --git a/ogn/parser/utils.py b/ogn/parser/utils.py index 34cf7db..ce50e6c 100644 --- a/ogn/parser/utils.py +++ b/ogn/parser/utils.py @@ -7,6 +7,7 @@ FEETS_TO_METER = 0.3048 # ratio feets to meter FPM_TO_MS = FEETS_TO_METER / 60 # ratio fpm to m/s KNOTS_TO_MS = 0.5144 # ratio knots to m/s KPH_TO_MS = 2.7778 # ratio kph to m/s +HPM_TO_DEGS = 180 / 60 # ratio between half turn per minute and degrees/s def parseAngle(dddmmhht): diff --git a/tests/parser/test_parse_flarm.py b/tests/parser/test_parse_flarm.py index d6f3b48..ed38665 100644 --- a/tests/parser/test_parse_flarm.py +++ b/tests/parser/test_parse_flarm.py @@ -1,6 +1,6 @@ import unittest -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from ogn.parser.aprs_comment.flarm_parser import FlarmParser @@ -13,7 +13,7 @@ class TestStringMethods(unittest.TestCase): self.assertFalse(message['stealth']) self.assertEqual(message['address'], "A8CBA8") self.assertAlmostEqual(message['climb_rate'], -39 * FPM_TO_MS, 2) - self.assertEqual(message['turn_rate'], 0.1) + self.assertEqual(message['turn_rate'], 0.1 * HPM_TO_DEGS) self.assertEqual(message['signal_quality'], 3.5) self.assertEqual(message['error_count'], 2) self.assertEqual(message['frequency_offset'], -8.7) diff --git a/tests/parser/test_parse_naviter.py b/tests/parser/test_parse_naviter.py index eee8604..271cfa6 100644 --- a/tests/parser/test_parse_naviter.py +++ b/tests/parser/test_parse_naviter.py @@ -1,6 +1,6 @@ import unittest -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from ogn.parser.aprs_comment.naviter_parser import NaviterParser @@ -23,7 +23,7 @@ class TestStringMethods(unittest.TestCase): self.assertEqual(message['address'], "042121") self.assertAlmostEqual(message['climb_rate'], 123 * FPM_TO_MS, 2) - self.assertEqual(message['turn_rate'], 0.5) + self.assertEqual(message['turn_rate'], 0.5 * HPM_TO_DEGS) if __name__ == '__main__': diff --git a/tests/parser/test_parse_ogn_aircraft.py b/tests/parser/test_parse_ogn_aircraft.py index f0d3f1a..f175c6c 100644 --- a/tests/parser/test_parse_ogn_aircraft.py +++ b/tests/parser/test_parse_ogn_aircraft.py @@ -1,6 +1,6 @@ import unittest -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from ogn.parser.aprs_comment.ogn_parser import OgnParser @@ -16,7 +16,7 @@ class TestStringMethods(unittest.TestCase): self.assertFalse(message['stealth']) self.assertEqual(message['address'], "DDA5BA") self.assertAlmostEqual(message['climb_rate'], -454 * FPM_TO_MS, 2) - self.assertEqual(message['turn_rate'], -1.1) + self.assertEqual(message['turn_rate'], -1.1 * HPM_TO_DEGS) self.assertEqual(message['signal_quality'], 8.8) self.assertEqual(message['error_count'], 0) self.assertEqual(message['frequency_offset'], 51.2) diff --git a/tests/parser/test_parse_tracker.py b/tests/parser/test_parse_tracker.py index 81c8a7c..0ca18fd 100644 --- a/tests/parser/test_parse_tracker.py +++ b/tests/parser/test_parse_tracker.py @@ -1,6 +1,6 @@ import unittest -from ogn.parser.utils import FPM_TO_MS +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS from ogn.parser.aprs_comment.tracker_parser import TrackerParser @@ -13,7 +13,7 @@ class TestStringMethods(unittest.TestCase): self.assertFalse(message['stealth']) self.assertEqual(message['address'], "2FD00F") self.assertAlmostEqual(message['climb_rate'], -58 * FPM_TO_MS, 2) - self.assertEqual(message['turn_rate'], 1.1) + self.assertEqual(message['turn_rate'], 1.1 * HPM_TO_DEGS) self.assertEqual(message['flightlevel'], 3.12) self.assertEqual(message['signal_quality'], 32.8) self.assertEqual(message['error_count'], 0)