Skip to content

Commit 766b064

Browse files
committed
Start adding sh2
1 parent e6b665a commit 766b064

File tree

4 files changed

+135
-101
lines changed

4 files changed

+135
-101
lines changed

common.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
2+
from saleae.analyzers import HighLevelAnalyzer, AnalyzerFrame, StringSetting, NumberSetting, ChoicesSetting
3+
4+
class Packet:
5+
is_continuation_header: bool
6+
header_idx: int
7+
start_time: float
8+
end_time: float
9+
length_lsb: int
10+
length_msb: int
11+
length: int
12+
channel: int
13+
sequence_number: int
14+
data: bytearray
15+
16+
def __init__(self, start_time) -> None:
17+
self.is_continuation_header = False
18+
self.length = 0xFFFF
19+
self.header_idx = 0
20+
self.sequence_number = 0xFF
21+
self.channel = 0xFF
22+
self.start_time = start_time
23+
self.data = bytearray()
24+
25+
26+
class SHTPParser:
27+
def __init__(self):
28+
self.packet = None
29+
30+
def fill_header(self, d):
31+
if self.packet.header_idx == 0:
32+
self.packet.length_lsb = d[0]
33+
elif self.packet.header_idx == 1:
34+
self.packet.length_msb = d[0]
35+
length = self.packet.length_lsb | (self.packet.length_msb << 8)
36+
length = length & 0x7FFF
37+
38+
print("len: ", length)
39+
40+
self.packet.length = length
41+
elif self.packet.header_idx == 2:
42+
self.packet.channel = d[0]
43+
elif self.packet.header_idx == 3:
44+
self.packet.sequence_number = d[0]
45+
46+
self.packet.header_idx += 1
47+
48+
49+
def decode(self, frame: AnalyzerFrame):
50+
type = frame.type
51+
52+
if type == 'start' and self.packet is None:
53+
self.packet = Packet(frame.start_time)
54+
elif type == 'start':
55+
self.packet.is_continuation_header = True
56+
self.packet.header_idx = 0
57+
elif (type == 'stop' or type == 'data') and self.packet is not None:
58+
if self.packet.length - 4 == len(self.packet.data):
59+
self.packet.end_time = frame.end_time
60+
61+
f = AnalyzerFrame(
62+
'packet',
63+
self.packet.start_time,
64+
self.packet.end_time,
65+
{
66+
'contents': self.packet.data,
67+
'channel': self.packet.channel,
68+
'sequence': self.packet.sequence_number,
69+
'length': self.packet.length
70+
},
71+
)
72+
73+
self.packet = None
74+
75+
return f
76+
elif type != 'data':
77+
pass
78+
79+
80+
if self.packet is not None:
81+
if type == 'data':
82+
if self.packet.is_continuation_header:
83+
self.packet.header_idx += 1
84+
85+
if self.packet.header_idx >= 4:
86+
self.packet.is_continuation_header = False
87+
else:
88+
d = frame.data['data']
89+
90+
if self.packet.header_idx < 4:
91+
self.fill_header(d)
92+
else:
93+
# print(d)
94+
self.packet.data.extend(d)
95+
96+
97+
98+

extension.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
{
2-
"name": "SHTP",
2+
"name": "SHTP+SH2",
33
"apiVersion": "1.0.0",
44
"author": "Roberts Kalnins",
55
"version": "0.0.1",
6-
"description": "SHTP parser",
6+
"description": "SHTP parser with SH2 interpretation",
77
"extensions": {
8+
"SH2": {
9+
"type": "HighLevelAnalyzer",
10+
"entryPoint": "sh2_analyzer.SH2Hla"
11+
},
812
"SHTP": {
913
"type": "HighLevelAnalyzer",
1014
"entryPoint": "shtp_analyzer.SHTPHla"
1115
}
1216
}
13-
}
17+
}

