System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Revision:
33:6bc82b6b62e5
Parent:
31:7eaa5e881b56
--- 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