Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ dist
*.egg-info
env3
env2
.idea
7 changes: 5 additions & 2 deletions aprslib/parsing/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ def detect(x):
'.':'reserved',
'<':'station capabilities',
'?':'general query format',
'T':'telemetry report',
'[':'maidenhead locator beacon',
'\\':'unused',
']':'unused',
Expand Down Expand Up @@ -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)

34 changes: 31 additions & 3 deletions aprslib/parsing/telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
28 changes: 28 additions & 0 deletions docs/parse_formats.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
-----------------------

Expand Down Expand Up @@ -296,3 +322,5 @@ Telemetry configuration
'to': 'TOCALL',
'via': ''}



31 changes: 31 additions & 0 deletions tests/test_parse_telemetry_report.py
Original file line number Diff line number Diff line change
@@ -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()