From 5d0b93986cdd60f8d9137763bd72c1d260e7df1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sun, 8 Jun 2025 20:22:50 +0300 Subject: [PATCH 1/5] Start to work on making webserver crash free --- Software/src/battery/BMW-PHEV-HTML.h | 138 +++++++++++++++++++++--- Software/src/battery/NISSAN-LEAF-HTML.h | 16 ++- 2 files changed, 138 insertions(+), 16 deletions(-) diff --git a/Software/src/battery/BMW-PHEV-HTML.h b/Software/src/battery/BMW-PHEV-HTML.h index 812fd101..1d03ef06 100644 --- a/Software/src/battery/BMW-PHEV-HTML.h +++ b/Software/src/battery/BMW-PHEV-HTML.h @@ -15,20 +15,130 @@ class BmwPhevHtmlRenderer : public BatteryHtmlRenderer { " dV"; content += "

Allowed Discharge Power: " + String(datalayer.battery.status.max_discharge_power_W) + " W

"; content += "

Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W

"; - static const char* balanceText[5] = {"0 Balancing Inactive - Balancing not needed", "1 Balancing Active", - "2 Balancing Inactive - Cells not in rest break wait 10mins", - "3 Balancing Inactive", "4 Unknown"}; - content += "

Balancing: " + String((balanceText[datalayer_extended.bmwphev.balancing_status])) + "

"; - static const char* pyroText[5] = {"0 Value Invalid", "1 Successfully Blown", "2 Disconnected", - "3 Not Activated - Pyro Intact", "4 Unknown"}; - static const char* statusText[16] = { - "Not evaluated", "OK", "Error!", "Invalid signal", "", "", "", "", "", "", "", "", "", "", "", ""}; - content += "

Interlock: " + String(statusText[datalayer_extended.bmwphev.ST_interlock]) + "

"; - content += "

Isolation external: " + String(statusText[datalayer_extended.bmwphev.ST_iso_ext]) + "

"; - content += "

Isolation internal: " + String(statusText[datalayer_extended.bmwphev.ST_iso_int]) + "

"; - content += "

Isolation: " + String(statusText[datalayer_extended.bmwphev.ST_isolation]) + "

"; - content += "

Cooling valve: " + String(statusText[datalayer_extended.bmwphev.ST_valve_cooling]) + "

"; - content += "

Emergency: " + String(statusText[datalayer_extended.bmwphev.ST_EMG]) + "

"; + content += "

Balancing: "; + switch (datalayer_extended.bmwphev.balancing_status) { + case 0: + content += String("0 Balancing Inactive - Balancing not needed

"); + break; + case 1: + content += String("1 Balancing Active"); + break; + case 2: + content += String("2 Balancing Inactive - Cells not in rest break wait 10mins"); + break; + case 3: + content += String("3 Balancing Inactive"); + break; + case 4: + content += String("4 Unknown"); + break; + default: + content += String("Unknown"); + } + content += "

Interlock: "; + switch (datalayer_extended.bmwphev.ST_interlock) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("OK"); + break; + case 2: + content += String("Error! Not seated!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Isolation external: "; + switch (datalayer_extended.bmwphev.ST_iso_ext) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("OK"); + break; + case 2: + content += String("Error!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Isolation internal: "; + switch (datalayer_extended.bmwphev.ST_iso_int) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("OK"); + break; + case 2: + content += String("Error!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Isolation: "; + switch (datalayer_extended.bmwphev.ST_isolation) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("OK"); + break; + case 2: + content += String("Error!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Cooling valve: "; + switch (datalayer_extended.bmwphev.ST_valve_cooling) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("OK"); + break; + case 2: + content += String("Error!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Emergency: "; + switch (datalayer_extended.bmwphev.ST_EMG) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("OK"); + break; + case 2: + content += String("Error!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + + static const char* prechargeText[16] = {"Not evaluated", "Not active, closing not blocked", "Error precharge blocked", diff --git a/Software/src/battery/NISSAN-LEAF-HTML.h b/Software/src/battery/NISSAN-LEAF-HTML.h index 18aac585..275bef7b 100644 --- a/Software/src/battery/NISSAN-LEAF-HTML.h +++ b/Software/src/battery/NISSAN-LEAF-HTML.h @@ -10,8 +10,20 @@ class NissanLeafHtmlRenderer : public BatteryHtmlRenderer { String get_status_html() { String content; - static const char* LEAFgen[] = {"ZE0", "AZE0", "ZE1"}; - content += "

LEAF generation: " + String(LEAFgen[datalayer_extended.nissanleaf.LEAF_gen]) + "

"; + content += "

LEAF generation: "; + switch (datalayer_extended.nissanleaf.LEAF_gen) { + case 0: + content += String("ZE0

"); + break; + case 1: + content += String("AZE0"); + break; + case 2: + content += String("ZE1"); + break; + default: + content += String("Unknown"); + } char readableSerialNumber[16]; // One extra space for null terminator memcpy(readableSerialNumber, datalayer_extended.nissanleaf.BatterySerialNumber, sizeof(datalayer_extended.nissanleaf.BatterySerialNumber)); From 289fa0d16ef80d92979cf000895c6fd1d382efd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Tue, 10 Jun 2025 13:07:22 +0300 Subject: [PATCH 2/5] Make PHEV HTML array crash proof --- Software/src/battery/BMW-PHEV-HTML.h | 223 ++++++++++++++------------- 1 file changed, 113 insertions(+), 110 deletions(-) diff --git a/Software/src/battery/BMW-PHEV-HTML.h b/Software/src/battery/BMW-PHEV-HTML.h index 1d03ef06..3b171d41 100644 --- a/Software/src/battery/BMW-PHEV-HTML.h +++ b/Software/src/battery/BMW-PHEV-HTML.h @@ -17,198 +17,201 @@ class BmwPhevHtmlRenderer : public BatteryHtmlRenderer { content += "

Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W

"; content += "

Balancing: "; switch (datalayer_extended.bmwphev.balancing_status) { - case 0: + case 0: content += String("0 Balancing Inactive - Balancing not needed

"); break; - case 1: + case 1: content += String("1 Balancing Active"); break; - case 2: + case 2: content += String("2 Balancing Inactive - Cells not in rest break wait 10mins"); break; - case 3: + case 3: content += String("3 Balancing Inactive"); break; - case 4: + case 4: content += String("4 Unknown"); break; - default: + default: content += String("Unknown"); } - content += "

Interlock: "; + content += "

Interlock: "; switch (datalayer_extended.bmwphev.ST_interlock) { - case 0: + case 0: content += String("Not Evaluated

"); break; - case 1: + case 1: content += String("OK"); break; - case 2: + case 2: content += String("Error! Not seated!"); break; - case 3: + case 3: content += String("Invalid signal"); break; - default: + default: content += String("Unknown"); } - content += "

Isolation external: "; + content += "

Isolation external: "; switch (datalayer_extended.bmwphev.ST_iso_ext) { - case 0: + case 0: content += String("Not Evaluated

"); break; - case 1: + case 1: content += String("OK"); break; - case 2: + case 2: content += String("Error!"); break; - case 3: + case 3: content += String("Invalid signal"); break; - default: + default: content += String("Unknown"); } content += "

Isolation internal: "; switch (datalayer_extended.bmwphev.ST_iso_int) { - case 0: + case 0: content += String("Not Evaluated

"); break; - case 1: + case 1: content += String("OK"); break; - case 2: + case 2: content += String("Error!"); break; - case 3: + case 3: content += String("Invalid signal"); break; - default: + default: content += String("Unknown"); } content += "

Isolation: "; switch (datalayer_extended.bmwphev.ST_isolation) { - case 0: + case 0: content += String("Not Evaluated

"); break; - case 1: + case 1: content += String("OK"); break; - case 2: + case 2: content += String("Error!"); break; - case 3: + case 3: content += String("Invalid signal"); break; - default: + default: content += String("Unknown"); } content += "

Cooling valve: "; switch (datalayer_extended.bmwphev.ST_valve_cooling) { - case 0: + case 0: content += String("Not Evaluated

"); break; - case 1: + case 1: content += String("OK"); break; - case 2: + case 2: content += String("Error!"); break; - case 3: + case 3: content += String("Invalid signal"); break; - default: + default: content += String("Unknown"); } content += "

Emergency: "; switch (datalayer_extended.bmwphev.ST_EMG) { - case 0: + case 0: content += String("Not Evaluated

"); break; - case 1: + case 1: content += String("OK"); break; - case 2: + case 2: content += String("Error!"); break; - case 3: + case 3: content += String("Invalid signal"); break; - default: + default: content += String("Unknown"); } - - - static const char* prechargeText[16] = {"Not evaluated", - "Not active, closing not blocked", - "Error precharge blocked", - "Invalid signal", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - ""}; - content += "

Precharge: " + String(prechargeText[datalayer_extended.bmwphev.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.bmwphev.ST_DCSW]) + "

"; - static const char* contText[16] = {"Contactors OK", - "One contactor welded!", - "Two contactors welded!", - "Invalid signal", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - ""}; - content += "

Contactor weld: " + String(contText[datalayer_extended.bmwphev.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(valveText[datalayer_extended.bmwphev.ST_cold_shutoff_valve]) + "

"; + content += "

Precharge: "; + switch (datalayer_extended.bmwphev.ST_precharge) { + case 0: + content += String("Not Evaluated

"); + break; + case 1: + content += String("Not active, closing not blocked"); + break; + case 2: + content += String("Error precharge blocked"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); //Still unclear of enum + } + content += "

Contactor status: "; + switch (datalayer_extended.bmwphev.ST_DCSW) { + case 0: + content += String("Contactors open

"); + break; + case 1: + content += String("Precharge ongoing"); + break; + case 2: + content += String("Contactors engaged"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Contactor weld: "; + switch (datalayer_extended.bmwphev.ST_WELD) { + case 0: + content += String("Contactors OK

"); + break; + case 1: + content += String("One contactor welded!"); + break; + case 2: + content += String("Two contactors welded!"); + break; + case 3: + content += String("Invalid signal"); + break; + default: + content += String("Unknown"); + } + content += "

Cold shutoff valve: "; + switch (datalayer_extended.bmwphev.ST_cold_shutoff_valve) { + case 0: + content += String("OK

"); + break; + case 1: + content += String("Short circuit to GND"); + break; + case 2: + content += String("Short circuit to 12V"); + break; + case 3: + content += String("Line break"); + break; + case 6: + content += String("Driver error"); + break; + case 12: + case 13: + content += String("Stuck"); + break; + default: + content += String("Invalid Signal"); + } content += "

Min Cell Voltage Data Age: " + String(datalayer_extended.bmwphev.min_cell_voltage_data_age) + " ms

"; content += From 6dedcf0a405447afa6a9e34226adc3032202a4a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Tue, 10 Jun 2025 13:16:42 +0300 Subject: [PATCH 3/5] Make iX HTML arrays crash proof --- Software/src/battery/BMW-IX-HTML.h | 103 +++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 12 deletions(-) diff --git a/Software/src/battery/BMW-IX-HTML.h b/Software/src/battery/BMW-IX-HTML.h index 64b88fb9..02be12eb 100644 --- a/Software/src/battery/BMW-IX-HTML.h +++ b/Software/src/battery/BMW-IX-HTML.h @@ -25,13 +25,37 @@ class BmwIXHtmlRenderer : public BatteryHtmlRenderer { content += "

Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W

"; content += "

T30 Terminal Voltage: " + String(datalayer_extended.bmwix.T30_Voltage) + " mV

"; content += "

Detected Cell Count: " + String(datalayer.battery.info.number_of_cells) + "

"; - static const char* balanceText[5] = {"0 No balancing mode active", "1 Voltage-Controlled Balancing Mode", - "2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging", - "3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage", - "4 No balancing mode active, qualifier invalid"}; - content += "

Balancing: " + String((balanceText[datalayer_extended.bmwix.balancing_status])) + "

"; - static const char* hvilText[2] = {"Error (Loop Open)", "OK (Loop Closed)"}; - content += "

HVIL Status: " + String(hvilText[datalayer_extended.bmwix.hvil_status]) + "

"; + content += "

Balancing: "; + switch (datalayer_extended.bmwix.balancing_status) { + case 0: + content += String("0 No balancing mode active

"); + break; + case 1: + content += String("1 Voltage-Controlled Balancing Mode"); + break; + case 2: + content += String("2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging"); + break; + case 3: + content += String("3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage"); + break; + case 4: + content += String("4 No balancing mode active, qualifier invalid"); + break; + default: + content += String("Unknown"); + } + content += "

HVIL Status: "; + switch (datalayer_extended.bmwix.hvil_status) { + case 0: + content += String("Error (Loop Open)

"); + break; + case 1: + content += String("OK (Loop Closed)"); + break; + default: + content += String("Unknown"); + } content += "

BMS Uptime: " + String(datalayer_extended.bmwix.bms_uptime) + " seconds

"; content += "

BMS Allowed Charge Amps: " + String(datalayer_extended.bmwix.allowable_charge_amps) + " A

"; content += @@ -41,11 +65,66 @@ class BmwIXHtmlRenderer : public BatteryHtmlRenderer { content += "

Isolation Positive: " + String(datalayer_extended.bmwix.iso_safety_positive) + " kOhm

"; content += "

Isolation Negative: " + String(datalayer_extended.bmwix.iso_safety_negative) + " kOhm

"; content += "

Isolation Parallel: " + String(datalayer_extended.bmwix.iso_safety_parallel) + " kOhm

"; - static const char* pyroText[5] = {"0 Value Invalid", "1 Successfully Blown", "2 Disconnected", - "3 Not Activated - Pyro Intact", "4 Unknown"}; - content += "

Pyro Status PSS1: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss1])) + "

"; - content += "

Pyro Status PSS4: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss4])) + "

