inputlirc startet zu früh (Upstart)

  • Hallo,


    ich nutze inputlirc für meine imon Fernbedienung.


    Zum Start verwende ich folgendes Upstart-Skript:


    In /etc/default/inputlirc steht

    Code
    EVENTS="/dev/input/by-id/usb-15c2_ffdc-event-if00"
    OPTIONS="-g -m 0"


    Manchmal kommt es vor, dass die Fernbedienung nicht funktioniert.
    Dann habe ich folgendes im syslog


    Das Upstart-Skript wird offenbar aufgerufen bevor /dev/input/by-id/usb-15c2_ffdc-event-if00 vorhanden ist.
    Wenn ich dann per Console nachschaue, ist das Device vorhanden. War dann wohl genug Zeit vergangen.


    Wie bereits geschrieben tritt der Fehler nicht immer auf. Liegt wahrscheinlich am schnellen Start wegen der SSD.


    Was kann ich als Startbedingung für inputlirc angeben, damit /dev/input/by-id/usb-15c2_ffdc-event-if00 vorhanden ist?


    Gruß
    Guido

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Was kann ich als Startbedingung für inputlirc angeben, damit /dev/input/by-id/usb-15c2_ffdc-event-if00 vorhanden ist?


    Du kannst z.B. darauf warten:

    Code
    pre-start script
    while [ ! -e /dev/input/by-id/usb-15c2_ffdc-event-if00 ]; do
       sleep 1
    done
    end script


    Viel eleganter geht es mit eventlircd, weil der Empfänger einfach über udev erkannt werden kann und eingebunden wird, sobald er bereit ist...

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hallo Seahawk,


    ich hatte halt gehofft, dass es ein Upstart-Event gibt, auf das man warten kann.
    Auf die Lösung mit "Sleep" bin ich natürlich auch gekommen.


    Dazu habe ich jetzt noch eine weitere Frage.


    Der VDR will sich ja beim Start mit dem Socket /var/run/lirc/lircd verbinden.
    Der Socket wird nach meinem Verständnis aber erst von inputlircd angelegt.
    Wenn sich der VDR mit dem Socket verbinden will bevor das "Sleep" abgelaufen ist, habe ich ja wieder ein Problem.


    Ich habe noch nicht verstanden warum ich dieses Timing-Problem mit eventlircd deiner Meinung nach nicht habe.


    Das müsste dann ja bedeuten, dass
    - inputlircd den Socket /var/run/lirc/lircd erst bereitstellt, wenn das Device /dev/input/by-id/usb-15c2_ffdc-event-if00 vorhanden ist
    - eventlircd direkt beim Start den Socket /var/run/lirc/lircd bereitstellt und das Device später einbindet, wenn es vorhanden ist


    Habe ich das so richtig verstanden?

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Wenn sich der VDR mit dem Socket verbinden will bevor das "Sleep" abgelaufen ist, habe ich ja wieder ein Problem.


    Höchstens für jeweils drei Sekunden, bis der VDR den nächsten Versuch startet sich mit dem Lirc-Sockel zu verbinden: http://projects.vdr-developer.…t/vdr.git/tree/lirc.c#n70


    Das müsste dann ja bedeuten, dass
    - inputlircd den Socket /var/run/lirc/lircd erst bereitstellt, wenn das Device /dev/input/by-id/usb-15c2_ffdc-event-if00 vorhanden ist
    - eventlircd direkt beim Start den Socket /var/run/lirc/lircd bereitstellt und das Device später einbindet, wenn es vorhanden ist


    Genau, inputlircd kann erst erfolgreich starten, wenn das Gerät von dem es Tastendrücke auslesen soll vorhanden ist.
    Mit eventlircd hast du keine direkten Abhängigkeiten von angeschlossenen Geräten mehr und später hinzukommende Geräte werden automatisch nach der Erkennung über udev eingebunden, wenn man entsprechende Regeln angelegt hat.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Moin!


    Wenn der vdr vom Start von inputlirc abhängig ist, dann muss man das in den Upstart-Abhängigkeiten berücksichtigen.
    Also bei inputlirc bei "start on" noch zusätzlich "and starting vdr". inputlirc wird also nur dann gestartet, wenn der vdr gestartet werden soll, aber auf alle Fälle vor dem vdr.


    Bei Upstart 1.8 wird's ein Event geben, ist aber noch kein Standard bei Precise: http://upstart.ubuntu.com/cookbook/#upstart-udev-bridge


    Das Upstart-Cookbook ist immer eine Lektüre wert.


    Lars.

  • Das sollte für inputlircd dann vermutlich so etwas sein:

    Code
    start on input-device-changed DEVPATH=/dev/input/by-id/usb-15c2_ffdc-event-if00

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)


  • Höchstens für jeweils drei Sekunden, bis der VDR den nächsten Versuch startet sich mit dem Lirc-Sockel zu verbinden: http://projects.vdr-developer.…t/vdr.git/tree/lirc.c#n70


    Ich habe das jetzt mal getestet:

    Code
    guido@miraculix:~$ sudo stop inputlirc
    inputlirc stop/waiting
    guido@miraculix:~$ sudo stop vdr-backend
    vdr-backend stop/waiting
    guido@miraculix:~$ sudo start vdr-backend
    vdr-backend start/running, process 3039


    Im syslog habe ich nur genau einmal folgende Meldung

    Code
    Oct 14 11:30:45 miraculix vdr: [3039] ERROR (lirc.c,45): /var/run/lirc/lircd: Verbindungsaufbau abgelehnt
    Oct 14 11:30:45 miraculix vdr: [3039] ERROR: remote control LIRC not ready!


    Code
    guido@miraculix:~$ vdr -V
    vdr (2.1.1/2.1.1) - The Video Disk Recorder

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Im syslog habe ich nur genau einmal folgende Meldung


    Und was passiert, wenn du den vdr weiterlaufen lässt, und dann inputlirc startest?


    Lars.

  • Im syslog habe ich nur genau einmal folgende Meldung


    Da sollte aber danach sowas kommen, wenn inputlircd wieder läuft:

    Code
    reconnected to lircd


    Bei mir sieht das so aus, wenn ich eventlircd stoppe und dann wieder starten lasse - sowohl das Frontend-Skript in yaVDR als auch der VDR selbst verbinden sich erneut mit dem Lirc-Sockel, wenn eventlircd wieder gestartet wird:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)


  • Und was passiert, wenn du den vdr weiterlaufen lässt, und dann inputlirc startest?


    Dann steht im Syslog, dass inputlirc erfolgreich gestartet wurde.
    Keine Meldung vom VDR bezüglich lirc


    Ich bin nur per SSH auf dem Rechner. Kann also die Funktion der FB nicht testen.

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Ein etwas anderer Test.
    Bei laufendem VDR und laufendem inputlircd den inputlircd stoppen und wieder starten

    Code
    guido@miraculix:~$ sudo status vdr-backend 
    vdr-backend start/running, process 3039
    guido@miraculix:~$ sudo status inputlirc
    inputlirc start/running, process 3262
    guido@miraculix:~$ sudo stop inputlirc
    inputlirc stop/waiting
    guido@miraculix:~$ sudo start inputlirc
    inputlirc start/running, process 3350


    Gleiches Ergebnis. Keine Meldung vom VDR bezüglich lirc im Syslog

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • "ERROR: remote control LIRC not ready!" scheint nur zu kommen, wenn die Fernbedienung angelernt werden soll.


    Hast du eine vernünftige remote.conf? Im vdr-Quelltext finde ich diese Fehlermeldung nur bei "LearnKeys".


    Lars.

  • Ich muss mich korrigieren, die Meldung kommt auch bei vorhandener remote.conf, wenn das cRemote-Objekt noch nicht bereit ist.


    Lars.


  • Hast du eine vernünftige remote.conf? Im vdr-Quelltext finde ich diese Fehlermeldung nur bei "LearnKeys".


    Was meinst du mit "vernünftig"?
    Die FB funktioniert im VDR, wenn inputlircd sauber gestartet wurde.


    Edit: o.k. Antworten haben sich überschnitten

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Ich hab jetzt mal ein wenig den vdr-Quelltext studiert.
    Konstruktor von cLircRemote:


    D.h., wenn beim Start keine Verbindung zum Socket hergestellt werden kann, wird der Thread nicht gestartet. Aber der sorgt dafür, dass bei Verbindungsverlust wieder neu verbunden wird:


    Eventuell müsste man mal probieren, ob man mit einem geänderten Konstruktor das verbessern könnte:

    Code
    cLircRemote::cLircRemote(const char *DeviceName)
    :cRemote("LIRC")
    ,cThread("LIRC remote control")
    {
      addr.sun_family = AF_UNIX;
      strcpy(addr.sun_path, DeviceName);
      if (!Connect())
         f = -1;
      Start();
    }


    Und in der Action müsste man die Prüfung auf "f >= 0" entfernen, weil sonst der Loop nicht läuft:

    Code
    -  while (Running() && f >= 0) {
    +  while (Running()) {


    Was das jetzt aber für Nebenwirkungen haben könnte, weiß ich nicht, das müsste man noch mal genauer prüfen. Ich "programmiere" hier gerade nur ins Unreine...
    Könnte evtl. sein, dass der Loop bei Programmende hängt oder so. Kann auch sein, dass es so noch gar nicht funktioniert, muss noch herausfinden, wie cFile::FileReady reagiert, wenn der fd < 0 ist. Ah, sehe schon, dann würde ready == false sein, d.h. der Reconnect-Loop wird nicht durchlaufen. Geht also leider nicht so auf die Schnelle, dafür brauche ich mehr Zeit...


    Lars.

  • Habe jetzt nochmal getestet


    Bei laufendem inputlirc den VDR gestartet ==> Verbindung zum Socket ist erfolgreich
    Inputlirc gestopped ==> Verbindung zum Socket geht verloren
    Inputlirc wieder gestartet ==> Verbindung zum Socket wird erneut hergestellt



    Bei gestopptem inputlirc den VDR gestartet ==> keine Verbindung zum Socket
    Inputlirc gestartet ==> kein erneuter Verbindungsversuch

    Code
    Oct 14 13:16:35 miraculix vdr: [3940] ERROR (lirc.c,45): /var/run/lirc/lircd: Verbindungsaufbau abgelehnt
    Oct 14 13:16:35 miraculix vdr: [3940] ERROR: remote control LIRC not ready!
    ...
    Oct 14 13:18:18 miraculix inputlirc.conf: Starting inputlirc mit -g -m 0 /dev/input/by-id/usb-15c2_ffdc-event-if00...
    Oct 14 13:18:18 miraculix inputlircd: Started
    ...



    D.h. der VDR versucht sich nur dann erneut mit dem Socket zu verbinden, wenn er beim Start eine Verbindung bekommen hat. So wie Lars es geschrieben hat.

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Wahrscheinlich könnte ich heute Abend mal einen Patch hinbekommen, der dafür sorgt, dass der vdr immer versucht, den Socket neu zu verbinden, auch wenn er bei Programmstart noch nicht da ist.
    Dafür brauche ich ein bisschen Ruhe, um die Sonderfälle einmal durchzuspielen. Hier auf Arbeit zwischendurch wird das nichts... :)


    Lars.

  • Wie löse ich jetzt mein Problem?


    1. Lösungsvorschlag von Lars:

    Moin!
    Also bei inputlirc bei "start on" noch zusätzlich "and starting vdr". inputlirc wird also nur dann gestartet, wenn der vdr gestartet werden soll, aber auf alle Fälle vor dem vdr.


    Damit wird inputlircd zwar vor dem VDR gestartet.
    Wenn dann das Device aber noch nicht da ist, wird auch der Socket nicht angelegt und der VDR kann sich nicht verbinden.
    Da das beim Start des VDR passiert, wird auch kein erneuter Verbindungsversuch unternommen.
    Kann so mMn nicht funktionieren. Oder habe ich das falsch verstanden?


    2. Lösungsvorschlag von Lars bzw. Seahawk:

    Code
    start on input-device-changed DEVPATH=/dev/input/by-id/usb-15c2_ffdc-event-if00


    Hier sehe ich das gleiche Problem wie beim 1. Lösungsvorschlag


    3. Lösungsmöglichkeit
    Im Upstart-Script des VDR warten bis der Socket /var/run/lirc/lircd bereit ist.
    z.B.

    Code
    sudo netstat --listening --unix | grep lircd
    unix  2      [ ACC ]     STREAM     HÖRT         24355    /var/run/lirc/lircd


    4. Lösungsmöglichkeit
    Umstellung auf eventlircd + Lösungsvorschlag 1
    Da der Socket beim Start von eventlircd direkt angelegt wird (auch wenn noch kein Device vorhanden ist), kann der VDR direkt darauf zugreifen.
    Das Device wird dann eingebunden, wenn es verfügbar ist



    Passt das soweit?

    HW: Gigabyte EP41-UD3L | Core2Duo 7400 | 2GB Kingston | MSI N220GT-MD1GZ (passiv) | L4M-Twin S2 ver 6.5 mit Flex S2 | Silverstone LC16M mit iMON VFD | Samsung LE46B750
    SW: Xubuntu 14.04 3.13.0-24 | NVIDIA 304.117 | vdr 2.1.6 | softhddevice | inputlirc | lcdproc

  • Bei (1) dachte ich eher an eine Kombination: also geänderte Startbedingung und die while-Schleife, bis das Device da ist.


    Lars.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!