Kann man einen viruellen FB Tastendruck per SW senden?

  • Hallo an die ActionMap Speziellisten,


    gibt es eine Möglichkeit, statt auf der Fernbedienung die z.B "1" zu drücken

    einen virtuellen Tastendruck zu erzeugen, der z.B. nach "NumberActions" (aus keymap.xml)

    einen einen "KEY_1" Tastendruck sendet?


    Bin mal gespannt!


    /Willi/

  • So kannst du einen Tastendruck senden:

    Python
    from enigma import eActionMap
    eActionMap.getInstance().keyPressed(remotetype,key,flag)

    Die 3 Werte sind dabei wie folgt zu belegen:


    Remotetype
    TYPE_STANDARD = "dreambox remote control (native)"
    TYPE_ADVANCED = "dreambox advanced remote control (native)"
    TYPE_KEYBOARD = "dreambox ir keyboard"


    Key

    Welche Taste, welchen Tastencode hat, findest du hier:

    git.opendreambox.org Git - enigma2.git/blob - usr/lib/enigma2/python/keyids.py


    Flags
    FLAG_MAKE = 0 # m = make -> Normal key press
    FLAG_BREAK = 1 # b = break -> Key released
    FLAG_REPEAT = 2 # r = repeat -> Key locked (pressed continuously)
    FLAG_LONG = 3 # l = long -> Long key press
    FLAG_ASCII = 4 # ??


    Beim Senden von Tasten ist es ratsam immer das MAKE und ein BREAK zu senden.

    Also den Befehl 2x ausführen nur jedesmal für das andere Flag.

    Bei LONG sind es 3 Befehle: MAKE, LONG, BREAK


    Beispiel für die OK-Taste ("KEY_OK": 352):

    Python
    from enigma import eActionMap
    eActionMap.getInstance().keyPressed("dreambox advanced remote control (native)",352,0)
    eActionMap.getInstance().keyPressed("dreambox advanced remote control (native)",352,1)

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    Einmal editiert, zuletzt von Sven H ()

  • Hallo Sven,


    wie immer - Vielen Dank für Dein ausführliches Beispiel!

    Probier ich morgen gleich mal aus.


    Ich vermute mal. das diese Befehlsfolge der Ersatz für das ist was von der FB kommt.

    Wie funktioniert denn der Verteilungsmechanismus. Woher weiß der Kernel. zu welchem

    Programm der Tastendruck geschickt werden muss. Mit anderen Worten woher kennt der

    Kernel das aktive Programm, für den der Tastendruck bestimmt ist?


    Zusatzfrage: Können 2 Programme den selben Tastendruck bekommen,?

    Also ich drücke eine Taste und Programm A und Programm B bekommen

    beide parallel den Keycode?


    Nach meinen Versuche klappt dies bisher nicht.


    /Willi/

  • Der Befehl wird immer an den aktuellen Screen geschickt.

    Hast du im TV-Modus kein Menü oder Plugin offen, geht der Befehl an die Infobar.


    Was willst du denn genau machen?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Hallo Sven,


    so hab noch mal ein bischen in den Sources geforscht. Was ich bräuchte

    wäre die Moglichkeit per Software ein Action Key Kommando abzusenden

    das an "InfobarSeekActions" in InforBarGenerics.py Class: InfoBarSeek geht.

    und dort das Kommando seekdef:n (n=1,3,4,6,7,9) übergibt.


    Hier ein Ausschnitt aus: Screens.InfoBarGenerics


    Falls das nicht geht extrahiere ich mir den "time=...." Part aus dem obigen Code und baue den bei mir ein.


    /Willi/

  • da brauchst du keine keys zu senden, sondern einfach in deinem player nur die init-routinen der infobar klassen aufzurufen...

    z.b. InfoBarSeek.__init__(self)

    (koennte sein, dass man noch mehr inits aufrufen muss... kann ich auf die schnelle aber nicht sagen)

  • Hallo alpha,


    bin ein Python beginner. Deshalb;


    bei

    Code
     class InfoBarSeekActionMap(HelpableActionMap):

    handelt es sich um eine private Klasse die sich innerhalb der Class Definition

    von "InfoBarSeek.__init__" befindet.


    Hier der Start von "InfoBarSeek":


    Unten innerhalb von __init__() steht die Definition von: "InfoBarSeekActionMap"



    Ich möchte aus "InfoBarSeekActionMap" die Funktion action aufrufen.


    Folgende Syntax probiert:


    p = InfoBarSeek.__init__.InfoBarSeekActionMap(self)

    a = p.action(None, "seekdef:9")


    Python Fehlermeldung: "AttributeError: 'function' object has no attribute 'InfoBarSeekActionMap'"


    Wahrscheinlich geht es irgendwie mit einem Trick?


    /Willi/

  • warum willst du denn action aufrufen?

    wenn du per code spulen moechtest, dann kannst du direkt in InfoBarSeek doSeek(...) oder doSeekRelative(...) aufrufen.

  • Hallo alpha,


    "doSeekRelative" direkt aufzurufen geht natürlich. Wenn Du mal in meine 2. Antwort (von oben die dritte)

    schaust ist das auch mein Workaround.


    Ich dachte es gibt eine elegante Methode stattdessen direkt die fertige "action" Funktion aus "infoBarActionMap"

    aufzurufen. Da könnte ich auch noch in Punkto Python Programmierung was lernen.

    Aber wenn das nicht geht, dann nehme ich mir die 3 vor mir benötigten Programmzeilen aus "infoBarActionMap"

    und kopier die bei mir rein.


    /Willi/

    Einmal editiert, zuletzt von willi.neu9 ()