commit | author | age
|
b388a5
|
1 |
package de.uhilger.calypso; |
U |
2 |
|
|
3 |
import java.awt.Color; |
|
4 |
import java.awt.Graphics2D; |
|
5 |
import java.awt.image.BufferedImage; |
|
6 |
import java.net.URL; |
|
7 |
import java.util.logging.Level; |
|
8 |
import java.util.logging.Logger; |
|
9 |
import javax.imageio.ImageIO; |
|
10 |
import org.tw.pi.framebuffer.FrameBuffer; |
|
11 |
|
|
12 |
/** |
|
13 |
* Klasse zum Betrachten von Fotografien auf dem Fernseher |
|
14 |
* mit dem Raspberry Pi |
|
15 |
* |
|
16 |
* Diese Klasse verwendet die Klasse JavaFrameBuffer |
|
17 |
* von Thomas Welsch, die die Ausgabe direkt in den |
|
18 |
* FrameBuffer des Raspberry Pi erlaubt. |
|
19 |
* |
|
20 |
* Der JavaFrameBuffer ist mit Calypso |
|
21 |
* enthalten und erfordert, dass beim Start die native |
|
22 |
* Programmbibliothek namens 'libFrameBuffer.so' eingebunden wird, die im Verteilpaket |
|
23 |
* von Calypso enthalten ist. Zum Einbinden der nativen Biliothek genuegt die |
|
24 |
* Angabe von -Djava.library.path=/pfad/zum/lib-ordner im Startskript von |
|
25 |
* Calypso. |
|
26 |
* |
|
27 |
* Durch die Verwendung des Framebuffer kann das Betrachten von |
|
28 |
* Bildern auf dem Fernseher erfolgen ohne, dass auf dem Raspberry Pi |
|
29 |
* eine grafische Bedienoberflaeche wie z.B. das X Windowing System, |
|
30 |
* XBMC oder OpenELEC, usw. laufen muss. Es genuegt Java |
|
31 |
* im 'headless mode', was zudem die Bedienbarkeit aus der Ferne via |
|
32 |
* HTTP hinzufuegt. |
|
33 |
* |
|
34 |
* @author Ulrich Hilger, https://uhilger.de |
|
35 |
* @author Published under the terms and conditions of |
|
36 |
* the <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero General Public License</a> |
|
37 |
* |
|
38 |
* @version 2 vom 11. Februar 2022, Version 1 war vom 15.1.2014 |
|
39 |
*/ |
|
40 |
public class Betrachter { |
|
41 |
|
|
42 |
public static final long serialVersionUID = 42L; |
|
43 |
|
|
44 |
private static final Logger logger = Logger.getLogger(Betrachter.class.getName()); |
|
45 |
|
|
46 |
public static final String P_FBDEV = "fbdev"; |
|
47 |
public static final String STANDARD_FBDEV = "/dev/fb0"; |
|
48 |
|
|
49 |
public static final String P_URL = "u"; |
|
50 |
public static final String P_X = "x"; |
|
51 |
public static final String P_Y = "y"; |
|
52 |
public static final String P_WIDTH = "w"; |
|
53 |
public static final String P_HEIGHT = "h"; |
|
54 |
|
|
55 |
//public static final String PATH_ZEIGEN = "/zeigen"; |
|
56 |
//public static final String PATH_LOESCHEN = "/loeschen"; |
|
57 |
|
|
58 |
private FrameBuffer jfb; |
|
59 |
private BufferedImage img; |
|
60 |
private Graphics2D g; |
|
61 |
|
|
62 |
public void init(String devName) { |
|
63 |
String device = devName; |
|
64 |
if(device == null) { |
|
65 |
device = STANDARD_FBDEV; |
|
66 |
} |
|
67 |
jfb = new FrameBuffer(device, false); |
|
68 |
img = jfb.getScreen(); |
|
69 |
g = img.createGraphics(); |
|
70 |
} |
|
71 |
|
|
72 |
public void close() { |
|
73 |
jfb.close(); |
|
74 |
} |
|
75 |
|
|
76 |
public void jfbHelloWorld() { |
|
77 |
g.setColor(Color.RED); |
|
78 |
g.drawString("Hello World !", 50, 50); |
|
79 |
jfb.updateScreen(); |
|
80 |
} |
|
81 |
|
|
82 |
/** |
|
83 |
* Anzeigen eines Bildes mit Hilfe des JavaFrameBuffers |
|
84 |
* |
|
85 |
* Diese Methode laedt ein Bild via HTTP oder HTTPS und |
|
86 |
* schreibt es in den Framebuffer zur Anzeige |
|
87 |
* |
|
88 |
* @param urlStr Adresse des Bildes, das angezeigt werden soll |
|
89 |
* @param x waagerechte Koordinate der gewuenschten Position der linken oberen Ecke des Bildes |
|
90 |
* @param y senkrechte Koordinate der gewuenschten Position der linken oberen Ecke des Bildes |
|
91 |
* @param w Breite in Bildpunkten, in der das Bild angezeigt werden soll |
|
92 |
* @param h Hoehe in Bildpunkten, in der das Bild angezeigt werden soll |
|
93 |
*/ |
|
94 |
public String jfbBildZeigen(String urlStr, int x, int y, int w, int h) { |
|
95 |
String antwort = "jfbBildZeigen hat nicht geklappt"; |
|
96 |
BufferedImage webimg = null; |
|
97 |
try { |
|
98 |
/* |
|
99 |
vgl. http://java.kompf.de/java2d.html |
|
100 |
*/ |
|
101 |
//System.setProperty("sun.java2d.opengl","true"); |
|
102 |
URL url = new URL(urlStr); |
|
103 |
webimg = ImageIO.read(url); |
|
104 |
g.drawImage(webimg, x, y, w, h, null); |
|
105 |
jfb.updateScreen(); |
|
106 |
antwort = urlStr + " geladen"; |
|
107 |
} catch (Exception e) { |
|
108 |
antwort = e.getMessage(); |
|
109 |
} |
|
110 |
return antwort; |
|
111 |
} |
|
112 |
|
|
113 |
/** |
|
114 |
* Leeren des FrameBuffers |
|
115 |
* |
|
116 |
* Hier wird einfach ein Linux-Prozess eroeffnet, der das |
|
117 |
* Kommando dd if=/dev/zero of=/dev/fb0 ausfuehrt und |
|
118 |
* den Framebuffer mit Nullwerten fuellt |
|
119 |
*/ |
|
120 |
public String fbLeeren(String deviceName) { |
|
121 |
String antwort = "fbLeeren hat nicht geklappt"; |
|
122 |
try { |
|
123 |
String cmd = "dd if=/dev/zero of=" + deviceName; |
|
124 |
Process leeren = Runtime.getRuntime().exec(cmd); |
|
125 |
/*MeldeThread t = new MeldeThread(); |
|
126 |
t.setProcess(leeren); |
|
127 |
t.lauscherHinzufuegen(new ProzessLauscherImpl() { |
|
128 |
@Override |
|
129 |
public void prozessBeendet() { |
|
130 |
// etwas tun, wenn fertig... |
|
131 |
} |
|
132 |
}); |
|
133 |
t.start();*/ |
|
134 |
antwort = "Prozess gestartet"; |
|
135 |
} catch(Exception ex) { |
|
136 |
logger.log(Level.FINE, ex.getMessage(), ex); |
|
137 |
} |
|
138 |
return antwort; |
|
139 |
} |
|
140 |
|
|
141 |
|
|
142 |
|
|
143 |
} |