diff --git a/ConfigFile.cpp b/ConfigFile.cpp index d64bde4..9be2730 100644 --- a/ConfigFile.cpp +++ b/ConfigFile.cpp @@ -483,7 +483,7 @@ bool ShadeConfigFile::validate() { if(this->header.version >= 21) { recs = 0; while(recs < this->header.repeaterRecords) { - uint32_t pos = this->file.position(); + //uint32_t pos = this->file.position(); if(!this->seekChar(CFG_REC_END)) { Serial.printf("Failed to find the repeater record end %d\n", recs); } @@ -757,7 +757,7 @@ bool ShadeConfigFile::readGroupRecord(SomfyGroup *group) { bool ShadeConfigFile::readRepeaterRecord(SomfyShadeController *s) { uint32_t startPos = this->file.position(); - for(uint8_t i; i < SOMFY_MAX_REPEATERS; i++) { + for(uint8_t i = 0; i < SOMFY_MAX_REPEATERS; i++) { s->linkRepeater(this->readUInt32(0)); } if(this->file.position() != startPos + this->header.repeaterRecordSize) { diff --git a/Network.cpp b/Network.cpp index 61db484..9b8bd11 100644 --- a/Network.cpp +++ b/Network.cpp @@ -17,6 +17,7 @@ extern rebootDelay_t rebootDelay; extern Network net; static bool _apScanning = false; +static uint32_t _lastHeap = 0; int connectRetries = 0; void Network::end() { sockEmit.end(); @@ -147,6 +148,7 @@ bool Network::changeAP(const uint8_t *bssid, const int32_t channel) { return false; } void Network::emitSockets() { + this->emitHeap(); if(this->needsBroadcast || (this->connType == conn_types::wifi && (abs(abs(WiFi.RSSI()) - abs(this->lastRSSI)) > 1 || WiFi.channel() != this->lastChannel))) { this->emitSockets(255); @@ -222,6 +224,7 @@ void Network::emitSockets(uint8_t num) { this->lastChannel = -1; } } + this->emitHeap(num); } void Network::setConnected(conn_types connType) { this->connType = connType; @@ -331,7 +334,7 @@ void Network::setConnected(conn_types connType) { if(strlen(settings.chipModel) == 0) SSDP.setModelNumber(0, "ESP32"); else { char sModel[20] = ""; - snprintf(sModel, sizeof(sModel), "ESP32-%S", settings.chipModel); + snprintf(sModel, sizeof(sModel), "ESP32-%s", settings.chipModel); SSDP.setModelNumber(0, sModel); } SSDP.setModelURL(0, "https://github.com/rstrouse/ESPSomfy-RTS"); @@ -744,3 +747,15 @@ void Network::networkEvent(WiFiEvent_t event) { break; } } +void Network::emitHeap(uint8_t num) { + if(num != 255 || this->needsBroadcast || ESP.getMaxAllocHeap() != _lastHeap) { + _lastHeap = ESP.getMaxAllocHeap(); + JsonSockEvent *json = sockEmit.beginEmit("memStatus"); + json->beginObject(); + json->addElem("max", _lastHeap); + json->addElem("free", ESP.getFreeHeap()); + json->addElem("min", ESP.getMinFreeHeap()); + json->endObject(); + sockEmit.endEmit(num); + } +} diff --git a/Network.h b/Network.h index d9ab868..5794433 100644 --- a/Network.h +++ b/Network.h @@ -39,6 +39,7 @@ class Network { void end(); void emitSockets(); void emitSockets(uint8_t num); + void emitHeap(uint8_t num = 255); uint32_t getChipId(); static void networkEvent(WiFiEvent_t event); }; diff --git a/SSDP.cpp b/SSDP.cpp index 7e45612..e8c871d 100644 --- a/SSDP.cpp +++ b/SSDP.cpp @@ -32,7 +32,7 @@ static const char _ssdp_bye_template[] PROGMEM = "NTS: ssdp:byebye\r\n" "NT: %s\r\n" "USN: %s\r\n" - "BOOTID.UPNP.ORG: %ul\r\n" + "BOOTID.UPNP.ORG: %lu\r\n" "CONFIGID.UPNP.ORG: %d\r\n" "\r\n"; static const char _ssdp_packet_template[] PROGMEM = @@ -42,7 +42,7 @@ static const char _ssdp_packet_template[] PROGMEM = "USN: %s\r\n" // _uuid "%s: %s\r\n" // "NT" or "ST", _deviceType "LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, _schemaURL - "BOOTID.UPNP.ORG: %ul\r\n" + "BOOTID.UPNP.ORG: %lu\r\n" "CONFIGID.UPNP.ORG: %d\r\n" "\r\n"; static const char _ssdp_device_schema_template[] PROGMEM = @@ -160,7 +160,7 @@ void UPNPDeviceType::setChipId(uint32_t chipId) { (uint16_t)((chipId >> 8) & 0xff), (uint16_t)chipId & 0xff); } -SSDPClass::SSDPClass():sendQueue{false, INADDR_NONE, 0, nullptr, false, 0, ""} {} +SSDPClass::SSDPClass():sendQueue{false, INADDR_NONE, 0, nullptr, false, 0, "", response_types_t::root} {} SSDPClass::~SSDPClass() { end(); } bool SSDPClass::begin() { for(int i = 0; i < SSDP_QUEUE_SIZE; i++) { @@ -407,7 +407,7 @@ void SSDPClass::_sendResponse(IPAddress addr, uint16_t port, UPNPDeviceType *d, strcpy_P(pbuff, _ssdp_response_template); // Don't use ip.toString as this fragments the heap like no tomorrow. - int len = snprintf_P(buffer, sizeof(buffer)-1, + snprintf_P(buffer, sizeof(buffer)-1, _ssdp_packet_template, pbuff, this->_interval, diff --git a/Sockets.cpp b/Sockets.cpp index 49c1452..ab028f8 100644 --- a/Sockets.cpp +++ b/Sockets.cpp @@ -175,7 +175,7 @@ JsonSockEvent *SocketEmitter::beginEmit(const char *evt) { this->json.beginEvent(&sockServer, evt, g_response, sizeof(g_response)); return &this->json; } -void SocketEmitter::endEmit(uint8_t num) { this->json.endEvent(num); } +void SocketEmitter::endEmit(uint8_t num) { sockServer.loop(); this->json.endEvent(num); } void SocketEmitter::endEmitRoom(uint8_t room) { if(room < SOCK_MAX_ROOMS) { room_t *r = &this->rooms[room]; diff --git a/Somfy.cpp b/Somfy.cpp index f98176c..0371d09 100644 --- a/Somfy.cpp +++ b/Somfy.cpp @@ -3258,6 +3258,7 @@ void SomfyShade::toJSON(JsonResponse &json) { json.endArray(); } +/* bool SomfyShade::toJSON(JsonObject &obj) { //Serial.print("Serializing Shade:"); //Serial.print(this->getShadeId()); @@ -3310,17 +3311,20 @@ bool SomfyShade::toJSON(JsonObject &obj) { } return true; } +*/ bool SomfyRoom::fromJSON(JsonObject &obj) { if(obj.containsKey("name")) strlcpy(this->name, obj["name"], sizeof(this->name)); if(obj.containsKey("sortOrder")) this->sortOrder = obj["sortOrder"]; return true; } +/* bool SomfyRoom::toJSON(JsonObject &obj) { obj["roomId"] = this->roomId; obj["name"] = this->name; obj["sortOrder"] = this->sortOrder; return true; } +*/ void SomfyRoom::toJSON(JsonResponse &json) { json.addElem("roomId", this->roomId); json.addElem("name", this->name); @@ -3422,16 +3426,19 @@ bool SomfyGroup::toJSON(JsonObject &obj) { return true; } */ + void SomfyRemote::toJSON(JsonResponse &json) { json.addElem("remoteAddress", (uint32_t)this->getRemoteAddress()); json.addElem("lastRollingCode", (uint32_t)this->lastRollingCode); } +/* bool SomfyRemote::toJSON(JsonObject &obj) { //obj["remotePrefId"] = this->getRemotePrefId(); obj["remoteAddress"] = this->getRemoteAddress(); obj["lastRollingCode"] = this->lastRollingCode; return true; } +*/ void SomfyRemote::setRemoteAddress(uint32_t address) { this->m_remoteAddress = address; snprintf(this->m_remotePrefId, sizeof(this->m_remotePrefId), "_%lu", (unsigned long)this->m_remoteAddress); } uint32_t SomfyRemote::getRemoteAddress() { return this->m_remoteAddress; } void SomfyShadeController::processFrame(somfy_frame_t &frame, bool internal) { @@ -4571,13 +4578,14 @@ void Transceiver::toJSON(JsonResponse& json) { this->config.toJSON(json); json.endObject(); } - +/* bool Transceiver::toJSON(JsonObject& obj) { //Serial.println("Setting Transceiver Json"); JsonObject objConfig = obj.createNestedObject("config"); this->config.toJSON(objConfig); return true; } +*/ bool Transceiver::fromJSON(JsonObject& obj) { if (obj.containsKey("config")) { JsonObject objConfig = obj["config"]; @@ -4664,6 +4672,7 @@ void transceiver_config_t::toJSON(JsonResponse &json) { json.addElem("enabled", this->enabled); json.addElem("radioInit", this->radioInit); } +/* void transceiver_config_t::toJSON(JsonObject& obj) { obj["type"] = this->type; obj["TXPin"] = this->TXPin; @@ -4677,36 +4686,35 @@ void transceiver_config_t::toJSON(JsonObject& obj) { obj["deviation"] = this->deviation; // float obj["txPower"] = this->txPower; obj["proto"] = static_cast(this->proto); - /* - obj["internalCCMode"] = this->internalCCMode; - obj["modulationMode"] = this->modulationMode; - obj["channel"] = this->channel; - obj["channelSpacing"] = this->channelSpacing; // float - obj["dataRate"] = this->dataRate; // float - obj["syncMode"] = this->syncMode; - obj["syncWordHigh"] = this->syncWordHigh; - obj["syncWordLow"] = this->syncWordLow; - obj["addrCheckMode"] = this->addrCheckMode; - obj["checkAddr"] = this->checkAddr; - obj["dataWhitening"] = this->dataWhitening; - obj["pktFormat"] = this->pktFormat; - obj["pktLengthMode"] = this->pktLengthMode; - obj["pktLength"] = this->pktLength; - obj["useCRC"] = this->useCRC; - obj["autoFlushCRC"] = this->autoFlushCRC; - obj["disableDCFilter"] = this->disableDCFilter; - obj["enableManchester"] = this->enableManchester; - obj["enableFEC"] = this->enableFEC; - obj["minPreambleBytes"] = this->minPreambleBytes; - obj["pqtThreshold"] = this->pqtThreshold; - obj["appendStatus"] = this->appendStatus; - obj["printBuffer"] = somfy.transceiver.printBuffer; - */ + //obj["internalCCMode"] = this->internalCCMode; + //obj["modulationMode"] = this->modulationMode; + //obj["channel"] = this->channel; + //obj["channelSpacing"] = this->channelSpacing; // float + //obj["dataRate"] = this->dataRate; // float + //obj["syncMode"] = this->syncMode; + //obj["syncWordHigh"] = this->syncWordHigh; + //obj["syncWordLow"] = this->syncWordLow; + //obj["addrCheckMode"] = this->addrCheckMode; + //obj["checkAddr"] = this->checkAddr; + //obj["dataWhitening"] = this->dataWhitening; + //obj["pktFormat"] = this->pktFormat; + //obj["pktLengthMode"] = this->pktLengthMode; + //obj["pktLength"] = this->pktLength; + //obj["useCRC"] = this->useCRC; + //obj["autoFlushCRC"] = this->autoFlushCRC; + //obj["disableDCFilter"] = this->disableDCFilter; + //obj["enableManchester"] = this->enableManchester; + //obj["enableFEC"] = this->enableFEC; + //obj["minPreambleBytes"] = this->minPreambleBytes; + //obj["pqtThreshold"] = this->pqtThreshold; + //obj["appendStatus"] = this->appendStatus; + //obj["printBuffer"] = somfy.transceiver.printBuffer; obj["enabled"] = this->enabled; obj["radioInit"] = this->radioInit; //Serial.print("Serialize Radio JSON "); //Serial.printf("SCK:%u MISO:%u MOSI:%u CSN:%u RX:%u TX:%u\n", this->SCKPin, this->MISOPin, this->MOSIPin, this->CSNPin, this->RXPin, this->TXPin); } +*/ void transceiver_config_t::save() { pref.begin("CC1101"); pref.clear(); diff --git a/Somfy.h b/Somfy.h index 444cea0..410c4c5 100644 --- a/Somfy.h +++ b/Somfy.h @@ -197,7 +197,7 @@ class SomfyRoom { void clear(); bool save(); bool fromJSON(JsonObject &obj); - bool toJSON(JsonObject &obj); + //bool toJSON(JsonObject &obj); void toJSON(JsonResponse &json); void emitState(const char *evt = "roomState"); void emitState(uint8_t num, const char *evt = "roomState"); @@ -228,7 +228,7 @@ class SomfyRemote { uint8_t repeats = 1; virtual bool isLastCommand(somfy_commands cmd); char *getRemotePrefId() {return m_remotePrefId;} - virtual bool toJSON(JsonObject &obj); + //virtual bool toJSON(JsonObject &obj); virtual void toJSON(JsonResponse &json); virtual void setRemoteAddress(uint32_t address); virtual uint32_t getRemoteAddress(); @@ -297,7 +297,7 @@ class SomfyShade : public SomfyRemote { //bool toJSONRef(JsonObject &obj); void toJSONRef(JsonResponse &json); int8_t fromJSON(JsonObject &obj); - bool toJSON(JsonObject &obj) override; + //bool toJSON(JsonObject &obj) override; void toJSON(JsonResponse &json) override; char name[21] = ""; @@ -475,7 +475,7 @@ struct transceiver_config_t { bool appendStatus = false; // Appends the RSSI and LQI values to the TX packed as well as the CRC. */ void fromJSON(JsonObject& obj); - void toJSON(JsonObject& obj); + //void toJSON(JsonObject& obj); void toJSON(JsonResponse& json); void save(); void load(); @@ -490,7 +490,7 @@ class Transceiver { public: transceiver_config_t config; bool printBuffer = false; - bool toJSON(JsonObject& obj); + //bool toJSON(JsonObject& obj); void toJSON(JsonResponse& json); bool fromJSON(JsonObject& obj); bool save(); diff --git a/SomfyController.ino.esp32.bin b/SomfyController.ino.esp32.bin index 33d0de9..4cdbb66 100644 Binary files a/SomfyController.ino.esp32.bin and b/SomfyController.ino.esp32.bin differ diff --git a/SomfyController.ino.esp32s3.bin b/SomfyController.ino.esp32s3.bin index aa931c5..23cd4db 100644 Binary files a/SomfyController.ino.esp32s3.bin and b/SomfyController.ino.esp32s3.bin differ diff --git a/SomfyController.littlefs.bin b/SomfyController.littlefs.bin index fa496b6..1227b62 100644 Binary files a/SomfyController.littlefs.bin and b/SomfyController.littlefs.bin differ diff --git a/Utils.cpp b/Utils.cpp index 0e5442d..5d461a3 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -36,7 +36,14 @@ time_t Timestamp::mkUTCTime(struct tm *dt) { return tsBadLocal + tsLocalOffset; } time_t Timestamp::parseUTCTime(const char *buff) { - struct tm dt = {0}; + struct tm dt; + dt.tm_hour = 0; + dt.tm_mday = 0; + dt.tm_mon = 0; + dt.tm_year = 0; + dt.tm_wday = 0; + dt.tm_yday = 0; + dt.tm_isdst = false; char num[5]; uint8_t i = 0; memset(num, 0x00, sizeof(num)); diff --git a/Web.cpp b/Web.cpp index c9c8686..c7eb882 100644 --- a/Web.cpp +++ b/Web.cpp @@ -830,6 +830,11 @@ void Web::handleDiscovery(WebServer &server) { resp.addElem("chipModel", settings.chipModel); resp.addElem("connType", connType); resp.addElem("checkForUpdate", settings.checkForUpdate); + resp.beginObject("memory"); + resp.addElem("max", ESP.getMaxAllocHeap()); + resp.addElem("free", ESP.getFreeHeap()); + resp.addElem("min", ESP.getMinFreeHeap()); + resp.endObject(); resp.beginArray("rooms"); somfy.toJSONRooms(resp); resp.endArray(); @@ -2179,7 +2184,6 @@ void Web::begin() { server.on("/scanaps", []() { webServer.sendCORSHeaders(server); if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; } - int statusCode = 200; int n = WiFi.scanNetworks(); Serial.print("Scanned "); Serial.print(n); diff --git a/data/index.html b/data/index.html index 75a6a03..71c3afd 100644 --- a/data/index.html +++ b/data/index.html @@ -8,9 +8,9 @@ - - - + + + @@ -114,7 +114,7 @@ rel="apple-touch-startup-image"> - +
@@ -221,18 +221,27 @@

-
- Hardware: - ESP32 -
-
- Firmware: - v-.-- +
+
+ Hardware: + ESP32 +
+
+ Firmware: + v-.-- +
+
+ Application: + v-.-- +
-
- Application: - v-.-- +
+
+ Memory: + +