diff --git a/html/rfid.js b/html/rfid.js index 52866ea..d6dfa75 100644 --- a/html/rfid.js +++ b/html/rfid.js @@ -7,6 +7,7 @@ let heartbeatTimer = null; let lastHeartbeatResponse = Date.now(); const HEARTBEAT_TIMEOUT = 20000; let reconnectTimer = null; +let spoolDetected = false; // WebSocket Funktionen function startHeartbeat() { @@ -508,12 +509,15 @@ function updateNfcStatusIndicator(data) { if (data.found === 0) { // Kein NFC Tag gefunden indicator.className = 'status-circle'; + spoolDetected = false; } else if (data.found === 1) { // NFC Tag erfolgreich gelesen indicator.className = 'status-circle success'; + spoolDetected = true; } else { // Fehler beim Lesen indicator.className = 'status-circle error'; + spoolDetected = true; } } @@ -618,78 +622,83 @@ function updateNfcData(data) { } function writeNfcTag() { - const selectedText = document.getElementById("selected-filament").textContent; - if (selectedText === "Please choose...") { - alert('Please select a Spool first.'); - return; - } + if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){ + const selectedText = document.getElementById("selected-filament").textContent; + if (selectedText === "Please choose...") { + alert('Please select a Spool first.'); + return; + } - const spoolsData = window.getSpoolData(); - const selectedSpool = spoolsData.find(spool => - `${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText - ); + const spoolsData = window.getSpoolData(); + const selectedSpool = spoolsData.find(spool => + `${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText + ); - if (!selectedSpool) { - alert('Ausgewählte Spule konnte nicht gefunden werden.'); - return; - } + if (!selectedSpool) { + alert('Ausgewählte Spule konnte nicht gefunden werden.'); + return; + } - // Temperaturwerte korrekt extrahieren - let minTemp = "175"; - let maxTemp = "275"; - - if (Array.isArray(selectedSpool.filament.nozzle_temperature) && - selectedSpool.filament.nozzle_temperature.length >= 2) { - minTemp = String(selectedSpool.filament.nozzle_temperature[0]); - maxTemp = String(selectedSpool.filament.nozzle_temperature[1]); - } + // Temperaturwerte korrekt extrahieren + let minTemp = "175"; + let maxTemp = "275"; + + if (Array.isArray(selectedSpool.filament.nozzle_temperature) && + selectedSpool.filament.nozzle_temperature.length >= 2) { + minTemp = String(selectedSpool.filament.nozzle_temperature[0]); + maxTemp = String(selectedSpool.filament.nozzle_temperature[1]); + } - // Erstelle das NFC-Datenpaket mit korrekten Datentypen - const nfcData = { - color_hex: selectedSpool.filament.color_hex || "FFFFFF", - type: selectedSpool.filament.material, - min_temp: minTemp, - max_temp: maxTemp, - brand: selectedSpool.filament.vendor.name, - sm_id: String(selectedSpool.id) // Konvertiere zu String - }; + // Erstelle das NFC-Datenpaket mit korrekten Datentypen + const nfcData = { + color_hex: selectedSpool.filament.color_hex || "FFFFFF", + type: selectedSpool.filament.material, + min_temp: minTemp, + max_temp: maxTemp, + brand: selectedSpool.filament.vendor.name, + sm_id: String(selectedSpool.id) // Konvertiere zu String + }; - if (socket?.readyState === WebSocket.OPEN) { - const writeButton = document.getElementById("writeNfcButton"); - writeButton.classList.add("writing"); - writeButton.textContent = "Writing"; - socket.send(JSON.stringify({ - type: 'writeNfcTag', - tagType: 'spool', - payload: nfcData - })); - } else { - alert('Not connected to Server. Please check connection.'); + if (socket?.readyState === WebSocket.OPEN) { + const writeButton = document.getElementById("writeNfcButton"); + writeButton.classList.add("writing"); + writeButton.textContent = "Writing"; + socket.send(JSON.stringify({ + type: 'writeNfcTag', + tagType: 'spool', + payload: nfcData + })); + } else { + alert('Not connected to Server. Please check connection.'); + } } } function writeLocationNfcTag() { - const selectedText = document.getElementById("locationSelect").value; - if (selectedText === "Please choose...") { - alert('Please select a location first.'); - return; - } - // Erstelle das NFC-Datenpaket mit korrekten Datentypen - const nfcData = { - location: String(selectedText) - }; + if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){ + const selectedText = document.getElementById("locationSelect").value; + if (selectedText === "Please choose...") { + alert('Please select a location first.'); + return; + } + // Erstelle das NFC-Datenpaket mit korrekten Datentypen + const nfcData = { + location: String(selectedText) + }; - if (socket?.readyState === WebSocket.OPEN) { - const writeButton = document.getElementById("writeLocationNfcButton"); - writeButton.classList.add("writing"); - writeButton.textContent = "Writing"; - socket.send(JSON.stringify({ - type: 'writeNfcTag', - tagType: 'location', - payload: nfcData - })); - } else { - alert('Not connected to Server. Please check connection.'); + + if (socket?.readyState === WebSocket.OPEN) { + const writeButton = document.getElementById("writeLocationNfcButton"); + writeButton.classList.add("writing"); + writeButton.textContent = "Writing"; + socket.send(JSON.stringify({ + type: 'writeNfcTag', + tagType: 'location', + payload: nfcData + })); + } else { + alert('Not connected to Server. Please check connection.'); + } } } diff --git a/src/nfc.cpp b/src/nfc.cpp index fe1a486..a68c90a 100644 --- a/src/nfc.cpp +++ b/src/nfc.cpp @@ -20,6 +20,7 @@ String lastSpoolId = ""; String nfcJsonData = ""; bool tagProcessed = false; volatile bool pauseBambuMqttTask = false; +volatile bool suspendNfcReading = false; struct NfcWriteParameterType { bool tagType; @@ -278,8 +279,10 @@ void writeJsonToTag(void *parameter) { Serial.println(params->payload); nfcReaderState = NFC_WRITING; - vTaskSuspend(RfidReaderTask); - vTaskDelay(50 / portTICK_PERIOD_MS); + suspendNfcReading = true; + //vTaskSuspend(RfidReaderTask); + // make sure to wait 600ms, after that the reading task should be waiting + vTaskDelay(1000 / portTICK_PERIOD_MS); //pauseBambuMqttTask = true; // aktualisieren der Website wenn sich der Status ändert @@ -372,7 +375,8 @@ void writeJsonToTag(void *parameter) { sendWriteResult(nullptr, success); sendNfcData(); - vTaskResume(RfidReaderTask); + suspendNfcReading = false; + //vTaskResume(RfidReaderTask); pauseBambuMqttTask = false; vTaskDelete(NULL); @@ -384,7 +388,7 @@ void startWriteJsonToTag(const bool isSpoolTag, const char* payload) { parameters->payload = strdup(payload); // Task nicht mehrfach starten - if (nfcReaderState == NFC_IDLE) { + if (nfcReaderState == NFC_IDLE || nfcReaderState == NFC_READ_ERROR || nfcReaderState == NFC_READ_SUCCESS) { oledShowProgressBar(0, 1, "Write Tag", "Place tag now"); // Erstelle die Task xTaskCreate( @@ -405,7 +409,7 @@ void scanRfidTask(void * parameter) { Serial.println("RFID Task gestartet"); for(;;) { // Wenn geschrieben wird Schleife aussetzen - if (nfcReaderState != NFC_WRITING) + if (nfcReaderState != NFC_WRITING && !suspendNfcReading) { yield(); @@ -413,7 +417,7 @@ void scanRfidTask(void * parameter) { uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID uint8_t uidLength; - success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 1000); + success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 500); foundNfcTag(nullptr, success); @@ -430,8 +434,8 @@ void scanRfidTask(void * parameter) { oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag"); - vTaskDelay(500 / portTICK_PERIOD_MS); - + //vTaskDelay(500 / portTICK_PERIOD_MS); + if (uidLength == 7) { uint16_t tagSize = readTagSize(); @@ -487,7 +491,7 @@ void scanRfidTask(void * parameter) { } } - if (!success && nfcReaderState != NFC_IDLE) + if (!success && nfcReaderState != NFC_IDLE && !suspendNfcReading) { nfcReaderState = NFC_IDLE; //uidString = ""; @@ -500,6 +504,12 @@ void scanRfidTask(void * parameter) { // aktualisieren der Website wenn sich der Status ändert sendNfcData(); } + else + { + // TBD: Debug only: + Serial.println("NFC Reading disabled"); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } yield(); } }