System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Committer:
pspatel321
Date:
Wed Feb 11 23:09:57 2015 +0000
Revision:
39:ddf38df9699e
Parent:
38:8efacce315ae
Updated CAN IDs for datalogging.  Changed profile encoding.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pspatel321 30:91af74a299e1 1 #include "runTime.h"
pspatel321 30:91af74a299e1 2
pspatel321 36:0afc0fc8f86b 3 void runTime::gather(void const* args)
pspatel321 36:0afc0fc8f86b 4 {
pspatel321 38:8efacce315ae 5 static int counter = 0;
pspatel321 38:8efacce315ae 6
pspatel321 38:8efacce315ae 7 // POPULATE DATA
pspatel321 38:8efacce315ae 8 op->SysTime = time(0); // Tick time
pspatel321 38:8efacce315ae 9
pspatel321 38:8efacce315ae 10 // GLV Battery
pspatel321 38:8efacce315ae 11 op->glvBat.current = glvBat.current();
pspatel321 38:8efacce315ae 12 op->glvBat.SOC = glvBat.SOC();
pspatel321 38:8efacce315ae 13 op->glvBat.Ah = glvBat.ampHours();
pspatel321 38:8efacce315ae 14 op->glvBat.capacity = glvBat.capacity();
pspatel321 38:8efacce315ae 15 op->glvBat.error = glvBat.readError();
pspatel321 36:0afc0fc8f86b 16
pspatel321 36:0afc0fc8f86b 17 // DC-DC converter & PWM channels
pspatel321 38:8efacce315ae 18 op->dcdc.status = dcdc.getStatus();
pspatel321 38:8efacce315ae 19 op->dcdc.current = dcdc.getCurrent();
pspatel321 38:8efacce315ae 20 op->dcdc.actual.pump1 = dcdc.readPwm(PUMP1);
pspatel321 38:8efacce315ae 21 op->dcdc.actual.pump2 = dcdc.readPwm(PUMP2);
pspatel321 38:8efacce315ae 22 op->dcdc.actual.fan1 = dcdc.readPwm(FAN1);
pspatel321 38:8efacce315ae 23 op->dcdc.actual.fan2 = dcdc.readPwm(FAN2);
pspatel321 30:91af74a299e1 24
pspatel321 36:0afc0fc8f86b 25 // IMD PWM
pspatel321 38:8efacce315ae 26 op->imd.status = imd.status();
pspatel321 38:8efacce315ae 27 op->imd.resistance = imd.resistance();
pspatel321 38:8efacce315ae 28 static bool started=false;
pspatel321 38:8efacce315ae 29 if (counter > 30) started=true; // Give the IMD 3 seconds to turn on
pspatel321 38:8efacce315ae 30 if (started) {
pspatel321 38:8efacce315ae 31 op->imd.error = ((op->imd.status != NORMAL) && (op->imd.status != SPEEDSTART)) || (isnan(op->imd.resistance));
pspatel321 38:8efacce315ae 32 } else op->imd.error = 0;
pspatel321 38:8efacce315ae 33
pspatel321 36:0afc0fc8f86b 34 // Reset latches
pspatel321 38:8efacce315ae 35 op->latch.ams = AMSlatch.update();
pspatel321 38:8efacce315ae 36 op->latch.imd = IMDlatch.update();
pspatel321 36:0afc0fc8f86b 37
pspatel321 36:0afc0fc8f86b 38 // Switches
pspatel321 38:8efacce315ae 39 op->switchState = switches.poll();
pspatel321 38:8efacce315ae 40 if (op->switchState == 0) op->signals |= SHUTDOWN_CLOSED;
pspatel321 38:8efacce315ae 41 else op->signals &= ~SHUTDOWN_CLOSED;
pspatel321 36:0afc0fc8f86b 42
pspatel321 36:0afc0fc8f86b 43 // Temperaure
pspatel321 38:8efacce315ae 44 op->internalTemp = internalTmp.read();
pspatel321 36:0afc0fc8f86b 45
pspatel321 38:8efacce315ae 46 // Telemetry trackers
pspatel321 39:ddf38df9699e 47 // op->xbee1.msgIn = xbeeRelay.counterX1in;
pspatel321 39:ddf38df9699e 48 // op->xbee1.msgOut = xbeeRelay.counterX1out;
pspatel321 39:ddf38df9699e 49 // op->xbee1.msgIn = xbeeRelay.counterX2in;
pspatel321 39:ddf38df9699e 50 // op->xbee2.msgOut = xbeeRelay.counterX2out;
pspatel321 39:ddf38df9699e 51 // if (counter++ % 10 == 0) { // Do every 1 second
pspatel321 39:ddf38df9699e 52 // op->xbee1.rateOut = xbeeRelay.bytesX1out / 1000.0; // Measure data rate in KB/s
pspatel321 39:ddf38df9699e 53 // op->xbee2.rateOut = xbeeRelay.bytesX2out / 1000.0;
pspatel321 39:ddf38df9699e 54 // xbeeRelay.bytesX1out = 0; // Clear every second
pspatel321 39:ddf38df9699e 55 // xbeeRelay.bytesX2out = 0;
pspatel321 39:ddf38df9699e 56 // }
pspatel321 38:8efacce315ae 57
pspatel321 38:8efacce315ae 58 // CATCH ERRORS
pspatel321 38:8efacce315ae 59 if (op->glvBat.error) op->faultCode |= GLVBAT_FAULT;
pspatel321 38:8efacce315ae 60 if (op->dcdc.status & (OVER_CURRENT | SENSOR_FAULT)) op->faultCode |= DCDC_FAULT;
pspatel321 38:8efacce315ae 61 if (op->internalTemp > param->internalOverTemp) op->faultCode |= INT_OVER_TEMP;
pspatel321 38:8efacce315ae 62 if (op->latch.ams & HARD_FAULT) op->faultCode |= AMS_LATCH;
pspatel321 38:8efacce315ae 63 if (op->latch.imd & HARD_FAULT) op->faultCode |= IMD_LATCH;
pspatel321 38:8efacce315ae 64 if (op->imd.error) op->faultCode |= IMD_FAULT;
pspatel321 38:8efacce315ae 65
pspatel321 39:ddf38df9699e 66 if (FreezeFrame::getError()) ;// op->faultCode |= FREEZE_FRAME;
pspatel321 38:8efacce315ae 67 else op->faultCode &= ~FREEZE_FRAME;
pspatel321 38:8efacce315ae 68
pspatel321 38:8efacce315ae 69 // UPDATE MODE
pspatel321 38:8efacce315ae 70 if (op->faultCode) op->mode = FAULT;
pspatel321 38:8efacce315ae 71 else op->mode = OKAY;
pspatel321 38:8efacce315ae 72
pspatel321 38:8efacce315ae 73 // ARREST ERROR
pspatel321 38:8efacce315ae 74 if (op->mode == FAULT) {
pspatel321 38:8efacce315ae 75 if (!FreezeFrame::getError()) { // Write freeze frame is slot available
pspatel321 38:8efacce315ae 76 if (FreezeFrame::writeFrame()) {
pspatel321 38:8efacce315ae 77 op->faultCode |= FREEZE_FRAME;
pspatel321 38:8efacce315ae 78 }
pspatel321 38:8efacce315ae 79 }
pspatel321 38:8efacce315ae 80 }
pspatel321 38:8efacce315ae 81
pspatel321 38:8efacce315ae 82 // Update DC-DC converter
pspatel321 38:8efacce315ae 83 if ((op->signals & SHUTDOWN_CLOSED) && (op->signals & AIRS_CLOSED) && !(op->signals & CHARGER_DET) && (op->mode == OKAY)) {
pspatel321 38:8efacce315ae 84 dcdc.set(1);
pspatel321 38:8efacce315ae 85 } else dcdc.set(0);
pspatel321 38:8efacce315ae 86
pspatel321 38:8efacce315ae 87 // Update PWM channels
pspatel321 38:8efacce315ae 88 dcdc.setPwm(PUMP1, op->dcdc.request.pump1);
pspatel321 38:8efacce315ae 89 dcdc.setPwm(PUMP2, op->dcdc.request.pump2);
pspatel321 38:8efacce315ae 90 dcdc.setPwm(FAN1, op->dcdc.request.fan1);
pspatel321 38:8efacce315ae 91 dcdc.setPwm(FAN2, op->dcdc.request.fan2);
pspatel321 30:91af74a299e1 92 }
pspatel321 38:8efacce315ae 93 void runTime::clearFaults() {
pspatel321 38:8efacce315ae 94 op->faultCode = 0;
pspatel321 38:8efacce315ae 95 op->mode = OKAY;
pspatel321 38:8efacce315ae 96 FreezeFrame::clearError();
pspatel321 38:8efacce315ae 97 }
pspatel321 36:0afc0fc8f86b 98 void runTime::thread_sample(void const* args)
pspatel321 36:0afc0fc8f86b 99 {
pspatel321 33:6bc82b6b62e5 100 glvBat.sample(); // Integrate next sample in GLV Battery coulomb counter
pspatel321 33:6bc82b6b62e5 101 dcdc.sample(); // Handle dc-dc filter and errors
pspatel321 38:8efacce315ae 102 osSignalSet((osThreadId)(tempData.wdtThreadId), 1<<1); // Signal watchdog thread
pspatel321 30:91af74a299e1 103 }