Skip to content

Commit 86c610d

Browse files
committed
mtype is not a packet concern
1 parent 71c86d4 commit 86c610d

File tree

6 files changed

+9833
-23586
lines changed

6 files changed

+9833
-23586
lines changed

analysis/data/all.txt

+1,946-2,276
Large diffs are not rendered by default.

analysis/data/one_tb.txt

Whitespace-only changes.

analysis/data/temp_basals.txt

+7,865-21,284
Large diffs are not rendered by default.

openomni/message.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ def commands(self):
4141
return cmds
4242

4343
def packets(self):
44-
message_type = self.body[0:2]
45-
body_remaining = self.body[2:] + self.computed_crc_bytes()
44+
body_remaining = self.body + self.computed_crc_bytes()
4645
packets = []
4746
while len(body_remaining) > 0:
4847
packet = Packet()
@@ -52,7 +51,6 @@ def packets(self):
5251
packet.packet_type = Packet.PACKET_TYPE_PDM
5352
packet.pod_address_2 = self.pod_id
5453
packet.byte9 = self.byte9
55-
packet.message_type = message_type
5654
segment_len = min(Packet.MAX_BODY_SEGMENT_LEN,len(body_remaining))
5755
packet.body = body_remaining[:segment_len]
5856
packet.body_len = len(self.body)
@@ -66,6 +64,3 @@ def packets(self):
6664
packets.append(packet)
6765

6866
return packets
69-
70-
#1f07b1ee9000000000000002510251f3
71-
#1f07b1ee900000000000000251e2

openomni/packet.py

+11-20
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class Packet(object):
2626
PACKET_TYPE_ACK = 0b010
2727
PACKET_TYPE_CON = 0b100
2828

29-
MAX_BODY_SEGMENT_LEN = 23
29+
MAX_BODY_SEGMENT_LEN = 25
3030
MAX_CON_BODY_SEGMENT_LEN = 30
3131

3232
PACKET_TYPE_STRINGS = {
@@ -42,7 +42,6 @@ def __init__(self, data=""):
4242
self.packet_type = None
4343
self.body = None
4444
self.body_len = None
45-
self.message_type = None
4645
self.crc = None
4746
if len(data) < 10:
4847
return
@@ -58,17 +57,15 @@ def __init__(self, data=""):
5857
self.pod_address_2 = data[5:9].encode("hex")
5958

6059
if (self.packet_type != Packet.PACKET_TYPE_CON and
61-
self.packet_type != Packet.PACKET_TYPE_ACK and len(data) > 13):
60+
self.packet_type != Packet.PACKET_TYPE_ACK and len(data) > 11):
6261
self.byte9 = ord(data[9])
6362
self.body_len = ord(data[10])
64-
self.message_type = data[11:13]
65-
segment_len = min(Packet.MAX_BODY_SEGMENT_LEN,self.body_len,len(data)-14)
66-
self.body = data[13:(13+segment_len)]
67-
self.crc = ord(data[13+segment_len])
63+
segment_len = min(Packet.MAX_BODY_SEGMENT_LEN,self.body_len,len(data)-12)
64+
self.body = data[11:(11+segment_len)]
65+
self.crc = ord(data[11+segment_len])
6866
else:
6967
self.byte9 = None
7068
self.body_len = 0
71-
self.message_type = None
7269
self.body = None
7370
self.crc = ord(data[9])
7471