"; - content += "

Pyro Status PSS6: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss6])) + "

"; + content += "

Pyro Status PSS1: "; + switch (datalayer_extended.bmwix.pyro_status_pss1) { + case 0: + content += String("0 Value Invalid

"); + break; + case 1: + content += String("1 Successfully Blown"); + break; + case 2: + content += String("2 Disconnected"); + break; + case 3: + content += String("3 Not Activated - Pyro Intact"); + break; + case 4: + content += String("4 Unknown"); + break; + default: + content += String("Unknown"); + } + content += "

Pyro Status PSS4: "; + switch (datalayer_extended.bmwix.pyro_status_pss4) { + case 0: + content += String("0 Value Invalid

"); + break; + case 1: + content += String("1 Successfully Blown"); + break; + case 2: + content += String("2 Disconnected"); + break; + case 3: + content += String("3 Not Activated - Pyro Intact"); + break; + case 4: + content += String("4 Unknown"); + break; + default: + content += String("Unknown"); + } + content += "

Pyro Status PSS6: "; + switch (datalayer_extended.bmwix.pyro_status_pss6) { + case 0: + content += String("0 Value Invalid

"); + break; + case 1: + content += String("1 Successfully Blown"); + break; + case 2: + content += String("2 Disconnected"); + break; + case 3: + content += String("3 Not Activated - Pyro Intact"); + break; + case 4: + content += String("4 Unknown"); + break; + default: + content += String("Unknown"); + } return content; } From ae460f98262775bb264b6c76f7174b09f5d64da6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 10:20:06 +0000 Subject: [PATCH 4/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Software/src/battery/NISSAN-LEAF-HTML.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Software/src/battery/NISSAN-LEAF-HTML.h b/Software/src/battery/NISSAN-LEAF-HTML.h index 275bef7b..4d21d4dd 100644 --- a/Software/src/battery/NISSAN-LEAF-HTML.h +++ b/Software/src/battery/NISSAN-LEAF-HTML.h @@ -10,7 +10,7 @@ class NissanLeafHtmlRenderer : public BatteryHtmlRenderer { String get_status_html() { String content; - content += "

