2022-01-10 00:55:04 +01:00
|
|
|
#include "webui.h"
|
2022-01-07 21:02:27 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
AsyncWebServer webServer(80);
|
2022-01-09 20:51:16 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
const char *PARAM_MESSAGE = "message";
|
2022-01-07 21:02:27 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
String processor(const String &var);
|
2022-02-15 20:58:32 +01:00
|
|
|
void WebserverPOST_Callback(AsyncWebServerRequest *request);
|
2022-02-10 22:33:52 +01:00
|
|
|
void WebserverNotFound_Callback(AsyncWebServerRequest *request);
|
2022-02-15 20:58:32 +01:00
|
|
|
void Webserver_Callback(AsyncWebServerRequest *request);
|
2022-08-14 17:38:45 +02:00
|
|
|
void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final);
|
2022-09-01 23:46:20 +02:00
|
|
|
void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final);
|
|
|
|
void WebServerEEJSON_Callback(AsyncWebServerRequest *request);
|
2022-08-22 14:45:44 +02:00
|
|
|
void GetFlashVersion(char *buff, size_t buff_size);
|
2022-01-19 22:23:36 +01:00
|
|
|
|
2023-02-23 23:14:58 +01:00
|
|
|
#ifdef FEATURE_ENABLE_WEBSOCKETS
|
|
|
|
|
|
|
|
AsyncWebSocket webSocket("/ws");
|
|
|
|
|
|
|
|
void WebsocketEvent_Callback(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len);
|
|
|
|
void Websocket_HandleMessage(void *arg, uint8_t *data, size_t len);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
void initWebUI()
|
2022-01-08 03:14:26 +01:00
|
|
|
{
|
2022-02-10 22:33:52 +01:00
|
|
|
if (!LittleFS.begin())
|
2022-01-08 03:14:26 +01:00
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("An Error has occurred while mounting LittleFS\n");
|
2022-08-22 14:13:55 +02:00
|
|
|
MaintainDTC(DTC_FLASHFS_ERROR, DTC_CRITICAL, true);
|
2022-02-10 22:33:52 +01:00
|
|
|
return;
|
2022-01-09 20:51:16 +01:00
|
|
|
}
|
|
|
|
|
2022-08-22 14:26:37 +02:00
|
|
|
GetFlashVersion(globals.FlashVersion, sizeof(globals.FlashVersion));
|
|
|
|
|
2022-08-28 23:26:09 +02:00
|
|
|
if (strcmp(globals.FlashVersion, QUOTE(FLASH_FS_VERSION)))
|
2022-08-22 14:26:37 +02:00
|
|
|
{
|
|
|
|
MaintainDTC(DTC_FLASHFS_VERSION_ERROR, DTC_WARN, true);
|
|
|
|
}
|
2022-08-19 11:25:26 +02:00
|
|
|
|
2022-08-14 17:38:45 +02:00
|
|
|
MDNS.begin(globals.DeviceName);
|
|
|
|
MDNS.addService("http", "tcp", 80);
|
|
|
|
|
2023-02-23 23:14:58 +01:00
|
|
|
#ifdef FEATURE_ENABLE_WEBSOCKETS
|
|
|
|
webSocket.onEvent(WebsocketEvent_Callback);
|
|
|
|
webServer.addHandler(&webSocket);
|
|
|
|
#endif
|
|
|
|
|
2022-03-09 20:25:02 +01:00
|
|
|
webServer.serveStatic("/static/", LittleFS, "/static/").setCacheControl("max-age=360000");
|
2022-02-27 22:23:58 +01:00
|
|
|
webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
|
|
|
|
{ request->redirect("/index.htm"); });
|
2022-02-10 22:33:52 +01:00
|
|
|
webServer.onNotFound(WebserverNotFound_Callback);
|
2022-02-15 20:58:32 +01:00
|
|
|
webServer.on("/index.htm", HTTP_GET, Webserver_Callback);
|
2022-02-27 22:23:58 +01:00
|
|
|
webServer.on("/post.htm", HTTP_POST, WebserverPOST_Callback);
|
2022-09-01 23:46:20 +02:00
|
|
|
webServer.on("/eejson", HTTP_GET, WebServerEEJSON_Callback);
|
2022-08-14 17:38:45 +02:00
|
|
|
webServer.on(
|
|
|
|
"/doUpdate", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverFirmwareUpdate_Callback);
|
2022-09-01 23:46:20 +02:00
|
|
|
webServer.on(
|
|
|
|
"/eeRestore", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverEERestore_Callback);
|
2022-01-09 20:51:16 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
webServer.begin();
|
2022-01-07 21:02:27 +01:00
|
|
|
}
|
|
|
|
|
2023-02-23 23:14:58 +01:00
|
|
|
void Webserver_Process()
|
|
|
|
{
|
|
|
|
#ifdef FEATURE_ENABLE_WEBSOCKETS
|
|
|
|
webSocket.cleanupClients();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
String processor(const String &var)
|
2022-01-08 03:14:26 +01:00
|
|
|
{
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "TANK_REMAIN_CAPACITY")
|
2023-02-19 14:29:38 +01:00
|
|
|
return String((PersistenceData.tankRemain_microL / 10) / LubeConfig.tankCapacity_ml);
|
2022-02-15 20:58:32 +01:00
|
|
|
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")
|
2023-02-19 14:29:38 +01:00
|
|
|
return String(LubeConfig.amountPerDose_microL);
|
2022-02-15 20:58:32 +01:00
|
|
|
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]);
|
|
|
|
if (var == "GPS_BAUD")
|
2022-08-19 08:34:37 +02:00
|
|
|
#ifdef FEATURE_ENABLE_GPS
|
2022-02-15 20:58:32 +01:00
|
|
|
return String(GPSBaudRateString[LubeConfig.GPSBaudRate]);
|
2022-08-19 08:34:37 +02:00
|
|
|
#else
|
|
|
|
return "Feature N/A";
|
2022-05-04 23:06:15 +02:00
|
|
|
#endif
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "CAN_SOURCE")
|
2022-08-19 08:34:37 +02:00
|
|
|
#ifdef FEATURE_ENABLE_CAN
|
2022-02-15 20:58:32 +01:00
|
|
|
return String(CANSourceString[LubeConfig.CANSource]);
|
2022-08-19 08:34:37 +02:00
|
|
|
#else
|
|
|
|
return "Feature N/A";
|
2022-02-15 20:58:32 +01:00
|
|
|
#endif
|
|
|
|
if (var == "CONFIG_CHECKSUM")
|
2022-03-08 21:23:52 +01:00
|
|
|
{
|
|
|
|
char buffer[7];
|
|
|
|
sprintf(buffer, "0x%04X", LubeConfig.checksum);
|
|
|
|
return String(buffer);
|
|
|
|
}
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "WRITE_CYCLE_COUNT")
|
|
|
|
return String(PersistenceData.writeCycleCounter);
|
2022-05-06 22:35:44 +02:00
|
|
|
if (var == "PERSISTENCE_MARKER")
|
2022-08-19 11:25:26 +02:00
|
|
|
return String(globals.eePersistanceAdress);
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "TANK_REMAIN_UL")
|
2023-02-19 14:29:38 +01:00
|
|
|
return String(PersistenceData.tankRemain_microL);
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "TRAVEL_DISTANCE_HIGHRES")
|
2022-05-05 21:07:24 +02:00
|
|
|
return String(PersistenceData.TravelDistance_highRes_mm);
|
|
|
|
if (var == "ODOMETER")
|
|
|
|
return String(PersistenceData.odometer);
|
|
|
|
if (var == "ODOMETER_M")
|
|
|
|
return String(PersistenceData.odometer_mm / 1000);
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "PERSISTANCE_CHECKSUM")
|
2022-03-08 21:23:52 +01:00
|
|
|
{
|
|
|
|
char buffer[7];
|
|
|
|
sprintf(buffer, "0x%04X", PersistenceData.checksum);
|
|
|
|
return String(buffer);
|
|
|
|
}
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "SHOW_IMPULSE_SETTINGS")
|
|
|
|
return LubeConfig.SpeedSource == SOURCE_IMPULSE ? "" : "hidden";
|
|
|
|
if (var == "SHOW_CAN_SETTINGS")
|
2022-08-19 00:15:40 +02:00
|
|
|
#ifdef FEATURE_ENABLE_CAN
|
2022-02-15 20:58:32 +01:00
|
|
|
return LubeConfig.SpeedSource == SOURCE_CAN ? "" : "hidden";
|
2022-08-19 00:15:40 +02:00
|
|
|
#else
|
|
|
|
return "hidden";
|
2022-05-04 23:06:15 +02:00
|
|
|
#endif
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "SHOW_GPS_SETTINGS")
|
2022-08-19 00:15:40 +02:00
|
|
|
#ifdef FEATURE_ENABLE_GPS
|
2022-02-15 20:58:32 +01:00
|
|
|
return LubeConfig.SpeedSource == SOURCE_GPS ? "" : "hidden";
|
2022-08-19 00:15:40 +02:00
|
|
|
#else
|
|
|
|
return "hidden";
|
2022-05-04 23:06:15 +02:00
|
|
|
#endif
|
2022-03-09 20:25:02 +01:00
|
|
|
if (var == "SHOW_DTC_TABLE")
|
2022-08-22 14:13:55 +02:00
|
|
|
return globals.hasDTC ? "" : "hidden";
|
2022-03-09 20:25:02 +01:00
|
|
|
|
|
|
|
if (var == "DTC_TABLE")
|
|
|
|
{
|
2022-08-19 00:15:40 +02:00
|
|
|
String temp = "";
|
2022-03-09 20:25:02 +01:00
|
|
|
char buff_timestamp[16]; // Format: DD-hh:mm:ss:xxx
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < MAX_DTC_STORAGE; i++)
|
|
|
|
{
|
2022-05-01 15:15:32 +02:00
|
|
|
if (DTCStorage[i].Number < DTC_LAST_DTC)
|
2022-03-09 20:25:02 +01:00
|
|
|
{
|
|
|
|
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
|
|
|
|
|
2022-09-01 22:46:00 +02:00
|
|
|
temp = temp + "<tr data-dtc=" + String(DTCStorage[i].Number);
|
|
|
|
temp = temp + " data-debugval=" + String(DTCStorage[i].debugVal) + "><td>" + String(buff_timestamp);
|
2022-03-09 20:25:02 +01:00
|
|
|
temp = temp + "</td><td>" + String(DTCStorage[i].Number) + "</td><td>";
|
2022-08-22 14:13:55 +02:00
|
|
|
temp = temp + "<img src=static/img/";
|
|
|
|
switch (DTCStorage[i].severity)
|
|
|
|
{
|
|
|
|
case DTC_CRITICAL:
|
|
|
|
temp = temp + "critical";
|
|
|
|
break;
|
|
|
|
case DTC_WARN:
|
|
|
|
temp = temp + "warn";
|
|
|
|
break;
|
|
|
|
case DTC_INFO:
|
|
|
|
temp = temp + "info";
|
|
|
|
break;
|
|
|
|
}
|
2022-08-23 00:12:03 +02:00
|
|
|
temp = temp + ".png></td><td>";
|
2022-03-09 20:25:02 +01:00
|
|
|
|
|
|
|
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 + "</td></tr>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return temp;
|
|
|
|
}
|
2022-02-15 20:58:32 +01:00
|
|
|
|
|
|
|
if (var == "SOURCE_SELECT_OPTIONS")
|
|
|
|
{
|
|
|
|
String temp;
|
|
|
|
for (uint32_t i = 0; i < SpeedSourceString_Elements; i++)
|
2022-02-27 22:23:58 +01:00
|
|
|
{
|
|
|
|
String selected = LubeConfig.SpeedSource == i ? " selected " : "";
|
|
|
|
temp = temp + "<option value=\"" + i + "\"" + selected + ">" + SpeedSourceString[i] + "</option>";
|
|
|
|
}
|
2022-02-15 20:58:32 +01:00
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
2022-05-04 23:06:15 +02:00
|
|
|
#ifdef FEATURE_ENABLE_CAN
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "CANSOURCE_SELECT_OPTIONS")
|
|
|
|
{
|
|
|
|
String temp;
|
|
|
|
for (uint32_t i = 0; i < CANSourceString_Elements; i++)
|
2022-02-27 22:23:58 +01:00
|
|
|
{
|
|
|
|
String selected = LubeConfig.CANSource == i ? " selected " : "";
|
|
|
|
temp = temp + "<option value=\"" + i + "\"" + selected + ">" + CANSourceString[i] + "</option>";
|
|
|
|
}
|
2022-02-15 20:58:32 +01:00
|
|
|
return temp;
|
|
|
|
}
|
2022-05-04 23:06:15 +02:00
|
|
|
#endif
|
|
|
|
#ifdef FEATURE_EABLE_GPS
|
2022-02-15 20:58:32 +01:00
|
|
|
if (var == "GPSBAUD_SELECT_OPTIONS")
|
|
|
|
{
|
|
|
|
String temp;
|
|
|
|
for (uint32_t i = 0; i < GPSBaudRateString_Elements; i++)
|
2022-02-27 22:23:58 +01:00
|
|
|
{
|
|
|
|
String selected = LubeConfig.GPSBaudRate == i ? " selected " : "";
|
|
|
|
temp = temp + "<option value=\"" + i + "\"" + selected + ">" + GPSBaudRateString[i] + "</option>";
|
|
|
|
}
|
2022-02-15 20:58:32 +01:00
|
|
|
return temp;
|
|
|
|
}
|
2022-05-04 23:06:15 +02:00
|
|
|
#endif
|
2022-01-09 20:51:16 +01:00
|
|
|
|
2022-02-17 09:17:16 +01:00
|
|
|
if (var == "SYSTEM_STATUS")
|
|
|
|
return String(globals.systemStatustxt);
|
2022-05-06 22:35:44 +02:00
|
|
|
if (var == "SW_VERSION")
|
|
|
|
{
|
2022-08-28 23:27:01 +02:00
|
|
|
return String(QUOTE(SW_VERSION));
|
2022-05-06 22:35:44 +02:00
|
|
|
}
|
2022-08-14 17:38:45 +02:00
|
|
|
if (var == "FS_VERSION")
|
2022-08-19 11:25:26 +02:00
|
|
|
return String(globals.FlashVersion);
|
2022-02-17 09:17:16 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
if (var == "PLACEHOLDER")
|
|
|
|
return "placeholder";
|
2022-01-09 20:51:16 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
return String();
|
|
|
|
}
|
2022-01-19 22:23:36 +01:00
|
|
|
|
2022-02-15 20:58:32 +01:00
|
|
|
void Webserver_Callback(AsyncWebServerRequest *request)
|
|
|
|
{
|
2022-03-08 22:31:37 +01:00
|
|
|
request->send(LittleFS, "/index.htm", "text/html", false, processor);
|
2022-02-15 20:58:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void WebserverPOST_Callback(AsyncWebServerRequest *request)
|
2022-02-10 22:33:52 +01:00
|
|
|
{
|
2022-03-08 22:31:37 +01:00
|
|
|
request->send(LittleFS, "/post.htm", "text/html", false, processor);
|
|
|
|
|
2023-02-24 19:25:59 +01:00
|
|
|
Debug_pushMessage("POST:\n");
|
2022-02-27 22:23:58 +01:00
|
|
|
int paramsNr = request->params();
|
|
|
|
for (int i = 0; i < paramsNr; i++)
|
2022-01-19 22:23:36 +01:00
|
|
|
{
|
2022-02-27 22:23:58 +01:00
|
|
|
AsyncWebParameter *p = request->getParam(i);
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("%s : %s\n", p->name().c_str(), p->value().c_str());
|
2022-02-27 22:23:58 +01:00
|
|
|
|
2022-03-08 21:23:52 +01:00
|
|
|
// begin: POST Form Source Changed
|
|
|
|
if (p->name() == "sourceselect")
|
|
|
|
{
|
|
|
|
SpeedSource_t temp = (SpeedSource_t)p->value().toInt();
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("temp: %d", temp);
|
|
|
|
Debug_pushMessage("SpeedSource: %d", LubeConfig.SpeedSource);
|
2022-03-08 21:23:52 +01:00
|
|
|
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;
|
2022-05-04 23:06:15 +02:00
|
|
|
// end: POST Form Source Pulse Settings
|
|
|
|
#ifdef FEATURE_EABLE_GPS
|
2022-03-08 21:23:52 +01:00
|
|
|
// 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;
|
2022-05-04 23:06:15 +02:00
|
|
|
// end: POST Form Source GPS Settings
|
|
|
|
#endif
|
|
|
|
#ifdef FEATURE_EABLE_CAN
|
2022-03-08 21:23:52 +01:00
|
|
|
// 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;
|
2022-05-04 23:06:15 +02:00
|
|
|
// end: POST Form Source CAN Settings
|
|
|
|
#endif
|
2022-03-09 20:25:02 +01:00
|
|
|
// begin: POST Form Lubrication
|
2022-03-08 22:31:37 +01:00
|
|
|
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")
|
2023-02-19 14:29:38 +01:00
|
|
|
LubeConfig.amountPerDose_microL = p->value().toInt();
|
2022-03-08 22:31:37 +01:00
|
|
|
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")
|
|
|
|
{
|
2023-02-19 14:29:38 +01:00
|
|
|
PersistenceData.tankRemain_microL = LubeConfig.tankCapacity_ml * 1000;
|
2022-03-08 22:31:37 +01:00
|
|
|
globals.requestEEAction = EE_PDS_SAVE;
|
|
|
|
}
|
2022-08-22 14:49:14 +02:00
|
|
|
if (p->name() == "reset_ee_btn")
|
2022-08-22 14:28:32 +02:00
|
|
|
{
|
2022-08-24 20:59:00 +02:00
|
|
|
if (request->hasParam("reset_ee_pds", true))
|
2022-08-22 14:49:14 +02:00
|
|
|
{
|
2022-08-24 20:59:00 +02:00
|
|
|
AsyncWebParameter *param = request->getParam("reset_ee_pds", true);
|
2022-08-22 21:25:14 +02:00
|
|
|
if (param->value() == "on")
|
2022-08-22 14:49:14 +02:00
|
|
|
globals.requestEEAction = globals.requestEEAction == EE_CFG_FORMAT ? EE_FORMAT_ALL : EE_PDS_FORMAT;
|
|
|
|
}
|
2022-08-24 20:59:00 +02:00
|
|
|
if (request->hasParam("reset_ee_cfg", true))
|
2022-08-22 14:49:14 +02:00
|
|
|
{
|
2022-08-24 20:59:00 +02:00
|
|
|
AsyncWebParameter *param = request->getParam("reset_ee_cfg", true);
|
2022-08-22 21:25:14 +02:00
|
|
|
if (param->value() == "on")
|
2022-08-22 14:49:14 +02:00
|
|
|
globals.requestEEAction = globals.requestEEAction == EE_PDS_FORMAT ? EE_FORMAT_ALL : EE_CFG_FORMAT;
|
|
|
|
}
|
2022-08-22 14:28:32 +02:00
|
|
|
}
|
2022-08-24 23:09:26 +02:00
|
|
|
if (p->name() == "purgenow")
|
|
|
|
{
|
|
|
|
globals.systemStatus = sysStat_Purge;
|
|
|
|
globals.purgePulses = LubeConfig.BleedingPulses;
|
|
|
|
}
|
2023-02-23 23:14:58 +01:00
|
|
|
if (p->name() == "reboot")
|
2022-09-01 23:46:20 +02:00
|
|
|
{
|
|
|
|
globals.systemStatus = sysStat_Shutdown;
|
|
|
|
}
|
2022-03-08 22:31:37 +01:00
|
|
|
// end: POST Form Maintenance
|
2022-03-08 21:23:52 +01:00
|
|
|
}
|
2022-01-08 03:14:26 +01:00
|
|
|
}
|
2022-01-12 01:10:21 +01:00
|
|
|
|
2022-02-10 22:33:52 +01:00
|
|
|
void WebserverNotFound_Callback(AsyncWebServerRequest *request)
|
2022-01-12 01:10:21 +01:00
|
|
|
{
|
2022-03-08 22:31:37 +01:00
|
|
|
request->send(404, "text/html", "Not found");
|
2022-08-14 17:38:45 +02:00
|
|
|
}
|
|
|
|
|
2022-08-22 14:26:37 +02:00
|
|
|
void GetFlashVersion(char *buff, size_t buff_size)
|
2022-08-14 17:38:45 +02:00
|
|
|
{
|
2022-08-22 14:26:37 +02:00
|
|
|
File this_file = LittleFS.open("version", "r");
|
|
|
|
if (!this_file)
|
|
|
|
{ // failed to open the file, retrn empty result
|
|
|
|
buff[0] = '\0';
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (this_file.available())
|
|
|
|
{
|
|
|
|
int bytes_read;
|
2022-08-22 14:53:56 +02:00
|
|
|
bytes_read = this_file.readBytesUntil('\r', buff, buff_size - 1);
|
2022-08-22 14:26:37 +02:00
|
|
|
buff[bytes_read] = '\0';
|
|
|
|
}
|
|
|
|
this_file.close();
|
2022-08-14 17:38:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!index)
|
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("Update");
|
2022-08-14 17:38:45 +02:00
|
|
|
size_t content_len = request->contentLength();
|
|
|
|
int cmd = (filename.indexOf(".fs") > -1) ? U_FS : U_FLASH;
|
|
|
|
Update.runAsync(true);
|
|
|
|
if (!Update.begin(content_len, cmd))
|
|
|
|
{
|
|
|
|
Update.printError(Serial);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Update.write(data, len) != len)
|
|
|
|
{
|
|
|
|
Update.printError(Serial);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("Progress: %d%%\n", (Update.progress() * 100) / Update.size());
|
2022-08-14 17:38:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (final)
|
|
|
|
{
|
|
|
|
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "Please wait while the device reboots");
|
|
|
|
response->addHeader("Refresh", "20");
|
|
|
|
response->addHeader("Location", "/");
|
|
|
|
request->send(response);
|
|
|
|
if (!Update.end(true))
|
|
|
|
{
|
|
|
|
Update.printError(Serial);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("Update complete\n");
|
2022-08-19 08:16:33 +02:00
|
|
|
globals.systemStatus = sysStat_Shutdown;
|
2022-08-14 17:38:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-09-01 23:46:20 +02:00
|
|
|
|
|
|
|
void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final)
|
|
|
|
{
|
|
|
|
|
|
|
|
bool ee_done = false;
|
|
|
|
bool validext = false;
|
|
|
|
|
|
|
|
if (!index)
|
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("EEPROM restore\n");
|
|
|
|
// size_t content_len = request->contentLength();
|
2022-09-01 23:46:20 +02:00
|
|
|
validext = (filename.indexOf(".ee.json") > -1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (validext)
|
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("Restoring EEPROM-Stuff\n");
|
2022-09-01 23:46:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (final)
|
|
|
|
{
|
|
|
|
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "Please wait while the device reboots");
|
|
|
|
response->addHeader("Refresh", "20");
|
|
|
|
response->addHeader("Location", "/");
|
|
|
|
request->send(response);
|
|
|
|
if (ee_done)
|
|
|
|
{
|
2023-02-23 23:14:58 +01:00
|
|
|
Debug_pushMessage("Update complete");
|
2022-09-01 23:46:20 +02:00
|
|
|
globals.systemStatus = sysStat_Shutdown;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void WebServerEEJSON_Callback(AsyncWebServerRequest *request)
|
|
|
|
{
|
|
|
|
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
|
|
|
DynamicJsonDocument json(1024);
|
|
|
|
JsonObject fwinfo = json.createNestedObject("info");
|
|
|
|
|
|
|
|
char buffer[16];
|
|
|
|
|
|
|
|
fwinfo["DeviceName"] = globals.DeviceName;
|
|
|
|
fwinfo["FW-Version"] = QUOTE(SW_VERSION);
|
|
|
|
fwinfo["FS-Version"] = globals.FlashVersion;
|
|
|
|
|
|
|
|
JsonObject config = json.createNestedObject("config");
|
|
|
|
|
|
|
|
config["EEPROM_Version"] = LubeConfig.EEPROM_Version;
|
|
|
|
config["DistancePerLube_Default"] = LubeConfig.DistancePerLube_Default;
|
|
|
|
config["DistancePerLube_Rain"] = LubeConfig.DistancePerLube_Rain;
|
|
|
|
config["tankCapacity_ml"] = LubeConfig.tankCapacity_ml;
|
2023-02-19 14:29:38 +01:00
|
|
|
config["amountPerDose_microL"] = LubeConfig.amountPerDose_microL;
|
2022-09-01 23:46:20 +02:00
|
|
|
config["TankRemindAtPercentage"] = LubeConfig.TankRemindAtPercentage;
|
|
|
|
config["PulsePerRevolution"] = LubeConfig.PulsePerRevolution;
|
|
|
|
config["TireWidth_mm"] = LubeConfig.TireWidth_mm;
|
|
|
|
config["TireWidthHeight_Ratio"] = LubeConfig.TireWidthHeight_Ratio;
|
|
|
|
config["RimDiameter_Inch"] = LubeConfig.RimDiameter_Inch;
|
|
|
|
config["DistancePerRevolution_mm"] = LubeConfig.DistancePerRevolution_mm;
|
|
|
|
config["BleedingPulses"] = LubeConfig.BleedingPulses;
|
|
|
|
config["SpeedSource"] = LubeConfig.SpeedSource;
|
|
|
|
config["SpeedSource_Str"] = SpeedSourceString[LubeConfig.SpeedSource];
|
|
|
|
#ifdef FEATURE_ENABLE_GPS
|
|
|
|
config["GPSBaudRate"] = LubeConfig.GPSBaudRate;
|
|
|
|
config["GPSBaudRate_Str"] = GPSBaudRateString[LubeConfig.GPSBaudRate];
|
|
|
|
#endif
|
|
|
|
#ifdef FEATURE_ENABLE_CAN
|
|
|
|
config["CANSource"] = LubeConfig.CANSource;
|
|
|
|
config["CANSource_Str"] = CANSourceString[LubeConfig.CANSource];
|
|
|
|
#endif
|
|
|
|
sprintf(buffer, "0x%08X", LubeConfig.checksum);
|
|
|
|
config["checksum"] = buffer;
|
|
|
|
|
|
|
|
JsonObject eepart = json.createNestedObject("eepart");
|
|
|
|
|
|
|
|
sprintf(buffer, "0x%04X", globals.eePersistanceAdress);
|
|
|
|
eepart["PersistanceAddress"] = buffer;
|
|
|
|
|
|
|
|
JsonObject persis = json.createNestedObject("persis");
|
|
|
|
|
|
|
|
persis["writeCycleCounter"] = PersistenceData.writeCycleCounter;
|
2023-02-19 14:29:38 +01:00
|
|
|
persis["tankRemain_microL"] = PersistenceData.tankRemain_microL;
|
2022-09-01 23:46:20 +02:00
|
|
|
persis["TravelDistance_highRes_mm"] = PersistenceData.TravelDistance_highRes_mm;
|
|
|
|
persis["odometer_mm"] = PersistenceData.odometer_mm;
|
|
|
|
persis["odometer"] = PersistenceData.odometer;
|
|
|
|
sprintf(buffer, "0x%08X", PersistenceData.checksum);
|
|
|
|
persis["checksum"] = buffer;
|
|
|
|
|
|
|
|
serializeJsonPretty(json, *response);
|
|
|
|
|
|
|
|
response->addHeader("Content-disposition", "attachment; filename=backup.ee.json");
|
|
|
|
|
|
|
|
request->send(response);
|
2023-02-23 23:14:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef FEATURE_ENABLE_WEBSOCKETS
|
|
|
|
void WebsocketEvent_Callback(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
|
|
|
|
{
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case WS_EVT_CONNECT:
|
|
|
|
Debug_pushMessage("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
|
|
|
|
break;
|
|
|
|
case WS_EVT_DISCONNECT:
|
|
|
|
Debug_pushMessage("WebSocket client #%u disconnected\n", client->id());
|
|
|
|
break;
|
|
|
|
case WS_EVT_DATA:
|
|
|
|
Websocket_HandleMessage(arg, data, len);
|
|
|
|
break;
|
|
|
|
case WS_EVT_PONG:
|
|
|
|
case WS_EVT_ERROR:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Websocket_HandleMessage(void *arg, uint8_t *data, size_t len)
|
|
|
|
{
|
|
|
|
AwsFrameInfo *info = (AwsFrameInfo *)arg;
|
|
|
|
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT)
|
|
|
|
{
|
|
|
|
data[len] = 0;
|
|
|
|
|
|
|
|
Debug_pushMessage("Got WebSocket Message: %s \n", (char *)data);
|
|
|
|
|
|
|
|
if (strcmp((char *)data, "start") == 0)
|
|
|
|
{
|
2023-02-24 00:05:51 +01:00
|
|
|
SetDebugportStatus(dbg_Webui, enabled);
|
2023-02-23 23:14:58 +01:00
|
|
|
}
|
|
|
|
else if (strcmp((char *)data, "stop") == 0)
|
|
|
|
{
|
2023-02-24 00:05:51 +01:00
|
|
|
SetDebugportStatus(dbg_Webui, disabled);
|
2023-02-23 23:14:58 +01:00
|
|
|
}
|
|
|
|
else if (strcmp((char *)data, "foo") == 0)
|
|
|
|
{
|
|
|
|
Debug_pushMessage("Got WebSocket Message 'foo' from client\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Websocket_PushLiveDebug(String Message)
|
|
|
|
{
|
|
|
|
webSocket.textAll(Message + "\n");
|
|
|
|
}
|
|
|
|
#endif
|