System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
runTime/runTime.cpp@39:ddf38df9699e, 2015-02-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |