#include #include "uart_driver.h" #include "uart_handler.h" #include "ansi_parser.h" #include "syscfg.h" static char logbuf[DEBUG_LOGBUF_SIZE]; static u32 lb_nw = 1; static u32 lb_ls = 0; static ETSTimer flushLogTimer; static void buf_putc(char c) { if (sysconf->gpio2_conf == GPIOCONF_OFF) { if (lb_ls != lb_nw) { logbuf[lb_nw++] = c; if (lb_nw >= DEBUG_LOGBUF_SIZE) lb_nw = 0; } } } static void ICACHE_FLASH_ATTR buf_pop(void *unused) { u32 quantity = 16; u32 old_ls; while (quantity > 0) { // stop when done if ((lb_ls == lb_nw-1) || (lb_ls == DEBUG_LOGBUF_SIZE-1 && lb_nw == 0)) break; old_ls = lb_ls; lb_ls++; if (lb_ls >= DEBUG_LOGBUF_SIZE) lb_ls = 0; if (OK == UART_WriteCharCRLF(UART1, logbuf[lb_ls], 5)) { quantity--; } else { // try another time lb_ls = old_ls; break; } } } LOCAL void my_putc(char c) { if (sysconf->gpio2_conf == GPIOCONF_OFF) { UART_WriteCharCRLF(UART1, (u8) c, 200); } } /** * Init the serial ports */ void ICACHE_FLASH_ATTR serialInitBase(void) { UART_Init(); // debug port UART_SetParity(UART1, PARITY_NONE); UART_SetStopBits(UART1, ONE_STOP_BIT); UART_SetBaudrate(UART1, BIT_RATE_115200); UART_SetPrintPort(UART1); #if ASYNC_LOG os_install_putc1(buf_putc); #else os_install_putc1(my_putc); #endif UART_SetupAsyncReceiver(); // 1 ms timer os_timer_disarm(&flushLogTimer); os_timer_setfn(&flushLogTimer, buf_pop, NULL); //os_timer_arm(&flushLogTimer, 1, 1); ets_timer_arm_new(&flushLogTimer, 1, 500, 0); // us timer } /** * Init the serial ports */ void ICACHE_FLASH_ATTR serialInit(void) { UART_SetParity(UART0, (UartParityMode) sysconf->uart_parity); UART_SetStopBits(UART0, (UartStopBitsNum) sysconf->uart_stopbits); UART_SetBaudrate(UART0, sysconf->uart_baudrate); // GPIO2 may be used as a remotely controlled GPIO if (sysconf->gpio2_conf == GPIOCONF_OFF) { PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK); } else { PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); // further config of the GPIO will be done in persist.c after calling this func } info("COM SERIAL: %d baud, %s parity, %s stopbit(s)", sysconf->uart_baudrate, (sysconf->uart_parity == PARITY_NONE ? "NONE" : (sysconf->uart_parity == PARITY_ODD ? "ODD" : "EVEN")), (sysconf->uart_stopbits == ONE_STOP_BIT ? "1" : (sysconf->uart_stopbits == ONE_HALF_STOP_BIT ? "1.5" : "2")) ); } /** * Handle a byte received from UART. * Might do some buffering here maybe * * @param c */ void ICACHE_FLASH_ATTR UART_HandleRxByte(char c) { ansi_parser(c); system_soft_wdt_feed(); // so we survive long torrents }