diff --git a/aprslib/packets/telemetry.py b/aprslib/packets/telemetry.py index 65e5505..1461322 100644 --- a/aprslib/packets/telemetry.py +++ b/aprslib/packets/telemetry.py @@ -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) + )