From f3e98601b0329f4babda57f543a61747a920dbfc Mon Sep 17 00:00:00 2001 From: Gregg Date: Fri, 29 Dec 2023 22:19:49 -0600 Subject: [PATCH] Initial test of StreamBuffer added to WebLog --- src/HAP.cpp | 107 +++++++++++++++++++++++----------------------------- src/Utils.h | 62 ++++++++++++++++++++++++++++++ src/src.ino | 3 +- 3 files changed, 111 insertions(+), 61 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index abcd6f4..9e9e47e 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1131,6 +1131,10 @@ int HAPClient::putPrepareURL(char *json){ int HAPClient::getStatusURL(){ +// StreamBuffer *sBuf = new StreamBuffer(&client); // create buffered stream that will output to screen and client + StreamBuffer sBuf(&client); + std::ostream out(&sBuf); + char clocktime[33]; if(homeSpan.webLog.timeInit){ @@ -1150,86 +1154,81 @@ int HAPClient::getStatusURL(){ sprintf(uptime,"%d:%02d:%02d:%02d",days,hours,mins,secs); - String response="HTTP/1.1 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n"; + LOG2("\n>>>>>>>>>> %s >>>>>>>>>>\n",client.remoteIP().toString().c_str()); - response+="" + String(homeSpan.displayName) + "\n"; - response+="\n"; - response+="

" + String(homeSpan.displayName) + "

\n"; + out << "HTTP/1.1 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n"; + out << "" << homeSpan.displayName << "\n"; + out << "\n"; + out << "

" << homeSpan.displayName << "

\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; + out << "
Up Time:" + String(uptime) + "
Current Time:" + String(clocktime) + "
Boot Time:" + String(homeSpan.webLog.bootTime) + "
\n"; + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; - response+="\n"; + out << " (" << esp_reset_reason() << ")\n"; + + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; + out << "\n"; char mbtlsv[64]; mbedtls_version_get_string_full(mbtlsv); - response+="\n"; + out << "\n"; - response+="\n"; - response+="\n"; + out << "\n"; + out << "\n"; - if(homeSpan.weblogCallback) - homeSpan.weblogCallback(response); - - response+="
Up Time:" << uptime << "
Current Time:" << clocktime << "
Boot Time:" << homeSpan.webLog.bootTime << "
Reset Reason:"; - response+="
Reset Reason:"; switch(esp_reset_reason()) { case ESP_RST_UNKNOWN: - response += "Cannot be determined"; + out << "Cannot be determined"; break; case ESP_RST_POWERON: - response += "Power-on event"; + out << "Power-on event"; break; case ESP_RST_EXT: - response += "External pin"; + out << "External pin"; break; case ESP_RST_SW: - response += "Software reboot via esp_restart"; + out << "Software reboot via esp_restart"; break; case ESP_RST_PANIC: - response += "Software Exception/Panic"; + out << "Software Exception/Panic"; break; case ESP_RST_INT_WDT: - response += "Interrupt watchdog"; + out << "Interrupt watchdog"; break; case ESP_RST_TASK_WDT: - response += "Task watchdog"; + out << "Task watchdog"; break; case ESP_RST_WDT: - response += "Other watchdogs"; + out << "Other watchdogs"; break; case ESP_RST_DEEPSLEEP: - response += "Exiting deep sleep mode"; + out << "Exiting deep sleep mode"; break; case ESP_RST_BROWNOUT: - response += "Brownout"; + out << "Brownout"; break; case ESP_RST_SDIO: - response += "SDIO"; + out << "SDIO"; break; default: - response += "Unknown Reset Code"; + out << "Unknown Reset Code"; } - response+=" (" + String(esp_reset_reason()) + ")
WiFi Disconnects:" + String(homeSpan.connected/2) + "
WiFi Signal:" + String(WiFi.RSSI()) + " dBm
WiFi Gateway:" + WiFi.gatewayIP().toString() + "
ESP32 Board:" + String(ARDUINO_BOARD) + "
Arduino-ESP Version:" + String(ARDUINO_ESP_VERSION) + "
ESP-IDF Version:" + String(ESP_IDF_VERSION_MAJOR) + "." + String(ESP_IDF_VERSION_MINOR) + "." + String(ESP_IDF_VERSION_PATCH) + "
HomeSpan Version:" + String(HOMESPAN_VERSION) + "
Sketch Version:" + String(homeSpan.getSketchVersion()) + "
Sodium Version:" + String(sodium_version_string()) + " Lib " + String(sodium_library_version_major()) + "." + String(sodium_library_version_minor()) +"
WiFi Disconnects:" << homeSpan.connected/2 << "
WiFi Signal:" << (int)WiFi.RSSI() << " dBm
WiFi Gateway:" << WiFi.gatewayIP().toString().c_str() << "
ESP32 Board:" << ARDUINO_BOARD << "
Arduino-ESP Version:" << ARDUINO_ESP_VERSION << "
ESP-IDF Version:" << ESP_IDF_VERSION_MAJOR << "." << ESP_IDF_VERSION_MINOR << "." << ESP_IDF_VERSION_PATCH << "
HomeSpan Version:" << HOMESPAN_VERSION << "
Sketch Version:" << homeSpan.getSketchVersion() << "
Sodium Version:" << sodium_version_string() << " Lib " << sodium_library_version_major() << "." << sodium_library_version_minor() << "
MbedTLS Version:" + String(mbtlsv) + "
MbedTLS Version:" << mbtlsv << "
HomeKit Status:" + String(HAPClient::nAdminControllers()?"PAIRED":"NOT PAIRED") + "
Max Log Entries:" + String(homeSpan.webLog.maxEntries) + "
HomeKit Status:" << (HAPClient::nAdminControllers()?"PAIRED":"NOT PAIRED") << "
Max Log Entries:" << homeSpan.webLog.maxEntries << "
\n"; - response+="

"; - - LOG2("\n>>>>>>>>>> "); - LOG2(client.remoteIP()); - LOG2(" >>>>>>>>>>\n"); + out << "\n"; + out << "

"; if(homeSpan.webLog.maxEntries>0){ - response+="\n"; + out << "
EntryUp TimeLog TimeClientMessage
\n"; int lastIndex=homeSpan.webLog.nEntries-homeSpan.webLog.maxEntries; if(lastIndex<0) lastIndex=0; @@ -1248,28 +1247,16 @@ int HAPClient::getStatusURL(){ else sprintf(clocktime,"Unknown"); - response+="\n"; - - if(response.length()>1024){ // if response grows too big, transmit chunk and reset - LOG2(response); - client.print(response); - delay(1); // slight pause seems to be required - response.clear(); - } + out << "\n"; } - response+="
EntryUp TimeLog TimeClientMessage
" + String(i+1) + "" + String(uptime) + "" + String(clocktime) + "" + homeSpan.webLog.log[index].clientIP + "" + String(homeSpan.webLog.log[index].message) + "
" << i+1 << "" << uptime << "" << clocktime << "" << homeSpan.webLog.log[index].clientIP << "" << homeSpan.webLog.log[index].message << "
\n"; + out << "\n"; } - response+=""; + out << "" << std::endl; - LOG2(response); - LOG2("\n"); - client.print(response); LOG2("------------ SENT! --------------\n"); - delay(1); - client.stop(); - + client.stop(); return(1); } diff --git a/src/Utils.h b/src/Utils.h index fce5791..7b0149d 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -27,6 +27,9 @@ #pragma once +#include +#include + #include #include @@ -49,6 +52,65 @@ String mask(char *c, int n); // simply utility that creates a String fr } +///////////////////////////////////////////////// + +class StreamBuffer : public std::streambuf { + + protected: + + char *buffer; + WiFiClient *client; + + public: + + StreamBuffer(WiFiClient *client, size_t bufSize=1024){ + this->client=client; + buffer=(char *)HS_MALLOC(bufSize); + setp (buffer, buffer+bufSize-1); + } + + virtual ~StreamBuffer() { + free(buffer); + sync(); + } + + protected: + + int flushBuffer(){ + int num=pptr()-pbase(); + +// if(write(1,buffer,num)!=num) +// return EOF; + + write(1,buffer,num); + client->write(buffer,num); + delay(1); + + pbump(-num); + return num; + } + + virtual int_type overflow(int_type c){ // buffer is full + if(c!=EOF){ + *pptr() = c; + pbump(1); + } + + if(flushBuffer()==EOF) + return EOF; + + return c; + } + + virtual int sync(){ + if(flushBuffer()==EOF) + return -1; + + return 0; + } + +}; + ///////////////////////////////////////////////// // Creates a temporary buffer that is freed after // going out of scope diff --git a/src/src.ino b/src/src.ino index 7ed3389..2eb556f 100644 --- a/src/src.ino +++ b/src/src.ino @@ -33,7 +33,8 @@ void setup() { Serial.begin(115200); - homeSpan.setLogLevel(2); // .setPairingCode("33344456"); + homeSpan.setLogLevel(2); + homeSpan.enableWebLog(200); homeSpan.begin(Category::Lighting,"HomeSpan Max");