From cec07e016cfda21c382cca541c9d2130cc795478 Mon Sep 17 00:00:00 2001 From: Marcel Peterkau Date: Tue, 9 Jan 2024 12:56:41 +0100 Subject: [PATCH 1/2] changed Config-Default-code --- Software/include/config.h | 50 +++++++++++++++++++-------------------- Software/src/config.cpp | 2 ++ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/Software/include/config.h b/Software/include/config.h index cd5360c..c77e016 100644 --- a/Software/include/config.h +++ b/Software/include/config.h @@ -82,36 +82,36 @@ const size_t CANSourceString_Elements = sizeof(CANSourceString) / sizeof(CANSour // Structure for persistence data stored in EEPROM typedef struct { - uint16_t writeCycleCounter = 0; - uint32_t tankRemain_microL = 0; - uint32_t TravelDistance_highRes_mm = 0; - uint32_t odometer_mm = 0; - uint32_t odometer = 0; - uint32_t checksum = 0; + uint16_t writeCycleCounter; + uint32_t tankRemain_microL; + uint32_t TravelDistance_highRes_mm; + uint32_t odometer_mm; + uint32_t odometer; + uint32_t checksum; } persistenceData_t; // Structure for configuration settings stored in EEPROM typedef struct { - uint8_t EEPROM_Version = 0; - uint32_t DistancePerLube_Default = 8000; - uint32_t DistancePerLube_Rain = 4000; - uint32_t tankCapacity_ml = 320; - uint32_t amountPerDose_microL = DEFAULT_PUMP_DOSE; - uint8_t TankRemindAtPercentage = 30; - uint8_t PulsePerRevolution = 1; - uint32_t TireWidth_mm = 150; - uint32_t TireWidthHeight_Ratio = 70; - uint32_t RimDiameter_Inch = 18; - uint32_t DistancePerRevolution_mm = 2000; - uint16_t BleedingPulses = 25; - SpeedSource_t SpeedSource = SOURCE_IMPULSE; - GPSBaudRate_t GPSBaudRate = BAUD_115200; - CANSource_t CANSource = KTM_890_ADV_R_2021; - bool LED_Mode_Flash = false; - uint8_t LED_Max_Brightness = 255; - uint8_t LED_Min_Brightness = 5; - uint32_t checksum = 0; + uint8_t EEPROM_Version; + uint32_t DistancePerLube_Default; + uint32_t DistancePerLube_Rain; + uint32_t tankCapacity_ml; + uint32_t amountPerDose_microL; + uint8_t TankRemindAtPercentage; + uint8_t PulsePerRevolution; + uint32_t TireWidth_mm; + uint32_t TireWidthHeight_Ratio; + uint32_t RimDiameter_Inch; + uint32_t DistancePerRevolution_mm; + uint16_t BleedingPulses; + SpeedSource_t SpeedSource; + GPSBaudRate_t GPSBaudRate; + CANSource_t CANSource; + bool LED_Mode_Flash; + uint8_t LED_Max_Brightness; + uint8_t LED_Min_Brightness; + uint32_t checksum; } LubeConfig_t; // Default configuration settings diff --git a/Software/src/config.cpp b/Software/src/config.cpp index 041a462..a4f9733 100644 --- a/Software/src/config.cpp +++ b/Software/src/config.cpp @@ -36,6 +36,8 @@ boolean checkEEPROMavailable(); */ void InitEEPROM() { + LubeConfig = LubeConfig_defaults; + PersistenceData = {0}; ee.begin(); checkEEPROMavailable(); } From 006e0825986abb04a07a24f518c7089c212d057a Mon Sep 17 00:00:00 2001 From: Marcel Peterkau Date: Tue, 9 Jan 2024 12:56:41 +0100 Subject: [PATCH 2/2] missed to add comments for webui.cpp --- Software/include/config.h | 50 ++++++------ Software/src/config.cpp | 2 + Software/src/webui.cpp | 156 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+), 25 deletions(-) diff --git a/Software/include/config.h b/Software/include/config.h index cd5360c..c77e016 100644 --- a/Software/include/config.h +++ b/Software/include/config.h @@ -82,36 +82,36 @@ const size_t CANSourceString_Elements = sizeof(CANSourceString) / sizeof(CANSour // Structure for persistence data stored in EEPROM typedef struct { - uint16_t writeCycleCounter = 0; - uint32_t tankRemain_microL = 0; - uint32_t TravelDistance_highRes_mm = 0; - uint32_t odometer_mm = 0; - uint32_t odometer = 0; - uint32_t checksum = 0; + uint16_t writeCycleCounter; + uint32_t tankRemain_microL; + uint32_t TravelDistance_highRes_mm; + uint32_t odometer_mm; + uint32_t odometer; + uint32_t checksum; } persistenceData_t; // Structure for configuration settings stored in EEPROM typedef struct { - uint8_t EEPROM_Version = 0; - uint32_t DistancePerLube_Default = 8000; - uint32_t DistancePerLube_Rain = 4000; - uint32_t tankCapacity_ml = 320; - uint32_t amountPerDose_microL = DEFAULT_PUMP_DOSE; - uint8_t TankRemindAtPercentage = 30; - uint8_t PulsePerRevolution = 1; - uint32_t TireWidth_mm = 150; - uint32_t TireWidthHeight_Ratio = 70; - uint32_t RimDiameter_Inch = 18; - uint32_t DistancePerRevolution_mm = 2000; - uint16_t BleedingPulses = 25; - SpeedSource_t SpeedSource = SOURCE_IMPULSE; - GPSBaudRate_t GPSBaudRate = BAUD_115200; - CANSource_t CANSource = KTM_890_ADV_R_2021; - bool LED_Mode_Flash = false; - uint8_t LED_Max_Brightness = 255; - uint8_t LED_Min_Brightness = 5; - uint32_t checksum = 0; + uint8_t EEPROM_Version; + uint32_t DistancePerLube_Default; + uint32_t DistancePerLube_Rain; + uint32_t tankCapacity_ml; + uint32_t amountPerDose_microL; + uint8_t TankRemindAtPercentage; + uint8_t PulsePerRevolution; + uint32_t TireWidth_mm; + uint32_t TireWidthHeight_Ratio; + uint32_t RimDiameter_Inch; + uint32_t DistancePerRevolution_mm; + uint16_t BleedingPulses; + SpeedSource_t SpeedSource; + GPSBaudRate_t GPSBaudRate; + CANSource_t CANSource; + bool LED_Mode_Flash; + uint8_t LED_Max_Brightness; + uint8_t LED_Min_Brightness; + uint32_t checksum; } LubeConfig_t; // Default configuration settings diff --git a/Software/src/config.cpp b/Software/src/config.cpp index 041a462..a4f9733 100644 --- a/Software/src/config.cpp +++ b/Software/src/config.cpp @@ -36,6 +36,8 @@ boolean checkEEPROMavailable(); */ void InitEEPROM() { + LubeConfig = LubeConfig_defaults; + PersistenceData = {0}; ee.begin(); checkEEPROMavailable(); } diff --git a/Software/src/webui.cpp b/Software/src/webui.cpp index 25fe640..6838c8f 100644 --- a/Software/src/webui.cpp +++ b/Software/src/webui.cpp @@ -1,3 +1,16 @@ +/** + * @file webui.cpp + * + * @brief Implementation file for web-based user interface (WebUI) functions in the ChainLube application. + * + * This file contains the implementation of functions related to the initialization and processing of the + * web-based user interface (WebUI). It includes the setup of LittleFS, handling of firmware version checks, + * initialization of mDNS, setup of web server routes, and handling of various HTTP events. + * + * @author Marcel Peterkau + * @date 09.01.2024 + */ + #include "webui.h" AsyncWebServer webServer(80); @@ -20,8 +33,20 @@ void Websocket_RefreshClientData_DTCs(uint32_t client_id); void Websocket_RefreshClientData_Status(uint32_t client_id, bool send_mapping = false); void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping = false); +/** + * @brief Initializes the web-based user interface (WebUI) for the ChainLube application. + * + * This function sets up the necessary components for the WebUI, including mounting LittleFS, + * performing flash version checks, initializing mDNS, and configuring the web server with + * routes and event handlers. If any errors occur during setup, appropriate diagnostic messages + * are pushed to the debugging system, and potential error conditions are recorded as Diagnostic + * Trouble Codes (DTCs). + * + * @note This function should be called during the initialization phase of the application. + */ void initWebUI() { + // Attempt to mount LittleFS if (!LittleFS.begin()) { Debug_pushMessage("An Error has occurred while mounting LittleFS\n"); @@ -29,8 +54,10 @@ void initWebUI() return; } + // Retrieve the flash version GetFlashVersion(globals.FlashVersion, sizeof(globals.FlashVersion)); + // Compare the flash version with the required version char buffer[6]; snprintf(buffer, sizeof(buffer), "%d.%02d", constants.Required_Flash_Version_major, constants.Required_Flash_Version_minor); if (strcmp(globals.FlashVersion, buffer)) @@ -38,12 +65,15 @@ void initWebUI() MaintainDTC(DTC_FLASHFS_VERSION_ERROR, true); } + // Initialize mDNS and add service MDNS.begin(globals.DeviceName); MDNS.addService("http", "tcp", 80); + // Set up WebSocket event handler and attach to web server webSocket.onEvent(WebsocketEvent_Callback); webServer.addHandler(&webSocket); + // Serve static files and define routes webServer.serveStatic("/static/", LittleFS, "/static/").setCacheControl("max-age=360000"); webServer.serveStatic("/index.htm", LittleFS, "/index.htm").setCacheControl("max-age=360000"); webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request) @@ -55,9 +85,20 @@ void initWebUI() webServer.on( "/eeRestore", HTTP_POST, [](AsyncWebServerRequest *request) {}, WebserverEERestore_Callback); + // Start the web server webServer.begin(); } +/** + * @brief Processes the web server functionality for the ChainLube application. + * + * This function performs periodic processing tasks for the web server, including cleaning up + * WebSocket clients and refreshing client data when WebSocket connections are active. It ensures + * that WebSocket client data related to Diagnostic Trouble Codes (DTCs) and system status is + * updated at regular intervals. + * + * @note This function should be called in the main loop of the application. + */ void Webserver_Process() { static uint32_t previousMillis = 0; @@ -202,11 +243,29 @@ void WebserverPOST_Callback(AsyncWebServerRequest *request) } } +/** + * @brief Callback function for handling HTTP 404 (Not Found) errors on the web server. + * + * This function is invoked when an HTTP request results in a 404 error (Not Found). It sends + * a simple "Not found" text response with an HTTP status code of 404. + * + * @param request Pointer to the AsyncWebServerRequest object representing the HTTP request. + */ void WebserverNotFound_Callback(AsyncWebServerRequest *request) { request->send(404, "text/html", "Not found"); } +/** + * @brief Reads the flash version information from a file in LittleFS. + * + * This function reads the flash version information stored in a file named "version" in the + * LittleFS filesystem. It opens the file, reads the content until a carriage return ('\r') is + * encountered, and stores the result in the provided buffer. The buffer is null-terminated. + * + * @param buff Pointer to the buffer where the flash version information will be stored. + * @param buff_size Size of the buffer. + */ void GetFlashVersion(char *buff, size_t buff_size) { File this_file = LittleFS.open("version", "r"); @@ -224,6 +283,21 @@ void GetFlashVersion(char *buff, size_t buff_size) this_file.close(); } +/** + * @brief Callback function for handling firmware updates via the web server. + * + * This function is invoked during the firmware update process when a new firmware file + * is received. It handles the update process using the ESPAsyncHTTPUpdate library. The update + * process involves checking the firmware type, initializing the update, writing data, and finalizing + * the update. If the update is successful, it triggers a system shutdown. + * + * @param request Pointer to the AsyncWebServerRequest object. + * @param filename The name of the file being updated. + * @param index The index of the file being updated. + * @param data Pointer to the data buffer. + * @param len The length of the data buffer. + * @param final Boolean indicating if this is the final chunk of data. + */ void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) { @@ -266,6 +340,21 @@ void WebserverFirmwareUpdate_Callback(AsyncWebServerRequest *request, const Stri } } +/** + * @brief Callback function for handling EEPROM restore via the web server. + * + * This function is invoked during the EEPROM restore process when a new EEPROM file + * is received. It handles the restore process by reading the data from the received file, + * deserializing the JSON data, and updating the configuration and persistence data accordingly. + * If the restore is successful, it triggers a system shutdown. + * + * @param request Pointer to the AsyncWebServerRequest object. + * @param filename The name of the file being restored. + * @param index The index of the file being restored. + * @param data Pointer to the data buffer. + * @param len The length of the data buffer. + * @param final Boolean indicating if this is the final chunk of data. + */ void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) { bool ee_done = false; @@ -350,6 +439,14 @@ void WebserverEERestore_Callback(AsyncWebServerRequest *request, const String &f } } +/** + * @brief Callback function for handling EEPROM JSON request via the web server. + * + * This function is invoked when a request for EEPROM JSON data is received. It constructs a JSON + * response containing information about the firmware, configuration, and persistence data. + * + * @param request Pointer to the AsyncWebServerRequest object. + */ void WebServerEEJSON_Callback(AsyncWebServerRequest *request) { AsyncResponseStream *response = request->beginResponseStream("application/json"); @@ -413,6 +510,19 @@ void WebServerEEJSON_Callback(AsyncWebServerRequest *request) request->send(response); } +/** + * @brief Callback function for handling WebSocket events. + * + * This function is invoked when events occur in the WebSocket communication, such as client connection, + * disconnection, reception of data, and others. It dispatches the events to the appropriate handlers. + * + * @param server Pointer to the AsyncWebSocket object. + * @param client Pointer to the AsyncWebSocketClient object representing the WebSocket client. + * @param type Type of WebSocket event. + * @param arg Event-specific argument. + * @param data Pointer to the received data (if applicable). + * @param len Length of the received data. + */ void WebsocketEvent_Callback(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { switch (type) @@ -435,6 +545,16 @@ void WebsocketEvent_Callback(AsyncWebSocket *server, AsyncWebSocketClient *clien } } +/** + * @brief Handles WebSocket messages received from clients. + * + * This function processes WebSocket messages, such as starting or stopping debugging, + * and provides appropriate responses. + * + * @param arg Pointer to the WebSocket frame information. + * @param data Pointer to the received data. + * @param len Length of the received data. + */ void Websocket_HandleMessage(void *arg, uint8_t *data, size_t len) { AwsFrameInfo *info = (AwsFrameInfo *)arg; @@ -459,11 +579,27 @@ void Websocket_HandleMessage(void *arg, uint8_t *data, size_t len) } } +/** + * @brief Pushes live debug messages to all WebSocket clients. + * + * This function sends a live debug message to all connected WebSocket clients. + * + * @param Message The debug message to be sent. + */ void Websocket_PushLiveDebug(String Message) { webSocket.textAll("DEBUG:" + Message); } +/** + * @brief Refreshes client data related to Diagnostic Trouble Codes (DTCs) on WebSocket clients. + * + * This function constructs a DTC-related string and sends it to a specific WebSocket client or + * broadcasts it to all connected WebSocket clients. + * + * @param client_id The ID of the WebSocket client to which the data should be sent. If 0, the data + * will be broadcasted to all connected clients. + */ void Websocket_RefreshClientData_DTCs(uint32_t client_id) { String temp = "DTC:"; @@ -497,6 +633,16 @@ void Websocket_RefreshClientData_DTCs(uint32_t client_id) } } +/** + * @brief Refreshes client data related to system status and relevant parameters on WebSocket clients. + * + * This function constructs a status-related string and sends it to a specific WebSocket client or + * broadcasts it to all connected WebSocket clients. It also sends a mapping of the status parameters. + * + * @param client_id The ID of the WebSocket client to which the data should be sent. If 0, the data + * will be broadcasted to all connected clients. + * @param send_mapping Flag indicating whether to send the parameter mapping to the client(s). + */ void Websocket_RefreshClientData_Status(uint32_t client_id, bool send_mapping) { @@ -529,6 +675,16 @@ void Websocket_RefreshClientData_Status(uint32_t client_id, bool send_mapping) } } +/** + * @brief Refreshes client data related to static configuration parameters on WebSocket clients. + * + * This function constructs a static configuration-related string and sends it to a specific WebSocket client or + * broadcasts it to all connected WebSocket clients. It also sends a mapping of the static configuration parameters. + * + * @param client_id The ID of the WebSocket client to which the data should be sent. If 0, the data + * will be broadcasted to all connected clients. + * @param send_mapping Flag indicating whether to send the parameter mapping to the client(s). + */ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping) {