#include "../../datalayer/datalayer.h"
#include "../../datalayer/datalayer_extended.h"
String advanced_battery_processor(const String& var) {
if (var == "X") {
String content = "";
//Page format
content += "";
content += "Back to main page ";
// Start a new block with a specific background color
content += "";
#ifdef BMW_I3_BATTERY
content += "
SOC raw: " + String(datalayer_extended.bmwi3.SOC_raw) + " ";
content += "SOC dash: " + String(datalayer_extended.bmwi3.SOC_dash) + " ";
content += "SOC OBD2: " + String(datalayer_extended.bmwi3.SOC_OBD2) + " ";
static const char* statusText[16] = {
"Not evaluated", "OK", "Error!", "Invalid signal", "", "", "", "", "", "", "", "", "", "", "", ""};
content += "Interlock: " + String(statusText[datalayer_extended.bmwi3.ST_interlock]) + " ";
content += "Isolation external: " + String(statusText[datalayer_extended.bmwi3.ST_iso_ext]) + " ";
content += "Isolation internal: " + String(statusText[datalayer_extended.bmwi3.ST_iso_int]) + " ";
content += "Isolation: " + String(statusText[datalayer_extended.bmwi3.ST_isolation]) + " ";
content += "Cooling valve: " + String(statusText[datalayer_extended.bmwi3.ST_valve_cooling]) + " ";
content += "Emergency: " + String(statusText[datalayer_extended.bmwi3.ST_EMG]) + " ";
static const char* prechargeText[16] = {"Not evaluated",
"Not active, closing not blocked",
"Error precharge blocked",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Precharge: " + String(prechargeText[datalayer_extended.bmwi3.ST_precharge]) +
" "; //Still unclear of enum
static const char* DCSWText[16] = {"Contactors open",
"Precharge ongoing",
"Contactors engaged",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Contactor status: " + String(DCSWText[datalayer_extended.bmwi3.ST_DCSW]) + " ";
static const char* contText[16] = {"Contactors OK",
"One contactor welded!",
"Two contactors welded!",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Contactor weld: " + String(contText[datalayer_extended.bmwi3.ST_WELD]) + " ";
static const char* valveText[16] = {"OK",
"Short circuit to GND",
"Short circuit to 12V",
"Line break",
"",
"",
"Driver error",
"",
"",
"",
"",
"",
"Stuck",
"Stuck",
"",
"Invalid Signal"};
content += "Cold shutoff valve: " + String(contText[datalayer_extended.bmwi3.ST_cold_shutoff_valve]) + " ";
#endif //BMW_I3_BATTERY
#ifdef CELLPOWER_BMS
static const char* falseTrue[2] = {"False", "True"};
content += "States: ";
content += "Discharge: " + String(falseTrue[datalayer_extended.cellpower.system_state_discharge]) + " ";
content += "Charge: " + String(falseTrue[datalayer_extended.cellpower.system_state_charge]) + " ";
content +=
"Cellbalancing: " + String(falseTrue[datalayer_extended.cellpower.system_state_cellbalancing]) + " ";
content +=
"Tricklecharging: " + String(falseTrue[datalayer_extended.cellpower.system_state_tricklecharge]) + " ";
content += "Idle: " + String(falseTrue[datalayer_extended.cellpower.system_state_idle]) + " ";
content += "Charge completed: " + String(falseTrue[datalayer_extended.cellpower.system_state_chargecompleted]) +
" ";
content +=
"Maintenance charge: " + String(falseTrue[datalayer_extended.cellpower.system_state_maintenancecharge]) +
" ";
content += "IO: ";
content +=
"Main positive relay: " + String(falseTrue[datalayer_extended.cellpower.IO_state_main_positive_relay]) +
" ";
content +=
"Main negative relay: " + String(falseTrue[datalayer_extended.cellpower.IO_state_main_negative_relay]) +
" ";
content +=
"Charge enabled: " + String(falseTrue[datalayer_extended.cellpower.IO_state_charge_enable]) + " ";
content +=
"Precharge relay: " + String(falseTrue[datalayer_extended.cellpower.IO_state_precharge_relay]) + " ";
content +=
"Discharge enable: " + String(falseTrue[datalayer_extended.cellpower.IO_state_discharge_enable]) + " ";
content += "IO 6: " + String(falseTrue[datalayer_extended.cellpower.IO_state_IO_6]) + " ";
content += "IO 7: " + String(falseTrue[datalayer_extended.cellpower.IO_state_IO_7]) + " ";
content += "IO 8: " + String(falseTrue[datalayer_extended.cellpower.IO_state_IO_8]) + " ";
content += "Errors: ";
content +=
"Cell overvoltage: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_overvoltage]) + " ";
content +=
"Cell undervoltage: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_undervoltage]) + " ";
content += "Cell end of life voltage: " +
String(falseTrue[datalayer_extended.cellpower.error_Cell_end_of_life_voltage]) + " ";
content +=
"Cell voltage misread: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_voltage_misread]) +
" ";
content +=
"Cell over temperature: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_over_temperature]) +
" ";
content +=
"Cell under temperature: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_under_temperature]) +
" ";
content += "Cell unmanaged: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_unmanaged]) + " ";
content +=
"LMU over temperature: " + String(falseTrue[datalayer_extended.cellpower.error_LMU_over_temperature]) +
" ";
content +=
"LMU under temperature: " + String(falseTrue[datalayer_extended.cellpower.error_LMU_under_temperature]) +
" ";
content += "Temp sensor open circuit: " +
String(falseTrue[datalayer_extended.cellpower.error_Temp_sensor_open_circuit]) + " ";
content += "Temp sensor short circuit: " +
String(falseTrue[datalayer_extended.cellpower.error_Temp_sensor_short_circuit]) + " ";
content += "SUB comm: " + String(falseTrue[datalayer_extended.cellpower.error_SUB_communication]) + " ";
content += "LMU comm: " + String(falseTrue[datalayer_extended.cellpower.error_LMU_communication]) + " ";
content +=
"Over current In: " + String(falseTrue[datalayer_extended.cellpower.error_Over_current_IN]) + " ";
content +=
"Over current Out: " + String(falseTrue[datalayer_extended.cellpower.error_Over_current_OUT]) + " ";
content += "Short circuit: " + String(falseTrue[datalayer_extended.cellpower.error_Short_circuit]) + " ";
content += "Leak detected: " + String(falseTrue[datalayer_extended.cellpower.error_Leak_detected]) + " ";
content +=
"Leak detection failed: " + String(falseTrue[datalayer_extended.cellpower.error_Leak_detection_failed]) +
" ";
content +=
"Voltage diff: " + String(falseTrue[datalayer_extended.cellpower.error_Voltage_difference]) + " ";
content += "BMCU supply overvoltage: " +
String(falseTrue[datalayer_extended.cellpower.error_BMCU_supply_over_voltage]) + " ";
content += "BMCU supply undervoltage: " +
String(falseTrue[datalayer_extended.cellpower.error_BMCU_supply_under_voltage]) + " ";
content += "Main positive contactor: " +
String(falseTrue[datalayer_extended.cellpower.error_Main_positive_contactor]) + " ";
content += "Main negative contactor: " +
String(falseTrue[datalayer_extended.cellpower.error_Main_negative_contactor]) + " ";
content += "Precharge contactor: " + String(falseTrue[datalayer_extended.cellpower.error_Precharge_contactor]) +
" ";
content +=
"Midpack contactor: " + String(falseTrue[datalayer_extended.cellpower.error_Midpack_contactor]) + " ";
content +=
"Precharge timeout: " + String(falseTrue[datalayer_extended.cellpower.error_Precharge_timeout]) + " ";
content += "EMG connector override: " +
String(falseTrue[datalayer_extended.cellpower.error_Emergency_connector_override]) + " ";
content += "Warnings: ";
content +=
"High cell voltage: " + String(falseTrue[datalayer_extended.cellpower.warning_High_cell_voltage]) + " ";
content +=
"Low cell voltage: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_cell_voltage]) + " ";
content +=
"High cell temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_High_cell_temperature]) +
" ";
content +=
"Low cell temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_cell_temperature]) +
" ";
content +=
"High LMU temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_High_LMU_temperature]) +
" ";
content +=
"Low LMU temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_LMU_temperature]) +
" ";
content +=
"SUB comm interf: " + String(falseTrue[datalayer_extended.cellpower.warning_SUB_communication_interfered]) +
" ";
content +=
"LMU comm interf: " + String(falseTrue[datalayer_extended.cellpower.warning_LMU_communication_interfered]) +
" ";
content +=
"High current In: " + String(falseTrue[datalayer_extended.cellpower.warning_High_current_IN]) + " ";
content +=
"High current Out: " + String(falseTrue[datalayer_extended.cellpower.warning_High_current_OUT]) + " ";
content += "Pack resistance diff: " +
String(falseTrue[datalayer_extended.cellpower.warning_Pack_resistance_difference]) + " ";
content +=
"High pack resistance: " + String(falseTrue[datalayer_extended.cellpower.warning_High_pack_resistance]) +
" ";
content += "Cell resistance diff: " +
String(falseTrue[datalayer_extended.cellpower.warning_Cell_resistance_difference]) + " ";
content +=
"High cell resistance: " + String(falseTrue[datalayer_extended.cellpower.warning_High_cell_resistance]) +
" ";
content += "High BMCU supply voltage: " +
String(falseTrue[datalayer_extended.cellpower.warning_High_BMCU_supply_voltage]) + " ";
content += "Low BMCU supply voltage: " +
String(falseTrue[datalayer_extended.cellpower.warning_Low_BMCU_supply_voltage]) + " ";
content += "Low SOC: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_SOC]) + " ";
content += "Balancing required: " +
String(falseTrue[datalayer_extended.cellpower.warning_Balancing_required_OCV_model]) + " ";
content += "Charger not responding: " +
String(falseTrue[datalayer_extended.cellpower.warning_Charger_not_responding]) + " ";
#endif //CELLPOWER_BMS
#ifdef BYD_ATTO_3_BATTERY
content += "SOC estimated: " + String(datalayer_extended.bydAtto3.SOC_estimated) + " ";
content += "SOC highprec: " + String(datalayer_extended.bydAtto3.SOC_highprec) + " ";
content += "SOC OBD2: " + String(datalayer_extended.bydAtto3.SOC_polled) + " ";
content += "Voltage periodic: " + String(datalayer_extended.bydAtto3.voltage_periodic) + " ";
content += "Voltage OBD2: " + String(datalayer_extended.bydAtto3.voltage_polled) + " ";
#endif //BYD_ATTO_3_BATTERY
#ifdef TESLA_BATTERY
static const char* contactorText[] = {"UNKNOWN(0)", "OPEN", "CLOSING", "BLOCKED", "OPENING",
"CLOSED", "UNKNOWN(6)", "WELDED", "POS_CL", "NEG_CL",
"UNKNOWN(10)", "UNKNOWN(11)", "UNKNOWN(12)"};
content += "Contactor Status: " + String(contactorText[datalayer_extended.tesla.status_contactor]) + " ";
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)"};
content += "HVIL: " + String(hvilStatusState[datalayer_extended.tesla.hvil_status]) + " ";
static const char* contactorState[] = {"SNA", "OPEN", "PRECHARGE", "BLOCKED",
"PULLED_IN", "OPENING", "ECONOMIZED", "WELDED",
"UNKNOWN(8)", "UNKNOWN(9)", "UNKNOWN(10)", "UNKNOWN(11)"};
content +=
"Negative contactor: " + String(contactorState[datalayer_extended.tesla.packContNegativeState]) + " ";
content +=
"Positive contactor: " + String(contactorState[datalayer_extended.tesla.packContPositiveState]) + " ";
static const char* falseTrue[] = {"False", "True"};
content += "Closing allowed?: " + String(falseTrue[datalayer_extended.tesla.packCtrsClosingAllowed]) + " ";
content += "Pyrotest: " + String(falseTrue[datalayer_extended.tesla.pyroTestInProgress]) + " ";
#endif
#ifdef NISSAN_LEAF_BATTERY
content += "LEAF generation: " + String(datalayer_extended.nissanleaf.LEAF_gen) + " ";
content += "GIDS: " + String(datalayer_extended.nissanleaf.GIDS) + " ";
content += "Regen kW: " + String(datalayer_extended.nissanleaf.ChargePowerLimit) + " ";
content += "Charge kW: " + String(datalayer_extended.nissanleaf.MaxPowerForCharger) + " ";
content += "Interlock: " + String(datalayer_extended.nissanleaf.Interlock) + " ";
content += "Relay cut request: " + String(datalayer_extended.nissanleaf.RelayCutRequest) + " ";
content += "Failsafe status: " + String(datalayer_extended.nissanleaf.FailsafeStatus) + " ";
content += "Fully charged: " + String(datalayer_extended.nissanleaf.Full) + " ";
content += "Battery empty: " + String(datalayer_extended.nissanleaf.Empty) + " ";
content += "Main relay ON: " + String(datalayer_extended.nissanleaf.MainRelayOn) + " ";
content += "Heater present: " + String(datalayer_extended.nissanleaf.HeatExist) + " ";
content += "Heating stopped: " + String(datalayer_extended.nissanleaf.HeatingStop) + " ";
content += "Heating started: " + String(datalayer_extended.nissanleaf.HeatingStart) + " ";
content += "Heating requested: " + String(datalayer_extended.nissanleaf.HeaterSendRequest) + " ";
#endif
#if !defined(TESLA_BATTERY) && !defined(NISSAN_LEAF_BATTERY) && !defined(BMW_I3_BATTERY) && \
!defined(BYD_ATTO_3_BATTERY) && !defined(CELLPOWER_BMS) //Only the listed types have extra info
content += "No extra information available for this battery type";
#endif
content += "";
content += "";
return content;
}
return String();
}