diff --git a/.gitignore b/.gitignore index 8e10410..856d786 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ dist *.egg-info env3 env2 +.idea diff --git a/aprslib/parsing/__init__.py b/aprslib/parsing/__init__.py index e8e37c4..b4f0b73 100644 --- a/aprslib/parsing/__init__.py +++ b/aprslib/parsing/__init__.py @@ -57,7 +57,6 @@ def detect(x): '.':'reserved', '<':'station capabilities', '?':'general query format', - 'T':'telemetry report', '[':'maidenhead locator beacon', '\\':'unused', ']':'unused', @@ -208,6 +207,10 @@ def _try_toparse_body(packet_type, body, parsed): body, result = parse_position(packet_type, body) + elif packet_type == "T": + logger.debug("Attempting to parse as telemetry report") + + body, result = parse_telemetry_report(body) + # we are done parsed.update(result) - diff --git a/aprslib/parsing/telemetry.py b/aprslib/parsing/telemetry.py index b3f35b5..1bb8fcc 100644 --- a/aprslib/parsing/telemetry.py +++ b/aprslib/parsing/telemetry.py @@ -4,9 +4,10 @@ from aprslib.parsing import logger __all__ = [ - 'parse_comment_telemetry', - 'parse_telemetry_config', - ] + 'parse_comment_telemetry', + 'parse_telemetry_config', + 'parse_telemetry_report' +] def parse_comment_telemetry(text): @@ -98,3 +99,30 @@ def parse_telemetry_config(body): return (body, parsed) + +def parse_telemetry_report(text): + parsed = {} + rest = "" + + match = re.findall(r"(^#\d{3},(\d+(\.\d+)?,){5}[01]{8}$)", text) + + if match: + logger.debug("Attempting to parse telemetry-message packet") + + temp = text.split(",") + parsed.update({'format': 'telemetry-report'}) + + seq = int(temp[0].replace('#', '')) + values = list(map(float, temp[1:6])) + + parsed.update({ + 'telemetry': { + 'seq': seq, + 'vals': values, + 'bits': temp[6] + } + }) + else: + rest = text + + return rest, parsed diff --git a/docs/parse_formats.rst b/docs/parse_formats.rst index abeb7d1..5b29541 100644 --- a/docs/parse_formats.rst +++ b/docs/parse_formats.rst @@ -257,6 +257,32 @@ Regular 'to': u'TOCALL', 'via': ''} + +Telemetry report +----------------------- + + +.. code:: python + + >>> aprslib.parse("FROMCALL>APDW16,WIDE1-1,qAR,TOCALL:T#165,13.21,0.39,5.10,14.94,36.12,11111100") + + { + 'raw': 'FROMCALL>APDW16,WIDE1-1,qAR,TOCALL:T#165,13.21,0.39,5.10,14.94,36.12,11111100', + 'from': 'FROMCALL', + 'to': 'APDW16', + 'path': ['WIDE1-1', 'qAR', 'TOCALL'], + 'via': 'TOCALL', + 'telemetry': + { + 'seq': 165, + 'vals': [13.21, 0.39, 5.1, 14.94, 36.12], + 'bits': '11111100' + }, + 'format': 'telemetry-report', + 'text': 'T#165,13.21,0.39,5.10,14.94,36.12,11111100' + } + + Telemetry configuration ----------------------- @@ -296,3 +322,5 @@ Telemetry configuration 'to': 'TOCALL', 'via': ''} + + diff --git a/tests/test_parse_telemetry_report.py b/tests/test_parse_telemetry_report.py new file mode 100644 index 0000000..3f48ea5 --- /dev/null +++ b/tests/test_parse_telemetry_report.py @@ -0,0 +1,31 @@ +import unittest + +from aprslib.parsing import parse_telemetry_report + + +class ParseTelemetryReport(unittest.TestCase): + def setUp(self): + self.maxDiff = None + + def test_valid_telemetry_report(self): + packet = "#111,13.64,0.37,5,16.96,33.38,11110000" + expected = {'format': 'telemetry-report', + 'telemetry': + {'bits': '11110000', + 'seq': 111, + 'vals': [13.64, 0.37, 5, 16.96, 33.38]}} + + _, result = parse_telemetry_report(packet) + self.assertEqual(expected, result) + + def test_invalid_telemetry_report(self): + packet = "#111a,Nan,0.37,5.10,16.96,33.38,11110000" + expected = {} + + rest, result = parse_telemetry_report(packet) + self.assertEqual(expected, result) + self.assertEqual(rest,packet) + + +if __name__ == '__main__': + unittest.main()