From 54f9cb49f33ec3398cfcca7dba6796510784507d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Thu, 4 Sep 2025 23:21:26 +0300 Subject: [PATCH 1/8] Add mappings for 2D4, 3B4 and 2F4 --- Software/src/battery/ECMP-BATTERY.cpp | 33 ++++++++++++++++++++++++--- Software/src/battery/ECMP-BATTERY.h | 17 ++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index 2e5547e7..2ef5aeb1 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -192,15 +192,42 @@ void EcmpBattery::update_values() { void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { switch (rx_frame.ID) { - case 0x2D4: //MysteryVan 50/75kWh platform + case 0x2D4: //MysteryVan 50/75kWh platform (TBMU 100ms periodic) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; MysteryVan = true; + SOE_MAX_CURRENT_TEMP = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]; // (Wh, 0-200000) + FRONT_MACHINE_POWER_LIMIT = (rx_frame.data.u8[4] << 6) | ((rx_frame.data.u8[5] & 0xFC) >> 2); // (W 0-1000000) + REAR_MACHINE_POWER_LIMIT = ((rx_frame.data.u8[5] & 0x03) << 12) | (rx_frame.data.u8[6] << 4) | + ((rx_frame.data.u8[7] & 0xF0) >> 4); // (W 0-1000000) break; - case 0x3B4: //MysteryVan 50/75kWh platform + case 0x3B4: //MysteryVan 50/75kWh platform (TBMU 100ms periodic) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + EVSE_INSTANT_DC_HV_CURRENT = + ((rx_frame.data.u8[2] & 0x03) << 12) | (rx_frame.data.u8[3] << 2) | ((rx_frame.data.u8[4] & 0xC0) >> 6); + EVSE_STATE = ((rx_frame.data.u8[4] & 0x38) >> 3); /*Enumeration below + 000: NOT CONNECTED + 001: CONNECTED + 010: INITIALISATION + 011: READY + 100: PRECHARGE IN PROGRESS + 101: TRANSFER IN PROGRESS + 110: NOT READY + 111: Reserved */ + HV_BATT_SOE_HD = ((rx_frame.data.u8[4] & 0x03) << 12) | (rx_frame.data.u8[5] << 4) | + ((rx_frame.data.u8[6] & 0xF0) >> 4); // (Wh, 0-200000) + HV_BATT_SOE_MAX = ((rx_frame.data.u8[6] & 0x03) << 8) | rx_frame.data.u8[7]; // (Wh, 0-200000) + CHECKSUM_FRAME_3B4 = (rx_frame.data.u8[0] & 0xF0) >> 4; + COUNTER_NIBBLE_3B4 = (rx_frame.data.u8[0] & 0x0F); break; - case 0x2F4: //MysteryVan 50/75kWh platform + case 0x2F4: //MysteryVan 50/75kWh platform (Event triggered) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + TBMU_EVSE_DC_MES_VOLTAGE = (rx_frame.data.u8[0] << 6) | (rx_frame.data.u8[1] >> 2); //V 0-1000 + TBMU_EVSE_DC_MIN_VOLTAGE = ((rx_frame.data.u8[1] & 0x03) << 8) | rx_frame.data.u8[2]; //V 0-1000 + TBMU_EVSE_DC_MES_CURRENT = (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); //A -2000 - 2000 + TBMU_EVSE_CHRG_REQ = (rx_frame.data.u8[4] & 0x0C) >> 2; //00 No request, 01 Stop request + HV_STORAGE_MAX_I = ((rx_frame.data.u8[4] & 0x03) << 12) | (rx_frame.data.u8[5] << 2) | + ((rx_frame.data.u8[6] & 0xC0) >> 6); //A -2000 - 2000 + TBMU_EVSE_DC_MAX_POWER = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; //W -1000000 - 0 break; case 0x3F4: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; diff --git a/Software/src/battery/ECMP-BATTERY.h b/Software/src/battery/ECMP-BATTERY.h index 201f59d8..9b0d5627 100644 --- a/Software/src/battery/ECMP-BATTERY.h +++ b/Software/src/battery/ECMP-BATTERY.h @@ -133,6 +133,23 @@ class EcmpBattery : public CanBattery { uint32_t pid_date_of_manufacture = NOT_SAMPLED_YET; uint16_t pid_SOH_cell_1 = NOT_SAMPLED_YET; + //MysteryVan platform + uint16_t SOE_MAX_CURRENT_TEMP = 0; + uint16_t FRONT_MACHINE_POWER_LIMIT = 0; + uint16_t REAR_MACHINE_POWER_LIMIT = 0; + uint16_t EVSE_INSTANT_DC_HV_CURRENT = 0; + uint8_t EVSE_STATE = 0; + uint16_t HV_BATT_SOE_HD = 0; + uint16_t HV_BATT_SOE_MAX = 0; + uint8_t COUNTER_NIBBLE_3B4 = 0; + uint8_t CHECKSUM_FRAME_3B4 = 0; + uint16_t TBMU_EVSE_DC_MAX_POWER = 0; + uint16_t HV_STORAGE_MAX_I = 0; + uint8_t TBMU_EVSE_CHRG_REQ = 0; + uint16_t TBMU_EVSE_DC_MES_CURRENT = 0; + uint16_t TBMU_EVSE_DC_MIN_VOLTAGE = 0; + uint16_t TBMU_EVSE_DC_MES_VOLTAGE = 0; + 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 unsigned long previousMillis50 = 0; // will store last time a 50ms CAN Message was sent From cfdc1a3130f018b95c593a535f6d154c04b4bddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sat, 6 Sep 2025 21:21:53 +0300 Subject: [PATCH 2/8] Improve mappings --- Software/src/battery/ECMP-BATTERY.cpp | 36 ++++++++++++++++++++++++--- Software/src/battery/ECMP-BATTERY.h | 9 ++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index 2ef5aeb1..77844d0f 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -229,14 +229,44 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { ((rx_frame.data.u8[6] & 0xC0) >> 6); //A -2000 - 2000 TBMU_EVSE_DC_MAX_POWER = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; //W -1000000 - 0 break; - case 0x3F4: //MysteryVan 50/75kWh platform + case 0x3F4: //MysteryVan 50/75kWh platform (Temperature sensors) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + switch (((rx_frame.data.u8[0] & 0xE0) >> 5)) //Mux resides in top 3 bits of frame0 + { + case 0: + BMS_PROBETEMP[0] = (rx_frame.data.u8[1] - 40); + BMS_PROBETEMP[1] = (rx_frame.data.u8[2] - 40); + BMS_PROBETEMP[2] = (rx_frame.data.u8[3] - 40); + BMS_PROBETEMP[3] = (rx_frame.data.u8[4] - 40); + BMS_PROBETEMP[4] = (rx_frame.data.u8[5] - 40); + BMS_PROBETEMP[5] = (rx_frame.data.u8[6] - 40); + BMS_PROBETEMP[6] = (rx_frame.data.u8[7] - 40); + break; + default: //There are in total 64 temperature measurements in the BMS. We do not need to sample them all. + break; //For future, we could read them all if we want to. + } break; - case 0x554: //MysteryVan 50/75kWh platform + case 0x554: //MysteryVan 50/75kWh platform (Discharge/Charge limits) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_PEAK_DISCH_POWER_HD = (rx_frame.data.u8[1] << 6) | (rx_frame.data.u8[2] >> 2); //0-1000000 W + HV_BATT_PEAK_CH_POWER_HD = ((rx_frame.data.u8[2] & 0x03) << 12) | (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); // -1000000 - 0 W + HV_BATT_NOM_CH_POWER_HD = ((rx_frame.data.u8[4] & 0x0F) << 12) | (rx_frame.data.u8[5] << 6) | ((rx_frame.data.u8[6] & 0xC0) >> 6); // -1000000 - 0 W + MAX_ALLOW_CHRG_CURRENT = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; + CHECKSUM_FRAME_554 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xE + COUNTER_554 = (rx_frame.data.u8[0] & 0x0F); break; case 0x373: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + REQ_CLEAR_DTC_TBMU + TBCU_48V_WAKEUP + HV_BATT_MAX_REAL_CURR + Reserved_1_373 + TBMU_FAULT_TYPE + Reserved_5_373 + HV_BATT_REAL_VOLT_HD + HV_BATT_REAL_CURR_HD + CHECKSUM_FRAME_373 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xD + COUNTER_373 = (rx_frame.data.u8[0] & 0x0F); break; case 0x4F4: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; @@ -268,7 +298,7 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { case 0x4D4: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; break; - case 0x125: //Common + case 0x125: //Common eCMP datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; battery_soc = (rx_frame.data.u8[0] << 2) | (rx_frame.data.u8[1] >> 6); // Byte1, bit 7 length 10 (0x3FE when abnormal) (0-1000 ppt) diff --git a/Software/src/battery/ECMP-BATTERY.h b/Software/src/battery/ECMP-BATTERY.h index 9b0d5627..5fa4ab06 100644 --- a/Software/src/battery/ECMP-BATTERY.h +++ b/Software/src/battery/ECMP-BATTERY.h @@ -149,8 +149,15 @@ class EcmpBattery : public CanBattery { uint16_t TBMU_EVSE_DC_MES_CURRENT = 0; uint16_t TBMU_EVSE_DC_MIN_VOLTAGE = 0; uint16_t TBMU_EVSE_DC_MES_VOLTAGE = 0; + int8_t BMS_PROBETEMP[7] = {0}; + uint8_t CHECKSUM_FRAME_554 = 0; + uint8_t COUNTER_554 = 0; + uint16_t HV_BATT_PEAK_DISCH_POWER_HD = 0; + uint16_t HV_BATT_PEAK_CH_POWER_HD = 0; + uint16_t HV_BATT_NOM_CH_POWER_HD = 0; + uint16_t MAX_ALLOW_CHRG_CURRENT = 0; - unsigned long previousMillis10 = 0; // will store last time a 10ms CAN Message was sent + 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 unsigned long previousMillis50 = 0; // will store last time a 50ms CAN Message was sent unsigned long previousMillis100 = 0; // will store last time a 100ms CAN Message was sent From 64a3d5f5aaeccea11d221209fec724b7bf298fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sun, 7 Sep 2025 00:01:35 +0300 Subject: [PATCH 3/8] Add more CAN mappings --- Software/src/battery/ECMP-BATTERY.cpp | 82 ++++++++++++++++++--------- Software/src/battery/ECMP-BATTERY.h | 29 ++++++++-- 2 files changed, 80 insertions(+), 31 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index 77844d0f..579980c3 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -217,7 +217,7 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { ((rx_frame.data.u8[6] & 0xF0) >> 4); // (Wh, 0-200000) HV_BATT_SOE_MAX = ((rx_frame.data.u8[6] & 0x03) << 8) | rx_frame.data.u8[7]; // (Wh, 0-200000) CHECKSUM_FRAME_3B4 = (rx_frame.data.u8[0] & 0xF0) >> 4; - COUNTER_NIBBLE_3B4 = (rx_frame.data.u8[0] & 0x0F); + COUNTER_3B4 = (rx_frame.data.u8[0] & 0x0F); break; case 0x2F4: //MysteryVan 50/75kWh platform (Event triggered) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; @@ -231,48 +231,78 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { break; case 0x3F4: //MysteryVan 50/75kWh platform (Temperature sensors) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; - switch (((rx_frame.data.u8[0] & 0xE0) >> 5)) //Mux resides in top 3 bits of frame0 + switch (((rx_frame.data.u8[0] & 0xE0) >> 5)) //Mux resides in top 3 bits of frame0 { - case 0: - BMS_PROBETEMP[0] = (rx_frame.data.u8[1] - 40); - BMS_PROBETEMP[1] = (rx_frame.data.u8[2] - 40); - BMS_PROBETEMP[2] = (rx_frame.data.u8[3] - 40); - BMS_PROBETEMP[3] = (rx_frame.data.u8[4] - 40); - BMS_PROBETEMP[4] = (rx_frame.data.u8[5] - 40); - BMS_PROBETEMP[5] = (rx_frame.data.u8[6] - 40); - BMS_PROBETEMP[6] = (rx_frame.data.u8[7] - 40); - break; - default: //There are in total 64 temperature measurements in the BMS. We do not need to sample them all. - break; //For future, we could read them all if we want to. + case 0: + BMS_PROBETEMP[0] = (rx_frame.data.u8[1] - 40); + BMS_PROBETEMP[1] = (rx_frame.data.u8[2] - 40); + BMS_PROBETEMP[2] = (rx_frame.data.u8[3] - 40); + BMS_PROBETEMP[3] = (rx_frame.data.u8[4] - 40); + BMS_PROBETEMP[4] = (rx_frame.data.u8[5] - 40); + BMS_PROBETEMP[5] = (rx_frame.data.u8[6] - 40); + BMS_PROBETEMP[6] = (rx_frame.data.u8[7] - 40); + break; + default: //There are in total 64 temperature measurements in the BMS. We do not need to sample them all. + break; //For future, we could read them all if we want to. } break; case 0x554: //MysteryVan 50/75kWh platform (Discharge/Charge limits) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; - HV_BATT_PEAK_DISCH_POWER_HD = (rx_frame.data.u8[1] << 6) | (rx_frame.data.u8[2] >> 2); //0-1000000 W - HV_BATT_PEAK_CH_POWER_HD = ((rx_frame.data.u8[2] & 0x03) << 12) | (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); // -1000000 - 0 W - HV_BATT_NOM_CH_POWER_HD = ((rx_frame.data.u8[4] & 0x0F) << 12) | (rx_frame.data.u8[5] << 6) | ((rx_frame.data.u8[6] & 0xC0) >> 6); // -1000000 - 0 W + HV_BATT_PEAK_DISCH_POWER_HD = (rx_frame.data.u8[1] << 6) | (rx_frame.data.u8[2] >> 2); //0-1000000 W + HV_BATT_PEAK_CH_POWER_HD = ((rx_frame.data.u8[2] & 0x03) << 12) | (rx_frame.data.u8[3] << 4) | + ((rx_frame.data.u8[4] & 0xF0) >> 4); // -1000000 - 0 W + HV_BATT_NOM_CH_POWER_HD = ((rx_frame.data.u8[4] & 0x0F) << 12) | (rx_frame.data.u8[5] << 6) | + ((rx_frame.data.u8[6] & 0xC0) >> 6); // -1000000 - 0 W MAX_ALLOW_CHRG_CURRENT = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; - CHECKSUM_FRAME_554 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xE + CHECKSUM_FRAME_554 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xE COUNTER_554 = (rx_frame.data.u8[0] & 0x0F); break; case 0x373: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; - REQ_CLEAR_DTC_TBMU - TBCU_48V_WAKEUP - HV_BATT_MAX_REAL_CURR - Reserved_1_373 - TBMU_FAULT_TYPE - Reserved_5_373 - HV_BATT_REAL_VOLT_HD - HV_BATT_REAL_CURR_HD - CHECKSUM_FRAME_373 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xD + REQ_CLEAR_DTC_TBMU = ((rx_frame.data.u8[3] & 0x40) >> 7); + TBCU_48V_WAKEUP = (rx_frame.data.u8[3] >> 7); + HV_BATT_MAX_REAL_CURR = (rx_frame.data.u8[5] << 7) | (rx_frame.data.u8[6] >> 1); //A -2000 - 2000 0.1 scaling + TBMU_FAULT_TYPE = (rx_frame.data.u8[7] & 0xE0) >> 5; + /*000: No fault + 001: FirstLevelFault: Warning Lamp + 010: SecondLevelFault: Stop Lamp + 011: ThirdLevelFault: Stop Lamp + contactor opening (EPS shutdown) + 100: FourthLevelFault: Stop Lamp + Active Discharge + 101: Inhibition of powertrain activation + 110: Reserved + 111: Invalid*/ + HV_BATT_REAL_VOLT_HD = ((rx_frame.data.u8[3] & 0x3F) << 8) | (rx_frame.data.u8[4]); //V 0-1000 * 0.1 scaling + HV_BATT_REAL_CURR_HD = (rx_frame.data.u8[1] << 8) | (rx_frame.data.u8[2]); //A -2000 - 2000 0.1 scaling + CHECKSUM_FRAME_373 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xD COUNTER_373 = (rx_frame.data.u8[0] & 0x0F); break; case 0x4F4: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_CRASH_MEMORIZED = ((rx_frame.data.u8[2] & 0x08) >> 3); + HV_BATT_COLD_CRANK_ACK = ((rx_frame.data.u8[2] & 0x04) >> 2); + HV_BATT_CHARGE_NEEDED_STATE = ((rx_frame.data.u8[2] & 0x02) >> 1); + HV_BATT_NOM_CH_VOLTAGE = ((rx_frame.data.u8[2] & 0x01) << 8) | (rx_frame.data.u8[3]); //V 0 - 500 + HV_BATT_NOM_CH_CURRENT = rx_frame.data.u8[4]; // -120 - 0 0.5scaling + HV_BATT_GENERATED_HEAT_RATE = (rx_frame.data.u8[5] << 1) | (rx_frame.data.u8[6] >> 7); //W 0-50000 + REQ_MIL_LAMP_CONTINOUS = (rx_frame.data.u8[7] & 0x04) >> 2; + REQ_BLINK_STOP_AND_SERVICE_LAMP = (rx_frame.data.u8[7] & 0x02) >> 1; + CMD_RESET_MIL = (rx_frame.data.u8[7] & 0x01); + HV_BATT_SOC = (rx_frame.data.u8[1] << 2) | (rx_frame.data.u8[2] >> 6); + CONTACTORS_STATE = + (rx_frame.data.u8[2] & 0x30) >> 4; //00 : contactor open 01 : pre-load contactor 10 : contactor close + HV_BATT_DISCONT_WARNING_OPEN = (rx_frame.data.u8[7] & 0x08) >> 3; + CHECKSUM_FRAME_4F4 = (rx_frame.data.u8[0] & 0xF0) >> 4; + COUNTER_4F4 = (rx_frame.data.u8[0] & 0x0F); break; case 0x414: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_REAL_POWER_HD = (rx_frame.data.u8[1] << 7) | (rx_frame.data.u8[2] >> 1); + MAX_ALLOW_CHRG_POWER = + ((rx_frame.data.u8[2] & 0x01) << 13) | (rx_frame.data.u8[3] << 5) | ((rx_frame.data.u8[4] & 0xF8) >> 3); + MAX_ALLOW_DISCHRG_POWER = + ((rx_frame.data.u8[5] & 0x07) << 11) | (rx_frame.data.u8[6] << 3) | ((rx_frame.data.u8[7] & 0xE0) >> 5); + CHECKSUM_FRAME_414 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0x9 + COUNTER_414 = (rx_frame.data.u8[0] & 0x0F); break; case 0x353: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; diff --git a/Software/src/battery/ECMP-BATTERY.h b/Software/src/battery/ECMP-BATTERY.h index 5fa4ab06..59f4d9f4 100644 --- a/Software/src/battery/ECMP-BATTERY.h +++ b/Software/src/battery/ECMP-BATTERY.h @@ -133,7 +133,7 @@ class EcmpBattery : public CanBattery { uint32_t pid_date_of_manufacture = NOT_SAMPLED_YET; uint16_t pid_SOH_cell_1 = NOT_SAMPLED_YET; - //MysteryVan platform + //MysteryVan platform (allcaps to make code easer to co-exist) uint16_t SOE_MAX_CURRENT_TEMP = 0; uint16_t FRONT_MACHINE_POWER_LIMIT = 0; uint16_t REAR_MACHINE_POWER_LIMIT = 0; @@ -141,8 +141,7 @@ class EcmpBattery : public CanBattery { uint8_t EVSE_STATE = 0; uint16_t HV_BATT_SOE_HD = 0; uint16_t HV_BATT_SOE_MAX = 0; - uint8_t COUNTER_NIBBLE_3B4 = 0; - uint8_t CHECKSUM_FRAME_3B4 = 0; + uint8_t CHECKSUM_FRAME_3B4, CHECKSUM_FRAME_554, CHECKSUM_FRAME_373, CHECKSUM_FRAME_4F4, CHECKSUM_FRAME_414 = 0; uint16_t TBMU_EVSE_DC_MAX_POWER = 0; uint16_t HV_STORAGE_MAX_I = 0; uint8_t TBMU_EVSE_CHRG_REQ = 0; @@ -150,12 +149,32 @@ class EcmpBattery : public CanBattery { uint16_t TBMU_EVSE_DC_MIN_VOLTAGE = 0; uint16_t TBMU_EVSE_DC_MES_VOLTAGE = 0; int8_t BMS_PROBETEMP[7] = {0}; - uint8_t CHECKSUM_FRAME_554 = 0; - uint8_t COUNTER_554 = 0; + uint8_t COUNTER_554, COUNTER_373, COUNTER_3B4, COUNTER_4F4, COUNTER_414 = 0; uint16_t HV_BATT_PEAK_DISCH_POWER_HD = 0; uint16_t HV_BATT_PEAK_CH_POWER_HD = 0; uint16_t HV_BATT_NOM_CH_POWER_HD = 0; uint16_t MAX_ALLOW_CHRG_CURRENT = 0; + int16_t HV_BATT_REAL_CURR_HD = 0; + uint16_t HV_BATT_REAL_VOLT_HD = 0; + uint8_t TBMU_FAULT_TYPE = 0; + int16_t HV_BATT_MAX_REAL_CURR = 0; + bool TBCU_48V_WAKEUP = false; + bool REQ_CLEAR_DTC_TBMU = false; + bool HV_BATT_DISCONT_WARNING_OPEN = false; + uint8_t CONTACTORS_STATE = 0; + uint16_t HV_BATT_SOC = 0; + bool CMD_RESET_MIL = 0; + bool REQ_BLINK_STOP_AND_SERVICE_LAMP = false; + bool REQ_MIL_LAMP_CONTINOUS = false; + uint16_t HV_BATT_GENERATED_HEAT_RATE = 0; + bool HV_BATT_CRASH_MEMORIZED = false; + bool HV_BATT_COLD_CRANK_ACK = false; + bool HV_BATT_CHARGE_NEEDED_STATE = false; + uint8_t HV_BATT_NOM_CH_CURRENT = 0; + uint16_t HV_BATT_NOM_CH_VOLTAGE = 0; + uint16_t HV_BATT_REAL_POWER_HD = 0; + uint16_t MAX_ALLOW_CHRG_POWER = 0; + uint16_t MAX_ALLOW_DISCHRG_POWER = 0; 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 From e02cb61efc076f69d5e2929a54186c5be49d390b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sun, 7 Sep 2025 18:55:00 +0300 Subject: [PATCH 4/8] Add final CAN mappings for MysteryVan --- Software/src/battery/ECMP-BATTERY.cpp | 98 ++++++++++++++++++++++++--- Software/src/battery/ECMP-BATTERY.h | 32 +++++++-- 2 files changed, 114 insertions(+), 16 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index 579980c3..ab7f8c91 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -95,6 +95,8 @@ void EcmpBattery::update_values() { datalayer.battery.status.cell_max_voltage_mV = pid_high_cell_voltage; datalayer.battery.status.cell_min_voltage_mV = pid_low_cell_voltage; } + + datalayer.battery.info.number_of_cells = NUMBER_OF_CELL_MEASUREMENTS_IN_BATTERY; //50/75kWh sends valid cellcount } // Update extended datalayer (More Battery Info page) @@ -219,15 +221,15 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { CHECKSUM_FRAME_3B4 = (rx_frame.data.u8[0] & 0xF0) >> 4; COUNTER_3B4 = (rx_frame.data.u8[0] & 0x0F); break; - case 0x2F4: //MysteryVan 50/75kWh platform (Event triggered) + case 0x2F4: //MysteryVan 50/75kWh platform (Event triggered when charging) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; - TBMU_EVSE_DC_MES_VOLTAGE = (rx_frame.data.u8[0] << 6) | (rx_frame.data.u8[1] >> 2); //V 0-1000 - TBMU_EVSE_DC_MIN_VOLTAGE = ((rx_frame.data.u8[1] & 0x03) << 8) | rx_frame.data.u8[2]; //V 0-1000 - TBMU_EVSE_DC_MES_CURRENT = (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); //A -2000 - 2000 - TBMU_EVSE_CHRG_REQ = (rx_frame.data.u8[4] & 0x0C) >> 2; //00 No request, 01 Stop request - HV_STORAGE_MAX_I = ((rx_frame.data.u8[4] & 0x03) << 12) | (rx_frame.data.u8[5] << 2) | - ((rx_frame.data.u8[6] & 0xC0) >> 6); //A -2000 - 2000 - TBMU_EVSE_DC_MAX_POWER = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; //W -1000000 - 0 + //TBMU_EVSE_DC_MES_VOLTAGE = (rx_frame.data.u8[0] << 6) | (rx_frame.data.u8[1] >> 2); //V 0-1000 //Fastcharger info, not needed for BE + //TBMU_EVSE_DC_MIN_VOLTAGE = ((rx_frame.data.u8[1] & 0x03) << 8) | rx_frame.data.u8[2]; //V 0-1000 //Fastcharger info, not needed for BE + //TBMU_EVSE_DC_MES_CURRENT = (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); //A -2000 - 2000 //Fastcharger info, not needed for BE + //TBMU_EVSE_CHRG_REQ = (rx_frame.data.u8[4] & 0x0C) >> 2; //00 No request, 01 Stop request //Fastcharger info, not needed for BE + //HV_STORAGE_MAX_I = ((rx_frame.data.u8[4] & 0x03) << 12) | (rx_frame.data.u8[5] << 2) | //Fastcharger info, not needed for BE + ((rx_frame.data.u8[6] & 0xC0) >> 6); //A -2000 - 2000 + //TBMU_EVSE_DC_MAX_POWER = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; //W -1000000 - 0 //Fastcharger info, not needed for BE break; case 0x3F4: //MysteryVan 50/75kWh platform (Temperature sensors) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; @@ -306,27 +308,105 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { break; case 0x353: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_COP_VOLTAGE = + (rx_frame.data.u8[1] << 5) | (rx_frame.data.u8[2] >> 3); //Real voltage HV battery (dV, 0-5000) + HV_BATT_COP_CURRENT = + (rx_frame.data.u8[3] << 5) | (rx_frame.data.u8[4] >> 3); //High resolution battery current (dA, -4000 - 4000) + CHECKSUM_FRAME_353 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xB + COUNTER_353 = (rx_frame.data.u8[0] & 0x0F); break; case 0x474: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + BMS_DC_RELAY_MES_EVSE_VOLTAGE = (rx_frame.data.u8[1] << 6) | (rx_frame.data.u8[2] >> 2); //V 0-1000 + FAST_CHARGE_CONTACTOR_STATE = (rx_frame.data.u8[2] & 0x03); + /*00: Contactors Opened + 01: Contactors Closed + 10: No Request + 11: WELDING TEST*/ + BMS_FASTCHARGE_STATUS = (rx_frame.data.u8[4] & 0x03); + /*00 : not charging + 01 : charging + 10 : charging fault + 11 : charging finished*/ + CHECKSUM_FRAME_474 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0xF + COUNTER_474 = (rx_frame.data.u8[0] & 0x0F); break; case 0x574: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_FC_INSU_MINUS_RES = (rx_frame.data.u8[0] << 5) | (rx_frame.data.u8[1] >> 3); //kOhm (0-60000) + HV_BATT_FC_VHL_INSU_PLUS_RES = + ((rx_frame.data.u8[1] & 0x07) << 10) | (rx_frame.data.u8[2] << 2) | ((rx_frame.data.u8[3] & 0xC0) >> 6); + HV_BATT_FC_INSU_PLUS_RES = (rx_frame.data.u8[5] << 4) | (rx_frame.data.u8[6] >> 4); + HV_BATT_ONLY_INSU_MINUS_RES = ((rx_frame.data.u8[3] & 0x3F) << 7) | (rx_frame.data.u8[4] >> 1); break; - case 0x583: //MysteryVan 50/75kWh platform + case 0x583: //MysteryVan 50/75kWh platform (CAN-FD also?) datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + ALERT_OVERCHARGE = (rx_frame.data.u8[4] & 0x20) >> 5; + NUMBER_PROBE_TEMP_MAX = rx_frame.data.u8[0]; + NUMBER_PROBE_TEMP_MIN = rx_frame.data.u8[1]; + TEMPERATURE_MINIMUM_C = rx_frame.data.u8[2] - 40; + ALERT_BATT = (rx_frame.data.u8[3] & 0x80) >> 7; + ALERT_TEMP_DIFF = (rx_frame.data.u8[3] & 0x40) >> 6; + ALERT_HIGH_TEMP = (rx_frame.data.u8[3] & 0x20) >> 5; + ALERT_OVERVOLTAGE = (rx_frame.data.u8[3] & 0x10) >> 4; + ALERT_LOW_SOC = (rx_frame.data.u8[3] & 0x08) >> 3; + ALERT_HIGH_SOC = (rx_frame.data.u8[3] & 0x04) >> 2; + ALERT_CELL_OVERVOLTAGE = (rx_frame.data.u8[3] & 0x02) >> 1; + ALERT_CELL_UNDERVOLTAGE = (rx_frame.data.u8[3] & 0x01); + ALERT_SOC_JUMP = (rx_frame.data.u8[4] & 0x80) >> 7; + ALERT_CELL_POOR_CONSIST = (rx_frame.data.u8[4] & 0x40) >> 6; + CONTACTOR_OPENING_REASON = (rx_frame.data.u8[4] & 0x1C) >> 2; + /* + 000 : Not error + 001 : Crash + 010 : 12V supply source undervoltage + 011 : 12V supply source overvoltage + 100 : Battery temperature + 101 : interlock line open + 110 : e-Service plug disconnected + 111 : Not valid + */ + NUMBER_OF_TEMPERATURE_SENSORS_IN_BATTERY = rx_frame.data.u8[5]; + NUMBER_OF_CELL_MEASUREMENTS_IN_BATTERY = rx_frame.data.u8[6]; + break; case 0x314: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + MIN_ALLOW_DISCHRG_VOLTAGE = (rx_frame.data.u8[1] << 3) | (rx_frame.data.u8[2] >> 5); //V (0-1000) + //EVSE_DC_MAX_CURRENT = ((rx_frame.data.u8[2] & 0x1F) << 5) | (rx_frame.data.u8[3] >> 3); //Fastcharger info, not needed for BE + //TBMU_EVSE_DC_MAX_VOLTAGE //Fastcharger info, not needed for BE + //TBMU_MAX_CHRG_SCKT_TEMP //Fastcharger info, not needed for BE + //DC_CHARGE_MODE_AVAIL //Fastcharger info, not needed for BE + //BIDIR_V2HG_MODE_AVAIL //Fastcharger info, not needed for BE + //TBMU_CHRG_CONN_CONF //Fastcharger info, not needed for BE + //EVSE_GRID_FAULT //Fastcharger info, not needed for BE + CHECKSUM_FRAME_314 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0x8 + COUNTER_314 = (rx_frame.data.u8[0] & 0x0F); break; case 0x254: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + //HV_BATT_SOE_MAX_HR = frame6 & frame7 //Only on FD-CAN variant of the message. FD has length 7, non-fd 5 + HV_BATT_NOMINAL_DISCH_CURR_HD = (rx_frame.data.u8[0] << 7) | (rx_frame.data.u8[1] >> 1); //dA (0-20000) + HV_BATT_PEAK_DISCH_CURR_HD = (rx_frame.data.u8[2] << 7) | (rx_frame.data.u8[3] >> 1); //dA (0-20000) + HV_BATT_STABLE_DISCH_CURR_HD = (rx_frame.data.u8[4] << 7) | (rx_frame.data.u8[5] >> 1); //dA (0-20000) break; case 0x2B4: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_NOMINAL_CHARGE_CURR_HD = (rx_frame.data.u8[0] << 7) | (rx_frame.data.u8[1] >> 1); + HV_BATT_PEAK_CHARGE_CURR_HD = (rx_frame.data.u8[2] << 7) | (rx_frame.data.u8[3] >> 1); + HV_BATT_STABLE_CHARGE_CURR_HD = (rx_frame.data.u8[4] << 7) | (rx_frame.data.u8[5] >> 1); break; case 0x4D4: //MysteryVan 50/75kWh platform datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; + HV_BATT_STABLE_CHARGE_POWER_HD = (rx_frame.data.u8[0] << 6) | (rx_frame.data.u8[1] >> 2); + HV_BATT_STABLE_DISCH_POWER_HD = + ((rx_frame.data.u8[2] & 0x03) << 12) | (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); + HV_BATT_NOMINAL_DISCH_POWER_HD = + ((rx_frame.data.u8[4] & 0x0F) << 10) | (rx_frame.data.u8[5] << 2) | ((rx_frame.data.u8[6] & 0xC0) >> 6); + MAX_ALLOW_DISCHRG_CURRENT = ((rx_frame.data.u8[6] & 0x3F) << 5) | (rx_frame.data.u8[7] >> 3); + RC01_PERM_SYNTH_TBMU = (rx_frame.data.u8[7] & 0x04) >> 2; //TBMU Readiness Code synthesis + CHECKSUM_FRAME_4D4 = (rx_frame.data.u8[0] & 0xF0) >> 4; //Frame checksum 0x5 + COUNTER_4D4 = (rx_frame.data.u8[0] & 0x0F); break; case 0x125: //Common eCMP datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; diff --git a/Software/src/battery/ECMP-BATTERY.h b/Software/src/battery/ECMP-BATTERY.h index 59f4d9f4..9a5ad7e1 100644 --- a/Software/src/battery/ECMP-BATTERY.h +++ b/Software/src/battery/ECMP-BATTERY.h @@ -141,15 +141,12 @@ class EcmpBattery : public CanBattery { uint8_t EVSE_STATE = 0; uint16_t HV_BATT_SOE_HD = 0; uint16_t HV_BATT_SOE_MAX = 0; - uint8_t CHECKSUM_FRAME_3B4, CHECKSUM_FRAME_554, CHECKSUM_FRAME_373, CHECKSUM_FRAME_4F4, CHECKSUM_FRAME_414 = 0; - uint16_t TBMU_EVSE_DC_MAX_POWER = 0; + uint8_t CHECKSUM_FRAME_314, CHECKSUM_FRAME_3B4, CHECKSUM_FRAME_554, CHECKSUM_FRAME_373, CHECKSUM_FRAME_4F4, + CHECKSUM_FRAME_414, CHECKSUM_FRAME_353, CHECKSUM_FRAME_474, CHECKSUM_FRAME_4D4 = 0; uint16_t HV_STORAGE_MAX_I = 0; - uint8_t TBMU_EVSE_CHRG_REQ = 0; - uint16_t TBMU_EVSE_DC_MES_CURRENT = 0; - uint16_t TBMU_EVSE_DC_MIN_VOLTAGE = 0; - uint16_t TBMU_EVSE_DC_MES_VOLTAGE = 0; int8_t BMS_PROBETEMP[7] = {0}; - uint8_t COUNTER_554, COUNTER_373, COUNTER_3B4, COUNTER_4F4, COUNTER_414 = 0; + uint8_t COUNTER_314, COUNTER_554, COUNTER_373, COUNTER_3B4, COUNTER_4F4, COUNTER_414, COUNTER_353, COUNTER_474, + COUNTER_4D4 = 0; uint16_t HV_BATT_PEAK_DISCH_POWER_HD = 0; uint16_t HV_BATT_PEAK_CH_POWER_HD = 0; uint16_t HV_BATT_NOM_CH_POWER_HD = 0; @@ -175,6 +172,27 @@ class EcmpBattery : public CanBattery { uint16_t HV_BATT_REAL_POWER_HD = 0; uint16_t MAX_ALLOW_CHRG_POWER = 0; uint16_t MAX_ALLOW_DISCHRG_POWER = 0; + bool ALERT_CELL_POOR_CONSIST, ALERT_OVERCHARGE, ALERT_BATT, ALERT_LOW_SOC, ALERT_HIGH_SOC, ALERT_SOC_JUMP, + ALERT_TEMP_DIFF, ALERT_HIGH_TEMP, ALERT_OVERVOLTAGE, ALERT_CELL_OVERVOLTAGE, ALERT_CELL_UNDERVOLTAGE = false; + uint8_t NUMBER_PROBE_TEMP_MAX, NUMBER_PROBE_TEMP_MIN = 0; + int8_t TEMPERATURE_MINIMUM_C = 0; + uint8_t CONTACTOR_OPENING_REASON = 0; + uint8_t NUMBER_OF_TEMPERATURE_SENSORS_IN_BATTERY, NUMBER_OF_CELL_MEASUREMENTS_IN_BATTERY = 0; + uint16_t HV_BATT_COP_VOLTAGE = 0; + int16_t HV_BATT_COP_CURRENT = 0; + uint16_t BMS_DC_RELAY_MES_EVSE_VOLTAGE = 0; + uint8_t FAST_CHARGE_CONTACTOR_STATE = 0; + uint8_t BMS_FASTCHARGE_STATUS = 0; + uint16_t HV_BATT_FC_INSU_MINUS_RES, HV_BATT_FC_INSU_PLUS_RES, HV_BATT_FC_VHL_INSU_PLUS_RES, + HV_BATT_ONLY_INSU_MINUS_RES = 0; + uint16_t MIN_ALLOW_DISCHRG_VOLTAGE = 0; + uint16_t HV_BATT_NOMINAL_DISCH_CURR_HD, HV_BATT_PEAK_DISCH_CURR_HD, HV_BATT_STABLE_DISCH_CURR_HD = 0; + uint16_t HV_BATT_NOMINAL_CHARGE_CURR_HD, HV_BATT_PEAK_CHARGE_CURR_HD, HV_BATT_STABLE_CHARGE_CURR_HD = 0; + bool RC01_PERM_SYNTH_TBMU = false; + uint16_t HV_BATT_STABLE_CHARGE_POWER_HD = 0; + uint16_t HV_BATT_STABLE_DISCH_POWER_HD = 0; + uint16_t HV_BATT_NOMINAL_DISCH_POWER_HD = 0; + uint16_t MAX_ALLOW_DISCHRG_CURRENT = 0; 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 From 30a7b9d90e0a5e9f881cce82412a3f43b0e962ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sun, 7 Sep 2025 20:14:38 +0300 Subject: [PATCH 5/8] Add notes on CAN sending --- Software/src/battery/ECMP-BATTERY.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index ab7f8c91..16f276ac 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -5,8 +5,27 @@ #include "../devboard/utils/events.h" /* TODO: -This integration is still ongoing. Here is what still needs to be done in order to use this battery type -- Disable the isolation resistance requirement that opens contactors after 30s under load. Factory mode? +This integration is still ongoing. The same integration can be used on multiple variants of the Stellantis platforms +- eCMP: Disable the isolation resistance requirement that opens contactors after 30s under load. Factory mode? + +- MysteryVan: Map more values from constantly transmitted instead of PID +- ADD CAN sending towards the battery (CAN-logs of full vehicle wanted!) + - Following CAN messages need to be sent towards it: + - VCU: 4C9 , 565 , 398, 448, 458, 4F1 , 342, 3E2 , 402 , 422 , 482 4D1 + - CMM: 478 , 558, 1A8, 4B8 1F8 498 4E8 + - OBC: 531 441 541 551 3C1 + - BSIInfo_382 + - VCU_BSI_Wakeup_27A + - V2_BSI_552 + - CRASH_4C8 + - EVSE plug in (optional): 108, 109, 119 + - CRASH_4C8 + - CRNT_SENS_095 + - MCU 526 + - JDD 55F NEW + +- STLA medium: Everything missing +- ADD CAN sending towards the battery (CAN-logs of full vehicle wanted!) */ /* Do not change code below unless you are sure what you are doing */ From fd2e5f2e524c2183bc5f9d58f7b5a54ef1eb1396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Thu, 11 Sep 2025 21:30:56 +0300 Subject: [PATCH 6/8] Add start for MysteryVan More Info page --- Software/src/battery/ECMP-BATTERY.cpp | 9 ++++ Software/src/battery/ECMP-HTML.h | 52 +++++++++++++++++++++ Software/src/datalayer/datalayer_extended.h | 8 ++++ 3 files changed, 69 insertions(+) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index 16f276ac..b2532f49 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -191,6 +191,15 @@ void EcmpBattery::update_values() { 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; + // Update extended datalayer for MysteryVan + datalayer_extended.stellantisECMP.MysteryVan = MysteryVan; + datalayer_extended.stellantisECMP.CrashMemorized = HV_BATT_CRASH_MEMORIZED; + datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON = CONTACTOR_OPENING_REASON; + datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE = TBMU_FAULT_TYPE; + datalayer_extended.stellantisECMP.HV_BATT_FC_INSU_MINUS_RES = HV_BATT_FC_INSU_MINUS_RES; + datalayer_extended.stellantisECMP.HV_BATT_FC_INSU_PLUS_RES = HV_BATT_FC_INSU_PLUS_RES; + datalayer_extended.stellantisECMP.HV_BATT_FC_VHL_INSU_PLUS_RES = HV_BATT_FC_VHL_INSU_PLUS_RES; + datalayer_extended.stellantisECMP.HV_BATT_ONLY_INSU_MINUS_RES = HV_BATT_ONLY_INSU_MINUS_RES; if (battery_InterlockOpen) { set_event(EVENT_HVIL_FAILURE, 0); diff --git a/Software/src/battery/ECMP-HTML.h b/Software/src/battery/ECMP-HTML.h index 96bd56c6..2c2b6cd8 100644 --- a/Software/src/battery/ECMP-HTML.h +++ b/Software/src/battery/ECMP-HTML.h @@ -383,6 +383,58 @@ class EcmpHtmlRenderer : public BatteryHtmlRenderer { : String(datalayer_extended.stellantisECMP.pid_SOH_cell_1)) + ""; + if (datalayer_extended.stellantisECMP.MysteryVan) { + content += "

MysteryVan platform detected:

"; + content += "

Crash Memorized: "; + if (datalayer_extended.stellantisECMP.CrashMemorized == 255) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Contactor Opening Reason: "; + if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 0) { + content += "No error"; + } else if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 1) { + content += "Crash!"; + } else if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 2) { + content += "12V supply source undervoltage"; + } else if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 3) { + content += "12V supply source overvoltage"; + } else if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 4) { + content += "Battery temperature"; + } else if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 5) { + content += "Interlock line open"; + } else if (datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON == 6) { + content += "e-Service plug disconnected"; + } + content += "

