summaryrefslogtreecommitdiff
path: root/projekt_doku.asciidoc
blob: 034a0b04e78926b692ff8a9a73d0d292f770c888 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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.

.Client-Server Interaktion
image::directfb-voodoo-js.eps[]


== 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 <directfb.h>
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.

//== Webbrowser-Rendering

== Framebuffer Auslesen
Das X11-Protokoll bietet die Möglichkeit den angezeigten Framebuffer
über die Funtkion +X_GetImage+ auszulesen.

.X11-Fenster Konfiguration
image::framebuffer.svg[]

== 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: