Neues Feature: Pausieren, wenn RFID-Karte entfernt wurde

Vorab:

Dieses Feature existiert seit dem 14.7.2021 für den PN5180 und wurde am 30.9.2021 für den RC522 nachgezogen.

Was ist notwendig, um dieses Feature zu nutzen?

Eigentlich nicht viel. In settings.h muss lediglich PAUSE_WHEN_RFID_REMOVED gesetzt werden.

Wie funktioniert das Ganze?

Normalerweise legt man eine Karte auf und die Wiedergabe startet. Man kann die Karte wegnehmen oder liegen lassen - das ändert am Wiedergabemodus nichts. Legt man eine neue Karte auf, so beginnt eine andere Wiedergabe.

Aktiviert man jedoch PAUSE_WHEN_RFID_REMOVED, so beginnt die Wiedergabe wie bisher, sobald eine Karte aufgelegt wurde. Aber sie wird sofort pausiert, wenn die Karte entfernt wird. Legt man sie wieder auf, wird die Wiedergabe fortgesetzt. Davon losgelöst kann man jedoch auch weiterhin per Pause-Taste die Wiedergabe pausieren, auch wenn die Karte noch draufliegt.

Hinweis 1: Legt man eine andere „normale“ Karte auf, so beginnt eine andere Wiedergabe.
Hinweis 2: Legt man eine Modifikationskarte (2) zwischendrin auf und anschließend die eigentliche Karte (1) erneut, so startet die Wiedergabe neu (und wird nicht einfach nur fortgesetzt). Im Falle eines Hörspiels hat dies, außer einer etwas längeren Wartezeit, jedoch keine Auswirkungen, da die Wegnahme von (1) das Hörspiel pausiert und damit die letzte Abspielposition gespeichert wird.
Hinweis 3: Die Pause-Taste kann auch weiterhin benutzt werden. D.h. legt man die Karte auf, startet die Wiedergabe. Diese kann man auch bei aufgelegter Karte pausieren. Umgekehrt kann man die aufgelegte Karte auch wegnehmen und die dann automatisch vorgenommene Pausierung mit der Pause-Taste wieder beenden. Der ESPuino spielt nun vollkommen ohne Karte. Legt man die Karte jedoch wieder auf und nimmt sie wieder weg, wird wieder pausiert.

Probleme

  • Für das Feature muss dauerhaft erkannt werden, ob eine Karte aufgelegt ist oder nicht. Es kann jedoch vereinzelt immer mal zu Events kommen, bei denen das nicht klappt. Also man muss sich das so vorstellen: Es wird 100 mal gescannt und die Karte wird als aufgelegt erkannt. Plötzlich, beim Scan 101, wird die Karte als nicht mehr aufgelegt erkannt, obwohl sie weiterhin an ihrem Platz verharrt. Ein Stück weit fängt der Code von ESPuino diese Probleme ab, aber da diese schwer nachstellbar sind, ist das Ganze nicht hochgradig optimiert.
  • Für den RC522 macht es bei Problemen ggf. Sinn, in der settings.h mit dem Parameter rfidGain zu experimentieren.
2 „Gefällt mir“

Ich habe bei dieser Funktion folgendes Verhalten festgestellt:
Wenn ein Track zu ende ist, kann dieser nicht neu gestartet werden, indem der gleiche Tag neu aufgelegt wird.
Es muss zuerst ein anderer Tag aufgelegt werden, damit der vorherige Track erneut abgespielt werden kann.
Das frustriert meine Tochter aktuell sehr bei Ihrem aktuellen Lieblingslied :wink:
Könnte nicht noch zusätzlich gegen „trackFinished“ geprüft werden?

Hast du das hier aktiv?

ja, aber die Option wird ja ignoriert, wenn PAUSE_WHEN_RFID_REMOVED aktiviert ist…

Ach stimmt, hatte ich vergessen.

Ich weiß nicht, ob ich dich richtig verstehe: Reden wir von einer Playlist, die aus mehr als einem Titel besteht und sie möchte aber den ersten Titel ständig wiederholen und das durch Neuauflegen der Karte bewerkstelligen? Wenn ja: Das geht nur, wenn PAUSE_WHEN_RFID_REMOVED deaktiviert ist.

Es gäbe für diesen Fall aber zwei Möglichkeiten für dich (respektive deine Tochter):
a) Modifkationskarte „Wiederhole Titel (endlos)“.
b) Karte so anlernen, dass sie einen Titel endlos laufen lässt: „Einzelner Titel (Endlosschleife)“

