{"id":332,"date":"2013-04-17T21:16:41","date_gmt":"2013-04-17T19:16:41","guid":{"rendered":"http:\/\/www.jensd.de\/wordpress\/?p=332"},"modified":"2013-12-19T12:44:44","modified_gmt":"2013-12-19T11:44:44","slug":"javafx-on-raspberry-pi-gpio-controller-part2","status":"publish","type":"post","link":"https:\/\/www.jensd.de\/wordpress\/?p=332","title":{"rendered":"JavaFX on Raspberry Pi: GPIO Controller (Part2)"},"content":{"rendered":"<p><a href=\"http:\/\/www.jensd.de\/wordpress\/?p=294\" alt=JavaFX on Raspberry Pi: GPIO Controller (Part1)\">Part1<\/a> of this little series of articles was about the hardware setup of my little Raspberry Pi GPIO project.<br \/>\nNow let&#8217;s focus the software. <\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69f70ca770f22\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69f70ca770f22\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.jensd.de\/wordpress\/?p=332\/#The_Schema\" title=\"The Schema\">The Schema<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.jensd.de\/wordpress\/?p=332\/#GpioAdapterFX\" title=\"GpioAdapterFX\">GpioAdapterFX<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.jensd.de\/wordpress\/?p=332\/#SwitchBoardController\" title=\"SwitchBoardController\">SwitchBoardController<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.jensd.de\/wordpress\/?p=332\/#You_can_find_the_complete_code_here\" title=\"You can find the complete code here.\">You can find the complete code here.<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.jensd.de\/wordpress\/?p=332\/#The_runfxapp_skript_may_help_you_to_run_the_app_on_your_Raspberry\" title=\"The runfxapp skript may help you to run the app on your Raspberry.\">The runfxapp skript may help you to run the app on your Raspberry.<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.jensd.de\/wordpress\/?p=332\/#Stay_tuned%E2%80%A6\" title=\"Stay tuned&#8230;\">Stay tuned&#8230;<\/a><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"The_Schema\"><\/span>The Schema<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p><a href=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"382\" data-permalink=\"https:\/\/www.jensd.de\/wordpress\/?attachment_id=382\" data-orig-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema.png\" data-orig-size=\"472,827\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"RaspiGpioControllSchema\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema-171x300.png\" data-large-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema.png\" tabindex=\"0\" role=\"button\" src=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema.png\" alt=\"RaspiGpioControllSchema\" width=\"472\" height=\"827\" class=\"aligncenter size-full wp-image-382\" srcset=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema.png 472w, https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/04\/RaspiGpioControllSchema-171x300.png 171w\" sizes=\"(max-width: 472px) 100vw, 472px\" \/><\/a><\/p>\n<h1><span class=\"ez-toc-section\" id=\"GpioAdapterFX\"><\/span>GpioAdapterFX<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>For the bridge between Java and the Raspberry&#8217;s GPIO I took advantage of the great work of the <strong><a href=\"http:\/\/pi4j.com\/index.html\" title=\"Pi4J\" target=\"_blank\">Pi4J Project<\/a><\/strong> guys.<br \/>\nThe <strong><code>com.pi4j.io.gpio.GpioController<\/code><\/strong> is a straighforward and simple wrapper to manage the Pi4J <strong><code>GPIOController<\/code><\/strong> with JavaFX Properties:<\/p>\n<p>[java]<\/p>\n<p>public class GpioAdapterFX{<\/p>\n<p>  private GpioController GPIO;<br \/>\n  private ObservableMap<BooleanProperty, ChangeListener<Boolean>> pins;<br \/>\n  private BooleanProperty pin0StateProperty;<br \/>\n  private BooleanProperty pin1StateProperty;<br \/>\n  private BooleanProperty pin2StateProperty;<br \/>\n  private BooleanProperty pin3StateProperty;<br \/>\n  private BooleanProperty pin4StateProperty;<br \/>\n  private BooleanProperty pin5StateProperty;<br \/>\n  private BooleanProperty pin6StateProperty;<br \/>\n  private BooleanProperty pin7StateProperty;<br \/>\n  private Timeline testTimeline;<\/p>\n<p>  public CpioFXAdapter() {<br \/>\n    init();<br \/>\n  }<\/p>\n<p> private void init() {<br \/>\n    pin0StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin1StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin2StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin3StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin4StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin5StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin6StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<br \/>\n    pin7StateProperty = new SimpleBooleanProperty(Boolean.FALSE);<\/p>\n<p>    pins = FXCollections.observableHashMap();<br \/>\n    pins.put(pin0StateProperty, null);<br \/>\n    pins.put(pin1StateProperty, null);<br \/>\n    pins.put(pin2StateProperty, null);<br \/>\n    pins.put(pin3StateProperty, null);<br \/>\n    pins.put(pin4StateProperty, null);<br \/>\n    pins.put(pin5StateProperty, null);<br \/>\n    pins.put(pin6StateProperty, null);<br \/>\n    pins.put(pin7StateProperty, null);<br \/>\n  }<\/p>\n<p> private ChangeListener<Boolean> createPinListener(final GpioPinDigitalOutput pin) {<br \/>\n    return new ChangeListener<Boolean>() {<br \/>\n      @Override<br \/>\n      public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {<br \/>\n        if (newValue) {<br \/>\n          pin.high();<br \/>\n        } else {<br \/>\n          pin.low();<br \/>\n        }<br \/>\n      }<br \/>\n    };<br \/>\n  }<\/p>\n<p>  \/*<br \/>\n   * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; ACTIONS &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n   *\/<br \/>\n  public void connect() {<\/p>\n<p>    GPIO = GpioFactory.getInstance();<\/p>\n<p>     GpioPinDigitalOutput pin0 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_00, &#8220;PIN0&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin1 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_01, &#8220;PIN1&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin2 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_02, &#8220;PIN2&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin3 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_03, &#8220;PIN3&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin4 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_04, &#8220;PIN4&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin5 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_05, &#8220;PIN5&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin6 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_06, &#8220;PIN6&#8221;, PinState.LOW);<br \/>\n    GpioPinDigitalOutput pin7 = GPIO.<br \/>\n            provisionDigitalOutputPin(RaspiPin.GPIO_07, &#8220;PIN7&#8221;, PinState.LOW);<\/p>\n<p>    pins.put(pin0StateProperty, createPinListener(pin0));<br \/>\n    pins.put(pin1StateProperty, createPinListener(pin1));<br \/>\n    pins.put(pin2StateProperty, createPinListener(pin2));<br \/>\n    pins.put(pin3StateProperty, createPinListener(pin3));<br \/>\n    pins.put(pin4StateProperty, createPinListener(pin4));<br \/>\n    pins.put(pin5StateProperty, createPinListener(pin5));<br \/>\n    pins.put(pin6StateProperty, createPinListener(pin6));<br \/>\n    pins.put(pin7StateProperty, createPinListener(pin7));<\/p>\n<p>    pin0StateProperty.addListener(pins.get(pin0StateProperty));<br \/>\n    pin1StateProperty.addListener(pins.get(pin1StateProperty));<br \/>\n    pin2StateProperty.addListener(pins.get(pin2StateProperty));<br \/>\n    pin3StateProperty.addListener(pins.get(pin3StateProperty));<br \/>\n    pin4StateProperty.addListener(pins.get(pin4StateProperty));<br \/>\n    pin5StateProperty.addListener(pins.get(pin5StateProperty));<br \/>\n    pin6StateProperty.addListener(pins.get(pin6StateProperty));<br \/>\n    pin7StateProperty.addListener(pins.get(pin7StateProperty));<\/p>\n<p>    reset();<br \/>\n  }<\/p>\n<p> public void disconnect() {<br \/>\n    if (GPIO != null) {<br \/>\n      GPIO.shutdown();<br \/>\n    }<br \/>\n    for (BooleanProperty booleanProperty : pins.keySet()) {<br \/>\n      ChangeListener<Boolean> listener = pins.get(booleanProperty);<br \/>\n      if (listener != null) {<br \/>\n        booleanProperty.removeListener(listener);<br \/>\n      }<br \/>\n    }<br \/>\n  }<\/p>\n<p>  public void setOnAllPins() {<br \/>\n    for (BooleanProperty booleanProperty : pins.keySet()) {<br \/>\n      booleanProperty.setValue(Boolean.TRUE);<br \/>\n    }<br \/>\n  }<\/p>\n<p>  public void setOffAllPins() {<br \/>\n    for (BooleanProperty booleanProperty : pins.keySet()) {<br \/>\n      booleanProperty.setValue(Boolean.FALSE);<br \/>\n    }<br \/>\n  }<\/p>\n<p>  public void reset() {<br \/>\n    if (testTimeline != null) {<br \/>\n      testTimeline.stop();<br \/>\n    }<br \/>\n    for (BooleanProperty booleanProperty : pins.keySet()) {<br \/>\n      booleanProperty.setValue(Boolean.FALSE);<br \/>\n    }<br \/>\n  }<\/p>\n<p>}<\/p>\n<p>[\/java]<\/p>\n<h1><span class=\"ez-toc-section\" id=\"SwitchBoardController\"><\/span>SwitchBoardController<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Finally the <strong><code>SwitchBoardController<\/code><\/strong> connects the UI to the <strong><code>GpioAdapterFX<\/code><\/strong> (bidirectional binding is my best friend).<\/p>\n<p>To visualize the state of the GPIO Pins, I&#8217;m using Gerrit Grunwalds LED Control from his <a href=\"http:\/\/harmoniccode.blogspot.de\/2013\/01\/fun-with-preview-releases.html\" title=\"Fun with PreView releases...\" target=\"_blank\">Enzo7<\/a> lib (a port of some of his JFXtras gauges to JavaFX 8).<\/p>\n<p>[java]<br \/>\npublic class SwitchBoardController implements Initializable {<\/p>\n<p>  @FXML<br \/>\n  private GridPane buttonGridPane;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO0;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO1;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO2;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO3;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO4;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO5;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO6;<br \/>\n  @FXML<br \/>\n  private ToggleButton toogleGPIO7;<br \/>\n  @FXML<br \/>\n  private Button testButton;<br \/>\n  @FXML<br \/>\n  private Button resetButton;<br \/>\n  @FXML<br \/>\n  private Button exitButton;<br \/>\n  @FXML<br \/>\n  private ToggleButton gpioConnectButton;<br \/>\n  @FXML<br \/>\n  private ToggleGroup gpioConnectGroup;<br \/>\n  @FXML<br \/>\n  private ToggleButton gpioDisconnectButton;<br \/>\n  private GpioAdapterFX gpioAdapterFx;<br \/>\n  private Led indicatorGPIO0;<br \/>\n  private Led indicatorGPIO1;<br \/>\n  private Led indicatorGPIO2;<br \/>\n  private Led indicatorGPIO3;<br \/>\n  private Led indicatorGPIO4;<br \/>\n  private Led indicatorGPIO5;<br \/>\n  private Led indicatorGPIO6;<br \/>\n  private Led indicatorGPIO7;<\/p>\n<p>  \/**<br \/>\n   * Initializes the controller class.<br \/>\n   *\/<br \/>\n  @Override<br \/>\n  public void initialize(URL url, ResourceBundle rb) {<br \/>\n    assert buttonGridPane != null : &#8220;fx:id=\\&#8221;buttonGridPane\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert exitButton != null : &#8220;fx:id=\\&#8221;exitButton\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert gpioConnectButton != null : &#8220;fx:id=\\&#8221;gpioConnectButton\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert gpioConnectGroup != null : &#8220;fx:id=\\&#8221;gpioConnectGroup\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert gpioDisconnectButton != null : &#8220;fx:id=\\&#8221;gpioDisconnectButton\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert resetButton != null : &#8220;fx:id=\\&#8221;resetButton\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert testButton != null : &#8220;fx:id=\\&#8221;testButton\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO0 != null : &#8220;fx:id=\\&#8221;toogleCPIO0\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO1 != null : &#8220;fx:id=\\&#8221;toogleCPIO1\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO2 != null : &#8220;fx:id=\\&#8221;toogleCPIO2\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO3 != null : &#8220;fx:id=\\&#8221;toogleCPIO3\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO4 != null : &#8220;fx:id=\\&#8221;toogleCPIO4\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO5 != null : &#8220;fx:id=\\&#8221;toogleCPIO5\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO6 != null : &#8220;fx:id=\\&#8221;toogleCPIO6\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<br \/>\n    assert toogleGPIO7 != null : &#8220;fx:id=\\&#8221;toogleCPIO7\\&#8221; was not injected: check your FXML file &#8216;SwitchBoard.fxml&#8217;.&#8221;;<\/p>\n<p>    gpioAdapterFx = new GpioAdapterFX();<\/p>\n<p>    indicatorGPIO0 = createIndicator();<br \/>\n    indicatorGPIO1 = createIndicator();<br \/>\n    indicatorGPIO2 = createIndicator();<br \/>\n    indicatorGPIO3 = createIndicator();<br \/>\n    indicatorGPIO4 = createIndicator();<br \/>\n    indicatorGPIO5 = createIndicator();<br \/>\n    indicatorGPIO6 = createIndicator();<br \/>\n    indicatorGPIO7 = createIndicator();<\/p>\n<p>    buttonGridPane<br \/>\n            .add(indicatorGPIO0, 0, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO1, 1, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO2, 2, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO3, 3, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO4, 4, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO5, 5, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO6, 6, 0);<br \/>\n    buttonGridPane.add(indicatorGPIO7, 7, 0);<\/p>\n<p>    indicatorGPIO0.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin0StateProperty());<br \/>\n    indicatorGPIO1.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin1StateProperty());<br \/>\n    indicatorGPIO2.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin2StateProperty());<br \/>\n    indicatorGPIO3.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin3StateProperty());<br \/>\n    indicatorGPIO4.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin4StateProperty());<br \/>\n    indicatorGPIO5.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin5StateProperty());<br \/>\n    indicatorGPIO6.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin6StateProperty());<br \/>\n    indicatorGPIO7.onProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin7StateProperty());<\/p>\n<p>    toogleGPIO0.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin0StateProperty());<br \/>\n    toogleGPIO1.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin1StateProperty());<br \/>\n    toogleGPIO2.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin2StateProperty());<br \/>\n    toogleGPIO3.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin3StateProperty());<br \/>\n    toogleGPIO4.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin4StateProperty());<br \/>\n    toogleGPIO5.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin5StateProperty());<br \/>\n    toogleGPIO6.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin6StateProperty());<br \/>\n    toogleGPIO7.selectedProperty().<br \/>\n            bindBidirectional(gpioAdapterFx.pin7StateProperty());<br \/>\n  }<\/p>\n<p>  private Led createIndicator() {<br \/>\n    return LedBuilder.create().<br \/>\n            prefHeight(80.0).<br \/>\n            prefWidth(80.0).<br \/>\n            build();<br \/>\n  }<\/p>\n<p>  \/*<br \/>\n   * &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; ACTIONS &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n   *\/<br \/>\n  @FXML<br \/>\n  public void testAction() {<br \/>\n    gpioAdapterFx.test();<br \/>\n  }<\/p>\n<p>  @FXML<br \/>\n  public void resetAction() {<br \/>\n    gpioAdapterFx.reset();<br \/>\n  }<\/p>\n<p>  @FXML<br \/>\n  public void gpioDisconnectAction() {<br \/>\n    gpioAdapterFx.disconnect();<br \/>\n  }<\/p>\n<p>  @FXML<br \/>\n  public void gpioConnectAction() {<br \/>\n    gpioAdapterFx.connect();<br \/>\n  }<\/p>\n<p>  @FXML<br \/>\n  public void exitAction() {<br \/>\n    gpioAdapterFx.reset();<br \/>\n    gpioAdapterFx.disconnect();<br \/>\n    Platform.exit();<br \/>\n  }<br \/>\n}<br \/>\n[\/java]<\/p>\n<h1><span class=\"ez-toc-section\" id=\"You_can_find_the_complete_code_here\"><\/span><strong>You can find the complete code <a href=\"https:\/\/bitbucket.org\/Jerady\/raspberry-cpio-control-fx\/src\" title=\"https:\/\/bitbucket.org\/Jerady\/raspberry-cpio-control-fx\/src\" target=\"_blank\">here<\/a>.<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h1><span class=\"ez-toc-section\" id=\"The_runfxapp_skript_may_help_you_to_run_the_app_on_your_Raspberry\"><\/span><strong>The <a href=\"http:\/\/www.jensd.de\/wordpress\/?p=301\" target=\"_blank\">runfxapp skript<\/a> may help you to run the app on your Raspberry.<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h1><span class=\"ez-toc-section\" id=\"Stay_tuned%E2%80%A6\"><\/span>Stay tuned&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Inspired by Oliver Schneiders <a href=\"http:\/\/sweetpi.h3llfire.de\/119\/funksteckdosen-mit-dem-raspberry-pi-schalten\" target=\"_blank\">blog post<\/a> I have already ordered the transmitter to control my wireless power outlets (but shipping from Hong Kong will take some weeks&#8230;).<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"#JavaFX on Raspberry Pi: GPIO Controller (Part2) http:\/\/wp.me\/p38FCL-5m","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[21,30,4,18],"tags":[91],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p38FCL-5m","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/332"}],"collection":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=332"}],"version-history":[{"count":66,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/332\/revisions"}],"predecessor-version":[{"id":1210,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/332\/revisions\/1210"}],"wp:attachment":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}