Introducing enum for handling the NFC state to improve code readability
This commit is contained in:
		
							
								
								
									
										11
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								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))  | ||||
|     { | ||||
|   | ||||
							
								
								
									
										28
									
								
								src/nfc.cpp
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								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"); | ||||
|   | ||||
							
								
								
									
										14
									
								
								src/nfc.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/nfc.h
									
									
									
									
									
								
							| @@ -3,6 +3,16 @@ | ||||
|  | ||||
| #include <Arduino.h> | ||||
|  | ||||
| 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 | ||||
| @@ -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) { | ||||
|     if (lastnfcReaderState == nfcReaderState) return; | ||||
|     // TBD: Why is there no status for reading the tag? | ||||
|     switch(nfcReaderState){ | ||||
|         case IDLE: | ||||
|             ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}"); | ||||
|     } | ||||
|     else if (hasReadRfidTag == 1) { | ||||
|             break; | ||||
|         case READ_SUCCESS: | ||||
|             ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}"); | ||||
|     } | ||||
|     else if (hasReadRfidTag == 2) | ||||
|     { | ||||
|             break; | ||||
|         case READ_ERROR: | ||||
|             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}"); | ||||
|     } | ||||
|     else if (hasReadRfidTag == 3) | ||||
|     { | ||||
|             break; | ||||
|         case WRITING: | ||||
|             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) | ||||
|     { | ||||
|             break; | ||||
|         case WRITE_SUCCESS: | ||||
|             ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}"); | ||||
|     } | ||||
|     else  | ||||
|     { | ||||
|             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\"}}"); | ||||
|     } | ||||
|     lastHasReadRfidTag = hasReadRfidTag; | ||||
|     lastnfcReaderState = nfcReaderState; | ||||
| } | ||||
|  | ||||
| void sendAmsData(AsyncWebSocketClient *client) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user