Team Fox / Mbed 2 deprecated workinQM_5thJan_azad

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of workinQM_10thDec by Team Fox

Revision:
30:22b338b027de
Parent:
29:bb0d64656ba1
Child:
32:623747b1cecb
--- a/EPS.cpp	Thu Jun 23 12:14:28 2016 +0000
+++ b/EPS.cpp	Fri Jul 01 14:59:12 2016 +0000
@@ -22,7 +22,7 @@
 DigitalOut TRXY(TRXY_DR_EN);            //active high
 DigitalOut TRZ(TRZ_DR_EN);              //active high
 DigitalOut EN3V3A(ENBL3V3A);
-DigitalOut EN_BTRY_HT(BATT_HEAT);
+//DigitalOut BTRY_HTR_ENABLE(BATT_HEAT);       //EN_BTRY_HT
 //DigitalIn BTRY_HT_OUTPUT(BATT_HEAT_OUTPUT);
 //AnalogIn Vbatt_ang(VBATT);
 AnalogIn Batt_voltage(PIN20);   //Battery voltage
@@ -52,10 +52,10 @@
 extern uint8_t EPS_INIT_STATUS ;
 extern uint8_t EPS_BATTERY_GAUGE_STATUS ;
 extern uint8_t EPS_MAIN_STATUS;
-extern uint8_t EPS_BATTERY_TEMP_STATUS ;
+extern uint8_t EPS_BTRY_TMP_STATUS ;
 extern uint8_t EPS_STATUS ;
 
-extern uint8_t EPS_BATTERY_HEATER_ENABLE ;
+extern uint8_t EPS_BTRY_HTR ;
 
 //eps cdms fault
 extern uint8_t CDMS_SW_STATUS;
@@ -347,12 +347,12 @@
     
     for(Iteration=0;Iteration<3;Iteration++){
         quant_data.AngularSpeed_quant[Iteration]=actual_data.AngularSpeed_actual[Iteration];
-        printf("\n\r w value %f",quant_data.AngularSpeed_quant[Iteration]);
+        //printf("\n\r w value %f",quant_data.AngularSpeed_quant[Iteration]);
     }
     
     for(Iteration=0;Iteration<3;Iteration++){
         quant_data.Bvalue_quant[Iteration]=actual_data.Bvalue_actual[Iteration];
-        printf("\n\r b value %f",quant_data.Bvalue_quant[Iteration]);
+        //printf("\n\r b value %f",quant_data.Bvalue_quant[Iteration]);
     }
     
     quant_data.Batt_voltage_quant=quantiz(vstart,vstep,actual_data.Batt_voltage_actual);
@@ -528,75 +528,115 @@
         vAlertMinMaxThreshold();//set min, max value of Valrt register
         vResetThresholdSet();//set threshold voltage for reset
         vResetAlertEnabled(true);//enable alert on reset for V < Vreset
+        write(REG_STATUS, read(REG_STATUS) & 0xFEFF);   //Clearing Reset Indicator bit
 }
 
-void FCTN_BATTERYGAUGE_MAIN(float Battery_parameters[4])
+int FCTN_BATTERYGAUGE_MAIN(float Battery_parameters[4], float temp)
 {
         printf("\n\r battery gauge \n");
 
-        float temp=30;    //=Battery_temp  (from temp sensor on battery board)       //value of battery temperature in C currently given a dummy value. Should be updated everytime.
         tempCompensation(temp);
     
         
         Battery_parameters[0]=vcell();
         Battery_parameters[1]=soc();
         Battery_parameters[2]=crate();
-       
+               
         printf("\nVcell=%f",vcell());       //remove this for final code
         printf("\nSOC=%f",soc());           //remove this for final code
         printf("\nC_rate=%f",crate());      //remove this for final code
 
-       
         if (alerting()== true)       //alert is on
         {   
             Battery_parameters[3]=alertFlags();
             clearAlert();//clear alert
             clearAlertFlags();//clear all alert flags
         }
-        
+    
+        if( soc() == 200) return 0;         //Data not received - Invalid SOC
+        else return 1;     
+}
+
+void tempCompensation(float temp)
+{
+    //Calculate the new RCOMP value
+    char rcomp;
+    if (temp > 20.0) {
+        rcomp = RCOMP0 + (temp - 20.0) * -0.5;
+    } else {
+        rcomp = RCOMP0 + (temp - 20.0) * -5.0;
+    }
+ 
+    //Update the RCOMP value
+    compensation(rcomp);
 }
 
