Java Деконструктор GPIO - PullRequest
       39

Java Деконструктор GPIO

0 голосов
/ 22 февраля 2020

Я очень новичок в мире программирования. Итак, вот моя проблема:

Я строю простой IRCBot (PIRCBot), который может принимать команды, такие как Turn on и Turn off, которые установят контакты малины на high или low , Когда я закрываю приложение или когда оно падает, контакты останутся active.

Итак, мои вопросы: Как я могу убедиться, что GPIO выпущен, когда я завершаю приложение с SIGINT? (Решено с комментарием ниже)

Как я могу убедиться, что GPIO выпускается при сбое моего приложения?

Мой код MainBot:

    public static void main(String[] args) throws Exception {
        try(IRCBot bot = new IRCBot()) {
            bot.setVerbose(true);
            bot.connect("192.168.1.137", 6667, "somesecretpasswd");
            bot.joinChannel("#test");

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Класс IRCBot:

public class IRCBot extends PircBot implements AutoCloseable {
    private final static String[] ALLOWED_USER = {"USER1", "USER2", "IRCBot"};
    private final static String TURN_LIGHT_ON = "Turn on";
    private final static String TURN_LIGHT_OFF = "Turn off";
    private final static String DISCO = "Disco";
    private GPIOController gpio;

    public IRCBot() {
        this.gpio = new GPIOController();
        this.setName("IRCBot");
    }
///other stuff
  @Override
    public void close() throws Exception {
        gpio.close();
    }

Класс GPIOController

public class GPIOController implements AutoCloseable {
    private final GpioController gpio = GpioFactory.getInstance();
    private GpioPinDigitalOutput gpio20;
    private GpioPinDigitalOutput gpio21;
    private GpioPinDigitalOutput gpio26;
    private boolean status = false;

    Logger LOGGER = Logger.getLogger(GPIOController.class.getName());

    public GPIOController() {
        GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
        gpio.setShutdownOptions(true, PinState.LOW, PinPullResistance.OFF);
        gpio20 = gpio.provisionDigitalOutputPin(RaspiBcmPin.GPIO_20, "LED", PinState.HIGH);
        gpio21 = gpio.provisionDigitalOutputPin(RaspiBcmPin.GPIO_21, "LED", PinState.HIGH);
        gpio26 = gpio.provisionDigitalOutputPin(RaspiBcmPin.GPIO_26, "LED", PinState.HIGH);
    }
///some other stuff

@Override
    public void close() throws Exception {
        gpio.shutdown();
        LOGGER.info("Shuting down");
    }

1 Ответ

0 голосов
/ 22 февраля 2020

Если вы делаете ваши классы наследуемыми от интерфейса java .lang.AutoCloseable и добавляете свой код очистки в метод close, вы можете использовать его следующим образом:

try(MyClassThatNeedsCleanup x = new MyClassThatNeedsCleanup()){
  // use the class here
}

Это автоматически вызовет close ( ) при выходе из области.

...