convert to new flash_config functions. add webapp config.

This commit is contained in:
btsimonh
2022-02-13 22:16:21 +00:00
parent 43f3c635f7
commit 6dfcaa85b6
9 changed files with 348 additions and 104 deletions

View File

@@ -21,12 +21,19 @@ static TLV_HEADER_ST *g_table = NULL;
static UINT32 flashaddr;
static UINT32 flashlen;
static int compress_table();
static int save_table();
static int changes = 0;
extern int g_savecfg;
static int config_compress_table();
static int config_save_table();
static INFO_ITEM_ST *_search_item(INFO_ITEM_ST *item, UINT32 *p_usedlen);
static SemaphoreHandle_t config_mutex = 0;
char *hex = "0123456789ABCDEF";
int dump(unsigned char *addr, int len){
int config_dump(unsigned char *addr, int len){
char tmp[40];
int i;
ADDLOG_DEBUG(LOG_FEATURE_CFG, "dump of 0x%08X", addr);
@@ -45,7 +52,31 @@ int dump(unsigned char *addr, int len){
int get_tbl(int readit){
int config_get_item(void *container) {
INFO_ITEM_ST *res;
INFO_ITEM_ST *p_item = (INFO_ITEM_ST *)container;
int ret = 0;
BaseType_t taken;
if (!config_mutex) {
config_mutex = xSemaphoreCreateMutex( );
}
taken = xSemaphoreTake( config_mutex, 100 );
res = _search_item(p_item, NULL);
if (res){
os_memcpy(p_item, res, sizeof(INFO_ITEM_ST) + p_item->len);
ret = 1;
}
if (taken == pdTRUE){
xSemaphoreGive( config_mutex );
}
return ret;
}
int config_get_tbl(int readit){
UINT32 ret = 0, status;
DD_HANDLE flash_handle;
TLV_HEADER_ST head;
@@ -65,7 +96,7 @@ int get_tbl(int readit){
if(INFO_TLV_HEADER != g_table->type){
ADDLOG_DEBUG(LOG_FEATURE_CFG, "get_tbl g_table corrupted");
dump((unsigned char *)g_table, 32);
config_dump((unsigned char *)g_table, 32);
cfg_len = 0;
return cfg_len;
}
@@ -101,21 +132,42 @@ int get_tbl(int readit){
ddev_close(flash_handle);
hal_flash_unlock();
dump((unsigned char *)g_table, 32);
config_dump((unsigned char *)g_table, cfg_len);
config_dump_table();
return ret;
}
int release_tbl(){
void *table = g_table;
int config_release_tbl(){
void *table;
BaseType_t taken;
if (!config_mutex) {
config_mutex = xSemaphoreCreateMutex( );
}
taken = xSemaphoreTake( config_mutex, 100 );
table = g_table;
if(INFO_TLV_HEADER != g_table->type){
ADDLOG_DEBUG(LOG_FEATURE_CFG, "release_tbl g_table corrupted");
}
if (!table)
if (!table) {
if (taken == pdTRUE){
xSemaphoreGive( config_mutex );
}
return 0;
}
if (changes){
config_save_table();
}
g_table = NULL;
os_free(table);
if (taken == pdTRUE){
xSemaphoreGive( config_mutex );
}
ADDLOG_DEBUG(LOG_FEATURE_CFG, "release_tbl");
return 0;
}
@@ -128,7 +180,7 @@ static INFO_ITEM_ST *_search_item(INFO_ITEM_ST *item, UINT32 *p_usedlen)
INFO_ITEM_ST *target = NULL;
UINT32 usedlen = 0;
UINT32 type = 0;
UINT32 tablelen = get_tbl(1);
UINT32 tablelen = config_get_tbl(1);
if (!tablelen){
if (p_usedlen) *p_usedlen = usedlen;
return NULL;
@@ -175,23 +227,33 @@ static int tbl_used_data_len(){
return (int)len;
}
INFO_ITEM_ST *search_item(INFO_ITEM_ST *item){
INFO_ITEM_ST *config_search_item(INFO_ITEM_ST *item){
return _search_item(item, NULL);
}
INFO_ITEM_ST *search_item_type(UINT32 type){
INFO_ITEM_ST *config_search_item_type(UINT32 type){
INFO_ITEM_ST item;
item.type = type;
return _search_item(&item, NULL);
}
int delete_item(UINT32 type)
int config_delete_item(UINT32 type)
{
UINT32 addr, end_addr;
INFO_ITEM_ST *head;
UINT32 deleted = 0;
UINT32 tablelen = get_tbl(1);
UINT32 tablelen;
BaseType_t taken;
if (!config_mutex) {
config_mutex = xSemaphoreCreateMutex( );
}
taken = xSemaphoreTake( config_mutex, 100 );
tablelen = config_get_tbl(1);
if (!tablelen){
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
return 0;
}
@@ -211,23 +273,33 @@ int delete_item(UINT32 type)
if (deleted){
ADDLOG_DEBUG(LOG_FEATURE_CFG, "Deleted %d items type 0x%08X", deleted, type);
compress_table();
save_table();
config_compress_table();
}
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
return deleted;
}
//////////////////////////////////////////
// remove redundant entries
static int compress_table()
static int config_compress_table()
{
UINT32 addr1, addr2, end_addr;
INFO_ITEM_ST *head;
UINT32 usedlen = 0;
UINT32 tablelen = get_tbl(1);
UINT32 tablelen;
BaseType_t taken;
if (!config_mutex) {
config_mutex = xSemaphoreCreateMutex( );
}
taken = xSemaphoreTake( config_mutex, 100 );
tablelen = config_get_tbl(1);
if (!tablelen){
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
return 0;
}
@@ -258,9 +330,12 @@ static int compress_table()
if (addr1 != addr2) {
ADDLOG_DEBUG(LOG_FEATURE_CFG, "Compress table from %d to %d bytes", g_table->len, usedlen);
changes++;
}
g_table->len = addr2 - sizeof(TLV_HEADER_ST);
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
if (addr1 != addr2) {
return addr2; // maybe should save
}
@@ -269,22 +344,30 @@ static int compress_table()
}
static int save_table(){
static int config_save_table(){
UINT32 tablelen = 0;
bk_logic_partition_t *pt = bk_flash_get_info(BK_PARTITION_NET_PARAM);
flashaddr = pt->partition_start_addr;
flashlen = pt->partition_length;
BaseType_t taken;
if (!config_mutex) {
config_mutex = xSemaphoreCreateMutex( );
}
taken = xSemaphoreTake( config_mutex, 100 );
if (!g_table) {
ADDLOG_ERROR(LOG_FEATURE_CFG, "save_table - no table to save");
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
return 0;
}
// should already have it...
tablelen = get_tbl(1);
tablelen = config_get_tbl(1);
if (tablelen > flashlen){
ADDLOG_ERROR(LOG_FEATURE_CFG, "save_table - table too big - can't save");
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
return 0;
}
@@ -295,28 +378,39 @@ static int save_table(){
bk_flash_write(BK_PARTITION_NET_PARAM,0,(uint8_t *)g_table,tablelen);
bk_flash_enable_security(FLASH_PROTECT_ALL);
hal_flash_unlock();
changes = 0;
if (taken == pdTRUE) xSemaphoreGive( config_mutex );
ADDLOG_DEBUG(LOG_FEATURE_CFG, "would save_table %d bytes", tablelen);
return 1;
}
int save_item(INFO_ITEM_ST *item)
int config_save_item(INFO_ITEM_ST *item)
{
UINT32 item_len;
INFO_ITEM_ST_PTR item_head_ptr;
BaseType_t taken;
if (!config_mutex) {
config_mutex = xSemaphoreCreateMutex( );
}
taken = xSemaphoreTake( config_mutex, 100 );
item_len = sizeof(INFO_ITEM_ST) + item->len;
UINT32 tablelen = get_tbl(1);
UINT32 tablelen = config_get_tbl(1);
if(g_table && (INFO_TLV_HEADER != g_table->type)){
ADDLOG_DEBUG(LOG_FEATURE_CFG, "save_item g_table corrupted");
if (taken == pdTRUE){
xSemaphoreGive( config_mutex );
}
return 0;
}
ADDLOG_DEBUG(LOG_FEATURE_CFG, "save_item type %08X len %d, tablelen %d", item->type, item->len, tablelen);
rtos_delay_milliseconds(1000);
if (!tablelen){
// no table, creat it.
@@ -329,9 +423,10 @@ int save_item(INFO_ITEM_ST *item)
os_memcpy(item_head_ptr, item, item_len);
tablelen = cfg_len;
ADDLOG_DEBUG(LOG_FEATURE_CFG, "save_item, new table created");
changes++;
} else {
// have table - do we have existing item?
item_head_ptr = search_item(item);
item_head_ptr = config_search_item(item);
ADDLOG_DEBUG(LOG_FEATURE_API, "save search found %x len %d, our len %d", item_head_ptr, (item_head_ptr?item_head_ptr->len:0), item->len);
if (item_head_ptr){
// if length mismatch, then zap this entry, and add on end
@@ -347,12 +442,14 @@ int save_item(INFO_ITEM_ST *item)
} else {
ADDLOG_DEBUG(LOG_FEATURE_CFG, "save_item new item");
}
rtos_delay_milliseconds(1000);
// if we STILL have an item, lengths match.
// just copy in data and write whole table
if (item_head_ptr){
os_memcpy(item_head_ptr, item, item_len);
if (os_memcmp(item_head_ptr, item, item_len)){
os_memcpy(item_head_ptr, item, item_len);
changes++;
}
} else {
UINT32 newlen = 0;
// add to end
@@ -363,11 +460,13 @@ int save_item(INFO_ITEM_ST *item)
if(!newtable){
ADDLOG_DEBUG(LOG_FEATURE_CFG, "allocation failure for %d bytes - save aborted",
tablelen + item_len);
if (taken == pdTRUE){
xSemaphoreGive( config_mutex );
}
return 0;
}
ADDLOG_DEBUG(LOG_FEATURE_CFG, "copy from %x to %x len %d",
g_table, newtable, tablelen);
rtos_delay_milliseconds(1000);
os_memcpy(newtable, g_table, tablelen);
item_head_ptr = (INFO_ITEM_ST *) (((char *)newtable) + tablelen);
os_memcpy(item_head_ptr, item, item_len);
@@ -375,24 +474,35 @@ int save_item(INFO_ITEM_ST *item)
newtable->len = tablelen - sizeof(TLV_HEADER_ST);
g_table = newtable;
os_free(oldtable);
newlen = compress_table();
newlen = config_compress_table();
if (newlen){
tablelen = newlen;
}
changes++;
}
}
if (taken == pdTRUE){
xSemaphoreGive( config_mutex );
}
if (changes){
// save config in 3 seconds....
if (!g_savecfg){
g_savecfg = 3;
}
}
save_table();
return 1;
}
int dump_table()
int config_dump_table()
{
UINT32 addr, end_addr;
INFO_ITEM_ST *head;
UINT32 usedlen = 0;
UINT32 tablelen = get_tbl(1);
UINT32 tablelen = config_get_tbl(1);
if (!tablelen){
ADDLOG_ERROR(LOG_FEATURE_CFG, "dump_table - no table");
return 0;
@@ -408,6 +518,7 @@ int dump_table()
while(addr < end_addr) {
ADDLOG_DEBUG(LOG_FEATURE_CFG, "item type 0x%08X len %d at 0x%04X",
head->type, head->len, addr);
config_dump(head, head->len);
addr += sizeof(INFO_ITEM_ST);
addr += head->len;
@@ -424,3 +535,14 @@ int dump_table()
return 1;
}
int config_commit(){
if (changes){
config_save_table();
return 1;
}
// free config memory;
config_release_tbl();
return 0;
}

View File

@@ -1,25 +1,52 @@
#include "net_param_pub.h"
/////////////////////////////////////////////////////
// mutex protected functions:
int get_tbl(int readit);
int release_tbl();
INFO_ITEM_ST *search_item(INFO_ITEM_ST *item);
INFO_ITEM_ST *search_item_type(UINT32 type);
int compress_table();
int save_item(INFO_ITEM_ST *item);
int delete_item(UINT32 type);
int dump_table();
// copy a config item of type to 'container'
// 'container' should have been initialised with CONFIG_INIT_ITEM
// then it will have the right type and len..
int config_get_item(void *container);
// save an item to config.
// item should start with INFO_ITEM_ST, and be initialised with CONFIG_INIT_ITEM
// will trigger config save 3s later
int config_save_item(void *item);
// delete ALL items of type
int config_delete_item(UINT32 type);
// save pending changes NOW and release the config memory
int config_commit();
/////////////////////////////////////////////////////
// other functions, not protected.
// internal
int config_get_tbl(int readit);
// release memory (saves if changes)
int config_release_tbl();
// return a ptr to the item, unprotected
INFO_ITEM_ST *config_search_item(INFO_ITEM_ST *item);
// return a ptr to the item, unprotected
INFO_ITEM_ST *config_search_item_type(UINT32 type);
// list table contetn by type & len to debug
int config_dump_table();
// config structures - only the tags really need to be here....
/////////////////////////////////////////
// config types not defined by beken
//
// strucutre is ITEM_URL_CONFIG
#define CONFIG_TAG_WEBAPP_ROOT ((UINT32) *((UINT32*)"TEST"))
#define CONFIG_TYPE_WEBAPP_ROOT ((UINT32) *((UINT32*)"TEST"))
//
#define CONFIG_INIT_ITEM(t, ptr) { (ptr)->head.len = sizeof(*(ptr)) - sizeof((ptr)->head); (ptr)->head.type = t; }
/////////////////////////////////////////
// config structures not defined by beken
#define CONFIG_URL_SIZE_MAX 64
typedef struct item_url_config
@@ -29,3 +56,26 @@ typedef struct item_url_config
}ITEM_URL_CONFIG,*ITEM_URL_CONFIG_PTR;
// added for OpenBK7231T
typedef struct item_new_wifi_config2
{
INFO_ITEM_ST head;
char scrap[8];
char ssid[32];
char pass[64];
}ITEM_NEW_WIFI_CONFIG2,*ITEM_NEW_WIFI_CONFIG2_PTR;
typedef struct item_new_mqtt_config2
{
INFO_ITEM_ST head;
char scrap[8];
char brokerName[64];
char userName[64];
int port;
char hostName[64];
// Home Assistant default password is 64 chars..
char pass[128];
}ITEM_NEW_MQTT_CONFIG2,*ITEM_NEW_MQTT_CONFIG2_PTR;

View File

@@ -611,6 +611,35 @@ int HTTP_ProcessPacket(http_request_t *request) {
poststr(request,"<br>");
poststr(request,"<a href=\"cfg_mqtt\">Return to MQTT settings</a>");
poststr(request,"<br>");
poststr(request,htmlReturnToCfg);
HTTP_AddBuildFooter(request);
poststr(request,htmlEnd);
} else if(http_checkUrlBase(urlStr,"cfg_webapp")) {
http_setup(request, httpMimeTypeHTML);
poststr(request,htmlHeader);
poststr(request,g_header);
poststr(request,"<h2> Use this to set the URL of the Webapp</h2>");
poststr(request,"<form action=\"/cfg_webapp_set\">\
<label for=\"url\">Url:</label><br>\
<input type=\"text\" id=\"url\" name=\"url\" value=\"");
poststr(request,CFG_GetWebappRoot());
poststr(request,"\"><br>\
<input type=\"submit\" value=\"Submit\">\
</form> ");
poststr(request,htmlReturnToCfg);
HTTP_AddBuildFooter(request);
poststr(request,htmlEnd);
} else if(http_checkUrlBase(urlStr,"cfg_webapp_set")) {
http_setup(request, httpMimeTypeHTML);
poststr(request,htmlHeader);
poststr(request,g_header);
if(http_getArg(urlStr,"url",tmpA,sizeof(tmpA))) {
CFG_SetWebappRoot(tmpA);
}
poststr(request,"Webapp url set!");
poststr(request,"<br>");
poststr(request,htmlReturnToCfg);
HTTP_AddBuildFooter(request);
@@ -903,6 +932,7 @@ int HTTP_ProcessPacket(http_request_t *request) {
poststr(request,"<form action=\"cfg_quick\"><input type=\"submit\" value=\"Quick Config\"/></form>");
poststr(request,"<form action=\"cfg_wifi\"><input type=\"submit\" value=\"Configure WiFi\"/></form>");
poststr(request,"<form action=\"cfg_mqtt\"><input type=\"submit\" value=\"Configure MQTT\"/></form>");
poststr(request,"<form action=\"cfg_webapp\"><input type=\"submit\" value=\"Configure Webapp\"/></form>");
poststr(request,"<form action=\"cfg_ha\"><input type=\"submit\" value=\"Generate Home Assistant cfg\"/></form>");
poststr(request,"<form action=\"ota\"><input type=\"submit\" value=\"OTA (update software by WiFi)\"/></form>");
poststr(request,"<form action=\"cmd_single\"><input type=\"submit\" value=\"Execute custom command\"/></form>");

View File

@@ -13,6 +13,7 @@
#endif
#include "lwip/sockets.h"
#include "../flash_config/flash_config.h"
#include "../new_cfg.h"
extern int g_reset;
@@ -73,9 +74,8 @@ const char * apppage4 = "startup.js\"></script>"
static int http_rest_app(http_request_t *request){
//char *webhost = "http://raspberrypi:1880";//CFG_GetWebRoot();
char *webhost = CFG_GetWebappRoot();
char *ourip = getMyIp(); //CFG_GetOurIP();
const char *webhost = CFG_GetWebappRoot();
const char *ourip = getMyIp(); //CFG_GetOurIP();
http_setup(request, httpMimeTypeHTML);
if (webhost && ourip){
poststr(request, apppage1);
@@ -94,7 +94,6 @@ static int http_rest_app(http_request_t *request){
return 0;
}
#ifdef BK_LITTLEFS
int EndsWith(const char *str, const char *suffix)
@@ -709,7 +708,7 @@ static int http_rest_get_flash(http_request_t *request, int startaddr, int len){
static int http_rest_get_dumpconfig(http_request_t *request){
dump_table();
config_dump_table();
http_setup(request, httpMimeTypeText);
poststr(request, NULL);
@@ -736,29 +735,28 @@ static int http_rest_get_testconfig(http_request_t *request){
testconfig.head.len = sizeof(testconfig) - sizeof(testconfig.head);
strcpy(testconfig.somename, "test it here");
dump_table();
config_dump_table();
ret = search_item((INFO_ITEM_ST *)&testconfig);
ret = config_search_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "search found %x", ret);
dump_table();
config_dump_table();
intres = delete_item(testconfig.head.type);
intres = config_delete_item(testconfig.head.type);
ADDLOG_DEBUG(LOG_FEATURE_API, "delete_item returned %d", intres);
intres = save_item((INFO_ITEM_ST *)&testconfig);
intres = config_save_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "save_item returned %d", intres);
ret = search_item((INFO_ITEM_ST *)&testconfig);
ret = config_search_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "search2 found %x len %d", ret, (ret?ret->len:0));
intres = save_item((INFO_ITEM_ST *)&testconfig);
intres = config_save_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "save_item returned %d", intres);
ret = search_item((INFO_ITEM_ST *)&testconfig);
ret = config_search_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "search3 found %x len %d", ret, (ret?ret->len:0));
rtos_delay_milliseconds(1000);
if (ret){
@@ -769,28 +767,24 @@ static int http_rest_get_testconfig(http_request_t *request){
}
}
rtos_delay_milliseconds(1000);
testconfig.head.len = sizeof(testconfig) - sizeof(testconfig.head) - 1;
intres = save_item((INFO_ITEM_ST *)&testconfig);
intres = config_save_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "save_item returned %d", intres);
rtos_delay_milliseconds(1000);
ret = search_item((INFO_ITEM_ST *)&testconfig);
ret = config_search_item((INFO_ITEM_ST *)&testconfig);
ADDLOG_DEBUG(LOG_FEATURE_API, "search4 found %x len %d", ret, (ret?ret->len:0));
dump_table();
rtos_delay_milliseconds(1000);
config_dump_table();
intres = delete_item(testconfig.head.type);
intres = config_delete_item(testconfig.head.type);
ADDLOG_DEBUG(LOG_FEATURE_API, "delete_item returned %d", intres);
dump_table();
rtos_delay_milliseconds(1000);
config_dump_table();
release_tbl();
config_release_tbl();
dump_table();
config_dump_table();
http_setup(request, httpMimeTypeText);
poststr(request, NULL);

View File

@@ -26,27 +26,32 @@ static char g_mqtt_pass[128] = "qqqqqqqqqq";
static char g_wifi_ssid[64] = { 0 };
static char g_wifi_pass[64] = { 0 };
static char g_webappRoot[CONFIG_URL_SIZE_MAX] = { 0 };
static char g_webappRoot[CONFIG_URL_SIZE_MAX] = "https://openbekeniot.github.io/webapp/";
// Long unique device name, like OpenBK7231T_AABBCCDD
char g_deviceName[64] = "testDev";
// Short unique device name, like obkAABBCCDD
char g_shortDeviceName[64] = "td01";
const char *CFG_LoadWebappRoot(){
ITEM_URL_CONFIG item;
int res;
CONFIG_INIT_ITEM(CONFIG_TYPE_WEBAPP_ROOT, &item);
res = config_get_item(&item);
if (res) strcpy_safe(g_webappRoot, item.url,sizeof(g_webappRoot));
return g_webappRoot;
}
const char *CFG_GetWebappRoot(){
ITEM_URL_CONFIG *pItem = (ITEM_URL_CONFIG*)search_item_type(CONFIG_TAG_WEBAPP_ROOT);
if (pItem){
strncpy(g_webappRoot, pItem->url, sizeof(g_webappRoot));
}
return g_webappRoot;
}
void CFG_SetWebappRoot(const char *s) {
ITEM_URL_CONFIG item;
item.head.type = CONFIG_TAG_WEBAPP_ROOT;
item.head.len = sizeof(item) - sizeof(item.head);
CONFIG_INIT_ITEM(CONFIG_TYPE_WEBAPP_ROOT, &item);
strcpy_safe(item.url,s,sizeof(item.url));
save_item((INFO_ITEM_ST *)&item);
strcpy_safe(g_webappRoot, item.url,sizeof(g_webappRoot));
config_save_item(&item);
}
const char *CFG_GetDeviceName(){
@@ -125,10 +130,12 @@ void CFG_SaveWiFi() {
#elif PLATFORM_XR809
#else
ITEM_NEW_WIFI_CONFIG container;
ITEM_NEW_WIFI_CONFIG2 container;
os_memset(&container, 0, sizeof(container));
CONFIG_INIT_ITEM(NEW_WIFI_CONFIG, &container);
strcpy_safe(container.ssid, g_wifi_ssid, sizeof(container.ssid));
strcpy_safe(container.pass, g_wifi_pass, sizeof(container.pass));
save_info_item(NEW_WIFI_CONFIG,(UINT8 *)&container, 0, 0);
config_save_item(&container);
#endif
}
void CFG_LoadWiFi() {
@@ -137,8 +144,9 @@ void CFG_LoadWiFi() {
#elif PLATFORM_XR809
#else
ITEM_NEW_WIFI_CONFIG container;
if(get_info_item(NEW_WIFI_CONFIG,(UINT8 *)&container, 0, 0) != 0) {
ITEM_NEW_WIFI_CONFIG2 container;
CONFIG_INIT_ITEM(NEW_WIFI_CONFIG, &container);
if (config_get_item(&container) != 0){
strcpy_safe(g_wifi_ssid,container.ssid,sizeof(g_wifi_ssid));
strcpy_safe(g_wifi_pass,container.pass,sizeof(g_wifi_pass));
}
@@ -151,13 +159,15 @@ void CFG_SaveMQTT() {
#elif PLATFORM_XR809
#else
ITEM_NEW_MQTT_CONFIG container;
ITEM_NEW_MQTT_CONFIG2 container;
os_memset(&container, 0, sizeof(container));
CONFIG_INIT_ITEM(NEW_MQTT_CONFIG, &container);
strcpy_safe(container.userName, g_mqtt_userName, sizeof(container.userName));
strcpy_safe(container.pass, g_mqtt_pass, sizeof(container.pass));
strcpy_safe(container.hostName, g_mqtt_host, sizeof(container.hostName));
strcpy_safe(container.brokerName, g_mqtt_brokerName, sizeof(container.brokerName));
container.port = g_mqtt_port;
save_info_item(NEW_MQTT_CONFIG,(UINT8 *)&container, 0, 0);
config_save_item(&container);
#endif
}
@@ -167,8 +177,9 @@ void CFG_LoadMQTT() {
#elif PLATFORM_XR809
#else
ITEM_NEW_MQTT_CONFIG container;
if(get_info_item(NEW_MQTT_CONFIG,(UINT8 *)&container, 0, 0) != 0) {
ITEM_NEW_MQTT_CONFIG2 container;
CONFIG_INIT_ITEM(NEW_MQTT_CONFIG, &container);
if (config_get_item(&container) != 0){
strcpy_safe(g_mqtt_userName,container.userName,sizeof(g_mqtt_userName));
strcpy_safe(g_mqtt_pass,container.pass,sizeof(g_mqtt_pass));
strcpy_safe(g_mqtt_host,container.hostName,sizeof(g_mqtt_host));

View File

@@ -22,3 +22,6 @@ void CFG_SaveWiFi();
void CFG_LoadWiFi();
void CFG_SaveMQTT();
void CFG_LoadMQTT();
const char *CFG_GetWebappRoot();
const char *CFG_LoadWebappRoot();

View File

@@ -5,11 +5,12 @@
#include "new_pins.h"
#include "httpserver/new_http.h"
#include "logging/logging.h"
#include "flash_config/flash_config.h"
#if WINDOWS
#elif PLATFORM_XR809
#include "driver/chip/hal_gpio.h"
#else
@@ -25,6 +26,14 @@
#endif
typedef struct item_pins_config
{
INFO_ITEM_ST head;
pinsState_t pins;
}ITEM_PINS_CONFIG,*ITEM_PINS_CONFIG_PTR;
/*
// from BkDriverPwm.h"
OSStatus bk_pwm_start(bk_pwm_t pwm);
@@ -81,16 +90,21 @@ void (*g_doubleClickCallback)(int pinIndex) = 0;
void PIN_SaveToFlash() {
ITEM_PINS_CONFIG pins;
#if WINDOWS
#elif PLATFORM_XR809
#else
save_info_item(NEW_PINS_CONFIG,(UINT8 *)&g_pins, 0, 0);
os_memcpy(&pins.pins, &g_pins, sizeof(pins.pins));
CONFIG_INIT_ITEM(NEW_PINS_CONFIG, &pins);
config_save_item(&pins);
#endif
}
void PIN_LoadFromFlash() {
int i;
int res;
ITEM_PINS_CONFIG pins;
PR_NOTICE("PIN_LoadFromFlash called - going to load pins.\r\n");
@@ -101,7 +115,11 @@ void PIN_LoadFromFlash() {
#elif PLATFORM_XR809
#else
get_info_item(NEW_PINS_CONFIG,(UINT8 *)&g_pins, 0, 0);
CONFIG_INIT_ITEM(NEW_PINS_CONFIG, &pins);
res = config_get_item(&g_pins);
if (res){
os_memcpy(&g_pins, &pins.pins, sizeof(g_pins));
}
#endif
for(i = 0; i < GPIO_MAX; i++) {
PIN_SetPinRoleForPinIndex(i,g_pins.roles[i]);
@@ -120,13 +138,13 @@ int PIN_GetPinChannelForPinIndex(int index) {
void RAW_SetPinValue(int index, int iVal){
#if WINDOWS
#elif PLATFORM_XR809
GPIO_InitParam param;
int xr_port; // eg GPIO_PORT_A
int xr_pin; // eg. GPIO_PIN_20
PIN_XR809_GetPortPinForIndex(index, &xr_port, &xr_pin);
#elif PLATFORM_XR809
GPIO_InitParam param;
int xr_port; // eg GPIO_PORT_A
int xr_pin; // eg. GPIO_PIN_20
PIN_XR809_GetPortPinForIndex(index, &xr_port, &xr_pin);
HAL_GPIO_WritePin(xr_port, xr_pin, iVal);
#else
bk_gpio_output(index, iVal);
@@ -304,17 +322,17 @@ void PIN_SetPinRoleForPinIndex(int index, int role) {
{
#if WINDOWS
#elif PLATFORM_XR809
GPIO_InitParam param;
int xr_port; // eg GPIO_PORT_A
int xr_pin; // eg. GPIO_PIN_20
PIN_XR809_GetPortPinForIndex(index, &xr_port, &xr_pin);
/*set pin driver capability*/
param.driving = GPIO_DRIVING_LEVEL_1;
param.mode = GPIOx_Pn_F1_OUTPUT;
param.pull = GPIO_PULL_NONE;
#elif PLATFORM_XR809
GPIO_InitParam param;
int xr_port; // eg GPIO_PORT_A
int xr_pin; // eg. GPIO_PIN_20
PIN_XR809_GetPortPinForIndex(index, &xr_port, &xr_pin);
/*set pin driver capability*/
param.driving = GPIO_DRIVING_LEVEL_1;
param.mode = GPIOx_Pn_F1_OUTPUT;
param.pull = GPIO_PULL_NONE;
HAL_GPIO_Init(xr_port, xr_pin, &param);
#else
bk_gpio_config_output(index);

View File

@@ -26,6 +26,7 @@ typedef struct pinsState_s {
byte channels[32];
} pinsState_t;
extern pinsState_t g_pins;

View File

@@ -49,6 +49,7 @@
#include "lwip/netdb.h"
#include "littlefs/our_lfs.h"
#include "flash_config/flash_config.h"
#undef Malloc
#undef Free
@@ -62,6 +63,11 @@ static int g_openAP = 0;
// reset in this number of seconds
int g_reset = 0;
// save config in this number of seconds
int g_savecfg = 0;
// from wlan_ui.c
void bk_reboot(void);
@@ -187,6 +193,14 @@ static void app_led_timer_handler(void *data)
bk_reboot();
}
}
if (g_savecfg){
g_savecfg--;
if (!g_savecfg){
config_commit();
}
}
}
void app_on_generic_dbl_click(int btnIndex)
@@ -324,6 +338,7 @@ void user_main(void)
CFG_CreateDeviceNameUnique();
CFG_LoadWebappRoot();
CFG_LoadWiFi();
CFG_LoadMQTT();
PIN_LoadFromFlash();