LEAF generation: "; + content += "

LEAF generation: "; switch (datalayer_extended.nissanleaf.LEAF_gen) { case 0: content += String("ZE0

"); From 95957a503c8c16bd2c031634d7ba53b3502d980f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sun, 15 Jun 2025 12:04:13 +0300 Subject: [PATCH 5/5] Remove unecessary string calls --- Software/src/battery/BMW-IX-HTML.h | 54 +++++++------- Software/src/battery/MEB-HTML.h | 116 ++++++++++++++--------------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/Software/src/battery/BMW-IX-HTML.h b/Software/src/battery/BMW-IX-HTML.h index 02be12eb..27bd3d56 100644 --- a/Software/src/battery/BMW-IX-HTML.h +++ b/Software/src/battery/BMW-IX-HTML.h @@ -28,33 +28,33 @@ class BmwIXHtmlRenderer : public BatteryHtmlRenderer { content += "

Balancing: "; switch (datalayer_extended.bmwix.balancing_status) { case 0: - content += String("0 No balancing mode active

"); + content += "0 No balancing mode active"; break; case 1: - content += String("1 Voltage-Controlled Balancing Mode"); + content += "1 Voltage-Controlled Balancing Mode"; break; case 2: - content += String("2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging"); + content += "2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging"; break; case 3: - content += String("3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage"); + content += "3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage"; break; case 4: - content += String("4 No balancing mode active, qualifier invalid"); + content += "4 No balancing mode active, qualifier invalid"; break; default: - content += String("Unknown"); + content += "Unknown"; } content += "

