From bee55fb995eee0ddf2f7bd7b5cf68e0c602078b7 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Thu, 2 Feb 2023 01:50:55 +0100 Subject: [PATCH] bugfixes and memory optimizations --- esp32_fw/include/makeimage.h | 2 +- esp32_fw/src/contentmanager.cpp | 38 +++++++++++++++++++++++++-------- esp32_fw/src/makeimage.cpp | 7 +++--- esp32_fw/src/newproto.cpp | 26 ++++++++++++++-------- esp32_fw/src/tag_db.cpp | 3 +-- 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/esp32_fw/include/makeimage.h b/esp32_fw/include/makeimage.h index 3ce9ef15..8debd701 100644 --- a/esp32_fw/include/makeimage.h +++ b/esp32_fw/include/makeimage.h @@ -29,7 +29,7 @@ enum EinkClut { EinkClutThreeBlacksAndRed, }; -void spr2grays(TFT_eSprite &spr, long w, long h, String fileout); +void spr2grays(TFT_eSprite &spr, long w, long h, String &fileout); void jpg2grays(String filein, String fileout); void bmp2grays(String filein, String fileout); diff --git a/esp32_fw/src/contentmanager.cpp b/esp32_fw/src/contentmanager.cpp index 1558159a..32970c2f 100644 --- a/esp32_fw/src/contentmanager.cpp +++ b/esp32_fw/src/contentmanager.cpp @@ -35,7 +35,6 @@ void contentRunner() { void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { time_t now; time(&now); - struct tm *time_info = gmtime(&now); char buffer[64]; uint8_t src[8]; @@ -45,16 +44,21 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { String filename = "/" + dst + ".bmp"; - time_info->tm_hour = 0; - time_info->tm_min = 0; - time_info->tm_sec = 0; - time_info->tm_mday++; - time_t midnight = mktime(time_info); + struct tm time_info; + getLocalTime(&time_info); + time_info.tm_hour = 0; + time_info.tm_min = 0; + time_info.tm_sec = 0; + time_info.tm_mday++; + time_t midnight = mktime(&time_info); DynamicJsonDocument doc(500); deserializeJson(doc, taginfo->modeConfigJson); JsonObject cfgobj = doc.as(); + Serial.println("Updating " + dst + " mode " + String(taginfo->contentMode) + " nextupdate " + String(taginfo->nextupdate)); + taginfo->nextupdate = now + 600; + switch (taginfo->contentMode) { case Image: @@ -71,16 +75,21 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { case Today: + Serial.println("heap voor drawDate: " + String(ESP.getFreeHeap())); drawDate(filename); - updateTagImage(filename, mac, (midnight - now) / 60 - 10); + Serial.println("heap na drawDate: " + String(ESP.getFreeHeap())); + // updateTagImage(filename, mac, (midnight - now) / 60 - 10); + updateTagImage(filename, mac, 60); taginfo->nextupdate = midnight; break; case CountDays: if (buttonPressed) cfgobj["counter"] = 0; + Serial.println("heap voor drawnumber: " + String(ESP.getFreeHeap())); drawNumber(filename, (int32_t)cfgobj["counter"], (int32_t)cfgobj["thresholdred"]); - updateTagImage(filename, mac, (midnight - now) / 60 - 5); + Serial.println("heap na drawnumber: " + String(ESP.getFreeHeap())); + updateTagImage(filename, mac, 60); cfgobj["counter"] = (int32_t)cfgobj["counter"] + 1; taginfo->nextupdate = midnight; break; @@ -88,7 +97,9 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { case CountHours: if (buttonPressed) cfgobj["counter"] = 0; + Serial.println("heap voor drawnumber: " + String(ESP.getFreeHeap())); drawNumber(filename, (int32_t)cfgobj["counter"], (int32_t)cfgobj["thresholdred"]); + Serial.println("heap na drawnumber: " + String(ESP.getFreeHeap())); // updateTagImage(&filename, mac, (3600 - now % 3600) / 60); // taginfo->nextupdate = now + 3600 - (now % 3600); updateTagImage(filename, mac, 3); @@ -110,8 +121,11 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { } else { wsString("Error accessing " + filename); } + cfgobj["filename"]=""; taginfo->nextupdate = 3216153600; taginfo->contentMode = Image; + } else { + taginfo->nextupdate = now + 300; } break; @@ -123,7 +137,7 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { updateTagImage(filename, mac, cfgobj["interval"].as()); cfgobj["#fetched"] = now; } - taginfo->nextupdate = now + 60 * cfgobj["interval"].as(); + taginfo->nextupdate = now + 60 * (cfgobj["interval"].as() < 5 ? 5 : cfgobj["interval"].as()) ; break; } @@ -151,6 +165,9 @@ void drawDate(String &filename) { LittleFS.begin(); long w = 296, h = 128; // mag staand of liggend spr.createSprite(w, h); + if (spr.getPointer() == nullptr) { + Serial.println("Failed to create sprite in drawDate"); + } spr.setColorDepth(8); spr.fillSprite(TFT_WHITE); spr.setTextDatum(TC_DATUM); @@ -174,6 +191,9 @@ void drawNumber(String &filename, int32_t count, int32_t thresholdred) { LittleFS.begin(); long w = 296, h = 128; spr.createSprite(w, h); + if (spr.getPointer() == nullptr) { + Serial.println("Failed to create sprite in drawNumber"); + } spr.setColorDepth(8); spr.fillSprite(TFT_WHITE); spr.setTextDatum(MC_DATUM); diff --git a/esp32_fw/src/makeimage.cpp b/esp32_fw/src/makeimage.cpp index 90cc66ee..7d23a013 100644 --- a/esp32_fw/src/makeimage.cpp +++ b/esp32_fw/src/makeimage.cpp @@ -21,6 +21,9 @@ void jpg2grays(String filein, String fileout) { Serial.println("jpeg conversion " + String(w) + "x" + String(h)); spr.createSprite(w, h); + if (spr.getPointer() == nullptr) { + Serial.println("Failed to create sprite in jpg2grays"); + } spr.setColorDepth(8); spr.fillSprite(TFT_WHITE); TJpgDec.drawFsJpg(0, 0, filein); @@ -38,10 +41,9 @@ static uint32_t repackPackedVals(uint32_t val, uint32_t pixelsPerPackedUnit, uin return ret; } -void spr2grays(TFT_eSprite &spr, long w, long h, String fileout) { +void spr2grays(TFT_eSprite &spr, long w, long h, String &fileout) { // based on bmp2grays function by Dmitry.GR - Serial.println("start writing BMP"); long t = millis(); LittleFS.begin(); @@ -237,7 +239,6 @@ void spr2grays(TFT_eSprite &spr, long w, long h, String fileout) { void bmp2grays(String filein, String fileout) { // based on bmp2grays function by Dmitry.GR - Serial.println("start writing BMP2"); long t = millis(); LittleFS.begin(); diff --git a/esp32_fw/src/newproto.cpp b/esp32_fw/src/newproto.cpp index 297dd2b1..76fbfd40 100644 --- a/esp32_fw/src/newproto.cpp +++ b/esp32_fw/src/newproto.cpp @@ -138,27 +138,35 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t pendinginfo->len = pending.availdatainfo.dataSize; pendinginfo->data = nullptr; pendinginfo->timeout = PENDING_TIMEOUT; - pendinginfo->data = getDataForFile(&file); - file.close(); - pendinginfo->timeout = 1800; + //pendinginfo->data = getDataForFile(&file); + pendinginfo->timeout = 1800; // ***fixme... a tag can sleep for a long time when ttl is used. pendingfiles.push_back(pendinginfo); if (dataType != DATATYPE_UPDATE) { char dst_path[64]; sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X.pending\0", dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); - file = LittleFS.open(dst_path, "w"); - int bytes_written = file.write(pendinginfo->data, pendinginfo->len); - file.close(); + fs::File dstfile = LittleFS.open(dst_path, "w"); + //int bytes_written = dstfile.write(pendinginfo->data, pendinginfo->len); + file.seek(0); + const int chunkSize = 512; + uint8_t buffer[chunkSize]; + size_t bytesRead = 0; + while ((bytesRead = file.read(buffer, chunkSize)) > 0) { + dstfile.write(buffer, bytesRead); + } + dstfile.close(); wsString("new image pending: " + String(dst_path)); if (taginfo != nullptr) { taginfo->pending = true; taginfo->CheckinInMinPending = nextCheckin + 1; memcpy(taginfo->md5pending, md5bytes, sizeof(md5bytes)); + } } - } else { - Serial.println("firmware upload pending"); - } + else { + Serial.println("firmware upload pending"); + } + file.close(); wsSendTaginfo(mac); diff --git a/esp32_fw/src/tag_db.cpp b/esp32_fw/src/tag_db.cpp index e1af5f24..794a0a8c 100644 --- a/esp32_fw/src/tag_db.cpp +++ b/esp32_fw/src/tag_db.cpp @@ -72,7 +72,6 @@ void fillNode(JsonObject &tag, tagRecord* &taginfo) { void saveDB(String filename) { DynamicJsonDocument doc(2500); - Serial.println("start writing DB to file"); long t = millis(); LittleFS.begin(); @@ -100,7 +99,7 @@ void saveDB(String filename) { file.close(); Serial.println(millis() - t); - Serial.println("finished writing file"); + Serial.println("finished writing DB"); return; }