System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
Diff: serviceCAN/serviceCAN.cpp
- Revision:
- 33:6bc82b6b62e5
- Parent:
- 31:7eaa5e881b56
diff -r e70407021ad2 -r 6bc82b6b62e5 serviceCAN/serviceCAN.cpp --- a/serviceCAN/serviceCAN.cpp Sun Nov 16 02:43:58 2014 +0000 +++ b/serviceCAN/serviceCAN.cpp Tue Jan 06 20:45:26 2015 +0000 @@ -1,64 +1,80 @@ #include "serviceCAN.h" #include "CAN_RxIDs.h" - -bool canbus::serviceCAN() { +bool canbus::serviceCAN(CANMessage* fromXbee) +{ 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); + if (fromXbee != NULL) { + memcpy((void*)&msg, (void*)fromXbee, sizeof(CANMessage)); + } else { + if (!can.rxRead(msg)) return false; + } + + 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] & (1<<3|1<<4|1<<5)) == (1<<3|1<<4|1<<5)) { // AIRs closed? 1<<3=posAIR, 1<<4=negAIR, 1<<5=tractiveEnable signal + 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; + case STEERING_RESET_ID: + NVIC_SystemReset(); + break; + default: + break; + } + + return true; + +} +// Check for incoming messages from the xbees +bool canbus::receiveMsgXbee() +{ + CANMessage msg; + if (xbeeRelay.receive(msg)) { // Incoming CAN message string received + if (!can.txWrite(msg)) data.canFault = true; // Send it out on the CAN bus + serviceCAN(&msg); // Send it into the local serviceCAN routine return true; - } - return false; + } else return false; } \ No newline at end of file