System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

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