System Management code

Dependencies:   mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP

Fork of SystemManagement by Martin Deng

Files at this revision

API Documentation at this revision

Comitter:
pspatel321
Date:
Sat Oct 25 03:28:55 2014 +0000
Parent:
16:a72ffe7d879d
Child:
18:915a235bc099
Commit message:
Parth's edits for 10/24/14, items remaining: DC-DC, XBee, reading AMS/IMD error, main code

Changed in this revision

CoulombCounter/CoulombCounter.cpp Show annotated file Show diff for this revision Revisions of this file
CoulombCounter/CoulombCounter.h Show annotated file Show diff for this revision Revisions of this file
CoulombCounter/RTCStore.h Show annotated file Show diff for this revision Revisions of this file
DC_DC/DC_DC.cpp Show annotated file Show diff for this revision Revisions of this file
FanPump/FanPump.cpp Show annotated file Show diff for this revision Revisions of this file
FanPump/FanPump.h Show annotated file Show diff for this revision Revisions of this file
IMD/IMD.cpp Show annotated file Show diff for this revision Revisions of this file
IMD/IMD.h Show annotated file Show diff for this revision Revisions of this file
PollSwitch/PollSwitch.cpp Show annotated file Show diff for this revision Revisions of this file
PollSwitch/PollSwitch.h Show annotated file Show diff for this revision Revisions of this file
SysMngmt.cpp Show annotated file Show diff for this revision Revisions of this file
TemperatureRead/TemperatureRead.cpp Show annotated file Show diff for this revision Revisions of this file
TemperatureRead/TemperatureRead.h Show annotated file Show diff for this revision Revisions of this file
Temperature_Read/TemperatureRead.h Show diff for this revision Revisions of this file
--- a/CoulombCounter/CoulombCounter.cpp	Fri Oct 24 22:38:20 2014 +0000
+++ b/CoulombCounter/CoulombCounter.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -2,10 +2,10 @@
 
 const float MSEC_HRS = 2.77778e-7;                          // Multiplier to convert milliseconds to hours
 const float BAT_ISENSE_MULTIPLIER = 6.2299;                 // Multiplier to convert float to amps
-const float BAT_ISENSE_OFFSET = 0.5*BAT_ISENSE_MULTIPLIER;  // Offset to convert float to amps
+const float BAT_ISENSE_OFFSET = -0.5*BAT_ISENSE_MULTIPLIER; // Offset to convert float to amps
 const float BAT_ISENSE_LIMS = 3.0;                          // Over-current limit = +/- 3A
 
-CoulombCounter::CoulombCounter(PinName _IsensePin, int mSec, int _rtcGPREG_counter, int _rtcGPREG_capacity) : BatISense(p19) {
+CoulombCounter::CoulombCounter(int _mSec, int _rtcGPREG_counter, int _rtcGPREG_capacity) : BatISense(p19) {
     mSec = _mSec;
     rtcGPREG_counter = _rtcGPREG_counter;
     rtcGPREG_capacity = _rtcGPREG_capacity;
@@ -19,15 +19,16 @@
     sampler.attach_us(this, &CoulombCounter::sample, mSec*1000);
 }
 
-void CouloumbCounter::sample() {
+void CoulombCounter::sample() {
     // Take the reading
     currentSample = BatISense.read()*BAT_ISENSE_MULTIPLIER+BAT_ISENSE_OFFSET;
     
     // Signal error on over current
-    if (currentSample < -BAT_ISENSE_LIMS || currentSample > BAT_ISENSE_LIMS) {
+    if (abs(currentSample) > BAT_ISENSE_LIMS) {
         overCurrent = true;
     } else overCurrent = false;
     
     // Integrate
-    store.write(ampHours()+currentSample*mSec*MSEC_HRS, rtcGPREG_counter);
+    float f = ampHours()+currentSample*mSec*MSEC_HRS;
+    store.write(f, rtcGPREG_counter);
 }
\ No newline at end of file
--- a/CoulombCounter/CoulombCounter.h	Fri Oct 24 22:38:20 2014 +0000
+++ b/CoulombCounter/CoulombCounter.h	Sat Oct 25 03:28:55 2014 +0000
@@ -3,7 +3,7 @@
 
 #include "mbed.h"
 #include "CANBuffer.h"
-#include "Store_RTC.h"
+#include "RTCStore.h"
 
 RTCStore store;
 
@@ -31,11 +31,11 @@
 private:
     Ticker sampler;         // Used to capture next sample and coulomb count
     void sample();
-    int mSec;
-    float currentSample;
     
-    int rtcGPREG_counter;
-    int rtcGPREG_capacity;
+    volatile int mSec;
+    volatile float currentSample;
+    volatile int rtcGPREG_counter;
+    volatile int rtcGPREG_capacity;
     AnalogIn BatISense;     // Analog input pin
 };
 #endif
\ No newline at end of file
--- a/CoulombCounter/RTCStore.h	Fri Oct 24 22:38:20 2014 +0000
+++ b/CoulombCounter/RTCStore.h	Sat Oct 25 03:28:55 2014 +0000
@@ -16,7 +16,7 @@
         //battery.write(10.92,4);
         printf("LPC_RTC->GPREG4:%f\n\r",battery.read(4));
     }
-*/        
+*/
 
 #ifndef _RTC_STORE_H
 #define _RTC_STORE_H
@@ -28,10 +28,10 @@
         LPC_SC->PCONP |= (1<<9);        // Enable RTC Peripheral
     }
     void write(float data, int block) {
-        *((float*)(&LPC_RTC->GPREG0)+sizeof(float)*block) = data;
+        *((float*)(&LPC_RTC->GPREG0)+block) = data;
     }
     float read(int block) {
-        return *((float*)((&LPC_RTC->GPREG0)+sizeof(float)*block));
+        return *((float*)(&LPC_RTC->GPREG0)+block);
     }              
 };
 #endif
