Introducing enum for handling the NFC state to improve code readability

This commit is contained in:
Jan Philipp Ecker 2025-03-29 11:45:38 +01:00
parent 6cc4efca0a
commit c701149c64
4 changed files with 58 additions and 48 deletions

View File

@ -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))
{

View File

@ -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");

View File

@ -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

View File

@ -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) {