#include "webui.h" AsyncWebServer webServer(80); const char *PARAM_MESSAGE = "message"; String processor(const String &var); void WebserverPOST_Callback(AsyncWebServerRequest *request); void WebserverNotFound_Callback(AsyncWebServerRequest *request); void Webserver_Callback(AsyncWebServerRequest *request); void initWebUI() { if (!LittleFS.begin()) { Serial.println("An Error has occurred while mounting LittleFS"); return; } webServer.serveStatic("/static/", LittleFS, "/static/").setCacheControl("max-age=360000"); webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->redirect("/index.htm"); }); webServer.onNotFound(WebserverNotFound_Callback); webServer.on("/index.htm", HTTP_GET, Webserver_Callback); webServer.on("/post.htm", HTTP_POST, WebserverPOST_Callback); webServer.begin(); } String processor(const String &var) { if (var == "TANK_REMAIN_CAPACITY") return String((PersistenceData.tankRemain_µl / 10) / LubeConfig.tankCapacity_ml); if (var == "LUBE_DISTANCE_NORMAL") return String(LubeConfig.DistancePerLube_Default); if (var == "LUBE_DISTANCE_RAIN") return String(LubeConfig.DistancePerLube_Rain); if (var == "TANK_CAPACITY") return String(LubeConfig.tankCapacity_ml); if (var == "AMOUNT_PER_DOSE") return String(LubeConfig.amountPerDose_µl); if (var == "TANK_REMIND") return String(LubeConfig.TankRemindAtPercentage); if (var == "PULSE_PER_REV") return String(LubeConfig.PulsePerRevolution); if (var == "TIRE_WIDTH_MM") return String(LubeConfig.TireWidth_mm); if (var == "TIRE_RATIO") return String(LubeConfig.TireWidthHeight_Ratio); if (var == "RIM_DIAMETER") return String(LubeConfig.RimDiameter_Inch); if (var == "DISTANCE_PER_REV") return String(LubeConfig.DistancePerRevolution_mm); if (var == "BLEEDING_PULSES") return String(LubeConfig.BleedingPulses); if (var == "SPEED_SOURCE") return String(SpeedSourceString[LubeConfig.SpeedSource]); #ifdef FEATURE_ENABLE_GPS if (var == "GPS_BAUD") return String(GPSBaudRateString[LubeConfig.GPSBaudRate]); #endif #ifdef FEATURE_ENABLE_CAN if (var == "CAN_SOURCE") return String(CANSourceString[LubeConfig.CANSource]); #endif if (var == "CONFIG_CHECKSUM") { char buffer[7]; sprintf(buffer, "0x%04X", LubeConfig.checksum); return String(buffer); } if (var == "WRITE_CYCLE_COUNT") return String(PersistenceData.writeCycleCounter); if (var == "PERSISTENCE_MARKER") return String(getPersistanceAddress()); if (var == "TANK_REMAIN_UL") return String(PersistenceData.tankRemain_µl); if (var == "TRAVEL_DISTANCE_HIGHRES") return String(PersistenceData.TravelDistance_highRes_mm); if (var == "ODOMETER") return String(PersistenceData.odometer); if (var == "ODOMETER_M") return String(PersistenceData.odometer_mm / 1000); if (var == "PERSISTANCE_CHECKSUM") { char buffer[7]; sprintf(buffer, "0x%04X", PersistenceData.checksum); return String(buffer); } if (var == "SHOW_IMPULSE_SETTINGS") return LubeConfig.SpeedSource == SOURCE_IMPULSE ? "" : "hidden"; #ifdef FEATURE_ENABLE_CAN if (var == "SHOW_CAN_SETTINGS") return LubeConfig.SpeedSource == SOURCE_CAN ? "" : "hidden"; #endif #ifdef FEATURE_ENABLE_GPS if (var == "SHOW_GPS_SETTINGS") return LubeConfig.SpeedSource == SOURCE_GPS ? "" : "hidden"; #endif if (var == "SHOW_DTC_TABLE") return globals.systemStatus == sysStat_Error ? "" : "hidden"; if (var == "DTC_TABLE") { String temp; char buff_timestamp[16]; // Format: DD-hh:mm:ss:xxx for (uint32_t i = 0; i < MAX_DTC_STORAGE; i++) { if (DTCStorage[i].Number < DTC_LAST_DTC) { sprintf(buff_timestamp, "%02d-%02d:%02d:%02d:%03d", DTCStorage[i].timestamp / 86400000, // Days DTCStorage[i].timestamp / 360000 % 24, // Hours DTCStorage[i].timestamp / 60000 % 60, // Minutes DTCStorage[i].timestamp / 1000 % 60, // Seconds DTCStorage[i].timestamp % 1000); // milliseconds temp = "" + String(buff_timestamp); temp = temp + "" + String(DTCStorage[i].Number) + ""; if (DTCStorage[i].active == DTC_ACTIVE) temp = temp + "active"; else if (DTCStorage[i].active == DTC_PREVIOUS) temp = temp + "previous"; else temp = temp + "none"; temp = temp + ""; } } return temp; } if (var == "SOURCE_SELECT_OPTIONS") { String temp; for (uint32_t i = 0; i < SpeedSourceString_Elements; i++) { String selected = LubeConfig.SpeedSource == i ? " selected " : ""; temp = temp + ""; } return temp; } #ifdef FEATURE_ENABLE_CAN if (var == "CANSOURCE_SELECT_OPTIONS") { String temp; for (uint32_t i = 0; i < CANSourceString_Elements; i++) { String selected = LubeConfig.CANSource == i ? " selected " : ""; temp = temp + ""; } return temp; } #endif #ifdef FEATURE_EABLE_GPS if (var == "GPSBAUD_SELECT_OPTIONS") { String temp; for (uint32_t i = 0; i < GPSBaudRateString_Elements; i++) { String selected = LubeConfig.GPSBaudRate == i ? " selected " : ""; temp = temp + ""; } return temp; } #endif if (var == "SYSTEM_STATUS") return String(globals.systemStatustxt); if (var == "SW_VERSION") { char buffer[7]; sprintf(buffer, "%d.%02d", SW_VERSION_MAJOR, SW_VERSION_MINOR); return String(buffer); } if (var == "PLACEHOLDER") return "placeholder"; return String(); } void Webserver_Callback(AsyncWebServerRequest *request) { request->send(LittleFS, "/index.htm", "text/html", false, processor); } void WebserverPOST_Callback(AsyncWebServerRequest *request) { request->send(LittleFS, "/post.htm", "text/html", false, processor); Serial.print("POST:\n"); int paramsNr = request->params(); for (int i = 0; i < paramsNr; i++) { AsyncWebParameter *p = request->getParam(i); Serial.printf("%s : %s\n", p->name().c_str(), p->value().c_str()); // begin: POST Form Source Changed if (p->name() == "sourceselect") { SpeedSource_t temp = (SpeedSource_t)p->value().toInt(); Serial.printf("temp: %d", temp); Serial.printf("SpeedSource: %d", LubeConfig.SpeedSource); if (LubeConfig.SpeedSource != temp) { LubeConfig.SpeedSource = temp; globals.systemStatus = sysStat_Shutdown; } } // end: POST Form Source Changed // begin: POST Form Source Pulse Settings if (p->name() == "tirewidth") LubeConfig.TireWidth_mm = p->value().toInt(); if (p->name() == "tireratio") LubeConfig.TireWidthHeight_Ratio = p->value().toInt(); if (p->name() == "tiredia") LubeConfig.RimDiameter_Inch = p->value().toInt(); if (p->name() == "pulserev") LubeConfig.PulsePerRevolution = p->value().toInt(); if (p->name() == "pulsesave") globals.requestEEAction = EE_CFG_SAVE; // end: POST Form Source Pulse Settings #ifdef FEATURE_EABLE_GPS // begin: POST Form Source GPS Settings if (p->name() == "gpsbaud") LubeConfig.GPSBaudRate = (GPSBaudRate_t)p->value().toInt(); if (p->name() == "gpssave") globals.requestEEAction = EE_CFG_SAVE; // end: POST Form Source GPS Settings #endif #ifdef FEATURE_EABLE_CAN // begin: POST Form Source CAN Settings if (p->name() == "cansource") LubeConfig.CANSource = (CANSource_t)p->value().toInt(); if (p->name() == "cansave") globals.requestEEAction = EE_CFG_SAVE; // end: POST Form Source CAN Settings #endif // begin: POST Form Lubrication if (p->name() == "lubedistancenormal") LubeConfig.DistancePerLube_Default = p->value().toInt(); if (p->name() == "lubedistancerain") LubeConfig.DistancePerLube_Rain = p->value().toInt(); if (p->name() == "lubesave") globals.requestEEAction = EE_CFG_SAVE; // end: POST Form Lubrication // begin: POST Form Oiltank if (p->name() == "tankcap") LubeConfig.tankCapacity_ml = p->value().toInt(); if (p->name() == "tankwarn") LubeConfig.TankRemindAtPercentage = p->value().toInt(); if (p->name() == "pumppulse") LubeConfig.amountPerDose_µl = p->value().toInt(); if (p->name() == "oilsave") globals.requestEEAction = EE_CFG_SAVE; // end: POST Form Oiltank // begin: POST Form Maintenance if (p->name() == "purgepulse") LubeConfig.BleedingPulses = p->value().toInt(); if (p->name() == "maintsave") globals.requestEEAction = EE_CFG_SAVE; if (p->name() == "resettank") { PersistenceData.tankRemain_µl = LubeConfig.tankCapacity_ml * 1000; globals.requestEEAction = EE_PDS_SAVE; } // end: POST Form Maintenance } } void WebserverNotFound_Callback(AsyncWebServerRequest *request) { request->send(404, "text/html", "Not found"); }