Merge branch 'jwrite_no_global_control' into 'rest_api'

reduced memory allocate for variable value, handle errors in wifi scan

See merge request userbogd/webguiapp!4
This commit is contained in:
Bogdan Pilyugin 2023-08-17 09:52:24 +00:00
commit 26e5af602a
8 changed files with 113 additions and 87 deletions

@ -1 +1 @@
Subproject commit 8bbe1c28dc69b8adadc1ab3aed989a38e1dc8996 Subproject commit cdb702a89b355fe86c971e5f0c5da1b376cd827b

View File

@ -32,7 +32,7 @@
#define EXPECTED_MAX_DATA_RESPONSE_SIZE (4096) #define EXPECTED_MAX_DATA_RESPONSE_SIZE (4096)
#define VAR_MAX_NAME_LENGTH MAX_DYNVAR_NAME_LENGTH #define VAR_MAX_NAME_LENGTH MAX_DYNVAR_NAME_LENGTH
#define VAR_MAX_VALUE_LENGTH (2048) #define VAR_MAX_VALUE_LENGTH (1024)
typedef enum typedef enum
{ {

View File

@ -34,10 +34,12 @@
#include "esp_system.h" #include "esp_system.h"
#include "driver/spi_master.h" #include "driver/spi_master.h"
#include "SystemApplication.h"
#include "UserCallbacks.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); 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); bool GetUserAppNeedReset(void);
void SetUserAppNeedReset(bool res); void SetUserAppNeedReset(bool res);
void LogFile(char *fname, char *format, ...); void LogFile(char *fname, char *format, ...);

View File

@ -37,7 +37,7 @@ const char url_adapters[] = "adapters.html";
const char url_services[] = "services.html"; const char url_services[] = "services.html";
const char url_system[] = "system.html"; const char url_system[] = "system.html";
const char url_reboot[] = "reboot.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 AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData);
static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, 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) 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); return HTTPPostSysAPI(req, PostData);
if (!memcmp(filename, url_adapters, sizeof(url_adapters))) if (!memcmp(filename, url_adapters, sizeof(url_adapters)))
return HTTPPostAdaptersSettings(req, PostData); return HTTPPostAdaptersSettings(req, PostData);

View File

@ -989,8 +989,8 @@ void GenerateSystemSettingsJSONFile(void)
char *buf = malloc(2048); char *buf = malloc(2048);
if (!buf) if (!buf)
return; return;
struct jWriteControl jwc;
jwOpen(buf, 2048, JW_OBJECT, JW_PRETTY); jwOpen(&jwc, buf, 2048, JW_OBJECT, JW_PRETTY);
for (int i = 0; i < (sizeof(HANDLERS_ARRAY) / sizeof(HANDLERS_ARRAY[0])); ++i) for (int i = 0; i < (sizeof(HANDLERS_ARRAY) / sizeof(HANDLERS_ARRAY[0])); ++i)
{ {
char val[18]; char val[18];
@ -998,10 +998,10 @@ void GenerateSystemSettingsJSONFile(void)
strcat(val, "~"); strcat(val, "~");
strcat(val, HANDLERS_ARRAY[i].tag); strcat(val, HANDLERS_ARRAY[i].tag);
strcat(val, "~"); strcat(val, "~");
jwObj_string((char*) HANDLERS_ARRAY[i].tag, val); jwObj_string(&jwc, (char*) HANDLERS_ARRAY[i].tag, val);
} }
jwEnd(); jwEnd(&jwc);
jwClose(); jwClose(&jwc);
ESP_LOGI(TAG, "%s", buf); ESP_LOGI(TAG, "%s", buf);
free(buf); free(buf);
} }

View File

