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 GNU Affero General Public License * * @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; } }