System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
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
}
