App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2022-02-11 b388a5decf5957cbb119b8c020baef200760d6e1
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
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;
  } 
  
  
  
}