Philips TV-Remote unter Linux ============================= :author: Benjamin Franzke :lang: de :imagesdir: image // a2x: --dblatex-opts="-p thesis.xsl -s thesis.sty -b xetex" == Grundlagen *DirectFB* 'DirectFB' ist eine kleine Bibliothek, die als Hauptaufgabe Beschleunigung durch Grafik-Hardware bereitstellt. Außerdem werden auch Eingabegeräte unterstützt, und es enthält ein integriertes Fenster-System. Dementsprechend kann DirectFB als Hardware-Abstraktions-Schicht bezeichnet werden. *DirectFB Voodoo* 'DirectFB Voodoo' ist ein Aufsatz bzw Proxy-Kanel für DirectFB. Es besteht aus einer Client-Server Architektur. Der Server ist dabei das Anzeige Gerät und bietet über den Voodoo Kanal zugriff auf den eigenen Framebuffer. Die Client-seitige Implementierung leitet DirectFB-API-Aufrufe per DirectFB-Voodoo an den Server weiter, auf dem diese dann ausgeführt werden. DirectFB-Voodoo ist demzufolge eine Remote-Rendering Infrastruktur die das Zeichnen von Primitiven wie Rechtecken und Kreisen ermöglicht, aber auch das übertragen von ganzen Bildinhalten. *JointSpace* 'JointSpace' ist ein Framework und API für Fernseher von Philips. Es ermöglicht das Fernseher über das API gesteuert werden können, und eine Bildübertragung über das Netzwerk. Das API zur Steuerung der Fernseher basiert auf einem REST-full HTTP-Protokoll. Für die Bildübertragung wird 'DirectFB Voodoo' eingesetzt. == Vorhergehensweise für die Implementation Im ersten Schritt ist eine eins-zu-eins Umsetzung der Anzeige einen Linux-Screens auf einen Fernseher zu implementieren. Im zweiten sollten von einem Rechner mehrere Streams an JointSpace-Fernseher gesandt werden. In diesem Fall 3 Clients. == Linux Betriebssystem Arch Linux == Verbindungsaufbau Die DirectFB-Voodoo Platform nutzt als Standardmethode zum Verbindungsaufbau einen Broadcast Request, um verfügbare Anzeigegeräte zu finden. Dies ist für den Einsatz im Heimnetzwerk gedacht, bei dem der Verbindungsaufwand möglich gering gehalten werden soll. Sind meherere der Fernseher in einem Netzwerk, so ist nicht eindeutig definiert, welcher zuerst auf den Broadcast antworten, und dadurch für die Verbindung ausgewählt werden wird. Deshalb ist direkter Unicast nötig. Die Bibliothek bietet kein direktes API, um die Ziel-Addresse zu verabeiten. Die Initialisierungsmethode +DirectFB::Init()+ erwartet einen Argumentzähler und -vektor. Dieser Vektor bezieht sich auf die Kommandozeilen Argumente, im folgenden beispielhaft dargestellt: [source,c] ---- #include int main(int argc, char *argv[]) { DirectFB::Init(&argc, &argv); return 0; } ---- == Verbindungsabbruch Bricht die Verbindung ab -- z.B. durch Ausschalten des Fernsehers oder durch Auswählen einer anderen Quelle -- wird dies durch die DirectFB Bibliothek nicht an die Anwendung signalisiert. Im produktiven Einsatz ist es bei Remote-Steuerung deshalb nicht zu erkennen, ob die Verbidnung besteht. Im weiteren ist auch keine automatisierte Neuverbingung unmöglich. //die Anwendung signalisiert. //Intern wird der Rückgabewert von +send(2)+ nicht auf einen Verbindungsabbruch //geprüft. *Lösung:* Die Bibiliothek DirectFB wurde erweitert, das SIGPIPE signal vom Kernel zu empfangen. Pluggit installiert für DirectFB eine Signal Behandlungsroutine und bricht die Programmausführung ab. Ein Shell scripts das pluggit überwacht erkennt dies am Rückgabe-Status des Pluggit-Prozesses und startet diesen neu. == Test Getestet wurde jeweils mit der Infoscreen-Website footnote:[http://et.hs-wismar.de/~infosc/index.php?file=config16n] des Fachbereichs EuI: Da während der Entwicklung nicht dauerhaft Philips-Fernseher zur Verfügung standen, == HowTo === Linux-Installation Arch installieren? === DirectFB Für diese Arbeit wurde die zum Zeitpunkt der Bearbeitung neuste verwendet: DirectFB141_source_1.3.1beta5.7z footnote:[http://sourceforge.net/projects/jointspace/files/remote_applications_SDK/] [source,c] ---- 7z x DirectFB141_source_1.3.1beta5.7z ---- [source,sh] ---- make ---- === Pluggit [source,sh] ---- DIRECTFB_VOODOO= make ---- === Browser Webkit/Firefox? // vim: set syntax=asciidoc tw=78 filetype=asciidoc: // spell spelllang=de,en: