System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
runTime.cpp
00001 #include "runTime.h" 00002 00003 void runTime::gather(void const* args) 00004 { 00005 static int counter = 0; 00006 00007 // POPULATE DATA 00008 op->SysTime = time(0); // Tick time 00009 00010 // GLV Battery 00011 op->glvBat.current = glvBat.current(); 00012 op->glvBat.SOC = glvBat.SOC(); 00013 op->glvBat.Ah = glvBat.ampHours(); 00014 op->glvBat.capacity = glvBat.capacity(); 00015 op->glvBat.error = glvBat.readError(); 00016 00017 // DC-DC converter & PWM channels 00018 op->dcdc.status = dcdc.getStatus(); 00019 op->dcdc.current = dcdc.getCurrent(); 00020 op->dcdc.actual.pump1 = dcdc.readPwm(PUMP1); 00021 op->dcdc.actual.pump2 = dcdc.readPwm(PUMP2); 00022 op->dcdc.actual.fan1 = dcdc.readPwm(FAN1); 00023 op->dcdc.actual.fan2 = dcdc.readPwm(FAN2); 00024 00025 // IMD PWM 00026 op->imd.status = imd.status(); 00027 op->imd.resistance = imd.resistance(); 00028 static bool started=false; 00029 if (counter > 30) started=true; // Give the IMD 3 seconds to turn on 00030 if (started) { 00031 op->imd.error = ((op->imd.status != NORMAL) && (op->imd.status != SPEEDSTART)) || (isnan(op->imd.resistance)); 00032 } else op->imd.error = 0; 00033 00034 // Reset latches 00035 op->latch.ams = AMSlatch.update(); 00036 op->latch.imd = IMDlatch.update(); 00037 00038 // Switches 00039 op->switchState = switches.poll(); 00040 if (op->switchState == 0) op->signals |= SHUTDOWN_CLOSED; 00041 else op->signals &= ~SHUTDOWN_CLOSED; 00042 00043 // Temperaure 00044 op->internalTemp = internalTmp.read(); 00045 00046 // Telemetry trackers 00047 // op->xbee1.msgIn = xbeeRelay.counterX1in; 00048 // op->xbee1.msgOut = xbeeRelay.counterX1out; 00049 // op->xbee1.msgIn = xbeeRelay.counterX2in; 00050 // op->xbee2.msgOut = xbeeRelay.counterX2out; 00051 // if (counter++ % 10 == 0) { // Do every 1 second 00052 // op->xbee1.rateOut = xbeeRelay.bytesX1out / 1000.0; // Measure data rate in KB/s 00053 // op->xbee2.rateOut = xbeeRelay.bytesX2out / 1000.0; 00054 // xbeeRelay.bytesX1out = 0; // Clear every second 00055 // xbeeRelay.bytesX2out = 0; 00056 // } 00057 00058 // CATCH ERRORS 00059 if (op->glvBat.error) op->faultCode |= GLVBAT_FAULT; 00060 if (op->dcdc.status & (OVER_CURRENT | SENSOR_FAULT)) op->faultCode |= DCDC_FAULT; 00061 if (op->internalTemp > param->internalOverTemp) op->faultCode |= INT_OVER_TEMP; 00062 if (op->latch.ams & HARD_FAULT) op->faultCode |= AMS_LATCH; 00063 if (op->latch.imd & HARD_FAULT) op->faultCode |= IMD_LATCH; 00064 if (op->imd.error) op->faultCode |= IMD_FAULT; 00065 00066 if (FreezeFrame::getError()) ;// op->faultCode |= FREEZE_FRAME; 00067 else op->faultCode &= ~FREEZE_FRAME; 00068 00069 // UPDATE MODE 00070 if (op->faultCode) op->mode = FAULT; 00071 else op->mode = OKAY; 00072 00073 // ARREST ERROR 00074 if (op->mode == FAULT) { 00075 if (!FreezeFrame::getError()) { // Write freeze frame is slot available 00076 if (FreezeFrame::writeFrame()) { 00077 op->faultCode |= FREEZE_FRAME; 00078 } 00079 } 00080 } 00081 00082 // Update DC-DC converter 00083 if ((op->signals & SHUTDOWN_CLOSED) && (op->signals & AIRS_CLOSED) && !(op->signals & CHARGER_DET) && (op->mode == OKAY)) { 00084 dcdc.set(1); 00085 } else dcdc.set(0); 00086 00087 // Update PWM channels 00088 dcdc.setPwm(PUMP1, op->dcdc.request.pump1); 00089 dcdc.setPwm(PUMP2, op->dcdc.request.pump2); 00090 dcdc.setPwm(FAN1, op->dcdc.request.fan1); 00091 dcdc.setPwm(FAN2, op->dcdc.request.fan2); 00092 } 00093 void runTime::clearFaults() { 00094 op->faultCode = 0; 00095 op->mode = OKAY; 00096 FreezeFrame::clearError(); 00097 } 00098 void runTime::thread_sample(void const* args) 00099 { 00100 glvBat.sample(); // Integrate next sample in GLV Battery coulomb counter 00101 dcdc.sample(); // Handle dc-dc filter and errors 00102 osSignalSet((osThreadId)(tempData.wdtThreadId), 1<<1); // Signal watchdog thread 00103 }
Generated on Fri Jul 15 2022 06:07:18 by
1.7.2
