package com.mmcvey; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalInput; import com.pi4j.io.gpio.PinPullResistance; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; public class IO { private volatile boolean running; private final GpioPinDigitalInput button0, button1, button2, button3; private final GpioController gpio; private final SoundAnalyser sa; private final Main main; private final GpioPinListenerDigital cw, cc, stop, nextMode; public IO(SoundAnalyser sa, Main main, GpioController gpio) { stop = new GpioPinListenerDigital() { @Override public synchronized void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent arg0) { main.stop(); stop(); } }; cw = new GpioPinListenerDigital() { private int mode = 1; @Override public synchronized void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent arg0) { if (arg0.getState() == PinState.HIGH) { return; } System.out.println("CW changed: mode=" + mode); if (mode == 0) { sa.setColorWight(1.5f); mode++; } else if (mode == 1) { sa.setColorWight(2.0f); mode++; } else if (mode == 2) { sa.setColorWight(2.5f); mode++; } else if (mode == 3) { sa.setColorWight(3.0f); mode++; } else { sa.setColorWight(1.0f); mode = 0; } } }; cc = new GpioPinListenerDigital() { private int mode = 1; @Override public synchronized void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent arg0) { if (arg0.getState() == PinState.HIGH) { return; } System.out.println("CC changed: mode=" + mode); if (mode == 0) { sa.setChangeCooldown(0.5); mode++; } else if (mode == 1) { sa.setChangeCooldown(0.75); mode++; } else if (mode == 2) { sa.setChangeCooldown(1.0); mode++; } else if (mode == 3) { sa.setChangeCooldown(1.5); mode++; } else if (mode == 4) { sa.setChangeCooldown(10.0); mode++; } else { sa.setChangeCooldown(0.25); mode = 0; } } }; nextMode = new GpioPinListenerDigital() { @Override public synchronized void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent arg0) { if (arg0.getState() == PinState.HIGH) { return; } main.nextMode(); } }; this.sa = sa; this.main = main; this.gpio = gpio; button0 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_00, PinPullResistance.PULL_UP); button1 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_01, PinPullResistance.PULL_UP); button2 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_UP); button3 = gpio.provisionDigitalInputPin(RaspiPin.GPIO_03, PinPullResistance.PULL_UP); button0.setShutdownOptions(true); button1.setShutdownOptions(true); button2.setShutdownOptions(true); button3.setShutdownOptions(true); button0.addListener(stop); button1.addListener(cw); button2.addListener(cc); button3.addListener(nextMode); } public void start() { new Thread(() -> run()).start(); } /** * stop gc */ public synchronized void run() { running = true; try { while(running) { Thread.sleep(500); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void stop() { running = false; } }