From d36ffa9658f0a340193a9358398de9aafcb47bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Vo=C3=9F?= Date: Sun, 16 Sep 2018 23:17:13 +0200 Subject: [PATCH] Bugfix --- Tonuino.ino | 94 ++++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/Tonuino.ino b/Tonuino.ino index 7f26d06..90da64b 100644 --- a/Tonuino.ino +++ b/Tonuino.ino @@ -8,7 +8,7 @@ // DFPlayer Mini SoftwareSerial mySoftwareSerial(2, 3); // RX, TX uint16_t numTracksInFolder; -uint16_t track; +uint16_t currentTrack; // this object stores nfc tag data struct nfcTagObject { @@ -21,7 +21,7 @@ struct nfcTagObject { nfcTagObject myCard; -static void nextTrack(); +static void nextTrack(uint16_t track); int voiceMenu(int numberOfOptions, int startMessage, int messageOffset, bool preview = false, int previewFromFolder = 0); @@ -42,7 +42,7 @@ public: Serial.print("Track beendet"); Serial.println(track); delay(100); - nextTrack(); + nextTrack(track); } static void OnCardOnline(uint16_t code) { Serial.println(F("SD Karte online ")); @@ -58,8 +58,15 @@ public: static DFMiniMp3 mp3(mySoftwareSerial); // Leider kann das Modul keine Queue abspielen. -static void nextTrack() { - if (knownCard == false) +static uint16_t _lastTrackFinished; +static void nextTrack(uint16_t track) { + if (track == _lastTrackFinished) { + Serial.println("DFPlayer mit buggy Firmware - doppelter Callback ignoriert"); + return; + } + _lastTrackFinished = track; + + if (knownCard == false) // Wenn eine neue Karte angelernt wird soll das Ende eines Tracks nicht // verarbeitet werden return; @@ -69,69 +76,70 @@ static void nextTrack() { mp3.sleep(); } if (myCard.mode == 2) { - if (track != numTracksInFolder) { - track = track + 1; - mp3.playFolderTrack(myCard.folder, track); + if (currentTrack != numTracksInFolder) { + currentTrack = currentTrack + 1; + mp3.playFolderTrack(myCard.folder, currentTrack); Serial.print(F("Albummodus ist aktiv -> nächster Track: ")); - Serial.print(track); + Serial.print(currentTrack); } else mp3.sleep(); } if (myCard.mode == 3) { - track = random(1, numTracksInFolder + 1); + currentTrack = random(1, numTracksInFolder + 1); Serial.print(F("Party Modus ist aktiv -> zufälligen Track spielen: ")); - Serial.println(track); - mp3.playFolderTrack(myCard.folder, track); + Serial.println(currentTrack); + mp3.playFolderTrack(myCard.folder, currentTrack); } if (myCard.mode == 4) { Serial.println(F("Einzel Modus aktiv -> Strom sparen")); mp3.sleep(); } if (myCard.mode == 5) { - if (track != numTracksInFolder) { - track = track + 1; + if (currentTrack != numTracksInFolder) { + currentTrack = currentTrack + 1; Serial.print(F("Hörbuch Modus ist aktiv -> nächster Track und " "Fortschritt speichern")); - Serial.println(track); - mp3.playFolderTrack(myCard.folder, track); + Serial.println(currentTrack); + mp3.playFolderTrack(myCard.folder, currentTrack); // Fortschritt im EEPROM abspeichern - EEPROM.write(myCard.folder, track); - } else + EEPROM.write(myCard.folder, currentTrack); + } else { mp3.sleep(); // Fortschritt zurück setzen EEPROM.write(myCard.folder, 1); + } } } static void previousTrack() { if (myCard.mode == 1) { Serial.println(F("Hörspielmodus ist aktiv -> Track von vorne spielen")); - mp3.playFolderTrack(myCard.folder, track); + mp3.playFolderTrack(myCard.folder, currentTrack); } if (myCard.mode == 2) { Serial.println(F("Albummodus ist aktiv -> vorheriger Track")); - if (track != 1) { - track = track - 1; + if (currentTrack != 1) { + currentTrack = currentTrack - 1; } - mp3.playFolderTrack(myCard.folder, track); + mp3.playFolderTrack(myCard.folder, currentTrack); } if (myCard.mode == 3) { Serial.println(F("Party Modus ist aktiv -> Track von vorne spielen")); - mp3.playFolderTrack(myCard.folder, track); + mp3.playFolderTrack(myCard.folder, currentTrack); } if (myCard.mode == 4) { Serial.println(F("Einzel Modus aktiv -> Track von vorne spielen")); - mp3.playFolderTrack(myCard.folder, track); + mp3.playFolderTrack(myCard.folder, currentTrack); } if (myCard.mode == 5) { Serial.println(F("Hörbuch Modus ist aktiv -> vorheriger Track und " "Fortschritt speichern")); - if (track != 1) { - track = track - 1; + if (currentTrack != 1) { + currentTrack = currentTrack - 1; } - mp3.playFolderTrack(myCard.folder, track); + mp3.playFolderTrack(myCard.folder, currentTrack); // Fortschritt im EEPROM abspeichern - EEPROM.write(myCard.folder, track); + EEPROM.write(myCard.folder, currentTrack); } } @@ -183,9 +191,8 @@ void setup() { // DFPlayer Mini initialisieren mp3.begin(); - mp3.reset(); mp3.setVolume(15); - + // NFC Leser initialisieren SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 @@ -226,7 +233,7 @@ void loop() { } else if (pauseButton.pressedFor(LONG_PRESS) && ignorePauseButton == false) { if (isPlaying()) - mp3.playAdvertisement(track); + mp3.playAdvertisement(currentTrack); else { knownCard = false; mp3.playMp3FolderTrack(800); @@ -244,7 +251,7 @@ void loop() { ignoreUpButton = true; } else if (upButton.wasReleased()) { if (!ignoreUpButton) - nextTrack(); + nextTrack(currentTrack); else ignoreUpButton = false; } @@ -276,36 +283,36 @@ void loop() { // Hörspielmodus: eine zufällige Datei aus dem Ordner if (myCard.mode == 1) { Serial.println(F("Hörspielmodus -> zufälligen Track wiedergeben")); - track = random(1, numTracksInFolder + 1); - Serial.println(track); - mp3.playFolderTrack(myCard.folder, track); + currentTrack = random(1, numTracksInFolder + 1); + Serial.println(currentTrack); + mp3.playFolderTrack(myCard.folder, currentTrack); } // Album Modus: kompletten Ordner spielen if (myCard.mode == 2) { Serial.println(F("Album Modus -> kompletten Ordner wiedergeben")); - track = 1; - mp3.playFolderTrack(myCard.folder, track); + currentTrack = 1; + mp3.playFolderTrack(myCard.folder, currentTrack); } // Party Modus: Ordner in zufälliger Reihenfolge if (myCard.mode == 3) { Serial.println( F("Party Modus -> Ordner in zufälliger Reihenfolge wiedergeben")); - track = random(1, numTracksInFolder + 1); - mp3.playFolderTrack(myCard.folder, track); + currentTrack = random(1, numTracksInFolder + 1); + mp3.playFolderTrack(myCard.folder, currentTrack); } // Einzel Modus: eine Datei aus dem Ordner abspielen if (myCard.mode == 4) { Serial.println( F("Einzel Modus -> eine Datei aus dem Odrdner abspielen")); - track = myCard.special; - mp3.playFolderTrack(myCard.folder, track); + currentTrack = myCard.special; + mp3.playFolderTrack(myCard.folder, currentTrack); } // Hörbuch Modus: kompletten Ordner spielen und Fortschritt merken if (myCard.mode == 5) { Serial.println(F("Hörbuch Modus -> kompletten Ordner spielen und " "Fortschritt merken")); - track = EEPROM.read(myCard.folder); - mp3.playFolderTrack(myCard.folder, track); + currentTrack = EEPROM.read(myCard.folder); + mp3.playFolderTrack(myCard.folder, currentTrack); } } @@ -560,4 +567,3 @@ void dump_byte_array(byte *buffer, byte bufferSize) { Serial.print(buffer[i], HEX); } } -