complete impl TelemetryReport; #27
This commit is contained in:
parent
5a84e5fd0b
commit
9c159200cd
|
|
@ -1,25 +1,101 @@
|
|||
from aprslib.packets.base import APRSPacket
|
||||
|
||||
class TelemetryReport(APRSPacket):
|
||||
format = 'raw'
|
||||
telemetry = dict(seq=0,
|
||||
vals=['0']*6)
|
||||
telemetry['vals'][5] = ['1']*8 # Replace io data with list of 8 values
|
||||
comment = ''
|
||||
class TelemetryAddon(object):
|
||||
analog_values = None
|
||||
_sequence_number = 0
|
||||
_digital_value = 0
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(TelemetryAddon, self).__init__( *args, **kwargs)
|
||||
|
||||
self. analog_values = AnalogList()
|
||||
|
||||
@property
|
||||
def sequence_number(self):
|
||||
return self._sequence_number
|
||||
|
||||
@sequence_number.setter
|
||||
def sequence_number(self, v):
|
||||
if 0 <= v <= 999:
|
||||
self._sequence_number = v
|
||||
else:
|
||||
raise ValueError("Value outside of range 0-999")
|
||||
|
||||
@property
|
||||
def digital_value(self):
|
||||
return self._digital_value
|
||||
|
||||
@digital_value.setter
|
||||
def digital_value(self, v):
|
||||
if 0 <= v <= 0xFF:
|
||||
self._digital_value = v
|
||||
else:
|
||||
raise ValueError("Value outside of range 0-255")
|
||||
|
||||
|
||||
class AnalogList(list):
|
||||
def __init__(self):
|
||||
list.__init__(self, [0] * 5)
|
||||
|
||||
def __setitem__(self, i, v):
|
||||
if not 0 <= i <= 4:
|
||||
raise IndexError("Index outside of range 0-4, got %d" % i)
|
||||
if not 0 <= v <= 999:
|
||||
raise ValueError("Value outside of range 0-999, got %d" % v)
|
||||
else:
|
||||
list.__setitem__(self, i, v)
|
||||
|
||||
def __setslice__(self, i, j, v):
|
||||
if i > j:
|
||||
i, j = j, i
|
||||
if (not 0 <= i <= 5) or (not 0 <= j <= 5):
|
||||
raise IndexError("Slice outside of range [0:5], got %s" % [i, j])
|
||||
|
||||
for x in range(i, j):
|
||||
list.__setitem__(self, x, v[x])
|
||||
|
||||
def append(self, other):
|
||||
raise NotImplementedError("not supported")
|
||||
|
||||
def remove(self, other):
|
||||
raise NotImplementedError("not supported")
|
||||
|
||||
def pop(self):
|
||||
raise NotImplementedError("not supported")
|
||||
|
||||
def extend(self):
|
||||
raise NotImplementedError("not supported")
|
||||
|
||||
def insert(self):
|
||||
raise NotImplementedError("not supported")
|
||||
|
||||
|
||||
class TelemetryReport(TelemetryAddon, APRSPacket):
|
||||
@property
|
||||
def format(self):
|
||||
return 'raw'
|
||||
|
||||
_comment = ''
|
||||
|
||||
@property
|
||||
def comment(self):
|
||||
return self._comment
|
||||
|
||||
@comment.setter
|
||||
def comment(self, v):
|
||||
if isinstance(v, str):
|
||||
self._comment = v
|
||||
else:
|
||||
raise TypeError("Expected comment to be of type str, got %s" % type(v))
|
||||
|
||||
def _serialize_body(self):
|
||||
# What do we do when len(digitalvalue) != 8?
|
||||
tempio = ''.join(self.telemetry['vals'][5])
|
||||
|
||||
body = [
|
||||
str(self.telemetry['seq']).zfill(3),
|
||||
str(self.telemetry['vals'][0]).zfill(3),
|
||||
str(self.telemetry['vals'][1]).zfill(3),
|
||||
str(self.telemetry['vals'][2]).zfill(3),
|
||||
str(self.telemetry['vals'][3]).zfill(3),
|
||||
str(self.telemetry['vals'][4]).zfill(3),
|
||||
str(tempio),
|
||||
return ("T#" + ("{:03d}," * 6) + "{:08b}{:s}").format(
|
||||
self.sequence_number,
|
||||
self.analog_values[0],
|
||||
self.analog_values[1],
|
||||
self.analog_values[2],
|
||||
self.analog_values[3],
|
||||
self.analog_values[4],
|
||||
self.digital_value,
|
||||
self.comment,
|
||||
]
|
||||
# Add packet type to body joined by commas
|
||||
return 'T#' + ",".join(body)
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in New Issue