"; + content += "

Battery fault type: "; + if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 0) { + content += "No fault"; + } else if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 1) { + content += "FirstLevelFault: Warning Lamp"; + } else if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 2) { + content += "SecondLevelFault: Stop Lamp"; + } else if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 3) { + content += "ThirdLevelFault: Stop Lamp + contactor opening (EPS shutdown)"; + } else if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 4) { + content += "FourthLevelFault: Stop Lamp + Active Discharge"; + } else if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 5) { + content += "Inhibition of powertrain activation"; + } else if (datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE == 6) { + content += "Reserved"; + } + content += "

"; + content += "

FC insulation minus resistance " + + String(datalayer_extended.stellantisECMP.HV_BATT_FC_INSU_MINUS_RES) + " kOhm

"; + content += "

FC insulation plus resistance " + + String(datalayer_extended.stellantisECMP.HV_BATT_FC_INSU_PLUS_RES) + " kOhm

"; + content += "

FC vehicle insulation plus resistance " + + String(datalayer_extended.stellantisECMP.HV_BATT_FC_VHL_INSU_PLUS_RES) + " kOhm

"; + content += "

FC vehicle insulation plus resistance " + + String(datalayer_extended.stellantisECMP.HV_BATT_ONLY_INSU_MINUS_RES) + " kOhm

