mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Change default state of bms_Status to INACTIVE and only switch to ACTIVE upon reception of SOC from battery.
- Change default state of bms_Status to INACTIVE - switch to ACTIVE upon reception of SOC from battery. - Do not change bms_mode to ACTIVE upon reception of info/warning/debug event. - Reset bms_mode to INACTIVE and CAN_battery_still_alive when resetting all events
This commit is contained in:
parent
dccfca17ea
commit
f6c73e9481
26 changed files with 61 additions and 2 deletions
|
@ -522,6 +522,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
battery_request_open_contactors_fast = (rx_frame.data.u8[6] & 0x0C) >> 2;
|
battery_request_open_contactors_fast = (rx_frame.data.u8[6] & 0x0C) >> 2;
|
||||||
battery_charging_condition_delta = (rx_frame.data.u8[6] & 0xF0) >> 4;
|
battery_charging_condition_delta = (rx_frame.data.u8[6] & 0xF0) >> 4;
|
||||||
battery_DC_link_voltage = rx_frame.data.u8[7];
|
battery_DC_link_voltage = rx_frame.data.u8[7];
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x1FA: //BMS [1000ms] Status Of High-Voltage Battery - 1
|
case 0x1FA: //BMS [1000ms] Status Of High-Voltage Battery - 1
|
||||||
battery_status_error_isolation_external_Bordnetz = (rx_frame.data.u8[0] & 0x03);
|
battery_status_error_isolation_external_Bordnetz = (rx_frame.data.u8[0] & 0x03);
|
||||||
|
@ -702,6 +704,8 @@ void handle_incoming_can_frame_battery2(CAN_frame rx_frame) {
|
||||||
battery2_request_open_contactors_fast = (rx_frame.data.u8[6] & 0x0C) >> 2;
|
battery2_request_open_contactors_fast = (rx_frame.data.u8[6] & 0x0C) >> 2;
|
||||||
battery2_charging_condition_delta = (rx_frame.data.u8[6] & 0xF0) >> 4;
|
battery2_charging_condition_delta = (rx_frame.data.u8[6] & 0xF0) >> 4;
|
||||||
battery2_DC_link_voltage = rx_frame.data.u8[7];
|
battery2_DC_link_voltage = rx_frame.data.u8[7];
|
||||||
|
if (datalayer.battery2.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery2.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x1FA: //BMS [1000ms] Status Of High-Voltage Battery - 1
|
case 0x1FA: //BMS [1000ms] Status Of High-Voltage Battery - 1
|
||||||
battery2_status_error_isolation_external_Bordnetz = (rx_frame.data.u8[0] & 0x03);
|
battery2_status_error_isolation_external_Bordnetz = (rx_frame.data.u8[0] & 0x03);
|
||||||
|
|
|
@ -614,6 +614,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
min_soc_state = (rx_frame.data.u8[8] << 8 | rx_frame.data.u8[9]);
|
min_soc_state = (rx_frame.data.u8[8] << 8 | rx_frame.data.u8[9]);
|
||||||
avg_soc_state = (rx_frame.data.u8[6] << 8 | rx_frame.data.u8[7]);
|
avg_soc_state = (rx_frame.data.u8[6] << 8 | rx_frame.data.u8[7]);
|
||||||
max_soc_state = (rx_frame.data.u8[10] << 8 | rx_frame.data.u8[11]);
|
max_soc_state = (rx_frame.data.u8[10] << 8 | rx_frame.data.u8[11]);
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rx_frame.DLC =
|
if (rx_frame.DLC =
|
||||||
|
|
|
@ -252,6 +252,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
battery_highprecision_SOC = ((rx_frame.data.u8[5] & 0x0F) << 8) | rx_frame.data.u8[4]; // 03 E0 = 992 = 99.2%
|
battery_highprecision_SOC = ((rx_frame.data.u8[5] & 0x0F) << 8) | rx_frame.data.u8[4]; // 03 E0 = 992 = 99.2%
|
||||||
battery_lowest_temperature = (rx_frame.data.u8[1] - 40); //Best guess for now
|
battery_lowest_temperature = (rx_frame.data.u8[1] - 40); //Best guess for now
|
||||||
battery_highest_temperature = (rx_frame.data.u8[3] - 40); //Best guess for now
|
battery_highest_temperature = (rx_frame.data.u8[3] - 40); //Best guess for now
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x47B: //01,FF,FF,FF,FF,FF,FF,FF - Static, values never changes between logs
|
case 0x47B: //01,FF,FF,FF,FF,FF,FF,FF - Static, values never changes between logs
|
||||||
break;
|
break;
|
||||||
|
@ -564,6 +566,8 @@ void handle_incoming_can_frame_battery2(CAN_frame rx_frame) {
|
||||||
battery2_highprecision_SOC = ((rx_frame.data.u8[5] & 0x0F) << 8) | rx_frame.data.u8[4]; // 03 E0 = 992 = 99.2%
|
battery2_highprecision_SOC = ((rx_frame.data.u8[5] & 0x0F) << 8) | rx_frame.data.u8[4]; // 03 E0 = 992 = 99.2%
|
||||||
battery2_lowest_temperature = (rx_frame.data.u8[1] - 40); //Best guess for now
|
battery2_lowest_temperature = (rx_frame.data.u8[1] - 40); //Best guess for now
|
||||||
battery2_highest_temperature = (rx_frame.data.u8[3] - 40); //Best guess for now
|
battery2_highest_temperature = (rx_frame.data.u8[3] - 40); //Best guess for now
|
||||||
|
if (datalayer.battery2.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery2.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x47B: //01,FF,FF,FF,FF,FF,FF,FF - Static, values never changes between logs
|
case 0x47B: //01,FF,FF,FF,FF,FF,FF,FF - Static, values never changes between logs
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -245,6 +245,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
battery_SOH_percentage = (uint8_t)rx_frame.data.u8[4];
|
battery_SOH_percentage = (uint8_t)rx_frame.data.u8[4];
|
||||||
battery_SOC_percentage = (uint8_t)rx_frame.data.u8[5];
|
battery_SOC_percentage = (uint8_t)rx_frame.data.u8[5];
|
||||||
battery_remaining_dAh = (uint16_t)((rx_frame.data.u8[7] << 8) | rx_frame.data.u8[6]);
|
battery_remaining_dAh = (uint16_t)((rx_frame.data.u8[7] << 8) | rx_frame.data.u8[6]);
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x3A4: //PDO3_TX - 200ms
|
case 0x3A4: //PDO3_TX - 200ms
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
|
|
@ -396,6 +396,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
|
|
||||||
datalayer.battery.status.CAN_battery_still_alive =
|
datalayer.battery.status.CAN_battery_still_alive =
|
||||||
CAN_STILL_ALIVE; //We are getting CAN messages from the vehicle, inform the watchdog
|
CAN_STILL_ALIVE; //We are getting CAN messages from the vehicle, inform the watchdog
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
|
|
||||||
switch (rx_frame.ID) {
|
switch (rx_frame.ID) {
|
||||||
case 0x100:
|
case 0x100:
|
||||||
|
|
|
@ -153,6 +153,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
BMU_Current = ((((((rx_frame.data.u8[2] * 256.0) + rx_frame.data.u8[3])) - 32768)) * 0.01);
|
BMU_Current = ((((((rx_frame.data.u8[2] * 256.0) + rx_frame.data.u8[3])) - 32768)) * 0.01);
|
||||||
BMU_PackVoltage = ((rx_frame.data.u8[4] * 256.0 + rx_frame.data.u8[5]) * 0.1);
|
BMU_PackVoltage = ((rx_frame.data.u8[4] * 256.0 + rx_frame.data.u8[5]) * 0.1);
|
||||||
BMU_Power = (BMU_Current * BMU_PackVoltage);
|
BMU_Power = (BMU_Current * BMU_PackVoltage);
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x6e1: //BMU message, 25ms - Battery temperatures and voltages
|
case 0x6e1: //BMU message, 25ms - Battery temperatures and voltages
|
||||||
case 0x6e2:
|
case 0x6e2:
|
||||||
|
|
|
@ -134,6 +134,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
HVBatteryContactorStatus = ((rx_frame.data.u8[0] & 0x80) >> 7);
|
HVBatteryContactorStatus = ((rx_frame.data.u8[0] & 0x80) >> 7);
|
||||||
HVBattHVILError = ((rx_frame.data.u8[0] & 0x40) >> 6);
|
HVBattHVILError = ((rx_frame.data.u8[0] & 0x40) >> 6);
|
||||||
HVILBattIsolationError = ((rx_frame.data.u8[0] & 0x20) >> 5);
|
HVILBattIsolationError = ((rx_frame.data.u8[0] & 0x20) >> 5);
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x100:
|
case 0x100:
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
|
|
@ -820,6 +820,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
allowedDischargePower = ((rx_frame.data.u8[5] << 8) + rx_frame.data.u8[6]);
|
allowedDischargePower = ((rx_frame.data.u8[5] << 8) + rx_frame.data.u8[6]);
|
||||||
SOC_BMS = rx_frame.data.u8[2] * 5; //100% = 200 ( 200 * 5 = 1000 )
|
SOC_BMS = rx_frame.data.u8[2] * 5; //100% = 200 ( 200 * 5 = 1000 )
|
||||||
|
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
} else if (poll_data_pid == 2) {
|
} else if (poll_data_pid == 2) {
|
||||||
// set cell voltages data, start bite, data length from start, start cell
|
// set cell voltages data, start bite, data length from start, start cell
|
||||||
set_cell_voltages(rx_frame, 2, 6, 0);
|
set_cell_voltages(rx_frame, 2, 6, 0);
|
||||||
|
|
|
@ -229,6 +229,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
startedUp = true;
|
startedUp = true;
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
SOC_Display = rx_frame.data.u8[0] * 5; //100% = 200 ( 200 * 5 = 1000 )
|
SOC_Display = rx_frame.data.u8[0] * 5; //100% = 200 ( 200 * 5 = 1000 )
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x594:
|
case 0x594:
|
||||||
startedUp = true;
|
startedUp = true;
|
||||||
|
|
|
@ -117,6 +117,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
available_charge_power = ((rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]);
|
available_charge_power = ((rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]);
|
||||||
available_discharge_power = ((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]);
|
available_discharge_power = ((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]);
|
||||||
battery_current_high_byte = rx_frame.data.u8[7];
|
battery_current_high_byte = rx_frame.data.u8[7];
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
} else if (poll_data_pid == 2) { //21 02
|
} else if (poll_data_pid == 2) { //21 02
|
||||||
cellvoltages_mv[0] = (rx_frame.data.u8[2] * 20);
|
cellvoltages_mv[0] = (rx_frame.data.u8[2] * 20);
|
||||||
cellvoltages_mv[1] = (rx_frame.data.u8[3] * 20);
|
cellvoltages_mv[1] = (rx_frame.data.u8[3] * 20);
|
||||||
|
|
|
@ -49,6 +49,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
switch (rx_frame.ID) {
|
switch (rx_frame.ID) {
|
||||||
case 0x171: //Following messages were detected on a MG5 battery BMS
|
case 0x171: //Following messages were detected on a MG5 battery BMS
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; // Let system know battery is sending CAN
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; // Let system know battery is sending CAN
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x172:
|
case 0x172:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -567,6 +567,8 @@ void handle_incoming_can_frame_battery2(CAN_frame rx_frame) {
|
||||||
if (battery2_TEMP != 0) {
|
if (battery2_TEMP != 0) {
|
||||||
battery2_StateOfHealth = battery2_TEMP; //Collect state of health from battery
|
battery2_StateOfHealth = battery2_TEMP; //Collect state of health from battery
|
||||||
}
|
}
|
||||||
|
if (datalayer.battery2.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery2.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x5C0:
|
case 0x5C0:
|
||||||
//This temperature only works for 2013-2017 AZE0 LEAF packs, the mux is different on other generations
|
//This temperature only works for 2013-2017 AZE0 LEAF packs, the mux is different on other generations
|
||||||
|
@ -810,6 +812,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
if (battery_TEMP != 0) {
|
if (battery_TEMP != 0) {
|
||||||
battery_StateOfHealth = (uint8_t)battery_TEMP; //Collect state of health from battery
|
battery_StateOfHealth = (uint8_t)battery_TEMP; //Collect state of health from battery
|
||||||
}
|
}
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x5C0:
|
case 0x5C0:
|
||||||
//This temperature only works for 2013-2017 AZE0 LEAF packs, the mux is different on other generations
|
//This temperature only works for 2013-2017 AZE0 LEAF packs, the mux is different on other generations
|
||||||
|
|
|
@ -103,6 +103,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
current_dA = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[2]) - 30000;
|
current_dA = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[2]) - 30000;
|
||||||
SOC = rx_frame.data.u8[6];
|
SOC = rx_frame.data.u8[6];
|
||||||
SOH = rx_frame.data.u8[7];
|
SOH = rx_frame.data.u8[7];
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x4220:
|
case 0x4220:
|
||||||
case 0x4221:
|
case 0x4221:
|
||||||
|
|
|
@ -244,6 +244,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
WakeUpThermalReq = ((rx_frame.data.u8[6] & 0x08) >> 3);
|
WakeUpThermalReq = ((rx_frame.data.u8[6] & 0x08) >> 3);
|
||||||
WakeUpDchReq = ((rx_frame.data.u8[6] & 0x10) >> 4);
|
WakeUpDchReq = ((rx_frame.data.u8[6] & 0x10) >> 4);
|
||||||
StateofHealth = (((rx_frame.data.u8[6] & 0x03) << 8) | rx_frame.data.u8[7]);
|
StateofHealth = (((rx_frame.data.u8[6] & 0x03) << 8) | rx_frame.data.u8[7]);
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x308: // 190ms
|
case 0x308: // 190ms
|
||||||
EstimatedLossChg = (((rx_frame.data.u8[0] & 0x03) << 8) | rx_frame.data.u8[1]);
|
EstimatedLossChg = (((rx_frame.data.u8[0] & 0x03) << 8) | rx_frame.data.u8[1]);
|
||||||
|
|
|
@ -146,6 +146,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
LB_MaxChargeAllowed_W = (rx_frame.data.u8[0] * 300);
|
LB_MaxChargeAllowed_W = (rx_frame.data.u8[0] * 300);
|
||||||
LB_Current = word((rx_frame.data.u8[1] & 0xF), rx_frame.data.u8[2]) * 0.25 - 500; //OK!
|
LB_Current = word((rx_frame.data.u8[1] & 0xF), rx_frame.data.u8[2]) * 0.25 - 500; //OK!
|
||||||
LB_SOC = ((rx_frame.data.u8[4] << 8) | (rx_frame.data.u8[5])) * 0.0025; //OK!
|
LB_SOC = ((rx_frame.data.u8[4] << 8) | (rx_frame.data.u8[5])) * 0.0025; //OK!
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x424: //BMS2
|
case 0x424: //BMS2
|
||||||
datalayer.battery.status.CAN_battery_still_alive =
|
datalayer.battery.status.CAN_battery_still_alive =
|
||||||
|
|
|
@ -77,6 +77,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
|
|
||||||
// SOC is encoded as 16 bit integer with SOC% = value / 400
|
// SOC is encoded as 16 bit integer with SOC% = value / 400
|
||||||
SOC = (((uint16_t)rx_frame.data.u8[4] << 8) | (uint16_t)rx_frame.data.u8[5]) / 4;
|
SOC = (((uint16_t)rx_frame.data.u8[4] << 8) | (uint16_t)rx_frame.data.u8[5]) / 4;
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x424:
|
case 0x424:
|
||||||
max_recup_power = rx_frame.data.u8[2] * 500;
|
max_recup_power = rx_frame.data.u8[2] * 500;
|
||||||
|
|
|
@ -180,6 +180,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
case 0x654: //SOC
|
case 0x654: //SOC
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
LB_SOC = rx_frame.data.u8[3];
|
LB_SOC = rx_frame.data.u8[3];
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x658: //SOH - NOTE: Not present on 41kWh battery! (Is this message on 21kWh?)
|
case 0x658: //SOH - NOTE: Not present on 41kWh battery! (Is this message on 21kWh?)
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
|
|
@ -228,6 +228,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
switch (reply_poll) {
|
switch (reply_poll) {
|
||||||
case POLL_SOC:
|
case POLL_SOC:
|
||||||
battery_soc = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
battery_soc = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case POLL_USABLE_SOC:
|
case POLL_USABLE_SOC:
|
||||||
battery_usable_soc = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
battery_usable_soc = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
|
|
@ -196,6 +196,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
battery_usage_capacity = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
|
battery_usage_capacity = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
|
||||||
battery_capacity_percentage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
battery_capacity_percentage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
||||||
charging_capacity = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
charging_capacity = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
} else if (mux == 0x05) { //Recovery / capacity
|
} else if (mux == 0x05) { //Recovery / capacity
|
||||||
charging_recovery_voltage = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
|
charging_recovery_voltage = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
|
||||||
discharging_recovery_voltage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
discharging_recovery_voltage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
||||||
|
|
|
@ -134,6 +134,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
case 0x542:
|
case 0x542:
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
SOC_Display = ((rx_frame.data.u8[1] << 8) + rx_frame.data.u8[0]) / 2;
|
SOC_Display = ((rx_frame.data.u8[1] << 8) + rx_frame.data.u8[0]) / 2;
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x588:
|
case 0x588:
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
@ -444,6 +446,8 @@ void handle_incoming_can_frame_battery2(CAN_frame rx_frame) {
|
||||||
case 0x542:
|
case 0x542:
|
||||||
datalayer.battery2.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery2.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
battery2_SOC_Display = ((rx_frame.data.u8[1] << 8) + rx_frame.data.u8[0]) / 2;
|
battery2_SOC_Display = ((rx_frame.data.u8[1] << 8) + rx_frame.data.u8[0]) / 2;
|
||||||
|
if (datalayer.battery2.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery2.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x588:
|
case 0x588:
|
||||||
datalayer.battery2.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery2.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
|
|
@ -54,6 +54,9 @@ void __getData() {
|
||||||
if (_system_bms_status == FAULT) {
|
if (_system_bms_status == FAULT) {
|
||||||
batteryFault = true;
|
batteryFault = true;
|
||||||
set_event(EVENT_SERIAL_TRANSMITTER_FAILURE, 0);
|
set_event(EVENT_SERIAL_TRANSMITTER_FAILURE, 0);
|
||||||
|
} else {
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1532,6 +1532,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
((rx_frame.data.u8[4] << 2) | ((rx_frame.data.u8[3] & 0xC0) >> 6)); //30|10@1+ (0.1,0) [0|102.3] "%"
|
((rx_frame.data.u8[4] << 2) | ((rx_frame.data.u8[3] & 0xC0) >> 6)); //30|10@1+ (0.1,0) [0|102.3] "%"
|
||||||
battery_battTempPct =
|
battery_battTempPct =
|
||||||
(((rx_frame.data.u8[7] & 0x03) << 6) | (rx_frame.data.u8[6] & 0x3F) >> 2); //50|8@1+ (0.4,0) [0|100] "%"
|
(((rx_frame.data.u8[7] & 0x03) << 6) | (rx_frame.data.u8[6] & 0x3F) >> 2); //50|8@1+ (0.4,0) [0|100] "%"
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
break;
|
break;
|
||||||
case 0x392: //BMS_packConfig
|
case 0x392: //BMS_packConfig
|
||||||
mux = (rx_frame.data.u8[0] & (0xFF));
|
mux = (rx_frame.data.u8[0] & (0xFF));
|
||||||
|
|
|
@ -52,6 +52,8 @@ void update_values_battery() { /* This function puts fake values onto the parame
|
||||||
|
|
||||||
//Fake that we get CAN messages
|
//Fake that we get CAN messages
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
|
|
||||||
/*Finally print out values to serial if configured to do so*/
|
/*Finally print out values to serial if configured to do so*/
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
|
|
|
@ -225,6 +225,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
|
||||||
logging.println("SOC_BMS not valid");
|
logging.println("SOC_BMS not valid");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (datalayer.battery.status.bms_status == INACTIVE)
|
||||||
|
datalayer.battery.status.bms_status = ACTIVE;
|
||||||
|
|
||||||
if ((rx_frame.data.u8[0] & 0x04) == 0x04)
|
if ((rx_frame.data.u8[0] & 0x04) == 0x04)
|
||||||
CELL_U_MAX = ((rx_frame.data.u8[2] & 0x01) * 256 + rx_frame.data.u8[3]);
|
CELL_U_MAX = ((rx_frame.data.u8[2] & 0x01) * 256 + rx_frame.data.u8[3]);
|
||||||
|
|
|
@ -93,7 +93,7 @@ typedef struct {
|
||||||
|
|
||||||
/** Other */
|
/** Other */
|
||||||
/** The current BMS status */
|
/** The current BMS status */
|
||||||
bms_status_enum bms_status = ACTIVE;
|
bms_status_enum bms_status = INACTIVE;
|
||||||
} DATALAYER_BATTERY_STATUS_TYPE;
|
} DATALAYER_BATTERY_STATUS_TYPE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -255,6 +255,9 @@ void reset_all_events() {
|
||||||
events.entries[i].MQTTpublished = false; // Not published by default
|
events.entries[i].MQTTpublished = false; // Not published by default
|
||||||
}
|
}
|
||||||
events.level = EVENT_LEVEL_INFO;
|
events.level = EVENT_LEVEL_INFO;
|
||||||
|
|
||||||
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
datalayer.battery.status.bms_status = INACTIVE;
|
||||||
update_bms_status();
|
update_bms_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,7 +498,6 @@ static void update_bms_status(void) {
|
||||||
case EVENT_LEVEL_INFO:
|
case EVENT_LEVEL_INFO:
|
||||||
case EVENT_LEVEL_WARNING:
|
case EVENT_LEVEL_WARNING:
|
||||||
case EVENT_LEVEL_DEBUG:
|
case EVENT_LEVEL_DEBUG:
|
||||||
datalayer.battery.status.bms_status = ACTIVE;
|
|
||||||
break;
|
break;
|
||||||
case EVENT_LEVEL_UPDATE:
|
case EVENT_LEVEL_UPDATE:
|
||||||
datalayer.battery.status.bms_status = UPDATING;
|
datalayer.battery.status.bms_status = UPDATING;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue