System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

runTime/runTime.cpp

Committer:
pspatel321
Date:
2015-02-11
Revision:
39:ddf38df9699e
Parent:
38:8efacce315ae

File content as of revision 39:ddf38df9699e:

#include "runTime.h"

void runTime::gather(void const* args)
{
    static int counter = 0;

    // POPULATE DATA
    op->SysTime             = time(0);      // Tick time

    // GLV Battery
    op->glvBat.current      = glvBat.current();
    op->glvBat.SOC          = glvBat.SOC();
    op->glvBat.Ah           = glvBat.ampHours();
    op->glvBat.capacity     = glvBat.capacity();
    op->glvBat.error        = glvBat.readError();

    // DC-DC converter & PWM channels
    op->dcdc.status         = dcdc.getStatus();
    op->dcdc.current        = dcdc.getCurrent();
    op->dcdc.actual.pump1   = dcdc.readPwm(PUMP1);
    op->dcdc.actual.pump2   = dcdc.readPwm(PUMP2);
    op->dcdc.actual.fan1    = dcdc.readPwm(FAN1);
    op->dcdc.actual.fan2    = dcdc.readPwm(FAN2);

    // IMD PWM
    op->imd.status          = imd.status();
    op->imd.resistance      = imd.resistance();
    static bool started=false;
    if (counter > 30) started=true;     // Give the IMD 3 seconds to turn on
    if (started) {
        op->imd.error       = ((op->imd.status != NORMAL) && (op->imd.status != SPEEDSTART)) || (isnan(op->imd.resistance));
    } else op->imd.error    = 0;
    
    // Reset latches
    op->latch.ams           = AMSlatch.update();
    op->latch.imd           = IMDlatch.update();

    // Switches
    op->switchState         = switches.poll();
    if (op->switchState == 0)   op->signals |= SHUTDOWN_CLOSED;
    else                        op->signals &= ~SHUTDOWN_CLOSED;

    // Temperaure
    op->internalTemp        = internalTmp.read();

    // Telemetry trackers
 //   op->xbee1.msgIn         = xbeeRelay.counterX1in;
 //   op->xbee1.msgOut        = xbeeRelay.counterX1out;
 //   op->xbee1.msgIn         = xbeeRelay.counterX2in;
 //   op->xbee2.msgOut        = xbeeRelay.counterX2out;
//    if (counter++ % 10 == 0) {                               // Do every 1 second
//        op->xbee1.rateOut   = xbeeRelay.bytesX1out / 1000.0;   // Measure data rate in KB/s
//        op->xbee2.rateOut   = xbeeRelay.bytesX2out / 1000.0;   
//        xbeeRelay.bytesX1out = 0;                            // Clear every second
 //       xbeeRelay.bytesX2out = 0;
 //   }
    
    // CATCH ERRORS
    if (op->glvBat.error)                                   op->faultCode |= GLVBAT_FAULT;
    if (op->dcdc.status & (OVER_CURRENT | SENSOR_FAULT))    op->faultCode |= DCDC_FAULT;
    if (op->internalTemp > param->internalOverTemp)         op->faultCode |= INT_OVER_TEMP;
    if (op->latch.ams & HARD_FAULT)                         op->faultCode |= AMS_LATCH;
    if (op->latch.imd & HARD_FAULT)                         op->faultCode |= IMD_LATCH;
    if (op->imd.error)                                      op->faultCode |= IMD_FAULT;
    
    if (FreezeFrame::getError())                          ;//  op->faultCode |= FREEZE_FRAME;
    else                                                    op->faultCode &= ~FREEZE_FRAME;
    
    // UPDATE MODE
    if (op->faultCode) op->mode = FAULT;
    else op->mode = OKAY;
    
    // ARREST ERROR
    if (op->mode == FAULT) {
        if (!FreezeFrame::getError()) {         // Write freeze frame is slot available
            if (FreezeFrame::writeFrame()) {
                op->faultCode |= FREEZE_FRAME;
            } 
        }   
    }

    // Update DC-DC converter
    if ((op->signals & SHUTDOWN_CLOSED) && (op->signals & AIRS_CLOSED) && !(op->signals & CHARGER_DET) && (op->mode == OKAY)) {
        dcdc.set(1);
    } else dcdc.set(0);

    // Update PWM channels
    dcdc.setPwm(PUMP1, op->dcdc.request.pump1);
    dcdc.setPwm(PUMP2, op->dcdc.request.pump2);
    dcdc.setPwm(FAN1,  op->dcdc.request.fan1);
    dcdc.setPwm(FAN2,  op->dcdc.request.fan2);
}
void runTime::clearFaults() {
    op->faultCode = 0;
    op->mode = OKAY;
    FreezeFrame::clearError();
}
void runTime::thread_sample(void const* args)
{
    glvBat.sample();    // Integrate next sample in GLV Battery coulomb counter
    dcdc.sample();      // Handle dc-dc filter and errors
    osSignalSet((osThreadId)(tempData.wdtThreadId), 1<<1);      // Signal watchdog thread
}