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;
}