@@ -98,6 +95,7 @@ def assign_from_string(self, line):
9895
self.pod_address_2 = None
9996
self.byte9 = None
10097
self.received_at = dateutil.parser.parse(elems[0])
98+
legacy_mtype = ""
10199
for elem in elems[1:]:
102100
(key,v) = elem.split(':')
103101
if key == "ID1":
@@ -118,10 +116,10 @@ def assign_from_string(self, line):
118116
self.byte9 = int(v,16)
119117
if key == "BLEN":
120118
self.body_len = int(v)
121-
if key == "MTYPE":
122-
self.message_type = v.decode('hex')
119+
if key == "MTYPE": # Legacy format
120+
legacy_mtype = v.decode('hex')
123121
if key == "BODY":
124-
self.body = v.decode('hex')
122+
self.body = legacy_mtype + v.decode('hex')
125123
except ValueError:
126124
self.body = None
127125
except OverflowError:
@@ -140,7 +138,6 @@ def tx_data(self):
140138
if self.packet_type != self.PACKET_TYPE_CON and self.body is not None:
141139
data += chr(self.byte9)
142140
data += chr(self.body_len)
143-
data += self.message_type
144141
data += self.body
145142
data += chr(self.compute_crc_for(bytearray(data)))
146143
return data
@@ -154,8 +151,6 @@ def __eq__(self, other):
154151
return False
155152
if self.packet_type != other.packet_type:
156153
return False
157-
if self.message_type != other.message_type:
158-
return False
159154
if self.body != other.body:
160155
return False
161156
if self.byte9 != other.byte9:
@@ -170,7 +165,6 @@ def __hash__(self):
170165
hash(self.pod_address_1),
171166
hash(self.pod_address_2),
172167
hash(self.packet_type),
173-
hash(self.message_type),
174168
hash(self.body),
175169
hash(self.byte9),
176170
hash(self.sequence)])
@@ -206,12 +200,11 @@ def __str__(self):
206200
)
207201
if self.body != None:
208202
# All other packets with enough bytes to have a body
209-
return "%s ID2:%s B9:%02x BLEN:%s MTYPE:%s BODY:%s CRC:%02x" % (
203+
return "%s ID2:%s B9:%02x BLEN:%s BODY:%s CRC:%02x" % (
210204
base_str,
211205
self.pod_address_2,
212206
self.byte9,
213207
self.body_len,
214-
self.message_type.encode('hex'),
215208
self.body.encode('hex'),
216209
crc,
217210
)
@@ -242,8 +235,6 @@ def as_dict(self):
242235
if self.body is not None:
243236
obj["body"] = self.body.encode('hex')
244237
obj["body_len"] = self.body_len
245-
if self.message_type is not None:
246-
obj["message_type"] = self.message_type.encode('hex')
247238
if self.received_at is not None:
248239
obj["received_at"] = self.received_at
249240
else:
@@ -264,7 +255,7 @@ def is_valid(self):
264255
if self.body is None:
265256
return False
266257
big_body_ok = self.body_len > Packet.MAX_BODY_SEGMENT_LEN and len(self.body) == Packet.MAX_BODY_SEGMENT_LEN
267-
small_body_ok = self.body_len == 0 or self.body_len == len(self.body)
258+
small_body_ok = self.body_len == 0 or self.body_len == len(self.body) - 2
268259
body_ok = (big_body_ok or small_body_ok)
269260
return self.crc_ok() and body_ok
270261

openomni/packet_test.py

+10
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,18 @@ def test_init_pdm_packet_with_extraneous_data(self):
2323
packet = Packet("1f07b1eeae1f07b1ee181f1a0eeb5701b202010a0101a000340034170d000208000186a01912345678".decode('hex'))
2424
self.assertTrue(packet.is_valid())
2525
self.assertEqual(packet.packet_type, Packet.PACKET_TYPE_PDM)
26+
self.assertEqual(packet.raw_hex(), "1f07b1eeae1f07b1ee181f1a0eeb5701b202010a0101a000340034170d000208000186a019")
2627

2728
def test_init_ack_packet_with_extraneous_data(self):
2829
packet = Packet("1f01482a5e1f01482ae51824c9e2fa95146a9a9444bbfa0f1474514e7d".decode('hex'))
2930
self.assertTrue(packet.is_valid())
3031
self.assertEqual(packet.packet_type, Packet.PACKET_TYPE_ACK)
32+
self.assertEqual(packet.raw_hex(), "1f01482a5e1f01482ae5")
33+
34+
def test_read_packet_output_format(self):
35+
packet = Packet().assign_from_string("2016-06-17T20:50:34.882742 ID1:1f014829 PTYPE:POD SEQ:14 ID2:1f014829 B9:24 BLEN:10 MTYPE:1d18 BODY:02ada800002be7ff021c CRC:40")
36+
self.assertTrue(packet.is_valid())
37+
self.assertEqual(packet.packet_type, Packet.PACKET_TYPE_POD)
38+
self.assertEqual(packet.body_len, 10)
39+
self.assertEqual(len(packet.body), 12) # Includes crc
40+
self.assertEqual(str(packet), "2016-06-17T20:50:34.882742 ID1:1f014829 PTYPE:POD SEQ:14 ID2:1f014829 B9:24 BLEN:10 BODY:1d1802ada800002be7ff021c CRC:40")

0 commit comments

Comments
 (0)