395 lines
12 KiB
C++
Raw Normal View History

2022-01-10 00:55:04 +01:00
#include "webui.h"
2022-01-07 21:02:27 +01:00
AsyncWebServer webServer(80);
2022-01-09 20:51:16 +01:00
const char *PARAM_MESSAGE = "message";
2022-01-07 21:02:27 +01:00
String processor(const String &var);
2022-02-15 20:58:32 +01:00
void WebserverPOST_Callback(AsyncWebServerRequest *request);
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);
void GetFlashVersion(char *buff, size_t buff_size);
void initWebUI()
2022-01-08 03:14:26 +01:00
{
if (!LittleFS.begin())
2022-01-08 03:14:26 +01:00
{
Serial.println("An Error has occurred while mounting LittleFS");
MaintainDTC(DTC_FLASHFS_ERROR, DTC_CRITICAL, true);
return;
2022-01-09 20:51:16 +01:00
}
GetFlashVersion(globals.FlashVersion, sizeof(globals.FlashVersion));
2022-08-22 14:53:56 +02:00
if (!strcmp(globals.FlashVersion, QUOTE(FLASH_FS_VERSION)))
{
MaintainDTC(DTC_FLASHFS_VERSION_ERROR, DTC_WARN, true);
}
2022-08-14 17:38:45 +02:00
MDNS.begin(globals.DeviceName);
MDNS.addService("telnet", "tcp", 23);
MDNS.addService("http", "tcp", 80);
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"); });
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-08-14 17:38:45 +02:00
webServer.on(
"/doUpdate", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverFirmwareUpdate_Callback);
2022-01-09 20:51:16 +01:00
webServer.begin();
2022-01-07 21:02:27 +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")
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]);
if (var == "GPS_BAUD")
#ifdef FEATURE_ENABLE_GPS
2022-02-15 20:58:32 +01:00
return String(GPSBaudRateString[LubeConfig.GPSBaudRate]);
#else
return "Feature N/A";
#endif
2022-02-15 20:58:32 +01:00
if (var == "CAN_SOURCE")
#ifdef FEATURE_ENABLE_CAN
2022-02-15 20:58:32 +01:00
return String(CANSourceString[LubeConfig.CANSource]);
#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);
if (var == "PERSISTENCE_MARKER")
return String(globals.eePersistanceAdress);
2022-02-15 20:58:32 +01:00
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);
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";
#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";
#endif
if (var == "SHOW_DTC_TABLE")
return globals.hasDTC ? "" : "hidden";
if (var == "DTC_TABLE")
{
2022-08-19 00:15:40 +02:00
String temp = "";
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)
{
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-08-24 16:49:40 +02:00
temp = temp + "<tr data-dtc=" + String(DTCStorage[i].Number) + "><td>" + String(buff_timestamp);
temp = temp + "</td><td>" + String(DTCStorage[i].Number) + "</td><td>";
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>";
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;
}
#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;
}
#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;
}
#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);
if (var == "SW_VERSION")
{
char buffer[7];
sprintf(buffer, "%d.%02d", SW_VERSION_MAJOR, SW_VERSION_MINOR);
return String(buffer);
}
2022-08-14 17:38:45 +02:00
if (var == "FS_VERSION")
return String(globals.FlashVersion);
2022-02-17 09:17:16 +01:00
if (var == "PLACEHOLDER")
return "placeholder";
2022-01-09 20:51:16 +01:00
return String();
}
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-03-08 22:31:37 +01:00
request->send(LittleFS, "/post.htm", "text/html", false, processor);
2022-02-27 22:23:58 +01:00
Serial.print("POST:\n");
int paramsNr = request->params();
for (int i = 0; i < paramsNr; i++)
{
2022-02-27 22:23:58 +01:00
AsyncWebParameter *p = request->getParam(i);
Serial.printf("%s : %s\n", p->name().c_str(), p->value().c_str());
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();
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
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;
// 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;
// end: POST Form Source CAN Settings
#endif
// 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")
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;
}
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-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")
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-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")
globals.requestEEAction = globals.requestEEAction == EE_PDS_FORMAT ? EE_FORMAT_ALL : EE_CFG_FORMAT;
}
2022-08-22 14:28:32 +02:00
}
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
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
}
void GetFlashVersion(char *buff, size_t buff_size)
2022-08-14 17:38:45 +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);
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)
{
Serial.println("Update");
size_t content_len = request->contentLength();
// if filename includes spiffs, update the spiffs partition
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
{
Serial.printf("Progress: %d%%\n", (Update.progress() * 100) / Update.size());
}
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
{
Serial.println("Update complete");
Serial.flush();
globals.systemStatus = sysStat_Shutdown;
2022-08-14 17:38:45 +02:00
}
}
}