sh2_analyzer.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
from saleae.analyzers import HighLevelAnalyzer, AnalyzerFrame, StringSetting, NumberSetting, ChoicesSetting
3+
4+
from common import Packet, SHTPParser
5+
6+
7+
class SH2Hla(HighLevelAnalyzer):
8+
result_types = {
9+
'accel': {
10+
'format': '[x,y,z] = [{{data.x}} {{data.y}} {{data.z}}]',
11+
},
12+
'gyro': {
13+
'format': '[x,y,z] = [{{data.x}} {{data.y}} {{data.z}}]',
14+
},
15+
'rotv': {
16+
'format': '[r,p,y,a] = [{{data.x}} {{data.y}} {{data.z}} {{data.accuracy}}]',
17+
},
18+
}
19+
20+
def __init__(self):
21+
self.shtp_parser = SHTPParser()
22+
self.packet = None
23+
self.reports = None
24+
25+
def decode(self, frame: AnalyzerFrame):
26+
return self.shtp_parser.decode(frame)
27+

shtp_analyzer.py

Lines changed: 3 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,6 @@
1-
# High Level Analyzer
2-
# For more information and documentation, please go to https://support.saleae.com/extensions/high-level-analyzer-extensions
3-
41
from saleae.analyzers import HighLevelAnalyzer, AnalyzerFrame, StringSetting, NumberSetting, ChoicesSetting
52

6-
class Packet:
7-
is_continuation_header: bool
8-
header_idx: int
9-
start_time: float
10-
end_time: float
11-
length_lsb: int
12-
length_msb: int
13-
length: int
14-
channel: int
15-
sequence_number: int
16-
data: bytearray
17-
18-
def __init__(self, start_time) -> None:
19-
self.is_continuation_header = False
20-
self.length = 0xFFFF
21-
self.header_idx = 0
22-
self.sequence_number = 0xFF
23-
self.channel = 0xFF
24-
self.start_time = start_time
25-
self.data = bytearray()
3+
from common import Packet, SHTPParser
264

275
class SHTPHla(HighLevelAnalyzer):
286
result_types = {
@@ -31,83 +9,10 @@ class SHTPHla(HighLevelAnalyzer):
319
}
3210
}
3311

34-
def fill_header(self, d):
35-
if self.packet.header_idx == 0:
36-
self.packet.length_lsb = d[0]
37-
elif self.packet.header_idx == 1:
38-
self.packet.length_msb = d[0]
39-
length = self.packet.length_lsb | (self.packet.length_msb << 8)
40-
length = length & 0x7FFF
41-
42-
print("len: ", length)
43-
print("lsb: ", self.packet.length_lsb)
44-
print("msb: ", self.packet.length_msb)
45-
46-
47-
self.packet.length = length
48-
elif self.packet.header_idx == 2:
49-
self.packet.channel = d[0]
50-
elif self.packet.header_idx == 3:
51-
self.packet.sequence_number = d[0]
52-
53-
self.packet.header_idx += 1
5412

5513
def __init__(self):
56-
self.packet = None
57-
58-
pass
14+
self.shtp_parser = SHTPParser()
5915

6016
def decode(self, frame: AnalyzerFrame):
61-
type = frame.type
62-
63-
if type == 'start' and self.packet is None:
64-
self.packet = Packet(frame.start_time)
65-
elif type == 'start':
66-
self.packet.is_continuation_header = True
67-
self.packet.header_idx = 0
68-
elif (type == 'stop' or type == 'data') and self.packet is not None:
69-
if self.packet.length - 4 == len(self.packet.data):
70-
self.packet.end_time = frame.end_time
71-
72-
f = AnalyzerFrame(
73-
'packet',
74-
self.packet.start_time,
75-
self.packet.end_time,
76-
{
77-
'contents': self.packet.data,
78-
'channel': self.packet.channel,
79-
'sequence': self.packet.sequence_number,
80-
'length': self.packet.length
81-
},
82-
)
83-
84-
self.packet = None
85-
86-
return f
87-
elif type != 'data':
88-
print("not enough length")
89-
90-
91-
if self.packet is not None:
92-
if type == 'data':
93-
if self.packet.is_continuation_header:
94-
print('skipping header')
95-
self.packet.header_idx += 1
96-
97-
if self.packet.header_idx >= 4:
98-
print("current len:", len(self.packet.data))
99-
self.packet.is_continuation_header = False
100-
else:
101-
d = frame.data['data']
102-
103-
if self.packet.header_idx < 4:
104-
self.fill_header(d)
105-
else:
106-
# print(d)
107-
self.packet.data.extend(d)
108-
109-
print(len(self.packet.data), d)
110-
111-
112-
17+
return self.shtp_parser.decode(frame)
11318

0 commit comments

Comments
 (0)