System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

serviceCAN/serviceCAN.cpp

Committer:
pspatel321
Date:
2015-01-06
Revision:
33:6bc82b6b62e5
Parent:
31:7eaa5e881b56

File content as of revision 33:6bc82b6b62e5:

#include "serviceCAN.h"
#include "CAN_RxIDs.h"

bool canbus::serviceCAN(CANMessage* fromXbee)
{
    CANMessage 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;
    } else return false;
}