variables access rest api implemented

This commit is contained in:
Bogdan Pilyugin 2023-07-27 17:02:29 +02:00
parent a9192feb22
commit 8feca7d470
6 changed files with 153 additions and 153 deletions

View File

@ -71,14 +71,12 @@ typedef struct
struct struct
{ {
char bIsOTAEnabled :1; bool bIsOTAEnabled;
char bIsResetOTAEnabled :1; bool bIsResetOTAEnabled;
char bIsLedsEnabled :1; ///< Indication LEDs enable bool bIsLedsEnabled; ///< Indication LEDs enable
char bIsLoRaConfirm :1; ///< Enable send back confirmation in LoRa channel bool bIsLoRaConfirm; ///< Enable send back confirmation in LoRa channel
char bIsTCPConfirm :1; ///< Enable send back confirmation in TCP channel bool bIsTCPConfirm; ///< Enable send back confirmation in TCP channel
char bit5 :1;
char bit6 :1;
char bit7 :1;
} Flags1; // Flag structure } Flags1; // Flag structure
struct struct

View File

@ -29,6 +29,8 @@
#include "jWrite.h" #include "jWrite.h"
#define EXPECTED_MAX_DATA_RESPONSE_SIZE (4096) #define EXPECTED_MAX_DATA_RESPONSE_SIZE (4096)
#define VAR_MAX_NAME_LENGTH 16
#define VAR_MAX_VALUE_LENGTH 128
typedef enum typedef enum
{ {
@ -46,6 +48,7 @@ typedef enum
SYS_ERROR_PARSE_KEY1, SYS_ERROR_PARSE_KEY1,
SYS_ERROR_PARSE_KEY2, SYS_ERROR_PARSE_KEY2,
SYS_ERROR_PARSE_VARIABLES,
SYS_ERROR_NO_MEMORY = 300, SYS_ERROR_NO_MEMORY = 300,
SYS_ERROR_UNKNOWN, SYS_ERROR_UNKNOWN,
@ -61,17 +64,8 @@ typedef enum
typedef struct typedef struct
{ {
int key1;
int key2;
} payload_type_50;
typedef struct
{
int key1;
int key2;
} payload_type_10;
} payload_type_vars;
#define DATA_MESSAGE_TYPE_COMMAND (1) #define DATA_MESSAGE_TYPE_COMMAND (1)
@ -97,6 +91,9 @@ typedef struct
int err_code; int err_code;
} data_message_t; } data_message_t;
esp_err_t GetConfVar(char* name, char* val);
esp_err_t SetConfVar(char* name, char* val);
esp_err_t SysServiceDataHandler(data_message_t *MSG); esp_err_t SysServiceDataHandler(data_message_t *MSG);
sys_error_code SysVarsPayloadHandler(data_message_t *MSG); sys_error_code SysVarsPayloadHandler(data_message_t *MSG);
void GetSysErrorDetales(sys_error_code err, const char **br, const char **ds); void GetSysErrorDetales(sys_error_code err, const char **br, const char **ds);

View File

@ -1,4 +1,4 @@
/*! Copyright 2023 Bogdan Pilyugin /*! Copyright 2023 Bogdan Pilyugin
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,102 +28,82 @@
extern SYS_CONFIG SysConfig; extern SYS_CONFIG SysConfig;
const rest_var_t ConfigVariables[] = const rest_var_t ConfigVariables[] =
{ {
{0, "netname", &SysConfig.NetBIOSName, VAR_STRING, 3, 31}, { 0, "netname", &SysConfig.NetBIOSName, VAR_STRING, 3, 31 },
{1, "otaurl", &SysConfig.OTAURL, VAR_STRING, 3, 128} { 1, "otaurl", &SysConfig.OTAURL, VAR_STRING, 3, 128 },
{ 2, "ledenab", &SysConfig.Flags1.bIsLedsEnabled, VAR_BOOL, 0, 1 },
{ 3, "otaint", &SysConfig.OTAAutoInt, VAR_INT, 0, 65535 }
};
}; esp_err_t SetConfVar(char *name, char *val)
esp_err_t SetConfVar(char* valias, rest_var_types* vtype, void* val)
{ {
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(ConfigVariables) / sizeof(rest_var_t); ++i)
{ {
if (!strcmp(ConfigVariables[i].alias, valias)) if (!strcmp(ConfigVariables[i].alias, name))
{ {
V = &ConfigVariables[i]; V = (rest_var_t*) (&ConfigVariables[i]);
break; break;
} }
} }
if (!V) return ESP_ERR_NOT_FOUND; if (!V)
int vallen = strlen(val); return ESP_ERR_NOT_FOUND;
if (vallen < V->minlen || vallen >= V->maxlen) int constr;
return ESP_ERR_INVALID_ARG; switch (V->vartype)
switch(*vtype)
{ {
case VAR_BOOL: case VAR_BOOL:
V->ref = (val)?true:false; if (!strcmp(val, "true"))
break; *((bool*) V->ref) = true;
else if (!strcmp(val, "false"))
*((bool*) V->ref) = 0;
else
return ESP_ERR_INVALID_ARG;
break;
case VAR_INT: case VAR_INT:
V->ref = (int*)val; constr = atoi(val);
break; if (constr < V->minlen || constr > V->maxlen)
return ESP_ERR_INVALID_ARG;
*((int*) V->ref) = constr;
break;
case VAR_STRING: case VAR_STRING:
strcpy(V->ref, (char*)val); constr = strlen(val);
break; if (constr < V->minlen || constr > V->maxlen)
return ESP_ERR_INVALID_ARG;
strcpy(V->ref, val);
break;
} }
return ESP_OK; return ESP_OK;
} }
esp_err_t GetConfVar(char *name, char *val)
esp_err_t GetConfVar(char* valias, rest_var_types* vtype, void* val)
{ {
rest_var_types *faketp = vtype;
void *fakepointer = val;
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(ConfigVariables) / sizeof(rest_var_t); ++i)
{ {
if (!strcmp(ConfigVariables[i].alias, valias)) if (!strcmp(ConfigVariables[i].alias, name))
{ {
V = &ConfigVariables[i]; V = (rest_var_t*) (&ConfigVariables[i]);
break; break;
} }
} }
if (!V) return ESP_ERR_NOT_FOUND; if (!V)
vtype = &V->vartype; return ESP_ERR_NOT_FOUND;
switch (V->vartype)
{
case VAR_BOOL:
strcpy(val, *((bool*) V->ref) ? "true" : "false");
break;
case VAR_INT:
itoa(*((int*) V->ref), val, 10);
break;
case VAR_STRING:
strcpy(val, (char*) V->ref);
break;
}
val = V->ref; val = V->ref;
return ESP_OK; return ESP_OK;
} }
sys_error_code SysVarsPayloadHandler(data_message_t *MSG)
{
struct jReadElement result;
payload_type_50 *payload;
payload = ((payload_type_50*) (MSG->parsedData.payload));
if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND)
{
//Extract 'key1' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'key1'", &result);
if (result.elements == 1)
{
}
else
return SYS_ERROR_PARSE_KEY1;
//Extract 'key1' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'key2'", &result);
if (result.elements == 1)
{
}
else
return SYS_ERROR_PARSE_KEY2;
//return StartTransactionPayloadType1(MSG);
}
else if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_REQUEST)
{
PrepareResponsePayloadType50(MSG);
return SYS_OK_DATA;
}
else
return SYS_ERROR_PARSE_MSGTYPE;
return SYS_OK;
}

View File

@ -22,43 +22,62 @@
*/ */
/* /*
//Example of remote transaction [payloadtype=1] start[msgtype=1] //Example of SET [msgtype=1] variables [payloadtype=1]
{ {
"data":{ "data":{
"msgid":123456789, "msgid":123456789,
"time":"2023-06-03T12:25:24+00:00", "time":"2023-06-03T12:25:24+00:00",
"msgtype":1, "msgtype":1,
"payloadtype":50, "payloadtype":1,
"payload":{ "payload":{
"key1":"value1", "variables":[
"key2":"value2"}}, {"name":"variablename1","val":"variablevalue1"},
{"name":"variablename2","val":"variablevalue2"},
{"name":"variablename3","val":"variablevalue3"},
{"name":"variablename4","val":"variablevalue4"},
{"name":"variablename5","val":"variablevalue5"},
{"name":"variablename6","val":"variablevalue6"},]
}},
"signature":"6a11b872e8f766673eb82e127b6918a0dc96a42c5c9d184604f9787f3d27bcef"} "signature":"6a11b872e8f766673eb82e127b6918a0dc96a42c5c9d184604f9787f3d27bcef"}
//Example of GET [msgtype=2] variables [payloadtype=1]
//Example of request [msgtype=2] of information related to transaction [payloadtype=1]
{ {
"data":{ "data":{
"msgid":123456789, "msgid":123456789,
"time":"2023-06-03T12:25:24+00:00", "time":"2023-06-03T12:25:24+00:00",
"msgtype":2, "msgtype":2,
"payloadtype":50}, "payloadtype":1
"payload":{
"variables":[
{"name":"variablename1","val":""},
{"name":"variablename2","val":""},
{"name":"variablename3","val":""},
{"name":"variablename4","val":""},
{"name":"variablename5","val":""},
{"name":"variablename6","val":""},]
}},
"signature":"3c1254d5b0e7ecc7e662dd6397554f02622ef50edba18d0b30ecb5d53e409bcb"} "signature":"3c1254d5b0e7ecc7e662dd6397554f02622ef50edba18d0b30ecb5d53e409bcb"}
//Example of response [msgtype=3] to request related to the transaction [payloadtype=1] //Example of RESPONSE [msgtype=3] with variables [payloadtype=1]
{ {
"data":{ "data":{
"msgid":123456789, "msgid":123456789,
"time":"2023-06-03T12:25:24+00:00", "time":"2023-06-03T12:25:24+00:00",
"msgtype": 3, "msgtype": 3,
"payloadtype":50, "payloadtype":1,
"payload":{ "payload":{
"key1":"value1", "variables":[
"key2":"value2"}, {"name":"variablename1","val":"variablevalue1"},
{"name":"variablename2","val":"variablevalue2"},
{"name":"variablename3","val":"variablevalue3"},
{"name":"variablename4","val":"variablevalue4"},
{"name":"variablename5","val":"variablevalue5"},
{"name":"variablename6","val":"variablevalue6"},]
},
"error":"SYS_OK", "error":"SYS_OK",
"error_descr":"Result successful"}, "error_descr":"Result successful"},
"signature":"0d3b545b7c86274a6bf5a6e606b260f32b1999de40cb7d29d0949ecc9389cd9d"} "signature":"0d3b545b7c86274a6bf5a6e606b260f32b1999de40cb7d29d0949ecc9389cd9d"}
*/ */
#include "webguiapp.h" #include "webguiapp.h"
@ -94,68 +113,76 @@ static void Timestamp(char *ts)
sprintf(ts, "%llu", ms); sprintf(ts, "%llu", ms);
} }
void PrepareResponsePayloadType50(data_message_t *MSG) static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG)
{ {
char VarName[VAR_MAX_NAME_LENGTH];
char VarValue[VAR_MAX_VALUE_LENGTH];
struct jReadElement result;
const char *err_br; const char *err_br;
const char *err_desc; const char *err_desc;
jwOpen(MSG->outputDataBuffer, MSG->outputDataLength, JW_OBJECT, JW_PRETTY);
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); jwObj_int("msgid", MSG->parsedData.msgID);
char time[RFC3339_TIMESTAMP_LENGTH]; char time[RFC3339_TIMESTAMP_LENGTH];
GetRFC3339Time(time); GetRFC3339Time(time);
jwObj_string("time", time); jwObj_string("time", time);
jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE); jwObj_int("messtype", DATA_MESSAGE_TYPE_RESPONSE);
jwObj_int("payloadtype", 50); jwObj_int("payloadtype", 1);
//PAYLOAD BEGIN
jwObj_object("payload"); jwObj_object("payload");
jwObj_array("variables");
jwObj_string("param1", "value1"); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result);
jwObj_string("param2", "value2"); if (result.dataType == JREAD_ARRAY)
{ //Write variables
for (int i = 0; i < result.elements; ++i)
{
jRead_string(MSG->inputDataBuffer, "{'data'{'payload'{'variables'[*{'name'", VarName,
VAR_MAX_NAME_LENGTH,
&i);
jRead_string(MSG->inputDataBuffer, "{'data'{'payload'{'variables'[*{'val'", VarValue,
VAR_MAX_VALUE_LENGTH,
&i);
ESP_LOGI(TAG, "Got write variable %s:%s", VarName, VarValue);
jwArr_object();
if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND)
{ //Write variables
esp_err_t res = SetConfVar(VarName, VarValue);
if (res == ESP_OK)
GetConfVar(VarName, VarValue);
else
strcpy(VarValue, esp_err_to_name(res));
jwObj_string("name", VarName);
jwObj_string("val", VarValue);
}
else
{ //Read variables
esp_err_t res = GetConfVar(VarName, VarValue);
if ( res != ESP_OK)
strcpy(VarValue, esp_err_to_name(res));
jwObj_string("name", VarName);
jwObj_string("val", VarValue);
}
jwEnd();
}
}
else
return SYS_ERROR_PARSE_VARIABLES;
jwEnd();
jwEnd(); jwEnd();
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("error", (char*) err_br);
jwObj_string("error_descr", (char*) err_desc); jwObj_string("error_descr", (char*) err_desc);
jwEnd(); jwEnd();
jwEnd();
jwObj_string("signature", "1234567890");
jwClose(); jwClose();
}
static sys_error_code SysPayloadType50Handler(data_message_t *MSG) return SYS_OK_DATA;
{
struct jReadElement result;
payload_type_50 *payload;
payload = ((payload_type_50*) (MSG->parsedData.payload));
if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND)
{
//Extract 'key1' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'key1'", &result);
if (result.elements == 1)
{
}
else
return SYS_ERROR_PARSE_KEY1;
//Extract 'key1' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'key2'", &result);
if (result.elements == 1)
{
}
else
return SYS_ERROR_PARSE_KEY2;
//return StartTransactionPayloadType1(MSG);
}
else if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_REQUEST)
{
PrepareResponsePayloadType50(MSG);
return SYS_OK_DATA;
}
else
return SYS_ERROR_PARSE_MSGTYPE;
return SYS_OK;
} }
static sys_error_code SysDataParser(data_message_t *MSG) static sys_error_code SysDataParser(data_message_t *MSG)
@ -230,12 +257,9 @@ static sys_error_code SysDataParser(data_message_t *MSG)
switch (MSG->parsedData.payloadType) switch (MSG->parsedData.payloadType)
{ {
case 50: case 1:
MSG->parsedData.payload = malloc(sizeof(payload_type_50)); //MSG->parsedData.payload = malloc(sizeof(payload_type_vars)); Not needed for this case
return SysPayloadType50Handler(MSG); return SysPayloadTypeVarsHandler(MSG);
case 51:
MSG->parsedData.payload = malloc(sizeof(payload_type_10));
return SysVarsPayloadHandler(MSG);
break; break;
} }

