diff --git a/Software/src/battery/BMW-IX-HTML.h b/Software/src/battery/BMW-IX-HTML.h
index 64b88fb9..27bd3d56 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 += "0 No balancing mode active
";
+ break;
+ case 1:
+ content += "1 Voltage-Controlled Balancing Mode";
+ break;
+ case 2:
+ content += "2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging";
+ break;
+ case 3:
+ content += "3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage";
+ break;
+ case 4:
+ content += "4 No balancing mode active, qualifier invalid";
+ break;
+ default:
+ content += "Unknown";
+ }
+ content += "HVIL Status: ";
+ switch (datalayer_extended.bmwix.hvil_status) {
+ case 0:
+ content += "Error (Loop Open)
";
+ break;
+ case 1:
+ content += "OK (Loop Closed)";
+ break;
+ default:
+ 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
";
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 += "0 Value Invalid
";
+ break;
+ case 1:
+ content += "1 Successfully Blown";
+ break;
+ case 2:
+ content += "2 Disconnected";
+ break;
+ case 3:
+ content += "3 Not Activated - Pyro Intact";
+ break;
+ case 4:
+ content += "4 Unknown";
+ break;
+ default:
+ content += "Unknown";
+ }
+ content += "Pyro Status PSS4: ";
+ switch (datalayer_extended.bmwix.pyro_status_pss4) {
+ case 0:
+ content += "0 Value Invalid
";
+ break;
+ case 1:
+ content += "1 Successfully Blown";
+ break;
+ case 2:
+ content += "2 Disconnected";
+ break;
+ case 3:
+ content += "3 Not Activated - Pyro Intact";
+ break;
+ case 4:
+ content += "4 Unknown";
+ break;
+ default:
+ content += "Unknown";
+ }
+ content += "Pyro Status PSS6: ";
+ switch (datalayer_extended.bmwix.pyro_status_pss6) {
+ case 0:
+ content += "0 Value Invalid
";
+ break;
+ case 1:
+ content += "1 Successfully Blown";
+ break;
+ case 2:
+ content += "2 Disconnected";
+ break;
+ case 3:
+ content += "3 Not Activated - Pyro Intact";
+ break;
+ case 4:
+ content += "4 Unknown";
+ break;
+ default:
+ content += "Unknown";
+ }
return content;
}
diff --git a/Software/src/battery/BMW-PHEV-HTML.h b/Software/src/battery/BMW-PHEV-HTML.h
index 812fd101..3b171d41 100644
--- a/Software/src/battery/BMW-PHEV-HTML.h
+++ b/Software/src/battery/BMW-PHEV-HTML.h
@@ -15,90 +15,203 @@ 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]) + "
";
- 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 += "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");
+ }
+ 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 +=
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
";
diff --git a/Software/src/battery/NISSAN-LEAF-HTML.h b/Software/src/battery/NISSAN-LEAF-HTML.h
index 18aac585..4d21d4dd 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));