@@ -116,7 +116,11 @@ uint16_t gas_set_1 = 0;
116
116
uint32_t timeout = 0 ;
117
117
uint32_t current_index = 0 ;
118
118
119
- uint8_t fault = 0 ;
119
+ #define STATE_GOOD 0
120
+ #define STATE_FAULT_CHECKSUM 1
121
+ #define STATE_FAULT_SEND 2
122
+ #define STATE_FAULT_SCE 3
123
+ uint8_t state = STATE_NONE ;
120
124
121
125
void CAN1_RX0_IRQHandler () {
122
126
while (CAN -> RF0R & CAN_RF0R_FMP0 ) {
@@ -129,6 +133,7 @@ void CAN1_RX0_IRQHandler() {
129
133
uint8_t * dat2 = (uint8_t * )& CAN -> sFIFOMailBox [0 ].RDHR ;
130
134
uint16_t value_0 = (dat [0 ] << 8 ) | dat [1 ];
131
135
uint16_t value_1 = (dat [2 ] << 8 ) | dat [3 ];
136
+ uint8_t enable = (dat2 [0 ] >> 7 ) & 1 ;
132
137
uint8_t index = (dat2 [0 ] >> 4 ) & 3 ;
133
138
if (can_cksum (dat , 4 , CAN_GAS_INPUT , index ) == (dat2 [0 ] & 0xF )) {
134
139
if (((current_index + 1 )& 3 ) == index ) {
@@ -137,17 +142,22 @@ void CAN1_RX0_IRQHandler() {
137
142
puth (value );
138
143
puts ("\n" );
139
144
#endif
140
- gas_set_0 = value_0 ;
141
- gas_set_1 = value_1 ;
142
- // clear the timeout and fault
143
- timeout = 0 ;
144
- fault = 0 ;
145
+ if (enable ) {
146
+ gas_set_0 = value_0 ;
147
+ gas_set_1 = value_1 ;
148
+ // clear the timeout
149
+ timeout = 0 ;
150
+ } else {
151
+ gas_set_0 = gas_set_1 = 0 ;
152
+ // clear the fault state
153
+ state = STATE_GOOD ;
154
+ }
145
155
}
146
156
// TODO: better lockout? prevents same spam
147
157
current_index = index ;
148
158
} else {
149
159
// wrong checksum = fault
150
- fault = 1 ;
160
+ state = STATE_FAULT_CHECKSUM ;
151
161
}
152
162
}
153
163
// next
@@ -156,7 +166,7 @@ void CAN1_RX0_IRQHandler() {
156
166
}
157
167
158
168
void CAN1_SCE_IRQHandler () {
159
- fault = 1 ;
169
+ state = STATE_FAULT_SCE ;
160
170
can_sce (CAN );
161
171
}
162
172
@@ -182,7 +192,7 @@ void TIM3_IRQHandler() {
182
192
dat [1 ] = (pdl0 >>0 )& 0xFF ;
183
193
dat [2 ] = (pdl1 >>8 )& 0xFF ;
184
194
dat [3 ] = (pdl1 >>0 )& 0xFF ;
185
- dat [4 ] = fault ;
195
+ dat [4 ] = state ;
186
196
dat [5 ] = can_cksum (dat , 5 , CAN_GAS_OUTPUT , pkt_idx );
187
197
dat [6 ] = dat [7 ] = 0 ;
188
198
CAN -> sTxMailBox [0 ].TDLR = ((uint32_t * )dat )[0 ];
@@ -193,7 +203,7 @@ void TIM3_IRQHandler() {
193
203
pkt_idx &= 3 ;
194
204
} else {
195
205
// old can packet hasn't sent!
196
- fault = 1 ;
206
+ state = STATE_FAULT_SEND ;
197
207
#ifdef DEBUG
198
208
puts ("CAN MISS\n" );
199
209
#endif
@@ -217,7 +227,7 @@ void pedal() {
217
227
pdl1 = adc_get (ADCCHAN_ACCEL1 );
218
228
219
229
// write the pedal to the DAC
220
- if (timeout < MAX_TIMEOUT && ! fault ) {
230
+ if (timeout < MAX_TIMEOUT && state == STATE_GOOD ) {
221
231
dac_set (0 , max (gas_set_0 , pdl0 ));
222
232
dac_set (1 , max (gas_set_1 , pdl1 ));
223
233
} else {
0 commit comments