View File

@ -58,7 +58,7 @@
#endif #endif
#endif #endif
static SYS_CONFIG SysConfig; SYS_CONFIG SysConfig;
#define SPI_LOCK_TIMEOUT_MS (1000) #define SPI_LOCK_TIMEOUT_MS (1000)
SemaphoreHandle_t xSemaphoreSPIHandle = NULL; SemaphoreHandle_t xSemaphoreSPIHandle = NULL;

View File

@ -44,6 +44,7 @@ const sys_error_t SysErrors[] = {
{ SYS_ERROR_PARSE_KEY1, "SYS_ERROR_PARSE_KEY1", "Key 'key1' not found or have illegal value"}, { SYS_ERROR_PARSE_KEY1, "SYS_ERROR_PARSE_KEY1", "Key 'key1' not found or have illegal value"},
{ SYS_ERROR_PARSE_KEY2, "SYS_ERROR_PARSE_KEY2", "Key 'key2' not found or have illegal value"}, { SYS_ERROR_PARSE_KEY2, "SYS_ERROR_PARSE_KEY2", "Key 'key2' not found or have illegal value"},
{ SYS_ERROR_PARSE_VARIABLES, "SYS_ERROR_PARSE_VARIABLES", "Key 'variables' not found or have illegal value"},
{ SYS_ERROR_NO_MEMORY, "SYS_ERROR_NO_MEMORY", "ERROR allocate memory for JSON parser" }, { SYS_ERROR_NO_MEMORY, "SYS_ERROR_NO_MEMORY", "ERROR allocate memory for JSON parser" },
{ SYS_ERROR_UNKNOWN, "SYS_ERROR_UNKNOWN", "Unknown ERROR" } { SYS_ERROR_UNKNOWN, "SYS_ERROR_UNKNOWN", "Unknown ERROR" }