#include "advanced_battery_html.h" #include #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 += ""; // 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(); }