JavaFX mit selbst entwickelter Hardware ergänzen

Mausklicks auf das Zentrum des Bildschirms werden nun unser Bild gemäß CSS verändern. Im obigen Programm wird die Applikation in den Vollbildmodus geschaltet, weil JavaFX auf dem Raspberry Pi momentan nur so gestartet werden kann.

Abb. 3 und 4: Das JavaFX GUI in Aktion

Nun vereinigen wir das GUI mit der Hardware. Wir übernehmen den Code aus GuiOnlyApp und erstellen die richtige Applikation. Nach der model-Variable erstellen wir den Hardware-Controller:

public class App extends Application {
  @Override
  public void start(Stage stage) throws Exception {
    BooleanProperty model = new SimpleBooleanProperty();
    Pi4JController hwController = new Pi4JController();
    hwController.setModel(model);
    ...

Packt man die Erstellung des Hardware-Controllers in eine Factory-Methode, so lassen sich später auch andere Implementierungen instanziieren, z. B. über ein System-Property. Damit lässt sich für Tests auch ein GPIO-Simulator an unser Programm hängen.

Deployment

Nun ist der große Auftritt für unseren Raspberry Pi gekommen. Wir kompilieren den Programmcode und transferieren ihn mittels scp in das Home-Verzeichnis des Pi-Benutzers auf unserem Raspberry:

> mvn clean install
> scp target/raspi-fx-button-1.0-SNAPSHOT.jar pi@192.168.1.100:/home/pi

Vermutlich sind wir über SSH noch mit dem Raspberry Pi verbunden. Im Home-Verzeichnis auf dem Raspberry Pi starten wir nun unsere Applikation. Dazu benötigen wir im Klassenpfad sowohl die JavaFX Runtime als auch die Pi4J-Bibliothek mit ihren Native Bindings:

> sudo java -Djavafx.platform=eglfb 
  -cp ./'*':/opt/java/jdk1.8.0/jre/lib/jfxrt.jar:/opt/pi4j/lib/'*' 
  de.javamagazin.raspifxbutton.App

Es dauert eine Weile, bis unser GUI erscheint. Nach dem Laden läuft das Programm aber flott. Ein Druck auf den Taster verändert nun die Ausgabe. Wie bereits erwähnt, wird das in CSS konfigurierte Bild erst bei der ersten Verwendung geladen, beim ersten Knopfdruck dauert das Update also einen Moment.

Abb. 5: Das komplette Set-up in Betrieb

Zugriff auf die GPIO Pins ist nur mit Root-Rechten möglich, weshalb wir den Java-Prozess mit sudo starten. Der Parameter javafx.platform ist unbedingt erforderlich, damit Java direkt in den Framebuffer schreibt. Fehlt er, wird sich Java mit einem UnsatisfiedLinkError melden. Bei der Verwendung einer veralteten Pi4J-Version wird ebenfalls ein Fehler auftreten, da die nativen Bindings nicht gefunden werden. Startet man die Applikation über die SSH-Konsole, kann die Applikation einfach über CTRL + C beendet werden. Direkt auf dem Raspberry Pi ist dies nicht möglich, wenn man ohne Desktop startet. Um noch etwas mehr Power aus dem Raspberry Pi zu holen, empfiehlt Oracle [5], in der Datei /boot/config.txt die beiden Zeilen framebuffer_width und framebuffer_height zu aktivieren.

Somit ist unser Hello World Gadget fertig! Der komplette Sourcecode ist unter [6] abrufbar.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.