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) { | ||||
|   Serial.println("RFID Task gestartet"); | ||||
|   for(;;) { | ||||
|     // Regular watchdog reset | ||||
|     esp_task_wdt_reset(); | ||||
|     yield(); | ||||
|      | ||||
|     // Skip scanning during write operations, but keep NFC interface active | ||||
|     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 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); | ||||
|        | ||||
| @@ -1708,9 +1775,9 @@ void scanRfidTask(void * parameter) { | ||||
|  | ||||
|         oledShowProgressBar(0, octoEnabled?5:4, "Reading", "Detecting tag"); | ||||
|  | ||||
|         // Wait 1 second after tag detection to stabilize connection | ||||
|         Serial.println("Tag detected, waiting 1 second for stabilization..."); | ||||
|         vTaskDelay(1000 / portTICK_PERIOD_MS); | ||||
|         // Reduced stabilization time for better responsiveness | ||||
|         Serial.println("Tag detected, minimal stabilization..."); | ||||
|         vTaskDelay(200 / portTICK_PERIOD_MS); // Reduced from 1000ms to 200ms | ||||
|  | ||||
|         // create Tag UID string | ||||
|         String uidString = ""; | ||||
| @@ -1753,9 +1820,10 @@ void scanRfidTask(void * parameter) { | ||||
|              | ||||
|             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 | ||||
| @@ -1767,8 +1835,8 @@ void scanRfidTask(void * parameter) { | ||||
|  | ||||
|               yield(); | ||||
|               esp_task_wdt_reset(); | ||||
|               // Increased delay to ensure stable reading | ||||
|               vTaskDelay(pdMS_TO_TICKS(5)); // Increased from 1ms to 5ms | ||||
|               // Reduced delay for faster reading | ||||
|               vTaskDelay(pdMS_TO_TICKS(2)); // Reduced from 5ms to 2ms | ||||
|             } | ||||
|              | ||||
|             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"); | ||||
|       } | ||||
|  | ||||
|       // 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) { | ||||
|         Serial.println("Tag erfolgreich gelesen - warte 5 Sekunden vor nächstem Scan"); | ||||
|         vTaskDelay(5000 / portTICK_PERIOD_MS); // 5 second pause | ||||
|         Serial.println("Tag erfolgreich gelesen - warte 3 Sekunden vor nächstem Scan"); | ||||
|         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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user