@@ -17,7 +17,10 @@ class Hla(HighLevelAnalyzer):
17
17
'sbus_start_sync_byte' : {
18
18
'format' : 'Start sync byte'
19
19
},
20
- 'sbus_payload' : {
20
+ 'sbus_analog_payload' : {
21
+ 'format' : 'PAYLOAD: {{data.payload}}'
22
+ },
23
+ 'sbus_digital_payload' : {
21
24
'format' : 'PAYLOAD: {{data.payload}}'
22
25
},
23
26
'sbus_end_sync_byte' : {
@@ -29,8 +32,9 @@ class Hla(HighLevelAnalyzer):
29
32
class dec_fsm_e (enum .Enum ):
30
33
idle = 1
31
34
#start_sync_byte = 2 # No being used - If sync byte is detected the state changes from idle -> payload
32
- payload = 3
33
- stop_sync_byte = 4
35
+ analog_payload = 3
36
+ digital_payload = 4
37
+ stop_sync_byte = 5
34
38
35
39
# Protocol defines
36
40
SBUS_START_SYNC_BYTE = b'\x0f ' # 0x0F
@@ -63,25 +67,25 @@ def decode(self, frame: AnalyzerFrame):
63
67
if self .sbus_frame_start == None and frame .data ['data' ] == self .SBUS_START_SYNC_BYTE and self .dec_fsm == self .dec_fsm_e .idle :
64
68
print ('Start sync byte detected.' )
65
69
self .sbus_frame_start = frame .start_time
66
- self .dec_fsm = self .dec_fsm_e .payload
70
+ self .dec_fsm = self .dec_fsm_e .analog_payload
67
71
self .sbus_frame_current_index += 1
68
72
return AnalyzerFrame ('START' , frame .start_time , frame .end_time , {})
69
73
70
- # Payload
71
- if self .dec_fsm == self .dec_fsm_e .payload :
74
+ # Analog payload
75
+ if self .dec_fsm == self .dec_fsm_e .analog_payload :
72
76
payload = int .from_bytes (frame .data ['data' ], byteorder = 'big' )
73
77
if self .sbus_frame_current_index == 1 : # First payload byte
74
78
self .sbus_payload_start = frame .start_time
75
79
self .sbus_payload .append (payload )
76
80
self .sbus_frame_current_index += 1
77
81
#print('Payload start ({}): {:2x}'.format(self.sbus_frame_current_index, payload))
78
- elif self .sbus_frame_current_index < 23 : # ... still collecting payload bytes ...
82
+ elif self .sbus_frame_current_index < 22 : # ... still collecting payload bytes ...
79
83
self .sbus_payload .append (payload )
80
84
self .sbus_frame_current_index += 1
81
85
#print('Adding payload ({}): {:2x}'.format(self.sbus_frame_current_index, payload))
82
- elif self .sbus_frame_current_index == 23 : # Last payload byte received
86
+ elif self .sbus_frame_current_index == 22 : # Last analog payload byte received
83
87
analyzerframe = None
84
- self .dec_fsm = self .dec_fsm_e .stop_sync_byte
88
+ self .dec_fsm = self .dec_fsm_e .digital_payload
85
89
self .sbus_payload_end = frame .end_time
86
90
self .sbus_payload .append (payload )
87
91
#print('Payload complete ({}): {:2x}'.format(self.sbus_frame_current_index, payload))
@@ -99,15 +103,45 @@ def decode(self, frame: AnalyzerFrame):
99
103
channels .append (value )
100
104
channels .append (value_ms )
101
105
print (channels )
102
- payload_str = ('Ch1: {} ({} ms ), Ch2: {} ({} ms ), Ch3: {} ({} ms ), Ch4: {} ({} ms ), ' + \
103
- 'Ch5: {} ({} ms ), Ch6: {} ({} ms ), Ch7: {} ({} ms ), Ch8: {} ({} ms ), ' + \
104
- 'Ch9: {} ({} ms ), Ch10: {} ({} ms ), Ch11: {} ({} ms ), Ch12: {} ({} ms ), ' + \
105
- 'Ch13: {} ({} ms ), Ch14: {} ({} ms ), Ch15: {} ({} ms ), Ch16: {} ({} ms )' ).format (* channels )
106
+ payload_str = ('Ch1:{} ({}µs ), Ch2:{} ({}µs ), Ch3:{} ({}µs ), Ch4:{} ({}µs ), ' + \
107
+ 'Ch5:{} ({}µs ), Ch6:{} ({}µs ), Ch7:{} ({}µs ), Ch8:{} ({}µs ), ' + \
108
+ 'Ch9:{} ({}µs ), Ch10:{} ({}µs ), Ch11:{} ({}µs ), Ch12:{} ({}µs ), ' + \
109
+ 'Ch13:{} ({}µs ), Ch14:{} ({}µs ), Ch15:{} ({}µs ), Ch16:{} ({}µs )' ).format (* channels )
106
110
print (payload_str )
107
- analyzerframe = AnalyzerFrame ('sbus_payload ' , self .sbus_payload_start , frame .end_time , {
111
+ analyzerframe = AnalyzerFrame ('sbus_analog_payload ' , self .sbus_payload_start , frame .end_time , {
108
112
'payload' : payload_str })
109
113
return analyzerframe
110
114
115
+ # Digital payload
116
+ if self .dec_fsm == self .dec_fsm_e .digital_payload :
117
+ self .dec_fsm = self .dec_fsm_e .stop_sync_byte
118
+ payload = int .from_bytes (frame .data ['data' ], byteorder = 'big' )
119
+ print (payload )
120
+ if payload == 0 :
121
+ return AnalyzerFrame ('' , frame .start_time , frame .end_time , {})
122
+ else :
123
+ payload_str = ''
124
+ sep = False
125
+ if (payload & 0x8 ) != 0 :
126
+ payload_str += "Failsafe"
127
+ sep = True
128
+ if (payload & 0x4 ) != 0 :
129
+ if sep :
130
+ payload_str += ", "
131
+ payload_str += "Frame lost"
132
+ sep = True
133
+ if (payload & 0x2 ) != 0 :
134
+ if sep :
135
+ payload_str += ", "
136
+ payload_str += "Ch18 on"
137
+ sep = True
138
+ if (payload & 0x1 ) != 0 :
139
+ if sep :
140
+ payload_str += ", "
141
+ payload_str += "Ch17 on"
142
+ print (payload_str )
143
+ return AnalyzerFrame ('sbus_digital_payload' , frame .start_time , frame .end_time , {'payload' : payload_str })
144
+
111
145
# Stop sync byte
112
146
if self .dec_fsm == self .dec_fsm_e .stop_sync_byte and frame .data ['data' ] == self .SBUS_STOP_SYNC_BYTE :
113
147
print ('Stop sync byte detected.' )
0 commit comments