Skip to content

Commit 2a222e6

Browse files
add telemetry report parsing; fix #29
1 parent 9c15920 commit 2a222e6

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

aprslib/packets/telemetry.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
11
from aprslib.packets.base import APRSPacket
22

33
class TelemetryAddon(object):
4-
analog_values = None
4+
_analog_values = None
55
_sequence_number = 0
66
_digital_value = 0
77

8+
89
def __init__(self, *args, **kwargs):
10+
self._analog_values = AnalogList()
911
super(TelemetryAddon, self).__init__( *args, **kwargs)
1012

11-
self. analog_values = AnalogList()
13+
@property
14+
def analog_values(self):
15+
return self._analog_values
16+
17+
@analog_values.setter
18+
def analog_values(self, v):
19+
if not isinstance(v, list):
20+
raise TypeError("Expected analog_values to be list, got %s" % type(v))
21+
if len(v) != 5:
22+
raise ValueError("Expected a list of 5 elements, got a list of %d" % len(v))
23+
24+
self._analog_values[:] = v
1225

1326
@property
1427
def sequence_number(self):
@@ -48,32 +61,30 @@ def __setitem__(self, i, v):
4861
def __setslice__(self, i, j, v):
4962
if i > j:
5063
i, j = j, i
51-
if (not 0 <= i <= 5) or (not 0 <= j <= 5):
52-
raise IndexError("Slice outside of range [0:5], got %s" % [i, j])
5364

54-
for x in range(i, j):
65+
for x in range(max(0, i), min(5, j)):
5566
list.__setitem__(self, x, v[x])
5667

57-
def append(self, other):
68+
def append(self, a):
5869
raise NotImplementedError("not supported")
5970

60-
def remove(self, other):
71+
def remove(self, a):
6172
raise NotImplementedError("not supported")
6273

63-
def pop(self):
74+
def pop(self, a):
6475
raise NotImplementedError("not supported")
6576

66-
def extend(self):
77+
def extend(self, a):
6778
raise NotImplementedError("not supported")
6879

69-
def insert(self):
80+
def insert(self, a, b):
7081
raise NotImplementedError("not supported")
7182

7283

7384
class TelemetryReport(TelemetryAddon, APRSPacket):
7485
@property
7586
def format(self):
76-
return 'raw'
87+
return 'telemetry'
7788

7889
_comment = ''
7990

aprslib/parsing/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,12 @@ def _try_toparse_body(packet_type, body, parsed):
152152
# . - reserved
153153
# < - station capabilities
154154
# ? - general query format
155-
# T - telemetry report
156155
# [ - maidenhead locator beacon
157156
# \ - unused
158157
# ] - unused
159158
# ^ - unused
160159
# } - 3rd party traffic
161-
if packet_type in '#$%)*<?T[}':
160+
if packet_type in '#$%)*<?[}':
162161
raise UnknownFormat("format is not supported")
163162

164163
# user defined
@@ -197,6 +196,12 @@ def _try_toparse_body(packet_type, body, parsed):
197196

198197
body, result = parse_weather(body)
199198

199+
# Telemetry Report
200+
elif packet_type == 'T':
201+
logger.debug("Attempting to parse as telemetry report")
202+
203+
body, result = parse_telemetry(body)
204+
200205
# postion report (regular or compressed)
201206
elif (packet_type in '!=/@;' or
202207
0 <= body.find('!') < 40): # page 28 of spec (PDF)

aprslib/parsing/telemetry.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,32 @@
44
from aprslib.parsing import logger
55

66
__all__ = [
7+
'parse_telemetry',
78
'parse_comment_telemetry',
89
'parse_telemetry_config',
910
]
1011

1112

13+
def parse_telemetry(body):
14+
parsed = {}
15+
16+
match = re.match(r'#(\d{3},|MIC,?)(\d{3}),(\d{3}),(\d{3}),(\d{3}),(\d{3}),([0-1]{8})(.*)', body, flags=re.I)
17+
18+
if not match:
19+
raise ParseError("Invalid telemetry format")
20+
21+
data = match.groups()
22+
23+
parsed.update({
24+
'format': 'telemetry',
25+
'sequence_number': 0 if data[0].lower().startswith('mic') else int(data[0][:3]),
26+
'analog_values': list(map(int, data[1:6])),
27+
'digital_value': int(data[6], 2)
28+
})
29+
30+
return '', parsed
31+
32+
1233
def parse_comment_telemetry(text):
1334
"""
1435
Looks for base91 telemetry found in comment field

0 commit comments

Comments
 (0)