From c701149c64ad752349c79b6687c57f18600c2d6a Mon Sep 17 00:00:00 2001 From: Jan Philipp Ecker Date: Sat, 29 Mar 2025 11:45:38 +0100 Subject: [PATCH 1/2] Introducing enum for handling the NFC state to improve code readability --- src/main.cpp | 11 +++++----- src/nfc.cpp | 28 +++++++++++++------------- src/nfc.h | 14 ++++++++++++- src/website.cpp | 53 +++++++++++++++++++++++-------------------------- 4 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0b2c635..fee8cd5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -107,7 +107,7 @@ void loop() { if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval)) { - if (hasReadRfidTag == 0) + if (nfcReaderState == IDLE) { lastAutoSetBambuAmsTime = currentMillis; oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); @@ -141,7 +141,7 @@ void loop() { // Ausgabe der Waage auf Display if(pauseMainTask == 0) { - if (mainTaskWasPaused || (weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) + if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) { (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); } @@ -154,7 +154,7 @@ void loop() { // Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird - if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag < 3) + if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < WRITING) { lastWeightReadTime = currentMillis; @@ -190,7 +190,8 @@ void loop() { } // reset weight counter after writing tag - if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag > 1) + // TBD: what exactly is the logic behind this? + if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != IDLE && nfcReaderState != READ_SUCCESS) { weigthCouterToApi = 0; } @@ -198,7 +199,7 @@ 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 && hasReadRfidTag == 1) { + if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == READ_SUCCESS) { oledShowIcon("loading"); if (updateSpoolWeight(spoolId, weight)) { diff --git a/src/nfc.cpp b/src/nfc.cpp index 65966c5..e81f576 100644 --- a/src/nfc.cpp +++ b/src/nfc.cpp @@ -18,7 +18,7 @@ String spoolId = ""; String nfcJsonData = ""; volatile bool pauseBambuMqttTask = false; -volatile uint8_t hasReadRfidTag = 0; +volatile nfcReaderStateType nfcReaderState = IDLE; // 0 = nicht gelesen // 1 = erfolgreich gelesen // 2 = fehler beim Lesen @@ -242,7 +242,7 @@ void writeJsonToTag(void *parameter) { Serial.println("Erstelle NDEF-Message..."); Serial.println(payload); - hasReadRfidTag = 3; + nfcReaderState = WRITING; vTaskSuspend(RfidReaderTask); vTaskDelay(50 / portTICK_PERIOD_MS); @@ -288,7 +288,7 @@ void writeJsonToTag(void *parameter) { //oledShowMessage("NFC-Tag written"); oledShowIcon("success"); vTaskDelay(1000 / portTICK_PERIOD_MS); - hasReadRfidTag = 5; + nfcReaderState = WRITE_SUCCESS; // aktualisieren der Website wenn sich der Status ändert sendNfcData(nullptr); pauseBambuMqttTask = false; @@ -310,7 +310,7 @@ void writeJsonToTag(void *parameter) { Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag"); oledShowIcon("failed"); vTaskDelay(2000 / portTICK_PERIOD_MS); - hasReadRfidTag = 4; + nfcReaderState = WRITE_ERROR; } } else @@ -318,7 +318,7 @@ void writeJsonToTag(void *parameter) { Serial.println("Fehler: Kein Tag zu schreiben gefunden."); oledShowMessage("No NFC-Tag found"); vTaskDelay(2000 / portTICK_PERIOD_MS); - hasReadRfidTag = 0; + nfcReaderState = IDLE; } sendWriteResult(nullptr, success); @@ -334,7 +334,7 @@ void startWriteJsonToTag(const char* payload) { char* payloadCopy = strdup(payload); // Task nicht mehrfach starten - if (hasReadRfidTag != 3) { + if (nfcReaderState != WRITING) { // Erstelle die Task xTaskCreate( writeJsonToTag, // Task-Funktion @@ -351,7 +351,7 @@ void scanRfidTask(void * parameter) { Serial.println("RFID Task gestartet"); for(;;) { // Wenn geschrieben wird Schleife aussetzen - if (hasReadRfidTag != 3) + if (nfcReaderState != WRITING) { yield(); @@ -363,12 +363,12 @@ void scanRfidTask(void * parameter) { foundNfcTag(nullptr, success); - if (success && hasReadRfidTag != 1) + if (success && nfcReaderState != READ_SUCCESS) { // Display some basic information about the card Serial.println("Found an ISO14443A card"); - hasReadRfidTag = 6; + nfcReaderState = READING; oledShowIcon("transfer"); vTaskDelay(500 / portTICK_PERIOD_MS); @@ -406,11 +406,11 @@ void scanRfidTask(void * parameter) { { oledShowMessage("NFC-Tag unknown"); vTaskDelay(2000 / portTICK_PERIOD_MS); - hasReadRfidTag = 2; + nfcReaderState = READ_ERROR; } else { - hasReadRfidTag = 1; + nfcReaderState = READ_SUCCESS; } free(data); @@ -418,7 +418,7 @@ void scanRfidTask(void * parameter) { else { oledShowMessage("NFC-Tag read error"); - hasReadRfidTag = 2; + nfcReaderState = READ_ERROR; } } else @@ -427,9 +427,9 @@ void scanRfidTask(void * parameter) { } } - if (!success && hasReadRfidTag > 0) + if (!success && nfcReaderState != IDLE) { - hasReadRfidTag = 0; + nfcReaderState = IDLE; //uidString = ""; nfcJsonData = ""; Serial.println("Tag entfernt"); diff --git a/src/nfc.h b/src/nfc.h index 3610050..342f6fc 100644 --- a/src/nfc.h +++ b/src/nfc.h @@ -3,6 +3,16 @@ #include +typedef enum{ + IDLE, + READING, + READ_SUCCESS, + READ_ERROR, + WRITING, + WRITE_SUCCESS, + WRITE_ERROR +} nfcReaderStateType; + void startNfc(); void scanRfidTask(void * parameter); void startWriteJsonToTag(const char* payload); @@ -10,7 +20,9 @@ void startWriteJsonToTag(const char* payload); extern TaskHandle_t RfidReaderTask; extern String nfcJsonData; extern String spoolId; -extern volatile uint8_t hasReadRfidTag; +extern volatile nfcReaderStateType nfcReaderState; extern volatile bool pauseBambuMqttTask; + + #endif \ No newline at end of file diff --git a/src/website.cpp b/src/website.cpp index 18ac882..dd4a760 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -22,7 +22,7 @@ AsyncWebServer server(webserverPort); AsyncWebSocket ws("/ws"); uint8_t lastSuccess = 0; -uint8_t lastHasReadRfidTag = 0; +nfcReaderStateType lastnfcReaderState = IDLE; void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { @@ -139,34 +139,31 @@ void foundNfcTag(AsyncWebSocketClient *client, uint8_t success) { } void sendNfcData(AsyncWebSocketClient *client) { - if (lastHasReadRfidTag == hasReadRfidTag) return; - if (hasReadRfidTag == 0) { - ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}"); + if (lastnfcReaderState == nfcReaderState) return; + // TBD: Why is there no status for reading the tag? + switch(nfcReaderState){ + case IDLE: + ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}"); + break; + case READ_SUCCESS: + ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}"); + break; + case READ_ERROR: + ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}"); + break; + case WRITING: + ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}"); + break; + case WRITE_SUCCESS: + ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}"); + break; + case WRITE_ERROR: + ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}"); + break; + case DEFAULT: + ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}"); } - else if (hasReadRfidTag == 1) { - ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}"); - } - else if (hasReadRfidTag == 2) - { - ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}"); - } - else if (hasReadRfidTag == 3) - { - ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}"); - } - else if (hasReadRfidTag == 4) - { - ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}"); - } - else if (hasReadRfidTag == 5) - { - ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}"); - } - else - { - ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}"); - } - lastHasReadRfidTag = hasReadRfidTag; + lastnfcReaderState = nfcReaderState; } void sendAmsData(AsyncWebSocketClient *client) { From ac8adca84de8ce1963306314e7e426188e0b922d Mon Sep 17 00:00:00 2001 From: Jan Philipp Ecker Date: Sat, 29 Mar 2025 13:21:47 +0100 Subject: [PATCH 2/2] Renamed states of NFC state machine and introduced new state machine for spoolman API --- src/api.cpp | 8 ++++++-- src/api.h | 6 ++++++ src/display.cpp | 2 +- src/main.cpp | 10 +++++----- src/nfc.cpp | 28 ++++++++++++++-------------- src/nfc.h | 14 +++++++------- src/website.cpp | 18 ++++++++++-------- 7 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/api.cpp b/src/api.cpp index d613081..984b1b2 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -3,7 +3,8 @@ #include #include "commonFS.h" -bool spoolman_connected = false; +volatile spoolmanApiStateType spoolmanApiState = API_INIT; +//bool spoolman_connected = false; String spoolmanUrl = ""; bool octoEnabled = false; String octoUrl = ""; @@ -85,6 +86,7 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) { } void sendToApi(void *parameter) { + spoolmanApiState = API_TRANSMITTING; SendToApiParams* params = (SendToApiParams*)parameter; // Extrahiere die Werte @@ -116,6 +118,7 @@ void sendToApi(void *parameter) { // Speicher freigeben delete params; vTaskDelete(NULL); + spoolmanApiState = API_IDLE; } bool updateSpoolTagId(String uidString, const char* payload) { @@ -470,7 +473,8 @@ bool checkSpoolmanInstance(const String& url) { return false; } - spoolman_connected = true; + spoolmanApiState = API_IDLE; + oledShowTopRow(); return strcmp(status, "healthy") == 0; } } diff --git a/src/api.h b/src/api.h index 786ece1..88853c8 100644 --- a/src/api.h +++ b/src/api.h @@ -6,7 +6,13 @@ #include "website.h" #include "display.h" #include +typedef enum { + API_INIT, + API_IDLE, + API_TRANSMITTING +} spoolmanApiStateType; +extern volatile spoolmanApiStateType spoolmanApiState; extern bool spoolman_connected; extern String spoolmanUrl; extern bool octoEnabled; diff --git a/src/display.cpp b/src/display.cpp index c5a623f..dab0ccf 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -177,7 +177,7 @@ void oledShowTopRow() { display.drawBitmap(50, 0, bitmap_off , 16, 16, WHITE); } - if (spoolman_connected == 1) { + if (spoolmanApiState != API_INIT) { display.drawBitmap(80, 0, bitmap_spoolman_on , 16, 16, WHITE); } else { display.drawBitmap(80, 0, bitmap_off , 16, 16, WHITE); diff --git a/src/main.cpp b/src/main.cpp index fee8cd5..de8abab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -107,7 +107,7 @@ void loop() { if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval)) { - if (nfcReaderState == IDLE) + if (nfcReaderState == NFC_IDLE) { lastAutoSetBambuAmsTime = currentMillis; oledShowMessage("Auto Set " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s"); @@ -141,7 +141,7 @@ void loop() { // Ausgabe der Waage auf Display if(pauseMainTask == 0) { - if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) + if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) { (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); } @@ -154,7 +154,7 @@ void loop() { // Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird - if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < WRITING) + if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < NFC_WRITING) { lastWeightReadTime = currentMillis; @@ -191,7 +191,7 @@ void loop() { // reset weight counter after writing tag // TBD: what exactly is the logic behind this? - if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != IDLE && nfcReaderState != READ_SUCCESS) + if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != NFC_IDLE && nfcReaderState != NFC_READ_SUCCESS) { weigthCouterToApi = 0; } @@ -199,7 +199,7 @@ 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 == READ_SUCCESS) { + if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS) { oledShowIcon("loading"); if (updateSpoolWeight(spoolId, weight)) { diff --git a/src/nfc.cpp b/src/nfc.cpp index e81f576..855405f 100644 --- a/src/nfc.cpp +++ b/src/nfc.cpp @@ -18,7 +18,7 @@ String spoolId = ""; String nfcJsonData = ""; volatile bool pauseBambuMqttTask = false; -volatile nfcReaderStateType nfcReaderState = IDLE; +volatile nfcReaderStateType nfcReaderState = NFC_IDLE; // 0 = nicht gelesen // 1 = erfolgreich gelesen // 2 = fehler beim Lesen @@ -242,7 +242,7 @@ void writeJsonToTag(void *parameter) { Serial.println("Erstelle NDEF-Message..."); Serial.println(payload); - nfcReaderState = WRITING; + nfcReaderState = NFC_WRITING; vTaskSuspend(RfidReaderTask); vTaskDelay(50 / portTICK_PERIOD_MS); @@ -288,7 +288,7 @@ void writeJsonToTag(void *parameter) { //oledShowMessage("NFC-Tag written"); oledShowIcon("success"); vTaskDelay(1000 / portTICK_PERIOD_MS); - nfcReaderState = WRITE_SUCCESS; + nfcReaderState = NFC_WRITE_SUCCESS; // aktualisieren der Website wenn sich der Status ändert sendNfcData(nullptr); pauseBambuMqttTask = false; @@ -310,7 +310,7 @@ void writeJsonToTag(void *parameter) { Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag"); oledShowIcon("failed"); vTaskDelay(2000 / portTICK_PERIOD_MS); - nfcReaderState = WRITE_ERROR; + nfcReaderState = NFC_WRITE_ERROR; } } else @@ -318,7 +318,7 @@ void writeJsonToTag(void *parameter) { Serial.println("Fehler: Kein Tag zu schreiben gefunden."); oledShowMessage("No NFC-Tag found"); vTaskDelay(2000 / portTICK_PERIOD_MS); - nfcReaderState = IDLE; + nfcReaderState = NFC_IDLE; } sendWriteResult(nullptr, success); @@ -334,7 +334,7 @@ void startWriteJsonToTag(const char* payload) { char* payloadCopy = strdup(payload); // Task nicht mehrfach starten - if (nfcReaderState != WRITING) { + if (nfcReaderState != NFC_WRITING) { // Erstelle die Task xTaskCreate( writeJsonToTag, // Task-Funktion @@ -351,7 +351,7 @@ void scanRfidTask(void * parameter) { Serial.println("RFID Task gestartet"); for(;;) { // Wenn geschrieben wird Schleife aussetzen - if (nfcReaderState != WRITING) + if (nfcReaderState != NFC_WRITING) { yield(); @@ -363,12 +363,12 @@ void scanRfidTask(void * parameter) { foundNfcTag(nullptr, success); - if (success && nfcReaderState != READ_SUCCESS) + if (success && nfcReaderState != NFC_READ_SUCCESS) { // Display some basic information about the card Serial.println("Found an ISO14443A card"); - nfcReaderState = READING; + nfcReaderState = NFC_READING; oledShowIcon("transfer"); vTaskDelay(500 / portTICK_PERIOD_MS); @@ -406,11 +406,11 @@ void scanRfidTask(void * parameter) { { oledShowMessage("NFC-Tag unknown"); vTaskDelay(2000 / portTICK_PERIOD_MS); - nfcReaderState = READ_ERROR; + nfcReaderState = NFC_READ_ERROR; } else { - nfcReaderState = READ_SUCCESS; + nfcReaderState = NFC_READ_SUCCESS; } free(data); @@ -418,7 +418,7 @@ void scanRfidTask(void * parameter) { else { oledShowMessage("NFC-Tag read error"); - nfcReaderState = READ_ERROR; + nfcReaderState = NFC_READ_ERROR; } } else @@ -427,9 +427,9 @@ void scanRfidTask(void * parameter) { } } - if (!success && nfcReaderState != IDLE) + if (!success && nfcReaderState != NFC_IDLE) { - nfcReaderState = IDLE; + nfcReaderState = NFC_IDLE; //uidString = ""; nfcJsonData = ""; Serial.println("Tag entfernt"); diff --git a/src/nfc.h b/src/nfc.h index 342f6fc..0d964f2 100644 --- a/src/nfc.h +++ b/src/nfc.h @@ -4,13 +4,13 @@ #include typedef enum{ - IDLE, - READING, - READ_SUCCESS, - READ_ERROR, - WRITING, - WRITE_SUCCESS, - WRITE_ERROR + NFC_IDLE, + NFC_READING, + NFC_READ_SUCCESS, + NFC_READ_ERROR, + NFC_WRITING, + NFC_WRITE_SUCCESS, + NFC_WRITE_ERROR } nfcReaderStateType; void startNfc(); diff --git a/src/website.cpp b/src/website.cpp index dd4a760..bf9e0fb 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -22,7 +22,7 @@ AsyncWebServer server(webserverPort); AsyncWebSocket ws("/ws"); uint8_t lastSuccess = 0; -nfcReaderStateType lastnfcReaderState = IDLE; +nfcReaderStateType lastnfcReaderState = NFC_IDLE; void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { @@ -44,13 +44,15 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp JsonDocument doc; deserializeJson(doc, message); + bool spoolmanConnected = (spoolmanApiState != API_INIT); + if (doc["type"] == "heartbeat") { // Sende Heartbeat-Antwort ws.text(client->id(), "{" "\"type\":\"heartbeat\"," "\"freeHeap\":" + String(ESP.getFreeHeap()/1024) + "," "\"bambu_connected\":" + String(bambu_connected) + "," - "\"spoolman_connected\":" + String(spoolman_connected) + "" + "\"spoolman_connected\":" + String(spoolmanConnected) + "" "}"); } @@ -142,22 +144,22 @@ void sendNfcData(AsyncWebSocketClient *client) { if (lastnfcReaderState == nfcReaderState) return; // TBD: Why is there no status for reading the tag? switch(nfcReaderState){ - case IDLE: + case NFC_IDLE: ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}"); break; - case READ_SUCCESS: + case NFC_READ_SUCCESS: ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}"); break; - case READ_ERROR: + case NFC_READ_ERROR: ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}"); break; - case WRITING: + case NFC_WRITING: ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}"); break; - case WRITE_SUCCESS: + case NFC_WRITE_SUCCESS: ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}"); break; - case WRITE_ERROR: + case NFC_WRITE_ERROR: ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}"); break; case DEFAULT: