Cell voltages fork (SoC)
Dependencies: CUER_CAN CUER_DS1820 LTC2943 LTC6804 mbed PowerControl
Diff: CANParserBMU.cpp
- 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