"; + } + return content; } }; diff --git a/Software/src/datalayer/datalayer_extended.h b/Software/src/datalayer/datalayer_extended.h index b982e10f..5756a05a 100644 --- a/Software/src/datalayer/datalayer_extended.h +++ b/Software/src/datalayer/datalayer_extended.h @@ -235,6 +235,14 @@ struct DATALAYER_INFO_CMFAEV { }; struct DATALAYER_INFO_ECMP { + //mysteryvan parameters + bool MysteryVan = false; + bool CrashMemorized = false; + uint8_t CONTACTOR_OPENING_REASON = 0; + uint8_t TBMU_FAULT_TYPE = 0; + uint16_t HV_BATT_FC_INSU_MINUS_RES, HV_BATT_FC_INSU_PLUS_RES, HV_BATT_FC_VHL_INSU_PLUS_RES, + HV_BATT_ONLY_INSU_MINUS_RES = 0; + //ecmp below uint8_t MainConnectorState = 0; uint16_t InsulationResistance = 0; uint8_t InsulationDiag = 0; From 29e6f52c4cac1f386f43433390e65bad21d08a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Thu, 11 Sep 2025 23:05:06 +0300 Subject: [PATCH 7/8] Add alerts to more battery info page --- Software/src/battery/ECMP-BATTERY.cpp | 12 ++++ Software/src/battery/ECMP-HTML.h | 71 ++++++++++++++++++++- Software/src/datalayer/datalayer_extended.h | 2 + 3 files changed, 82 insertions(+), 3 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index b2532f49..eb47aff9 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -200,6 +200,18 @@ void EcmpBattery::update_values() { datalayer_extended.stellantisECMP.HV_BATT_FC_INSU_PLUS_RES = HV_BATT_FC_INSU_PLUS_RES; datalayer_extended.stellantisECMP.HV_BATT_FC_VHL_INSU_PLUS_RES = HV_BATT_FC_VHL_INSU_PLUS_RES; datalayer_extended.stellantisECMP.HV_BATT_ONLY_INSU_MINUS_RES = HV_BATT_ONLY_INSU_MINUS_RES; + datalayer_extended.stellantisECMP.HV_BATT_ONLY_INSU_MINUS_RES = HV_BATT_ONLY_INSU_MINUS_RES; + datalayer_extended.stellantisECMP.ALERT_CELL_POOR_CONSIST = ALERT_CELL_POOR_CONSIST; + datalayer_extended.stellantisECMP.ALERT_OVERCHARGE = ALERT_OVERCHARGE; + datalayer_extended.stellantisECMP.ALERT_BATT = ALERT_BATT; + datalayer_extended.stellantisECMP.ALERT_LOW_SOC = ALERT_LOW_SOC; + datalayer_extended.stellantisECMP.ALERT_HIGH_SOC = ALERT_HIGH_SOC; + datalayer_extended.stellantisECMP.ALERT_SOC_JUMP = ALERT_SOC_JUMP; + datalayer_extended.stellantisECMP.ALERT_TEMP_DIFF = ALERT_TEMP_DIFF; + datalayer_extended.stellantisECMP.ALERT_HIGH_TEMP = ALERT_HIGH_TEMP; + datalayer_extended.stellantisECMP.ALERT_OVERVOLTAGE = ALERT_OVERVOLTAGE; + datalayer_extended.stellantisECMP.ALERT_CELL_OVERVOLTAGE = ALERT_CELL_OVERVOLTAGE; + datalayer_extended.stellantisECMP.ALERT_CELL_UNDERVOLTAGE = ALERT_CELL_UNDERVOLTAGE; if (battery_InterlockOpen) { set_event(EVENT_HVIL_FAILURE, 0); diff --git a/Software/src/battery/ECMP-HTML.h b/Software/src/battery/ECMP-HTML.h index 2c2b6cd8..4b8da671 100644 --- a/Software/src/battery/ECMP-HTML.h +++ b/Software/src/battery/ECMP-HTML.h @@ -384,9 +384,9 @@ class EcmpHtmlRenderer : public BatteryHtmlRenderer { ""; if (datalayer_extended.stellantisECMP.MysteryVan) { - content += "

