diff --git a/Software/src/battery/BMW-I3-HTML.cpp b/Software/src/battery/BMW-I3-HTML.cpp index 97bd9822..e8a36a40 100644 --- a/Software/src/battery/BMW-I3-HTML.cpp +++ b/Software/src/battery/BMW-I3-HTML.cpp @@ -2,6 +2,14 @@ #include "../include.h" #include "BMW-I3-BATTERY.h" +// Helper function for safe array access +static const char* safeArrayAccess(const char* const arr[], size_t arrSize, int idx) { + if (idx >= 0 && static_cast(idx) < arrSize && arr[idx][0] != '\0') { + return arr[idx]; + } + return "Unknown"; +} + String BmwI3HtmlRenderer::get_status_html() { String content; @@ -10,12 +18,12 @@ String BmwI3HtmlRenderer::get_status_html() { content += "

SOC OBD2: " + String(batt.SOC_OBD2()) + "

"; static const char* statusText[16] = { "Not evaluated", "OK", "Error!", "Invalid signal", "", "", "", "", "", "", "", "", "", "", "", ""}; - content += "

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

"; - content += "

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

"; - content += "

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

"; - content += "

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

"; - content += "

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

"; - content += "

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

"; + content += "

Interlock: " + String(safeArrayAccess(statusText, 16, batt.ST_interlock())) + "

"; + content += "

Isolation external: " + String(safeArrayAccess(statusText, 16, batt.ST_iso_ext())) + "

"; + content += "

Isolation internal: " + String(safeArrayAccess(statusText, 16, batt.ST_iso_int())) + "

"; + content += "

Isolation: " + String(safeArrayAccess(statusText, 16, batt.ST_isolation())) + "

"; + content += "

Cooling valve: " + String(safeArrayAccess(statusText, 16, batt.ST_valve_cooling())) + "

"; + content += "

Emergency: " + String(safeArrayAccess(statusText, 16, batt.ST_EMG())) + "

"; static const char* prechargeText[16] = {"Not evaluated", "Not active, closing not blocked", "Error precharge blocked", @@ -32,7 +40,8 @@ String BmwI3HtmlRenderer::get_status_html() { "", "", ""}; - content += "

Precharge: " + String(prechargeText[batt.ST_precharge()]) + "

"; //Still unclear of enum + content += "

Precharge: " + String(safeArrayAccess(prechargeText, 16, batt.ST_precharge())) + + "

"; //Still unclear of enum static const char* DCSWText[16] = {"Contactors open", "Precharge ongoing", "Contactors engaged", @@ -49,7 +58,7 @@ String BmwI3HtmlRenderer::get_status_html() { "", "", ""}; - content += "

Contactor status: " + String(DCSWText[batt.ST_DCSW()]) + "

"; + content += "

Contactor status: " + String(safeArrayAccess(DCSWText, 16, batt.ST_DCSW())) + "

"; static const char* contText[16] = {"Contactors OK", "One contactor welded!", "Two contactors welded!", @@ -66,7 +75,7 @@ String BmwI3HtmlRenderer::get_status_html() { "", "", ""}; - content += "

Contactor weld: " + String(contText[batt.ST_WELD()]) + "

"; + content += "

Contactor weld: " + String(safeArrayAccess(contText, 16, batt.ST_WELD())) + "

"; static const char* valveText[16] = {"OK", "Short circuit to GND", "Short circuit to 12V", @@ -83,7 +92,8 @@ String BmwI3HtmlRenderer::get_status_html() { "Stuck", "", "Invalid Signal"}; - content += "

Cold shutoff valve: " + String(contText[batt.ST_cold_shutoff_valve()]) + "

"; + content += + "

Cold shutoff valve: " + String(safeArrayAccess(valveText, 16, batt.ST_cold_shutoff_valve())) + "

"; return content; }