added PARM and UNIT packets; #28
This commit is contained in:
parent
0f9da6bef8
commit
e27ff4f13a
|
|
@ -1,7 +1,10 @@
|
||||||
|
from aprslib import string_type
|
||||||
from aprslib.packets.base import APRSPacket
|
from aprslib.packets.base import APRSPacket
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'TelemetryReport',
|
'TelemetryReport',
|
||||||
|
'TelemetryUnit',
|
||||||
|
'TelemetryParm',
|
||||||
]
|
]
|
||||||
|
|
||||||
class TelemetryAddon(object):
|
class TelemetryAddon(object):
|
||||||
|
|
@ -9,7 +12,6 @@ class TelemetryAddon(object):
|
||||||
_sequence_number = 0
|
_sequence_number = 0
|
||||||
_digital_value = 0
|
_digital_value = 0
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self._analog_values = AnalogValueList()
|
self._analog_values = AnalogValueList()
|
||||||
super(TelemetryAddon, self).__init__( *args, **kwargs)
|
super(TelemetryAddon, self).__init__( *args, **kwargs)
|
||||||
|
|
@ -81,9 +83,26 @@ class AnalogValueList(ImmutableList):
|
||||||
def __setitem__(self, i, v):
|
def __setitem__(self, i, v):
|
||||||
if not 0 <= i <= 4:
|
if not 0 <= i <= 4:
|
||||||
raise IndexError("Index outside of range 0-4, got %d" % i)
|
raise IndexError("Index outside of range 0-4, got %d" % i)
|
||||||
if not 0 <= v <= 999:
|
if not isinstance(v, int) or not 0 <= v <= 999:
|
||||||
raise ValueError("Value outside of range 0-999, got %d" % v)
|
raise ValueError("Value outside of range 0-999, got %d" % v)
|
||||||
else:
|
|
||||||
|
list.__setitem__(self, i, v)
|
||||||
|
|
||||||
|
|
||||||
|
class UnitParmList(ImmutableList):
|
||||||
|
_lengths = (7, 7, 6, 6, 5, 6, 5, 4, 4, 4, 3, 3, 3)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
list.__init__(self, [''] * 13)
|
||||||
|
|
||||||
|
def __setitem__(self, i, v):
|
||||||
|
if not 0 <= i <= 12:
|
||||||
|
raise IndexError("Index outside of range 0-12, got %d" % i)
|
||||||
|
if not isinstance(v, string_type):
|
||||||
|
raise TypeError("Expected type to be str, got %s" % type(v))
|
||||||
|
if len(v) > self._lengths[i]:
|
||||||
|
raise ValueError("Expected length index %d is %d, got %d" % (i, self._lengths[i], len(v)))
|
||||||
|
|
||||||
list.__setitem__(self, i, v)
|
list.__setitem__(self, i, v)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -113,3 +132,75 @@ class TelemetryReport(TelemetryAddon, APRSPacket):
|
||||||
self.digital_value,
|
self.digital_value,
|
||||||
self.comment,
|
self.comment,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class TelemetryMessage(APRSPacket):
|
||||||
|
format = 'telemetry-messsage'
|
||||||
|
addressee = 'N0CALL'
|
||||||
|
|
||||||
|
def _serialize_body(self):
|
||||||
|
return ":{: <9s}:".format(self.addressee)
|
||||||
|
|
||||||
|
class TelemetryUnit(TelemetryMessage):
|
||||||
|
_tUNIT = None
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self._tUNIT = UnitParmList()
|
||||||
|
super(TelemetryUnit, self).__init__( *args, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tUNIT(self):
|
||||||
|
return self._tUNIT
|
||||||
|
|
||||||
|
@tUNIT.setter
|
||||||
|
def tUNIT(self, v):
|
||||||
|
if not isinstance(v, list):
|
||||||
|
raise TypeError("Expected analog_values to be list, got %s" % type(v))
|
||||||
|
if len(v) != 13:
|
||||||
|
raise ValueError("Expected a list of 13 elements, got a list of %d" % len(v))
|
||||||
|
|
||||||
|
for i, elm in enumerate(v):
|
||||||
|
self._tUNIT[i] = elm
|
||||||
|
|
||||||
|
def _serialize_body(self):
|
||||||
|
last = 0
|
||||||
|
for i, elm in enumerate(self.tUNIT):
|
||||||
|
if elm: last = i
|
||||||
|
|
||||||
|
return "{:s}{:s}{:s}".format(
|
||||||
|
TelemetryMessage._serialize_body(self),
|
||||||
|
'UNIT.',
|
||||||
|
','.join(self.tUNIT[:last+1]),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TelemetryParm(TelemetryMessage):
|
||||||
|
_tPARM = None
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self._tPARM = UnitParmList()
|
||||||
|
super(TelemetryParm, self).__init__( *args, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tPARM(self):
|
||||||
|
return self._tPARM
|
||||||
|
|
||||||
|
@tPARM.setter
|
||||||
|
def tPARM(self, v):
|
||||||
|
if not isinstance(v, list):
|
||||||
|
raise TypeError("Expected analog_values to be list, got %s" % type(v))
|
||||||
|
if len(v) != 13:
|
||||||
|
raise ValueError("Expected a list of 13 elements, got a list of %d" % len(v))
|
||||||
|
|
||||||
|
for i, elm in enumerate(v):
|
||||||
|
self._tPARM[i] = elm
|
||||||
|
|
||||||
|
def _serialize_body(self):
|
||||||
|
last = 0
|
||||||
|
for i, elm in enumerate(self.tPARM):
|
||||||
|
if elm: last = i
|
||||||
|
|
||||||
|
return "{:s}{:s}{:s}".format(
|
||||||
|
TelemetryMessage._serialize_body(self),
|
||||||
|
'PARM.',
|
||||||
|
','.join(self.tPARM[:last+1]),
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue