Further improvements on NFC writing

Fixes some issues related to tag writing. Allos writing of tags that are already on the scale when pressing the write button, but introduces a confirmation dialog before doing so. Also first test to fix reset issue when trying to write tags.
This commit is contained in:
Jan Philipp Ecker
2025-08-07 21:12:01 +02:00
parent 09f4c43f89
commit b95497aec2
2 changed files with 90 additions and 71 deletions

View File

@@ -7,6 +7,7 @@ let heartbeatTimer = null;
let lastHeartbeatResponse = Date.now(); let lastHeartbeatResponse = Date.now();
const HEARTBEAT_TIMEOUT = 20000; const HEARTBEAT_TIMEOUT = 20000;
let reconnectTimer = null; let reconnectTimer = null;
let spoolDetected = false;
// WebSocket Funktionen // WebSocket Funktionen
function startHeartbeat() { function startHeartbeat() {
@@ -508,12 +509,15 @@ function updateNfcStatusIndicator(data) {
if (data.found === 0) { if (data.found === 0) {
// Kein NFC Tag gefunden // Kein NFC Tag gefunden
indicator.className = 'status-circle'; indicator.className = 'status-circle';
spoolDetected = false;
} else if (data.found === 1) { } else if (data.found === 1) {
// NFC Tag erfolgreich gelesen // NFC Tag erfolgreich gelesen
indicator.className = 'status-circle success'; indicator.className = 'status-circle success';
spoolDetected = true;
} else { } else {
// Fehler beim Lesen // Fehler beim Lesen
indicator.className = 'status-circle error'; indicator.className = 'status-circle error';
spoolDetected = true;
} }
} }
@@ -618,78 +622,83 @@ function updateNfcData(data) {
} }
function writeNfcTag() { function writeNfcTag() {
const selectedText = document.getElementById("selected-filament").textContent; if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){
if (selectedText === "Please choose...") { const selectedText = document.getElementById("selected-filament").textContent;
alert('Please select a Spool first.'); if (selectedText === "Please choose...") {
return; alert('Please select a Spool first.');
} return;
}
const spoolsData = window.getSpoolData(); const spoolsData = window.getSpoolData();
const selectedSpool = spoolsData.find(spool => const selectedSpool = spoolsData.find(spool =>
`${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText `${spool.id} | ${spool.filament.name} (${spool.filament.material})` === selectedText
); );
if (!selectedSpool) { if (!selectedSpool) {
alert('Ausgewählte Spule konnte nicht gefunden werden.'); alert('Ausgewählte Spule konnte nicht gefunden werden.');
return; return;
} }
// Temperaturwerte korrekt extrahieren // Temperaturwerte korrekt extrahieren
let minTemp = "175"; let minTemp = "175";
let maxTemp = "275"; let maxTemp = "275";
if (Array.isArray(selectedSpool.filament.nozzle_temperature) && if (Array.isArray(selectedSpool.filament.nozzle_temperature) &&
selectedSpool.filament.nozzle_temperature.length >= 2) { selectedSpool.filament.nozzle_temperature.length >= 2) {
minTemp = String(selectedSpool.filament.nozzle_temperature[0]); minTemp = String(selectedSpool.filament.nozzle_temperature[0]);
maxTemp = String(selectedSpool.filament.nozzle_temperature[1]); maxTemp = String(selectedSpool.filament.nozzle_temperature[1]);
} }
// Erstelle das NFC-Datenpaket mit korrekten Datentypen // Erstelle das NFC-Datenpaket mit korrekten Datentypen
const nfcData = { const nfcData = {
color_hex: selectedSpool.filament.color_hex || "FFFFFF", color_hex: selectedSpool.filament.color_hex || "FFFFFF",
type: selectedSpool.filament.material, type: selectedSpool.filament.material,
min_temp: minTemp, min_temp: minTemp,
max_temp: maxTemp, max_temp: maxTemp,
brand: selectedSpool.filament.vendor.name, brand: selectedSpool.filament.vendor.name,
sm_id: String(selectedSpool.id) // Konvertiere zu String sm_id: String(selectedSpool.id) // Konvertiere zu String
}; };
if (socket?.readyState === WebSocket.OPEN) { if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeNfcButton"); const writeButton = document.getElementById("writeNfcButton");
writeButton.classList.add("writing"); writeButton.classList.add("writing");
writeButton.textContent = "Writing"; writeButton.textContent = "Writing";
socket.send(JSON.stringify({ socket.send(JSON.stringify({
type: 'writeNfcTag', type: 'writeNfcTag',
tagType: 'spool', tagType: 'spool',
payload: nfcData payload: nfcData
})); }));
} else { } else {
alert('Not connected to Server. Please check connection.'); alert('Not connected to Server. Please check connection.');
}
} }
} }
function writeLocationNfcTag() { function writeLocationNfcTag() {
const selectedText = document.getElementById("locationSelect").value; if(!spoolDetected || confirm("Are you sure you want to overwrite the Tag?") == true){
if (selectedText === "Please choose...") { const selectedText = document.getElementById("locationSelect").value;
alert('Please select a location first.'); if (selectedText === "Please choose...") {
return; alert('Please select a location first.');
} return;
// Erstelle das NFC-Datenpaket mit korrekten Datentypen }
const nfcData = { // Erstelle das NFC-Datenpaket mit korrekten Datentypen
location: String(selectedText) const nfcData = {
}; location: String(selectedText)
};
if (socket?.readyState === WebSocket.OPEN) {
const writeButton = document.getElementById("writeLocationNfcButton"); if (socket?.readyState === WebSocket.OPEN) {
writeButton.classList.add("writing"); const writeButton = document.getElementById("writeLocationNfcButton");
writeButton.textContent = "Writing"; writeButton.classList.add("writing");
socket.send(JSON.stringify({ writeButton.textContent = "Writing";
type: 'writeNfcTag', socket.send(JSON.stringify({
tagType: 'location', type: 'writeNfcTag',
payload: nfcData tagType: 'location',
})); payload: nfcData
} else { }));
alert('Not connected to Server. Please check connection.'); } else {
alert('Not connected to Server. Please check connection.');
}
} }
} }

View File

@@ -20,6 +20,7 @@ String lastSpoolId = "";
String nfcJsonData = ""; String nfcJsonData = "";
bool tagProcessed = false; bool tagProcessed = false;
volatile bool pauseBambuMqttTask = false; volatile bool pauseBambuMqttTask = false;
volatile bool suspendNfcReading = false;
struct NfcWriteParameterType { struct NfcWriteParameterType {
bool tagType; bool tagType;
@@ -278,8 +279,10 @@ void writeJsonToTag(void *parameter) {
Serial.println(params->payload); Serial.println(params->payload);
nfcReaderState = NFC_WRITING; nfcReaderState = NFC_WRITING;
vTaskSuspend(RfidReaderTask); suspendNfcReading = true;
vTaskDelay(50 / portTICK_PERIOD_MS); //vTaskSuspend(RfidReaderTask);
// make sure to wait 600ms, after that the reading task should be waiting
vTaskDelay(1000 / portTICK_PERIOD_MS);
//pauseBambuMqttTask = true; //pauseBambuMqttTask = true;
// aktualisieren der Website wenn sich der Status ändert // aktualisieren der Website wenn sich der Status ändert
@@ -372,7 +375,8 @@ void writeJsonToTag(void *parameter) {
sendWriteResult(nullptr, success); sendWriteResult(nullptr, success);
sendNfcData(); sendNfcData();
vTaskResume(RfidReaderTask); suspendNfcReading = false;
//vTaskResume(RfidReaderTask);
pauseBambuMqttTask = false; pauseBambuMqttTask = false;
vTaskDelete(NULL); vTaskDelete(NULL);
@@ -384,7 +388,7 @@ void startWriteJsonToTag(const bool isSpoolTag, const char* payload) {
parameters->payload = strdup(payload); parameters->payload = strdup(payload);
// Task nicht mehrfach starten // 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"); oledShowProgressBar(0, 1, "Write Tag", "Place tag now");
// Erstelle die Task // Erstelle die Task
xTaskCreate( xTaskCreate(
@@ -405,7 +409,7 @@ void scanRfidTask(void * parameter) {
Serial.println("RFID Task gestartet"); Serial.println("RFID Task gestartet");
for(;;) { for(;;) {
// Wenn geschrieben wird Schleife aussetzen // Wenn geschrieben wird Schleife aussetzen
if (nfcReaderState != NFC_WRITING) if (nfcReaderState != NFC_WRITING && !suspendNfcReading)
{ {
yield(); 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 uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 1000); success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 500);
foundNfcTag(nullptr, success); foundNfcTag(nullptr, success);
@@ -430,8 +434,8 @@ void scanRfidTask(void * parameter) {
oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag"); oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag");
vTaskDelay(500 / portTICK_PERIOD_MS); //vTaskDelay(500 / portTICK_PERIOD_MS);
if (uidLength == 7) if (uidLength == 7)
{ {
uint16_t tagSize = readTagSize(); 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; nfcReaderState = NFC_IDLE;
//uidString = ""; //uidString = "";
@@ -500,6 +504,12 @@ void scanRfidTask(void * parameter) {
// aktualisieren der Website wenn sich der Status ändert // aktualisieren der Website wenn sich der Status ändert
sendNfcData(); sendNfcData();
} }
else
{
// TBD: Debug only:
Serial.println("NFC Reading disabled");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
yield(); yield();
} }
} }