HVIL Status: "; switch (datalayer_extended.bmwix.hvil_status) { case 0: - content += String("Error (Loop Open)

"); + content += "Error (Loop Open)"; break; case 1: - content += String("OK (Loop Closed)"); + content += "OK (Loop Closed)"; break; default: - content += String("Unknown"); + content += "Unknown"; } content += "

BMS Uptime: " + String(datalayer_extended.bmwix.bms_uptime) + " seconds

"; content += "

BMS Allowed Charge Amps: " + String(datalayer_extended.bmwix.allowable_charge_amps) + " A

"; @@ -68,62 +68,62 @@ class BmwIXHtmlRenderer : public BatteryHtmlRenderer { content += "

Pyro Status PSS1: "; switch (datalayer_extended.bmwix.pyro_status_pss1) { case 0: - content += String("0 Value Invalid

"); + content += "0 Value Invalid"; break; case 1: - content += String("1 Successfully Blown"); + content += "1 Successfully Blown"; break; case 2: - content += String("2 Disconnected"); + content += "2 Disconnected"; break; case 3: - content += String("3 Not Activated - Pyro Intact"); + content += "3 Not Activated - Pyro Intact"; break; case 4: - content += String("4 Unknown"); + content += "4 Unknown"; break; default: - content += String("Unknown"); + content += "Unknown"; } content += "