MysteryVan platform detected:

"; + content += "

MysteryVan platform detected!

"; content += "

Crash Memorized: "; - if (datalayer_extended.stellantisECMP.CrashMemorized == 255) { + if (datalayer_extended.stellantisECMP.CrashMemorized) { content += "Yes

"; } else { content += "No"; @@ -434,7 +434,72 @@ class EcmpHtmlRenderer : public BatteryHtmlRenderer { content += "

FC vehicle insulation plus resistance " + String(datalayer_extended.stellantisECMP.HV_BATT_ONLY_INSU_MINUS_RES) + " kOhm

"; } - + content += "

Alert Battery: "; + if (datalayer_extended.stellantisECMP.ALERT_BATT) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Low SOC: "; + if (datalayer_extended.stellantisECMP.ALERT_LOW_SOC) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert High SOC: "; + if (datalayer_extended.stellantisECMP.ALERT_HIGH_SOC) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert SOC Jump: "; + if (datalayer_extended.stellantisECMP.ALERT_SOC_JUMP) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Overcharge: "; + if (datalayer_extended.stellantisECMP.ALERT_OVERCHARGE) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Temp Diff: "; + if (datalayer_extended.stellantisECMP.ALERT_TEMP_DIFF) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Temp High: "; + if (datalayer_extended.stellantisECMP.ALERT_HIGH_TEMP) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Overvoltage: "; + if (datalayer_extended.stellantisECMP.ALERT_OVERVOLTAGE) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Cell Overvoltage: "; + if (datalayer_extended.stellantisECMP.ALERT_CELL_OVERVOLTAGE) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Cell Undervoltage: "; + if (datalayer_extended.stellantisECMP.ALERT_CELL_UNDERVOLTAGE) { + content += "Yes

"; + } else { + content += "No"; + } + content += "

Alert Cell Poor Consistency: "; + if (datalayer_extended.stellantisECMP.ALERT_CELL_POOR_CONSIST) { + content += "Yes

"; + } else { + content += "No"; + } return content; } }; diff --git a/Software/src/datalayer/datalayer_extended.h b/Software/src/datalayer/datalayer_extended.h index 5756a05a..ebd6fbc3 100644 --- a/Software/src/datalayer/datalayer_extended.h +++ b/Software/src/datalayer/datalayer_extended.h @@ -242,6 +242,8 @@ struct DATALAYER_INFO_ECMP { uint8_t TBMU_FAULT_TYPE = 0; uint16_t HV_BATT_FC_INSU_MINUS_RES, HV_BATT_FC_INSU_PLUS_RES, HV_BATT_FC_VHL_INSU_PLUS_RES, HV_BATT_ONLY_INSU_MINUS_RES = 0; + bool ALERT_CELL_POOR_CONSIST, ALERT_OVERCHARGE, ALERT_BATT, ALERT_LOW_SOC, ALERT_HIGH_SOC, ALERT_SOC_JUMP, + ALERT_TEMP_DIFF, ALERT_HIGH_TEMP, ALERT_OVERVOLTAGE, ALERT_CELL_OVERVOLTAGE, ALERT_CELL_UNDERVOLTAGE = false; //ecmp below uint8_t MainConnectorState = 0; uint16_t InsulationResistance = 0; From 0aad11d9bc7c47a96fd0eca977856e419542dd91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Thu, 11 Sep 2025 23:27:15 +0300 Subject: [PATCH 8/8] Add contactor state to more battery info --- Software/src/battery/ECMP-BATTERY.cpp | 3 ++- Software/src/battery/ECMP-HTML.h | 11 ++++++++++- Software/src/datalayer/datalayer_extended.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Software/src/battery/ECMP-BATTERY.cpp b/Software/src/battery/ECMP-BATTERY.cpp index eb47aff9..ebcd0c27 100644 --- a/Software/src/battery/ECMP-BATTERY.cpp +++ b/Software/src/battery/ECMP-BATTERY.cpp @@ -193,6 +193,7 @@ void EcmpBattery::update_values() { datalayer_extended.stellantisECMP.pid_SOH_cell_1 = pid_SOH_cell_1; // Update extended datalayer for MysteryVan datalayer_extended.stellantisECMP.MysteryVan = MysteryVan; + datalayer_extended.stellantisECMP.CONTACTORS_STATE = CONTACTORS_STATE; datalayer_extended.stellantisECMP.CrashMemorized = HV_BATT_CRASH_MEMORIZED; datalayer_extended.stellantisECMP.CONTACTOR_OPENING_REASON = CONTACTOR_OPENING_REASON; datalayer_extended.stellantisECMP.TBMU_FAULT_TYPE = TBMU_FAULT_TYPE; @@ -268,7 +269,7 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) { //TBMU_EVSE_DC_MES_CURRENT = (rx_frame.data.u8[3] << 4) | ((rx_frame.data.u8[4] & 0xF0) >> 4); //A -2000 - 2000 //Fastcharger info, not needed for BE //TBMU_EVSE_CHRG_REQ = (rx_frame.data.u8[4] & 0x0C) >> 2; //00 No request, 01 Stop request //Fastcharger info, not needed for BE //HV_STORAGE_MAX_I = ((rx_frame.data.u8[4] & 0x03) << 12) | (rx_frame.data.u8[5] << 2) | //Fastcharger info, not needed for BE - ((rx_frame.data.u8[6] & 0xC0) >> 6); //A -2000 - 2000 + //((rx_frame.data.u8[6] & 0xC0) >> 6); //A -2000 - 2000 //TBMU_EVSE_DC_MAX_POWER = ((rx_frame.data.u8[6] & 0x3F) << 8) | rx_frame.data.u8[7]; //W -1000000 - 0 //Fastcharger info, not needed for BE break; case 0x3F4: //MysteryVan 50/75kWh platform (Temperature sensors) diff --git a/Software/src/battery/ECMP-HTML.h b/Software/src/battery/ECMP-HTML.h index 4b8da671..0b177feb 100644 --- a/Software/src/battery/ECMP-HTML.h +++ b/Software/src/battery/ECMP-HTML.h @@ -384,7 +384,16 @@ class EcmpHtmlRenderer : public BatteryHtmlRenderer { ""; if (datalayer_extended.stellantisECMP.MysteryVan) { - content += "

MysteryVan platform detected!

"; + content += "

MysteryVan platform detected!

"; + content += "

Contactor State: "; + if (datalayer_extended.stellantisECMP.CONTACTORS_STATE == 0) { + content += "Open"; + } else if (datalayer_extended.stellantisECMP.CONTACTORS_STATE == 1) { + content += "Precharge"; + } else if (datalayer_extended.stellantisECMP.CONTACTORS_STATE == 2) { + content += "Closed"; + } + content += "

"; content += "

Crash Memorized: "; if (datalayer_extended.stellantisECMP.CrashMemorized) { content += "Yes

"; diff --git a/Software/src/datalayer/datalayer_extended.h b/Software/src/datalayer/datalayer_extended.h index ebd6fbc3..07406f6f 100644 --- a/Software/src/datalayer/datalayer_extended.h +++ b/Software/src/datalayer/datalayer_extended.h @@ -240,6 +240,7 @@ struct DATALAYER_INFO_ECMP { bool CrashMemorized = false; uint8_t CONTACTOR_OPENING_REASON = 0; uint8_t TBMU_FAULT_TYPE = 0; + uint8_t CONTACTORS_STATE = 0; uint16_t HV_BATT_FC_INSU_MINUS_RES, HV_BATT_FC_INSU_PLUS_RES, HV_BATT_FC_VHL_INSU_PLUS_RES, HV_BATT_ONLY_INSU_MINUS_RES = 0; bool ALERT_CELL_POOR_CONSIST, ALERT_OVERCHARGE, ALERT_BATT, ALERT_LOW_SOC, ALERT_HIGH_SOC, ALERT_SOC_JUMP,