System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers runTime.cpp Source File

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 }