#include #include "uart.h" #include "cgi.h" #include "console.h" // Microcontroller console capturing the last 1024 characters received on the uart so // they can be shown on a web page // Buffer to hold concole contents. // Invariants: // - console_rd==console_wr <=> buffer empty // - *console_rd == next char to read // - *console_wr == next char to write // - 0 <= console_xx < BUF_MAX // - (console_wr+1)%BUF_MAX) == console_rd <=> buffer full #define BUF_MAX (1024) static char console_buf[BUF_MAX]; static int console_wr, console_rd; static int console_pos; // offset since reset of buffer static void ICACHE_FLASH_ATTR console_write(char c) { console_buf[console_wr] = c; console_wr = (console_wr+1) % BUF_MAX; if (console_wr == console_rd) { // full, we write anyway and loose the oldest char console_rd = (console_rd+1) % BUF_MAX; // full, eat first char console_pos++; } } // return previous character in console, 0 if at start static char ICACHE_FLASH_ATTR console_prev(void) { if (console_wr == console_rd) return 0; return console_buf[(console_wr-1+BUF_MAX)%BUF_MAX]; } void ICACHE_FLASH_ATTR console_write_char(char c) { if (c == '\n' && console_prev() != '\r') console_write('\r'); console_write(c); } //===== Display a web page with the console int ICACHE_FLASH_ATTR tplConsole(HttpdConnData *connData, char *token, void **arg) { if (token==NULL) return HTTPD_CGI_DONE; if (os_strcmp(token, "console") == 0) { if (console_wr > console_rd) { httpdSend(connData, console_buf+console_rd, console_wr-console_rd); } else if (console_rd != console_wr) { httpdSend(connData, console_buf+console_rd, BUF_MAX-console_rd); httpdSend(connData, console_buf, console_wr); } else { httpdSend(connData, "", -1); } } else if (os_strcmp(token, "head")==0) { printHead(connData); } else { httpdSend(connData, "Unknown\n", -1); } return HTTPD_CGI_DONE; } void ICACHE_FLASH_ATTR consoleInit() { console_wr = 0; console_rd = 0; }