Activy300Fernbedienung

Aus VDR Wiki

Wechseln zu: Navigation, Suche

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 grosse Fernbedienung der 300
vergrößern
Die grosse Fernbedienung der 300
Die kleine Fernbedienung der 300
vergrößern
Die kleine Fernbedienung der 300
Nochmal die kleine Fernbedienung der 300
vergrößern
Nochmal die kleine Fernbedienung der 300

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:

ScancodeTaste auf der Fernbedienung
0xe0 0x21 0xe0 0xa1 Up
0xe0 0x14 0xe0 0x94Down
0xe0 0x13 0xe0 0x93Left
0xe0 0x06 0xe0 0x86Right
0xe0 0x69 0xe0 0xe9OK
0xe0 0x1f 0xe0 0x9fChannel +
0xe0 0x1e 0xe0 0x9eChannel -
0xe0 0x02 0xe0 0x82Volume +
0xe0 0x5a 0xe0 0xdaVolume -
0xe0 0x59 0xe0 0xd9Stop
0xe0 0x0f 0xe0 0x8fPlay/Pause
0xe0 0x30 0xe0 0xb0Mute
0xe0 0x05 0xe0 0x85Back
0xe0 0x31 0xe0 0xb1?
0xe0 0x16 0xe0 0x96Scroll Up
0xe0 0x2c 0xe0 0xacScroll Down
0xe0 0x10 0xe0 0x90On/Off
0xe0 0x07 0xe0 0x87Eject
0xe0 0x23 0xe0 0xa3Record
0xe0 0x04 0xe0 0x84"Figur"
0xe0 0x68 0xe0 0xe8"Keyboard"
0xe0 0x2f 0xe0 0xaf"Home"
0xe0 0x2e 0xe0 0xae"Buch"
0xe0 0x67 0xe0 0xe7Rot
0xe0 0x03 0xe0 0x83Gelb
0xe0 0x39 0xe0 0xb9Grün
0xe0 0x11 0xe0 0x91Blau
0xe0 0x42 0xe0 0xc20
0xe0 0x43 0xe0 0xc31
0xe0 0x41 0xe0 0xc12
0xe0 0x3f 0xe0 0xbf3
0xe0 0x3d 0xe0 0xbd4
0xe0 0x3b 0xe0 0xbb5
0xe0 0x3c 0xe0 0xbc6
0xe0 0x58 0xe0 0xd87
0xe0 0x64 0xe0 0xe48
0xe0 0x44 0xe0 0xc49

Die Bedeutung dieser Zahlengruppen wird an einem Beispiel für die Taste "Up" deutlich:

ScancodeErklärung
0xe0Escape Scancode für erweiterten Bereich
0x21der eigentliche Scancode, Bit 7 nicht gesetzt für "Taste gedrückt"
0xe0Escape Scancode für erweiterten Bereich
0xa1der 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.

Die Scancodes der Oberseite in einer grafischen Übersicht
vergrößern
Die Scancodes der Oberseite in einer grafischen Übersicht
Die Scancodes der Innenseite in einer grafischen Übersicht
vergrößern
Die Scancodes der Innenseite in einer grafischen Übersicht

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 FernbedienungScancodeKeycodeTastenfunktion
Upe02172KEYPAD_8
Downe01480KEYPAD_2
Lefte01375KEYPAD_4
Righte00677KEYPAD_6
OKe06928ENTER
Channel +e01f52.
Channel -e01e51,
Volume +e00278KEYPAD_ADD
Volume -e05a74KEYPAD_SUBSTRACT
Stope05967F9
Play/Pausee00f57SPACE
Mutee03050m
Backe00579KEYPAD_1
?e03135h
Scroll Upe01627PLUS
Scroll Downe02c26AT
On/Offe010 68 F10
Ejecte007119PAUSE
Recorde02365F7
"Figur"e00419r
"Keyboard"e06812BACKSLASH
"Home"e02f41ASCIICIRCUM
"Buch"e02e71KEYPAD_7
Rote06759F1
Gelbe00360F2
Grüne03961F3
Blaue01162F4
0e042110
1e04321
2e04132
3e03f43
4e03d54
5e03b65
6e03c76
7e05887
8e06498
9e044109

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=

Links

  1. Keyboard Scancodes
  2. The Linux keyboard and console HOWTO
  3. Infos und Skript zum Teil aus diesem Thread entnommen