#include "advanced_battery_html.h" #include #include #include "../../battery/BATTERIES.h" #include "../../datalayer/datalayer.h" #include "../../datalayer/datalayer_extended.h" // Available generic battery commands that are taken into use based on what the selected battery supports. std::vector battery_commands = { {"clearIsolation", "Clear isolation fault", "clear any active isolation fault?", [](Battery* b) { return b && b->supports_clear_isolation(); }, [](Battery* b) { b->clear_isolation(); }}, {"chademoRestart", "Restart", "restart the V2X session?", [](Battery* b) { return b && b->supports_chademo_restart(); }, [](Battery* b) { b->chademo_restart(); }}, {"chademoStop", "Stop", "stop V2X?", [](Battery* b) { return b && b->supports_chademo_restart(); }, [](Battery* b) { b->chademo_restart(); }}, {"resetBMS", "BMS reset", "reset the BMS?", [](Battery* b) { return b && b->supports_reset_BMS(); }, [](Battery* b) { b->reset_BMS(); }}, {"resetCrash", "Unlock crashed BMS", "reset crash data? Note this will unlock your BMS and enable contactor closing and SOC calculation.", [](Battery* b) { return b && b->supports_reset_crash(); }, [](Battery* b) { b->reset_crash(); }}, {"resetNVROL", "Perform NVROL reset", "trigger an NVROL reset? Battery will be unavailable for 30 seconds while this is active!", [](Battery* b) { return b && b->supports_reset_NVROL(); }, [](Battery* b) { b->reset_NVROL(); }}, {"resetContactor", "Perform contactor reset", "reset contactors?", [](Battery* b) { return b && b->supports_contactor_reset(); }, [](Battery* b) { b->reset_contactor(); }}, {"resetDTC", "Erase DTC", "erase DTCs?", [](Battery* b) { return b && b->supports_reset_DTC(); }, [](Battery* b) { b->reset_DTC(); }}, {"readDTC", "Read DTC (result must be checked in CANlog)", nullptr, [](Battery* b) { return b && b->supports_read_DTC(); }, [](Battery* b) { b->read_DTC(); }}, {"resetBECM", "Restart BECM module", "restart BECM??", [](Battery* b) { return b && b->supports_reset_DTC(); }, [](Battery* b) { b->reset_DTC(); }}, {"contactorClose", "Close Contactors", "a contactor close request?", [](Battery* b) { return b && b->supports_contactor_close(); }, [](Battery* b) { b->request_close_contactors(); }}, {"contactorOpen", "Open Contactors", "a contactor open request?", [](Battery* b) { return b && b->supports_contactor_close(); }, [](Battery* b) { b->request_open_contactors(); }}, {"resetSOH", "Reset degradation data", "reset degradation data?", [](Battery* b) { return b && b->supports_reset_SOH(); }, [](Battery* b) { b->reset_SOH(); }}, {"setFactoryMode", "Set Factory Mode", "set factory mode and disable isolation measurement?", [](Battery* b) { return b && b->supports_factory_mode_method(); }, [](Battery* b) { b->set_factory_mode(); }}, {"toggleSOC", "Toggle SOC method", "toggle SOC method? This will toggle between ESTIMATED and MEASURED SOC methods.", [](Battery* b) { return b && b->supports_toggle_SOC_method(); }, [](Battery* b) { b->toggle_SOC_method(); }}, }; String advanced_battery_processor(const String& var) { if (var == "X") { String content = ""; //Page format content += ""; content += ""; // Start a new block with a specific background color content += "
"; // Render buttons dynamically based on what commands the battery supports. auto render_command_buttons = [&content](Battery* batt, int ix) { for (const auto& cmd : battery_commands) { if (cmd.condition(batt)) { // Button for user action content += ""; // Script that calls the backend to perform the command content += ""; } } }; if (battery) { content += battery->get_status_renderer().get_status_html(); render_command_buttons(battery, 0); } if (battery2) { content += "

Values from battery 2

"; content += battery2->get_status_renderer().get_status_html(); render_command_buttons(battery2, 1); } content += "
"; content += ""; return content; } return String(); }