package de.uhilger.calypso;
|
|
import java.awt.Color;
|
import java.awt.Graphics2D;
|
import java.awt.image.BufferedImage;
|
import java.net.URL;
|
import java.util.logging.Level;
|
import java.util.logging.Logger;
|
import javax.imageio.ImageIO;
|
import org.tw.pi.framebuffer.FrameBuffer;
|
|
/**
|
* Klasse zum Betrachten von Fotografien auf dem Fernseher
|
* mit dem Raspberry Pi
|
*
|
* Diese Klasse verwendet die Klasse JavaFrameBuffer
|
* von Thomas Welsch, die die Ausgabe direkt in den
|
* FrameBuffer des Raspberry Pi erlaubt.
|
*
|
* Der JavaFrameBuffer ist mit Calypso
|
* enthalten und erfordert, dass beim Start die native
|
* Programmbibliothek namens 'libFrameBuffer.so' eingebunden wird, die im Verteilpaket
|
* von Calypso enthalten ist. Zum Einbinden der nativen Biliothek genuegt die
|
* Angabe von -Djava.library.path=/pfad/zum/lib-ordner im Startskript von
|
* Calypso.
|
*
|
* Durch die Verwendung des Framebuffer kann das Betrachten von
|
* Bildern auf dem Fernseher erfolgen ohne, dass auf dem Raspberry Pi
|
* eine grafische Bedienoberflaeche wie z.B. das X Windowing System,
|
* XBMC oder OpenELEC, usw. laufen muss. Es genuegt Java
|
* im 'headless mode', was zudem die Bedienbarkeit aus der Ferne via
|
* HTTP hinzufuegt.
|
*
|
* @author Ulrich Hilger, https://uhilger.de
|
* @author Published under the terms and conditions of
|
* the <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero General Public License</a>
|
*
|
* @version 2 vom 11. Februar 2022, Version 1 war vom 15.1.2014
|
*/
|
public class Betrachter {
|
|
public static final long serialVersionUID = 42L;
|
|
private static final Logger logger = Logger.getLogger(Betrachter.class.getName());
|
|
public static final String P_FBDEV = "fbdev";
|
public static final String STANDARD_FBDEV = "/dev/fb0";
|
|
public static final String P_URL = "u";
|
public static final String P_X = "x";
|
public static final String P_Y = "y";
|
public static final String P_WIDTH = "w";
|
public static final String P_HEIGHT = "h";
|
|
//public static final String PATH_ZEIGEN = "/zeigen";
|
//public static final String PATH_LOESCHEN = "/loeschen";
|
|
private FrameBuffer jfb;
|
private BufferedImage img;
|
private Graphics2D g;
|
|
public void init(String devName) {
|
String device = devName;
|
if(device == null) {
|
device = STANDARD_FBDEV;
|
}
|
jfb = new FrameBuffer(device, false);
|
img = jfb.getScreen();
|
g = img.createGraphics();
|
}
|
|
public void close() {
|
jfb.close();
|
}
|
|
public void jfbHelloWorld() {
|
g.setColor(Color.RED);
|
g.drawString("Hello World !", 50, 50);
|
jfb.updateScreen();
|
}
|
|
/**
|
* Anzeigen eines Bildes mit Hilfe des JavaFrameBuffers
|
*
|
* Diese Methode laedt ein Bild via HTTP oder HTTPS und
|
* schreibt es in den Framebuffer zur Anzeige
|
*
|
* @param urlStr Adresse des Bildes, das angezeigt werden soll
|
* @param x waagerechte Koordinate der gewuenschten Position der linken oberen Ecke des Bildes
|
* @param y senkrechte Koordinate der gewuenschten Position der linken oberen Ecke des Bildes
|
* @param w Breite in Bildpunkten, in der das Bild angezeigt werden soll
|
* @param h Hoehe in Bildpunkten, in der das Bild angezeigt werden soll
|
*/
|
public String jfbBildZeigen(String urlStr, int x, int y, int w, int h) {
|
String antwort = "jfbBildZeigen hat nicht geklappt";
|
BufferedImage webimg = null;
|
try {
|
/*
|
vgl. http://java.kompf.de/java2d.html
|
*/
|
//System.setProperty("sun.java2d.opengl","true");
|
URL url = new URL(urlStr);
|
webimg = ImageIO.read(url);
|
g.drawImage(webimg, x, y, w, h, null);
|
jfb.updateScreen();
|
antwort = urlStr + " geladen";
|
} catch (Exception e) {
|
antwort = e.getMessage();
|
}
|
return antwort;
|
}
|
|
/**
|
* Leeren des FrameBuffers
|
*
|
* Hier wird einfach ein Linux-Prozess eroeffnet, der das
|
* Kommando dd if=/dev/zero of=/dev/fb0 ausfuehrt und
|
* den Framebuffer mit Nullwerten fuellt
|
*/
|
public String fbLeeren(String deviceName) {
|
String antwort = "fbLeeren hat nicht geklappt";
|
try {
|
String cmd = "dd if=/dev/zero of=" + deviceName;
|
Process leeren = Runtime.getRuntime().exec(cmd);
|
/*MeldeThread t = new MeldeThread();
|
t.setProcess(leeren);
|
t.lauscherHinzufuegen(new ProzessLauscherImpl() {
|
@Override
|
public void prozessBeendet() {
|
// etwas tun, wenn fertig...
|
}
|
});
|
t.start();*/
|
antwort = "Prozess gestartet";
|
} catch(Exception ex) {
|
logger.log(Level.FINE, ex.getMessage(), ex);
|
}
|
return antwort;
|
}
|
|
|
|
}
|