--- a/DC_DC/DC_DC.cpp	Fri Oct 24 22:38:20 2014 +0000
+++ b/DC_DC/DC_DC.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -18,13 +18,13 @@
     return status;
 }
 
-void DC::set(bool s){
+void DC::set(bool s){/*
     status = s;
     if(!status){
         fanPump->shutdown_all();    
     }
     
-    dc_pin = !status;
+    dc_pin = !status;*/
 }
 
 void update_dcdc(const void *arg){
--- a/FanPump/FanPump.cpp	Fri Oct 24 22:38:20 2014 +0000
+++ b/FanPump/FanPump.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -1,56 +1,81 @@
 #include "FanPump.h"
 
-static FanPump* instance[6] = { NULL };
+static FanPump* instance[6] = { NULL };         // Access pwm object by channel#
+const int PCLK = 24e6;          // 24Mhz clock
 
 // Interrupt handler, must be called from static context, calls all the slew functions
 void pwmIRQ() {
+    int sum = 0;
+    int items = 0;
     if (LPC_PWM1->IR & 1) {
         for (int i = 0; i < 6; i++) {
-            if (instance[i] != NULL) instance[i]->slew();   
+            if (instance[i] != NULL) {
+                items++;
+                sum += instance[i]->slew();
+            }
         }
     }
-    LPC_PWM1->IR = 0x73F;   // Clear interrupts
+    LPC_PWM1->IR = 0x73F;                 // Clear interrupts
+    if (items == sum) LPC_PWM1->MCR = 0;  // Detach all the interrupts, every pin is already where it needs to be
 }
 
 // Called on each timer expire for each pwm object
-void FanPump::slew() {
-    uint32_t currPulseT = *(&LPC_PWM1->MR0+pin);
-    uint32_t currPulse_us = currPulseT / 24;
-    uint32_t setPointT = setPoint_us * 24;      // Convert us into ticks
-    if (currPulseT == setPointT) return;        // Nothing to slew here, already at its setpoint
-
+int FanPump::slew() {
+    uint32_t currPulseT = *((uint32_t*)(&LPC_PWM1->MR0)+chan);    // Get the current pulsewidth ticks
+    uint32_t setPointT = setPoint_us * (PCLK/1e6);   // Convert us into ticks
+    if (currPulseT == setPointT) return 1;           // Nothing to slew here, already at its setpoint
+    
+    uint32_t currPulse_us = currPulseT / (PCLK/1e6);        // Convert to us
     if (currPulseT < setPointT) {
-        if (setPoint_us - currPulse_us < maxChange_us) pwm.pulsewidth_us(setPoint_us); // Close to the setpoint, write it directly
+        if (setPoint_us - currPulse_us <= maxChange_us) pwm.pulsewidth_us(setPoint_us);  // Close to the setpoint, write it directly
         else pwm.pulsewidth_us(currPulse_us + maxChange_us);       
     } else {
-        if (currPulse_us - setPoint_us < maxChange_us) pwm.pulsewidth_us(setPoint_us);
+        if (currPulse_us - setPoint_us <= maxChange_us) pwm.pulsewidth_us(setPoint_us);  // Close to the setpoint, write it directly
         else pwm.pulsewidth_us(currPulse_us - maxChange_us);
     }
+    return 0;
 }
 
 FanPump::FanPump(PinName pin, float period, float slew) : pwm(pin) {
+    
+    // Match the pin# to the PWM object for the interrupt
+    int chan=0;
+    if (pin == p26 || pin == LED1) chan = 1;
+    if (pin == p25 || pin == LED2) chan = 2;
+    if (pin == p24 || pin == LED3) chan = 3;
+    if (pin == p23 || pin == LED4) chan = 4;
+    if (pin == p22)                chan = 5;
+    if (pin == p21)                chan = 6;
+    if (chan == 0) return;     // Invalid pin
+    instance[chan-1] = this;
+    
     setPoint_us = 0;
     period_us = period / 1.0e6;
     pwm.period_us(period_us);
     maxChange_us = (period / slew) * period_us;
-    
-    // Match the pin# to the PWM object for the interrupt
-    if (pin == p26 || pin == LED1) pin = 1;
-    if (pin == p25 || pin == LED2) pin = 2;
-    if (pin == p24 || pin == LED3) pin = 3;
-    if (pin == p23 || pin == LED4) pin = 4;
-    if (pin == p22)                pin = 5;
-    if (pin == p21)                pin = 6;
-    instance[pin-1] = this;
-    
-    LPC_PWM1->IR = 0x73F;   // Clear interrupts
+        
+    LPC_PWM1->IR = 0x73F;    // Clear interrupts
     NVIC_SetVector(PWM1_IRQn, (uint32_t)&pwmIRQ);
     NVIC_SetPriority(PWM1_IRQn, 0);
     NVIC_EnableIRQ(PWM1_IRQn);
-    LPC_PWM1->MR |= 1;  // Enable interrupt on MR0 (when the pwm period expires)
+    LPC_PWM1->MCR = 1;       // Enable interrupt on MR0 (when the pwm period expires)
 }
 void FanPump::write(float duty) {
     if (duty < 0) duty = 0;
     if (duty > 1) duty = 1;
     setPoint_us = duty * period_us;
+    LPC_PWM1->MCR = 1;       // Enable interrupt on MR0 (when the pwm period expires)
+}
+void FanPump::directOff() {
+    __disable_irq();
+    pwm.pulsewidth_us(0);
+    setPoint_us = 0;
+    __enable_irq();
+}
+float FanPump::read() {
+    return (float)(setPoint_us)/(float)(period_us);
+}
+float FanPump::readRaw() {
+    uint32_t currPulseT = *((uint32_t*)(&LPC_PWM1->MR0)+chan);    // Get the current pulsewidth ticks
+    return ((float)(currPulseT) / (float)(PCLK/1e6)) / (float)(period_us);
 }
\ No newline at end of file
--- a/FanPump/FanPump.h	Fri Oct 24 22:38:20 2014 +0000
+++ b/FanPump/FanPump.h	Sat Oct 25 03:28:55 2014 +0000
@@ -11,13 +11,13 @@
     void write(float duty);
     float read();       // Read the last setpoint
     float readRaw();    // Read the raw current duty (may be mid-transition)
-    
-    void slew();        // Slew rate callback function
+    void directOff();   // Turn off the channel immediately (no slew)
+    int slew();         // Slew rate callback function
 private:
     PwmOut pwm;         // mbed PWM out
-    int pin;            // pwm channel#
-    static uint32_t period_us; // Period in microseconds (shared by all channels)
-    uint32_t setPoint_us;
-    uint32_t maxChange_us;     // Max pulsewidth change allowed to achieve the slew rate
+    volatile int chan;                  // pwm channel#
+    static uint32_t period_us;          // Period in microseconds (shared by all channels)
+    volatile uint32_t setPoint_us;
+    volatile uint32_t maxChange_us;     // Max pulsewidth change allowed to achieve the slew rate
 };
 #endif
\ No newline at end of file
--- a/IMD/IMD.cpp	Fri Oct 24 22:38:20 2014 +0000
+++ b/IMD/IMD.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -6,10 +6,9 @@
 const uint32_t PCLK = 24000000;     // Timer counting clock = 24Mhz
 const uint32_t TIMEOUT_TICKS = PCLK*ZERO_HZ_TIMEOUT;    // Zeroing timeout in clock ticks = seconds * PCLK
 const float EXTRA = 0.01;           // Margin on the IMD PWM limits
-const float ULIM = 50000000;        // Max value produced by IMD
 
 // Interrupt function, must be static context
-void TIM0_IRQ() {
+void tim0_IRQ() {
     // Capture event was found
     if (LPC_TIM0->IR & 1<<4) instance->edgeIRQ();
     
@@ -25,11 +24,11 @@
     widthTicks = 0;                 // Zero low, so that duty = 0/1 = 0%
     periodTicks = 1;
     
-    LPC_SC->PCONP |= (1<<2);        // Power on timer1
-    LPC_SC->PCLKSEL0 &= ~(3<<4);    // Clock at 24MHz
+    LPC_SC->PCONP |= (1<<1);        // Power on timer0
+    LPC_SC->PCLKSEL0 &= ~(3<<2);    // Clock at 24MHz
     
-    *(p1_26.pinsel_addr) |= 3 << p1_26.selmode_num;     // Set pin as capture pin
-    *(p1_26.pinmode_addr) |= (3 << p1_26.selmode_num);  // Pull down
+    *(p1_26.pinsel_addr)  |= 3 << p1_26.selmode_num;     // Set pin as capture pin
+    *(p1_26.pinmode_addr) |= 3 << p1_26.selmode_num;     // Pull down
     
     LPC_TIM0->TCR=2;       // Stop counter and hold at 0, for configuration, set to 1 to start operation
     LPC_TIM0->IR=0x3F;     // Clear any interrupt flags
@@ -37,9 +36,9 @@
     LPC_TIM0->PR=0;        // No prescale value, clock at full pclk=24Mhz
     LPC_TIM0->EMR=0;       // Do not use external match pins
     
-    NVIC_SetVector(TIMER1_IRQn, (uint32_t)&TIM0_IRQ);   // Point to the edge interrupt handler
-    NVIC_SetPrioriry(TIMER1_IRQn, 0);                   // Highest Priority
-    NVIC_EnableIRQ(TIMER1_IRQn);                        // Enable IRQ
+    NVIC_SetVector(TIMER0_IRQn, (uint32_t)&tim0_IRQ);   // Point to the interrupt handler
+    NVIC_SetPriority(TIMER0_IRQn, 0);                   // Highest Priority
+    NVIC_EnableIRQ(TIMER0_IRQn);                        // Enable IRQ
     LPC_TIM0->CCR = RISING;          // Generate interrupt on capture, capture on rising edge to start
     LPC_TIM0->MCR = 1;               // Interrupt on Match0 to establish the zero speed timeout
     LPC_TIM0->MR0 = LPC_TIM0->TC+TIMEOUT_TICKS;
@@ -47,7 +46,7 @@
 }
 
 void IMD::edgeIRQ() {
-    enum EdgeT type = LPC_TIM0->CCR;
+    uint32_t type = LPC_TIM0->CCR;
     uint32_t capTime = LPC_TIM0->CR0;
     LPC_TIM0->MR0 = capTime+TIMEOUT_TICKS;        // Set the next zeroing timeout
     
@@ -66,12 +65,12 @@
     }
     
     // Switch interrupt types to capture the next edge
-    if (type == RISING)  LPC_TIM0->CCR = FALIING;
+    if (type == RISING)  LPC_TIM0->CCR = FALLING;
     if (type == FALLING) LPC_TIM0->CCR = RISING;
 }
 
 void IMD::zeroIRQ() {
-    enum EdgeT type = LPC_TIM0->CCR;
+    uint32_t type = LPC_TIM0->CCR;
     periodTicks = 1;
     first = true;
     
@@ -94,23 +93,23 @@
 
 char IMD::status() {
     float freq = frequency();
-    if (freq == 0)                      return 0;   // IMD off
-    else if (05 < freq && freq <= 15)   return 1;   // 10Hz normal mode
-    else if (15 < freq && freq <= 25)   return 2;   // 20Hz undervoltage mode
-    else if (25 < freq && freq <= 35)   return 3;   // 30Hz speed start mode
-    else if (45 < freq && freq <= 55)   return 4;   // 40Hz IMD error
-    else if (55 < freq && freq <= 65)   return 5;   // 50Hz Ground error
-    else return -1;                                 // Invalid
+    if (freq == 0)                      return OFF;         // IMD off
+    else if (05 < freq && freq <= 15)   return NORMAL;      // 10Hz normal mode
+    else if (15 < freq && freq <= 25)   return UNDERVOLT;   // 20Hz undervoltage mode
+    else if (25 < freq && freq <= 35)   return SPEEDSTART;  // 30Hz speed start mode
+    else if (45 < freq && freq <= 55)   return ERROR;       // 40Hz IMD error
+    else if (55 < freq && freq <= 65)   return GROUNDERR;   // 50Hz Ground error
+    else return INVALID;                                    // Invalid
 }
 
 float IMD::resistance() {
-    char status = status();
-    float duty = duty();
+    char stat = status();
+    float dut = duty();
     
     // In normal or undervoltage mode, where Rf is available
-    if (status == 1 || status == 2) {
-        if (0.05-EXTRA <= duty && duty >= 0.95+EXTRA) {
-            float rf = (0.9*1200e3/(duty-0.05)) - 1200e3;
+    if (stat == 1 || stat == 2) {
+        if (0.05-EXTRA <= dut && dut >= 0.95+EXTRA) {
+            float rf = (0.9*1200e3/(dut-0.05)) - 1200e3;
             if (rf < 0) rf = 0;
             if (rf > 50e6) rf = 50e6;
             return rf;
@@ -118,10 +117,10 @@
         else return -1;
     }
     // In speed start, where only good/bad estimate is available
-    if (status == 3) {
-        if (0.05-EXTRA <= duty && duty >= 0.10+EXTRA)       return 50e6;        // Good
-        else if (0.90-EXTRA <= duty && duty >= 0.95+EXTRA)  return 0;           // Bad
+    if (stat == 3) {
+        if (0.05-EXTRA <= dut && dut >= 0.10+EXTRA)       return 50e6;        // Good
+        else if (0.90-EXTRA <= dut && dut >= 0.95+EXTRA)  return 0;           // Bad
         else return -1;
     }
-    return NaN;
+    return NAN;     // Measurement not available in this mode
 }
\ No newline at end of file
--- a/IMD/IMD.h	Fri Oct 24 22:38:20 2014 +0000
+++ b/IMD/IMD.h	Sat Oct 25 03:28:55 2014 +0000
@@ -13,22 +13,22 @@
     FALLING=6,
     BOTH=7,  
 };
+
+enum IMDstatus  {
+    OFF=0,
+    NORMAL=1,
+    UNDERVOLT=2,
+    SPEEDSTART=3,
+    ERROR=4,
+    GROUNDERR=5,
+    INVALID=6,  
+};
+
 class IMD{
 public:
     IMD();
     
-    // Get the IMD status
-    /*
-    Status      State
-    0           IMD off
-    1           Normal
-    2           under voltage
-    3           Speed Start
-    4           IMD error
-    5           Ground error
-    */
     char status();
-    
     // Gets the insulation resistance reading
     // Returns 0 to 50,000,000 in normal/UV modes
     // Returns 0 or 50,000,000 in speed start (good/bad only)
@@ -44,10 +44,10 @@
 private:
     float frequency();
     float duty();
-    uint32_t startTime;
-    uint32_t widthTicks;
-    uint32_t periodTicks;
-    bool first;
+    volatile uint32_t startTime;
+    volatile uint32_t widthTicks;
+    volatile uint32_t periodTicks;
+    volatile bool first;
 };
 
 #endif
\ No newline at end of file
--- a/PollSwitch/PollSwitch.cpp	Fri Oct 24 22:38:20 2014 +0000
+++ b/PollSwitch/PollSwitch.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -1,64 +1,33 @@
 #include "PollSwitch.h"
 
-LPC_pin PollPin[12]={p1_0, p1_1, p1_4, p1_8, p1_9, p1_10, p1_14, p1_15, p1_16, p1_17, p1_27, p1_28};
-LPCDigitalOut poll[12]={    LPCDigitalIn(PollPin[0], PullDown),
-                            LPCDigitalIn(PollPin[1], PullDown), 
-                            LPCDigitalOut(PollPin[2]),
-                            LPCDigitalOut(PollPin[3]),
-                            LPCDigitalOut(PollPin[4]),
-                            LPCDigitalOut(PollPin[5]),
-                            LPCDigitalOut(PollPin[6]),
-                            LPCDigitalOut(PollPin[7]),
-                            LPCDigitalOut(PollPin[8]),
-                            LPCDigitalOut(PollPin[9]),
-                            LPCDigitalOut(PollPin[10]),
-                            LPCDigitalOut(PollPin[11])};
- 
-CANBuffer *tx_Poll_Buffer;
+LPCDigitalIn sw[]={     LPCDigitalIn(p1_0, PullDown),
+                        LPCDigitalIn(p1_1, PullDown), 
+                        LPCDigitalIn(p1_4, PullDown),
+                        LPCDigitalIn(p1_8, PullDown),
+                        LPCDigitalIn(p1_9, PullDown),
+                        LPCDigitalIn(p1_10, PullDown),
+                        LPCDigitalIn(p1_14, PullDown),
+                        LPCDigitalIn(p1_15, PullDown),
+                        LPCDigitalIn(p1_16, PullDown),
+                        LPCDigitalIn(p1_17, PullDown),
+                        LPCDigitalIn(p1_27, PullDown),
+                        LPCDigitalIn(p1_28, PullDown)
+                    };
 
-union int_to_char {
-    char ch[2];
-    uint16_t i;                       
-} converter;
-                       
-PollSwitch::PollSwitch(CANBuffer *can){
-    tx_Poll_Buffer = can;
-    
-    /*
-    for(int i = 0; i < 12; i++){
-        poll[i].mode(PullDown);    
-    }
-    */
+PollSwitch::PollSwitch(){
+    switchState = 0;
 }
 
-uint16_t poll_switches(){
-    uint16_t a = 0;
+uint16_t PollSwitch::poll(){
     int i = 0;
     
     // if a low signal is detected, previous switch is broken
-    for(i = 1; i < 12; i++){
-        if(!poll[i].read())
+    for(i = 1; i < sizeof(sw)/sizeof(sw[0]); i++){
+        if(!sw[i].read())
             break;
     }
     
     // bit on: switch may be broken
-    a = 0 & (0xFF >> (i-1));
-    return a;
-}
-
-void update_poll(const void *arg){
-    char data[2] = {0};
-    while(1){
-        converter.i = poll_switches();
-        data[0] = converter.ch[0];
-        data[1] = converter.ch[1];
-        CANMessage txMessage(TX_POLL_ID, data, 2);
-        tx_Poll_Buffer->txWrite(txMessage);
-        
-        Thread::wait(100);      //10 Hz update
-    }
-}
-
-void PollSwitch::start_update(){
-    Thread update_thread(update_poll);   
+    switchState = (1 << i);
+    return (1 << i);
 }
\ No newline at end of file
--- a/PollSwitch/PollSwitch.h	Fri Oct 24 22:38:20 2014 +0000
+++ b/PollSwitch/PollSwitch.h	Sat Oct 25 03:28:55 2014 +0000
@@ -1,16 +1,16 @@
 #ifndef _FILE_POLLSWITCH_H
 #define _FILE_POLLSWITCH_H
 
-#include "LPCDigitalOut.h"
 #include "LPCDigitalIn.h"
-#include "CANBuffer.h"
-#include "rtos.h"
-
-const int TX_POLL_ID = ((4 << 8) | 0x02);
 
 class PollSwitch{
     public:
-        PollSwitch(CANBuffer *can);
-        void start_update();  
+        PollSwitch();
+        
+        // Returns new state, updates last known
+        uint16_t poll();
+        
+        // Stores the last known state
+        uint16_t switchState;
 };
 #endif
\ No newline at end of file
--- a/SysMngmt.cpp	Fri Oct 24 22:38:20 2014 +0000
+++ b/SysMngmt.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -15,7 +15,7 @@
 #include "DC_DC.h"
 #include "PollSwitch.h"
 #include "IMD.h"
-#include "CurrentMonitor.h"
+#include "CoulombCounter.h"
 
 CANBuffer rxBuffer(CAN1, MEDIUM);
 Watchdog wdt;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TemperatureRead/TemperatureRead.cpp	Sat Oct 25 03:28:55 2014 +0000
@@ -0,0 +1,30 @@
+#include "TemperatureRead.h"
+
+TemperatureRead::TemperatureRead(PinName pin, struct TempTable _table) : ana(pin) {
+    usingAna = true;
+    table = _table;
+    temperature = 0;
+}
+TemperatureRead::TemperatureRead(struct TempTable _table)  {
+    usingAna = false;   
+    table = _table;
+    temperature = 0;
+}
+
+float TemperatureRead::convert(float in) {
+    if (in < table.input[0]) { temperature = -INFINITY; return temperature; }                    // Out of range of the table
+    if (in > table.input[table.numEntries-1]) { temperaure = -INFINITY; return temperature; }    // Out of range of the table
+    int lowerIndex = 0;
+    int upperIndex = table.numEntries-1;
+    for (int i = 0; i < table.numEntries; i++) {                  // Converge on the entries that surround the input
+        if (in >= table.input[lowerIndex]) { lowerIndex = i; }
+        if (in <= table.input[upperIndex]) { upperIndex = table.numEntries-1 - i; }
+    }
+    // Interpolate and return
+    temperature = table.output[lowerIndex] + (table.output[upperIndex] - table.output[lowerIndex]) * ((in - table.input[lowerIndex]) / (table.input[upperIndex] - table.input[lowerIndex]));
+    return temperature;
+}
+float TemperatureRead::read() {
+    if (!usingAna) { temperature = 0; return temperature;
+    else return convert(ana.read());
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TemperatureRead/TemperatureRead.h	Sat Oct 25 03:28:55 2014 +0000
@@ -0,0 +1,24 @@
+#ifndef _TEMPERATURE_READ_H
+#define _TEMPERATURE_READ_H
+
+// Look up table for temperatures from the GLV Battery Charge Regulator MOSFET internal to the rear accy. box
+const struct TempTable NXFT15XH103_Table {
+    float input[] = {0.951781202,0.937262775,0.919578592,0.898354357,0.873281379,0.844154225,0.810924767,0.77373518,0.732941648,0.689103062,0.642984648,0.595469256,0.547490837,0.5,0.453820525,0.409646378,0.368048534,0.329354168,0.293785311,0.261393013,0.232186732,0.205908044,0.182539034,0.161706765,0.143322197,0.127018769,0.112688554,0.100071994,0.088921283,0.079189687,0.07054559,0.06305631,0.056425741,0.050512723};
+    float ouput[] = {-40,-35,-30,-25,-20,-15,-10,-5,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125};
+    int numEntries = sizeof(input)/sizeof(input[0]);
+};
+
+class TemperatureRead {
+public:
+    TemperatureRead(PinName pin, const struct TempTable _table);
+    TemperatureRead(struct TempTable _table)
+    float convert(float in);
+    float temperature;
+    
+private:
+    AnalogIn ana;
+    bool usingAna;
+    struct TempTable table;
+};
+
+#endif /*_TEMPERATURE_READ_*/   
\ No newline at end of file
--- a/Temperature_Read/TemperatureRead.h	Fri Oct 24 22:38:20 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-/*
-Test Code
-#include "mbed.h"
-#include "TemperatureRead.h"
-
-AnalogIn Vin(p15);
-int main()
-{
-    float resistance,temperature,Vadc=0;
-    while(1)
-    {
-        Vadc=Vin.read()*VDD;
-        //printf("Vadc:%f\n\r",Vadc);
-        while(Vadc>0)
-        {
-            Vadc=Vin.read()*VDD;
-            printf("Vadc:%f\n\r",Vadc);
-            resistance=((float)R10K*Vadc)/((float)VDD + Vadc);
-            temperature=ReadTemp(TR_USP10982_Map, resistance, TABLE_SIZE_USP10982);
-            printf("Resistance:%f \n\r",resistance);
-            printf("Temperature:%f \n\r",temperature);
-            wait(0.5);
-        }   
-    }
-}    
-*/
-#ifndef _TEMPERATURE_READ_
-#define _TEMPERATURE_READ_
-
-#define TABLE_SIZE_NXFT15XH103FA 34
-#define TABLE_SIZE_NTCLP00E3103H 26
-#define TABLE_SIZE_USP10982 121  
-#define R10K 10                        //Consider Resistance in Kohms
-#define VDD 3.33
-typedef struct 
-{
-    float x;
-    float y;
-}Temp_Resistance;
-
-Temp_Resistance TR_NXFT15XH103FA_Map[TABLE_SIZE_NXFT15XH103FA] ={
-    { .x=   197.388 , .y=   -40 },
-    { .x=   149.395 , .y=   -35 },
-    { .x=   114.345 , .y=   -30 },
-    { .x=   88.381  , .y=   -25 },
-    { .x=   68.915  , .y=   -20 },
-    { .x=   54.166  , .y=   -15 },
-    { .x=   42.889  , .y=   -10 },
-    { .x=   34.196  , .y=   -5  },
-    { .x=   27.445  , .y=   0   },
-    { .x=   22.165  , .y=   5   },
-    { .x=   18.01   , .y=   10  },
-    { .x=   14.72   , .y=   15  },
-    { .x=   12.099  , .y=   20  },
-    { .x=   10      , .y=   25  },
-    { .x=   8.309   , .y=   30  },
-    { .x=   6.939   , .y=   35  },
-    { .x=   5.824   , .y=   40  },
-    { .x=   4.911   , .y=   45  },
-    { .x=   4.16    , .y=   50  },
-    { .x=   3.539   , .y=   55  },
-    { .x=   3.024   , .y=   60  },
-    { .x=   2.593   , .y=   65  },
-    { .x=   2.233   , .y=   70  },
-    { .x=   1.929   , .y=   75  },
-    { .x=   1.673   , .y=   80  },
-    { .x=   1.455   , .y=   85  },
-    { .x=   1.27    , .y=   90  },
-    { .x=   1.112   , .y=   95  },
-    { .x=   0.976   , .y=   100 },
-    { .x=   0.86    , .y=   105 },
-    { .x=   0.759   , .y=   110 },
-    { .x=   0.673   , .y=   115 },
-    { .x=   0.598   , .y=   120 },
-    { .x=   0.532   , .y=   125 },
-    };
-    
-Temp_Resistance TR_NTCLP00E3103H_Map[TABLE_SIZE_NTCLP00E3103H] ={
-    { .x=   332.094 , .y=   -40 },
-    { .x=   239.9   , .y=   -35 },
-    { .x=   175.2   , .y=   -30 },
-    { .x=   129.287 , .y=   -25 },
-    { .x=   96.358  , .y=   -20 },
-    { .x=   72.5    , .y=   -15 },
-    { .x=   55.046  , .y=   -10 },
-    { .x=   42.157  , .y=   -5  },
-    { .x=   32.554  , .y=   0   },
-    { .x=   25.339  , .y=   5   },
-    { .x=   19.872  , .y=   10  },
-    { .x=   15.698  , .y=   15  },
-    { .x=   12.488  , .y=   20  },
-    { .x=   10      , .y=   25  },
-    { .x=   8.059   , .y=   30  },
-    { .x=   6.535   , .y=   35  },
-    { .x=   5.33    , .y=   40  },
-    { .x=   4.372   , .y=   45  },
-    { .x=   3.605   , .y=   50  },
-    { .x=   2.989   , .y=   55  },
-    { .x=   2.49    , .y=   60  },
-    { .x=   2.084   , .y=   65  },
-    { .x=   1.753   , .y=   70  },
-    { .x=   1.481   , .y=   75  },
-    { .x=   1.256   , .y=   80  },
-    { .x=   1.07    , .y=   85  },
-
-    };    
-    
-Temp_Resistance TR_USP10982_Map[TABLE_SIZE_USP10982] ={
-    { .x=   336.479 , .y=   -40 },
-    { .x=   314.904 , .y=   -39 },
-    { .x=   294.848 , .y=   -38 },
-    { .x=   276.194 , .y=   -37 },
-    { .x=   258.838 , .y=   -36 },
-    { .x=   242.681 , .y=   -35 },
-    { .x=   227.632 , .y=   -34 },
-    { .x=   213.61  , .y=   -33 },
-    { .x=   200.539 , .y=   -32 },
-    { .x=   188.349 , .y=   -31 },
-    { .x=   176.974 , .y=   -30 },
-    { .x=   166.356 , .y=   -29 },
-    { .x=   156.441 , .y=   -28 },
-    { .x=   147.177 , .y=   -27 },
-    { .x=   138.518 , .y=   -26 },
-    { .x=   130.421 , .y=   -25 },
-    { .x=   122.847 , .y=   -24 },
-    { .x=   115.759 , .y=   -23 },
-    { .x=   109.122 , .y=   -22 },
-    { .x=   102.906 , .y=   -21 },
-    { .x=   97.081  , .y=   -20 },
-    { .x=   91.621  , .y=   -19 },
-    { .x=   86.501  , .y=   -18 },
-    { .x=   81.698  , .y=   -17 },
-    { .x=   77.19   , .y=   -16 },
-    { .x=   72.957  , .y=   -15 },
-    { .x=   68.982  , .y=   -14 },
-    { .x=   65.246  , .y=   -13 },
-    { .x=   61.736  , .y=   -12 },
-    { .x=   58.434  , .y=   -11 },
-    { .x=   55.329  , .y=   -10 },
-    { .x=   52.407  , .y=   -9  },
-    { .x=   49.656  , .y=   -8  },
-    { .x=   47.066  , .y=   -7  },
-    { .x=   44.626  , .y=   -6  },
-    { .x=   42.327  , .y=   -5  },
-    { .x=   40.159  , .y=   -4  },
-    { .x=   38.115  , .y=   -3  },
-    { .x=   36.187  , .y=   -2  },
-    { .x=   34.368  , .y=   -1  },
-    { .x=   32.65   , .y=   0   },
-    { .x=   31.029  , .y=   1   },
-    { .x=   29.498  , .y=   2   },
-    { .x=   28.052  , .y=   3   },
-    { .x=   26.685  , .y=   4   },
-    { .x=   25.392  , .y=   5   },
-    { .x=   24.17   , .y=   6   },
-    { .x=   23.013  , .y=   7   },
-    { .x=   21.918  , .y=   8   },
-    { .x=   20.882  , .y=   9   },
-    { .x=   19.901  , .y=   10  },
-    { .x=   18.971  , .y=   11  },
-    { .x=   18.09   , .y=   12  },
-    { .x=   17.255  , .y=   13  },
-    { .x=   16.463  , .y=   14  },
-    { .x=   15.712  , .y=   15  },
-    { .x=   14.999  , .y=   16  },
-    { .x=   14.323  , .y=   17  },
-    { .x=   13.681  , .y=   18  },
-    { .x=   13.072  , .y=   19  },
-    { .x=   12.493  , .y=   20  },
-    { .x=   11.942  , .y=   21  },
-    { .x=   11.419  , .y=   22  },
-    { .x=   10.922  , .y=   23  },
-    { .x=   10.45   , .y=   24  },
-    { .x=   10      , .y=   25  },
-    { .x=   9.572   , .y=   26  },
-    { .x=   9.165   , .y=   27  },
-    { .x=   8.777   , .y=   28  },
-    { .x=   8.408   , .y=   29  },
-    { .x=   8.057   , .y=   30  },
-    { .x=   7.722   , .y=   31  },
-    { .x=   7.402   , .y=   32  },
-    { .x=   7.098   , .y=   33  },
-    { .x=   6.808   , .y=   34  },
-    { .x=   6.531   , .y=   35  },
-    { .x=   6.267   , .y=   36  },
-    { .x=   6.015   , .y=   37  },
-    { .x=   5.775   , .y=   38  },
-    { .x=   5.545   , .y=   39  },
-    { .x=   5.326   , .y=   40  },
-    { .x=   5.117   , .y=   41  },
-    { .x=   4.917   , .y=   42  },
-    { .x=   4.725   , .y=   43  },
-    { .x=   4.543   , .y=   44  },
-    { .x=   4.368   , .y=   45  },
-    { .x=   4.201   , .y=   46  },
-    { .x=   4.041   , .y=   47  },
-    { .x=   3.888   , .y=   48  },
-    { .x=   3.742   , .y=   49  },
-    { .x=   3.602   , .y=   50  },
-    { .x=   3.468   , .y=   51  },
-    { .x=   3.34    , .y=   52  },
-    { .x=   3.217   , .y=   53  },
-    { .x=   3.099   , .y=   54  },
-    { .x=   2.986   , .y=   55  },
-    { .x=   2.878   , .y=   56  },
-    { .x=   2.774   , .y=   57  },
-    { .x=   2.675   , .y=   58  },
-    { .x=   2.579   , .y=   59  },
-    { .x=   2.488   , .y=   60  },
-    { .x=   2.4     , .y=   61  },
-    { .x=   2.316   , .y=   62  },
-    { .x=   2.235   , .y=   63  },
-    { .x=   2.157   , .y=   64  },
-    { .x=   2.083   , .y=   65  },
-    { .x=   2.011   , .y=   66  },
-    { .x=   1.942   , .y=   67  },
-    { .x=   1.876   , .y=   68  },
-    { .x=   1.813   , .y=   69  },
-    { .x=   1.752   , .y=   70  },
-    { .x=   1.693   , .y=   71  },
-    { .x=   1.637   , .y=   72  },
-    { .x=   1.582   , .y=   73  },
-    { .x=   1.53    , .y=   74  },
-    { .x=   1.48    , .y=   75  },
-    { .x=   1.432   , .y=   76  },
-    { .x=   1.385   , .y=   77  },
-    { .x=   1.34    , .y=   78  },
-    { .x=   1.297   , .y=   79  },
-    { .x=   1.255   , .y=   80  },
-    };
-        
-float ReadTemp(const Temp_Resistance *table, float value, size_t SIZE)
-{
-    //Search using Binary Search. Logarithmic passes
-    int result=SIZE, slope=0;
-    size_t firstPos=0;
-    size_t lastPos=SIZE;
-    size_t middlePos=0;
-    size_t temp_mid=1;
-    //printf("Value:%f\n\r",value);
-    while(temp_mid!=middlePos)
-    {
-        temp_mid=middlePos;
-        middlePos = firstPos + (lastPos-firstPos)/2;
-        if(table[middlePos].x == value)
-        {
-            lastPos = middlePos;
-            result = middlePos;
-        }
-        
-        if(table[middlePos].x < value) 
-        {
-            lastPos = middlePos;
-            result = middlePos;         
-        }
-        
-        else if(table[middlePos].x > value)
-        {
-            firstPos = middlePos;
-        }
-    }
-    //printf("Result:%d\n\r",result);
-    if(result == 0)
-        return  table[result].y;
-    else if(result == SIZE)
-        return  table[result - 1].y;
-    
-    slope = (table[result].y - table[result-1].y)/(table[result].x - table[result-1].x);
-    return (slope*(value - table[result].x) + table[result].y);          
-}
-#endif /*_TEMPERATURE_READ_*/   
\ No newline at end of file