Skip to content

Commit 16f0bc7

Browse files
added PARM and UNIT packets; #28
1 parent 64c8dc1 commit 16f0bc7

1 file changed

Lines changed: 95 additions & 4 deletions

File tree

aprslib/packets/telemetry.py

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1+
from aprslib import string_type
12
from aprslib.packets.base import APRSPacket
23

34
__all__ = [
45
'TelemetryReport',
6+
'TelemetryUnit',
7+
'TelemetryParm',
58
]
69

710
class TelemetryAddon(object):
811
_analog_values = None
912
_sequence_number = 0
1013
_digital_value = 0
1114

12-
1315
def __init__(self, *args, **kwargs):
1416
self._analog_values = AnalogValueList()
1517
super(TelemetryAddon, self).__init__( *args, **kwargs)
@@ -81,10 +83,27 @@ def __init__(self):
8183
def __setitem__(self, i, v):
8284
if not 0 <= i <= 4:
8385
raise IndexError("Index outside of range 0-4, got %d" % i)
84-
if not 0 <= v <= 999:
86+
if not isinstance(v, int) or not 0 <= v <= 999:
8587
raise ValueError("Value outside of range 0-999, got %d" % v)
86-
else:
87-
list.__setitem__(self, i, v)
88+
89+
list.__setitem__(self, i, v)
90+
91+
92+
class UnitParmList(ImmutableList):
93+
_lengths = (7, 7, 6, 6, 5, 6, 5, 4, 4, 4, 3, 3, 3)
94+
95+
def __init__(self):
96+
list.__init__(self, [''] * 13)
97+
98+
def __setitem__(self, i, v):
99+
if not 0 <= i <= 12:
100+
raise IndexError("Index outside of range 0-12, got %d" % i)
101+
if not isinstance(v, string_type):
102+
raise TypeError("Expected type to be str, got %s" % type(v))
103+
if len(v) > self._lengths[i]:
104+
raise ValueError("Expected length index %d is %d, got %d" % (i, self._lengths[i], len(v)))
105+
106+
list.__setitem__(self, i, v)
88107

89108

90109
class TelemetryReport(TelemetryAddon, APRSPacket):
@@ -113,3 +132,75 @@ def _serialize_body(self):
113132
self.digital_value,
114133
self.comment,
115134
)
135+
136+
class TelemetryMessage(APRSPacket):
137+
format = 'telemetry-messsage'
138+
addressee = 'N0CALL'
139+
140+
def _serialize_body(self):
141+
return ":{: <9s}:".format(self.addressee)
142+
143+
class TelemetryUnit(TelemetryMessage):
144+
_tUNIT = None
145+
146+
def __init__(self, *args, **kwargs):
147+
self._tUNIT = UnitParmList()
148+
super(TelemetryUnit, self).__init__( *args, **kwargs)
149+
150+
@property
151+
def tUNIT(self):
152+
return self._tUNIT
153+
154+
@tUNIT.setter
155+
def tUNIT(self, v):
156+
if not isinstance(v, list):
157+
raise TypeError("Expected analog_values to be list, got %s" % type(v))
158+
if len(v) != 13:
159+
raise ValueError("Expected a list of 13 elements, got a list of %d" % len(v))
160+
161+
for i, elm in enumerate(v):
162+
self._tUNIT[i] = elm
163+
164+
def _serialize_body(self):
165+
last = 0
166+
for i, elm in enumerate(self.tUNIT):
167+
if elm: last = i
168+
169+
return "{:s}{:s}{:s}".format(
170+
TelemetryMessage._serialize_body(self),
171+
'UNIT.',
172+
','.join(self.tUNIT[:last+1]),
173+
)
174+
175+
176+
class TelemetryParm(TelemetryMessage):
177+
_tPARM = None
178+
179+
def __init__(self, *args, **kwargs):
180+
self._tPARM = UnitParmList()
181+
super(TelemetryParm, self).__init__( *args, **kwargs)
182+
183+
@property
184+
def tPARM(self):
185+
return self._tPARM
186+
187+
@tPARM.setter
188+
def tPARM(self, v):
189+
if not isinstance(v, list):
190+
raise TypeError("Expected analog_values to be list, got %s" % type(v))
191+
if len(v) != 13:
192+
raise ValueError("Expected a list of 13 elements, got a list of %d" % len(v))
193+
194+
for i, elm in enumerate(v):
195+
self._tPARM[i] = elm
196+
197+
def _serialize_body(self):
198+
last = 0
199+
for i, elm in enumerate(self.tPARM):
200+
if elm: last = i
201+
202+
return "{:s}{:s}{:s}".format(
203+
TelemetryMessage._serialize_body(self),
204+
'PARM.',
205+
','.join(self.tPARM[:last+1]),
206+
)

0 commit comments

Comments
 (0)