From 16386dc07a179419a9df94805ab18565f77d6183 Mon Sep 17 00:00:00 2001 From: bogdan Date: Tue, 15 Aug 2023 13:21:36 +0200 Subject: [PATCH 1/4] disabled global control block for jWrite library --- extlibs/jReadWrite | 2 +- src/HTTPPrintSystem.c | 10 ++++---- src/MQTT.c | 25 ++++++++++---------- src/RestApiHandler.c | 52 ++++++++++++++++++++-------------------- src/SysComm.c | 55 ++++++++++++++++++++++--------------------- 5 files changed, 71 insertions(+), 73 deletions(-) diff --git a/extlibs/jReadWrite b/extlibs/jReadWrite index 8bbe1c2..cdb702a 160000 --- a/extlibs/jReadWrite +++ b/extlibs/jReadWrite @@ -1 +1 @@ -Subproject commit 8bbe1c28dc69b8adadc1ab3aed989a38e1dc8996 +Subproject commit cdb702a89b355fe86c971e5f0c5da1b376cd827b diff --git a/src/HTTPPrintSystem.c b/src/HTTPPrintSystem.c index 8c8754b..4f8240d 100644 --- a/src/HTTPPrintSystem.c +++ b/src/HTTPPrintSystem.c @@ -989,8 +989,8 @@ void GenerateSystemSettingsJSONFile(void) char *buf = malloc(2048); if (!buf) return; - - jwOpen(buf, 2048, JW_OBJECT, JW_PRETTY); + struct jWriteControl jwc; + jwOpen(&jwc, buf, 2048, JW_OBJECT, JW_PRETTY); for (int i = 0; i < (sizeof(HANDLERS_ARRAY) / sizeof(HANDLERS_ARRAY[0])); ++i) { char val[18]; @@ -998,10 +998,10 @@ void GenerateSystemSettingsJSONFile(void) strcat(val, "~"); strcat(val, HANDLERS_ARRAY[i].tag); strcat(val, "~"); - jwObj_string((char*) HANDLERS_ARRAY[i].tag, val); + jwObj_string(&jwc, (char*) HANDLERS_ARRAY[i].tag, val); } - jwEnd(); - jwClose(); + jwEnd(&jwc); + jwClose(&jwc); ESP_LOGI(TAG, "%s", buf); free(buf); } diff --git a/src/MQTT.c b/src/MQTT.c index d8dc297..e918a3e 100644 --- a/src/MQTT.c +++ b/src/MQTT.c @@ -58,9 +58,10 @@ static void mqtt1_user_event_handler(void *handler_args, esp_event_base_t base, static void mqtt2_user_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data); void (*UserEventHandler)(int idx, void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data); -static void* UserArg; +static void *UserArg; void regUserEventHandler( - void (*event_handler)(int idx, void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data), void* user_arg) + void (*event_handler)(int idx, void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data), + void *user_arg) { UserEventHandler = event_handler; UserArg = user_arg; @@ -138,23 +139,24 @@ mqtt_app_err_t PublicTestMQTT(int idx) char tmp[10]; char resp[256]; char JSONMess[512]; - jwOpen(JSONMess, MAX_ERROR_JSON, JW_OBJECT, JW_PRETTY); + struct jWriteControl jwc; + jwOpen(&jwc, JSONMess, MAX_ERROR_JSON, JW_OBJECT, JW_PRETTY); time_t now; time(&now); - jwObj_int("time", (unsigned int) now); - jwObj_string("event", "MQTT_TEST_MESSAGE)"); + jwObj_int(&jwc, "time", (unsigned int) now); + jwObj_string(&jwc, "event", "MQTT_TEST_MESSAGE)"); strcpy(resp, "mqtt://"); strcat(resp, GetSysConf()->mqttStation[idx].ServerAddr); itoa(GetSysConf()->mqttStation[idx].ServerPort, tmp, 10); strcat(resp, ":"); strcat(resp, tmp); - jwObj_string("url", resp); + jwObj_string(&jwc, "url", resp); ComposeTopic(resp, idx, "SYSTEM", "UPLINK"); - jwObj_string("tx_topic", resp); + jwObj_string(&jwc, "tx_topic", resp); ComposeTopic(resp, idx, "SYSTEM", "DWLINK"); - jwObj_string("rx_topic", resp); - jwEnd(); - jwClose(); + jwObj_string(&jwc, "rx_topic", resp); + jwEnd(&jwc); + jwClose(&jwc); char *buf = (char*) malloc(strlen(JSONMess) + 1); if (buf) { @@ -177,7 +179,6 @@ mqtt_app_err_t PublicTestMQTT(int idx) } } - static void mqtt_system_event_handler(int idx, void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { @@ -462,6 +463,4 @@ static void mqtt2_user_event_handler(void *handler_args, esp_event_base_t base, UserEventHandler(1, handler_args, base, event_id, event_data); } - - #endif diff --git a/src/RestApiHandler.c b/src/RestApiHandler.c index 907d6c4..884bba5 100644 --- a/src/RestApiHandler.c +++ b/src/RestApiHandler.c @@ -140,39 +140,37 @@ static void funct_wifiscanres(char *argres, int rw) { int arg = atoi(argres); wifi_ap_record_t *Rec; - - char onerec[64]; - strcpy(argres, "["); - for (int i = 0; i < arg; i++) - { - Rec = GetWiFiAPRecord(i); - if (!Rec) - return; - snprintf(onerec, MAX_DYNVAR_LENGTH, "{\"ssid\":\"%s\",\"rssi\":%i,\"ch\":%d}", Rec->ssid, Rec->rssi, - Rec->primary); - strcat(argres, onerec); - if (i < arg - 1) - strcat(argres, ","); - } - strcat(argres, "]"); /* - struct jWriteControl jwc; - jwOpen(&jwc, argres, VAR_MAX_VALUE_LENGTH, JW_ARRAY, JW_COMPACT); + char onerec[64]; + strcpy(argres, "["); for (int i = 0; i < arg; i++) { Rec = GetWiFiAPRecord(i); - if (Rec) - { - jwArr_object(&jwc); - jwObj_string(&jwc,"ssid", (char*) Rec->ssid); - jwObj_int(&jwc,"rssi", Rec->rssi); - jwObj_int(&jwc,"ch", Rec->primary); - jwEnd(&jwc); + if (!Rec) + return; + snprintf(onerec, MAX_DYNVAR_LENGTH, "{\"ssid\":\"%s\",\"rssi\":%i,\"ch\":%d}", Rec->ssid, Rec->rssi, + Rec->primary); + strcat(argres, onerec); + if (i < arg - 1) + strcat(argres, ","); } - } - jwClose(&jwc); + strcat(argres, "]"); */ - ESP_LOGI("REST", "%s", argres); + struct jWriteControl jwc; + jwOpen(&jwc, argres, VAR_MAX_VALUE_LENGTH, JW_ARRAY, JW_COMPACT); + for (int i = 0; i < arg; i++) + { + Rec = GetWiFiAPRecord(i); + if (Rec) + { + jwArr_object(&jwc); + jwObj_string(&jwc, "ssid", (char*) Rec->ssid); + jwObj_int(&jwc, "rssi", Rec->rssi); + jwObj_int(&jwc, "ch", Rec->primary); + jwEnd(&jwc); + } + } + jwClose(&jwc); } diff --git a/src/SysComm.c b/src/SysComm.c index 2cdd0ff..ad3c69d 100644 --- a/src/SysComm.c +++ b/src/SysComm.c @@ -95,17 +95,17 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) if (!(MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND || MSG->parsedData.msgType == DATA_MESSAGE_TYPE_REQUEST)) return SYS_ERROR_PARSE_MSGTYPE; - - jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_COMPACT); - jwObj_object("data"); - jwObj_int("msgid", MSG->parsedData.msgID); + struct jWriteControl jwc; + jwOpen(&jwc, MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_COMPACT); + jwObj_object(&jwc, "data"); + jwObj_int(&jwc, "msgid", MSG->parsedData.msgID); char time[RFC3339_TIMESTAMP_LENGTH]; GetRFC3339Time(time); - jwObj_string("time", time); - jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE); - jwObj_int("payloadtype", 1); - jwObj_object("payload"); - jwObj_object("variables"); + jwObj_string(&jwc, "time", time); + jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE); + jwObj_int(&jwc, "payloadtype", 1); + jwObj_object(&jwc, "payload"); + jwObj_object(&jwc, "variables"); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result); if (result.dataType == JREAD_OBJECT) @@ -148,9 +148,9 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) } //Response with actual data if (tp == VAR_STRING || tp == VAR_IPADDR || tp == VAR_ERROR || tp == VAR_PASS) - jwObj_string(VarName, VarValue); + jwObj_string(&jwc, VarName, VarValue); else - jwObj_raw(VarName, VarValue); + jwObj_raw(&jwc, VarName, VarValue); } free(VarValue); @@ -158,12 +158,12 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) else return SYS_ERROR_PARSE_VARIABLES; - jwEnd(); - jwEnd(); + jwEnd(&jwc); + jwEnd(&jwc); GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc); - jwObj_string("error", (char*) err_br); - jwObj_string("error_descr", (char*) err_desc); - jwEnd(); + jwObj_string(&jwc, "error", (char*) err_br); + jwObj_string(&jwc, "error_descr", (char*) err_desc); + jwEnd(&jwc); char *datap = strstr(MSG->outputDataBuffer, "\"data\":"); if (datap) @@ -177,12 +177,12 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) #if REAST_API_DEBUG_MODE ESP_LOGI(TAG, "SHA256 of DATA object is %s", sha_print); #endif - jwObj_string("signature", (char*) sha_print); + jwObj_string(&jwc, "signature", (char*) sha_print); } else return SYS_ERROR_SHA256_DATA; - jwEnd(); - jwClose(); + jwEnd(&jwc); + jwClose(&jwc); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'applytype'", &result); if (result.elements == 1) @@ -303,19 +303,20 @@ esp_err_t SysServiceDataHandler(data_message_t *MSG) MSG->err_code = (int) SysDataParser(MSG); if (MSG->err_code) { - jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY); - jwObj_int("msgid", MSG->parsedData.msgID); + struct jWriteControl jwc; + jwOpen(&jwc, MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY); + jwObj_int(&jwc, "msgid", MSG->parsedData.msgID); char time[RFC3339_TIMESTAMP_LENGTH]; GetRFC3339Time(time); - jwObj_string("time", time); - jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE); + jwObj_string(&jwc, "time", time); + jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE); const char *err_br; const char *err_desc; GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc); - jwObj_string("error", (char*) err_br); - jwObj_string("error_descr", (char*) err_desc); - jwEnd(); - jwClose(); + jwObj_string(&jwc, "error", (char*) err_br); + jwObj_string(&jwc, "error_descr", (char*) err_desc); + jwEnd(&jwc); + jwClose(&jwc); } return ESP_OK; From e8150202106520873416794e0bce0f505b8d79d2 Mon Sep 17 00:00:00 2001 From: bogdan Date: Tue, 15 Aug 2023 13:39:51 +0200 Subject: [PATCH 2/4] reduced memory allocate for variable value, handle errors in wifi scan api function --- include/SystemApplication.h | 2 +- src/RestApiHandler.c | 25 +++++++------------------ 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/include/SystemApplication.h b/include/SystemApplication.h index 2c04dbb..477de9c 100644 --- a/include/SystemApplication.h +++ b/include/SystemApplication.h @@ -32,7 +32,7 @@ #define EXPECTED_MAX_DATA_RESPONSE_SIZE (4096) #define VAR_MAX_NAME_LENGTH MAX_DYNVAR_NAME_LENGTH -#define VAR_MAX_VALUE_LENGTH (2048) +#define VAR_MAX_VALUE_LENGTH (1024) typedef enum { diff --git a/src/RestApiHandler.c b/src/RestApiHandler.c index 884bba5..0452c16 100644 --- a/src/RestApiHandler.c +++ b/src/RestApiHandler.c @@ -140,22 +140,6 @@ static void funct_wifiscanres(char *argres, int rw) { int arg = atoi(argres); wifi_ap_record_t *Rec; - /* - char onerec[64]; - strcpy(argres, "["); - for (int i = 0; i < arg; i++) - { - Rec = GetWiFiAPRecord(i); - if (!Rec) - return; - snprintf(onerec, MAX_DYNVAR_LENGTH, "{\"ssid\":\"%s\",\"rssi\":%i,\"ch\":%d}", Rec->ssid, Rec->rssi, - Rec->primary); - strcat(argres, onerec); - if (i < arg - 1) - strcat(argres, ","); - } - strcat(argres, "]"); - */ struct jWriteControl jwc; jwOpen(&jwc, argres, VAR_MAX_VALUE_LENGTH, JW_ARRAY, JW_COMPACT); for (int i = 0; i < arg; i++) @@ -170,8 +154,13 @@ static void funct_wifiscanres(char *argres, int rw) jwEnd(&jwc); } } - jwClose(&jwc); - + int err = jwClose(&jwc); + if (err == JWRITE_OK) + return; + if(err > JWRITE_BUF_FULL ) + strcpy(argres, "\"SYS_ERROR_NO_MEMORY\""); + else + strcpy(argres, "\"SYS_ERROR_UNKNOWN\""); } const int hw_rev = CONFIG_BOARD_HARDWARE_REVISION; From 4ec665e5d97a3762a403291ea6978210554c5bad Mon Sep 17 00:00:00 2001 From: Bogdan Pilyugin Date: Thu, 17 Aug 2023 10:48:29 +0200 Subject: [PATCH 3/4] attached user defined variables --- include/webguiapp.h | 3 ++- src/RestApiHandler.c | 51 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/include/webguiapp.h b/include/webguiapp.h index 799971e..7a1162a 100644 --- a/include/webguiapp.h +++ b/include/webguiapp.h @@ -35,9 +35,10 @@ #include "driver/spi_master.h" #include "UserCallbacks.h" +#include "SysConfiguration.h" esp_err_t spi_device_polling_transmit_synchronized(spi_device_handle_t handle, spi_transaction_t *trans_desc); - +void SetAppVars( rest_var_t* appvars, int size); bool GetUserAppNeedReset(void); void SetUserAppNeedReset(bool res); void LogFile(char *fname, char *format, ...); diff --git a/src/RestApiHandler.c b/src/RestApiHandler.c index 0452c16..130e477 100644 --- a/src/RestApiHandler.c +++ b/src/RestApiHandler.c @@ -33,6 +33,15 @@ extern SYS_CONFIG SysConfig; + +rest_var_t *AppVars = NULL; +int AppVarsSize = 0; +void SetAppVars( rest_var_t* appvars, int size) +{ + AppVars = appvars; + AppVarsSize = size; +} + static void PrintInterfaceState(char *argres, int rw, esp_netif_t *netif) { snprintf(argres, MAX_DYNVAR_LENGTH, @@ -165,7 +174,9 @@ static void funct_wifiscanres(char *argres, int rw) const int hw_rev = CONFIG_BOARD_HARDWARE_REVISION; -const rest_var_t ConfigVariables[] = + + +const rest_var_t SystemVariables[] = { /*FUNCTIONS*/ { 0, "time", &funct_time, VAR_FUNCT, R, 0, 0 }, @@ -278,14 +289,28 @@ const rest_var_t ConfigVariables[] = esp_err_t SetConfVar(char *name, char *val, rest_var_types *tp) { rest_var_t *V = NULL; - for (int i = 0; i < sizeof(ConfigVariables) / sizeof(rest_var_t); ++i) + //Search for system variables + for (int i = 0; i < sizeof(SystemVariables) / sizeof(rest_var_t); ++i) { - if (!strcmp(ConfigVariables[i].alias, name)) + if (!strcmp(SystemVariables[i].alias, name)) { - V = (rest_var_t*) (&ConfigVariables[i]); + V = (rest_var_t*) (&SystemVariables[i]); break; } } + //Search for user variables + if(AppVars) + { + for (int i = 0; i < AppVarsSize; ++i) + { + if (!strcmp(AppVars[i].alias, name)) + { + V = (rest_var_t*) (&AppVars[i]); + break; + } + } + } + if (!V) return ESP_ERR_NOT_FOUND; if (V->varattr == R) @@ -340,14 +365,26 @@ esp_err_t SetConfVar(char *name, char *val, rest_var_types *tp) esp_err_t GetConfVar(char *name, char *val, rest_var_types *tp) { rest_var_t *V = NULL; - for (int i = 0; i < sizeof(ConfigVariables) / sizeof(rest_var_t); ++i) + for (int i = 0; i < sizeof(SystemVariables) / sizeof(rest_var_t); ++i) { - if (!strcmp(ConfigVariables[i].alias, name)) + if (!strcmp(SystemVariables[i].alias, name)) { - V = (rest_var_t*) (&ConfigVariables[i]); + V = (rest_var_t*) (&SystemVariables[i]); break; } } + //Search for user variables + if(AppVars) + { + for (int i = 0; i < AppVarsSize; ++i) + { + if (!strcmp(AppVars[i].alias, name)) + { + V = (rest_var_t*) (&AppVars[i]); + break; + } + } + } if (!V) return ESP_ERR_NOT_FOUND; *tp = V->vartype; From ac3be6bfdc745ec23e97961657fc9bc19e55333f Mon Sep 17 00:00:00 2001 From: Bogdan Pilyugin Date: Thu, 17 Aug 2023 11:36:45 +0200 Subject: [PATCH 4/4] changed API URL from sysapi to api --- include/webguiapp.h | 1 + src/HTTPPostSystem.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/webguiapp.h b/include/webguiapp.h index 7a1162a..5808daa 100644 --- a/include/webguiapp.h +++ b/include/webguiapp.h @@ -34,6 +34,7 @@ #include "esp_system.h" #include "driver/spi_master.h" +#include "SystemApplication.h" #include "UserCallbacks.h" #include "SysConfiguration.h" diff --git a/src/HTTPPostSystem.c b/src/HTTPPostSystem.c index 932b21d..d596fd6 100644 --- a/src/HTTPPostSystem.c +++ b/src/HTTPPostSystem.c @@ -37,7 +37,7 @@ const char url_adapters[] = "adapters.html"; const char url_services[] = "services.html"; const char url_system[] = "system.html"; const char url_reboot[] = "reboot.html"; -const char url_sysapi[] = "sysapi"; +const char url_api[] = "api"; static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData); static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData); @@ -86,7 +86,7 @@ HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostDat static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData) { - if (!memcmp(filename, url_sysapi, sizeof(url_sysapi))) + if (!memcmp(filename, url_api, sizeof(url_api))) return HTTPPostSysAPI(req, PostData); if (!memcmp(filename, url_adapters, sizeof(url_adapters))) return HTTPPostAdaptersSettings(req, PostData);