Bisher handelt es sich um eine Datei, welche, wenn diese zuende gespielt wurde, durch das neue Auflegen wieder abgespielt wird.
Habe das am Wochenende selbst implementiert.
Ich prüfe in Zeile 257 von RfidPn5180.cpp zusätzlich ob: gPlayProperties == trackFinished oder playlistFinished ist.
Könnte das noch für in die RfidMfrc522.cpp und als Option in die Settings.h einbauen und einen PR erstellen - wenn gewünscht?

Ja, gerne,

Done

Hab’s nach Code-Review aufgenommen (aber selbst nich getestet).

Dankeschön!
Habs bei mir am laufen und werde die nächsten Tage intensiv testen

Ich habe die Option PAUSE_WHEN_RFID_REMOVED nicht aktiviert, aber DONT_ACCEPT_SAME_RFID_TWICE und fände es gut, auch die Funktion ACCEPT_SAME_RFID_AFTER_TRACK_END nutzen zu können. Denn sobald die Playlist zu ende ist kann die selbe Karte nicht erneut aufgelegt werden, um die Playlist nochmals zu spielen.

Oder wie wäre es mit der Möglichkeit, ganz unabhängig von den vorgenannten Optionen wenn man nach dem Ende einer Playlist CMD_PLAYPAUSE verwenden kann, um die Playlist noch einmal zu starten?

Dann teste mal

#ifdef DONT_ACCEPT_SAME_RFID_TWICE_ENABLE
	strncpy(gOldRfidTagId, "X", cardIdStringSize-1);
#endif

Und das fügst du hinter Zeile 1147 ein:

Es müsste dann, sofern ein Titel beendet wurde, beim nächsten Vergleich die gleiche Karte erneut aufgelegt werden können.

1 „Gefällt mir“

Danke für den Patch!

Ich hab das mal getestet. Prinzipiell geht es in die richtige Richtung. Bei einer Karte mit nur einem Track tut es genau was es soll. Wo es nicht funktioniert ist, wenn man mehrere Dateien eines Ordners abspielt… Dann greift der Patch nach dem ersten Track des Ordners, und ab dem Zweiten ist der Lock ausgeschaltet und der Ordner startet wieder von vorne sobald die Karte in die Nähe kommt. Auf jeden Fall ne Verbesserung zu vorher ists aber schon IMO.

Hi,
Mir ist ein Problem mit dem Feature aufgefallen. Ich habe als Testumgebung eine RC522 Modul in Verwendung (passiert aber auch mit einer PN532 mit eigenem RFID-Treiber):

  1. Karte A für Wiedergabe auflegen → Wiedergabe startet
  2. Manuell pausieren (zb mit Taste)
  3. Karte A entfernen
  4. Karte B für Mod auflegen (zB Tasten sperren) -->pausiert (ok)
  5. Karte B entfernen → pausiert (ok)
  6. Karte B auflegen → Wiedergabe startet (weil lastValidcardId nun die ID von „Karte A“ hat)
  7. Karte A auflegen → Wiedergabe startet von vorne (weil lastValidcardId mit „Karte A“ überschrieben ist → sameCardReapplied ist false)

Das Überschreiben von lastValidcardId ist auf RFID-Treiber Ebene sehr schwer zu verhindern (da die Treiber keine Info haben, ob es eine MOD-Karte oder eine PLAY-Karte ist).

Eine Abhilfe ist aus diesem Grund auf dieser Ebene sehr schwierig. Eine Lösung wäre es, die Logik in die Funktion Rfid_PreferenceLookupHandler zu heben. Diese Funktion hat Wissen über die Art der Karte und wäre damit auch besser für diese Funktionalität geeignet.

Einziges Problem, das ich habe ist, dass das mit einigen Änderungen in allen Treibern verbunden ist (zB muss die Information über die An- bzw Abwesenheit einer Karte mit übertragen werden). Ich habe nur Zugriff auf ein RC522, den PN1580 müsste ich blind überarbeiten.

Eine erste Implementation der Lösung habe ich schon zusammengeschrieben (Proof of Concept Branch ist hier zu finden). Ist aber noch mit Vorsicht zu genießen, vor allem der RC522 ist noch buggy.

Meine Frage, besteht Interesse an dem Refaktorierung und kann sich jemand bereit erklären die Tests für den Treiber für PN1580 zu übernehmen (sobald es fertig ist)?