diff --git a/src/main.cpp b/src/main.cpp index 6139daa..06ad9c2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -255,7 +255,9 @@ AsyncEventSource events("/events"); #endif TaskHandle_t mp3Play; -TaskHandle_t rfid; +#ifdef RFID_READER_TYPE_PN5180 + TaskHandle_t rfid; +#endif TaskHandle_t fileStorageTaskHandle; #ifdef NEOPIXEL_ENABLE @@ -420,7 +422,11 @@ bool processJsonRequest(char *_serialJson); void randomizePlaylist (char *str[], const uint32_t count); char ** returnPlaylistFromWebstream(const char *_webUrl); char ** returnPlaylistFromSD(File _fileOrDirectory); -void rfidScanner(void *parameter); +#ifdef RFID_READER_TYPE_PN5180 + void rfidScanner(void *parameter); +#else + void rfidScanner(void); +#endif void sleepHandler(void) ; void sortPlaylist(const char** arr, int n); bool startsWith(const char *str, const char *pre); @@ -1433,6 +1439,7 @@ size_t nvsRfidWriteWrapper (const char *_rfidCardId, const char *_track, const u // Function to play music as task void playAudio(void *parameter) { static Audio audio; + uint8_t settleCount = 0; audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); audio.setVolume(initVolume); audio.forceMono(playProperties.currentPlayMono); @@ -1848,11 +1855,6 @@ void playAudio(void *parameter) { } #endif - // If error occured: remove playlist from ESPuino - if ((playProperties.playMode != NO_PLAYLIST) && !audio.isRunning() && !playProperties.pausePlay) { - playProperties.trackFinished = true; - } - audio.loop(); if (playProperties.playlistFinished || playProperties.pausePlay) { vTaskDelay(portTICK_PERIOD_MS*10); // Waste some time if playlist is not active @@ -1860,6 +1862,19 @@ void playAudio(void *parameter) { lastTimeActiveTimestamp = millis(); // Refresh if playlist is active so uC will not fall asleep due to reaching inactivity-time } + if (audio.isRunning()) { + settleCount = 0; + } + + // If error occured: remove playlist from ESPuino + if (playProperties.playMode != NO_PLAYLIST && playProperties.playMode != BUSY && !audio.isRunning() && !playProperties.pausePlay) { + if (settleCount++ == 50) { // Hack to give audio some time to settle down after playlist was generated + playProperties.playlistFinished = true; + playProperties.playMode = NO_PLAYLIST; + settleCount = 0; + } + } + esp_task_wdt_reset(); // Don't forget to feed the dog! } vTaskDelete(NULL); @@ -1867,72 +1882,66 @@ void playAudio(void *parameter) { #if defined RFID_READER_TYPE_MFRC522_SPI || defined RFID_READER_TYPE_MFRC522_I2C -// Instructs RFID-scanner to scan for new RFID-tags -void rfidScanner(void *parameter) { +// Instructs RFID-scanner to scan for new RFID-tags using RC522 (running as function) +void rfidScanner(void) { byte cardId[cardIdSize]; char *cardIdString; - for (;;) { - esp_task_wdt_reset(); - vTaskDelay(10); - if ((millis() - lastRfidCheckTimestamp) >= RFID_SCAN_INTERVAL) { - lastRfidCheckTimestamp = millis(); - // Reset the loop if no new card is present on the sensor/reader. This saves the entire process when idle. + if ((millis() - lastRfidCheckTimestamp) >= RFID_SCAN_INTERVAL) { + lastRfidCheckTimestamp = millis(); + // Reset the loop if no new card is present on the sensor/reader. This saves the entire process when idle. - if (!mfrc522.PICC_IsNewCardPresent()) { - continue; - } + if (!mfrc522.PICC_IsNewCardPresent()) { + return; + } - // Select one of the cards - if (!mfrc522.PICC_ReadCardSerial()) { - continue; - } + // Select one of the cards + if (!mfrc522.PICC_ReadCardSerial()) { + return; + } - //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); - mfrc522.PICC_HaltA(); - mfrc522.PCD_StopCrypto1(); + //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); + mfrc522.PICC_HaltA(); + mfrc522.PCD_StopCrypto1(); - if (psramInit()) { - cardIdString = (char *) ps_malloc(cardIdSize*3 +1); - } else { - cardIdString = (char *) malloc(cardIdSize*3 +1); - } + if (psramInit()) { + cardIdString = (char *) ps_malloc(cardIdSize*3 +1); + } else { + cardIdString = (char *) malloc(cardIdSize*3 +1); + } - if (cardIdString == NULL) { - logger(serialDebug, (char *) FPSTR(unableToAllocateMem), LOGLEVEL_ERROR); - #ifdef NEOPIXEL_ENABLE - showLedError = true; - #endif - continue; - } + if (cardIdString == NULL) { + logger(serialDebug, (char *) FPSTR(unableToAllocateMem), LOGLEVEL_ERROR); + #ifdef NEOPIXEL_ENABLE + showLedError = true; + #endif + return; + } - uint8_t n = 0; - logger(serialDebug, (char *) FPSTR(rfidTagDetected), LOGLEVEL_NOTICE); - for (uint8_t i=0; i