From ca69e76c5195aa7fd0093a2d860cc51b82bc09ba Mon Sep 17 00:00:00 2001 From: pvvx Date: Tue, 9 May 2017 18:55:08 +0300 Subject: [PATCH] update --- project/inc/tcpsrv/tcp_srv_conn.h | 2 +- project/inc/web/web_srv.h | 11 +++--- project/src/web/web_int_callbacks.c | 36 +++++++++-------- project/src/web/web_int_vars.c | 15 +++----- project/src/web/web_srv.c | 60 +++++++++++++++-------------- project/src/web/web_websocket.c | 9 +++-- 6 files changed, 70 insertions(+), 63 deletions(-) diff --git a/project/inc/tcpsrv/tcp_srv_conn.h b/project/inc/tcpsrv/tcp_srv_conn.h index c2d376e..c79e0e4 100644 --- a/project/inc/tcpsrv/tcp_srv_conn.h +++ b/project/inc/tcpsrv/tcp_srv_conn.h @@ -7,7 +7,7 @@ ***********************************/ #define __TCP_SERV_CONN_H__ -//#include "user_interface.h" +#include "user_config.h" //#include "os_type.h" #include "lwip/err.h" diff --git a/project/inc/web/web_srv.h b/project/inc/web/web_srv.h index f58c81e..80b632b 100644 --- a/project/inc/web/web_srv.h +++ b/project/inc/web/web_srv.h @@ -76,12 +76,13 @@ typedef struct typedef void (* web_func_cb)(TCP_SERV_CONN *ts_conn); -typedef uint32 (* web_func_disc_cb)(uint32 flg); // отложенная функция, когда соединение закрыто +typedef uint32 (* web_ex_func_cb)(uint32 flg); // внешняя или отложенная функция typedef struct { - web_func_disc_cb fnk; - void * param; + web_ex_func_cb fnc; + void * param; + uint16 pause_ms; } WEB_SRV_QFNK; typedef struct @@ -95,8 +96,6 @@ typedef struct uint16 msgbufsize; // размер буфера web_func_cb func_web_cb; // calback функция у httpd для обработки приема/передачи кусками uint32 content_len; // размер файла для передачи (GET/POST) или приема, если принимается внешний файл (POST + SCB_RXDATA) - web_func_disc_cb web_disc_cb; // функция вызываемая по закрытию соединения - uint32 web_disc_par; // параметры функции вызываемой по закрытию соединения #ifdef WEBSOCKET_ENA WS_FRSTAT ws; // параметры websoc #endif @@ -206,4 +205,6 @@ err_t webserver_init(uint16 portn); err_t webserver_close(uint16 portn); err_t webserver_reinit(uint16 portn); +BaseType_t webserver_qfn(web_ex_func_cb fnc, void * param, uint16 pause_ms); // вызов функции из task с low priority + #endif /* _INCLUDE_WEB_SRV_H_ */ diff --git a/project/src/web/web_int_callbacks.c b/project/src/web/web_int_callbacks.c index afb7eed..e91f55f 100644 --- a/project/src/web/web_int_callbacks.c +++ b/project/src/web/web_int_callbacks.c @@ -115,7 +115,7 @@ void ICACHE_FLASH_ATTR web_test_adc(TCP_SERV_CONN *ts_conn) read_adcs((uint16 *)(web_conn->msgbuf + web_conn->msgbuflen), len, 0x0808); web_conn->msgbuflen += len << 1; } - SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close + if(!CheckSCB(SCB_WEBSOC)) SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close } #endif // TEST_SEND_WAVE @@ -245,14 +245,14 @@ void ICACHE_FLASH_ATTR web_hexdump(TCP_SERV_CONN *ts_conn) tcp_puts("\r\n"); if((uint32)addr >= web_conn->udata_stop) { ClrSCB(SCB_RETRYCB); - SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close + if(!CheckSCB(SCB_WEBSOC)) SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close return; } } else { tcp_puts("%p = Bad address!\r\n", addr); ClrSCB(SCB_RETRYCB); - SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close + if(!CheckSCB(SCB_WEBSOC)) SetSCB(SCB_FCLOSE | SCB_DISCONNECT); // connection close return; }; } @@ -366,14 +366,16 @@ void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr) cstr+=4; ifcmp("scan") web_wscan_xml(ts_conn); #if WEB_DEBUG_FUNCTIONS -#if USE_WEB_AUTH_LEVEL - if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) return; -#endif else { - web_conn->udata_start&=~3; - ifcmp("ram") tcp_puts("0x%08x", *((uint32*)web_conn->udata_start)); - else tcp_put('?'); - web_conn->udata_start += 4; +#if USE_WEB_AUTH_LEVEL + if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) return; +#endif + else { + web_conn->udata_start&=~3; + ifcmp("ram") tcp_puts("0x%08x", *((uint32*)web_conn->udata_start)); + else tcp_put('?'); + web_conn->udata_start += 4; + } } #endif } @@ -403,11 +405,18 @@ void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr) else ifcmp("clkcpu") tcp_puts("%u", HalGetCpuClk()); else ifcmp("debug") tcp_put('1' - (print_off & 1)); // rtl_print on/off #if WEB_DEBUG_FUNCTIONS +#if 1 // WEB_INA219_DRV + else ifcmp("ina219") { + if(CheckSCB(SCB_WEBSOC)) { + ina219_ws(val); + } + } +#endif else ifcmp("restart") { #if USE_WEB_AUTH_LEVEL if(web_conn->auth_level < WEB_AUTH_LEVEL_USER) return; #endif - web_conn->web_disc_cb = (web_func_disc_cb)sys_reset; + webserver_qfn((web_ex_func_cb)sys_reset, NULL, 200); } else ifcmp("ram") tcp_puts("0x%08x", *((uint32 *)(ahextoul(cstr+3)&(~3)))); else ifcmp("rdec") tcp_puts("%d", *((uint32 *)(ahextoul(cstr+4)&(~3)))); @@ -451,10 +460,7 @@ void ICACHE_FLASH_ATTR web_int_callback(TCP_SERV_CONN *ts_conn, uint8 *cstr) else ifcmp("wifi_") { cstr+=5; ifcmp("rdcfg") read_wifi_cfg(-1); - else ifcmp("newcfg") { - web_conn->web_disc_cb = (web_func_disc_cb)wifi_run; - web_conn->web_disc_par = wifi_cfg.mode; - } + else ifcmp("newcfg") webserver_qfn((web_ex_func_cb)wifi_run, (void *)wifi_cfg.mode, 200); else ifcmp("cmode") tcp_puts("%d", wifi_mode); else ifcmp("mode") tcp_puts("%d", wifi_cfg.mode); else ifcmp("bgn") tcp_puts("%d", wifi_cfg.bgn); diff --git a/project/src/web/web_int_vars.c b/project/src/web/web_int_vars.c index 9d5c8bc..9d51342 100644 --- a/project/src/web/web_int_vars.c +++ b/project/src/web/web_int_vars.c @@ -96,7 +96,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 * else ifcmp("sys_") { cstr+=4; ifcmp("restart") { - if(val == 12345) web_conn->web_disc_cb = (web_func_disc_cb)sys_reset; + if(val == 12345) webserver_qfn((web_ex_func_cb)sys_reset, NULL, 200); } else ifcmp("ram") { uint32 *ptr = (uint32 *)(ahextoul(cstr+3)&(~3)); str_array(pvar, ptr, 32); } else ifcmp("debug") print_off = (!val) & 1; // rtl_print on/off @@ -119,9 +119,8 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 * cstr += 4; ifcmp("port") { if(syscfg.web_port != val) { - web_conn->web_disc_par = syscfg.web_port; // ts_conn->pcfg->port + webserver_qfn((web_ex_func_cb)webserver_reinit, (void *)syscfg.web_port, 200); syscfg.web_port = val; - web_conn->web_disc_cb = (web_func_disc_cb)webserver_reinit; } } else ifcmp("twd") { @@ -190,10 +189,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 * cstr+=5; ifcmp("scan") api_wifi_scan(NULL); else ifcmp("rdcfg") web_conn->udata_stop = read_wifi_cfg(val); - else ifcmp("newcfg") { - web_conn->web_disc_cb = (web_func_disc_cb)wifi_run; - web_conn->web_disc_par = wifi_cfg.mode; - } + else ifcmp("newcfg") webserver_qfn((web_ex_func_cb)wifi_run, (void *)wifi_cfg.mode, 200); else ifcmp("mode") wifi_cfg.mode = val; else ifcmp("bgn") wifi_cfg.bgn = val; else ifcmp("lflg") wifi_cfg.load_flg = val; @@ -247,7 +243,7 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 * netbios_set_name(WLAN_AP_NETIF_NUM, lwip_host_name[1]); if(wifi_cfg.save_flg & BID_AP_HOSTNAME) { WEB_SRV_QFNK x; - x.fnk = write_wifi_cfg; + x.fnc = write_wifi_cfg; x.param = BID_AP_HOSTNAME; xQueueSendToBack(xQueueWebSrv, &x, 0); } @@ -304,8 +300,9 @@ void ICACHE_FLASH_ATTR web_int_vars(TCP_SERV_CONN *ts_conn, uint8 *pcmd, uint8 * } if(wifi_cfg.save_flg & BID_ST_HOSTNAME) { WEB_SRV_QFNK x; - x.fnk = write_wifi_cfg; + x.fnc = write_wifi_cfg; x.param = BID_ST_HOSTNAME; + x.pause_ms = 0; xQueueSendToBack(xQueueWebSrv, &x, 0); } } diff --git a/project/src/web/web_srv.c b/project/src/web/web_srv.c index 7dab6f5..8a04c43 100644 --- a/project/src/web/web_srv.c +++ b/project/src/web/web_srv.c @@ -1982,34 +1982,47 @@ LOCAL void ICACHE_FLASH_ATTR webserver_disconnect(TCP_SERV_CONN *ts_conn) if(CheckSCB(SCB_SYSSAVE)) { ClrSCB(SCB_SYSSAVE); sys_write_cfg(); - } - if(web_conn->web_disc_cb != NULL) { - if(xQueueSendToBack(xQueueWebSrv, &web_conn->web_disc_cb, 0) != pdPASS) { -#if DEBUGSOO > 1 - os_printf("\nWEB: Queue QFn full!\n"); -#endif - } -// web_conn->web_disc_cb(web_conn->web_disc_par); }; } /****************************************************************************** ******************************************************************************/ +BaseType_t webserver_qfn(web_ex_func_cb fnc, void * param, uint16 pause_ms) { + WEB_SRV_QFNK qfn; + qfn.fnc = fnc; + qfn.param = param; + qfn.pause_ms = pause_ms; + return xQueueSendToBack(xQueueWebSrv, &qfn, 0); +} +/****************************************************************************** + * todo: временная затычка, необходимо переделать... +******************************************************************************/ void qfnk_task(void) { WEB_SRV_QFNK qfn; + WEB_SRV_QFNK qfnt; + TickType_t timetick; while(1) { - if(xQueueReceive(xQueueWebSrv, &qfn, portMAX_DELAY ) == pdPASS) { - if(qfn.fnk) { + if(xQueueReceive(xQueueWebSrv, &qfn, 5) == pdPASS) { // portMAX_DELAY + if(qfn.fnc) { #if DEBUGSOO > 2 - os_printf("qfn: %p(%p)\n", qfn.fnk, qfn.param); + os_printf("qfn: %p(%p),%d\n", qfn.fnc, qfn.param, qfn.pause_ms); #endif - vTaskDelay(200); // Timeout + WDT - qfn.fnk(qfn.param); + if(qfn.pause_ms) { + timetick = xTaskGetTickCount(); + qfnt = qfn; + } + else qfn.fnc(qfn.param); + } + } + else if(qfnt.fnc) { + if(xTaskGetTickCount() - timetick > qfnt.pause_ms) { +#if DEBUGSOO > 3 + os_printf("qfnt: %p(%p),%d\n", qfnt.fnc, qfnt.param, qfnt.pause_ms); +#endif + qfnt.fnc(qfnt.param); + qfnt.fnc = NULL; } -// else { -// vTaskDelete(NULL); -// } } } } @@ -2019,15 +2032,12 @@ void qfnk_task(void) * Parameters : arg -- port N * Returns : none *******************************************************************************/ -//TaskHandle_t xHandleQfn; err_t ICACHE_FLASH_ATTR webserver_init(uint16 portn) { // WEBFSInit(); // файловая система - err_t err = ERR_MEM; xQueueWebSrv = xQueueCreate(5, sizeof( WEB_SRV_QFNK )); // Create a queue... if(xQueueWebSrv) { -// if(xTaskCreate(qfnk_task, "web_qfn", 1024, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, &xHandleQfn) == pdPASS) if(xTaskCreate(qfnk_task, "web_qfn", 1024, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, NULL) == pdPASS) { TCP_SERV_CFG *p = tcpsrv_init(portn); @@ -2065,7 +2075,6 @@ err_t ICACHE_FLASH_ATTR webserver_init(uint16 portn) // else err = ERR_MEM; return err; } - /****************************************************************************** * FunctionName : webserver_close * Description : закрытие сервера @@ -2081,21 +2090,14 @@ err_t ICACHE_FLASH_ATTR webserver_close(uint16 portn) #endif if(xQueueWebSrv) { WEB_SRV_QFNK qfn; - qfn.fnk = vTaskDelete; - qfn.fnk = NULL; + qfn.fnc = vTaskDelete; qfn.param = NULL; + qfn.pause_ms = 0; if(xQueueSendToBack(xQueueWebSrv, &qfn, 1000) == pdPASS) { while(uxQueueMessagesWaiting(xQueueWebSrv)) { vTaskDelay(10); }; } -/* - else if(xHandleQfn) { - vTaskDelete(xHandleQfn); - } - vQueueDelete(xQueueWebSrv); - xHandleQfn = NULL; -*/ xQueueWebSrv = NULL; }; return err; diff --git a/project/src/web/web_websocket.c b/project/src/web/web_websocket.c index 8af34e3..78296bb 100644 --- a/project/src/web/web_websocket.c +++ b/project/src/web/web_websocket.c @@ -162,6 +162,7 @@ websock_rx_data(TCP_SERV_CONN *ts_conn) } } else { + if(web_conn->msgbuf) os_free(web_conn->msgbuf); web_conn->msgbuf = (uint8 *) os_malloc(web_conn->msgbufsize); if (web_conn->msgbuf == NULL) { #if DEBUGSOO > 0 @@ -176,7 +177,7 @@ websock_rx_data(TCP_SERV_CONN *ts_conn) if(CheckSCB(SCB_RETRYCB)) { // повторный callback? да if(web_conn->func_web_cb != NULL) web_conn->func_web_cb(ts_conn); if(!CheckSCB(SCB_RETRYCB)) { - ClrSCB(SCB_FCLOSE | SCB_DISCONNECT); +// ClrSCB(SCB_FCLOSE | SCB_DISCONNECT); opcode = WS_OPCODE_CONTINUE | WS_FRAGMENT_FIN; } else opcode = WS_OPCODE_CONTINUE; @@ -194,18 +195,18 @@ websock_rx_data(TCP_SERV_CONN *ts_conn) } if(CheckSCB(SCB_RETRYCB)) opcode = WS_OPCODE_TEXT; else { - ClrSCB(SCB_FCLOSE | SCB_DISCONNECT); +// ClrSCB(SCB_FCLOSE | SCB_DISCONNECT); opcode = WS_OPCODE_TEXT | WS_FRAGMENT_FIN; } } if(web_conn->msgbuflen != 0) { if(websock_tx_frame(ts_conn, opcode, web_conn->msgbuf, web_conn->msgbuflen) != ERR_OK) { - os_free(web_conn->msgbuf); + if(web_conn->msgbuf) os_free(web_conn->msgbuf); web_conn->msgbuf = NULL; return false; // не докачивать, ошибка или закрытие } } - os_free(web_conn->msgbuf); + if(web_conn->msgbuf) os_free(web_conn->msgbuf); web_conn->msgbuf = NULL; if(CheckSCB(SCB_RETRYCB)) return false; }