Pyro Status PSS4: "; switch (datalayer_extended.bmwix.pyro_status_pss4) { case 0: - content += String("0 Value Invalid

"); + content += "0 Value Invalid"; break; case 1: - content += String("1 Successfully Blown"); + content += "1 Successfully Blown"; break; case 2: - content += String("2 Disconnected"); + content += "2 Disconnected"; break; case 3: - content += String("3 Not Activated - Pyro Intact"); + content += "3 Not Activated - Pyro Intact"; break; case 4: - content += String("4 Unknown"); + content += "4 Unknown"; break; default: - content += String("Unknown"); + content += "Unknown"; } content += "

Pyro Status PSS6: "; switch (datalayer_extended.bmwix.pyro_status_pss6) { case 0: - content += String("0 Value Invalid

"); + content += "0 Value Invalid"; break; case 1: - content += String("1 Successfully Blown"); + content += "1 Successfully Blown"; break; case 2: - content += String("2 Disconnected"); + content += "2 Disconnected"; break; case 3: - content += String("3 Not Activated - Pyro Intact"); + content += "3 Not Activated - Pyro Intact"; break; case 4: - content += String("4 Unknown"); + content += "4 Unknown"; break; default: - content += String("Unknown"); + content += "Unknown"; } return content; diff --git a/Software/src/battery/MEB-HTML.h b/Software/src/battery/MEB-HTML.h index 401236fd..20363276 100644 --- a/Software/src/battery/MEB-HTML.h +++ b/Software/src/battery/MEB-HTML.h @@ -20,119 +20,119 @@ class MebHtmlRenderer : public BatteryHtmlRenderer { content += "

HVIL status: "; switch (datalayer_extended.meb.HVIL) { case 0: - content += String("Init"); + content += "Init"; break; case 1: - content += String("Closed"); + content += "Closed"; break; case 2: - content += String("Open!"); + content += "Open!"; break; case 3: - content += String("Fault"); + content += "Fault"; break; default: - content += String("?"); + content += "?"; } content += "

KL30C status: "; switch (datalayer_extended.meb.BMS_Kl30c_Status) { case 0: - content += String("Init"); + content += "Init"; break; case 1: - content += String("Closed"); + content += "Closed"; break; case 2: - content += String("Open!"); + content += "Open!"; break; case 3: - content += String("Fault"); + content += "Fault"; break; default: - content += String("?"); + content += "?"; } content += "

BMS mode: "; switch (datalayer_extended.meb.BMS_mode) { case 0: - content += String("HV inactive"); + content += "HV inactive"; break; case 1: - content += String("HV active"); + content += "HV active"; break; case 2: - content += String("Balancing"); + content += "Balancing"; break; case 3: - content += String("Extern charging"); + content += "Extern charging"; break; case 4: - content += String("AC charging"); + content += "AC charging"; break; case 5: - content += String("Battery error"); + content += "Battery error"; break; case 6: - content += String("DC charging"); + content += "DC charging"; break; case 7: - content += String("Init"); + content += "Init"; break; default: - content += String("?"); + content += "?"; } content += String("

