mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-09 21:17:18 +03:00
memory leak fixed
This commit is contained in:
5
Makefile
5
Makefile
@@ -13,9 +13,8 @@
|
|||||||
#recovery: EXTRA_CPPFLAGS+=-DRECOVERY_APPLICATION=1
|
#recovery: EXTRA_CPPFLAGS+=-DRECOVERY_APPLICATION=1
|
||||||
|
|
||||||
PROJECT_NAME?=squeezelite
|
PROJECT_NAME?=squeezelite
|
||||||
EXTRA_CPPFLAGS+= -Wno-error=maybe-uninitialized \
|
EXTRA_CPPFLAGS+= -I$(PROJECT_PATH)/main
|
||||||
-I$(PROJECT_PATH)/main
|
#/-Wno-error=maybe-uninitialized
|
||||||
|
|
||||||
include $(IDF_PATH)/make/project.mk
|
include $(IDF_PATH)/make/project.mk
|
||||||
|
|
||||||
# for future gcc version, this could be needed: CPPFLAGS+= -Wno-error=format-overflow -Wno-error=stringop-truncation
|
# for future gcc version, this could be needed: CPPFLAGS+= -Wno-error=format-overflow -Wno-error=stringop-truncation
|
||||||
|
|||||||
@@ -28,7 +28,8 @@
|
|||||||
#include "platform_esp32.h"
|
#include "platform_esp32.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "esp_sleep.h"
|
#include "esp_sleep.h"
|
||||||
#include "driver/uart.h" // for the uart driver access
|
#include "driver/uart.h"
|
||||||
|
#include "messaging.h"
|
||||||
|
|
||||||
#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS
|
#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS
|
||||||
#define WITH_TASKS_INFO 1
|
#define WITH_TASKS_INFO 1
|
||||||
@@ -130,7 +131,7 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
|
|||||||
|
|
||||||
if(it == NULL){
|
if(it == NULL){
|
||||||
ESP_LOGE(TAG,"Unable initialize partition iterator!");
|
ESP_LOGE(TAG,"Unable initialize partition iterator!");
|
||||||
set_status_message(ERROR, "Reboot failed. Cannot iterate through partitions");
|
messaging_post_message(MESSAGING_ERROR,MESSAGING_CLASS_SYSTEM,"Reboot failed. Cannot iterate through partitions");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -144,18 +145,19 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
|
|||||||
if(err!=ESP_OK){
|
if(err!=ESP_OK){
|
||||||
ESP_LOGE(TAG,"Unable to set partition as active for next boot. %s",esp_err_to_name(err));
|
ESP_LOGE(TAG,"Unable to set partition as active for next boot. %s",esp_err_to_name(err));
|
||||||
bFound=false;
|
bFound=false;
|
||||||
set_status_message(ERROR, "Unable to select partition for reboot.");
|
messaging_post_message(MESSAGING_ERROR,MESSAGING_CLASS_SYSTEM,"Unable to select partition for reboot.");
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
ESP_LOGW(TAG, "Application partition %s sub type %u is selected for boot", partition->label,partition_subtype);
|
ESP_LOGW(TAG, "Application partition %s sub type %u is selected for boot", partition->label,partition_subtype);
|
||||||
bFound=true;
|
bFound=true;
|
||||||
set_status_message(WARNING, "Rebooting!");
|
messaging_post_message(MESSAGING_WARNING,MESSAGING_CLASS_SYSTEM,"Reboot failed. Cannot iterate through partitions");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ESP_LOGE(TAG,"partition type %u not found! Unable to reboot to recovery.",partition_subtype);
|
ESP_LOGE(TAG,"partition type %u not found! Unable to reboot to recovery.",partition_subtype);
|
||||||
set_status_message(ERROR, "Partition not found.");
|
messaging_post_message(MESSAGING_ERROR,MESSAGING_CLASS_SYSTEM,"partition type %u not found! Unable to reboot to recovery.",partition_subtype);
|
||||||
|
|
||||||
}
|
}
|
||||||
ESP_LOGD(TAG, "Yielding to other processes");
|
ESP_LOGD(TAG, "Yielding to other processes");
|
||||||
taskYIELD();
|
taskYIELD();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "nvs_utilities.h"
|
#include "nvs_utilities.h"
|
||||||
#include "platform_esp32.h"
|
#include "platform_esp32.h"
|
||||||
#include "messaging.h"
|
#include "messaging.h"
|
||||||
|
#include "trace.h"
|
||||||
/************************************
|
/************************************
|
||||||
* Globals
|
* Globals
|
||||||
*/
|
*/
|
||||||
@@ -137,12 +138,12 @@ cJSON * messaging_retrieve_messages(RingbufHandle_t buf_handle){
|
|||||||
else {
|
else {
|
||||||
json_message = cJSON_CreateObject();
|
json_message = cJSON_CreateObject();
|
||||||
cJSON_AddStringToObject(json_message, "message", message->message);
|
cJSON_AddStringToObject(json_message, "message", message->message);
|
||||||
|
vRingbufferReturnItem(buf_handle, (void *)message);
|
||||||
cJSON_AddStringToObject(json_message, "type", messaging_get_type_desc(message->type));
|
cJSON_AddStringToObject(json_message, "type", messaging_get_type_desc(message->type));
|
||||||
cJSON_AddStringToObject(json_message, "class", messaging_get_class_desc(message->msg_class));
|
cJSON_AddStringToObject(json_message, "class", messaging_get_class_desc(message->msg_class));
|
||||||
cJSON_AddNumberToObject(json_message,"sent_time",message->sent_time);
|
cJSON_AddNumberToObject(json_message,"sent_time",message->sent_time);
|
||||||
cJSON_AddNumberToObject(json_message,"current_time",esp_timer_get_time() / 1000);
|
cJSON_AddNumberToObject(json_message,"current_time",esp_timer_get_time() / 1000);
|
||||||
cJSON_AddItemToArray(json_messages,json_message);
|
cJSON_AddItemToArray(json_messages,json_message);
|
||||||
vRingbufferReturnItem(buf_handle, (void *)message);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return json_messages;
|
return json_messages;
|
||||||
|
|||||||
@@ -29,8 +29,9 @@
|
|||||||
#include "esp_spi_flash.h"
|
#include "esp_spi_flash.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "messaging.h"
|
#include "messaging.h"
|
||||||
|
#include "trace.h"
|
||||||
#include "esp_ota_ops.h"
|
#include "esp_ota_ops.h"
|
||||||
|
|
||||||
extern const char * get_certificate();
|
extern const char * get_certificate();
|
||||||
|
|
||||||
#ifdef CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1
|
#ifdef CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1
|
||||||
@@ -57,16 +58,12 @@ typedef enum {
|
|||||||
OTA_TYPE_INVALID
|
OTA_TYPE_INVALID
|
||||||
} ota_type_t;
|
} ota_type_t;
|
||||||
static struct {
|
static struct {
|
||||||
char status_text[81];
|
|
||||||
uint32_t actual_image_len;
|
uint32_t actual_image_len;
|
||||||
uint32_t total_image_len;
|
uint32_t total_image_len;
|
||||||
uint32_t remain_image_len;
|
uint32_t remain_image_len;
|
||||||
char * redirected_url;
|
|
||||||
char * current_url;
|
|
||||||
ota_type_t ota_type;
|
ota_type_t ota_type;
|
||||||
char * bin;
|
char * bin;
|
||||||
bool bOTAStarted;
|
bool bOTAStarted;
|
||||||
bool bInitialized;
|
|
||||||
uint8_t lastpct;
|
uint8_t lastpct;
|
||||||
uint8_t newpct;
|
uint8_t newpct;
|
||||||
struct timeval OTA_start;
|
struct timeval OTA_start;
|
||||||
@@ -99,10 +96,22 @@ void sendMessaging(messaging_types type,const char * fmt, ...){
|
|||||||
if(str_len>0){
|
if(str_len>0){
|
||||||
msg_str = malloc(str_len);
|
msg_str = malloc(str_len);
|
||||||
vsnprintf(msg_str,str_len,fmt,args);
|
vsnprintf(msg_str,str_len,fmt,args);
|
||||||
|
if(type == MESSAGING_WARNING){
|
||||||
|
ESP_LOGW(TAG,"%s",msg_str);
|
||||||
|
}
|
||||||
|
else if (type == MESSAGING_ERROR){
|
||||||
|
ESP_LOGE(TAG,"%s",msg_str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ESP_LOGI(TAG,"%s",msg_str);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ESP_LOGW(TAG, "Sending empty string message");
|
||||||
}
|
}
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
cJSON_AddStringToObject(msg,"ota_dsc",msg_str);
|
|
||||||
|
cJSON_AddStringToObject(msg,"ota_dsc",str_or_unknown(msg_str));
|
||||||
free(msg_str);
|
free(msg_str);
|
||||||
cJSON_AddNumberToObject(msg,"ota_pct", ota_get_pct_complete() );
|
cJSON_AddNumberToObject(msg,"ota_pct", ota_get_pct_complete() );
|
||||||
char * json_msg = cJSON_PrintUnformatted(msg);
|
char * json_msg = cJSON_PrintUnformatted(msg);
|
||||||
@@ -150,7 +159,7 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt)
|
|||||||
case HTTP_EVENT_ON_CONNECTED:
|
case HTTP_EVENT_ON_CONNECTED:
|
||||||
ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
|
ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
|
||||||
|
|
||||||
if(ota_status.bOTAStarted) sendMessaging(MESSAGING_INFO,"Installing...");
|
if(ota_status.bOTAStarted) sendMessaging(MESSAGING_INFO,"Connecting to URL...");
|
||||||
ota_status.total_image_len=0;
|
ota_status.total_image_len=0;
|
||||||
ota_status.actual_image_len=0;
|
ota_status.actual_image_len=0;
|
||||||
ota_status.lastpct=0;
|
ota_status.lastpct=0;
|
||||||
@@ -165,9 +174,7 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt)
|
|||||||
case HTTP_EVENT_ON_HEADER:
|
case HTTP_EVENT_ON_HEADER:
|
||||||
ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s",evt->header_key, evt->header_value);
|
ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s",evt->header_key, evt->header_value);
|
||||||
if (strcasecmp(evt->header_key, "location") == 0) {
|
if (strcasecmp(evt->header_key, "location") == 0) {
|
||||||
FREE_RESET(ota_status.redirected_url);
|
ESP_LOGW(TAG,"OTA will redirect to url: %s",evt->header_value);
|
||||||
ota_status.redirected_url=strdup(evt->header_value);
|
|
||||||
ESP_LOGW(TAG,"OTA will redirect to url: %s",ota_status.redirected_url);
|
|
||||||
}
|
}
|
||||||
if (strcasecmp(evt->header_key, "content-length") == 0) {
|
if (strcasecmp(evt->header_key, "content-length") == 0) {
|
||||||
ota_status.total_image_len = atol(evt->header_value);
|
ota_status.total_image_len = atol(evt->header_value);
|
||||||
@@ -191,7 +198,6 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt)
|
|||||||
|
|
||||||
esp_err_t init_config(ota_thread_parms_t * p_ota_thread_parms){
|
esp_err_t init_config(ota_thread_parms_t * p_ota_thread_parms){
|
||||||
memset(&ota_config, 0x00, sizeof(ota_config));
|
memset(&ota_config, 0x00, sizeof(ota_config));
|
||||||
ota_status.bInitialized = true;
|
|
||||||
sendMessaging(MESSAGING_INFO,"Initializing...");
|
sendMessaging(MESSAGING_INFO,"Initializing...");
|
||||||
ota_status.ota_type= OTA_TYPE_INVALID;
|
ota_status.ota_type= OTA_TYPE_INVALID;
|
||||||
if(p_ota_thread_parms->url !=NULL && strlen(p_ota_thread_parms->url)>0 ){
|
if(p_ota_thread_parms->url !=NULL && strlen(p_ota_thread_parms->url)>0 ){
|
||||||
@@ -208,14 +214,14 @@ esp_err_t init_config(ota_thread_parms_t * p_ota_thread_parms){
|
|||||||
|
|
||||||
switch (ota_status.ota_type) {
|
switch (ota_status.ota_type) {
|
||||||
case OTA_TYPE_HTTP:
|
case OTA_TYPE_HTTP:
|
||||||
ota_status.current_url= p_ota_thread_parms->url;
|
|
||||||
ota_config.cert_pem =get_certificate();
|
ota_config.cert_pem =get_certificate();
|
||||||
ota_config.event_handler = _http_event_handler;
|
ota_config.event_handler = _http_event_handler;
|
||||||
ota_config.buffer_size = BUFFSIZE;
|
ota_config.buffer_size = BUFFSIZE;
|
||||||
ota_config.disable_auto_redirect=false;
|
ota_config.disable_auto_redirect=true;
|
||||||
ota_config.skip_cert_common_name_check = false;
|
ota_config.skip_cert_common_name_check = false;
|
||||||
ota_config.url = strdup(ota_status.current_url);
|
ota_config.url = strdup(p_ota_thread_parms->url);
|
||||||
ota_config.max_redirection_count = 3;
|
ota_config.max_redirection_count = 3;
|
||||||
|
|
||||||
ota_write_data = heap_caps_malloc(ota_config.buffer_size+1 , MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
ota_write_data = heap_caps_malloc(ota_config.buffer_size+1 , MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||||
//ota_write_data = malloc(ota_config.buffer_size+1);
|
//ota_write_data = malloc(ota_config.buffer_size+1);
|
||||||
if(ota_write_data== NULL){
|
if(ota_write_data== NULL){
|
||||||
@@ -295,14 +301,14 @@ esp_err_t _erase_last_boot_app_partition(esp_partition_t *ota_partition)
|
|||||||
if(i%2) {
|
if(i%2) {
|
||||||
sendMessaging(MESSAGING_INFO,"Erasing flash (%u/%u)",i,num_passes);
|
sendMessaging(MESSAGING_INFO,"Erasing flash (%u/%u)",i,num_passes);
|
||||||
}
|
}
|
||||||
vTaskDelay(200/ portTICK_PERIOD_MS); // wait here for a short amount of time. This will help with reducing WDT errors
|
//vTaskDelay(200/ portTICK_PERIOD_MS); // wait here for a short amount of time. This will help with reducing WDT errors
|
||||||
}
|
}
|
||||||
if(remain_size>0){
|
if(remain_size>0){
|
||||||
err=esp_partition_erase_range(ota_partition, ota_partition->size-remain_size, remain_size);
|
err=esp_partition_erase_range(ota_partition, ota_partition->size-remain_size, remain_size);
|
||||||
if(err!=ESP_OK) return err;
|
if(err!=ESP_OK) return err;
|
||||||
}
|
}
|
||||||
sendMessaging(MESSAGING_INFO,"Erasing flash complete.");
|
sendMessaging(MESSAGING_INFO,"Erasing flash complete.");
|
||||||
taskYIELD();
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,28 +327,32 @@ static bool process_again(int status_code)
|
|||||||
static esp_err_t _http_handle_response_code(esp_http_client_handle_t http_client, int status_code)
|
static esp_err_t _http_handle_response_code(esp_http_client_handle_t http_client, int status_code)
|
||||||
{
|
{
|
||||||
esp_err_t err=ESP_OK;
|
esp_err_t err=ESP_OK;
|
||||||
if (status_code == HttpStatus_MovedPermanently || status_code == HttpStatus_Found) {
|
if (status_code == HttpStatus_MovedPermanently || status_code == HttpStatus_Found ) {
|
||||||
ESP_LOGW(TAG, "Handling HTTP redirection. ");
|
ESP_LOGW(TAG, "Handling HTTP redirection. ");
|
||||||
err = esp_http_client_set_redirection(http_client);
|
err = esp_http_client_set_redirection(http_client);
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "URL redirection Failed. %s", esp_err_to_name(err));
|
ESP_LOGE(TAG, "URL redirection Failed. %s", esp_err_to_name(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
ESP_LOGW(TAG, "Done Handling HTTP redirection. ");
|
||||||
|
|
||||||
} else if (status_code == HttpStatus_Unauthorized) {
|
} else if (status_code == HttpStatus_Unauthorized) {
|
||||||
ESP_LOGW(TAG, "Handling Unauthorized. ");
|
ESP_LOGW(TAG, "Handling Unauthorized. ");
|
||||||
esp_http_client_add_auth(http_client);
|
esp_http_client_add_auth(http_client);
|
||||||
}
|
}
|
||||||
ESP_LOGD(TAG, "Redirection done, checking if we need to read the data. ");
|
ESP_LOGD(TAG, "Redirection done, checking if we need to read the data. ");
|
||||||
if (process_again(status_code)) {
|
if (process_again(status_code)) {
|
||||||
char * local_buff = heap_caps_malloc(ota_config.buffer_size+1, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
ESP_LOGD(TAG, "We have to read some more data. Allocating buffer size %u",ota_config.buffer_size+1);
|
||||||
|
char local_buff_var[501]={};
|
||||||
|
//char * local_buff = heap_caps_malloc(ota_config.buffer_size+1, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||||
//char * local_buff = malloc(ota_config.buffer_size+1);
|
//char * local_buff = malloc(ota_config.buffer_size+1);
|
||||||
if(local_buff==NULL){
|
// if(local_buff==NULL){
|
||||||
ESP_LOGE(TAG,"Failed to allocate internal memory buffer for http processing");
|
// ESP_LOGE(TAG,"Failed to allocate internal memory buffer for http processing");
|
||||||
return ESP_ERR_NO_MEM;
|
// return ESP_ERR_NO_MEM;
|
||||||
}
|
// }
|
||||||
while (1) {
|
while (1) {
|
||||||
ESP_LOGD(TAG, "Reading data chunk. ");
|
ESP_LOGD(TAG, "Buffer successfully allocated. Reading data chunk. ");
|
||||||
int data_read = esp_http_client_read(http_client, local_buff, ota_config.buffer_size);
|
int data_read = esp_http_client_read(http_client, local_buff_var, sizeof(local_buff_var));
|
||||||
if (data_read < 0) {
|
if (data_read < 0) {
|
||||||
ESP_LOGE(TAG, "Error: SSL data read error");
|
ESP_LOGE(TAG, "Error: SSL data read error");
|
||||||
err= ESP_FAIL;
|
err= ESP_FAIL;
|
||||||
@@ -353,7 +363,7 @@ static esp_err_t _http_handle_response_code(esp_http_client_handle_t http_client
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_RESET(local_buff);
|
//FREE_RESET(local_buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@@ -379,8 +389,6 @@ static esp_err_t _http_connect(esp_http_client_handle_t http_client)
|
|||||||
status_code = esp_http_client_get_status_code(http_client);
|
status_code = esp_http_client_get_status_code(http_client);
|
||||||
ESP_LOGD(TAG, "HTTP status code was %d",status_code);
|
ESP_LOGD(TAG, "HTTP status code was %d",status_code);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
err = _http_handle_response_code(http_client, status_code);
|
err = _http_handle_response_code(http_client, status_code);
|
||||||
if (err != ESP_OK) {
|
if (err != ESP_OK) {
|
||||||
return err;
|
return err;
|
||||||
@@ -395,11 +403,7 @@ void ota_task_cleanup(const char * message, ...){
|
|||||||
va_start(args, message);
|
va_start(args, message);
|
||||||
sendMessaging(MESSAGING_ERROR,message, args);
|
sendMessaging(MESSAGING_ERROR,message, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
ESP_LOGE(TAG, "%s",ota_status.status_text);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_RESET(ota_status.redirected_url);
|
|
||||||
FREE_RESET(ota_status.current_url);
|
|
||||||
FREE_RESET(ota_status.bin);
|
FREE_RESET(ota_status.bin);
|
||||||
FREE_RESET(ota_write_data);
|
FREE_RESET(ota_write_data);
|
||||||
if(ota_http_client!=NULL) {
|
if(ota_http_client!=NULL) {
|
||||||
@@ -603,7 +607,7 @@ esp_err_t process_recovery_ota(const char * bin_url, char * bin_buffer, uint32_t
|
|||||||
|
|
||||||
if(bin_url){
|
if(bin_url){
|
||||||
ota_thread_parms.url =strdup(bin_url);
|
ota_thread_parms.url =strdup(bin_url);
|
||||||
ESP_LOGI(TAG, "Starting ota on core %u for : %s", OTA_CORE,bin_url);
|
ESP_LOGI(TAG, "Starting ota on core %u for : %s", OTA_CORE,ota_thread_parms.url);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ota_thread_parms.bin = bin_buffer;
|
ota_thread_parms.bin = bin_buffer;
|
||||||
@@ -614,8 +618,7 @@ esp_err_t process_recovery_ota(const char * bin_url, char * bin_buffer, uint32_t
|
|||||||
char * num_buffer=config_alloc_get(NVS_TYPE_STR, "ota_stack");
|
char * num_buffer=config_alloc_get(NVS_TYPE_STR, "ota_stack");
|
||||||
if(num_buffer!=NULL) {
|
if(num_buffer!=NULL) {
|
||||||
stack_size= atol(num_buffer);
|
stack_size= atol(num_buffer);
|
||||||
free(num_buffer);
|
FREE_AND_NULL(num_buffer);
|
||||||
num_buffer=NULL;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ESP_LOGW(TAG,"OTA stack size config not found");
|
ESP_LOGW(TAG,"OTA stack size config not found");
|
||||||
@@ -624,8 +627,7 @@ esp_err_t process_recovery_ota(const char * bin_url, char * bin_buffer, uint32_t
|
|||||||
num_buffer=config_alloc_get(NVS_TYPE_STR, "ota_prio");
|
num_buffer=config_alloc_get(NVS_TYPE_STR, "ota_prio");
|
||||||
if(num_buffer!=NULL) {
|
if(num_buffer!=NULL) {
|
||||||
task_priority= atol(num_buffer);
|
task_priority= atol(num_buffer);
|
||||||
free(num_buffer);
|
FREE_AND_NULL(num_buffer);
|
||||||
num_buffer=NULL;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ESP_LOGW(TAG,"OTA task priority not found");
|
ESP_LOGW(TAG,"OTA task priority not found");
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "nvs_utilities.h"
|
#include "nvs_utilities.h"
|
||||||
#include "platform_esp32.h"
|
#include "platform_esp32.h"
|
||||||
|
#include "trace.h"
|
||||||
|
|
||||||
/************************************
|
/************************************
|
||||||
* Globals
|
* Globals
|
||||||
@@ -148,12 +148,14 @@ static void telnet_task(void *data) {
|
|||||||
int rc = bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
|
int rc = bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ESP_LOGE(tag, "bind: %d (%s)", errno, strerror(errno));
|
ESP_LOGE(tag, "bind: %d (%s)", errno, strerror(errno));
|
||||||
|
close(serverSocket);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = listen(serverSocket, 5);
|
rc = listen(serverSocket, 5);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
ESP_LOGE(tag, "listen: %d (%s)", errno, strerror(errno));
|
ESP_LOGE(tag, "listen: %d (%s)", errno, strerror(errno));
|
||||||
|
close(serverSocket);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,6 +173,7 @@ static void telnet_task(void *data) {
|
|||||||
ESP_LOGD(tag, "Telnet connection terminated");
|
ESP_LOGD(tag, "Telnet connection terminated");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
close(serverSocket);
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,5 +28,20 @@
|
|||||||
#define STR(macro) QUOTE(macro)
|
#define STR(macro) QUOTE(macro)
|
||||||
#endif
|
#endif
|
||||||
#define ESP_LOG_DEBUG_EVENT(tag,e) ESP_LOGD(tag,"evt: " e)
|
#define ESP_LOG_DEBUG_EVENT(tag,e) ESP_LOGD(tag,"evt: " e)
|
||||||
|
#ifndef STR_OR_ALT
|
||||||
|
#define STR_OR_ALT(str,alt) (str?str:alt)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern const char unknown_string_placeholder[];
|
||||||
|
extern const char * str_or_unknown(const char * str);
|
||||||
|
|
||||||
|
#ifndef FREE_AND_NULL
|
||||||
|
#define FREE_AND_NULL(x) if(x) { free(x); x=NULL; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CASE_TO_STR
|
||||||
|
#define CASE_TO_STR(x) case x: return STR(x); break;
|
||||||
|
#endif
|
||||||
|
#define START_FREE_MEM_CHECK(a) size_t a=heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
|
||||||
|
#define CHECK_RESET_FREE_MEM_CHECK(a,b) ESP_LOGV(__FUNCTION__ ,b "Mem used: %i",a-heap_caps_get_free_size(MALLOC_CAP_INTERNAL)); a=heap_caps_get_free_size(MALLOC_CAP_INTERNAL)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,6 @@
|
|||||||
#
|
#
|
||||||
COMPONENT_EMBED_FILES := style.css code.js index.html bootstrap.min.css.gz jquery.min.js.gz popper.min.js.gz bootstrap.min.js.gz
|
COMPONENT_EMBED_FILES := style.css code.js index.html bootstrap.min.css.gz jquery.min.js.gz popper.min.js.gz bootstrap.min.js.gz
|
||||||
COMPONENT_ADD_INCLUDEDIRS := .
|
COMPONENT_ADD_INCLUDEDIRS := .
|
||||||
CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_INFO
|
CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ function to process requests, decode URLs, serve files, etc. etc.
|
|||||||
#include "lwip/ip_addr.h"
|
#include "lwip/ip_addr.h"
|
||||||
#include "messaging.h"
|
#include "messaging.h"
|
||||||
#include "platform_esp32.h"
|
#include "platform_esp32.h"
|
||||||
|
#include "trace.h"
|
||||||
|
|
||||||
#define HTTP_STACK_SIZE (5*1024)
|
#define HTTP_STACK_SIZE (5*1024)
|
||||||
const char str_na[]="N/A";
|
const char str_na[]="N/A";
|
||||||
@@ -148,6 +149,7 @@ char * http_alloc_get_socket_address(httpd_req_t *req, u8_t local, in_port_t * p
|
|||||||
|
|
||||||
int s = httpd_req_to_sockfd(req);
|
int s = httpd_req_to_sockfd(req);
|
||||||
if(s == -1) {
|
if(s == -1) {
|
||||||
|
free(ipstr);
|
||||||
return strdup("httpd_req_to_sockfd error");
|
return strdup("httpd_req_to_sockfd error");
|
||||||
}
|
}
|
||||||
ESP_LOGV_LOC(TAG,"httpd socket descriptor: %u", s);
|
ESP_LOGV_LOC(TAG,"httpd socket descriptor: %u", s);
|
||||||
@@ -239,24 +241,31 @@ bool is_captive_portal_host_name(httpd_req_t *req){
|
|||||||
/* Custom function to free context */
|
/* Custom function to free context */
|
||||||
void free_ctx_func(void *ctx)
|
void free_ctx_func(void *ctx)
|
||||||
{
|
{
|
||||||
|
START_FREE_MEM_CHECK(ff);
|
||||||
session_context_t * context = (session_context_t *)ctx;
|
session_context_t * context = (session_context_t *)ctx;
|
||||||
if(context){
|
if(context){
|
||||||
|
ESP_LOGD(TAG, "Freeing up socket context");
|
||||||
FREE_AND_NULL(context->auth_token);
|
FREE_AND_NULL(context->auth_token);
|
||||||
FREE_AND_NULL(context->sess_ip_address);
|
FREE_AND_NULL(context->sess_ip_address);
|
||||||
free(context);
|
free(context);
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(ff,"free_ctx");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session_context_t* get_session_context(httpd_req_t *req){
|
session_context_t* get_session_context(httpd_req_t *req){
|
||||||
|
START_FREE_MEM_CHECK(ff);
|
||||||
if (! req->sess_ctx) {
|
if (! req->sess_ctx) {
|
||||||
|
ESP_LOGD(TAG,"New connection context. Allocating session buffer");
|
||||||
req->sess_ctx = malloc(sizeof(session_context_t));
|
req->sess_ctx = malloc(sizeof(session_context_t));
|
||||||
memset(req->sess_ctx,0x00,sizeof(session_context_t));
|
memset(req->sess_ctx,0x00,sizeof(session_context_t));
|
||||||
req->free_ctx = free_ctx_func;
|
req->free_ctx = free_ctx_func;
|
||||||
// get the remote IP address only once per session
|
// get the remote IP address only once per session
|
||||||
}
|
}
|
||||||
session_context_t *ctx_data = (session_context_t*)req->sess_ctx;
|
session_context_t *ctx_data = (session_context_t*)req->sess_ctx;
|
||||||
|
FREE_AND_NULL(ctx_data->sess_ip_address);
|
||||||
ctx_data->sess_ip_address = http_alloc_get_socket_address(req, 0, &ctx_data->port);
|
ctx_data->sess_ip_address = http_alloc_get_socket_address(req, 0, &ctx_data->port);
|
||||||
ESP_LOGD_LOC(TAG, "serving %s to peer %s port %u", req->uri, ctx_data->sess_ip_address , ctx_data->port);
|
ESP_LOGD_LOC(TAG, "serving %s to peer %s port %u", req->uri, ctx_data->sess_ip_address , ctx_data->port);
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(ff,"get sess context");
|
||||||
return (session_context_t *)req->sess_ctx;
|
return (session_context_t *)req->sess_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1043,25 +1052,34 @@ esp_err_t redirect_ev_handler(httpd_req_t *req){
|
|||||||
|
|
||||||
esp_err_t messages_get_handler(httpd_req_t *req){
|
esp_err_t messages_get_handler(httpd_req_t *req){
|
||||||
ESP_LOGD_LOC(TAG, "serving [%s]", req->uri);
|
ESP_LOGD_LOC(TAG, "serving [%s]", req->uri);
|
||||||
|
START_FREE_MEM_CHECK(before);
|
||||||
|
START_FREE_MEM_CHECK(all);
|
||||||
if(!is_user_authenticated(req)){
|
if(!is_user_authenticated(req)){
|
||||||
// todo: redirect to login page
|
// todo: redirect to login page
|
||||||
// return ESP_OK;
|
// return ESP_OK;
|
||||||
}
|
}
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(before, "after user auth");
|
||||||
esp_err_t err = set_content_type_from_req(req);
|
esp_err_t err = set_content_type_from_req(req);
|
||||||
if(err != ESP_OK){
|
if(err != ESP_OK){
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(before, "after set_content_type");
|
||||||
cJSON * json_messages= messaging_retrieve_messages(messaging);
|
cJSON * json_messages= messaging_retrieve_messages(messaging);
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(before, "after receiving messages");
|
||||||
if(json_messages!=NULL){
|
if(json_messages!=NULL){
|
||||||
char * json_text= cJSON_Print(json_messages);
|
char * json_text= cJSON_Print(json_messages);
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(before, "after json print");
|
||||||
httpd_resp_send(req, (const char *)json_text, strlen(json_text));
|
httpd_resp_send(req, (const char *)json_text, strlen(json_text));
|
||||||
cJSON_free(json_messages);
|
CHECK_RESET_FREE_MEM_CHECK(before, "after http send");
|
||||||
free(json_text);
|
free(json_text);
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(before, "after free json message");
|
||||||
|
cJSON_free(json_messages);
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(before, "after free json");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR , "Unable to retrieve messages");
|
httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR , "Unable to retrieve messages");
|
||||||
}
|
}
|
||||||
|
CHECK_RESET_FREE_MEM_CHECK(all, "before returning");
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ Contains the freeRTOS task and all necessary support
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "cmd_system.h"
|
#include "cmd_system.h"
|
||||||
|
#include "messaging.h"
|
||||||
|
|
||||||
#include "http_server_handlers.h"
|
#include "http_server_handlers.h"
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
@@ -850,20 +851,6 @@ void wifi_manager_connect_async(){
|
|||||||
wifi_manager_send_message(ORDER_CONNECT_STA, (void*)CONNECTION_REQUEST_USER);
|
wifi_manager_send_message(ORDER_CONNECT_STA, (void*)CONNECTION_REQUEST_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_status_message(message_severity_t severity, const char * message){
|
|
||||||
if(ip_info_cjson==NULL){
|
|
||||||
ip_info_cjson = wifi_manager_get_new_json(&ip_info_cjson);
|
|
||||||
}
|
|
||||||
if(ip_info_cjson==NULL){
|
|
||||||
ESP_LOGE(TAG, "Error setting status message. Unable to allocate cJSON.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cJSON * item=cJSON_GetObjectItem(ip_info_cjson, "message");
|
|
||||||
item = wifi_manager_get_new_json(&item);
|
|
||||||
cJSON_AddItemToObject(item, "severity", cJSON_CreateString(severity==INFO?"INFO":severity==WARNING?"WARNING":severity==ERROR?"ERROR":"" ));
|
|
||||||
cJSON_AddItemToObject(item, "text", cJSON_CreateString(message));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char* wifi_manager_alloc_get_ip_info_json(){
|
char* wifi_manager_alloc_get_ip_info_json(){
|
||||||
return cJSON_PrintUnformatted(ip_info_cjson);
|
return cJSON_PrintUnformatted(ip_info_cjson);
|
||||||
@@ -1142,6 +1129,7 @@ void wifi_manager( void * pvParameters ){
|
|||||||
if(esp_wifi_scan_start(&scan_config, false)!=ESP_OK){
|
if(esp_wifi_scan_start(&scan_config, false)!=ESP_OK){
|
||||||
ESP_LOGW(TAG, "Unable to start scan; wifi is trying to connect");
|
ESP_LOGW(TAG, "Unable to start scan; wifi is trying to connect");
|
||||||
// set_status_message(WARNING, "Wifi Connecting. Cannot start scan.");
|
// set_status_message(WARNING, "Wifi Connecting. Cannot start scan.");
|
||||||
|
messaging_post_message(MESSAGING_WARNING,MESSAGING_CLASS_SYSTEM,"Wifi connecting. Cannot start scan.");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
xEventGroupSetBits(wifi_manager_event_group, WIFI_MANAGER_SCAN_BIT);
|
xEventGroupSetBits(wifi_manager_event_group, WIFI_MANAGER_SCAN_BIT);
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ esp_err_t http_server_start()
|
|||||||
strlcpy(rest_context->base_path, "/res/", sizeof(rest_context->base_path));
|
strlcpy(rest_context->base_path, "/res/", sizeof(rest_context->base_path));
|
||||||
|
|
||||||
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
|
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
|
||||||
config.max_uri_handlers = 20;
|
config.max_uri_handlers = 25;
|
||||||
config.max_open_sockets = 5;
|
config.max_open_sockets = 5;
|
||||||
config.uri_match_fn = httpd_uri_match_wildcard;
|
config.uri_match_fn = httpd_uri_match_wildcard;
|
||||||
//todo: use the endpoint below to configure session token?
|
//todo: use the endpoint below to configure session token?
|
||||||
|
|||||||
@@ -31,28 +31,4 @@ extern bool wait_for_wifi();
|
|||||||
extern void console_start();
|
extern void console_start();
|
||||||
extern pthread_cond_t wifi_connect_suspend_cond;
|
extern pthread_cond_t wifi_connect_suspend_cond;
|
||||||
extern pthread_t wifi_connect_suspend_mutex;
|
extern pthread_t wifi_connect_suspend_mutex;
|
||||||
typedef enum {
|
|
||||||
INFO,
|
|
||||||
WARNING,
|
|
||||||
ERROR
|
|
||||||
} message_severity_t;
|
|
||||||
extern void set_status_message(message_severity_t severity, const char * message);
|
|
||||||
#ifndef STR_OR_ALT
|
|
||||||
#define STR_OR_ALT(str,alt) (str?str:alt)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern const char unknown_string_placeholder[];
|
|
||||||
extern const char * str_or_unknown(const char * str);
|
|
||||||
|
|
||||||
#ifndef FREE_AND_NULL
|
|
||||||
#define FREE_AND_NULL(x) if(x) { free(x); x=NULL; }
|
|
||||||
#endif
|
|
||||||
#ifndef QUOTE
|
|
||||||
#define QUOTE(name) #name
|
|
||||||
#endif
|
|
||||||
#ifndef STR
|
|
||||||
#define STR(macro) QUOTE(macro)
|
|
||||||
#endif
|
|
||||||
#ifndef CASE_TO_STR
|
|
||||||
#define CASE_TO_STR(x) case x: return STR(x); break;
|
|
||||||
#endif
|
|
||||||
|
|||||||
Reference in New Issue
Block a user