mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-06 12:00:13 +02:00
Merge pull request #1221 from dalathegreat/improvement/webserver-robustness
Improvement: Make Webserver More Battery Info page more crash proof
This commit is contained in:
commit
f08f284edc
4 changed files with 360 additions and 156 deletions
|
@ -25,13 +25,37 @@ class BmwIXHtmlRenderer : public BatteryHtmlRenderer {
|
||||||
content += "<h4>Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W</h4>";
|
content += "<h4>Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W</h4>";
|
||||||
content += "<h4>T30 Terminal Voltage: " + String(datalayer_extended.bmwix.T30_Voltage) + " mV</h4>";
|
content += "<h4>T30 Terminal Voltage: " + String(datalayer_extended.bmwix.T30_Voltage) + " mV</h4>";
|
||||||
content += "<h4>Detected Cell Count: " + String(datalayer.battery.info.number_of_cells) + "</h4>";
|
content += "<h4>Detected Cell Count: " + String(datalayer.battery.info.number_of_cells) + "</h4>";
|
||||||
static const char* balanceText[5] = {"0 No balancing mode active", "1 Voltage-Controlled Balancing Mode",
|
content += "<h4>Balancing: ";
|
||||||
"2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging",
|
switch (datalayer_extended.bmwix.balancing_status) {
|
||||||
"3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage",
|
case 0:
|
||||||
"4 No balancing mode active, qualifier invalid"};
|
content += "0 No balancing mode active</h4>";
|
||||||
content += "<h4>Balancing: " + String((balanceText[datalayer_extended.bmwix.balancing_status])) + "</h4>";
|
break;
|
||||||
static const char* hvilText[2] = {"Error (Loop Open)", "OK (Loop Closed)"};
|
case 1:
|
||||||
content += "<h4>HVIL Status: " + String(hvilText[datalayer_extended.bmwix.hvil_status]) + "</h4>";
|
content += "1 Voltage-Controlled Balancing Mode</h4>";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += "2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging</h4>";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += "3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage</h4>";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
content += "4 No balancing mode active, qualifier invalid</h4>";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += "Unknown</h4>";
|
||||||
|
}
|
||||||
|
content += "<h4>HVIL Status: ";
|
||||||
|
switch (datalayer_extended.bmwix.hvil_status) {
|
||||||
|
case 0:
|
||||||
|
content += "Error (Loop Open)</h4>";
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += "OK (Loop Closed)</h4>";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += "Unknown</h4>";
|
||||||
|
}
|
||||||
content += "<h4>BMS Uptime: " + String(datalayer_extended.bmwix.bms_uptime) + " seconds</h4>";
|
content += "<h4>BMS Uptime: " + String(datalayer_extended.bmwix.bms_uptime) + " seconds</h4>";
|
||||||
content += "<h4>BMS Allowed Charge Amps: " + String(datalayer_extended.bmwix.allowable_charge_amps) + " A</h4>";
|
content += "<h4>BMS Allowed Charge Amps: " + String(datalayer_extended.bmwix.allowable_charge_amps) + " A</h4>";
|
||||||
content +=
|
content +=
|
||||||
|
@ -41,11 +65,66 @@ class BmwIXHtmlRenderer : public BatteryHtmlRenderer {
|
||||||
content += "<h4>Isolation Positive: " + String(datalayer_extended.bmwix.iso_safety_positive) + " kOhm</h4>";
|
content += "<h4>Isolation Positive: " + String(datalayer_extended.bmwix.iso_safety_positive) + " kOhm</h4>";
|
||||||
content += "<h4>Isolation Negative: " + String(datalayer_extended.bmwix.iso_safety_negative) + " kOhm</h4>";
|
content += "<h4>Isolation Negative: " + String(datalayer_extended.bmwix.iso_safety_negative) + " kOhm</h4>";
|
||||||
content += "<h4>Isolation Parallel: " + String(datalayer_extended.bmwix.iso_safety_parallel) + " kOhm</h4>";
|
content += "<h4>Isolation Parallel: " + String(datalayer_extended.bmwix.iso_safety_parallel) + " kOhm</h4>";
|
||||||
static const char* pyroText[5] = {"0 Value Invalid", "1 Successfully Blown", "2 Disconnected",
|
content += "<h4>Pyro Status PSS1: ";
|
||||||
"3 Not Activated - Pyro Intact", "4 Unknown"};
|
switch (datalayer_extended.bmwix.pyro_status_pss1) {
|
||||||
content += "<h4>Pyro Status PSS1: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss1])) + "</h4>";
|
case 0:
|
||||||
content += "<h4>Pyro Status PSS4: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss4])) + "</h4>";
|
content += "0 Value Invalid</h4>";
|
||||||
content += "<h4>Pyro Status PSS6: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss6])) + "</h4>";
|
break;
|
||||||
|
case 1:
|
||||||
|
content += "1 Successfully Blown</h4>";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += "2 Disconnected</h4>";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += "3 Not Activated - Pyro Intact</h4>";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
content += "4 Unknown</h4>";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += "Unknown</h4>";
|
||||||
|
}
|
||||||
|
content += "<h4>Pyro Status PSS4: ";
|
||||||
|
switch (datalayer_extended.bmwix.pyro_status_pss4) {
|
||||||
|
case 0:
|
||||||
|
content += "0 Value Invalid</h4>";
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += "1 Successfully Blown</h4>";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += "2 Disconnected</h4>";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += "3 Not Activated - Pyro Intact</h4>";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
content += "4 Unknown</h4>";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += "Unknown</h4>";
|
||||||
|
}
|
||||||
|
content += "<h4>Pyro Status PSS6: ";
|
||||||
|
switch (datalayer_extended.bmwix.pyro_status_pss6) {
|
||||||
|
case 0:
|
||||||
|
content += "0 Value Invalid</h4>";
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += "1 Successfully Blown</h4>";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += "2 Disconnected</h4>";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += "3 Not Activated - Pyro Intact</h4>";
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
content += "4 Unknown</h4>";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += "Unknown</h4>";
|
||||||
|
}
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,90 +15,203 @@ class BmwPhevHtmlRenderer : public BatteryHtmlRenderer {
|
||||||
" dV</h4>";
|
" dV</h4>";
|
||||||
content += "<h4>Allowed Discharge Power: " + String(datalayer.battery.status.max_discharge_power_W) + " W</h4>";
|
content += "<h4>Allowed Discharge Power: " + String(datalayer.battery.status.max_discharge_power_W) + " W</h4>";
|
||||||
content += "<h4>Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W</h4>";
|
content += "<h4>Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W</h4>";
|
||||||
static const char* balanceText[5] = {"0 Balancing Inactive - Balancing not needed", "1 Balancing Active",
|
content += "<h4>Balancing: ";
|
||||||
"2 Balancing Inactive - Cells not in rest break wait 10mins",
|
switch (datalayer_extended.bmwphev.balancing_status) {
|
||||||
"3 Balancing Inactive", "4 Unknown"};
|
case 0:
|
||||||
content += "<h4>Balancing: " + String((balanceText[datalayer_extended.bmwphev.balancing_status])) + "</h4>";
|
content += String("0 Balancing Inactive - Balancing not needed</h4>");
|
||||||
static const char* pyroText[5] = {"0 Value Invalid", "1 Successfully Blown", "2 Disconnected",
|
break;
|
||||||
"3 Not Activated - Pyro Intact", "4 Unknown"};
|
case 1:
|
||||||
static const char* statusText[16] = {
|
content += String("1 Balancing Active</h4>");
|
||||||
"Not evaluated", "OK", "Error!", "Invalid signal", "", "", "", "", "", "", "", "", "", "", "", ""};
|
break;
|
||||||
content += "<h4>Interlock: " + String(statusText[datalayer_extended.bmwphev.ST_interlock]) + "</h4>";
|
case 2:
|
||||||
content += "<h4>Isolation external: " + String(statusText[datalayer_extended.bmwphev.ST_iso_ext]) + "</h4>";
|
content += String("2 Balancing Inactive - Cells not in rest break wait 10mins</h4>");
|
||||||
content += "<h4>Isolation internal: " + String(statusText[datalayer_extended.bmwphev.ST_iso_int]) + "</h4>";
|
break;
|
||||||
content += "<h4>Isolation: " + String(statusText[datalayer_extended.bmwphev.ST_isolation]) + "</h4>";
|
case 3:
|
||||||
content += "<h4>Cooling valve: " + String(statusText[datalayer_extended.bmwphev.ST_valve_cooling]) + "</h4>";
|
content += String("3 Balancing Inactive</h4>");
|
||||||
content += "<h4>Emergency: " + String(statusText[datalayer_extended.bmwphev.ST_EMG]) + "</h4>";
|
break;
|
||||||
static const char* prechargeText[16] = {"Not evaluated",
|
case 4:
|
||||||
"Not active, closing not blocked",
|
content += String("4 Unknown</h4>");
|
||||||
"Error precharge blocked",
|
break;
|
||||||
"Invalid signal",
|
default:
|
||||||
"",
|
content += String("Unknown</h4>");
|
||||||
"",
|
}
|
||||||
"",
|
content += "<h4>Interlock: ";
|
||||||
"",
|
switch (datalayer_extended.bmwphev.ST_interlock) {
|
||||||
"",
|
case 0:
|
||||||
"",
|
content += String("Not Evaluated</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 1:
|
||||||
"",
|
content += String("OK</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 2:
|
||||||
""};
|
content += String("Error! Not seated!</h4>");
|
||||||
content += "<h4>Precharge: " + String(prechargeText[datalayer_extended.bmwphev.ST_precharge]) +
|
break;
|
||||||
"</h4>"; //Still unclear of enum
|
case 3:
|
||||||
static const char* DCSWText[16] = {"Contactors open",
|
content += String("Invalid signal</h4>");
|
||||||
"Precharge ongoing",
|
break;
|
||||||
"Contactors engaged",
|
default:
|
||||||
"Invalid signal",
|
content += String("Unknown</h4>");
|
||||||
"",
|
}
|
||||||
"",
|
content += "<h4>Isolation external: ";
|
||||||
"",
|
switch (datalayer_extended.bmwphev.ST_iso_ext) {
|
||||||
"",
|
case 0:
|
||||||
"",
|
content += String("Not Evaluated</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 1:
|
||||||
"",
|
content += String("OK</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 2:
|
||||||
"",
|
content += String("Error!</h4>");
|
||||||
""};
|
break;
|
||||||
content += "<h4>Contactor status: " + String(DCSWText[datalayer_extended.bmwphev.ST_DCSW]) + "</h4>";
|
case 3:
|
||||||
static const char* contText[16] = {"Contactors OK",
|
content += String("Invalid signal</h4>");
|
||||||
"One contactor welded!",
|
break;
|
||||||
"Two contactors welded!",
|
default:
|
||||||
"Invalid signal",
|
content += String("Unknown</h4>");
|
||||||
"",
|
}
|
||||||
"",
|
content += "<h4>Isolation internal: ";
|
||||||
"",
|
switch (datalayer_extended.bmwphev.ST_iso_int) {
|
||||||
"",
|
case 0:
|
||||||
"",
|
content += String("Not Evaluated</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 1:
|
||||||
"",
|
content += String("OK</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 2:
|
||||||
"",
|
content += String("Error!</h4>");
|
||||||
""};
|
break;
|
||||||
content += "<h4>Contactor weld: " + String(contText[datalayer_extended.bmwphev.ST_WELD]) + "</h4>";
|
case 3:
|
||||||
static const char* valveText[16] = {"OK",
|
content += String("Invalid signal</h4>");
|
||||||
"Short circuit to GND",
|
break;
|
||||||
"Short circuit to 12V",
|
default:
|
||||||
"Line break",
|
content += String("Unknown</h4>");
|
||||||
"",
|
}
|
||||||
"",
|
content += "<h4>Isolation: ";
|
||||||
"Driver error",
|
switch (datalayer_extended.bmwphev.ST_isolation) {
|
||||||
"",
|
case 0:
|
||||||
"",
|
content += String("Not Evaluated</h4>");
|
||||||
"",
|
break;
|
||||||
"",
|
case 1:
|
||||||
"",
|
content += String("OK</h4>");
|
||||||
"Stuck",
|
break;
|
||||||
"Stuck",
|
case 2:
|
||||||
"",
|
content += String("Error!</h4>");
|
||||||
"Invalid Signal"};
|
break;
|
||||||
content +=
|
case 3:
|
||||||
"<h4>Cold shutoff valve: " + String(valveText[datalayer_extended.bmwphev.ST_cold_shutoff_valve]) + "</h4>";
|
content += String("Invalid signal</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>");
|
||||||
|
}
|
||||||
|
content += "<h4>Cooling valve: ";
|
||||||
|
switch (datalayer_extended.bmwphev.ST_valve_cooling) {
|
||||||
|
case 0:
|
||||||
|
content += String("Not Evaluated</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("OK</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("Error!</h4>");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += String("Invalid signal</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>");
|
||||||
|
}
|
||||||
|
content += "<h4>Emergency: ";
|
||||||
|
switch (datalayer_extended.bmwphev.ST_EMG) {
|
||||||
|
case 0:
|
||||||
|
content += String("Not Evaluated</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("OK</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("Error!</h4>");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += String("Invalid signal</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>");
|
||||||
|
}
|
||||||
|
content += "<h4>Precharge: ";
|
||||||
|
switch (datalayer_extended.bmwphev.ST_precharge) {
|
||||||
|
case 0:
|
||||||
|
content += String("Not Evaluated</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("Not active, closing not blocked</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("Error precharge blocked</h4>");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += String("Invalid signal</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>"); //Still unclear of enum
|
||||||
|
}
|
||||||
|
content += "<h4>Contactor status: ";
|
||||||
|
switch (datalayer_extended.bmwphev.ST_DCSW) {
|
||||||
|
case 0:
|
||||||
|
content += String("Contactors open</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("Precharge ongoing</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("Contactors engaged</h4>");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += String("Invalid signal</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>");
|
||||||
|
}
|
||||||
|
content += "<h4>Contactor weld: ";
|
||||||
|
switch (datalayer_extended.bmwphev.ST_WELD) {
|
||||||
|
case 0:
|
||||||
|
content += String("Contactors OK</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("One contactor welded!</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("Two contactors welded!</h4>");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += String("Invalid signal</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>");
|
||||||
|
}
|
||||||
|
content += "<h4>Cold shutoff valve: ";
|
||||||
|
switch (datalayer_extended.bmwphev.ST_cold_shutoff_valve) {
|
||||||
|
case 0:
|
||||||
|
content += String("OK</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("Short circuit to GND</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("Short circuit to 12V</h4>");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
content += String("Line break</h4>");
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
content += String("Driver error</h4>");
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
case 13:
|
||||||
|
content += String("Stuck</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Invalid Signal</h4>");
|
||||||
|
}
|
||||||
content +=
|
content +=
|
||||||
"<h4>Min Cell Voltage Data Age: " + String(datalayer_extended.bmwphev.min_cell_voltage_data_age) + " ms</h4>";
|
"<h4>Min Cell Voltage Data Age: " + String(datalayer_extended.bmwphev.min_cell_voltage_data_age) + " ms</h4>";
|
||||||
content +=
|
content +=
|
||||||
|
|
|
@ -20,119 +20,119 @@ class MebHtmlRenderer : public BatteryHtmlRenderer {
|
||||||
content += "<h4>HVIL status: ";
|
content += "<h4>HVIL status: ";
|
||||||
switch (datalayer_extended.meb.HVIL) {
|
switch (datalayer_extended.meb.HVIL) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("Closed");
|
content += "Closed";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("Open!");
|
content += "Open!";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Fault");
|
content += "Fault";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>KL30C status: ";
|
content += "</h4><h4>KL30C status: ";
|
||||||
switch (datalayer_extended.meb.BMS_Kl30c_Status) {
|
switch (datalayer_extended.meb.BMS_Kl30c_Status) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("Closed");
|
content += "Closed";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("Open!");
|
content += "Open!";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Fault");
|
content += "Fault";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>BMS mode: ";
|
content += "</h4><h4>BMS mode: ";
|
||||||
switch (datalayer_extended.meb.BMS_mode) {
|
switch (datalayer_extended.meb.BMS_mode) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("HV inactive");
|
content += "HV inactive";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("HV active");
|
content += "HV active";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("Balancing");
|
content += "Balancing";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Extern charging");
|
content += "Extern charging";
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
content += String("AC charging");
|
content += "AC charging";
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
content += String("Battery error");
|
content += "Battery error";
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
content += String("DC charging");
|
content += "DC charging";
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += String("</h4><h4>Charging: ") + (datalayer_extended.meb.charging_active ? "active" : "not active");
|
content += String("</h4><h4>Charging: ") + (datalayer_extended.meb.charging_active ? "active" : "not active");
|
||||||
content += String("</h4><h4>Balancing: ");
|
content += String("</h4><h4>Balancing: ");
|
||||||
switch (datalayer_extended.meb.balancing_active) {
|
switch (datalayer_extended.meb.balancing_active) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("init");
|
content += "init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("active");
|
content += "active";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("inactive");
|
content += "inactive";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content +=
|
content +=
|
||||||
String("</h4><h4>Slow charging: ") + (datalayer_extended.meb.balancing_request ? "requested" : "not requested");
|
String("</h4><h4>Slow charging: ") + (datalayer_extended.meb.balancing_request ? "requested" : "not requested");
|
||||||
content += "</h4><h4>Diagnostic: ";
|
content += "</h4><h4>Diagnostic: ";
|
||||||
switch (datalayer_extended.meb.battery_diagnostic) {
|
switch (datalayer_extended.meb.battery_diagnostic) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("Battery display");
|
content += "Battery display";
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
content += String("Battery display OK");
|
content += "Battery display OK";
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
content += String("Battery display check");
|
content += "Battery display check";
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
content += String("Fault");
|
content += "Fault";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>HV line status: ";
|
content += "</h4><h4>HV line status: ";
|
||||||
switch (datalayer_extended.meb.status_HV_line) {
|
switch (datalayer_extended.meb.status_HV_line) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("No open HV line detected");
|
content += "No open HV line detected";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("Open HV line");
|
content += "Open HV line";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Fault");
|
content += "Fault";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("? ") + String(datalayer_extended.meb.status_HV_line);
|
content += "? " + String(datalayer_extended.meb.status_HV_line);
|
||||||
}
|
}
|
||||||
content += "</h4>";
|
content += "</h4>";
|
||||||
content += datalayer_extended.meb.BMS_fault_performance ? "<h4>BMS fault performance: Active!</h4>"
|
content += datalayer_extended.meb.BMS_fault_performance ? "<h4>BMS fault performance: Active!</h4>"
|
||||||
|
@ -147,83 +147,83 @@ class MebHtmlRenderer : public BatteryHtmlRenderer {
|
||||||
content += "<h4>Welded contactors: ";
|
content += "<h4>Welded contactors: ";
|
||||||
switch (datalayer_extended.meb.BMS_welded_contactors_status) {
|
switch (datalayer_extended.meb.BMS_welded_contactors_status) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("No contactor welded");
|
content += "No contactor welded";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("At least 1 contactor welded");
|
content += "At least 1 contactor welded";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Protection status detection error");
|
content += "Protection status detection error";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>Warning support: ";
|
content += "</h4><h4>Warning support: ";
|
||||||
switch (datalayer_extended.meb.warning_support) {
|
switch (datalayer_extended.meb.warning_support) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("OK");
|
content += "OK";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("Not OK");
|
content += "Not OK";
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
content += String("Fault");
|
content += "Fault";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>Interm. Voltage (" + String(datalayer_extended.meb.BMS_voltage_intermediate_dV / 10.0, 1) +
|
content += "</h4><h4>Interm. Voltage (" + String(datalayer_extended.meb.BMS_voltage_intermediate_dV / 10.0, 1) +
|
||||||
"V) status: ";
|
"V) status: ";
|
||||||
switch (datalayer_extended.meb.BMS_status_voltage_free) {
|
switch (datalayer_extended.meb.BMS_status_voltage_free) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("BMS interm circuit voltage free (U<20V)");
|
content += "BMS interm circuit voltage free (U<20V)";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("BMS interm circuit not voltage free (U >= 25V)");
|
content += "BMS interm circuit not voltage free (U >= 25V)";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Error");
|
content += "Error";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>BMS error status: ";
|
content += "</h4><h4>BMS error status: ";
|
||||||
switch (datalayer_extended.meb.BMS_error_status) {
|
switch (datalayer_extended.meb.BMS_error_status) {
|
||||||
case 0:
|
case 0:
|
||||||
content += String("Component IO");
|
content += "Component IO";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
content += String("Iso Error 1");
|
content += "Iso Error 1";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
content += String("Iso Error 2");
|
content += "Iso Error 2";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
content += String("Interlock");
|
content += "Interlock";
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
content += String("SD");
|
content += "SD";
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
content += String("Performance red");
|
content += "Performance red";
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
content += String("No component function");
|
content += "No component function";
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
content += String("Init");
|
content += "Init";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
content += String("?");
|
content += "?";
|
||||||
}
|
}
|
||||||
content += "</h4><h4>BMS voltage: " + String(datalayer_extended.meb.BMS_voltage_dV / 10.0, 1) + "</h4>";
|
content += "</h4><h4>BMS voltage: " + String(datalayer_extended.meb.BMS_voltage_dV / 10.0, 1) + "</h4>";
|
||||||
content += datalayer_extended.meb.BMS_OBD_MIL ? "<h4>OBD MIL: ON!</h4>" : "<h4>OBD MIL: Off</h4>";
|
content += datalayer_extended.meb.BMS_OBD_MIL ? "<h4>OBD MIL: ON!</h4>" : "<h4>OBD MIL: Off</h4>";
|
||||||
|
|
|
@ -10,8 +10,20 @@ class NissanLeafHtmlRenderer : public BatteryHtmlRenderer {
|
||||||
String get_status_html() {
|
String get_status_html() {
|
||||||
String content;
|
String content;
|
||||||
|
|
||||||
static const char* LEAFgen[] = {"ZE0", "AZE0", "ZE1"};
|
content += "<h4>LEAF generation: ";
|
||||||
content += "<h4>LEAF generation: " + String(LEAFgen[datalayer_extended.nissanleaf.LEAF_gen]) + "</h4>";
|
switch (datalayer_extended.nissanleaf.LEAF_gen) {
|
||||||
|
case 0:
|
||||||
|
content += String("ZE0</h4>");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
content += String("AZE0</h4>");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
content += String("ZE1</h4>");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
content += String("Unknown</h4>");
|
||||||
|
}
|
||||||
char readableSerialNumber[16]; // One extra space for null terminator
|
char readableSerialNumber[16]; // One extra space for null terminator
|
||||||
memcpy(readableSerialNumber, datalayer_extended.nissanleaf.BatterySerialNumber,
|
memcpy(readableSerialNumber, datalayer_extended.nissanleaf.BatterySerialNumber,
|
||||||
sizeof(datalayer_extended.nissanleaf.BatterySerialNumber));
|
sizeof(datalayer_extended.nissanleaf.BatterySerialNumber));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue