001package com.pi4j.io.gpio.impl; 002 003/* 004 * #%L 005 * ********************************************************************** 006 * ORGANIZATION : Pi4J 007 * PROJECT : Pi4J :: Java Library (Core) 008 * FILENAME : GpioEventMonitorImpl.java 009 * 010 * This file is part of the Pi4J project. More information about 011 * this project can be found here: https://www.pi4j.com/ 012 * ********************************************************************** 013 * %% 014 * Copyright (C) 2012 - 2019 Pi4J 015 * %% 016 * This program is free software: you can redistribute it and/or modify 017 * it under the terms of the GNU Lesser General Public License as 018 * published by the Free Software Foundation, either version 3 of the 019 * License, or (at your option) any later version. 020 * 021 * This program is distributed in the hope that it will be useful, 022 * but WITHOUT ANY WARRANTY; without even the implied warranty of 023 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 024 * GNU General Lesser Public License for more details. 025 * 026 * You should have received a copy of the GNU General Lesser Public 027 * License along with this program. If not, see 028 * <http://www.gnu.org/licenses/lgpl-3.0.html>. 029 * #L% 030 */ 031 032import com.pi4j.io.gpio.GpioPinInput; 033import com.pi4j.io.gpio.PinState; 034import com.pi4j.io.gpio.event.GpioPinListener; 035import com.pi4j.io.gpio.event.GpioPinAnalogValueChangeEvent; 036import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; 037import com.pi4j.io.gpio.event.GpioPinListenerAnalog; 038import com.pi4j.io.gpio.event.GpioPinListenerDigital; 039import com.pi4j.io.gpio.event.PinAnalogValueChangeEvent; 040import com.pi4j.io.gpio.event.PinEvent; 041import com.pi4j.io.gpio.event.PinEventType; 042import com.pi4j.io.gpio.event.PinDigitalStateChangeEvent; 043import com.pi4j.io.gpio.event.PinListener; 044import com.pi4j.io.gpio.trigger.GpioTrigger; 045 046import java.util.ArrayList; 047import java.util.Collection; 048 049@SuppressWarnings("unused") 050public class GpioEventMonitorImpl implements PinListener { 051 private final GpioPinInput pin; 052 053 public GpioEventMonitorImpl(GpioPinInput pin) { 054 this.pin = pin; 055 } 056 057 @Override 058 public void handlePinEvent(PinEvent event) { 059 // only process listeners and triggers if the received interrupt event 060 // matches the pin number being tracked my this class instance 061 if (this.pin.getPin().equals(event.getPin())) { 062 if (event.getEventType() == PinEventType.DIGITAL_STATE_CHANGE) { 063 PinState state = ((PinDigitalStateChangeEvent)event).getState(); 064 065 // create a copy of the listeners collection 066 Collection<GpioPinListener> listeners = new ArrayList<>(pin.getListeners()); 067 068 // process event callbacks for digital listeners 069 for (GpioPinListener listener : listeners) { 070 if (listener != null && listener instanceof GpioPinListenerDigital) { 071 ((GpioPinListenerDigital)listener).handleGpioPinDigitalStateChangeEvent(new GpioPinDigitalStateChangeEvent(event.getSource(), pin, state)); 072 } 073 } 074 075 // create a copy of the triggers collection 076 Collection<GpioTrigger> triggers = new ArrayList<>(pin.getTriggers()); 077 078 // process triggers 079 for (GpioTrigger trigger : triggers) { 080 if (trigger != null && trigger.hasPinState(state)) { 081 trigger.invoke(pin, state); 082 } 083 } 084 } else if(event.getEventType() == PinEventType.ANALOG_VALUE_CHANGE) { 085 double value = ((PinAnalogValueChangeEvent)event).getValue(); 086 087 // create a copy of the listeners collection 088 Collection<GpioPinListener> listeners = new ArrayList<>(pin.getListeners()); 089 090 // process event callbacks for analog listeners 091 for (GpioPinListener listener : listeners) { 092 if (listener != null && listener instanceof GpioPinListenerAnalog) { 093 ((GpioPinListenerAnalog)listener).handleGpioPinAnalogValueChangeEvent(new GpioPinAnalogValueChangeEvent(event.getSource(), pin, value)); 094 } 095 } 096 } 097 } 098 } 099}