From fb5c9e1e29830dd67f8cdeeee793e2cbdf2f9696 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 30 Dec 2023 11:37:56 -0600 Subject: [PATCH] Begin integration of hapStream into HAP.ccp --- src/HAP.cpp | 148 +++++++++++++++++++++++++++++++++-------------- src/HAP.h | 30 ++++++++++ src/HomeSpan.cpp | 3 + src/HomeSpan.h | 22 ------- src/Streamer.cpp | 107 +++++++++++++++++----------------- 5 files changed, 189 insertions(+), 121 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index 9e9e47e..bfb8313 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1129,11 +1129,7 @@ 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); +int HAPClient::getStatusURL(){ char clocktime[33]; @@ -1156,79 +1152,81 @@ int HAPClient::getStatusURL(){ LOG2("\n>>>>>>>>>> %s >>>>>>>>>>\n",client.remoteIP().toString().c_str()); - 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"; + hapStream.setHapClient(this); + + hapOut << "HTTP/1.1 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n"; + hapOut << "" << homeSpan.displayName << "\n"; + hapOut << "\n"; + hapOut << "

" << homeSpan.displayName << "

\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "
Up Time:" << uptime << "
Current Time:" << clocktime << "
Boot Time:" << homeSpan.webLog.bootTime << "
Reset Reason:"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << " (" << esp_reset_reason() << ")\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; - out << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; + hapOut << "\n"; char mbtlsv[64]; mbedtls_version_get_string_full(mbtlsv); - out << "\n"; + hapOut << "\n"; - out << "\n"; - out << "\n"; + hapOut << "\n"; + hapOut << "\n"; - out << "
Up Time:" << uptime << "
Current Time:" << clocktime << "
Boot Time:" << homeSpan.webLog.bootTime << "
Reset Reason:"; switch(esp_reset_reason()) { case ESP_RST_UNKNOWN: - out << "Cannot be determined"; + hapOut << "Cannot be determined"; break; case ESP_RST_POWERON: - out << "Power-on event"; + hapOut << "Power-on event"; break; case ESP_RST_EXT: - out << "External pin"; + hapOut << "External pin"; break; case ESP_RST_SW: - out << "Software reboot via esp_restart"; + hapOut << "Software reboot via esp_restart"; break; case ESP_RST_PANIC: - out << "Software Exception/Panic"; + hapOut << "Software Exception/Panic"; break; case ESP_RST_INT_WDT: - out << "Interrupt watchdog"; + hapOut << "Interrupt watchdog"; break; case ESP_RST_TASK_WDT: - out << "Task watchdog"; + hapOut << "Task watchdog"; break; case ESP_RST_WDT: - out << "Other watchdogs"; + hapOut << "Other watchdogs"; break; case ESP_RST_DEEPSLEEP: - out << "Exiting deep sleep mode"; + hapOut << "Exiting deep sleep mode"; break; case ESP_RST_BROWNOUT: - out << "Brownout"; + hapOut << "Brownout"; break; case ESP_RST_SDIO: - out << "SDIO"; + hapOut << "SDIO"; break; default: - out << "Unknown Reset Code"; + hapOut << "Unknown Reset Code"; } - out << " (" << esp_reset_reason() << ")
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() << "
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:" << mbtlsv << "
MbedTLS Version:" << mbtlsv << "
HomeKit Status:" << (HAPClient::nAdminControllers()?"PAIRED":"NOT PAIRED") << "
Max Log Entries:" << homeSpan.webLog.maxEntries << "
HomeKit Status:" << (HAPClient::nAdminControllers()?"PAIRED":"NOT PAIRED") << "
Max Log Entries:" << homeSpan.webLog.maxEntries << "
\n"; - out << "

"; + hapOut << "
\n"; + hapOut << "

"; if(homeSpan.webLog.maxEntries>0){ - out << "\n"; + hapOut << "
EntryUp TimeLog TimeClientMessage
\n"; int lastIndex=homeSpan.webLog.nEntries-homeSpan.webLog.maxEntries; if(lastIndex<0) lastIndex=0; @@ -1247,12 +1245,12 @@ int HAPClient::getStatusURL(){ else sprintf(clocktime,"Unknown"); - out << "\n"; + hapOut << "\n"; } - out << "
EntryUp TimeLog TimeClientMessage
" << i+1 << "" << uptime << "" << clocktime << "" << homeSpan.webLog.log[index].clientIP << "" << homeSpan.webLog.log[index].message << "
" << i+1 << "" << uptime << "" << clocktime << "" << homeSpan.webLog.log[index].clientIP << "" << homeSpan.webLog.log[index].message << "
\n"; + hapOut << "\n"; } - out << "" << std::endl; + hapOut << "" << std::endl; LOG2("------------ SENT! --------------\n"); @@ -1607,6 +1605,7 @@ void HAPClient::saveControllers(){ } +////////////////////////////////////// ////////////////////////////////////// Nonce::Nonce(){ @@ -1633,6 +1632,65 @@ void Nonce::inc(){ x[5]++; } +////////////////////////////////////// +////////////////////////////////////// + +StreamBuffer::StreamBuffer(){ + + buffer=(char *)HS_MALLOC(bufSize); + setp(buffer, buffer+bufSize-1); +} + +////////////////////////////////////// + +StreamBuffer::~StreamBuffer(){ + + sync(); + free(buffer); +} + +////////////////////////////////////// + +int StreamBuffer::flushBuffer(){ + int num=pptr()-pbase(); + + if(logLevel<=homeSpan.getLogLevel()){ + write(1,buffer,num); + } + + if(hapClient!=NULL){ + hapClient->client.write(buffer,num); + } + + delay(1); + + pbump(-num); + return(num); +} + +////////////////////////////////////// + +StreamBuffer::int_type StreamBuffer::overflow(StreamBuffer::int_type c){ + + if(c!=EOF){ + *pptr() = c; + pbump(1); + } + + if(flushBuffer()==EOF) + return(EOF); + return(c); +} + +////////////////////////////////////// + +int StreamBuffer::sync(){ + + if(flushBuffer()==EOF) + return(-1); + return(0); +} + ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// diff --git a/src/HAP.h b/src/HAP.h index 44815b3..db43189 100644 --- a/src/HAP.h +++ b/src/HAP.h @@ -27,6 +27,7 @@ #pragma once +#include #include #include "HomeSpan.h" @@ -178,7 +179,36 @@ struct HAPClient { }; +///////////////////////////////////////////////// +// StreamBuffer Structure + +class StreamBuffer : public std::streambuf { + + private: + + const size_t bufSize=1024; + char *buffer; + HAPClient *hapClient=NULL; + int logLevel=0; + boolean enablePrettyPrint=false; + + int flushBuffer() ; + int_type overflow(int_type c) override; + int sync() override; + + public: + + StreamBuffer(); + ~StreamBuffer(); + + StreamBuffer& setHapClient(HAPClient *hapClient){this->hapClient=hapClient;return(*this);} + StreamBuffer& setLogLevel(int logLevel){this->logLevel=logLevel;return(*this);} + StreamBuffer& prettyPrint(){enablePrettyPrint=true;return(*this);} +}; + ///////////////////////////////////////////////// // Extern Variables extern HAPClient **hap; +extern std::ostream hapOut; +extern StreamBuffer hapStream; diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 462b60c..0be3256 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -45,6 +45,9 @@ const __attribute__((section(".rodata_custom_desc"))) SpanPartition spanPartitio using namespace Utils; +StreamBuffer hapStream; +std::ostream hapOut(&hapStream); + HAPClient **hap; // HAP Client structure containing HTTP client connections, parsing routines, and state variables (global-scoped variable) Span homeSpan; // HAP Attributes database and all related control functions for this Accessory (global-scoped variable) HapCharacteristics hapChars; // Instantiation of all HAP Characteristics (used to create SpanCharacteristics) diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 14d5fe5..e3be0a6 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -68,27 +67,6 @@ enum { GET_VALUE=128 }; -/////////////////////////////// - -class StreamBuffer : public std::streambuf { - - private: - - char *buffer; - WiFiClient *client; - - int flushBuffer() ; - int_type overflow(int_type c) override; - int sync() override; - - public: - - StreamBuffer(WiFiClient *client, size_t bufSize=1024); - ~StreamBuffer(); - -}; - - /////////////////////////////// template diff --git a/src/Streamer.cpp b/src/Streamer.cpp index 3e1646f..8d1e98e 100644 --- a/src/Streamer.cpp +++ b/src/Streamer.cpp @@ -24,58 +24,57 @@ * SOFTWARE. * ********************************************************************************/ - -#include "HomeSpan.h" - -StreamBuffer::StreamBuffer(WiFiClient *client, size_t bufSize){ - - this->client=client; - buffer=(char *)HS_MALLOC(bufSize); - setp (buffer, buffer+bufSize-1); -} -////////////////////////////////////// - -StreamBuffer::~StreamBuffer(){ - - free(buffer); - sync(); -} - -////////////////////////////////////// - -int StreamBuffer::flushBuffer(){ - int num=pptr()-pbase(); - - write(1,buffer,num); - client->write(buffer,num); - delay(1); - - pbump(-num); - return num; -} - -////////////////////////////////////// - -StreamBuffer::int_type StreamBuffer::overflow(StreamBuffer::int_type c){ - - if(c!=EOF){ - *pptr() = c; - pbump(1); - } - - if(flushBuffer()==EOF) - return EOF; - return c; -} - -////////////////////////////////////// - -int StreamBuffer::sync(){ - - if(flushBuffer()==EOF) - return -1; - return 0; -} - -////////////////////////////////////// +//#include "HAP.h" +// +//StreamBuffer::StreamBuffer(){ +// +// buffer=(char *)HS_MALLOC(bufSize); +// setp(buffer, buffer+bufSize-1); +//} +// +//////////////////////////////////////// +// +//StreamBuffer::~StreamBuffer(){ +// +// free(buffer); +// sync(); +//} +// +//////////////////////////////////////// +// +//int StreamBuffer::flushBuffer(){ +// int num=pptr()-pbase(); +// +// write(1,buffer,num); +// client->write(buffer,num); +// delay(1); +// +// pbump(-num); +// return num; +//} +// +//////////////////////////////////////// +// +//StreamBuffer::int_type StreamBuffer::overflow(StreamBuffer::int_type c){ +// +// if(c!=EOF){ +// *pptr() = c; +// pbump(1); +// } +// +// if(flushBuffer()==EOF) +// return EOF; +// return c; +//} +// +//////////////////////////////////////// +// +//int StreamBuffer::sync(){ +// +// if(flushBuffer()==EOF) +// return -1; +// return 0; +//} +// +////////////////////////////////////////