erwin Posted September 3, 2009 Share Posted September 3, 2009 In einigen Foren wurde die Frage gestellt ob man auf einer X10-Fernbedienung mittels Girder (3.2.9) und X10-Plugin (X10/ATI Remote control interface) kurze Tastendrücke von länger gehaltenen unterscheiden könne und so eine Mehrfachbelegung jeder Taste erreichen könne. Die Antworten waren unbefriedigend bis hin zu Zitaten von Experten im einschlägigen Girder-Forum das es nicht ginge. Da dies offenbar nicht ganz trivial ist, will ich hier mal ein kurzes How-To skizzieren. Mein Ausgangspunkt ist diese X10-FB (von Pollin). Schick, schlank, aufgeräumt, nicht mit Tasten überladen. Die kleine Tastenanzahl ist dann aber auch für manche ein KO-Kriterium. Könnte man nicht mit Girder eine Mehfachbelegung erreichen? Etwa Taste "Power" -> Schließen aktuelles Fenster Taste "Power" länger gedrückt -> Schließen aktuelle Application Taste "Shift" + "Power" -> Standby Taste "Shift" + "Power" länger gedrückt -> Herunterfahren Taste "Info" -> Mini-EPG Taste "Info" länger gedrückt -> Detailinfos zur aktuellen Sendung Taste "Shift" + "Info" -> OSD-EPG Taste "Shift" + "Info" länger gedrückt -> das EPG-Fenster "Shift" soll hierbei eine frei definierte Taste sein, welche vor der eigentlichen Taste gedrückt wird. So gehts. (Eventuell auch für IR-FBs anpassbar sofern diese "Toogle-Bits" verwenden.) (Ich beschreib das mal jetzt für _ALLE_ Tasten obwohl die Cursortasten und Volume+/- wohl hier anders behandelt werden sollten) Beim Drücken einer Taste generiert das X10-Plugin für Girder einen Eventstring der Form: X10_DN_*. * steht hier für die einzelne Taste also X10_DN_One, X10_DN_Two, X10_DN_PLAY... . DN heist wohl DowN Wird die Taste gleich wieder freigegeben, wird danach X10_UP_* generiert. Wird die Taste länger gehalten, erhalten wir X10_DN_*, X10_RT_*, [X10_RT_*, X10_RT_*, X10_RT_*, ... ] X10_UP_* wobei RT wohl für RepeaT steht. Die ganze Kunst besteht nun darin die Folge X10_DN_*, X10_RT_* von der Folge X10_DN_*, X10_UP_* zu Unterscheiden. In Girder: Add MultiGroup mit Namen X10_DN_*. In dieser wird für jede Taste ein EventString angelegt der nach der Tastenbeschriftung benannt wird und dann angelernt wird. Also z.B. X10_DN_* Live TV -> X10_DN_Bookmark Rec TV -> X10_DN_MTAB .... Ähnlich wird für RT und UP verfahren. Allerding bereitet hier das "Anlernen" Probleme, da Girder schon nach dem DN (Taste gedrückt) das Lernen beendet. Hier helfen ein par Tricks. z.B. Taste schon vor dem "Learn Event" drücken. Oder man erkennt die Systematik: In X10_DN_Bookmark ersetze DN durch RT bzw. UP usw. Jetzt kann man direkt im GML-File durch Cope/Paste + Suchen/Ersetzen die EventStrings erzeugen. X10_RT_* Live TV -> X10_RT_Bookmark Rec TV -> X10_RT_MTAB .... X10_UP_* Live TV -> X10_UP_Bookmark Rec TV -> X10_UP_MTAB .... Fehlen noch die "Aktionen". In X10_DN_* "Add Command" mit Namen "process event". Und als Aktion "Girder/Variable Manipulation Script" mit folgendem Inhalt (Script-Buttton) STATE = 1 theEventString = EventString Die globale Variable STATE merkt sich mit dem Wert 1 dass soeben eine Taste DowN-gedrückt wurde. Die globale Variable theEventString merkt sich welche Taste es denn war (also z.B. X10_RT_Bookmark) In X10_RT_* "Add Command" mit Namen "process event". Und als Aktion "Girder/Variable Manipulation Script" mit folgendem Inhalt (Script-Buttton) if STATE == 1 then if SHIFT == 1 then SHIFT = 0 TriggerEvent( "SHIFT_HOLD_"..theEventString, 62, "" ) else TriggerEvent( "HOLD_"..theEventString, 62, "" ) end end STATE = 2 Beim ERSTEM RT nach DN (DN hat STATE auf 1 gesetzt), also nur wenn die Sequenz "DN RT" erkannt wurde (in der Sequenz "RT RT" hat hier STATE den Wert 2) werden die folgenden Kommandos ausgeführt. Man beachte das die Sequenz "DN RT" den frühstmöglichen Zeitpunkt markiert an dem ein "gehaltener Tastendruck" erkannt wurde. TriggerEvent( "HOLD_"..theEventString, 62, "" ) feuert hier ein neues Event für Girder mit dem EventString der sich aus "HOLD_"..theEventString - der Aneinanderkettung der Strings "HOLD_" und dem in X10_DN_* gemerkten nativen Eventstring ergibt, also z.B. "HOLD_X10_DN_Bookmark". Dieses Event wird in Girder eingesteuert als wäre es ein eigenes Device (virtuell) mit der Device-ID 62. Die SHIFT-Variable verfeinert das Konzept hier nur noch etwas. Sie wird von einer frei definierten Taste gesetzt. Analog für X10_UP_*: if STATE == 1 then if SHIFT == 1 then SHIFT = 0 TriggerEvent( "SHIFT_"..theEventString, 62, "" ) else TriggerEvent( "KEY_"..theEventString, 62, "" ) end end "if STATE == 1" unterscheidet hier zwischen den Sequenzen "DN UP" und "RT UP" also dem Freigeben der Taste nach einem kurzem Druck oder dem Freigeben nach einem gehaltenem Tastendruck, denn die RT-Behandlung wird auf jeden Fall mit STATE == 2 verlassen. Der gehaltene Tastendruck wurde schon behandelt. "process event" triggert also Events eines virtuellen Devices: KEY_X10_DN_* KEY_X10_DN_BOOKMARK KEY_X10_DN_MTAB ... SHIFT_X10_DN_* SHIFT_X10_DN_BOOKMARK SHIFT_X10_DN_MTAB ... HOLD_X10_DN_* HOLD_X10_DN_BOOKMARK HOLD_X10_DN_MTAB ... SHIFT_HOLD_X10_DN_* SHIFT_HOLD_X10_DN_BOOKMARK SHIFT_HOLD_X10_DN_MTAB ... und genau hier (und nur hier) bringen wir die eigentlichen Action-Handler unter. Es ist angeraten auch andere Device-Events z.B. von einer IR-FB zunächst auf dieses virtuelle Device umzuleiten. So machen sich Änderungen die alle FB's betreffen sollen nur an dieser einen Stelle bemerkbar. Beispiel der * soll auf ALLEN FB's einen neue Funktion erhalten. Hier mein Beispiel GML-File: DVBViewer.zip Wirkliche Aktionen sind hier noch nicht eingebaut. Aber ein OSD-Popup zeigt die gewälte Aktion. Shift ist das blaue Bullet in der Mitte. mfg erwin Quote Link to comment
ultragun Posted November 24, 2009 Share Posted November 24, 2009 Genau das suche ich, aber für meine FB Technisat TS35i. Habe leider keine X10-Fernbedienung. In wie weit ist es möglich, das Konzept für meine TS-FB zu übernehmen? Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.