diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index 4b25c079..536f4b90 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -123,6 +123,7 @@ void EcmpBattery::update_values() { datalayer_extended.stellantisECMP.pid_time_spent_over_55c = pid_time_spent_over_55c; datalayer_extended.stellantisECMP.pid_contactor_closing_counter = pid_contactor_closing_counter; datalayer_extended.stellantisECMP.pid_date_of_manufacture = pid_date_of_manufacture; + datalayer_extended.stellantisECMP.pid_SOH_cell_1 = pid_SOH_cell_1; if (battery_InterlockOpen) { set_event(EVENT_HVIL_FAILURE, 0); @@ -135,6 +136,12 @@ void EcmpBattery::update_values() { } else { clear_event(EVENT_12V_LOW); } + + if (pid_reason_open == 7) { //Invalid status + set_event(EVENT_CONTACTOR_OPEN, 0); + } else { + clear_event(EVENT_CONTACTOR_OPEN); + } } void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { @@ -578,8 +585,7 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]); break; case PID_ENERGY_CAPACITY: - pid_energy_capacity = ((rx_frame.data.u8[4] << 24) | (rx_frame.data.u8[5] << 16) | - (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]); + pid_energy_capacity = (rx_frame.data.u8[4] << 16) | (rx_frame.data.u8[5] << 8) | (rx_frame.data.u8[6]); break; case PID_HIGH_CELL_NUM: pid_highest_cell_voltage_num = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; @@ -720,6 +726,33 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { switch (incoming_poll) //Multiframe responses { + case PID_ALL_CELL_SOH: + switch (rx_frame.data.u8[0]) { + case 0x10: + pid_SOH_cell_1 = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6]); + break; + case 0x21: + break; + case 0x22: + break; + case 0x23: + break; + case 0x24: + break; + case 0x25: + break; + case 0x26: + break; + case 0x27: + break; + case 0x28: + break; + case 0x29: + break; + default: + break; + } + break; case PID_ALL_CELL_VOLTAGES: switch (rx_frame.data.u8[0]) { case 0x10: @@ -1291,6 +1324,11 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) { case PID_DATE_OF_MANUFACTURE: ECMP_POLL.data.u8[2] = (uint8_t)((PID_DATE_OF_MANUFACTURE & 0xFF00) >> 8); ECMP_POLL.data.u8[3] = (uint8_t)(PID_DATE_OF_MANUFACTURE & 0x00FF); + poll_state = PID_ALL_CELL_SOH; + break; + case PID_ALL_CELL_SOH: + ECMP_POLL.data.u8[2] = (uint8_t)((PID_ALL_CELL_SOH & 0xFF00) >> 8); + ECMP_POLL.data.u8[3] = (uint8_t)(PID_ALL_CELL_SOH & 0x00FF); poll_state = PID_WELD_CHECK; // Loop back to beginning break; default: diff --git a/Software/src/battery/ECMP-BATTERY.h b/Software/src/battery/ECMP-BATTERY.h index 2003d5cd..66219b7c 100644 --- a/Software/src/battery/ECMP-BATTERY.h +++ b/Software/src/battery/ECMP-BATTERY.h @@ -136,6 +136,7 @@ class EcmpBattery : public CanBattery { uint32_t pid_time_spent_over_55c = NOT_SAMPLED_YET; uint32_t pid_contactor_closing_counter = NOT_SAMPLED_YET; uint32_t pid_date_of_manufacture = NOT_SAMPLED_YET; + uint16_t pid_SOH_cell_1 = NOT_SAMPLED_YET; unsigned long previousMillis10 = 0; // will store last time a 10ms CAN Message was sent unsigned long previousMillis20 = 0; // will store last time a 20ms CAN Message was sent @@ -197,7 +198,7 @@ class EcmpBattery : public CanBattery { static const uint16_t PID_SW_VERSION_NUM = 0xF195; //Not supported on all batteris static const uint16_t PID_FACTORY_MODE_CONTROL = 0xD900; static const uint16_t PID_BATTERY_SERIAL = 0xD901; - static const uint16_t PID_ALL_CELL_SOH = 0xD4B5; //Very long message reply, too much data for this integration + static const uint16_t PID_ALL_CELL_SOH = 0xD4B5; static const uint16_t PID_AUX_FUSE_STATE = 0xD86C; static const uint16_t PID_BATTERY_STATE = 0xD811; static const uint16_t PID_PRECHARGE_SHORT_CIRCUIT = 0xD4D8; diff --git a/Software/src/battery/ECMP-HTML.h b/Software/src/battery/ECMP-HTML.h index 7a98a42a..3a43427f 100644 --- a/Software/src/battery/ECMP-HTML.h +++ b/Software/src/battery/ECMP-HTML.h @@ -376,6 +376,11 @@ class EcmpHtmlRenderer : public BatteryHtmlRenderer { ? "N/A" : String(datalayer_extended.stellantisECMP.pid_contactor_closing_counter)) + " cycles"; + content += "