Skip to content

Commit 8f0add9

Browse files
committed
handle faults
1 parent 1d917f8 commit 8f0add9

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

board/pedal/main.c

+21-11
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,11 @@ uint16_t gas_set_1 = 0;
116116
uint32_t timeout = 0;
117117
uint32_t current_index = 0;
118118

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;
120124

121125
void CAN1_RX0_IRQHandler() {
122126
while (CAN->RF0R & CAN_RF0R_FMP0) {
@@ -129,6 +133,7 @@ void CAN1_RX0_IRQHandler() {
129133
uint8_t *dat2 = (uint8_t *)&CAN->sFIFOMailBox[0].RDHR;
130134
uint16_t value_0 = (dat[0] << 8) | dat[1];
131135
uint16_t value_1 = (dat[2] << 8) | dat[3];
136+
uint8_t enable = (dat2[0] >> 7) & 1;
132137
uint8_t index = (dat2[0] >> 4) & 3;
133138
if (can_cksum(dat, 4, CAN_GAS_INPUT, index) == (dat2[0] & 0xF)) {
134139
if (((current_index+1)&3) == index) {
@@ -137,17 +142,22 @@ void CAN1_RX0_IRQHandler() {
137142
puth(value);
138143
puts("\n");
139144
#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+
}
145155
}
146156
// TODO: better lockout? prevents same spam
147157
current_index = index;
148158
} else {
149159
// wrong checksum = fault
150-
fault = 1;
160+
state = STATE_FAULT_CHECKSUM;
151161
}
152162
}
153163
// next
@@ -156,7 +166,7 @@ void CAN1_RX0_IRQHandler() {
156166
}
157167

158168
void CAN1_SCE_IRQHandler() {
159-
fault = 1;
169+
state = STATE_FAULT_SCE;
160170
can_sce(CAN);
161171
}
162172

@@ -182,7 +192,7 @@ void TIM3_IRQHandler() {
182192
dat[1] = (pdl0>>0)&0xFF;
183193
dat[2] = (pdl1>>8)&0xFF;
184194
dat[3] = (pdl1>>0)&0xFF;
185-
dat[4] = fault;
195+
dat[4] = state;
186196
dat[5] = can_cksum(dat, 5, CAN_GAS_OUTPUT, pkt_idx);
187197
dat[6] = dat[7] = 0;
188198
CAN->sTxMailBox[0].TDLR = ((uint32_t*)dat)[0];
@@ -193,7 +203,7 @@ void TIM3_IRQHandler() {
193203
pkt_idx &= 3;
194204
} else {
195205
// old can packet hasn't sent!
196-
fault = 1;
206+
state = STATE_FAULT_SEND;
197207
#ifdef DEBUG
198208
puts("CAN MISS\n");
199209
#endif
@@ -217,7 +227,7 @@ void pedal() {
217227
pdl1 = adc_get(ADCCHAN_ACCEL1);
218228

219229
// write the pedal to the DAC
220-
if (timeout < MAX_TIMEOUT && !fault) {
230+
if (timeout < MAX_TIMEOUT && state == STATE_GOOD) {
221231
dac_set(0, max(gas_set_0, pdl0));
222232
dac_set(1, max(gas_set_1, pdl1));
223233
} else {

0 commit comments

Comments
 (0)