diff --git a/.gitignore b/.gitignore index 89cc49c..b18cbdd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ .vscode/c_cpp_properties.json .vscode/launch.json .vscode/ipch +.vscode/extensions.json +.vscode/settings.json +data diff --git a/platformio.ini b/platformio.ini index dc7cd21..c1ba693 100644 --- a/platformio.ini +++ b/platformio.ini @@ -52,6 +52,7 @@ build_flags = -mtext-section-literals -DVERSION=\"${common.version}\" -DTOOLDVERSION=\"${common.to_old_version}\" + #-DENABLE_HEAP_DEBUGGING -DASYNCWEBSERVER_REGEX #-DCORE_DEBUG_LEVEL=3 -DCONFIG_ARDUHAL_LOG_COLORS=1 diff --git a/src/api.cpp b/src/api.cpp index 12a96d8..cb42bdc 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -3,6 +3,7 @@ #include #include "commonFS.h" #include +#include "debug.h" volatile spoolmanApiStateType spoolmanApiState = API_INIT; //bool spoolman_connected = false; @@ -88,6 +89,8 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) { } void sendToApi(void *parameter) { + HEAP_DEBUG_MESSAGE("sendToApi begin"); + spoolmanApiState = API_TRANSMITTING; SendToApiParams* params = (SendToApiParams*)parameter; @@ -132,8 +135,8 @@ void sendToApi(void *parameter) { } vTaskDelay(3000 / portTICK_PERIOD_MS); - doc.clear(); } + doc.clear(); } else { Serial.println("Fehler beim Senden an Spoolman! HTTP Code: " + String(httpCode)); @@ -146,8 +149,9 @@ void sendToApi(void *parameter) { // Speicher freigeben delete params; - vTaskDelete(NULL); + HEAP_DEBUG_MESSAGE("sendToApi end"); spoolmanApiState = API_IDLE; + vTaskDelete(NULL); } bool updateSpoolTagId(String uidString, const char* payload) { @@ -170,6 +174,8 @@ bool updateSpoolTagId(String uidString, const char* payload) { Serial.print("Update Spule mit URL: "); Serial.println(spoolsUrl); + doc.clear(); + // Update Payload erstellen JsonDocument updateDoc; updateDoc["extra"]["nfc_id"] = "\""+uidString+"\""; @@ -208,6 +214,7 @@ bool updateSpoolTagId(String uidString, const char* payload) { } uint8_t updateSpoolWeight(String spoolId, uint16_t weight) { + HEAP_DEBUG_MESSAGE("updateSpoolWeight begin"); String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + spoolId + "/measure"; Serial.print("Update Spule mit URL: "); Serial.println(spoolsUrl); @@ -242,11 +249,14 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) { ); updateDoc.clear(); + HEAP_DEBUG_MESSAGE("updateSpoolWeight end"); return 1; } uint8_t updateSpoolLocation(String spoolId, String location){ + HEAP_DEBUG_MESSAGE("updateSpoolLocation begin"); + String spoolsUrl = spoolmanUrl + apiUrl + "/spool/" + spoolId; Serial.print("Update Spule mit URL: "); Serial.println(spoolsUrl); @@ -282,6 +292,7 @@ uint8_t updateSpoolLocation(String spoolId, String location){ updateDoc.clear(); + HEAP_DEBUG_MESSAGE("updateSpoolLocation end"); return 1; } @@ -346,6 +357,10 @@ bool updateSpoolBambuData(String payload) { String updatePayload; serializeJson(updateDoc, updatePayload); + + doc.clear(); + updateDoc.clear(); + Serial.print("Update Payload: "); Serial.println(updatePayload); @@ -512,6 +527,7 @@ bool checkSpoolmanExtraFields() { vTaskDelay(100 / portTICK_PERIOD_MS); } } + doc.clear(); } } @@ -558,6 +574,8 @@ bool checkSpoolmanInstance(const String& url) { oledShowTopRow(); return strcmp(status, "healthy") == 0; } + + doc.clear(); } } else { Serial.println("Error contacting spoolman instance! HTTP Code: " + String(httpCode)); @@ -581,6 +599,8 @@ bool saveSpoolmanUrl(const String& url, bool octoOn, const String& octo_url, con octoUrl = octo_url; octoToken = octoTk; + doc.clear(); + return true; } diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..8cc1efc --- /dev/null +++ b/src/debug.h @@ -0,0 +1,12 @@ +#include + + +#ifdef ENABLE_HEAP_DEBUGGING + #define HEAP_DEBUG_MESSAGE(location) printHeapDebugData(location); +#else + #define HEAP_DEBUG_MESSAGE(location) +#endif + +inline void printHeapDebugData(String location){ + Serial.println("Heap: " + String(ESP.getMinFreeHeap()/1024) + "\t" + String(ESP.getFreeHeap()/1024) + "\t" + String(ESP.getMaxAllocHeap()/1024) + "\t" + location); +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 76de6f4..96fa2f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -212,14 +212,14 @@ void loop() { lastWeight = weight; // Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden - if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS) { + if (activeSpoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS) { oledShowIcon("loading"); - if (updateSpoolWeight(spoolId, weight)) + if (updateSpoolWeight(activeSpoolId, weight)) { oledShowIcon("success"); vTaskDelay(2000 / portTICK_PERIOD_MS); weightSend = 1; - autoSetToBambuSpoolId = spoolId.toInt(); + autoSetToBambuSpoolId = activeSpoolId.toInt(); if (octoEnabled) { diff --git a/src/nfc.cpp b/src/nfc.cpp index 83bfe7c..e7aec4b 100644 --- a/src/nfc.cpp +++ b/src/nfc.cpp @@ -15,7 +15,8 @@ Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); TaskHandle_t RfidReaderTask; JsonDocument rfidData; -String spoolId = ""; +String activeSpoolId = ""; +String lastSpoolId = ""; String nfcJsonData = ""; volatile bool pauseBambuMqttTask = false; @@ -65,6 +66,8 @@ void payloadToJson(uint8_t *data) { Serial.print("deserializeJson() failed: "); Serial.println(error.f_str()); } + + doc.clear(); } else { Serial.println("Kein gültiger JSON-Inhalt gefunden oder fehlerhafte Formatierung."); //writeJsonToTag("{\"version\":\"1.0\",\"protocol\":\"NFC\",\"color_hex\":\"#FFFFFF\",\"type\":\"Example\",\"min_temp\":10,\"max_temp\":30,\"brand\":\"BrandName\"}"); @@ -219,17 +222,18 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage) { // Sende die aktualisierten AMS-Daten an alle WebSocket-Clients Serial.println("JSON-Dokument erfolgreich verarbeitet"); Serial.println(doc.as()); - if (doc.containsKey("sm_id") && doc["sm_id"] != "") + if (doc["sm_id"].is() && doc["sm_id"] != "") { Serial.println("SPOOL-ID gefunden: " + doc["sm_id"].as()); - spoolId = doc["sm_id"].as(); + activeSpoolId = doc["sm_id"].as(); + lastSpoolId = activeSpoolId; } - else if(doc.containsKey("location") && doc["location"] != "") + else if(doc["location"].is() && doc["location"] != "") { Serial.println("Location Tag found!"); String location = doc["location"].as(); - if(spoolId != ""){ - updateSpoolLocation(spoolId, location); + if(lastSpoolId != ""){ + updateSpoolLocation(lastSpoolId, location); } else { @@ -241,12 +245,14 @@ bool decodeNdefAndReturnJson(const byte* encodedMessage) { else { Serial.println("Keine SPOOL-ID gefunden."); - spoolId = ""; + activeSpoolId = ""; oledShowMessage("Unknown Spool"); vTaskDelay(2000 / portTICK_PERIOD_MS); } } + doc.clear(); + return true; } @@ -447,6 +453,7 @@ void scanRfidTask(void * parameter) { nfcReaderState = NFC_IDLE; //uidString = ""; nfcJsonData = ""; + activeSpoolId = ""; Serial.println("Tag entfernt"); if (!bambuCredentials.autosend_enable) oledShowWeight(weight); } diff --git a/src/nfc.h b/src/nfc.h index 0d964f2..8f8cf5a 100644 --- a/src/nfc.h +++ b/src/nfc.h @@ -19,7 +19,8 @@ void startWriteJsonToTag(const char* payload); extern TaskHandle_t RfidReaderTask; extern String nfcJsonData; -extern String spoolId; +extern String activeSpoolId; +extern String lastSpoolId; extern volatile nfcReaderStateType nfcReaderState; extern volatile bool pauseBambuMqttTask; diff --git a/src/website.cpp b/src/website.cpp index d554235..f87dba2 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -11,6 +11,8 @@ #include "display.h" #include "ota.h" #include "config.h" +#include "debug.h" + #ifndef VERSION #define VERSION "1.1.0" @@ -27,6 +29,7 @@ nfcReaderStateType lastnfcReaderState = NFC_IDLE; void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { + HEAP_DEBUG_MESSAGE("onWsEvent begin"); if (type == WS_EVT_CONNECT) { Serial.println("Neuer Client verbunden!"); // Sende die AMS-Daten an den neuen Client @@ -34,6 +37,10 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp sendNfcData(client); foundNfcTag(client, 0); sendWriteResult(client, 3); + + // Clean up dead connections + (*server).cleanupClients(); + Serial.println("Currently connected number of clients: " + String((*server).getClients().size())); } else if (type == WS_EVT_DISCONNECT) { Serial.println("Client getrennt."); } else if (type == WS_EVT_ERROR) { @@ -114,7 +121,9 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp else { Serial.println("Unbekannter WebSocket-Typ: " + doc["type"].as()); } + doc.clear(); } + HEAP_DEBUG_MESSAGE("onWsEvent end"); } // Funktion zum Laden und Ersetzen des Headers in einer HTML-Datei @@ -264,6 +273,8 @@ void setupWebserver(AsyncWebServer &server) { html.replace("{{autoSendToBambu}}", bambuCredentials.autosend_enable ? "checked" : ""); html.replace("{{autoSendTime}}", (bambuCredentials.autosend_time != 0) ? String(bambuCredentials.autosend_time) : String(BAMBU_DEFAULT_AUTOSEND_TIME)); + doc.clear(); + request->send(200, "text/html", html); });