|
| 1 | +from aprslib import string_type |
1 | 2 | from aprslib.packets.base import APRSPacket |
2 | 3 |
|
3 | 4 | __all__ = [ |
4 | 5 | 'TelemetryReport', |
| 6 | + 'TelemetryUnit', |
| 7 | + 'TelemetryParm', |
5 | 8 | ] |
6 | 9 |
|
7 | 10 | class TelemetryAddon(object): |
8 | 11 | _analog_values = None |
9 | 12 | _sequence_number = 0 |
10 | 13 | _digital_value = 0 |
11 | 14 |
|
12 | | - |
13 | 15 | def __init__(self, *args, **kwargs): |
14 | 16 | self._analog_values = AnalogValueList() |
15 | 17 | super(TelemetryAddon, self).__init__( *args, **kwargs) |
@@ -81,10 +83,27 @@ def __init__(self): |
81 | 83 | def __setitem__(self, i, v): |
82 | 84 | if not 0 <= i <= 4: |
83 | 85 | 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: |
85 | 87 | 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) |
88 | 107 |
|
89 | 108 |
|
90 | 109 | class TelemetryReport(TelemetryAddon, APRSPacket): |
@@ -113,3 +132,75 @@ def _serialize_body(self): |
113 | 132 | self.digital_value, |
114 | 133 | self.comment, |
115 | 134 | ) |
| 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