Activy Fernbedienungen

Aus VDR Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Einleitung

Die Fernbedienung der Activy 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
Die kleine Fernbedienung der 300
Nochmal die kleine Fernbedienung der 300
Die Fernbedienung der 3x0

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.

Die silberne Fernbedienung der 3x0 Modelle verhält sich genauso wie die die "kleine" , bietet allerdings ein paar zusätzliche Tasten, darunter auch ein paar Anlernbare.

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.

Die Scancodes der Oberseite in einer grafischen Übersicht
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 Verknüpfung der realen Taste der Tastatur mit der Tastenfunktion des Betriebssystems.

Für eine Verarbeitung könnte Beispielsweise folgende Zuordnung dienen. Es werden dabei nur die Scancodes für die gedrückte Taste berücksichtigt 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

Hinwiese

Ein/Austaste

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).

keyboard proxy

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=

Nutznung der Fernbedienungen mit Lirc

Die Fernbedienungen nutzen das RCMM-Protokoll, ein Anlernen mit normalem Lirc Emfänger wird deshalb nicht gelingen. Mit dieser [lircd.conf] sollte sie aber problemlos arbeiten.

Sicher lässt sich die Reichweite verbessern wenn man einen an RCMM angepassten Empfängerbaustein benutzt: [[1]]

Links

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