#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) + " ";
content += "Reset degradation data ";
content += "CryptoChallenge: " + String(datalayer_extended.nissanleaf.CryptoChallenge) + " ";
content += "SolvedChallenge: " + String(datalayer_extended.nissanleaf.SolvedChallengeMSB) +
String(datalayer_extended.nissanleaf.SolvedChallengeLSB) + " ";
content += "Challenge failed: " + String(datalayer_extended.nissanleaf.challengeFailed) + " ";
#endif
#ifdef RENAULT_ZOE_GEN2_BATTERY
content += "soc: " + String(datalayer_extended.zoePH2.battery_soc) + " ";
content += "usable soc: " + String(datalayer_extended.zoePH2.battery_usable_soc) + " ";
content += "soh: " + String(datalayer_extended.zoePH2.battery_soh) + " ";
content += "pack voltage: " + String(datalayer_extended.zoePH2.battery_pack_voltage) + " ";
content += "max cell voltage: " + String(datalayer_extended.zoePH2.battery_max_cell_voltage) + " ";
content += "min cell voltage: " + String(datalayer_extended.zoePH2.battery_min_cell_voltage) + " ";
content += "12v: " + String(datalayer_extended.zoePH2.battery_12v) + " ";
content += "avg temp: " + String(datalayer_extended.zoePH2.battery_avg_temp) + " ";
content += "min temp: " + String(datalayer_extended.zoePH2.battery_min_temp) + " ";
content += "max temp: " + String(datalayer_extended.zoePH2.battery_max_temp) + " ";
content += "max power: " + String(datalayer_extended.zoePH2.battery_max_power) + " ";
content += "interlock: " + String(datalayer_extended.zoePH2.battery_interlock) + " ";
content += "kwh: " + String(datalayer_extended.zoePH2.battery_kwh) + " ";
content += "current: " + String(datalayer_extended.zoePH2.battery_current) + " ";
content += "current offset: " + String(datalayer_extended.zoePH2.battery_current_offset) + " ";
content += "max generated: " + String(datalayer_extended.zoePH2.battery_max_generated) + " ";
content += "max available: " + String(datalayer_extended.zoePH2.battery_max_available) + " ";
content += "current voltage: " + String(datalayer_extended.zoePH2.battery_current_voltage) + " ";
content += "charging status: " + String(datalayer_extended.zoePH2.battery_charging_status) + " ";
content += "remaining charge: " + String(datalayer_extended.zoePH2.battery_remaining_charge) + " ";
content +=
"balance capacity total: " + String(datalayer_extended.zoePH2.battery_balance_capacity_total) + " ";
content += "balance time total: " + String(datalayer_extended.zoePH2.battery_balance_time_total) + " ";
content +=
"balance capacity sleep: " + String(datalayer_extended.zoePH2.battery_balance_capacity_sleep) + " ";
content += "balance time sleep: " + String(datalayer_extended.zoePH2.battery_balance_time_sleep) + " ";
content +=
"balance capacity wake: " + String(datalayer_extended.zoePH2.battery_balance_capacity_wake) + " ";
content += "balance time wake: " + String(datalayer_extended.zoePH2.battery_balance_time_wake) + " ";
content += "bms state: " + String(datalayer_extended.zoePH2.battery_bms_state) + " ";
content += "balance switches: " + String(datalayer_extended.zoePH2.battery_balance_switches) + " ";
content += "energy complete: " + String(datalayer_extended.zoePH2.battery_energy_complete) + " ";
content += "energy partial: " + String(datalayer_extended.zoePH2.battery_energy_partial) + " ";
content += "slave failures: " + String(datalayer_extended.zoePH2.battery_slave_failures) + " ";
content += "mileage: " + String(datalayer_extended.zoePH2.battery_mileage) + " ";
content += "fan speed: " + String(datalayer_extended.zoePH2.battery_fan_speed) + " ";
content += "fan period: " + String(datalayer_extended.zoePH2.battery_fan_period) + " ";
content += "fan control: " + String(datalayer_extended.zoePH2.battery_fan_control) + " ";
content += "fan duty: " + String(datalayer_extended.zoePH2.battery_fan_duty) + " ";
content += "temporisation: " + String(datalayer_extended.zoePH2.battery_temporisation) + " ";
content += "time: " + String(datalayer_extended.zoePH2.battery_time) + " ";
content += "pack time: " + String(datalayer_extended.zoePH2.battery_pack_time) + " ";
content += "soc min: " + String(datalayer_extended.zoePH2.battery_soc_min) + " ";
content += "soc max: " + String(datalayer_extended.zoePH2.battery_soc_max) + " ";
#endif //RENAULT_ZOE_GEN2_BATTERY
#if !defined(TESLA_BATTERY) && !defined(NISSAN_LEAF_BATTERY) && !defined(BMW_I3_BATTERY) && \
!defined(BYD_ATTO_3_BATTERY) && !defined(RENAULT_ZOE_GEN2_BATTERY) && !defined(CELLPOWER_BMS)
content += "No extra information available for this battery type";
#endif
content += "";
content += "";
return content;
}
return String();
}