+void compensation(char rcomp)
+{
+    //Read the current 16-bit register value
+    unsigned short value = read(REG_CONFIG);
+ 
+    //Update the register value
+    value &= 0x00FF;
+    value |= rcomp << 8;
+ 
+    //Write the value back out
+    write(REG_CONFIG, value);
+}
+
+
+int write(char reg, unsigned short data)
+    {
+        //Create a temporary buffer
+        char buff[3];
+   
+        //Load the register address and 16-bit data
+        buff[0] = reg;
+        buff[1] = data >> 8;
+        buff[2] = data;
+        
+        int flag = m_I2C.write(m_ADDR, buff, 3);    //Write the data and return ack
+        
+        if( flag != 0 )
+        {
+            flag = m_I2C.write(m_ADDR, buff, 3);    //Write the data and return ack
+            if( data != read(reg) )                 //Verify written data
+                EPS_BATTERY_GAUGE_STATUS = 0;           //clear EPS_BATTERY_GAUGE_STATUS 
+        }
+        
+        return flag;
+    }
+   
 unsigned short read(char reg)
     {
-         
-         //Create a temporary buffer
-        char buff[2];
+        int flag = 1;
+        char buff[2];       //Create a temporary buffer
  
         //Select the register
         m_I2C.write(m_ADDR, &reg, 1, true);
- 
         //Read the 16-bit register
-        m_I2C.read(m_ADDR, buff, 2);
+        flag = m_I2C.read(m_ADDR, buff, 2);
+        
+        if( flag )
+        {
+            m_I2C.write(m_ADDR, &reg, 1, true);
+            flag = m_I2C.read(m_ADDR, buff, 2);
+            if( flag )
+                EPS_BATTERY_GAUGE_STATUS = 0;           //clear EPS_BATTERY_GAUGE_STATUS 
+        }
  
         //Return the combined 16-bit value
         return (buff[0] << 8) | buff[1];
     }
- 
-
- 
-
     
-    void write(char reg, unsigned short data)
-    {
-        //Create a temporary buffer
-        char buff[3];
- 
-        //Load the register address and 16-bit data
-        buff[0] = reg;
-        buff[1] = data >> 8;
-        buff[2] = data;
- 
-        //Write the data
-        m_I2C.write(m_ADDR, buff, 3);
-    }
-   
- 
  
     // Command the MAX17049 to perform a power-on reset
     void reset()
     {
         //Write the POR command
         write(REG_CMD, 0x5400);
+        //Re-initialise gauge
+        FCTN_BATTERYGAUGE_INIT();
     }
     
     // Command the MAX17049 to perform a QuickStart
@@ -643,49 +683,6 @@
         //Write the value back out
         write(REG_CONFIG, value);
 } 
-
-
-void compensation(char rcomp)
-{
-    //Read the current 16-bit register value
-    unsigned short value = read(REG_CONFIG);
- 
-    //Update the register value
-    value &= 0x00FF;
-    value |= rcomp << 8;
- 
-    //Write the value back out
-    write(REG_CONFIG, value);
-}
-
- 
-void tempCompensation(float temp)
-{
-    //Calculate the new RCOMP value
-    char rcomp;
-    if (temp > 20.0) {
-        rcomp = RCOMP0 + (temp - 20.0) * -0.5;
-    } else {
-        rcomp = RCOMP0 + (temp - 20.0) * -5.0;
-    }
- 
-    //Update the RCOMP value
-    compensation(rcomp);
-}
-
-  // Command the MAX17049 to de-assert the ALRT pin
-    void clearAlert()
-    {
-        //Read the current 16-bit register value
-        unsigned short value = read(REG_CONFIG);
- 
-        //Clear the ALRT bit
-        value &= ~(1 << 5);
- 
-        //Write the value back out
-        write(REG_CONFIG, value);
-    }
-  
  
     //Set the SOC empty alert threshold of the MAX17049
     void emptyAlertThreshold(char threshold)
@@ -748,7 +745,20 @@
         //Write the value back out
         write(REG_STATUS, value);
     }
+    
+      // Command the MAX17049 to de-assert the ALRT pin
+    void clearAlert()
+    {
+        //Read the current 16-bit register value
+        unsigned short value = read(REG_CONFIG);
  
+        //Clear the ALRT bit
+        value &= ~(1 << 5);
+ 
+        //Write the value back out
+        write(REG_CONFIG, value);
+    }
+  
     //Get the current alert flags on the MAX17049
     //refer datasheet-status registers section to decode it.
     char alertFlags()
@@ -842,7 +852,7 @@
     //HS=0;
     spi_bt.format(8,3);
     spi_bt.frequency(1000000);
-    EPS_BATTERY_TEMP_STATUS = 1;
+    EPS_BTRY_TMP_STATUS = 1;
 } 
 
 void FCTN_BATT_TEMP_SENSOR_MAIN(float temp[2])