@ -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); 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); 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 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; UserEventHandler = event_handler;
UserArg = user_arg; UserArg = user_arg;
@ -138,23 +139,24 @@ mqtt_app_err_t PublicTestMQTT(int idx)
char tmp[10]; char tmp[10];
char resp[256]; char resp[256];
char JSONMess[512]; 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_t now;
time(&now); time(&now);
jwObj_int("time", (unsigned int) now); jwObj_int(&jwc, "time", (unsigned int) now);
jwObj_string("event", "MQTT_TEST_MESSAGE)"); jwObj_string(&jwc, "event", "MQTT_TEST_MESSAGE)");
strcpy(resp, "mqtt://"); strcpy(resp, "mqtt://");
strcat(resp, GetSysConf()->mqttStation[idx].ServerAddr); strcat(resp, GetSysConf()->mqttStation[idx].ServerAddr);
itoa(GetSysConf()->mqttStation[idx].ServerPort, tmp, 10); itoa(GetSysConf()->mqttStation[idx].ServerPort, tmp, 10);
strcat(resp, ":"); strcat(resp, ":");
strcat(resp, tmp); strcat(resp, tmp);
jwObj_string("url", resp); jwObj_string(&jwc, "url", resp);
ComposeTopic(resp, idx, "SYSTEM", "UPLINK"); ComposeTopic(resp, idx, "SYSTEM", "UPLINK");
jwObj_string("tx_topic", resp); jwObj_string(&jwc, "tx_topic", resp);
ComposeTopic(resp, idx, "SYSTEM", "DWLINK"); ComposeTopic(resp, idx, "SYSTEM", "DWLINK");
jwObj_string("rx_topic", resp); jwObj_string(&jwc, "rx_topic", resp);
jwEnd(); jwEnd(&jwc);
jwClose(); jwClose(&jwc);
char *buf = (char*) malloc(strlen(JSONMess) + 1); char *buf = (char*) malloc(strlen(JSONMess) + 1);
if (buf) 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, static void mqtt_system_event_handler(int idx, void *handler_args, esp_event_base_t base, int32_t event_id,
void *event_data) 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); UserEventHandler(1, handler_args, base, event_id, event_data);
} }
#endif #endif

View File

