@@ -121,6 +121,7 @@ uint32_t current_index = 0;
121
121
#define STATE_FAULT_SEND 2
122
122
#define STATE_FAULT_SCE 3
123
123
#define STATE_FAULT_STARTUP 4
124
+ #define STATE_FAULT_TIMEOUT 5
124
125
uint8_t state = STATE_FAULT_STARTUP ;
125
126
126
127
void CAN1_RX0_IRQHandler () {
@@ -146,15 +147,14 @@ void CAN1_RX0_IRQHandler() {
146
147
if (enable ) {
147
148
gas_set_0 = value_0 ;
148
149
gas_set_1 = value_1 ;
149
- // clear the timeout
150
- timeout = 0 ;
151
150
} else {
151
+ // clear the fault state if values are 0
152
+ if (value_0 == 0 && value_1 == 0 ) state = STATE_GOOD ;
152
153
gas_set_0 = gas_set_1 = 0 ;
153
- // clear the fault state
154
- state = STATE_GOOD ;
155
154
}
155
+ // clear the timeout
156
+ timeout = 0 ;
156
157
}
157
- // TODO: better lockout? prevents same spam
158
158
current_index = index ;
159
159
} else {
160
160
// wrong checksum = fault
@@ -195,9 +195,8 @@ void TIM3_IRQHandler() {
195
195
dat [3 ] = (pdl1 >>0 )& 0xFF ;
196
196
dat [4 ] = state ;
197
197
dat [5 ] = can_cksum (dat , 5 , CAN_GAS_OUTPUT , pkt_idx );
198
- dat [6 ] = dat [7 ] = 0 ;
199
- CAN -> sTxMailBox [0 ].TDLR = ((uint32_t * )dat )[0 ];
200
- CAN -> sTxMailBox [0 ].TDHR = ((uint32_t * )dat )[1 ];
198
+ CAN -> sTxMailBox [0 ].TDLR = dat [0 ] | (dat [1 ]<<8 ) | (dat [2 ]<<16 ) | (dat [3 ]<<24 );
199
+ CAN -> sTxMailBox [0 ].TDHR = dat [4 ] | (dat [5 ]<<8 );
201
200
CAN -> sTxMailBox [0 ].TDTR = 6 ; // len of packet is 5
202
201
CAN -> sTxMailBox [0 ].TIR = (CAN_GAS_OUTPUT << 21 ) | 1 ;
203
202
++ pkt_idx ;
@@ -217,7 +216,11 @@ void TIM3_IRQHandler() {
217
216
TIM3 -> SR = 0 ;
218
217
219
218
// up timeout for gas set
220
- timeout = min (timeout + 1 , MAX_TIMEOUT );
219
+ if (timeout == MAX_TIMEOUT ) {
220
+ state = STATE_FAULT_TIMEOUT ;
221
+ } else {
222
+ timeout += 1 ;
223
+ }
221
224
}
222
225
223
226
// ***************************** main code *****************************
0 commit comments