Change static const char* to inline

Updte loggingprint for DEBUG,
Update advanced battery by removing static and add inline.
Update notes for Rty Cnt frames.
This commit is contained in:
josiahhiggs 2025-01-26 20:03:34 +13:00
parent 19cd5c52ac
commit f77d32a154
2 changed files with 287 additions and 170 deletions

View file

@ -805,29 +805,207 @@ static bool battery2_BMS_a180_SW_ECU_reset_blocked = false;
#endif //DOUBLE_BATTERY #endif //DOUBLE_BATTERY
static const char* contactorText[] = {"UNKNOWN(0)", "OPEN", "CLOSING", "BLOCKED", "OPENING", inline const char* getNoYes(bool value) {
"CLOSED", "UNKNOWN(6)", "WELDED", "POS_CL", "NEG_CL", return value ? "Yes" : "No";
"UNKNOWN(10)", "UNKNOWN(11)", "UNKNOWN(12)"}; }
static const char* contactorState[] = {"SNA", "OPEN", "PRECHARGE", "BLOCKED",
"PULLED_IN", "OPENING", "ECONOMIZED", "WELDED", inline const char* getContactorText(int index) {
"UNKNOWN(8)", "UNKNOWN(9)", "UNKNOWN(10)", "UNKNOWN(11)"}; switch (index) {
static const char* hvilStatusState[] = {"NOT OK", case 0: return "UNKNOWN(0)";
"STATUS_OK", case 1: return "OPEN";
"CURRENT_SOURCE_FAULT", case 2: return "CLOSING";
"INTERNAL_OPEN_FAULT", case 3: return "BLOCKED";
"VEHICLE_OPEN_FAULT", case 4: return "OPENING";
"PENTHOUSE_LID_OPEN_FAULT", case 5: return "CLOSED";
"UNKNOWN_LOCATION_OPEN_FAULT", case 6: return "UNKNOWN(6)";
"VEHICLE_NODE_FAULT", case 7: return "WELDED";
"NO_12V_SUPPLY", case 8: return "POS_CL";
"VEHICLE_OR_PENTHOUSE_LID_OPENFAULT", case 9: return "NEG_CL";
"UNKNOWN(10)", case 10: return "UNKNOWN(10)";
"UNKNOWN(11)", case 11: return "UNKNOWN(11)";
"UNKNOWN(12)", case 12: return "UNKNOWN(12)";
"UNKNOWN(13)", default: return "UNKNOWN";
"UNKNOWN(14)", }
"UNKNOWN(15)"}; }
static const char* noYes[] = {"No", "Yes"};
inline const char* getContactorState(int index) {
switch (index) {
case 0: return "SNA";
case 1: return "OPEN";
case 2: return "PRECHARGE";
case 3: return "BLOCKED";
case 4: return "PULLED_IN";
case 5: return "OPENING";
case 6: return "ECONOMIZED";
case 7: return "WELDED";
case 8: return "UNKNOWN(8)";
case 9: return "UNKNOWN(9)";
case 10: return "UNKNOWN(10)";
case 11: return "UNKNOWN(11)";
default: return "UNKNOWN";
}
}
inline const char* getHvilStatusState(int index) {
switch (index) {
case 0: return "NOT OK";
case 1: return "STATUS_OK";
case 2: return "CURRENT_SOURCE_FAULT";
case 3: return "INTERNAL_OPEN_FAULT";
case 4: return "VEHICLE_OPEN_FAULT";
case 5: return "PENTHOUSE_LID_OPEN_FAULT";
case 6: return "UNKNOWN_LOCATION_OPEN_FAULT";
case 7: return "VEHICLE_NODE_FAULT";
case 8: return "NO_12V_SUPPLY";
case 9: return "VEHICLE_OR_PENTHOUSE_LID_OPENFAULT";
case 10: return "UNKNOWN(10)";
case 11: return "UNKNOWN(11)";
case 12: return "UNKNOWN(12)";
case 13: return "UNKNOWN(13)";
case 14: return "UNKNOWN(14)";
case 15: return "UNKNOWN(15)";
default: return "UNKNOWN";
}
}
inline const char* getBMSState(int index) {
switch (index) {
case 0: return "STANDBY";
case 1: return "DRIVE";
case 2: return "SUPPORT";
case 3: return "CHARGE";
case 4: return "FEIM";
case 5: return "CLEAR_FAULT";
case 6: return "FAULT";
case 7: return "WELD";
case 8: return "TEST";
case 9: return "SNA";
default: return "UNKNOWN";
}
}
inline const char* getBMSContactorState(int index) {
switch (index) {
case 0: return "SNA";
case 1: return "OPEN";
case 2: return "OPENING";
case 3: return "CLOSING";
case 4: return "CLOSED";
case 5: return "WELDED";
case 6: return "BLOCKED";
default: return "UNKNOWN";
}
}
inline const char* getBMSHvState(int index) {
switch (index) {
case 0: return "DOWN";
case 1: return "COMING_UP";
case 2: return "GOING_DOWN";
case 3: return "UP_FOR_DRIVE";
case 4: return "UP_FOR_CHARGE";
case 5: return "UP_FOR_DC_CHARGE";
case 6: return "UP";
default: return "UNKNOWN";
}
}
inline const char* getBMSUiChargeStatus(int index) {
switch (index) {
case 0: return "DISCONNECTED";
case 1: return "NO_POWER";
case 2: return "ABOUT_TO_CHARGE";
case 3: return "CHARGING";
case 4: return "CHARGE_COMPLETE";
case 5: return "CHARGE_STOPPED";
default: return "UNKNOWN";
}
}
inline const char* getPCS_DcdcStatus(int index) {
switch (index) {
case 0: return "IDLE";
case 1: return "ACTIVE";
case 2: return "FAULTED";
default: return "UNKNOWN";
}
}
inline const char* getPCS_DcdcMainState(int index) {
switch (index) {
case 0: return "STANDBY";
case 1: return "12V_SUPPORT_ACTIVE";
case 2: return "PRECHARGE_STARTUP";
case 3: return "PRECHARGE_ACTIVE";
case 4: return "DIS_HVBUS_ACTIVE";
case 5: return "SHUTDOWN";
case 6: return "FAULTED";
default: return "UNKNOWN";
}
}
inline const char* getPCS_DcdcSubState(int index) {
switch (index) {
case 0: return "PWR_UP_INIT";
case 1: return "STANDBY";
case 2: return "12V_SUPPORT_ACTIVE";
case 3: return "DIS_HVBUS";
case 4: return "PCHG_FAST_DIS_HVBUS";
case 5: return "PCHG_SLOW_DIS_HVBUS";
case 6: return "PCHG_DWELL_CHARGE";
case 7: return "PCHG_DWELL_WAIT";
case 8: return "PCHG_DI_RECOVERY_WAIT";
case 9: return "PCHG_ACTIVE";
case 10: return "PCHG_FLT_FAST_DIS_HVBUS";
case 11: return "SHUTDOWN";
case 12: return "12V_SUPPORT_FAULTED";
case 13: return "DIS_HVBUS_FAULTED";
case 14: return "PCHG_FAULTED";
case 15: return "CLEAR_FAULTS";
case 16: return "FAULTED";
case 17: return "NUM";
default: return "UNKNOWN";
}
}
inline const char* getBMSPowerLimitState(int index) {
switch (index) {
case 0: return "NOT_CALCULATED_FOR_DRIVE";
case 1: return "CALCULATED_FOR_DRIVE";
default: return "UNKNOWN";
}
}
inline const char* getHVPStatus(int index) {
switch (index) {
case 0: return "INVALID";
case 1: return "NOT_AVAILABLE";
case 2: return "STALE";
case 3: return "VALID";
default: return "UNKNOWN";
}
}
inline const char* getHVPContactor(int index) {
switch (index) {
case 0: return "NOT_ACTIVE";
case 1: return "ACTIVE";
case 2: return "COMPLETED";
default: return "UNKNOWN";
}
}
inline const char* getFalseTrue(bool value) {
return value ? "True" : "False";
}
inline const char* getNoYes(bool value) {
return value ? "Yes" : "No";
}
inline const char* getFault(bool value) {
return value ? "ACTIVE" : "NOT_ACTIVE";
}
void clearIsolationFault() { void clearIsolationFault() {
//CAN UDS messages to clear a latched isolation fault //CAN UDS messages to clear a latched isolation fault
@ -1134,20 +1312,19 @@ void update_values_battery() { //This function maps all the values fetched via
printFaultCodesIfActive(); printFaultCodesIfActive();
logging.print("STATUS: Contactor: "); logging.print(getContactorText(battery_contactor)); // Display what state the contactor is in
logging.print(contactorText[battery_contactor]); //Display what state the contactor is in
logging.print(", HVIL: "); logging.print(", HVIL: ");
logging.print(hvilStatusState[battery_hvil_status]); logging.print(getHvilStatusState(battery_hvil_status));
logging.print(", NegativeState: "); logging.print(", NegativeState: ");
logging.print(contactorState[battery_packContNegativeState]); logging.print(getContactorState(battery_packContNegativeState));
logging.print(", PositiveState: "); logging.print(", PositiveState: ");
logging.print(contactorState[battery_packContPositiveState]); logging.print(getContactorState(battery_packContPositiveState));
logging.print(", setState: "); logging.print(", setState: ");
logging.print(contactorState[battery_packContactorSetState]); logging.print(getContactorState(battery_packContactorSetState));
logging.print(", close allowed: "); logging.print(", close allowed: ");
logging.print(noYes[battery_packCtrsClosingAllowed]); logging.print(getNoYes(battery_packCtrsClosingAllowed));
logging.print(", Pyrotest: "); logging.print(", Pyrotest: ");
logging.println(noYes[battery_pyroTestInProgress]); logging.println(getNoYes(battery_pyroTestInProgress));
logging.print("Battery values: "); logging.print("Battery values: ");
logging.print("Real SOC: "); logging.print("Real SOC: ");
@ -1175,17 +1352,14 @@ void update_values_battery() { //This function maps all the values fetched via
logging.print(battery_cell_deviation_mV); logging.print(battery_cell_deviation_mV);
logging.println("mV."); logging.println("mV.");
logging.printf("High Voltage Output Pins: %.2f V", (battery_dcdcHvBusVolt * 0.146484)); logging.printf("High Voltage Output Pins: %.2f V, Low Voltage: %.2f V, DC/DC 12V current: %.2f A.\n",
logging.print(", "); (battery_dcdcHvBusVolt * 0.146484),
logging.printf("Low Voltage: %.2f V", (battery_dcdcLvBusVolt * 0.0390625)); (battery_dcdcLvBusVolt * 0.0390625),
logging.print(", "); (battery_dcdcLvOutputCurrent * 0.1));
logging.printf("DC/DC 12V current: %.2f A", (battery_dcdcLvOutputCurrent * 0.1));
logging.println(".");
logging.printf("PCS_ambientTemp: %.2f°C, DCDC_Temp: %.2f°C, ChgPhA: %.2f°C, ChgPhB: %.2f°C, ChgPhC: %.2f°C", logging.printf("PCS_ambientTemp: %.2f°C, DCDC_Temp: %.2f°C, ChgPhA: %.2f°C, ChgPhB: %.2f°C, ChgPhC: %.2f°C.\n",
PCS_ambientTemp * 0.1 + 40, PCS_dcdcTemp * 0.1 + 40, PCS_chgPhATemp * 0.1 + 40, PCS_ambientTemp * 0.1 + 40, PCS_dcdcTemp * 0.1 + 40, PCS_chgPhATemp * 0.1 + 40,
PCS_chgPhBTemp * 0.1 + 40, PCS_chgPhCTemp * 0.1 + 40); PCS_chgPhBTemp * 0.1 + 40, PCS_chgPhCTemp * 0.1 + 40);
logging.println("");
logging.println("Values passed to the inverter: "); logging.println("Values passed to the inverter: ");
print_SOC(" SOC: ", datalayer.battery.status.reported_soc); print_SOC(" SOC: ", datalayer.battery.status.reported_soc);
@ -1222,7 +1396,7 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
mux0_read = true; //Set flag to true mux0_read = true; //Set flag to true
} }
if (mux == 1) { if (mux == 1) {
battery_fully_charged = (rx_frame.data.u8[1] & 0x01); //15|1@1+ (1,0) [0|1]//to datalayer_extended battery_fully_charged = (rx_frame.data.u8[1] & 0x01); //15|1@1+ (1,0) [0|1]//noYes
battery_energy_buffer_m1 = battery_energy_buffer_m1 =
((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[2]); //16|16@1+ (0.01,0) [0|0] "kWh"//to datalayer_extended ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[2]); //16|16@1+ (0.01,0) [0|0] "kWh"//to datalayer_extended
battery_expected_energy_remaining_m1 = battery_expected_energy_remaining_m1 =
@ -1253,32 +1427,32 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
battery_energy_buffer = //BMS_energyBuffer : 55|8@1+ (0.1,0) [0|25.4] "KWh"// ((_d[7] & (0x7FU)) << 1) | ((_d[6] >> 7) & (0x01U)); battery_energy_buffer = //BMS_energyBuffer : 55|8@1+ (0.1,0) [0|25.4] "KWh"// ((_d[7] & (0x7FU)) << 1) | ((_d[6] >> 7) & (0x01U));
(((rx_frame.data.u8[7] & 0xFE) >> 1) | ((rx_frame.data.u8[6] & 0x80) >> 7)); //Example 1 * 0.1 = 0 (((rx_frame.data.u8[7] & 0xFE) >> 1) | ((rx_frame.data.u8[6] & 0x80) >> 7)); //Example 1 * 0.1 = 0
battery_full_charge_complete = //BMS_fullChargeComplete : 63|1@1+ (1,0) [0|1] ""//((_d[7] >> 7) & (0x01U)); battery_full_charge_complete = //BMS_fullChargeComplete : 63|1@1+ (1,0) [0|1] ""//((_d[7] >> 7) & (0x01U));
((rx_frame.data.u8[7] >> 7) & 0x01); ((rx_frame.data.u8[7] >> 7) & 0x01); //noYes
break; break;
case 0x20A: //522 HVP_contactorState: case 0x20A: //522 HVP_contactorState:
battery_packContNegativeState = battery_packContNegativeState =
(rx_frame.data.u8[0] & 0x07); //(_d[0] & (0x07U)); 0|3@1+ (1,0) [0|7] //to datalayer_extended (rx_frame.data.u8[0] & 0x07); //(_d[0] & (0x07U)); 0|3@1+ (1,0) [0|7] //contactorState
battery_packContPositiveState = battery_packContPositiveState =
(rx_frame.data.u8[0] & 0x38) >> 3; //((_d[0] >> 3) & (0x07U)); 3|3@1+ (1,0) [0|7] //to datalayer_extended (rx_frame.data.u8[0] & 0x38) >> 3; //((_d[0] >> 3) & (0x07U)); 3|3@1+ (1,0) [0|7] //contactorState
battery_contactor = (rx_frame.data.u8[1] & 0x0F); // 8|4@1+ (1,0) [0|9] //to datalayer_extended battery_contactor = (rx_frame.data.u8[1] & 0x0F); // 8|4@1+ (1,0) [0|9] //contactorText
battery_packContactorSetState = battery_packContactorSetState =
(rx_frame.data.u8[1] & 0x0F); //(_d[1] & (0x0FU)); 8|4@1+ (1,0) [0|9] //to datalayer_extended (rx_frame.data.u8[1] & 0x0F); //(_d[1] & (0x0FU)); 8|4@1+ (1,0) [0|9] //contactorState
battery_packCtrsClosingAllowed = battery_packCtrsClosingAllowed =
(rx_frame.data.u8[4] & 0x08) >> 3; //((_d[4] >> 3) & (0x01U)); 35|1@1+ (1,0) [0|1] //to datalayer_extended (rx_frame.data.u8[4] & 0x08) >> 3; //((_d[4] >> 3) & (0x01U)); 35|1@1+ (1,0) [0|1] //noYes
battery_pyroTestInProgress = battery_pyroTestInProgress =
(rx_frame.data.u8[4] & 0x20) >> 5; //((_d[4] >> 5) & (0x01U));//37|1@1+ (1,0) [0|1] //to datalayer_extended (rx_frame.data.u8[4] & 0x20) >> 5; //((_d[4] >> 5) & (0x01U));//37|1@1+ (1,0) [0|1] //noYes
battery_hvil_status = battery_hvil_status =
(rx_frame.data.u8[5] & 0x0F); //(_d[5] & (0x0FU)); //40|4@1+ (1,0) [0|9] //to datalayer_extended (rx_frame.data.u8[5] & 0x0F); //(_d[5] & (0x0FU)); //40|4@1+ (1,0) [0|9] //hvilStatusState
battery_packCtrsOpenNowRequested = battery_packCtrsOpenNowRequested =
((rx_frame.data.u8[4] >> 1) & (0x01U)); //33|1@1+ (1,0) [0|1] //to datalayer_extended ((rx_frame.data.u8[4] >> 1) & (0x01U)); //33|1@1+ (1,0) [0|1] //noYes
battery_packCtrsOpenRequested = battery_packCtrsOpenRequested =
((rx_frame.data.u8[4] >> 2) & (0x01U)); //34|1@1+ (1,0) [0|1] //to datalayer_extended ((rx_frame.data.u8[4] >> 2) & (0x01U)); //34|1@1+ (1,0) [0|1] //noYes
battery_packCtrsRequestStatus = battery_packCtrsRequestStatus =
((rx_frame.data.u8[3] >> 6) & (0x03U)); //30|2@1+ (1,0) [0|2] //to datalayer_extended ((rx_frame.data.u8[3] >> 6) & (0x03U)); //30|2@1+ (1,0) [0|2] //HVP_contactor
battery_packCtrsResetRequestRequired = battery_packCtrsResetRequestRequired =
(rx_frame.data.u8[4] & (0x01U)); //32|1@1+ (1,0) [0|1] //to datalayer_extended (rx_frame.data.u8[4] & (0x01U)); //32|1@1+ (1,0) [0|1] //noYes
battery_dcLinkAllowedToEnergize = battery_dcLinkAllowedToEnergize =
((rx_frame.data.u8[4] >> 4) & (0x01U)); //36|1@1+ (1,0) [0|1] //to datalayer_extended ((rx_frame.data.u8[4] >> 4) & (0x01U)); //36|1@1+ (1,0) [0|1] //noYes
battery_fcContNegativeAuxOpen = ((rx_frame.data.u8[0] >> 7) & (0x01U)); //7|1@1+ (1,0) [0|1] "" Receiver battery_fcContNegativeAuxOpen = ((rx_frame.data.u8[0] >> 7) & (0x01U)); //7|1@1+ (1,0) [0|1] "" Receiver
battery_fcContNegativeState = ((rx_frame.data.u8[1] >> 4) & (0x07U)); //12|3@1+ (1,0) [0|7] "" Receiver battery_fcContNegativeState = ((rx_frame.data.u8[1] >> 4) & (0x07U)); //12|3@1+ (1,0) [0|7] "" Receiver
battery_fcContPositiveAuxOpen = ((rx_frame.data.u8[0] >> 6) & (0x01U)); //6|1@1+ (1,0) [0|1] "" Receiver battery_fcContPositiveAuxOpen = ((rx_frame.data.u8[0] >> 6) & (0x01U)); //6|1@1+ (1,0) [0|1] "" Receiver
@ -1342,9 +1516,9 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
battery_PCS_dcdcMaxOutputCurrentAllowed = ((rx_frame.data.u8[5] & (0x01U)) << 11) | battery_PCS_dcdcMaxOutputCurrentAllowed = ((rx_frame.data.u8[5] & (0x01U)) << 11) |
((rx_frame.data.u8[4] & (0xFFU)) << 3) | ((rx_frame.data.u8[4] & (0xFFU)) << 3) |
((rx_frame.data.u8[3] >> 5) & (0x07U)); //29|12@1+ (0.1,0) [0|0] "A" ((rx_frame.data.u8[3] >> 5) & (0x07U)); //29|12@1+ (0.1,0) [0|0] "A"
battery_PCS_dcdcPrechargeRtyCnt = ((rx_frame.data.u8[5] >> 1) & (0x07U)); battery_PCS_dcdcPrechargeRtyCnt = ((rx_frame.data.u8[5] >> 1) & (0x07U)); //Retry Count
battery_PCS_dcdc12VSupportRtyCnt = ((rx_frame.data.u8[5] >> 4) & (0x0FU)); battery_PCS_dcdc12VSupportRtyCnt = ((rx_frame.data.u8[5] >> 4) & (0x0FU)); //Retry Count
battery_PCS_dcdcDischargeRtyCnt = (rx_frame.data.u8[6] & (0x0FU)); battery_PCS_dcdcDischargeRtyCnt = (rx_frame.data.u8[6] & (0x0FU)); //Retry Count
battery_PCS_dcdcPwmEnableLine = ((rx_frame.data.u8[6] >> 4) & (0x01U)); battery_PCS_dcdcPwmEnableLine = ((rx_frame.data.u8[6] >> 4) & (0x01U));
battery_PCS_dcdcSupportingFixedLvTarget = ((rx_frame.data.u8[6] >> 5) & (0x01U)); battery_PCS_dcdcSupportingFixedLvTarget = ((rx_frame.data.u8[6] >> 5) & (0x01U));
battery_PCS_ecuLogUploadRequest = ((rx_frame.data.u8[6] >> 6) & (0x03U)); battery_PCS_ecuLogUploadRequest = ((rx_frame.data.u8[6] >> 6) & (0x03U));

View file

@ -571,85 +571,28 @@ String advanced_battery_processor(const String& var) {
float HVP_shuntBarTempDbg = static_cast<float>(datalayer_extended.tesla.HVP_shuntBarTempDbg) * 0.01; float HVP_shuntBarTempDbg = static_cast<float>(datalayer_extended.tesla.HVP_shuntBarTempDbg) * 0.01;
float HVP_shuntAsicTempDbg = static_cast<float>(datalayer_extended.tesla.HVP_shuntAsicTempDbg) * 0.01; float HVP_shuntAsicTempDbg = static_cast<float>(datalayer_extended.tesla.HVP_shuntAsicTempDbg) * 0.01;
static const char* contactorText[] = {"UNKNOWN(0)", "OPEN", "CLOSING", "BLOCKED", "OPENING",
"CLOSED", "UNKNOWN(6)", "WELDED", "POS_CL", "NEG_CL",
"UNKNOWN(10)", "UNKNOWN(11)", "UNKNOWN(12)"};
static const char* hvilStatusState[] = {"NOT Ok",
"STATUS_OK",
"CURRENT_SOURCE_FAULT",
"INTERNAL_OPEN_FAULT",
"VEHICLE_OPEN_FAULT",
"PENTHOUSE_LID_OPEN_FAULT",
"UNKNOWN_LOCATION_OPEN_FAULT",
"VEHICLE_NODE_FAULT",
"NO_12V_SUPPLY",
"VEHICLE_OR_PENTHOUSE_LID_OPENFAULT",
"UNKNOWN(10)",
"UNKNOWN(11)",
"UNKNOWN(12)",
"UNKNOWN(13)",
"UNKNOWN(14)",
"UNKNOWN(15)"};
static const char* contactorState[] = {"SNA", "OPEN", "PRECHARGE", "BLOCKED",
"PULLED_IN", "OPENING", "ECONOMIZED", "WELDED",
"UNKNOWN(8)", "UNKNOWN(9)", "UNKNOWN(10)", "UNKNOWN(11)"};
static const char* BMS_state[] = {"STANDBY", "DRIVE", "SUPPORT", "CHARGE", "FEIM",
"CLEAR_FAULT", "FAULT", "WELD", "TEST", "SNA"};
static const char* BMS_contactorState[] = {"SNA", "OPEN", "OPENING", "CLOSING", "CLOSED", "WELDED", "BLOCKED"};
static const char* BMS_hvState[] = {"DOWN", "COMING_UP", "GOING_DOWN", "UP_FOR_DRIVE",
"UP_FOR_CHARGE", "UP_FOR_DC_CHARGE", "UP"};
static const char* BMS_uiChargeStatus[] = {"DISCONNECTED", "NO_POWER", "ABOUT_TO_CHARGE",
"CHARGING", "CHARGE_COMPLETE", "CHARGE_STOPPED"};
static const char* PCS_dcdcStatus[] = {"IDLE", "ACTIVE", "FAULTED"};
static const char* PCS_dcdcMainState[] = {"STANDBY", "12V_SUPPORT_ACTIVE", "PRECHARGE_STARTUP",
"PRECHARGE_ACTIVE", "DIS_HVBUS_ACTIVE", "SHUTDOWN",
"FAULTED"};
static const char* PCS_dcdcSubState[] = {"PWR_UP_INIT",
"STANDBY",
"12V_SUPPORT_ACTIVE",
"DIS_HVBUS",
"PCHG_FAST_DIS_HVBUS",
"PCHG_SLOW_DIS_HVBUS",
"PCHG_DWELL_CHARGE",
"PCHG_DWELL_WAIT",
"PCHG_DI_RECOVERY_WAIT",
"PCHG_ACTIVE",
"PCHG_FLT_FAST_DIS_HVBUS",
"SHUTDOWN",
"12V_SUPPORT_FAULTED",
"DIS_HVBUS_FAULTED",
"PCHG_FAULTED",
"CLEAR_FAULTS",
"FAULTED",
"NUM"};
static const char* BMS_powerLimitState[] = {"NOT_CALCULATED_FOR_DRIVE", "CALCULATED_FOR_DRIVE"};
static const char* HVP_status[] = {"INVALID", "NOT_AVAILABLE", "STALE", "VALID"};
static const char* HVP_contactor[] = {"NOT_ACTIVE", "ACTIVE", "COMPLETED"};
static const char* falseTrue[] = {"False", "True"};
static const char* noYes[] = {"No", "Yes"};
static const char* Fault[] = {"NOT_ACTIVE", "ACTIVE"};
//Buttons for user action //Buttons for user action
content += "<button onclick='askClearIsolation()'>Clear isolation fault</button>"; content += "<button onclick='askClearIsolation()'>Clear isolation fault</button>";
//0x20A 522 HVP_contatorState //0x20A 522 HVP_contatorState
content += "<h4>Contactor Status: " + String(contactorText[datalayer_extended.tesla.status_contactor]) + "</h4>"; content += "<h4>Contactor Status: " + String(getContactorText(datalayer_extended.tesla.status_contactor)) + "</h4>";
content += "<h4>HVIL: " + String(hvilStatusState[datalayer_extended.tesla.hvil_status]) + "</h4>"; content += "<h4>HVIL: " + String(getHvilStatusState(datalayer_extended.tesla.hvil_status)) + "</h4>";
content += content +=
"<h4>Negative contactor: " + String(contactorState[datalayer_extended.tesla.packContNegativeState]) + "</h4>"; "<h4>Negative contactor: " + String(getContactorState(datalayer_extended.tesla.packContNegativeState)) + "</h4>";
content += content +=
"<h4>Positive contactor: " + String(contactorState[datalayer_extended.tesla.packContPositiveState]) + "</h4>"; "<h4>Positive contactor: " + String(getContactorState(datalayer_extended.tesla.packContPositiveState)) + "</h4>";
content += "<h4>Closing allowed?: " + String(noYes[datalayer_extended.tesla.packCtrsClosingAllowed]) + "</h4>"; content += "<h4>Closing allowed?: " + String(getNoYes(datalayer_extended.tesla.packCtrsClosingAllowed)) + "</h4>";
content += "<h4>Pyrotest in Progress: " + String(noYes[datalayer_extended.tesla.pyroTestInProgress]) + "</h4>"; content += "<h4>Pyrotest in Progress: " + String(getNoYes(datalayer_extended.tesla.pyroTestInProgress)) + "</h4>";
content += "<h4>Contactors Open Now Requested: " + content += "<h4>Contactors Open Now Requested: " +
String(noYes[datalayer_extended.tesla.battery_packCtrsOpenNowRequested]) + "</h4>"; String(getNoYes(datalayer_extended.tesla.battery_packCtrsOpenNowRequested)) + "</h4>";
content += content +=
"<h4>Contactors Open Requested: " + String(noYes[datalayer_extended.tesla.battery_packCtrsOpenRequested]) + "<h4>Contactors Open Requested: " + String(getNoYes(datalayer_extended.tesla.battery_packCtrsOpenRequested)) +
"</h4>"; "</h4>";
content += "<h4>Contactors Request Status: " + content += "<h4>Contactors Request Status: " +
String(HVP_contactor[datalayer_extended.tesla.battery_packCtrsRequestStatus]) + "</h4>"; String(getHVP_contactor(datalayer_extended.tesla.battery_packCtrsRequestStatus)) + "</h4>";
content += "<h4>Contactors Reset Request Required: " + content += "<h4>Contactors Reset Request Required: " +
String(noYes[datalayer_extended.tesla.battery_packCtrsResetRequestRequired]) + "</h4>"; String(getNoYes(datalayer_extended.tesla.battery_packCtrsResetRequestRequired)) + "</h4>";
content += content +=
"<h4>DC Link Allowed to Energize: " + String(noYes[datalayer_extended.tesla.battery_dcLinkAllowedToEnergize]) + "<h4>DC Link Allowed to Energize: " + String(getNoYes(datalayer_extended.tesla.battery_dcLinkAllowedToEnergize)) +
"</h4>"; "</h4>";
char readableSerialNumber[15]; // One extra space for null terminator char readableSerialNumber[15]; // One extra space for null terminator
memcpy(readableSerialNumber, datalayer_extended.tesla.BMS_SerialNumber, memcpy(readableSerialNumber, datalayer_extended.tesla.BMS_SerialNumber,
@ -666,7 +609,7 @@ String advanced_battery_processor(const String& var) {
content += "<h4>Ideal Energy Remaining: " + String(ideal_energy_remaining) + " KWh</h4>"; content += "<h4>Ideal Energy Remaining: " + String(ideal_energy_remaining) + " KWh</h4>";
content += "<h4>Energy to Charge Complete: " + String(energy_to_charge_complete) + " KWh</h4>"; content += "<h4>Energy to Charge Complete: " + String(energy_to_charge_complete) + " KWh</h4>";
content += "<h4>Energy Buffer: " + String(energy_buffer) + " KWh</h4>"; content += "<h4>Energy Buffer: " + String(energy_buffer) + " KWh</h4>";
content += "<h4>Full Charge Complete: " + String(noYes[datalayer_extended.tesla.battery_full_charge_complete]) + content += "<h4>Full Charge Complete: " + String(getNoYes(datalayer_extended.tesla.battery_full_charge_complete)) +
"</h4>"; //bool "</h4>"; //bool
} }
//0x352 850 BMS_energyStatus //0x352 850 BMS_energyStatus
@ -679,7 +622,7 @@ String advanced_battery_processor(const String& var) {
content += "<h4>Energy to Charge Complete: " + String(energy_to_charge_complete_m1) + " KWh</h4>"; content += "<h4>Energy to Charge Complete: " + String(energy_to_charge_complete_m1) + " KWh</h4>";
content += "<h4>Energy Buffer: " + String(energy_buffer_m1) + " KWh</h4>"; content += "<h4>Energy Buffer: " + String(energy_buffer_m1) + " KWh</h4>";
content += "<h4>Expected Energy Remaining: " + String(expected_energy_remaining_m1) + " KWh</h4>"; content += "<h4>Expected Energy Remaining: " + String(expected_energy_remaining_m1) + " KWh</h4>";
content += "<h4>Fully Charged: " + String(noYes[datalayer_extended.tesla.battery_fully_charged]) + "</h4>"; content += "<h4>Fully Charged: " + String(getNoYes(datalayer_extended.tesla.battery_fully_charged)) + "</h4>";
} }
//0x3D2 978 BMS_kwhCounter //0x3D2 978 BMS_kwhCounter
content += "<h4>Total Discharge: " + String(total_discharge) + " KWh</h4>"; content += "<h4>Total Discharge: " + String(total_discharge) + " KWh</h4>";
@ -751,36 +694,36 @@ String advanced_battery_processor(const String& var) {
content += "<h4>BMS No Flow Request: " + String(Fault[datalayer_extended.tesla.BMS_noFlowRequest]) + "</h4>"; content += "<h4>BMS No Flow Request: " + String(Fault[datalayer_extended.tesla.BMS_noFlowRequest]) + "</h4>";
//0x224 548 PCS_dcdcStatus //0x224 548 PCS_dcdcStatus
content += content +=
"<h4>Precharge Status: " + String(PCS_dcdcStatus[datalayer_extended.tesla.battery_PCS_dcdcPrechargeStatus]) + "<h4>Precharge Status: " + String(getPCS_dcdcStatus(datalayer_extended.tesla.battery_PCS_dcdcPrechargeStatus)) +
"</h4>"; "</h4>";
content += content +=
"<h4>12V Support Status: " + String(PCS_dcdcStatus[datalayer_extended.tesla.battery_PCS_dcdc12VSupportStatus]) + "<h4>12V Support Status: " + String(getPCS_dcdcStatus(datalayer_extended.tesla.battery_PCS_dcdc12VSupportStatus)) +
"</h4>"; "</h4>";
content += "<h4>HV Bus Discharge Status: " + content += "<h4>HV Bus Discharge Status: " +
String(PCS_dcdcStatus[datalayer_extended.tesla.battery_PCS_dcdcHvBusDischargeStatus]) + "</h4>"; String(getPCS_dcdcStatus(datalayer_extended.tesla.battery_PCS_dcdcHvBusDischargeStatus)) + "</h4>";
content += content +=
"<h4>Main State: " + String(PCS_dcdcMainState[datalayer_extended.tesla.battery_PCS_dcdcMainState]) + "</h4>"; "<h4>Main State: " + String(getPCS_dcdcMainState(datalayer_extended.tesla.battery_PCS_dcdcMainState) + "</h4>";
content += content +=
"<h4>Sub State: " + String(PCS_dcdcSubState[datalayer_extended.tesla.battery_PCS_dcdcSubState]) + "</h4>"; "<h4>Sub State: " + String(getPCS_dcdcSubState(datalayer_extended.tesla.battery_PCS_dcdcSubState)) + "</h4>";
content += "<h4>PCS Faulted: " + String(Fault[datalayer_extended.tesla.battery_PCS_dcdcFaulted]) + "</h4>"; content += "<h4>PCS Faulted: " + String(getFault(datalayer_extended.tesla.battery_PCS_dcdcFaulted)) + "</h4>";
content += content +=
"<h4>Output Is Limited: " + String(Fault[datalayer_extended.tesla.battery_PCS_dcdcOutputIsLimited]) + "</h4>"; "<h4>Output Is Limited: " + String(getFault(datalayer_extended.tesla.battery_PCS_dcdcOutputIsLimited)) + "</h4>";
content += "<h4>Max Output Current Allowed: " + String(PCS_dcdcMaxOutputCurrentAllowed) + " A</h4>"; content += "<h4>Max Output Current Allowed: " + String(PCS_dcdcMaxOutputCurrentAllowed) + " A</h4>";
content += "<h4>Precharge Rty Cnt: " + String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdcPrechargeRtyCnt]) + content += "<h4>Precharge Retry Cnt: " + String(datalayer_extended.tesla.battery_PCS_dcdcPrechargeRtyCnt) +
"</h4>"; "</h4>";
content += content +=
"<h4>12V Support Rty Cnt: " + String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdc12VSupportRtyCnt]) + "<h4>12V Support Retry Cnt: " + String(datalayer_extended.tesla.battery_PCS_dcdc12VSupportRtyCnt) +
"</h4>"; "</h4>";
content += "<h4>Discharge Rty Cnt: " + String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdcDischargeRtyCnt]) + content += "<h4>Discharge Retry Cnt: " + String(datalayer_extended.tesla.battery_PCS_dcdcDischargeRtyCnt) +
"</h4>"; "</h4>";
content += content +=
"<h4>PWM Enable Line: " + String(Fault[datalayer_extended.tesla.battery_PCS_dcdcPwmEnableLine]) + "</h4>"; "<h4>PWM Enable Line: " + String(getFault(datalayer_extended.tesla.battery_PCS_dcdcPwmEnableLine)) + "</h4>";
content += "<h4>Supporting Fixed LV Target: " + content += "<h4>Supporting Fixed LV Target: " +
String(Fault[datalayer_extended.tesla.battery_PCS_dcdcSupportingFixedLvTarget]) + "</h4>"; String(getFault(datalayer_extended.tesla.battery_PCS_dcdcSupportingFixedLvTarget)) + "</h4>";
content += "<h4>Precharge Restart Cnt: " + content += "<h4>Precharge Restart Cnt: " +
String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdcPrechargeRestartCnt]) + "</h4>"; String(getFalseTrue(datalayer_extended.tesla.battery_PCS_dcdcPrechargeRestartCnt)) + "</h4>";
content += "<h4>Initial Precharge Substate: " + content += "<h4>Initial Precharge Substate: " +
String(PCS_dcdcSubState[datalayer_extended.tesla.battery_PCS_dcdcInitialPrechargeSubState]) + "</h4>"; String(getPCS_dcdcSubState(datalayer_extended.tesla.battery_PCS_dcdcInitialPrechargeSubState)) + "</h4>";
//0x2C4 708 PCS_logging //0x2C4 708 PCS_logging
content += "<h4>PCS_dcdcMaxLvOutputCurrent: " + String(PCS_dcdcMaxLvOutputCurrent) + " A</h4>"; content += "<h4>PCS_dcdcMaxLvOutputCurrent: " + String(PCS_dcdcMaxLvOutputCurrent) + " A</h4>";
content += "<h4>PCS_dcdcCurrentLimit: " + String(PCS_dcdcCurrentLimit) + " A</h4>"; content += "<h4>PCS_dcdcCurrentLimit: " + String(PCS_dcdcCurrentLimit) + " A</h4>";
@ -813,47 +756,47 @@ String advanced_battery_processor(const String& var) {
content += "<h4>HVP_hvilInVoltage: " + String(HVP_hvilInVoltage) + " V</h4>"; content += "<h4>HVP_hvilInVoltage: " + String(HVP_hvilInVoltage) + " V</h4>";
content += "<h4>HVP_hvilOutVoltage: " + String(HVP_hvilOutVoltage) + " V</h4>"; content += "<h4>HVP_hvilOutVoltage: " + String(HVP_hvilOutVoltage) + " V</h4>";
content += content +=
"<h4>HVP_gpioPassivePyroDepl: " + String(Fault[datalayer_extended.tesla.HVP_gpioPassivePyroDepl]) + "</h4>"; "<h4>HVP_gpioPassivePyroDepl: " + String(getFault(datalayer_extended.tesla.HVP_gpioPassivePyroDepl)) + "</h4>";
content += "<h4>HVP_gpioPyroIsoEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioPyroIsoEn]) + "</h4>"; content += "<h4>HVP_gpioPyroIsoEn: " + String(getFault(datalayer_extended.tesla.HVP_gpioPyroIsoEn)) + "</h4>";
content += "<h4>HVP_gpioCpFaultIn: " + String(Fault[datalayer_extended.tesla.HVP_gpioCpFaultIn]) + "</h4>"; content += "<h4>HVP_gpioCpFaultIn: " + String(getFault(datalayer_extended.tesla.HVP_gpioCpFaultIn)) + "</h4>";
content += content +=
"<h4>HVP_gpioPackContPowerEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioPackContPowerEn]) + "</h4>"; "<h4>HVP_gpioPackContPowerEn: " + String(getFault(datalayer_extended.tesla.HVP_gpioPackContPowerEn)) + "</h4>";
content += "<h4>HVP_gpioHvCablesOk: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvCablesOk]) + "</h4>"; content += "<h4>HVP_gpioHvCablesOk: " + String(getFault(datalayer_extended.tesla.HVP_gpioHvCablesOk)) + "</h4>";
content += "<h4>HVP_gpioHvpSelfEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvpSelfEnable]) + "</h4>"; content += "<h4>HVP_gpioHvpSelfEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioHvpSelfEnable)) + "</h4>";
content += "<h4>HVP_gpioLed: " + String(Fault[datalayer_extended.tesla.HVP_gpioLed]) + "</h4>"; content += "<h4>HVP_gpioLed: " + String(getFault(datalayer_extended.tesla.HVP_gpioLed)) + "</h4>";
content += "<h4>HVP_gpioCrashSignal: " + String(Fault[datalayer_extended.tesla.HVP_gpioCrashSignal]) + "</h4>"; content += "<h4>HVP_gpioCrashSignal: " + String(getFault(datalayer_extended.tesla.HVP_gpioCrashSignal)) + "</h4>";
content += content +=
"<h4>HVP_gpioShuntDataReady: " + String(Fault[datalayer_extended.tesla.HVP_gpioShuntDataReady]) + "</h4>"; "<h4>HVP_gpioShuntDataReady: " + String(getFault(datalayer_extended.tesla.HVP_gpioShuntDataReady)) + "</h4>";
content += "<h4>HVP_gpioFcContPosAux: " + String(Fault[datalayer_extended.tesla.HVP_gpioFcContPosAux]) + "</h4>"; content += "<h4>HVP_gpioFcContPosAux: " + String(getFault(datalayer_extended.tesla.HVP_gpioFcContPosAux)) + "</h4>";
content += "<h4>HVP_gpioFcContNegAux: " + String(Fault[datalayer_extended.tesla.HVP_gpioFcContNegAux]) + "</h4>"; content += "<h4>HVP_gpioFcContNegAux: " + String(getFault(datalayer_extended.tesla.HVP_gpioFcContNegAux)) + "</h4>";
content += "<h4>HVP_gpioBmsEout: " + String(Fault[datalayer_extended.tesla.HVP_gpioBmsEout]) + "</h4>"; content += "<h4>HVP_gpioBmsEout: " + String(getFault(datalayer_extended.tesla.HVP_gpioBmsEout)) + "</h4>";
content += "<h4>HVP_gpioCpFaultOut: " + String(Fault[datalayer_extended.tesla.HVP_gpioCpFaultOut]) + "</h4>"; content += "<h4>HVP_gpioCpFaultOut: " + String(getFault(datalayer_extended.tesla.HVP_gpioCpFaultOut)) + "</h4>";
content += "<h4>HVP_gpioPyroPor: " + String(Fault[datalayer_extended.tesla.HVP_gpioPyroPor]) + "</h4>"; content += "<h4>HVP_gpioPyroPor: " + String(getFault(datalayer_extended.tesla.HVP_gpioPyroPor)) + "</h4>";
content += "<h4>HVP_gpioShuntEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioShuntEn]) + "</h4>"; content += "<h4>HVP_gpioShuntEn: " + String(getFault(datalayer_extended.tesla.HVP_gpioShuntEn)) + "</h4>";
content += "<h4>HVP_gpioHvpVerEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvpVerEn]) + "</h4>"; content += "<h4>HVP_gpioHvpVerEn: " + String(getFault(datalayer_extended.tesla.HVP_gpioHvpVerEn)) + "</h4>";
content += content +=
"<h4>HVP_gpioPackCoontPosFlywheel: " + String(Fault[datalayer_extended.tesla.HVP_gpioPackCoontPosFlywheel]) + "<h4>HVP_gpioPackCoontPosFlywheel: " + String(getFault(datalayer_extended.tesla.HVP_gpioPackCoontPosFlywheel)) +
"</h4>"; "</h4>";
content += "<h4>HVP_gpioCpLatchEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioCpLatchEnable]) + "</h4>"; content += "<h4>HVP_gpioCpLatchEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioCpLatchEnable)) + "</h4>";
content += "<h4>HVP_gpioPcsEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioPcsEnable]) + "</h4>"; content += "<h4>HVP_gpioPcsEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioPcsEnable)) + "</h4>";
content += content +=
"<h4>HVP_gpioPcsDcdcPwmEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioPcsDcdcPwmEnable]) + "</h4>"; "<h4>HVP_gpioPcsDcdcPwmEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioPcsDcdcPwmEnable)) + "</h4>";
content += "<h4>HVP_gpioPcsChargePwmEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioPcsChargePwmEnable]) + content += "<h4>HVP_gpioPcsChargePwmEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioPcsChargePwmEnable)) +
"</h4>"; "</h4>";
content += content +=
"<h4>HVP_gpioFcContPowerEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioFcContPowerEnable]) + "</h4>"; "<h4>HVP_gpioFcContPowerEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioFcContPowerEnable)) + "</h4>";
content += "<h4>HVP_gpioHvilEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvilEnable]) + "</h4>"; content += "<h4>HVP_gpioHvilEnable: " + String(getFault(datalayer_extended.tesla.HVP_gpioHvilEnable)) + "</h4>";
content += "<h4>HVP_gpioSecDrdy: " + String(Fault[datalayer_extended.tesla.HVP_gpioSecDrdy]) + "</h4>"; content += "<h4>HVP_gpioSecDrdy: " + String(getFault(datalayer_extended.tesla.HVP_gpioSecDrdy)) + "</h4>";
content += "<h4>HVP_shuntCurrentDebug: " + String(HVP_shuntCurrentDebug) + " A</h4>"; content += "<h4>HVP_shuntCurrentDebug: " + String(HVP_shuntCurrentDebug) + " A</h4>";
content += "<h4>HVP_packCurrentMia: " + String(noYes[datalayer_extended.tesla.HVP_packCurrentMia]) + "</h4>"; content += "<h4>HVP_packCurrentMia: " + String(getNoYes(datalayer_extended.tesla.HVP_packCurrentMia)) + "</h4>";
content += "<h4>HVP_auxCurrentMia: " + String(noYes[datalayer_extended.tesla.HVP_auxCurrentMia]) + "</h4>"; content += "<h4>HVP_auxCurrentMia: " + String(getNoYes(datalayer_extended.tesla.HVP_auxCurrentMia)) + "</h4>";
content += "<h4>HVP_currentSenseMia: " + String(noYes[datalayer_extended.tesla.HVP_currentSenseMia]) + "</h4>"; content += "<h4>HVP_currentSenseMia: " + String(getNoYes(datalayer_extended.tesla.HVP_currentSenseMia)) + "</h4>";
content += content +=
"<h4>HVP_shuntRefVoltageMismatch: " + String(noYes[datalayer_extended.tesla.HVP_shuntRefVoltageMismatch]) + "<h4>HVP_shuntRefVoltageMismatch: " + String(getNoYes(datalayer_extended.tesla.HVP_shuntRefVoltageMismatch)) +
"</h4>"; "</h4>";
content += content +=
"<h4>HVP_shuntThermistorMia: " + String(noYes[datalayer_extended.tesla.HVP_shuntThermistorMia]) + "</h4>"; "<h4>HVP_shuntThermistorMia: " + String(getNoYes(datalayer_extended.tesla.HVP_shuntThermistorMia)) + "</h4>";
content += "<h4>HVP_shuntHwMia: " + String(noYes[datalayer_extended.tesla.HVP_shuntHwMia]) + "</h4>"; content += "<h4>HVP_shuntHwMia: " + String(getNoYes(datalayer_extended.tesla.HVP_shuntHwMia)) + "</h4>";
//content += "<h4>HVP_fcLinkVoltage: " + String(HVP_fcLinkVoltage) + " V</h4>"; // Not giving useable data //content += "<h4>HVP_fcLinkVoltage: " + String(HVP_fcLinkVoltage) + " V</h4>"; // Not giving useable data
//content += "<h4>HVP_packNegativeV: " + String(HVP_packNegativeV) + " V</h4>"; // Not giving useable data //content += "<h4>HVP_packNegativeV: " + String(HVP_packNegativeV) + " V</h4>"; // Not giving useable data
//content += "<h4>HVP_packPositiveV: " + String(HVP_packPositiveV) + " V</h4>"; // Not giving useable data //content += "<h4>HVP_packPositiveV: " + String(HVP_packPositiveV) + " V</h4>"; // Not giving useable data