This commit is contained in:
Stefano Lande 2022-09-21 08:29:20 +00:00 committed by GitHub
commit fe65829550
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 96 additions and 5 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ dist
*.egg-info
env3
env2
.idea

View File

@ -57,7 +57,6 @@ unsupported_formats = {
'.':'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)

View File

@ -4,9 +4,10 @@ from aprslib.exceptions import ParseError
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

View File

@ -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': ''}

View File

@ -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()