<< Clean Raspberry Pi GPIO testing with the Breadboard Pi Bridge
Pi4J - Adding a REST interface with Spring Boot >>

Pi4J - Extending with a JavaFX info application

2019-05-23 23:55:59
General remark: Pi4J is being reworked at this moment to make it fully Java11 and more maintainable. So the code I'm referring to can/will change in the future and this post should be seen as an experiment and proof-of-concept.
While trying out what Pi4J can do, I found it could easily be extended with a JavaFX application to provide info about the headers on a Pi board. This could later be extended to a remote/local (touch) User Interface using the REST interface from this post.

Starting point

I started with the minimal JavaFX application I created before for a quick start with the correct pom.xml and basic starting classes.

I also started from develop/2.0 branch of Pi4j with a fork and a new branch "2.0.pinninginfo" on my GitHub account.

Changes in Pi4j core

The core library contains a lot of information of the available pins on a Pi board in the class RaspiPin.java, eg
// the following GPIO pins are only available on the Raspberry Pi Model A, B (revision 2.0)
public static final Pin GPIO_17 = createDigitalPin(17, "GPIO 17"); // requires B rev2 or newer model (P5 header)
The only change I did in the core, was adding a Header/HeaderPin definition to group this info into a 26 or 40 pin header object depending on the type of board.
    public static Header getHeader(SystemInfo.BoardType board) {
        Header header = null;

        switch (board) {
            case RaspberryPi_A:
            case RaspberryPi_B_Rev1:
            case RaspberryPi_B_Rev2:
                header = new Header(26);

                header.addHeaderPin(1, null, "3.3 VDC", "Power", null);
                header.addHeaderPin(2, null, "5.0 VDC", "Power", null);
                header.addHeaderPin(3, 8, "SDA0", "(I2C)", null);
                header.addHeaderPin(4, null, "DNC", "", null);
                header.addHeaderPin(5, 9, "SCL0", "(I2C)", null);
                header.addHeaderPin(6, null, "Ground", "", null);
                header.addHeaderPin(7, 7, "GPIO 7", "", RaspiPin.GPIO_07);

            case RaspberryPi_A_Plus:
            case RaspberryPi_B_Plus:
            case RaspberryPi_2B:
            case RaspberryPi_3B:
            case RaspberryPi_3B_Plus:
            case RaspberryPi_Zero:
            case RaspberryPi_ZeroW:
                header = new Header(40);

                header.addHeaderPin(1, null, "3.3 VDC", "Power", null);
                header.addHeaderPin(2, null, "5.0 VDC", "Power", null);
                header.addHeaderPin(3, 8, "GPIO 8", "SDA1 (I2C)", RaspiPin.GPIO_08);
                header.addHeaderPin(4, null, "5.0 VDC", "Power", null);
                header.addHeaderPin(5, 9, "GPIO 9", "SCL1 (I2C)", RaspiPin.GPIO_09);


        return header;

Additional JavaFX module

An extra module was added to the Pi4J-structure to separate the FX application from the other modules.

By calling the getHeader-function from the core, the pins can be visualized in a table or header (compact and extended) view. These view sources are available here.

When running the application a list is filled with the available board types and after selecting one, the pins are shown in three different tabs:


This isn't a fancy application yet, but just a proof-of-concept to show how easy it is to expose the info which is in the Pi4J-core in an UI. The checkboxes don't do anything now, but combined with the REST interface from my previous post we could run this FX application an a PC or Pi and control one or multiple boards.

Depending on the decisions taken by the Pi4J-team and the changes in the 2.0-version I will try to adapt/extend this UI and hope it can be pulled into the next version of the Pi4J-project.