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: