4141#include "vcore.h"
4242#include "system.h"
4343#include "power_management_module.h"
44+ #include "websocket.h"
4445#include "system_module.h"
4546#include "device_config.h"
4647#include "wifi_module.h"
@@ -55,6 +56,8 @@ static const char * CORS_TAG = "CORS";
5556
5657static char axeOSVersion [32 ];
5758
59+ static httpd_handle_t server = NULL ;
60+
5861/* Handler for WiFi scan endpoint */
5962static esp_err_t GET_wifi_scan (httpd_req_t * req )
6063{
@@ -92,10 +95,6 @@ static esp_err_t GET_wifi_scan(httpd_req_t *req)
9295 cJSON_Delete (root );
9396 return ESP_OK ;
9497}
95- static httpd_handle_t server = NULL ;
96- QueueHandle_t log_queue = NULL ;
97-
98- static int fd = -1 ;
9998
10099#define REST_CHECK (a , str , goto_tag , ...) \
101100 do { \
@@ -297,7 +296,6 @@ static esp_err_t set_content_type_from_file(httpd_req_t * req, const char * file
297296
298297esp_err_t set_cors_headers (httpd_req_t * req )
299298{
300-
301299 esp_err_t err ;
302300
303301 err = httpd_resp_set_hdr (req , "Access-Control-Allow-Origin" , "*" );
@@ -440,7 +438,6 @@ static esp_err_t handle_options_request(httpd_req_t * req)
440438
441439static esp_err_t PATCH_update_settings (httpd_req_t * req )
442440{
443-
444441 if (is_network_allowed (req ) != ESP_OK ) {
445442 return httpd_resp_send_err (req , HTTPD_401_UNAUTHORIZED , "Unauthorized" );
446443 }
@@ -596,7 +593,6 @@ static esp_err_t POST_restart(httpd_req_t * req)
596593 return ESP_OK ;
597594}
598595
599-
600596/* Simple handler for getting system handler */
601597static esp_err_t GET_system_info (httpd_req_t * req )
602598{
@@ -635,6 +631,7 @@ static esp_err_t GET_system_info(httpd_req_t * req)
635631 cJSON_AddNumberToObject (root , "voltage" , POWER_MANAGEMENT_MODULE .voltage );
636632 cJSON_AddNumberToObject (root , "current" , Power_get_current ());
637633 cJSON_AddNumberToObject (root , "temp" , POWER_MANAGEMENT_MODULE .chip_temp_avg );
634+ cJSON_AddNumberToObject (root , "temp2" , POWER_MANAGEMENT_MODULE .chip_temp2_avg );
638635 cJSON_AddNumberToObject (root , "vrTemp" , POWER_MANAGEMENT_MODULE .vr_temp );
639636 cJSON_AddNumberToObject (root , "maxPower" , DEVICE_CONFIG .family .max_power );
640637 cJSON_AddNumberToObject (root , "nominalVoltage" , DEVICE_CONFIG .family .nominal_voltage );
@@ -1008,86 +1005,6 @@ esp_err_t POST_OTA_update(httpd_req_t * req)
10081005 return ESP_OK ;
10091006}
10101007
1011- int log_to_queue (const char * format , va_list args )
1012- {
1013- va_list args_copy ;
1014- va_copy (args_copy , args );
1015-
1016- // Calculate the required buffer size
1017- int needed_size = vsnprintf (NULL , 0 , format , args_copy ) + 1 ;
1018- va_end (args_copy );
1019-
1020- // Allocate the buffer dynamically
1021- char * log_buffer = (char * ) calloc (needed_size + 2 , sizeof (char )); // +2 for potential \n and \0
1022- if (log_buffer == NULL ) {
1023- return 0 ;
1024- }
1025-
1026- // Format the string into the allocated buffer
1027- va_copy (args_copy , args );
1028- vsnprintf (log_buffer , needed_size , format , args_copy );
1029- va_end (args_copy );
1030-
1031- // Ensure the log message ends with a newline
1032- size_t len = strlen (log_buffer );
1033- if (len > 0 && log_buffer [len - 1 ] != '\n' ) {
1034- log_buffer [len ] = '\n' ;
1035- log_buffer [len + 1 ] = '\0' ;
1036- len ++ ;
1037- }
1038-
1039- // Print to standard output
1040- printf ("%s" , log_buffer );
1041-
1042- if (xQueueSendToBack (log_queue , (void * )& log_buffer , (TickType_t ) 0 ) != pdPASS ) {
1043- if (log_buffer != NULL ) {
1044- free ((void * )log_buffer );
1045- }
1046- }
1047-
1048- return 0 ;
1049- }
1050-
1051- void send_log_to_websocket (char * message )
1052- {
1053- // Prepare the WebSocket frame
1054- httpd_ws_frame_t ws_pkt ;
1055- memset (& ws_pkt , 0 , sizeof (httpd_ws_frame_t ));
1056- ws_pkt .payload = (uint8_t * )message ;
1057- ws_pkt .len = strlen (message );
1058- ws_pkt .type = HTTPD_WS_TYPE_TEXT ;
1059-
1060- // Ensure server and fd are valid
1061- if (server != NULL && fd >= 0 ) {
1062- // Send the WebSocket frame asynchronously
1063- if (httpd_ws_send_frame_async (server , fd , & ws_pkt ) != ESP_OK ) {
1064- esp_log_set_vprintf (vprintf );
1065- }
1066- }
1067-
1068- // Free the allocated buffer
1069- free ((void * )message );
1070- }
1071-
1072- /*
1073- * This handler echos back the received ws data
1074- * and triggers an async send if certain message received
1075- */
1076- esp_err_t echo_handler (httpd_req_t * req )
1077- {
1078- if (is_network_allowed (req ) != ESP_OK ) {
1079- return httpd_resp_send_err (req , HTTPD_401_UNAUTHORIZED , "Unauthorized" );
1080- }
1081-
1082- if (req -> method == HTTP_GET ) {
1083- ESP_LOGI (TAG , "Handshake done, the new connection was opened" );
1084- fd = httpd_req_to_sockfd (req );
1085- esp_log_set_vprintf (log_to_queue );
1086- return ESP_OK ;
1087- }
1088- return ESP_OK ;
1089- }
1090-
10911008// HTTP Error (404) Handler - Redirects all requests to the root page
10921009esp_err_t http_404_error_handler (httpd_req_t * req , httpd_err_code_t err )
10931010{
@@ -1102,29 +1019,6 @@ esp_err_t http_404_error_handler(httpd_req_t * req, httpd_err_code_t err)
11021019 return ESP_OK ;
11031020}
11041021
1105- void websocket_log_handler ()
1106- {
1107- while (true)
1108- {
1109- char * message ;
1110- if (xQueueReceive (log_queue , & message , (TickType_t ) portMAX_DELAY ) != pdPASS ) {
1111- if (message != NULL ) {
1112- free ((void * )message );
1113- }
1114- vTaskDelay (10 / portTICK_PERIOD_MS );
1115- continue ;
1116- }
1117-
1118- if (fd == -1 ) {
1119- free ((void * )message );
1120- vTaskDelay (100 / portTICK_PERIOD_MS );
1121- continue ;
1122- }
1123-
1124- send_log_to_websocket (message );
1125- }
1126- }
1127-
11281022esp_err_t start_rest_server ()
11291023{
11301024
@@ -1143,13 +1037,13 @@ esp_err_t start_rest_server()
11431037 REST_CHECK (rest_context , "No memory for rest context" , err );
11441038 strlcpy (rest_context -> base_path , base_path , sizeof (rest_context -> base_path ));
11451039
1146- log_queue = xQueueCreate (MESSAGE_QUEUE_SIZE , sizeof (char * ));
1147-
11481040 httpd_config_t config = HTTPD_DEFAULT_CONFIG ();
11491041 config .uri_match_fn = httpd_uri_match_wildcard ;
11501042 config .stack_size = 8192 ;
1151- config .max_open_sockets = 10 ;
1043+ config .max_open_sockets = 20 ;
11521044 config .max_uri_handlers = 20 ;
1045+ config .close_fn = websocket_close_fn ;
1046+ config .lru_purge_enable = true;
11531047
11541048 ESP_LOGI (TAG , "Starting HTTP Server" );
11551049 REST_CHECK (httpd_start (& server , & config ) == ESP_OK , "Start server failed" , err_start );
@@ -1260,7 +1154,7 @@ esp_err_t start_rest_server()
12601154 httpd_uri_t ws = {
12611155 .uri = "/api/ws" ,
12621156 .method = HTTP_GET ,
1263- .handler = echo_handler ,
1157+ .handler = websocket_handler ,
12641158 .user_ctx = NULL ,
12651159 .is_websocket = true
12661160 };
@@ -1296,7 +1190,7 @@ esp_err_t start_rest_server()
12961190 httpd_register_err_handler (server , HTTPD_404_NOT_FOUND , http_404_error_handler );
12971191
12981192 // Start websocket log handler thread
1299- xTaskCreate (& websocket_log_handler , "websocket_log_handler " , 4096 , NULL , 2 , NULL );
1193+ xTaskCreate (websocket_task , "websocket_task " , 4096 , server , 2 , NULL );
13001194
13011195 // Start the DNS server that will redirect all queries to the softAP IP
13021196 dns_server_config_t dns_config = DNS_SERVER_CONFIG_SINGLE ("*" /* all A queries */ , "WIFI_AP_DEF" /* softAP netif ID */ );
0 commit comments