![](/media/cache/group/underwritten_car_negative.png.50x50_q85.png)
System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
Diff: serviceCAN/serviceCAN.cpp
- Revision:
- 31:7eaa5e881b56
- Parent:
- 30:91af74a299e1
- Child:
- 33:6bc82b6b62e5
--- a/serviceCAN/serviceCAN.cpp Thu Nov 13 10:53:10 2014 +0000 +++ b/serviceCAN/serviceCAN.cpp Fri Nov 14 06:05:59 2014 +0000 @@ -1,25 +1,64 @@ #include "serviceCAN.h" - -// MACRO to setup handling of timeouts -#define TIMEOUT(VAR) Timeout timer_##VAR; void timeout_##VAR(){ flags.VAR = false; } -#define REFRESH_TIMEOUT(VAR) timer_##VAR.detach(); timer_##VAR.attach(&timeout_##VAR, DEVICE_CAN_TIMEOUT/100.0); -#define CHECK_ERRORS(VAR, MSG) if (hasErrors(MSG)) { flags.VAR = false; } else { flags.VAR = true; } - -// Timeouts to handle cases where CAN messages stop coming in - +#include "CAN_RxIDs.h" -// Check every byte of the message for an error bit -bool hasErrors(CANMessage& msg) { - bool errorPresent = false; - for (int i = 0; i < msg.len; i++) { - if (i >= 8) { errorPresent = true; break; } // out of bounds, bad CAN message - if (msg.data[i]) errorPresent = true; - } - return errorPresent; -} bool canbus::serviceCAN() { CANMessage msg; - + if (can.rxRead(msg)) { + switch (msg.id) { + case FAN_CONTROL_ID: + if (msg.len != 2*sizeof(float)) break; + memcpy((void*)&CANdata.dcdcFan1Duty, &msg.data[0], sizeof(float)); + memcpy((void*)&CANdata.dcdcFan2Duty, &msg.data[4], sizeof(float)); + dcdc.setPwm(FAN1, CANdata.dcdcFan1Duty); + dcdc.setPwm(FAN2, CANdata.dcdcFan2Duty); + break; + + case PUMP_CONTROL_ID: + if (msg.len != 2*sizeof(float)) break; + memcpy((void*)&CANdata.dcdcPump1Duty, &msg.data[0], sizeof(float)); + memcpy((void*)&CANdata.dcdcPump2Duty, &msg.data[4], sizeof(float)); + dcdc.setPwm(PUMP1, CANdata.dcdcPump1Duty); + dcdc.setPwm(PUMP2, CANdata.dcdcPump2Duty); + break; + + case DCDC_CONTROL_ID: + if (msg.len != sizeof(char)) break; + if (msg.data[0] == 1) dcdc.set(1); + else dcdc.set(0); + break; + + case AMS_RELAYS_ID: + if (msg.len != sizeof(char)) break; + if ((msg.data[0] & 0xC0) == 0xC0) { + CANdata.airsClosed = true; + dcdc.set(1); + } else { + CANdata.airsClosed = false; + dcdc.set(0); + } + break; + + case GLVBAT_CLEARSOC_ID: + if (msg.len != sizeof(float)) break; + glvBat.resetToSOC(*((float*)(&msg.data[0]))); + break; + + case GLVBAT_CLEARAH_ID: + if (msg.len != sizeof(float)) break; + glvBat.resetToAh(*((float*)(&msg.data[0]))); + break; + + case GLVBAT_SETCAPAC_ID: + if (msg.len != sizeof(float)) break; + glvBat.changeCapacity(*((float*)(&msg.data[0]))); + break; + + default: + break; + } + xbee.receive(msg); + return true; + } return false; } \ No newline at end of file