Charging: ") + (datalayer_extended.meb.charging_active ? "active" : "not active"); content += String("

Balancing: "); switch (datalayer_extended.meb.balancing_active) { case 0: - content += String("init"); + content += "init"; break; case 1: - content += String("active"); + content += "active"; break; case 2: - content += String("inactive"); + content += "inactive"; break; default: - content += String("?"); + content += "?"; } content += String("

Slow charging: ") + (datalayer_extended.meb.balancing_request ? "requested" : "not requested"); content += "

Diagnostic: "; switch (datalayer_extended.meb.battery_diagnostic) { case 0: - content += String("Init"); + content += "Init"; break; case 1: - content += String("Battery display"); + content += "Battery display"; break; case 4: - content += String("Battery display OK"); + content += "Battery display OK"; break; case 6: - content += String("Battery display check"); + content += "Battery display check"; break; case 7: - content += String("Fault"); + content += "Fault"; break; default: - content += String("?"); + content += "?"; } content += "

HV line status: "; switch (datalayer_extended.meb.status_HV_line) { case 0: - content += String("Init"); + content += "Init"; break; case 1: - content += String("No open HV line detected"); + content += "No open HV line detected"; break; case 2: - content += String("Open HV line"); + content += "Open HV line"; break; case 3: - content += String("Fault"); + content += "Fault"; break; default: - content += String("? ") + String(datalayer_extended.meb.status_HV_line); + content += "? " + String(datalayer_extended.meb.status_HV_line); } content += "

"; content += datalayer_extended.meb.BMS_fault_performance ? "

BMS fault performance: Active!

" @@ -147,83 +147,83 @@ class MebHtmlRenderer : public BatteryHtmlRenderer { content += "

Welded contactors: "; switch (datalayer_extended.meb.BMS_welded_contactors_status) { case 0: - content += String("Init"); + content += "Init"; break; case 1: - content += String("No contactor welded"); + content += "No contactor welded"; break; case 2: - content += String("At least 1 contactor welded"); + content += "At least 1 contactor welded"; break; case 3: - content += String("Protection status detection error"); + content += "Protection status detection error"; break; default: - content += String("?"); + content += "?"; } content += "

Warning support: "; switch (datalayer_extended.meb.warning_support) { case 0: - content += String("OK"); + content += "OK"; break; case 1: - content += String("Not OK"); + content += "Not OK"; break; case 6: - content += String("Init"); + content += "Init"; break; case 7: - content += String("Fault"); + content += "Fault"; break; default: - content += String("?"); + content += "?"; } content += "

Interm. Voltage (" + String(datalayer_extended.meb.BMS_voltage_intermediate_dV / 10.0, 1) + "V) status: "; switch (datalayer_extended.meb.BMS_status_voltage_free) { case 0: - content += String("Init"); + content += "Init"; break; case 1: - content += String("BMS interm circuit voltage free (U<20V)"); + content += "BMS interm circuit voltage free (U<20V)"; break; case 2: - content += String("BMS interm circuit not voltage free (U >= 25V)"); + content += "BMS interm circuit not voltage free (U >= 25V)"; break; case 3: - content += String("Error"); + content += "Error"; break; default: - content += String("?"); + content += "?"; } content += "

BMS error status: "; switch (datalayer_extended.meb.BMS_error_status) { case 0: - content += String("Component IO"); + content += "Component IO"; break; case 1: - content += String("Iso Error 1"); + content += "Iso Error 1"; break; case 2: - content += String("Iso Error 2"); + content += "Iso Error 2"; break; case 3: - content += String("Interlock"); + content += "Interlock"; break; case 4: - content += String("SD"); + content += "SD"; break; case 5: - content += String("Performance red"); + content += "Performance red"; break; case 6: - content += String("No component function"); + content += "No component function"; break; case 7: - content += String("Init"); + content += "Init"; break; default: - content += String("?"); + content += "?"; } content += "

BMS voltage: " + String(datalayer_extended.meb.BMS_voltage_dV / 10.0, 1) + "

"; content += datalayer_extended.meb.BMS_OBD_MIL ? "

OBD MIL: ON!

" : "

OBD MIL: Off

";