Cell voltages fork (SoC)

Dependencies:   CUER_CAN CUER_DS1820 LTC2943 LTC6804 mbed PowerControl

Revision:
23:a1af4439c1fc
Parent:
18:521ffdd724f3
Child:
29:44924d2b1293
--- a/CANParserBMU.cpp	Tue Jul 04 20:36:29 2017 +0000
+++ b/CANParserBMU.cpp	Sun Jul 09 12:56:33 2017 +0000
@@ -106,7 +106,7 @@
 {
     CANMessage msg;
     msg.len = 8;
-    msg.id = BMS_BASE_ID + BATTERY_SOC_ID;
+    msg.id = BMS_BASE_ID + BATTERY_SOC_ID; //0x6F4
     CAN_Data data;
     data.setLowerFloat(SOC);
     data.setUpperFloat(percentageCharge);
@@ -134,6 +134,23 @@
     return msg;
 }
 
+/**
+* decodePackSOC and decodePackSOCPercentage can be used with both of the SOC msg types
+*/
+float decodePackSOC(CANMessage msg)
+{
+    CAN_Data data;
+    data.importCANData(msg);
+    return data.getLowerFloat();
+}
+
+float decodePackSOCPercentage(CANMessage msg)
+{
+    CAN_Data data;
+    data.importCANData(msg);
+    return data.getUpperFloat();  
+}
+
 CANMessage createCellVoltageMAXMIN(pack_voltage_extremes max_voltage, pack_voltage_extremes min_voltage)
 {
     CANMessage msg;
@@ -155,19 +172,33 @@
     return msg;
 }
 
-CANMessage createCellTemperatureMAXMIN(pack_temperature_extremes min_temperature, pack_temperature_extremes max_temperature)
+void decodeCellVoltageMAXMIN(CANMessage msg, pack_voltage_extremes &min, pack_voltage_extremes &max)
+{
+    CAN_Data decode;
+    decode.importCANData(msg);
+    min.voltage = decode.get_u16(0);
+    max.voltage = decode.get_u16(1);
+    min.CMU_number = decode.get_u8(4);
+    min.cell_number = decode.get_u8(5);
+    max.CMU_number = decode.get_u8(6);
+    max.cell_number = decode.get_u8(7);
+}
+
+//Since each CAN message can only support 1 ID, need to send 2 using this function
+//Use bool isMin to say if its a minimum or maximum
+CANMessage createCellTemperatureMAXMIN(pack_temperature_extremes ex_temperature, bool isMin)
 {
     CANMessage msg;
     msg.len = 8;
-    msg.id = BMS_BASE_ID + MAX_MIN_TEMPERATURE;
-
+    msg.id = BMS_BASE_ID + (isMin ? MIN_TEMPERATURE : MAX_TEMPERATURE) ;
+//TODO, CHANGE CMU NUMBER TO ROMID
     CAN_Data data;
-    data.set_u16(0,min_temperature.temperature);   //Min temperature
-    data.set_u16(1,max_temperature.temperature);   //Max temperature
-    data.set_u8(4,min_temperature.CMU_number);  //CMU number of lowest temperature cell
-    data.set_u8(5,BLANK_DATA);  //Dummy data
-    data.set_u8(6,max_temperature.CMU_number);  //CMU number of maxiumum temperature cell
-    data.set_u8(7,BLANK_DATA);  //Dummy data
+    data.set_u16(3,ex_temperature.temperature);   //Extreme temperature
+    
+    for(int i = 1; i <= 6; i++) //ID portion of ROM array
+    {
+        data.set_u8(i - 1, ex_temperature.ROMID[i]);
+    }
 
     for(int i=0; i<8; i++) {
         msg.data[i] = data.get_u8(i);
@@ -176,6 +207,25 @@
     return msg;
 }
 
+//It is up to function caller to decide by msg.ID if it is minimum or not
+pack_temperature_extremes decodeCellTemperatureMAXMIN(CANMessage msg)
+{
+    pack_temperature_extremes result;
+    CAN_Data decode;
+    unsigned long fullID = 0;
+    
+    decode.importCANData(msg);
+    result.temperature = decode.get_16(3);
+    
+    for(int i = 1; i <=6; i++)
+    {
+        result.ROMID[i] = decode.get_u8(i-1);
+        fullID += (result.ROMID[i] << (8 * (i-1))); //Bit order not particularly important    
+    }
+    result.ID = fullID;
+    return result;
+}
+
 CANMessage createBatteryVI(uint32_t batteryVoltage,uint32_t batteryCurrent)
 {
     CANMessage msg;
@@ -229,6 +279,13 @@
     return msg;
 }
 
+uint32_t decodeExtendedBatteryPackStatus(CANMessage msg)
+{
+    CAN_Data decode;
+    decode.importCANData(msg);
+    return decode.getLower_uLong();
+}
+
 void convertFloatFloat(float lower, float upper, CANMessage& msg, bool littleEndian)
 {
     // Code taken from driver_controls