Activy300Fernbedienung
Aus VDR Wiki
Inhaltsverzeichnis |
Einleitung
Die Fernbedienung der Activy 300 folgt einem anderen Prinzip als es die sonst gebräuchlichen Lösungen verfolgen. Hierbei werden die von der Fernbedienung ausgesandten Infrarotsignale direkt von der Hardware des Rechners in Scancodes umgewandelt und an den Tastaturport geleitet. Es liegen also für eine gedrückte Taste direkt Scancodes vor, die unter Linux auswertbar sind.
Die Scancodes der einzelnen Fernbedienungs-Modelle sind leider unterschiedlich. So sendet die "kleine" Fernbedienung Scancodes herkömmlicher Tasten, sie kann also sofort angelernt werden. Die Tasten der "grossen" Fernbedienung erzeugen Scancodes von Sondertasten (0xe0 Prefix), für die erst die korrespondieren Keycodes definiert werden müssen.
Daraus resultiert leider auch, dass ein Mischbetrieb aus großer und kleiner Ausführung nur sehr eingeschränkt möglich ist, denn die Tasten der großen müssen auf den gleichen Keycode gelegt werden, wie die der kleinen, was zum Teil auch Buchstabentasten der normalen Keyboards sind. Diese Tasten sind dann nicht mehr sinnvoll zur Eingabe, zum Beispiel in Titeln und Namen, nutzbar.
Verwendete Scancodes
Die Fernbedienung erzeugt laut "showkey -s
" folgende Scancodes für die Tasten der "Oberseite" der aufklappbaren Version:
Scancode | Taste auf der Fernbedienung |
0xe0 0x21 0xe0 0xa1 | Up |
0xe0 0x14 0xe0 0x94 | Down |
0xe0 0x13 0xe0 0x93 | Left |
0xe0 0x06 0xe0 0x86 | Right |
0xe0 0x69 0xe0 0xe9 | OK |
0xe0 0x1f 0xe0 0x9f | Channel + |
0xe0 0x1e 0xe0 0x9e | Channel - |
0xe0 0x02 0xe0 0x82 | Volume + |
0xe0 0x5a 0xe0 0xda | Volume - |
0xe0 0x59 0xe0 0xd9 | Stop |
0xe0 0x0f 0xe0 0x8f | Play/Pause |
0xe0 0x30 0xe0 0xb0 | Mute |
0xe0 0x05 0xe0 0x85 | Back |
0xe0 0x31 0xe0 0xb1 | ? |
0xe0 0x16 0xe0 0x96 | Scroll Up |
0xe0 0x2c 0xe0 0xac | Scroll Down |
0xe0 0x10 0xe0 0x90 | On/Off |
0xe0 0x07 0xe0 0x87 | Eject |
0xe0 0x23 0xe0 0xa3 | Record |
0xe0 0x04 0xe0 0x84 | "Figur" |
0xe0 0x68 0xe0 0xe8 | "Keyboard" |
0xe0 0x2f 0xe0 0xaf | "Home" |
0xe0 0x2e 0xe0 0xae | "Buch" |
0xe0 0x67 0xe0 0xe7 | Rot |
0xe0 0x03 0xe0 0x83 | Gelb |
0xe0 0x39 0xe0 0xb9 | Grün |
0xe0 0x11 0xe0 0x91 | Blau |
0xe0 0x42 0xe0 0xc2 | 0 |
0xe0 0x43 0xe0 0xc3 | 1 |
0xe0 0x41 0xe0 0xc1 | 2 |
0xe0 0x3f 0xe0 0xbf | 3 |
0xe0 0x3d 0xe0 0xbd | 4 |
0xe0 0x3b 0xe0 0xbb | 5 |
0xe0 0x3c 0xe0 0xbc | 6 |
0xe0 0x58 0xe0 0xd8 | 7 |
0xe0 0x64 0xe0 0xe4 | 8 |
0xe0 0x44 0xe0 0xc4 | 9 |
Die Bedeutung dieser Zahlengruppen wird an einem Beispiel für die Taste "Up" deutlich:
Scancode | Erklärung |
0xe0 | Escape Scancode für erweiterten Bereich |
0x21 | der eigentliche Scancode, Bit 7 nicht gesetzt für "Taste gedrückt" |
0xe0 | Escape Scancode für erweiterten Bereich |
0xa1 | der Scancode von vorher nochmal, nur mit gesetztem 7. Bit für "Taste losgelassen" |
Es wird deutlich, dass die regulären Tasten der Fernbedienung nicht als "gedrückt gehalten" erkannt werden können, da sofort ein Scancode für "losgelassen" erzeugt wird. Bei längerem Halten tritt eine Wiederholung der Taste ein.
Keycodes
Die erzeugten Scancodes müssen nun in Keycodes umgewandelt werden. Diese Keycodes repräsentieren bekannte Tasten. Auf diese Weise erreicht man eine Vernüpfung der realen Taste der Tastatur mit der Tastenfunktion des Betriebssystems.
Für eine Verarbeitung könnte Beispielsweise folgene Zuordnung dienen. Es werden dabei nur die Scancodes für die gedrückte Taste berücksichtig und diese gleich im Format des setkey Befehls notiert:
Key auf der Fernbedienung | Scancode | Keycode | Tastenfunktion |
Up | e021 | 72 | KEYPAD_8 |
Down | e014 | 80 | KEYPAD_2 |
Left | e013 | 75 | KEYPAD_4 |
Right | e006 | 77 | KEYPAD_6 |
OK | e069 | 28 | ENTER |
Channel + | e01f | 52 | . |
Channel - | e01e | 51 | , |
Volume + | e002 | 78 | KEYPAD_ADD |
Volume - | e05a | 74 | KEYPAD_SUBSTRACT |
Stop | e059 | 67 | F9 |
Play/Pause | e00f | 57 | SPACE |
Mute | e030 | 50 | m |
Back | e005 | 79 | KEYPAD_1 |
? | e031 | 35 | h |
Scroll Up | e016 | 27 | PLUS |
Scroll Down | e02c | 26 | AT |
On/Off | e010 | 68 | F10 |
Eject | e007 | 119 | PAUSE |
Record | e023 | 65 | F7 |
"Figur" | e004 | 19 | r |
"Keyboard" | e068 | 12 | BACKSLASH |
"Home" | e02f | 41 | ASCIICIRCUM |
"Buch" | e02e | 71 | KEYPAD_7 |
Rot | e067 | 59 | F1 |
Gelb | e003 | 60 | F2 |
Grün | e039 | 61 | F3 |
Blau | e011 | 62 | F4 |
0 | e042 | 11 | 0 |
1 | e043 | 2 | 1 |
2 | e041 | 3 | 2 |
3 | e03f | 4 | 3 |
4 | e03d | 5 | 4 |
5 | e03b | 6 | 5 |
6 | e03c | 7 | 6 |
7 | e058 | 8 | 7 |
8 | e064 | 9 | 8 |
9 | e044 | 10 | 9 |
Tasten festlegen
Die Belegung der einzelnen Tasten könnte wie in diesem Beispielskript erfolgen.
#!/bin/bash setkeycodes e010 16;# Power setkeycodes e024 16;# Power FP setkeycodes e021 72;# Up setkeycodes e024 72;# Up Frontpanel setkeycodes e014 80;# Down setkeycodes e032 80;# Down Frontpanel setkeycodes e02e 71;# Menu setkeycodes e069 28;# Ok setkeycodes e028 28;# Ok Frontpanel setkeycodes e005 79;# Back setkeycodes e013 75;# Left setkeycodes e00c 75;# Left Frontpanel setkeycodes e006 77;# Right setkeycodes e019 77;# Right Frontpanel setkeycodes e067 59;# Red setkeycodes e003 60;# Green setkeycodes e039 61;# Yellow setkeycodes e011 62;# Blue setkeycodes e042 11;# 0 setkeycodes e043 2;# 1 setkeycodes e041 3;# 2 setkeycodes e03f 4;# 3 setkeycodes e03d 5;# 4 setkeycodes e03b 6;# 5 setkeycodes e03c 7;# 6 setkeycodes e058 8;# 7 setkeycodes e064 9;# 8 setkeycodes e044 10;# 9 setkeycodes e002 78;# Vol+ setkeycodes e05a 74;# Vol- setkeycodes e030 50;# Mute setkeycodes e01f 52;# Ch+ setkeycodes e01e 51;# Ch- setkeycodes e016 27 ;#Scroll UP (PageUp) setkeycodes e02c 26 ;#Scroll Down (PageDown) setkeycodes e068 12 ;#Keyboard setkeycodes e02f 41 ;#Home setkeycodes e004 19 ;#Run ??? setkeycodes e031 35 ;#? setkeycodes e06a 63 ;#<< setkeycodes e00f 57 ;#Play/Pause setkeycodes e008 64 ;#>> setkeycodes e023 65 ;#Record setkeycodes e022 66 ;#|< setkeycodes e059 67 ;#Stop setkeycodes e015 68 ;#>| setkeycodes e007 119 ;#Eject
Ergänzung
Man beachte, dass der Power-Knopf auf der Fernbedienung nicht als normale Taste gehandhabt wird, sondern ein ACPI-Event erzeugt, dh wird auf der Fernbedienung der Power-Button gedrückt, fährt der Rechner herunter, ohne VDR die Möglichkeit zu lassen, eventuell anstehende Aufnahmen als Wakeup-Events zu speichern. acpid
lauscht an /proc/acpi/event
und führt ein Skript aus, sobald eine Veränderung an /proc/acpi/event
festgestellt wurde. Defaultmäßig liegt das Skript unter /etc/acpi
. Eine Möglichkeit, die Activy dennoch aufwachen zu lassen, ist, den nächsten Timerevent per SVDRP in diesem Skript abzufragen und einzutragen. Dazu dient svdrpsend.pl (je nach Distribution wohl schon im Pfad vorhanden. Wenn VDR von Hand kompiliert wurde, findet sich svdrpsend.pl im $VDR
-Verzeichnis). Folgendes funktioniert bei mir auf einer Slackware 10.1-Installation mit 2.4.29-Kernel:
#!/bin/sh # Default acpi script that takes an entry for all actions IFS=${IFS}/ set $@ case "$1" in button) case "$2" in power) NEXTWAKEUP=`/pfad/zu/svdrpsend.pl NEXT abs | grep 250 | sed -e 's/250 \([[:digit:]]\) //g' -e 's/\r//g'` ABSTIME=$(($NEXTWAKEUP-120)) # zwei minuten frueher aufwachen WAKEUP=`date -d "1970-01-01 UTC $ABSTIME seconds" +"%Y-%m-%d %R:%S"` echo $WAKEUP > /proc/acpi/alarm echo $WAKEUP > /proc/acpi/alarm logger "Next wakeup: $WAKEUP" /sbin/init 0 ;; *) logger "ACPI action $2 is not defined" ;; esac ;; *) logger "ACPI group $1 / action $2 is not defined" ;; esac
Vorsicht, whitespaces sind nicht immer egal und es gibt auch einen Unterschied zwischen ' und ` ... Außerdem nicht vergessen, localhost
per SVDRP auf VDR zugreifen zu lassen. Dies ist in svdrphosts.conf konfigurierbar.
127.0.0.1 # localhost 192.168.0.0/24 # lokales netz
Eventuell kann es Probleme geben, wenn andere Addons zum Einsatz kommen, die ebenfalls svdrpsend.pl verwenden, da VDR maximal eine Verbindung pro Host erlaubt (glaube ich zumindest gehört zu haben).
Zur Zeit befindet sich noch ein Zusatzprogramm zur Interpretation von Tastendrücken unabhängig vom VDR in der Erprobung: http://www.vdr-portal.de/board/thread.php?threadid=41834&sid=