@ -33,6 +33,15 @@
extern SYS_CONFIG SysConfig; 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) static void PrintInterfaceState(char *argres, int rw, esp_netif_t *netif)
{ {
snprintf(argres, MAX_DYNVAR_LENGTH, snprintf(argres, MAX_DYNVAR_LENGTH,
@ -140,45 +149,34 @@ static void funct_wifiscanres(char *argres, int rw)
{ {
int arg = atoi(argres); int arg = atoi(argres);
wifi_ap_record_t *Rec; wifi_ap_record_t *Rec;
struct jWriteControl jwc;
char onerec[64]; jwOpen(&jwc, argres, VAR_MAX_VALUE_LENGTH, JW_ARRAY, JW_COMPACT);
strcpy(argres, "[");
for (int i = 0; i < arg; i++) for (int i = 0; i < arg; i++)
{ {
Rec = GetWiFiAPRecord(i); Rec = GetWiFiAPRecord(i);
if (!Rec) if (Rec)
return; {
snprintf(onerec, MAX_DYNVAR_LENGTH, "{\"ssid\":\"%s\",\"rssi\":%i,\"ch\":%d}", Rec->ssid, Rec->rssi, jwArr_object(&jwc);
Rec->primary); jwObj_string(&jwc, "ssid", (char*) Rec->ssid);
strcat(argres, onerec); jwObj_int(&jwc, "rssi", Rec->rssi);
if (i < arg - 1) jwObj_int(&jwc, "ch", Rec->primary);
strcat(argres, ","); jwEnd(&jwc);
}
} }
strcat(argres, "]"); int err = jwClose(&jwc);
/* if (err == JWRITE_OK)
struct jWriteControl jwc; return;
jwOpen(&jwc, argres, VAR_MAX_VALUE_LENGTH, JW_ARRAY, JW_COMPACT); if(err > JWRITE_BUF_FULL )
for (int i = 0; i < arg; i++) strcpy(argres, "\"SYS_ERROR_NO_MEMORY\"");
{ else
Rec = GetWiFiAPRecord(i); strcpy(argres, "\"SYS_ERROR_UNKNOWN\"");
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);
*/
ESP_LOGI("REST", "%s", argres);
} }
const int hw_rev = CONFIG_BOARD_HARDWARE_REVISION; const int hw_rev = CONFIG_BOARD_HARDWARE_REVISION;
const rest_var_t ConfigVariables[] =
const rest_var_t SystemVariables[] =
{ {
/*FUNCTIONS*/ /*FUNCTIONS*/
{ 0, "time", &funct_time, VAR_FUNCT, R, 0, 0 }, { 0, "time", &funct_time, VAR_FUNCT, R, 0, 0 },
@ -291,14 +289,28 @@ const rest_var_t ConfigVariables[] =
esp_err_t SetConfVar(char *name, char *val, rest_var_types *tp) esp_err_t SetConfVar(char *name, char *val, rest_var_types *tp)
{ {
rest_var_t *V = NULL; 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; 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) if (!V)
return ESP_ERR_NOT_FOUND; return ESP_ERR_NOT_FOUND;
if (V->varattr == R) if (V->varattr == R)
@ -353,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) esp_err_t GetConfVar(char *name, char *val, rest_var_types *tp)
{ {
rest_var_t *V = NULL; 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; 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) if (!V)
return ESP_ERR_NOT_FOUND; return ESP_ERR_NOT_FOUND;
*tp = V->vartype; *tp = V->vartype;

View File

@ -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)) if (!(MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND || MSG->parsedData.msgType == DATA_MESSAGE_TYPE_REQUEST))
return SYS_ERROR_PARSE_MSGTYPE; return SYS_ERROR_PARSE_MSGTYPE;
struct jWriteControl jwc;
jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_COMPACT); jwOpen(&jwc, MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_COMPACT);
jwObj_object("data"); jwObj_object(&jwc, "data");
jwObj_int("msgid", MSG->parsedData.msgID); jwObj_int(&jwc, "msgid", MSG->parsedData.msgID);
char time[RFC3339_TIMESTAMP_LENGTH]; char time[RFC3339_TIMESTAMP_LENGTH];
GetRFC3339Time(time); GetRFC3339Time(time);
jwObj_string("time", time); jwObj_string(&jwc, "time", time);
jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE); jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE);
jwObj_int("payloadtype", 1); jwObj_int(&jwc, "payloadtype", 1);
jwObj_object("payload"); jwObj_object(&jwc, "payload");
jwObj_object("variables"); jwObj_object(&jwc, "variables");
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result);
if (result.dataType == JREAD_OBJECT) if (result.dataType == JREAD_OBJECT)
@ -148,9 +148,9 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG)
} }
//Response with actual data //Response with actual data
if (tp == VAR_STRING || tp == VAR_IPADDR || tp == VAR_ERROR || tp == VAR_PASS) if (tp == VAR_STRING || tp == VAR_IPADDR || tp == VAR_ERROR || tp == VAR_PASS)
jwObj_string(VarName, VarValue); jwObj_string(&jwc, VarName, VarValue);
else else
jwObj_raw(VarName, VarValue); jwObj_raw(&jwc, VarName, VarValue);
} }
free(VarValue); free(VarValue);
@ -158,12 +158,12 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG)
else else
return SYS_ERROR_PARSE_VARIABLES; return SYS_ERROR_PARSE_VARIABLES;
jwEnd(); jwEnd(&jwc);
jwEnd(); jwEnd(&jwc);
GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc); GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc);
jwObj_string("error", (char*) err_br); jwObj_string(&jwc, "error", (char*) err_br);
jwObj_string("error_descr", (char*) err_desc); jwObj_string(&jwc, "error_descr", (char*) err_desc);
jwEnd(); jwEnd(&jwc);
char *datap = strstr(MSG->outputDataBuffer, "\"data\":"); char *datap = strstr(MSG->outputDataBuffer, "\"data\":");
if (datap) if (datap)
@ -177,12 +177,12 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG)
#if REAST_API_DEBUG_MODE #if REAST_API_DEBUG_MODE
ESP_LOGI(TAG, "SHA256 of DATA object is %s", sha_print); ESP_LOGI(TAG, "SHA256 of DATA object is %s", sha_print);
#endif #endif
jwObj_string("signature", (char*) sha_print); jwObj_string(&jwc, "signature", (char*) sha_print);
} }
else else
return SYS_ERROR_SHA256_DATA; return SYS_ERROR_SHA256_DATA;
jwEnd(); jwEnd(&jwc);
jwClose(); jwClose(&jwc);
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'applytype'", &result); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'applytype'", &result);
if (result.elements == 1) if (result.elements == 1)
@ -303,19 +303,20 @@ esp_err_t SysServiceDataHandler(data_message_t *MSG)
MSG->err_code = (int) SysDataParser(MSG); MSG->err_code = (int) SysDataParser(MSG);
if (MSG->err_code) if (MSG->err_code)
{ {
jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY); struct jWriteControl jwc;
jwObj_int("msgid", MSG->parsedData.msgID); jwOpen(&jwc, MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY);
jwObj_int(&jwc, "msgid", MSG->parsedData.msgID);
char time[RFC3339_TIMESTAMP_LENGTH]; char time[RFC3339_TIMESTAMP_LENGTH];
GetRFC3339Time(time); GetRFC3339Time(time);
jwObj_string("time", time); jwObj_string(&jwc, "time", time);
jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE); jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE);
const char *err_br; const char *err_br;
const char *err_desc; const char *err_desc;
GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc); GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc);
jwObj_string("error", (char*) err_br); jwObj_string(&jwc, "error", (char*) err_br);
jwObj_string("error_descr", (char*) err_desc); jwObj_string(&jwc, "error_descr", (char*) err_desc);
jwEnd(); jwEnd(&jwc);
jwClose(); jwClose(&jwc);
} }
return ESP_OK; return ESP_OK;