From 0af62f47e62d3f52c8c0fcdb4a98d797054fa023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Wed, 6 Sep 2017 16:13:14 +0200 Subject: [PATCH] configurable button codes --- html_orig/css/app.css | 4 +- html_orig/js/app.js | 7 +- html_orig/jssrc/term.js | 7 +- html_orig/lang/en.php | 1 + html_orig/pages/cfg_term.php | 9 + html_orig/pages/help/cmd_system.php | 25 +- html_orig/pages/term.php | 6 +- html_orig/sass/pages/_about.scss | 4 +- user/ansi_parser.c | 61 +- user/ansi_parser.rl | 21 +- user/ansi_parser_callbacks.c | 2 - user/apars_osc.c | 3 + user/cgi_sockets.c | 25 +- user/cgi_term_cfg.c | 87 ++- user/uart_asyncdrv.c- | 830 ---------------------------- user/uart_asyncdrv.h- | 178 ------ user/user_main.c | 8 +- 17 files changed, 186 insertions(+), 1092 deletions(-) delete mode 100644 user/uart_asyncdrv.c- delete mode 100644 user/uart_asyncdrv.h- diff --git a/html_orig/css/app.css b/html_orig/css/app.css index 01a240a..030e188 100644 --- a/html_orig/css/app.css +++ b/html_orig/css/app.css @@ -1679,7 +1679,7 @@ body.term #content { .ansiref.w100 { width: 100%; } .ansiref.w100 td:nth-child(1) { - width: 6em; } + width: 8em; } .nomen { width: 100%; } @@ -1695,7 +1695,7 @@ body.term #content { line-height: 1; } .charset div { display: inline-block; - width: 2.5em; + width: 2.7em; border: 1px solid #666; height: 3em; margin: 1px; diff --git a/html_orig/js/app.js b/html_orig/js/app.js index 2673280..cd335b2 100644 --- a/html_orig/js/app.js +++ b/html_orig/js/app.js @@ -1737,7 +1737,9 @@ var Screen = (function () { Input.onMouseUp(x, y, evt.button+1); }); cOuter.addEventListener('contextmenu', function (evt) { - evt.preventDefault(); + if (Input.mouseTracksClicks()) { + evt.preventDefault(); + } }); cOuter.addEventListener('mousewheel', function (evt) { Input.onMouseWheel(x, y, evt.deltaY>0?1:-1); @@ -2320,6 +2322,9 @@ var Input = (function() { Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); // console.log("B ",b," M ",m); }, + mouseTracksClicks: function() { + return opts.mt_click; + }, }; })(); diff --git a/html_orig/jssrc/term.js b/html_orig/jssrc/term.js index 816b4ff..22dbd72 100644 --- a/html_orig/jssrc/term.js +++ b/html_orig/jssrc/term.js @@ -137,7 +137,9 @@ var Screen = (function () { Input.onMouseUp(x, y, evt.button+1); }); cOuter.addEventListener('contextmenu', function (evt) { - evt.preventDefault(); + if (Input.mouseTracksClicks()) { + evt.preventDefault(); + } }); cOuter.addEventListener('mousewheel', function (evt) { Input.onMouseWheel(x, y, evt.deltaY>0?1:-1); @@ -720,6 +722,9 @@ var Input = (function() { Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); // console.log("B ",b," M ",m); }, + mouseTracksClicks: function() { + return opts.mt_click; + }, }; })(); diff --git a/html_orig/lang/en.php b/html_orig/lang/en.php index 44353d6..461e975 100644 --- a/html_orig/lang/en.php +++ b/html_orig/lang/en.php @@ -52,6 +52,7 @@ return [ 'term.show_config_links' => 'Show nav links', 'term.show_buttons' => 'Show buttons', 'term.loopback' => 'Local Echo', + 'term.button_msgs' => 'Button codes
(ASCII, dec, CSV)', // terminal color labels 'color.0' => 'Black', diff --git a/html_orig/pages/cfg_term.php b/html_orig/pages/cfg_term.php index 7a9d984..7140d4c 100644 --- a/html_orig/pages/cfg_term.php +++ b/html_orig/pages/cfg_term.php @@ -134,6 +134,15 @@  ms +
+ +   +   +   +   + +
+
diff --git a/html_orig/pages/help/cmd_system.php b/html_orig/pages/help/cmd_system.php index d224676..d8956fc 100644 --- a/html_orig/pages/help/cmd_system.php +++ b/html_orig/pages/help/cmd_system.php @@ -34,24 +34,31 @@ - `\e]0;title\a` - Set screen title (this is a standard OSC command) + `\e]0;t\a` + Set screen title to _t_ (this is a standard OSC command) - \e]81;btn1\a \\ - \e]82;btn2\a \\ - \e]83;btn3\a \\ - \e]84;btn4\a \\ - \e]85;btn5\a \\ + \e]80+n;t\a - Set button 1-5 label - eg.`\e]81;Yes\a` + Set label for button _n_ = 1-5 (code 81-85) to _t_ - e.g.`\e]81;Yes\a` sets the first button text to "Yes". + + + + \e]90+n;m\a + + + + Set message for button _n_ = 1-5 (code 81-85) to _m_ - e.g.`\e]94;iv\a` + sets the 3rd button to send string "iv" when pressed. + + @@ -88,7 +95,7 @@ `\e[8;r;ct` - Set screen size (this is a command borrowed from xterm) + Set screen size to _r_ rows and _c_ columns (this is a command borrowed from Xterm) diff --git a/html_orig/pages/term.php b/html_orig/pages/term.php index 4bafecd..a99361e 100644 --- a/html_orig/pages/term.php +++ b/html_orig/pages/term.php @@ -5,7 +5,7 @@ console.error("Page load failed, refreshing…"); location.reload(true); } - }, 2000); + }, 3000);

