feat: implement robust page reading and safe tag detection with error recovery
This commit is contained in:
93
src/nfc.cpp
93
src/nfc.cpp
@@ -1678,9 +1678,75 @@ void startWriteJsonToTag(const bool isSpoolTag, const char* payload) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Robust page reading with error recovery
|
||||||
|
bool robustPageRead(uint8_t page, uint8_t* buffer) {
|
||||||
|
const int MAX_READ_ATTEMPTS = 3;
|
||||||
|
|
||||||
|
for (int attempt = 0; attempt < MAX_READ_ATTEMPTS; attempt++) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
yield();
|
||||||
|
|
||||||
|
if (nfc.ntag2xx_ReadPage(page, buffer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.printf("Page %d read failed, attempt %d/%d\n", page, attempt + 1, MAX_READ_ATTEMPTS);
|
||||||
|
|
||||||
|
// Try to stabilize connection between attempts
|
||||||
|
if (attempt < MAX_READ_ATTEMPTS - 1) {
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(25));
|
||||||
|
|
||||||
|
// Re-verify tag presence with quick check
|
||||||
|
uint8_t uid[7];
|
||||||
|
uint8_t uidLength;
|
||||||
|
if (!nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 100)) {
|
||||||
|
Serial.println("Tag lost during read operation");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Safe tag detection with manual retry logic and short timeouts
|
||||||
|
bool safeTagDetection(uint8_t* uid, uint8_t* uidLength) {
|
||||||
|
const int MAX_ATTEMPTS = 3;
|
||||||
|
const int SHORT_TIMEOUT = 100; // Very short timeout to prevent hanging
|
||||||
|
|
||||||
|
for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
||||||
|
// Watchdog reset on each attempt
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
yield();
|
||||||
|
|
||||||
|
// Use short timeout to avoid blocking
|
||||||
|
bool success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, uidLength, SHORT_TIMEOUT);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
Serial.printf("✓ Tag detected on attempt %d with %dms timeout\n", attempt + 1, SHORT_TIMEOUT);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Short pause between attempts
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(25));
|
||||||
|
|
||||||
|
// Refresh RF field after failed attempt (but not on last attempt)
|
||||||
|
if (attempt < MAX_ATTEMPTS - 1) {
|
||||||
|
nfc.SAMConfig();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void scanRfidTask(void * parameter) {
|
void scanRfidTask(void * parameter) {
|
||||||
Serial.println("RFID Task gestartet");
|
Serial.println("RFID Task gestartet");
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
// Regular watchdog reset
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
yield();
|
||||||
|
|
||||||
// Skip scanning during write operations, but keep NFC interface active
|
// Skip scanning during write operations, but keep NFC interface active
|
||||||
if (nfcReaderState != NFC_WRITING && !nfcWriteInProgress && !nfcReadingTaskSuspendRequest && !booting)
|
if (nfcReaderState != NFC_WRITING && !nfcWriteInProgress && !nfcReadingTaskSuspendRequest && !booting)
|
||||||
{
|
{
|
||||||
@@ -1691,7 +1757,8 @@ 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, 500);
|
// Use safe tag detection instead of blocking readPassiveTargetID
|
||||||
|
success = safeTagDetection(uid, &uidLength);
|
||||||
|
|
||||||
foundNfcTag(nullptr, success);
|
foundNfcTag(nullptr, success);
|
||||||
|
|
||||||
@@ -1708,9 +1775,9 @@ void scanRfidTask(void * parameter) {
|
|||||||
|
|
||||||
oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag");
|
oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag");
|
||||||
|
|
||||||
// Wait 1 second after tag detection to stabilize connection
|
// Reduced stabilization time for better responsiveness
|
||||||
Serial.println("Tag detected, waiting 1 second for stabilization...");
|
Serial.println("Tag detected, minimal stabilization...");
|
||||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
vTaskDelay(200 / portTICK_PERIOD_MS); // Reduced from 1000ms to 200ms
|
||||||
|
|
||||||
// create Tag UID string
|
// create Tag UID string
|
||||||
String uidString = "";
|
String uidString = "";
|
||||||
@@ -1753,9 +1820,10 @@ void scanRfidTask(void * parameter) {
|
|||||||
|
|
||||||
for (uint8_t i = 4; i < 4+numPages; i++) {
|
for (uint8_t i = 4; i < 4+numPages; i++) {
|
||||||
|
|
||||||
if (!nfc.ntag2xx_ReadPage(i, data+(i-4) * 4))
|
if (!robustPageRead(i, data+(i-4) * 4))
|
||||||
{
|
{
|
||||||
break; // Stop if reading fails
|
Serial.printf("Failed to read page %d after retries, stopping\n", i);
|
||||||
|
break; // Stop if reading fails after retries
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for NDEF message end
|
// Check for NDEF message end
|
||||||
@@ -1767,8 +1835,8 @@ void scanRfidTask(void * parameter) {
|
|||||||
|
|
||||||
yield();
|
yield();
|
||||||
esp_task_wdt_reset();
|
esp_task_wdt_reset();
|
||||||
// Increased delay to ensure stable reading
|
// Reduced delay for faster reading
|
||||||
vTaskDelay(pdMS_TO_TICKS(5)); // Increased from 1ms to 5ms
|
vTaskDelay(pdMS_TO_TICKS(2)); // Reduced from 5ms to 2ms
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.println("Tag reading completed, starting NDEF decode...");
|
Serial.println("Tag reading completed, starting NDEF decode...");
|
||||||
@@ -1815,10 +1883,13 @@ void scanRfidTask(void * parameter) {
|
|||||||
Serial.println("Tag nach erfolgreichem Lesen entfernt - bereit für nächsten Tag");
|
Serial.println("Tag nach erfolgreichem Lesen entfernt - bereit für nächsten Tag");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a longer pause after successful reading to prevent immediate re-reading
|
// Add a pause after successful reading to prevent immediate re-reading
|
||||||
if (nfcReaderState == NFC_READ_SUCCESS) {
|
if (nfcReaderState == NFC_READ_SUCCESS) {
|
||||||
Serial.println("Tag erfolgreich gelesen - warte 5 Sekunden vor nächstem Scan");
|
Serial.println("Tag erfolgreich gelesen - warte 3 Sekunden vor nächstem Scan");
|
||||||
vTaskDelay(5000 / portTICK_PERIOD_MS); // 5 second pause
|
vTaskDelay(3000 / portTICK_PERIOD_MS); // Reduced from 5 seconds to 3 seconds
|
||||||
|
} else {
|
||||||
|
// Faster scanning when no tag or idle state
|
||||||
|
vTaskDelay(150 / portTICK_PERIOD_MS); // Faster scan interval
|
||||||
}
|
}
|
||||||
|
|
||||||
// aktualisieren der Website wenn sich der Status ändert
|
// aktualisieren der Website wenn sich der Status ändert
|
||||||
|
Reference in New Issue
Block a user