most settings working via Websocket
This commit is contained in:
@@ -17,8 +17,9 @@ AsyncWebServer webServer(80);
|
||||
|
||||
const char *PARAM_MESSAGE = "message";
|
||||
|
||||
SpeedSource_t speedsourcePreselect; /**< Preselect Memory for change SourceAdress */
|
||||
|
||||
String processor(const String &var);
|
||||
void WebserverPOST_Callback(AsyncWebServerRequest *request);
|
||||
void WebserverNotFound_Callback(AsyncWebServerRequest *request);
|
||||
void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final);
|
||||
void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final);
|
||||
@@ -34,6 +35,8 @@ void Websocket_RefreshClientData_Status(uint32_t client_id, bool send_mapping =
|
||||
void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping = false);
|
||||
void Websocket_HandleButtons(uint8_t *data);
|
||||
void Websocket_HandleSettings(uint8_t *data);
|
||||
void parseWebsocketString(char *data, char *identifierBuffer, size_t identifierBufferSize, char *valueBuffer, size_t valueBufferSize);
|
||||
int findIndexByString(const char *searchString, const char *const *array, int arraySize);
|
||||
|
||||
/**
|
||||
* @brief Initializes the web-based user interface (WebUI) for the ChainLube application.
|
||||
@@ -115,119 +118,6 @@ void Webserver_Process()
|
||||
}
|
||||
}
|
||||
|
||||
void WebserverPOST_Callback(AsyncWebServerRequest *request)
|
||||
{
|
||||
request->send(LittleFS, "/post.htm", "text/html", false, processor);
|
||||
|
||||
Debug_pushMessage("POST:\n");
|
||||
int paramsNr = request->params();
|
||||
for (int i = 0; i < paramsNr; i++)
|
||||
{
|
||||
AsyncWebParameter *p = request->getParam(i);
|
||||
Debug_pushMessage("%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();
|
||||
Debug_pushMessage("temp: %d", temp);
|
||||
Debug_pushMessage("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
|
||||
// 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
|
||||
// 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
|
||||
// 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_microL = p->value().toInt();
|
||||
if (p->name() == "oilsave")
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
// end: POST Form Oiltank
|
||||
// begin: POST Form Maintenance
|
||||
if (p->name() == "maintsave")
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
if (p->name() == "resettank")
|
||||
{
|
||||
PersistenceData.tankRemain_microL = LubeConfig.tankCapacity_ml * 1000;
|
||||
globals.requestEEAction = EE_PDS_SAVE;
|
||||
}
|
||||
if (p->name() == "reset_ee_btn")
|
||||
{
|
||||
if (request->hasParam("reset_ee_pds", true))
|
||||
{
|
||||
AsyncWebParameter *param = request->getParam("reset_ee_pds", true);
|
||||
if (param->value() == "on")
|
||||
globals.requestEEAction = globals.requestEEAction == EE_CFG_FORMAT ? EE_FORMAT_ALL : EE_PDS_FORMAT;
|
||||
}
|
||||
if (request->hasParam("reset_ee_cfg", true))
|
||||
{
|
||||
AsyncWebParameter *param = request->getParam("reset_ee_cfg", true);
|
||||
if (param->value() == "on")
|
||||
globals.requestEEAction = globals.requestEEAction == EE_PDS_FORMAT ? EE_FORMAT_ALL : EE_CFG_FORMAT;
|
||||
}
|
||||
}
|
||||
// end: POST Form Maintenance
|
||||
// begin: POST Form LED Settings
|
||||
if (p->name() == "ledmaxbrightness")
|
||||
LubeConfig.LED_Max_Brightness = p->value().toInt();
|
||||
if (p->name() == "ledminbrightness")
|
||||
LubeConfig.LED_Min_Brightness = p->value().toInt();
|
||||
if (p->name() == "ledsave")
|
||||
{
|
||||
if (request->hasParam("ledmodeflash", true))
|
||||
{
|
||||
AsyncWebParameter *param = request->getParam("ledmodeflash", true);
|
||||
if (param->value() == "on")
|
||||
LubeConfig.LED_Mode_Flash = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LubeConfig.LED_Mode_Flash = false;
|
||||
}
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
}
|
||||
// end: POST Form LED SEttings
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Callback function for handling HTTP 404 (Not Found) errors on the web server.
|
||||
*
|
||||
@@ -514,12 +404,13 @@ void Websocket_HandleMessage(void *arg, uint8_t *data, size_t len)
|
||||
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT)
|
||||
{
|
||||
data[len] = 0;
|
||||
Debug_pushMessage("Websocket-Message (len: %d): %s\n", len, (char *)data);
|
||||
|
||||
if (strncmp((char *)data, "btn-", strlen("btn-")) == 0)
|
||||
{
|
||||
Websocket_HandleButtons(data + strlen("btn-"));
|
||||
}
|
||||
if (strncmp((char *)data, "set-", strlen("set-")) == 0)
|
||||
else if (strncmp((char *)data, "set-", strlen("set-")) == 0)
|
||||
{
|
||||
Websocket_HandleSettings(data + strlen("set-"));
|
||||
}
|
||||
@@ -530,42 +421,101 @@ void Websocket_HandleMessage(void *arg, uint8_t *data, size_t len)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle button commands received via WebSocket.
|
||||
*
|
||||
* This function parses a WebSocket string representing button commands, extracts
|
||||
* the identifier and value components, and performs corresponding actions based on
|
||||
* the received commands.
|
||||
*
|
||||
* @param data The WebSocket data containing button commands.
|
||||
*/
|
||||
void Websocket_HandleButtons(uint8_t *data)
|
||||
{
|
||||
if (strcmp((char *)data, "debugstart") == 0)
|
||||
char identifier[32];
|
||||
char value[32];
|
||||
|
||||
parseWebsocketString((char *)data, identifier, sizeof(identifier), value, sizeof(value));
|
||||
|
||||
if (strcmp(identifier, "debugstart") == 0)
|
||||
{
|
||||
SetDebugportStatus(dbg_Webui, enabled);
|
||||
}
|
||||
else if (strcmp((char *)data, "debugstop") == 0)
|
||||
else if (strcmp(identifier, "debugstop") == 0)
|
||||
{
|
||||
SetDebugportStatus(dbg_Webui, disabled);
|
||||
}
|
||||
else if (strcmp((char *)data, "measurereset") == 0)
|
||||
else if (strcmp(identifier, "measurereset") == 0)
|
||||
{
|
||||
globals.measuredPulses = 0;
|
||||
}
|
||||
else if (strcmp((char *)data, "measurestartstop") == 0)
|
||||
else if (strcmp(identifier, "measurestartstop") == 0)
|
||||
{
|
||||
globals.measurementActive = !globals.measurementActive;
|
||||
}
|
||||
else if (strcmp((char *)data, "purgenow") == 0)
|
||||
else if (strcmp(identifier, "purgenow") == 0)
|
||||
{
|
||||
globals.systemStatus = sysStat_Purge;
|
||||
globals.purgePulses = LubeConfig.BleedingPulses;
|
||||
}
|
||||
else if (strcmp((char *)data, "reboot") == 0)
|
||||
else if (strcmp(identifier, "sourcesave") == 0)
|
||||
{
|
||||
LubeConfig.SpeedSource = speedsourcePreselect;
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
globals.systemStatus = sysStat_Shutdown;
|
||||
}
|
||||
else if (strcmp(identifier, "settingssave") == 0)
|
||||
{
|
||||
globals.requestEEAction = EE_CFG_SAVE;
|
||||
}
|
||||
else if (strcmp(identifier, "reboot") == 0)
|
||||
{
|
||||
globals.systemStatus = sysStat_Shutdown;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug_pushMessage("Got unknown Button-id '%s' from ws-client\n", (char *)data);
|
||||
Debug_pushMessage("Got unknown Button-id '%s' from ws-client\n", identifier);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle settings commands received via WebSocket.
|
||||
*
|
||||
* This function parses a WebSocket string representing settings commands, extracts
|
||||
* the identifier and value components, and updates the system settings accordingly.
|
||||
*
|
||||
* @param data The WebSocket data containing settings commands.
|
||||
*/
|
||||
void Websocket_HandleSettings(uint8_t *data)
|
||||
{
|
||||
Debug_pushMessage("Got Settings-id and value '%s' from ws-client\n", (char *)data);
|
||||
char identifier[32];
|
||||
char value[32];
|
||||
|
||||
parseWebsocketString((char *)data, identifier, sizeof(identifier), value, sizeof(value));
|
||||
|
||||
if (strcmp(identifier, "bleedingpulses") == 0)
|
||||
{
|
||||
LubeConfig.BleedingPulses = atoi(value);
|
||||
}
|
||||
else if (strcmp(identifier, "speedsource") == 0)
|
||||
{
|
||||
int index = findIndexByString(value, SpeedSourceString, SpeedSourceString_Elements);
|
||||
speedsourcePreselect = (SpeedSource_t)index;
|
||||
}
|
||||
else if (strcmp(identifier, "cansource") == 0)
|
||||
{
|
||||
int index = findIndexByString(value, CANSourceString, CANSourceString_Elements);
|
||||
LubeConfig.CANSource = (CANSource_t)index;
|
||||
}
|
||||
else if (strcmp(identifier, "gpsbaud") == 0)
|
||||
{
|
||||
int index = findIndexByString(value, GPSBaudRateString, GPSBaudRateString_Elements);
|
||||
LubeConfig.GPSBaudRate = (GPSBaudRate_t)index;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug_pushMessage("Got unknown Settings-id and value '%s' from ws-client\n", identifier);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -689,7 +639,7 @@ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping)
|
||||
"tirewidth;"
|
||||
"tireratio;"
|
||||
"tiredia;"
|
||||
"sourceselect;"
|
||||
"speedsource;"
|
||||
"gpsbaud;"
|
||||
"cansource;"
|
||||
"ledmodeflash;"
|
||||
@@ -742,4 +692,86 @@ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping)
|
||||
{
|
||||
webSocket.textAll(temp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Parse a WebSocket string into identifier and value components.
|
||||
*
|
||||
* This function takes a WebSocket string, separates it into identifier and value
|
||||
* components using the ":" delimiter, and stores them in the specified buffers.
|
||||
* If no ":" is found, the entire string is considered as the value, and the
|
||||
* identifier buffer is set to an empty string.
|
||||
*
|
||||
* @param data The WebSocket string to parse.
|
||||
* @param identifierBuffer The buffer to store the identifier component.
|
||||
* @param identifierBufferSize The size of the identifier buffer.
|
||||
* @param valueBuffer The buffer to store the value component.
|
||||
* @param valueBufferSize The size of the value buffer.
|
||||
*/
|
||||
void parseWebsocketString(char *data, char *identifierBuffer, size_t identifierBufferSize,
|
||||
char *valueBuffer, size_t valueBufferSize)
|
||||
{
|
||||
// Zerlegen des Strings anhand des Trennzeichens ":"
|
||||
char *token = strtok(data, ":");
|
||||
|
||||
// Falls der erste Teil des Strings vorhanden ist
|
||||
if (token != NULL)
|
||||
{
|
||||
// Kopieren des ersten Teils in den Buffer für Identifier
|
||||
strncpy(identifierBuffer, token, identifierBufferSize - 1);
|
||||
identifierBuffer[identifierBufferSize - 1] = '\0'; // Null-Terminierung sicherstellen
|
||||
|
||||
// Weitere Aufrufe von strtok, um den nächsten Teil zu erhalten
|
||||
token = strtok(NULL, ":");
|
||||
|
||||
// Falls der zweite Teil des Strings vorhanden ist
|
||||
if (token != NULL)
|
||||
{
|
||||
// Kopieren des zweiten Teils in den Buffer für Value
|
||||
strncpy(valueBuffer, token, valueBufferSize - 1);
|
||||
valueBuffer[valueBufferSize - 1] = '\0'; // Null-Terminierung sicherstellen
|
||||
}
|
||||
else
|
||||
{
|
||||
// Kein zweiter Teil vorhanden, setzen Sie den Buffer für Value auf leer
|
||||
valueBuffer[0] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Der erste Teil des Strings fehlt, setzen Sie den Buffer für Identifier auf leer
|
||||
identifierBuffer[0] = '\0';
|
||||
|
||||
// Der gesamte String wird als Value betrachtet
|
||||
strncpy(valueBuffer, data, valueBufferSize - 1);
|
||||
valueBuffer[valueBufferSize - 1] = '\0'; // Null-Terminierung sicherstellen
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Find the index of a string in an array.
|
||||
*
|
||||
* This function searches for the given string in the provided array and returns
|
||||
* the index of the first occurrence. If the string is not found, it returns -1.
|
||||
*
|
||||
* @param searchString The string to search for in the array.
|
||||
* @param array The array of strings to search within.
|
||||
* @param arraySize The size of the array.
|
||||
*
|
||||
* @return The index of the first occurrence of the string in the array,
|
||||
* or -1 if the string is not found.
|
||||
*/
|
||||
int findIndexByString(const char *searchString, const char *const *array, int arraySize)
|
||||
{
|
||||
// Durchlaufe das Array und vergleiche jeden String
|
||||
for (int i = 0; i < arraySize; ++i)
|
||||
{
|
||||
if (strcmp(array[i], searchString) == 0)
|
||||
{
|
||||
// String gefunden, gib den Index zurück
|
||||
return i;
|
||||
}
|
||||
}
|
||||
// String nicht gefunden, gib -1 zurück
|
||||
return -1;
|
||||
}
|
Reference in New Issue
Block a user