Skip to content

Commit c429b79

Browse files
complete impl TelemetryReport; #27
1 parent b6d67fd commit c429b79

1 file changed

Lines changed: 96 additions & 20 deletions

File tree

aprslib/packets/telemetry.py

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

3-
class TelemetryReport(APRSPacket):
4-
format = 'raw'
5-
telemetry = dict(seq=0,
6-
vals=['0']*6)
7-
telemetry['vals'][5] = ['1']*8 # Replace io data with list of 8 values
8-
comment = ''
3+
class TelemetryAddon(object):
4+
analog_values = None
5+
_sequence_number = 0
6+
_digital_value = 0
7+
8+
def __init__(self, *args, **kwargs):
9+
super(TelemetryAddon, self).__init__( *args, **kwargs)
10+
11+
self. analog_values = AnalogList()
12+
13+
@property
14+
def sequence_number(self):
15+
return self._sequence_number
16+
17+
@sequence_number.setter
18+
def sequence_number(self, v):
19+
if 0 <= v <= 999:
20+
self._sequence_number = v
21+
else:
22+
raise ValueError("Value outside of range 0-999")
23+
24+
@property
25+
def digital_value(self):
26+
return self._digital_value
27+
28+
@digital_value.setter
29+
def digital_value(self, v):
30+
if 0 <= v <= 0xFF:
31+
self._digital_value = v
32+
else:
33+
raise ValueError("Value outside of range 0-255")
34+
35+
36+
class AnalogList(list):
37+
def __init__(self):
38+
list.__init__(self, [0] * 5)
39+
40+
def __setitem__(self, i, v):
41+
if not 0 <= i <= 4:
42+
raise IndexError("Index outside of range 0-4, got %d" % i)
43+
if not 0 <= v <= 999:
44+
raise ValueError("Value outside of range 0-999, got %d" % v)
45+
else:
46+
list.__setitem__(self, i, v)
47+
48+
def __setslice__(self, i, j, v):
49+
if i > j:
50+
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])
53+
54+
for x in range(i, j):
55+
list.__setitem__(self, x, v[x])
56+
57+
def append(self, other):
58+
raise NotImplementedError("not supported")
59+
60+
def remove(self, other):
61+
raise NotImplementedError("not supported")
62+
63+
def pop(self):
64+
raise NotImplementedError("not supported")
65+
66+
def extend(self):
67+
raise NotImplementedError("not supported")
68+
69+
def insert(self):
70+
raise NotImplementedError("not supported")
71+
72+
73+
class TelemetryReport(TelemetryAddon, APRSPacket):
74+
@property
75+
def format(self):
76+
return 'raw'
77+
78+
_comment = ''
79+
80+
@property
81+
def comment(self):
82+
return self._comment
83+
84+
@comment.setter
85+
def comment(self, v):
86+
if isinstance(v, str):
87+
self._comment = v
88+
else:
89+
raise TypeError("Expected comment to be of type str, got %s" % type(v))
990

1091
def _serialize_body(self):
11-
# What do we do when len(digitalvalue) != 8?
12-
tempio = ''.join(self.telemetry['vals'][5])
13-
14-
body = [
15-
str(self.telemetry['seq']).zfill(3),
16-
str(self.telemetry['vals'][0]).zfill(3),
17-
str(self.telemetry['vals'][1]).zfill(3),
18-
str(self.telemetry['vals'][2]).zfill(3),
19-
str(self.telemetry['vals'][3]).zfill(3),
20-
str(self.telemetry['vals'][4]).zfill(3),
21-
str(tempio),
92+
return ("T#" + ("{:03d}," * 6) + "{:08b}{:s}").format(
93+
self.sequence_number,
94+
self.analog_values[0],
95+
self.analog_values[1],
96+
self.analog_values[2],
97+
self.analog_values[3],
98+
self.analog_values[4],
99+
self.digital_value,
22100
self.comment,
23-
]
24-
# Add packet type to body joined by commas
25-
return 'T#' + ",".join(body)
101+
)

0 commit comments

Comments
 (0)