@@ -48,10 +48,10 @@ }); } catch(e) { console.error(e); - console.error("Fail, reloading in 1s…"); + console.error("Fail, reloading in 3s…"); setTimeout(function() { location.reload(true); - }, 1000); + }, 3000); } function toggleSoftKb(yes) { diff --git a/html_orig/sass/pages/_about.scss b/html_orig/sass/pages/_about.scss index 38ae5ba..072d2f5 100644 --- a/html_orig/sass/pages/_about.scss +++ b/html_orig/sass/pages/_about.scss @@ -60,7 +60,7 @@ width: 100%; td:nth-child(1) { - width: 6em; + width: 8em; } } } @@ -86,7 +86,7 @@ div { display: inline-block; - width: 2.5em; + width: 2.7em; border: 1px solid #666; height: 3em; margin: 1px; diff --git a/user/ansi_parser.c b/user/ansi_parser.c index c940c95..117ebb5 100644 --- a/user/ansi_parser.c +++ b/user/ansi_parser.c @@ -133,14 +133,12 @@ ansi_parser(char newchar) #endif // Handle simple characters immediately (bypass parser) - if (newchar < ' ') { + if (newchar < ' ' && !inside_string) { switch (newchar) { case ESC: - if (!inside_string) { - // Reset state - cs = ansi_start; - // now the ESC will be processed by the parser - } + // Reset state + cs = ansi_start; + // now the ESC will be processed by the parser break; // proceed to parser // Literally passed @@ -168,10 +166,7 @@ ansi_parser(char newchar) case BEL: // bel is also used to terminate OSC - if (!inside_string) { - apars_handle_bel(); - return; - } + apars_handle_bel(); break; case ENQ: @@ -185,14 +180,12 @@ ansi_parser(char newchar) return; default: - // Discard all others + // Discard all other control codes return; } } else { - // >= ' ' - // bypass the parser for simple characters (speed-up) - if (cs == ansi_start) { + if (cs == ansi_start && newchar >= ' ') { apars_handle_plainchar(newchar); return; } @@ -205,7 +198,7 @@ ansi_parser(char newchar) // The parser -/* #line 209 "user/ansi_parser.c" */ +/* #line 202 "user/ansi_parser.c" */ { const char *_acts; unsigned int _nacts; @@ -383,7 +376,7 @@ execFuncs: while ( _nacts-- > 0 ) { switch ( *_acts++ ) { case 0: -/* #line 185 "user/ansi_parser.rl" */ +/* #line 178 "user/ansi_parser.rl" */ { ansi_warn("Parser error."); apars_show_context(); @@ -392,7 +385,7 @@ execFuncs: } break; case 1: -/* #line 194 "user/ansi_parser.rl" */ +/* #line 187 "user/ansi_parser.rl" */ { if ((*p) != 0) { apars_handle_plainchar((*p)); @@ -400,7 +393,7 @@ execFuncs: } break; case 2: -/* #line 202 "user/ansi_parser.rl" */ +/* #line 195 "user/ansi_parser.rl" */ { // Reset the CSI builder leadchar = NUL; @@ -416,13 +409,13 @@ execFuncs: } break; case 3: -/* #line 216 "user/ansi_parser.rl" */ +/* #line 209 "user/ansi_parser.rl" */ { leadchar = (*p); } break; case 4: -/* #line 220 "user/ansi_parser.rl" */ +/* #line 213 "user/ansi_parser.rl" */ { if (arg_cnt == 0) arg_cnt = 1; // x10 + digit @@ -432,7 +425,7 @@ execFuncs: } break; case 5: -/* #line 228 "user/ansi_parser.rl" */ +/* #line 221 "user/ansi_parser.rl" */ { if (arg_cnt == 0) arg_cnt = 1; // handle case when first arg is empty arg_cnt++; @@ -440,14 +433,14 @@ execFuncs: } break; case 6: -/* #line 234 "user/ansi_parser.rl" */ +/* #line 227 "user/ansi_parser.rl" */ { apars_handle_csi(leadchar, arg, arg_cnt, (*p)); {cs = 1;goto _again;} } break; case 7: -/* #line 245 "user/ansi_parser.rl" */ +/* #line 238 "user/ansi_parser.rl" */ { leadchar = (*p); str_ni = 0; @@ -457,13 +450,13 @@ execFuncs: } break; case 8: -/* #line 253 "user/ansi_parser.rl" */ +/* #line 246 "user/ansi_parser.rl" */ { string_buffer[str_ni++] = (*p); } break; case 9: -/* #line 257 "user/ansi_parser.rl" */ +/* #line 250 "user/ansi_parser.rl" */ { inside_string = false; string_buffer[str_ni++] = '\0'; @@ -472,41 +465,41 @@ execFuncs: } break; case 10: -/* #line 270 "user/ansi_parser.rl" */ +/* #line 263 "user/ansi_parser.rl" */ { apars_handle_hash_cmd((*p)); {cs = 1;goto _again;} } break; case 11: -/* #line 275 "user/ansi_parser.rl" */ +/* #line 268 "user/ansi_parser.rl" */ { apars_handle_short_cmd((*p)); {cs = 1;goto _again;} } break; case 12: -/* #line 280 "user/ansi_parser.rl" */ +/* #line 273 "user/ansi_parser.rl" */ { apars_handle_space_cmd((*p)); {cs = 1;goto _again;} } break; case 13: -/* #line 287 "user/ansi_parser.rl" */ +/* #line 280 "user/ansi_parser.rl" */ { leadchar = (*p); {cs = 9;goto _again;} } break; case 14: -/* #line 292 "user/ansi_parser.rl" */ +/* #line 285 "user/ansi_parser.rl" */ { apars_handle_chs_designate(leadchar, (*p)); {cs = 1;goto _again;} } break; -/* #line 510 "user/ansi_parser.c" */ +/* #line 503 "user/ansi_parser.c" */ } } goto _again; @@ -524,7 +517,7 @@ _again: while ( __nacts-- > 0 ) { switch ( *__acts++ ) { case 0: -/* #line 185 "user/ansi_parser.rl" */ +/* #line 178 "user/ansi_parser.rl" */ { ansi_warn("Parser error."); apars_show_context(); @@ -534,7 +527,7 @@ _again: goto _again;} } break; -/* #line 538 "user/ansi_parser.c" */ +/* #line 531 "user/ansi_parser.c" */ } } } @@ -542,6 +535,6 @@ goto _again;} _out: {} } -/* #line 315 "user/ansi_parser.rl" */ +/* #line 308 "user/ansi_parser.rl" */ } diff --git a/user/ansi_parser.rl b/user/ansi_parser.rl index 2f4b4a6..d8c9f69 100644 --- a/user/ansi_parser.rl +++ b/user/ansi_parser.rl @@ -102,14 +102,12 @@ ansi_parser(char newchar) #endif // Handle simple characters immediately (bypass parser) - if (newchar < ' ') { + if (newchar < ' ' && !inside_string) { switch (newchar) { case ESC: - if (!inside_string) { - // Reset state - cs = ansi_start; - // now the ESC will be processed by the parser - } + // Reset state + cs = ansi_start; + // now the ESC will be processed by the parser break; // proceed to parser // Literally passed @@ -137,10 +135,7 @@ ansi_parser(char newchar) case BEL: // bel is also used to terminate OSC - if (!inside_string) { - apars_handle_bel(); - return; - } + apars_handle_bel(); break; case ENQ: @@ -154,14 +149,12 @@ ansi_parser(char newchar) return; default: - // Discard all others + // Discard all other control codes return; } } else { - // >= ' ' - // bypass the parser for simple characters (speed-up) - if (cs == ansi_start) { + if (cs == ansi_start && newchar >= ' ') { apars_handle_plainchar(newchar); return; } diff --git a/user/ansi_parser_callbacks.c b/user/ansi_parser_callbacks.c index 4bb9ebb..fa6173f 100644 --- a/user/ansi_parser_callbacks.c +++ b/user/ansi_parser_callbacks.c @@ -7,7 +7,6 @@ #include #include #include "ansi_parser_callbacks.h" -#include "uart_driver.h" #include "cgi_sockets.h" #include "version.h" #include "uart_buffer.h" @@ -21,7 +20,6 @@ void ICACHE_FLASH_ATTR apars_respond(const char *str) { UART_SendAsync(str, -1); - //UART_WriteString(UART0, str, UART_TIMEOUT_US); } /** diff --git a/user/apars_osc.c b/user/apars_osc.c index 5e0679d..2bf4649 100644 --- a/user/apars_osc.c +++ b/user/apars_osc.c @@ -42,6 +42,9 @@ apars_handle_osc(const char *buffer) else if (n >= 81 && n <= 85) { // ESPTerm: action button label screen_set_button_text(n - 80, buffer); } + else if (n >= 91 && n <= 95) { // ESPTerm: action button text + strncpy(termconf_scratch.btn_msg[n - 91], buffer, TERM_BTN_MSG_LEN); + } else { ansi_noimpl("OSC %d ; %s ST", n, buffer); } diff --git a/user/cgi_sockets.c b/user/cgi_sockets.c index 36f68c6..a5de07e 100644 --- a/user/cgi_sockets.c +++ b/user/cgi_sockets.c @@ -3,16 +3,16 @@ #include #include "cgi_sockets.h" -#include "uart_driver.h" #include "screen.h" #include "uart_buffer.h" #include "ansi_parser.h" #include "jstring.h" -#define LOOPBACK 0 - +// Heartbeat interval in ms #define HB_TIME 1000 +// Buffer size (sent in one go) +// Must be less than httpd sendbuf #define SOCK_BUF_LEN 2000 volatile bool notify_available = true; @@ -37,6 +37,10 @@ notifyCooldownTimCb(void *arg) notify_cooldown = false; } +/** + * Tell browser we have new content + * @param arg + */ static void ICACHE_FLASH_ATTR notifyContentTimCb(void *arg) { @@ -71,6 +75,10 @@ notifyContentTimCb(void *arg) TIMER_START(¬ifyCooldownTim, notifyCooldownTimCb, termconf->display_cooldown_ms, 0); } +/** + * Tell browsers about the new text labels + * @param arg + */ static void ICACHE_FLASH_ATTR notifyLabelsTimCb(void *arg) { @@ -124,6 +132,14 @@ void ICACHE_FLASH_ATTR screen_notifyChange(ScreenNotifyChangeTopic topic) } } +/** + * mouse event rx + * @param evt - event type: p, r, m + * @param y - coord 0-based + * @param x - coord 0-based + * @param button - which button, 1-based. 0=none + * @param mods - modifier keys bitmap: meta|alt|shift|ctrl + */ void ICACHE_FLASH_ATTR sendMouseAction(char evt, int y, int x, int button, u8 mods) { // one-based @@ -219,7 +235,7 @@ void ICACHE_FLASH_ATTR updateSockRx(Websock *ws, char *data, int len, int flags) // action button press btnNum = (u8) (data[1]); if (btnNum > 0 && btnNum < 10) { - UART_SendAsync(termconf->btn_msg[btnNum-1], -1); + UART_SendAsync(termconf_scratch.btn_msg[btnNum-1], -1); } break; @@ -242,6 +258,7 @@ void ICACHE_FLASH_ATTR updateSockRx(Websock *ws, char *data, int len, int flags) } } +/** Send a heartbeat msg */ void ICACHE_FLASH_ATTR heartbeatTimCb(void *unused) { if (notify_available) { diff --git a/user/cgi_term_cfg.c b/user/cgi_term_cfg.c index 1f7ee62..6b8ec41 100644 --- a/user/cgi_term_cfg.c +++ b/user/cgi_term_cfg.c @@ -168,11 +168,67 @@ cgiTermCfgSetParams(HttpdConnData *connData) strncpy_safe(termconf->title, buff, 64); // ATTN those must match the values in } - for (int i = 1; i <= TERM_BTN_COUNT; i++) { - sprintf(buff, "btn%d", i); + for (int btn_i = 1; btn_i <= TERM_BTN_COUNT; btn_i++) { + sprintf(buff, "btn%d", btn_i); if (GET_ARG(buff)) { - dbg("Button%d default text: \"%s\"", i, buff); - strncpy_safe(termconf->btn[i-1], buff, TERM_BTN_LEN); + dbg("Button%d default text: \"%s\"", btn_i, buff); + strncpy_safe(termconf->btn[btn_i-1], buff, TERM_BTN_LEN); + } + + sprintf(buff, "bm%d", btn_i); + if (GET_ARG(buff)) { + dbg("Button%d message (ASCII): \"%s\"", btn_i, buff); + + // parse: comma,space or semicolon separated decimal values of ASCII codes + char c; + char *cp = buff; + int char_i = 0; + int acu = 0; + bool lastsp = 1; + char buff_bm[TERM_BTN_MSG_LEN]; + while ((c = *cp++) != 0) { + if (c == ' ' || c == ',' || c == ';') { + if(lastsp) continue; + + if (acu==0 || acu>255) { + warn("Bad value! %d", acu); + redir_url += sprintf(redir_url, "bm%d,", btn_i); + break; + } + + if (char_i >= TERM_BTN_MSG_LEN-1) { + warn("Too long! %d", acu); + redir_url += sprintf(redir_url, "bm%d,", btn_i); + break; + } + + dbg("acu %d", acu); + buff_bm[char_i++] = (char)acu; + + // prepare for next char + acu = 0; + lastsp = 1; + } else if (c>='0'&&c<='9') { + lastsp = 0; + acu *= 10; + acu += c - '0'; + } else { + warn("Bad syntax!"); + redir_url += sprintf(redir_url, "bm%d,", btn_i); + break; + } + } + if (lastsp && char_i == 0) { + warn("Required!"); + redir_url += sprintf(redir_url, "bm%d,", btn_i); + } + if (!lastsp) { + buff_bm[char_i++] = (char)acu; + } + buff_bm[char_i] = 0; + dbg("%s, chari = %d", buff_bm, char_i); + + strncpy(termconf->btn_msg[btn_i-1], buff_bm, TERM_BTN_MSG_LEN); } } @@ -252,10 +308,27 @@ tplTermCfg(HttpdConnData *connData, char *token, void **arg) strncpy_safe(buff, termconf->title, BUFLEN); } else { - for (int i = 1; i <= TERM_BTN_COUNT; i++) { - sprintf(buff2, "btn%d", i); + for (int btn_i = 1; btn_i <= TERM_BTN_COUNT; btn_i++) { + sprintf(buff2, "btn%d", btn_i); if (streq(token, buff2)) { - strncpy_safe(buff, termconf->btn[i-1], BUFLEN); + strncpy_safe(buff, termconf->btn[btn_i-1], BUFLEN); + break; + } + + sprintf(buff2, "bm%d", btn_i); + if (streq(token, buff2)) { + char c; + char *bp = buff; + char *cp = termconf->btn_msg[btn_i-1]; + int n = 0; + while((c = *cp++) != 0) { + if(n>0) { + *bp = ','; + bp++; + } + bp += sprintf(bp, "%d", (int)c); + n++; + } break; } } diff --git a/user/uart_asyncdrv.c- b/user/uart_asyncdrv.c- deleted file mode 100644 index c257b67..0000000 --- a/user/uart_asyncdrv.c- +++ /dev/null @@ -1,830 +0,0 @@ -/* - * File : uart.c - * Copyright (C) 2013 - 2016, Espressif Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of version 3 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ -#include -#include -#include "uart_asyncdrv.h-" - -// UartDev is defined and initialized in rom code. -extern UartDevice UartDev; - -struct UartBuffer { - uint32 UartBuffSize; - uint8 *pUartBuff; - uint8 *pInPos; - uint8 *pOutPos; - STATUS BuffState; - uint16 Space; //remanent space of the buffer - uint8 TcpControl; - struct UartBuffer *nextBuff; -}; - -struct UartRxBuff { - uint32 UartRxBuffSize; - uint8 *pUartRxBuff; - uint8 *pWritePos; - uint8 *pReadPos; - STATUS RxBuffState; - uint32 Space; //remanent space of the buffer -}; - -LOCAL struct UartBuffer* pTxBuffer = NULL; -LOCAL struct UartBuffer* pRxBuffer = NULL; - -// Forward declare -#if UART_BUFF_EN -LOCAL void Uart_Buf_Cpy(struct UartBuffer* pCur, char* pdata , uint16 data_len); -void uart_buf_free(struct UartBuffer* pBuff); -void tx_buff_enq(char* pdata, uint16 data_len ); -LOCAL void tx_fifo_insert(struct UartBuffer* pTxBuff, uint8 data_len, uint8 uart_no); -void tx_start_uart_buffer(uint8 uart_no); -uint16 rx_buff_deq(char* pdata, uint16 data_len ); -void Uart_rx_buff_enq(); -#endif - -//void ICACHE_FLASH_ATTR uart_test_rx(); -STATUS uart_tx_one_char(uint8 uart, uint8 TxChar); -STATUS uart_tx_one_char_no_wait(uint8 uart, uint8 TxChar); -void uart1_sendStr_no_wait(const char *str); -struct UartBuffer* UART_AsyncBufferInit(u32 size); - -void uart_rx_intr_enable(uint8 uart_no); -void uart_rx_intr_disable(uint8 uart_no); -void uart0_tx_buffer(uint8 *buf, uint16 len); - -void uart0_sendStr(const char *str); - - -/*uart demo with a system task, to output what uart receives*/ -/*this is a example to process uart data from task,please change the priority to fit your application task if exists*/ -/*it might conflict with your task, if so,please arrange the priority of different task, or combine it to a different event in the same task. */ -#define uart_recvTaskPrio 0 -#define uart_recvTaskQueueLen 10 -os_event_t uart_recvTaskQueue[uart_recvTaskQueueLen]; - -#define DBG -#define DBG1 uart1_sendStr_no_wait -#define DBG2 os_printf - - -LOCAL void uart0_rx_intr_handler(void *para); - -/****************************************************************************** - * FunctionName : uart_config - * Description : Internal used function - * UART0 used for data TX/RX, RX buffer size is 0x100, interrupt enabled - * UART1 just used for debug output - * Parameters : uart_no, use UART0 or UART1 defined ahead - * Returns : NONE -*******************************************************************************/ -LOCAL void ICACHE_FLASH_ATTR -uart_config(uint8 uart_no) -{ - if (uart_no == UART1){ - PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK); - }else{ - /* rcv_buff size if 0x100 */ - ETS_UART_INTR_ATTACH(uart0_rx_intr_handler, &(UartDev.rcv_buff)); - PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U); - PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD); - #if UART_HW_RTS - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS); //HW FLOW CONTROL RTS PIN - #endif - #if UART_HW_CTS - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_U0CTS); //HW FLOW CONTROL CTS PIN - #endif - } - uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));//SET BAUDRATE - - WRITE_PERI_REG(UART_CONF0(uart_no), ((UartDev.exist_parity & UART_PARITY_EN_M) << UART_PARITY_EN_S) //SET BIT AND PARITY MODE - | ((UartDev.parity & UART_PARITY_M) <> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) { - break; - } - } - WRITE_PERI_REG(UART_FIFO(uart) , TxChar); - return OK; -} - -/****************************************************************************** - * FunctionName : uart1_write_char - * Description : Internal used function - * Do some special deal while tx char is '\r' or '\n' - * Parameters : char c - character to tx - * Returns : NONE -*******************************************************************************/ -LOCAL void ICACHE_FLASH_ATTR -uart1_write_char(char c) -{ - if (c == '\n'){ - uart_tx_one_char(UART1, '\r'); - uart_tx_one_char(UART1, '\n'); - }else if (c == '\r'){ - - }else{ - uart_tx_one_char(UART1, c); - } -} - -//os_printf output to fifo or to the tx buffer -LOCAL void ICACHE_FLASH_ATTR -uart0_write_char_no_wait(char c) -{ -#if UART_BUFF_EN //send to uart0 fifo but do not wait - uint8 chr; -// if (c == '\n'){ -// chr = '\r'; -// tx_buff_enq(&chr, 1); -// chr = '\n'; -// tx_buff_enq(&chr, 1); -// }else if (c == '\r'){ -// -// }else{ - tx_buff_enq(&c,1); -// } -#else //send to uart tx buffer - if (c == '\n'){ - uart_tx_one_char_no_wait(UART0, '\r'); - uart_tx_one_char_no_wait(UART0, '\n'); - }else if (c == '\r'){ - - } - else{ - uart_tx_one_char_no_wait(UART0, c); - } -#endif -} - -/****************************************************************************** - * FunctionName : uart0_tx_buffer - * Description : use uart0 to transfer buffer - * Parameters : uint8 *buf - point to send buffer - * uint16 len - buffer len - * Returns : -*******************************************************************************/ -void ICACHE_FLASH_ATTR -uart0_tx_buffer(uint8 *buf, uint16 len) -{ - uint16 i; - for (i = 0; i < len; i++) - { - uart_tx_one_char(UART0, buf[i]); - } -} - -/****************************************************************************** - * FunctionName : uart0_sendStr - * Description : use uart0 to transfer buffer - * Parameters : uint8 *buf - point to send buffer - * uint16 len - buffer len - * Returns : -*******************************************************************************/ -void ICACHE_FLASH_ATTR -uart0_sendStr(const char *str) -{ - while(*str){ - uart_tx_one_char(UART0, *str++); - } -} -void at_port_print(const char *str) __attribute__((alias("uart0_sendStr"))); -/****************************************************************************** - * FunctionName : uart0_rx_intr_handler - * Description : Internal used function - * UART0 interrupt handler, add self handle code inside - * Parameters : void *para - point to ETS_UART_INTR_ATTACH's arg - * Returns : NONE -*******************************************************************************/ -LOCAL void -uart0_rx_intr_handler(void *para) -{ - /* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents - * uart1 and uart0 respectively - */ - uint8 RcvChar; - uint8 uart_no = UART0;//UartDev.buff_uart_no; - uint8 fifo_len = 0; - uint8 buf_idx = 0; - uint8 temp,cnt; - //RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para; - - /*ATTENTION:*/ - /*IN NON-OS VERSION SDK, DO NOT USE "ICACHE_FLASH_ATTR" FUNCTIONS IN THE WHOLE HANDLER PROCESS*/ - /*ALL THE FUNCTIONS CALLED IN INTERRUPT HANDLER MUST BE DECLARED IN RAM */ - /*IF NOT , POST AN EVENT AND PROCESS IN SYSTEM TASK */ - if(UART_FRM_ERR_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_FRM_ERR_INT_ST)){ - DBG1("FRM_ERR\r\n"); - WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_FRM_ERR_INT_CLR); - }else if(UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST)){ - // Full interrupt - FIFO threshold reached - DBG("f"); - uart_rx_intr_disable(UART0); - WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR); - system_os_post(uart_recvTaskPrio, 0, 0); // tell the handler - }else if(UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_TOUT_INT_ST)){ - // Timeout interrupt - Line idle for a while - DBG("t"); - uart_rx_intr_disable(UART0); - WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR); - system_os_post(uart_recvTaskPrio, 0, 0); // tell the handler - }else if(UART_TXFIFO_EMPTY_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_TXFIFO_EMPTY_INT_ST)){ - DBG("e"); - // TX fifo is empty, can send more. - - /* to output uart data from uart buffer directly in empty interrupt handler*/ - /*instead of processing in system event, in order not to wait for current task/function to quit */ - /*ATTENTION:*/ - /*IN NON-OS VERSION SDK, DO NOT USE "ICACHE_FLASH_ATTR" FUNCTIONS IN THE WHOLE HANDLER PROCESS*/ - /*ALL THE FUNCTIONS CALLED IN INTERRUPT HANDLER MUST BE DECLARED IN RAM */ - CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA); - #if UART_BUFF_EN - tx_start_uart_buffer(UART0); - #endif - //system_os_post(uart_recvTaskPrio, 1, 0); - WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_TXFIFO_EMPTY_INT_CLR); - - }else if(UART_RXFIFO_OVF_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_OVF_INT_ST)){ - WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_RXFIFO_OVF_INT_CLR); - DBG1("RX OVF!!\r\n"); - } - -} - -/****************************************************************************** - * FunctionName : uart_init - * Description : user interface for init uart - * Parameters : UartBautRate uart0_br - uart0 bautrate - * UartBautRate uart1_br - uart1 bautrate - * Returns : NONE -*******************************************************************************/ -#if UART_SELFTEST&UART_BUFF_EN -os_timer_t buff_timer_t; -void ICACHE_FLASH_ATTR -uart_test_rx() -{ - uint8 uart_buf[128]={0}; - uint16 len = 0; - len = rx_buff_deq(uart_buf, 128 ); - tx_buff_enq(uart_buf,len); -} -#endif - -LOCAL void ICACHE_FLASH_ATTR /////// -uart_recvTask(os_event_t *events) -{ - if(events->sig == 0){ - #if UART_BUFF_EN - Uart_rx_buff_enq(); - #else - uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT; - uint8 d_tmp = 0; - uint8 idx=0; - for(idx=0;idxsig == 1){ - #if UART_BUFF_EN - //already move uart buffer output to uart empty interrupt - //tx_start_uart_buffer(UART0); - #else - - #endif - } -} - -void ICACHE_FLASH_ATTR -uart_init(UartBautRate uart0_br, UartBautRate uart1_br) -{ - /*this is a example to process uart data from task,please change the priority to fit your application task if exists*/ - system_os_task(uart_recvTask, uart_recvTaskPrio, uart_recvTaskQueue, uart_recvTaskQueueLen); //demo with a task to process the uart data - - UartDev.baut_rate = uart0_br; - uart_config(UART0); - UartDev.baut_rate = uart1_br; - uart_config(UART1); - ETS_UART_INTR_ENABLE(); - - #if UART_BUFF_EN - pTxBuffer = UART_AsyncBufferInit(UART_TX_BUFFER_SIZE); - pRxBuffer = UART_AsyncBufferInit(UART_RX_BUFFER_SIZE); - #endif - - - /*option 1: use default print, output from uart0 , will wait some time if fifo is full */ - //do nothing... - - /*option 2: output from uart1,uart1 output will not wait , just for output debug info */ - /*os_printf output uart data via uart1(GPIO2)*/ - os_install_putc1((void *)uart1_write_char); //use this one to output debug information via uart1 // - - /*option 3: output from uart0 will skip current byte if fifo is full now... */ - /*see uart0_write_char_no_wait:you can output via a buffer or output directly */ - /*os_printf output uart data via uart0 or uart buffer*/ - //os_install_putc1((void *)uart0_write_char_no_wait); //use this to print via uart0 - - #if UART_SELFTEST&UART_BUFF_EN - os_timer_disarm(&buff_timer_t); - os_timer_setfn(&buff_timer_t, uart_test_rx , NULL); //a demo to process the data in uart rx buffer - os_timer_arm(&buff_timer_t,10,1); - #endif -} - -//void ICACHE_FLASH_ATTR -//uart_reattach() -//{ -// uart_init(BIT_RATE_115200, BIT_RATE_115200); -//} - -/****************************************************************************** - * FunctionName : uart_tx_one_char_no_wait - * Description : uart tx a single char without waiting for fifo - * Parameters : uint8 uart - uart port - * uint8 TxChar - char to tx - * Returns : STATUS -*******************************************************************************/ -STATUS uart_tx_one_char_no_wait(uint8 uart, uint8 TxChar) -{ - uint8 fifo_cnt = (( READ_PERI_REG(UART_STATUS(uart))>>UART_TXFIFO_CNT_S)& UART_TXFIFO_CNT); - if (fifo_cnt < 126) { - WRITE_PERI_REG(UART_FIFO(uart) , TxChar); - } - return OK; -} - -//STATUS uart0_tx_one_char_no_wait(uint8 TxChar) -//{ -// uint8 fifo_cnt = (( READ_PERI_REG(UART_STATUS(UART0))>>UART_TXFIFO_CNT_S)& UART_TXFIFO_CNT); -// if (fifo_cnt < 126) { -// WRITE_PERI_REG(UART_FIFO(UART0) , TxChar); -// } -// return OK; -//} - - -/****************************************************************************** - * FunctionName : uart1_sendStr_no_wait - * Description : uart tx a string without waiting for every char, used for print debug info which can be lost - * Parameters : const char *str - string to be sent - * Returns : NONE -*******************************************************************************/ -void uart1_sendStr_no_wait(const char *str) -{ - while(*str){ - uart_tx_one_char_no_wait(UART1, *str++); - } -} - - -#if UART_BUFF_EN -/****************************************************************************** - * FunctionName : Uart_Buf_Init - * Description : tx buffer enqueue: fill a first linked buffer - * Parameters : char *pdata - data point to be enqueue - * Returns : NONE -*******************************************************************************/ -struct UartBuffer* ICACHE_FLASH_ATTR -UART_AsyncBufferInit(uint32 buf_size) -{ - uint32 heap_size = system_get_free_heap_size(); - if(heap_size <=buf_size){ - DBG1("no buf for uart\n\r"); - return NULL; - }else{ - DBG("test heap size: %d\n\r",heap_size); - struct UartBuffer* pBuff = (struct UartBuffer* )os_malloc(sizeof(struct UartBuffer)); - pBuff->UartBuffSize = buf_size; - pBuff->pUartBuff = (uint8*)os_malloc(pBuff->UartBuffSize); - pBuff->pInPos = pBuff->pUartBuff; - pBuff->pOutPos = pBuff->pUartBuff; - pBuff->Space = (uint16) pBuff->UartBuffSize; - pBuff->BuffState = OK; - pBuff->nextBuff = NULL; - pBuff->TcpControl = RUN; - return pBuff; - } -} - - -//copy uart buffer -LOCAL void Uart_Buf_Cpy(struct UartBuffer* pCur, char* pdata , uint16 data_len) -{ - if(data_len == 0) return; - - uint16 tail_len = (uint16) (pCur->pUartBuff + pCur->UartBuffSize - pCur->pInPos); - if(tail_len >= data_len){ //do not need to loop back the queue - os_memcpy(pCur->pInPos , pdata , data_len ); - pCur->pInPos += ( data_len ); - pCur->pInPos = (pCur->pUartBuff + (pCur->pInPos - pCur->pUartBuff) % pCur->UartBuffSize ); - pCur->Space -=data_len; - }else{ - os_memcpy(pCur->pInPos, pdata, tail_len); - pCur->pInPos += ( tail_len ); - pCur->pInPos = (pCur->pUartBuff + (pCur->pInPos - pCur->pUartBuff) % pCur->UartBuffSize ); - pCur->Space -=tail_len; - os_memcpy(pCur->pInPos, pdata+tail_len , data_len-tail_len); - pCur->pInPos += ( data_len-tail_len ); - pCur->pInPos = (pCur->pUartBuff + (pCur->pInPos - pCur->pUartBuff) % pCur->UartBuffSize ); - pCur->Space -=( data_len-tail_len); - } - -} - -/****************************************************************************** - * FunctionName : uart_buf_free - * Description : deinit of the tx buffer - * Parameters : struct UartBuffer* pTxBuff - tx buffer struct pointer - * Returns : NONE -*******************************************************************************/ -void ICACHE_FLASH_ATTR -uart_buf_free(struct UartBuffer* pBuff) -{ - os_free(pBuff->pUartBuff); - os_free(pBuff); -} - - -//rx buffer dequeue -uint16 ICACHE_FLASH_ATTR -rx_buff_deq(char* pdata, uint16 data_len) -{ - uint16 buf_len = (pRxBuffer->UartBuffSize- pRxBuffer->Space); - uint16 tail_len = pRxBuffer->pUartBuff + pRxBuffer->UartBuffSize - pRxBuffer->pOutPos ; - uint16 len_tmp = 0; - len_tmp = ((data_len > buf_len)?buf_len:data_len); - if(pRxBuffer->pOutPos <= pRxBuffer->pInPos){ - os_memcpy(pdata, pRxBuffer->pOutPos,len_tmp); - pRxBuffer->pOutPos+= len_tmp; - pRxBuffer->Space += len_tmp; - }else{ - if(len_tmp>tail_len){ - os_memcpy(pdata, pRxBuffer->pOutPos, tail_len); - pRxBuffer->pOutPos += tail_len; - pRxBuffer->pOutPos = (pRxBuffer->pUartBuff + (pRxBuffer->pOutPos- pRxBuffer->pUartBuff) % pRxBuffer->UartBuffSize ); - pRxBuffer->Space += tail_len; - - os_memcpy(pdata+tail_len , pRxBuffer->pOutPos, len_tmp-tail_len); - pRxBuffer->pOutPos+= ( len_tmp-tail_len ); - pRxBuffer->pOutPos= (pRxBuffer->pUartBuff + (pRxBuffer->pOutPos- pRxBuffer->pUartBuff) % pRxBuffer->UartBuffSize ); - pRxBuffer->Space +=( len_tmp-tail_len); - }else{ - //os_printf("case 3 in rx deq\n\r"); - os_memcpy(pdata, pRxBuffer->pOutPos, len_tmp); - pRxBuffer->pOutPos += len_tmp; - pRxBuffer->pOutPos = (pRxBuffer->pUartBuff + (pRxBuffer->pOutPos- pRxBuffer->pUartBuff) % pRxBuffer->UartBuffSize ); - pRxBuffer->Space += len_tmp; - } - } - if(pRxBuffer->Space >= UART_FIFO_LEN){ - uart_rx_intr_enable(UART0); - } - return len_tmp; -} - - -//move data from uart fifo to rx buffer -void Uart_rx_buff_enq() -{ - uint8 fifo_len,buf_idx; - uint8 fifo_data; - #if 1 - fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT; - if(fifo_len >= pRxBuffer->Space){ - os_printf("buf full!!!\n\r"); - }else{ - buf_idx=0; - while(buf_idx < fifo_len){ - buf_idx++; - fifo_data = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF; - *(pRxBuffer->pInPos++) = fifo_data; - if(pRxBuffer->pInPos == (pRxBuffer->pUartBuff + pRxBuffer->UartBuffSize)){ - pRxBuffer->pInPos = pRxBuffer->pUartBuff; - } - } - pRxBuffer->Space -= fifo_len ; - if(pRxBuffer->Space >= UART_FIFO_LEN){ - //os_printf("after rx enq buf enough\n\r"); - uart_rx_intr_enable(UART0); - } - } - #endif -} - - -//fill the uart tx buffer -void ICACHE_FLASH_ATTR -tx_buff_enq(char* pdata, uint16 data_len ) -{ - if(pTxBuffer == NULL){ - DBG1("\n\rnull, create buffer struct\n\r"); - pTxBuffer = UART_AsyncBufferInit(UART_TX_BUFFER_SIZE); - if(pTxBuffer!= NULL){ - Uart_Buf_Cpy(pTxBuffer , pdata, data_len ); - }else{ - DBG1("uart tx MALLOC no buf \n\r"); - } - }else{ - if(data_len <= pTxBuffer->Space){ - Uart_Buf_Cpy(pTxBuffer , pdata, data_len); - }else{ - DBG1("UART TX BUF FULL!!!!\n\r"); - } - } - #if 0 - if(pTxBuffer->Space <= URAT_TX_LOWER_SIZE){ - set_tcp_block(); - } - #endif - SET_PERI_REG_MASK(UART_CONF1(UART0), (UART_TX_EMPTY_THRESH_VAL & UART_TXFIFO_EMPTY_THRHD)<pOutPos++)); - if(pTxBuff->pOutPos == (pTxBuff->pUartBuff + pTxBuff->UartBuffSize)){ - pTxBuff->pOutPos = pTxBuff->pUartBuff; - } - } - pTxBuff->pOutPos = (pTxBuff->pUartBuff + (pTxBuff->pOutPos - pTxBuff->pUartBuff) % pTxBuff->UartBuffSize ); - pTxBuff->Space += data_len; -} - - -/****************************************************************************** - * FunctionName : tx_start_uart_buffer - * Description : get data from the tx buffer and fill the uart tx fifo, co-work with the uart fifo empty interrupt - * Parameters : uint8 uart_no - uart port num - * Returns : NONE -*******************************************************************************/ -void tx_start_uart_buffer(uint8 uart_no) -{ - uint8 tx_fifo_len = (READ_PERI_REG(UART_STATUS(uart_no))>>UART_TXFIFO_CNT_S)&UART_TXFIFO_CNT; - uint8 fifo_remain = UART_FIFO_LEN - tx_fifo_len ; - uint8 len_tmp; - uint16 tail_ptx_len,head_ptx_len,data_len; - //struct UartBuffer* pTxBuff = *get_buff_prt(); - - if(pTxBuffer){ - data_len = (pTxBuffer->UartBuffSize - pTxBuffer->Space); - if(data_len > fifo_remain){ - len_tmp = fifo_remain; - tx_fifo_enq(pTxBuffer, len_tmp, uart_no); - SET_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA); - }else{ - len_tmp = data_len; - tx_fifo_enq(pTxBuffer, len_tmp, uart_no); - } - }else{ - DBG1("pTxBuff null \n\r"); - } -} - -#endif - - -void uart_rx_intr_disable(uint8 uart_no) -{ -#if 1 - CLEAR_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA); -#else - ETS_UART_INTR_DISABLE(); -#endif -} - -void uart_rx_intr_enable(uint8 uart_no) -{ -#if 1 - SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA); -#else - ETS_UART_INTR_ENABLE(); -#endif -} - - -//======================================================== -LOCAL void -uart0_write_char(char c) -{ - if (c == '\n') { - uart_tx_one_char(UART0, '\r'); - uart_tx_one_char(UART0, '\n'); - } else if (c == '\r') { - } else { - uart_tx_one_char(UART0, c); - } -} - -void ICACHE_FLASH_ATTR -UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len) -{ - SET_PERI_REG_BITS(UART_CONF0(uart_no),UART_BIT_NUM,len,UART_BIT_NUM_S); -} - -void ICACHE_FLASH_ATTR -UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num) -{ - SET_PERI_REG_BITS(UART_CONF0(uart_no),UART_STOP_BIT_NUM,bit_num,UART_STOP_BIT_NUM_S); -} - -void ICACHE_FLASH_ATTR -UART_SetLineInverse(uint8 uart_no, UART_LineLevelInverse inverse_mask) -{ - CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_LINE_INV_MASK); - SET_PERI_REG_MASK(UART_CONF0(uart_no), inverse_mask); -} - -void ICACHE_FLASH_ATTR -UART_SetParity(uint8 uart_no, UartParityMode Parity_mode) -{ - CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_PARITY |UART_PARITY_EN); - if(Parity_mode==NONE_BITS){ - }else{ - SET_PERI_REG_MASK(UART_CONF0(uart_no), Parity_mode|UART_PARITY_EN); - } -} - -void ICACHE_FLASH_ATTR -UART_SetBaudrate(uint8 uart_no,uint32 baud_rate) -{ - uart_div_modify(uart_no, UART_CLK_FREQ /baud_rate); -} - -void ICACHE_FLASH_ATTR -UART_SetFlowCtrl(uint8 uart_no,UART_HwFlowCtrl flow_ctrl,uint8 rx_thresh) -{ - if(flow_ctrl&USART_HardwareFlowControl_RTS){ - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS); - SET_PERI_REG_BITS(UART_CONF1(uart_no),UART_RX_FLOW_THRHD,rx_thresh,UART_RX_FLOW_THRHD_S); - SET_PERI_REG_MASK(UART_CONF1(uart_no), UART_RX_FLOW_EN); - }else{ - CLEAR_PERI_REG_MASK(UART_CONF1(uart_no), UART_RX_FLOW_EN); - } - if(flow_ctrl&USART_HardwareFlowControl_CTS){ - PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_UART0_CTS); - SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_TX_FLOW_EN); - }else{ - CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_TX_FLOW_EN); - } -} - -void ICACHE_FLASH_ATTR -UART_WaitTxFifoEmpty(uint8 uart_no , uint32 time_out_us) //do not use if tx flow control enabled -{ - uint32 t_s = system_get_time(); - while (READ_PERI_REG(UART_STATUS(uart_no)) & (UART_TXFIFO_CNT << UART_TXFIFO_CNT_S)){ - - if(( system_get_time() - t_s )> time_out_us){ - break; - } - WRITE_PERI_REG(0X60000914, 0X73);//WTD - - } -} - - -bool ICACHE_FLASH_ATTR -UART_CheckOutputFinished(uint8 uart_no, uint32 time_out_us) -{ - uint32 t_start = system_get_time(); - uint8 tx_fifo_len; - uint32 tx_buff_len; - while(1){ - tx_fifo_len =( (READ_PERI_REG(UART_STATUS(uart_no))>>UART_TXFIFO_CNT_S)&UART_TXFIFO_CNT); - if(pTxBuffer){ - tx_buff_len = ((pTxBuffer->UartBuffSize)-(pTxBuffer->Space)); - }else{ - tx_buff_len = 0; - } - - if( tx_fifo_len==0 && tx_buff_len==0){ - return TRUE; - } - if( system_get_time() - t_start > time_out_us){ - return FALSE; - } - WRITE_PERI_REG(0X60000914, 0X73);//WTD - } -} - - -void ICACHE_FLASH_ATTR -UART_ResetFifo(uint8 uart_no) -{ - SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST); - CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST); -} - -void ICACHE_FLASH_ATTR -UART_ClearIntrStatus(uint8 uart_no,uint32 clr_mask) -{ - WRITE_PERI_REG(UART_INT_CLR(uart_no), clr_mask); -} - -void ICACHE_FLASH_ATTR -UART_SetIntrEna(uint8 uart_no,uint32 ena_mask) -{ - SET_PERI_REG_MASK(UART_INT_ENA(uart_no), ena_mask); -} - - -void ICACHE_FLASH_ATTR -UART_SetPrintPort(uint8 uart_no) -{ - if(uart_no==1){ - os_install_putc1(uart1_write_char); - }else{ - /*option 1: do not wait if uart fifo is full,drop current character*/ - os_install_putc1(uart0_write_char_no_wait); - /*option 2: wait for a while if uart fifo is full*/ - os_install_putc1(uart0_write_char); - } -} - - -//======================================================== - -// -///*test code*/ -//void ICACHE_FLASH_ATTR -//uart_init_2(UartBautRate uart0_br, UartBautRate uart1_br) -//{ -// // rom use 74880 baut_rate, here reinitialize -// UartDev.baut_rate = uart0_br; -// UartDev.exist_parity = STICK_PARITY_EN; -// UartDev.parity = EVEN_BITS; -// UartDev.stop_bits = ONE_STOP_BIT; -// UartDev.data_bits = EIGHT_BITS; -// -// uart_config(UART0); -// UartDev.baut_rate = uart1_br; -// uart_config(UART1); -// ETS_UART_INTR_ENABLE(); -// -// // install uart1 putc callback -// os_install_putc1((void *)uart1_write_char);//print output at UART1 -//} -// -// diff --git a/user/uart_asyncdrv.h- b/user/uart_asyncdrv.h- deleted file mode 100644 index 5730e00..0000000 --- a/user/uart_asyncdrv.h- +++ /dev/null @@ -1,178 +0,0 @@ -/* - * File : uart.h - * Copyright (C) 2013 - 2016, Espressif Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of version 3 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ -#ifndef UART_APP_H -#define UART_APP_H - -#include - -#define UART_TX_BUFFER_SIZE 512 //Ring buffer length of tx buffer -#define UART_RX_BUFFER_SIZE 512 //Ring buffer length of rx buffer - -#define UART_BUFF_EN 1 //use uart buffer , FOR UART0 -#define UART_SELFTEST 0 //set 1:enable the loop test demo for uart buffer, FOR UART0 - -#define UART_HW_RTS 0 //set 1: enable uart hw flow control RTS, PIN MTDO, FOR UART0 -#define UART_HW_CTS 0 //set1: enable uart hw flow contrl CTS , PIN MTCK, FOR UART0 - -#define UART0 0 -#define UART1 1 - -typedef enum { - FIVE_BITS = 0x0, - SIX_BITS = 0x1, - SEVEN_BITS = 0x2, - EIGHT_BITS = 0x3 -} UartBitsNum4Char; - -typedef enum { - ONE_STOP_BIT = 0x1, - ONE_HALF_STOP_BIT = 0x2, - TWO_STOP_BIT = 0x3 -} UartStopBitsNum; - -typedef enum { - NONE_BITS = 0x2, - ODD_BITS = 1, - EVEN_BITS = 0 -} UartParityMode; - -typedef enum { - STICK_PARITY_DIS = 0, - STICK_PARITY_EN = 1 -} UartExistParity; - -typedef enum { - UART_None_Inverse = 0x0, - UART_Rxd_Inverse = UART_RXD_INV, - UART_CTS_Inverse = UART_CTS_INV, - UART_Txd_Inverse = UART_TXD_INV, - UART_RTS_Inverse = UART_RTS_INV, -} UART_LineLevelInverse; - - -typedef enum { - BIT_RATE_300 = 300, - BIT_RATE_600 = 600, - BIT_RATE_1200 = 1200, - BIT_RATE_2400 = 2400, - BIT_RATE_4800 = 4800, - BIT_RATE_9600 = 9600, - BIT_RATE_19200 = 19200, - BIT_RATE_38400 = 38400, - BIT_RATE_57600 = 57600, - BIT_RATE_74880 = 74880, - BIT_RATE_115200 = 115200, - BIT_RATE_230400 = 230400, - BIT_RATE_460800 = 460800, - BIT_RATE_921600 = 921600, - BIT_RATE_1843200 = 1843200, - BIT_RATE_3686400 = 3686400, -} UartBautRate; - -typedef enum { - NONE_CTRL, - HARDWARE_CTRL, - XON_XOFF_CTRL -} UartFlowCtrl; - -typedef enum { - USART_HardwareFlowControl_None = 0x0, - USART_HardwareFlowControl_RTS = 0x1, - USART_HardwareFlowControl_CTS = 0x2, - USART_HardwareFlowControl_CTS_RTS = 0x3 -} UART_HwFlowCtrl; - -typedef enum { - EMPTY, - UNDER_WRITE, - WRITE_OVER -} RcvMsgBuffState; - -typedef struct { - uint32 RcvBuffSize; - uint8 *pRcvMsgBuff; - uint8 *pWritePos; - uint8 *pReadPos; - uint8 TrigLvl; //JLU: may need to pad - RcvMsgBuffState BuffState; -} RcvMsgBuff; - -typedef struct { - uint32 TrxBuffSize; - uint8 *pTrxBuff; -} TrxMsgBuff; - -typedef enum { - BAUD_RATE_DET, - WAIT_SYNC_FRM, - SRCH_MSG_HEAD, - RCV_MSG_BODY, - RCV_ESC_CHAR, -} RcvMsgState; - -typedef struct { - UartBautRate baut_rate; - UartBitsNum4Char data_bits; - UartExistParity exist_parity; - UartParityMode parity; - UartStopBitsNum stop_bits; - UartFlowCtrl flow_ctrl; - RcvMsgBuff rcv_buff; - TrxMsgBuff trx_buff; - RcvMsgState rcv_state; - int received; - int buff_uart_no; //indicate which uart use tx/rx buffer -} UartDevice; - -void uart_init(UartBautRate uart0_br, UartBautRate uart1_br); - -/////////////////////////////////////// -#define UART_FIFO_LEN 128 //define the tx fifo length -#define UART_TX_EMPTY_THRESH_VAL 0x10 - - -typedef enum { - RUN = 0, - BLOCK = 1, -} TCPState; - - -//============================================== -#define FUNC_UART0_CTS 4 -#define FUNC_U0CTS 4 -#define FUNC_U1TXD_BK 2 -#define UART_LINE_INV_MASK (0x3f<<19) -void UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len); -void UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num); -void UART_SetLineInverse(uint8 uart_no, UART_LineLevelInverse inverse_mask); -void UART_SetParity(uint8 uart_no, UartParityMode Parity_mode); -void UART_SetBaudrate(uint8 uart_no, uint32 baud_rate); -void UART_SetFlowCtrl(uint8 uart_no, UART_HwFlowCtrl flow_ctrl, uint8 rx_thresh); -void UART_WaitTxFifoEmpty(uint8 uart_no, uint32 time_out_us); //do not use if tx flow control enabled -void UART_ResetFifo(uint8 uart_no); -void UART_ClearIntrStatus(uint8 uart_no, uint32 clr_mask); -void UART_SetIntrEna(uint8 uart_no, uint32 ena_mask); -void UART_SetPrintPort(uint8 uart_no); -bool UART_CheckOutputFinished(uint8 uart_no, uint32 time_out_us); -//============================================== - -// Buffer functions -uint16 rx_buff_deq(char* pdata, uint16 data_len); -void tx_buff_enq(char* pdata, uint16 data_len); - -#endif - diff --git a/user/user_main.c b/user/user_main.c index 49ab732..c51b3f5 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -94,13 +94,11 @@ void ICACHE_FLASH_ATTR user_init(void) wifi_set_opmode(NULL_MODE); // saves to flash if changed - this might avoid the current spike on startup? printf("\r\n"); - banner("====== ESP8266 Remote Terminal ======"); + banner("====== ESPTerm ======"); banner_info("Firmware (c) Ondrej Hruska, 2017"); - banner_info("github.com/MightyPork/esp-vt100-firmware"); + banner_info(TERMINAL_GITHUB_REPO); banner_info(""); - banner_info("Version " FIRMWARE_VERSION ", built " __DATE__ " at " __TIME__); - banner_info(""); - banner_info("Department of Measurement, CTU Prague"); + banner_info("Version "FIRMWARE_VERSION", built " __DATE__ " at " __TIME__); printf("\r\n"); ioInit();