#include #include "uart.h" #include "cgi.h" #include "log.h" // Web log for the esp8266 to replace outputting to uart1. // The web log has a 1KB circular in-memory buffer which os_printf prints into and // the HTTP handler simply displays the buffer content on a web page. #define BUF_MAX (1024) static char log_buf[BUF_MAX]; static int log_wr, log_rd; static bool log_no_uart; // start out printing to uart static bool log_newline; // at start of a new line void ICACHE_FLASH_ATTR log_uart(bool enable) { if (!enable && !log_no_uart) { os_printf("Turning OFF uart log\n"); os_delay_us(4*1000L); // time for uart to flush log_no_uart = !enable; } else if (enable && log_no_uart) { log_no_uart = !enable; os_printf("Turning ON uart log\n"); } } static void ICACHE_FLASH_ATTR log_write(char c) { int wr = (log_wr+1)%BUF_MAX; if (wr == log_rd) log_rd = (log_rd+1) % BUF_MAX; // full, eat first char log_buf[log_wr] = c; log_wr = wr; } #if 0 static char ICACHE_FLASH_ATTR log_read(void) { char c = 0; if (log_rd != log_wr) { c = log_buf[log_rd]; log_rd = (log_rd+1) % BUF_MAX; } return c; } #endif static void ICACHE_FLASH_ATTR log_write_char(char c) { // Uart output unless disabled if (!log_no_uart) { if (log_newline) { uart0_write_char('>'); uart0_write_char(' '); log_newline = false; } uart0_write_char(c); log_newline = c == '\n'; } // Store in log buffer if (c == '\n') log_write('\r'); log_write(c); } //===== Display a web page with the log int ICACHE_FLASH_ATTR tplLog(HttpdConnData *connData, char *token, void **arg) { if (token==NULL) return HTTPD_CGI_DONE; if (os_strcmp(token, "log") == 0) { if (log_wr > log_rd) { httpdSend(connData, log_buf+log_rd, log_wr-log_rd); } else if (log_rd != log_wr) { httpdSend(connData, log_buf+log_rd, BUF_MAX-log_rd); httpdSend(connData, log_buf, log_wr); } } else if (os_strcmp(token, "head")==0) { printHead(connData); } else { httpdSend(connData, "Unknown\n", -1); } return HTTPD_CGI_DONE; } void ICACHE_FLASH_ATTR logInit() { log_wr = 0; log_rd = 0; os_install_putc1((void *)log_write_char); }