App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
undisclosed
2022-12-31 b16b544a3982da609564491ac207e74c0e121c25
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 }