001package com.pi4j.io.gpio;
002
003/*
004 * #%L
005 * **********************************************************************
006 * ORGANIZATION  :  Pi4J
007 * PROJECT       :  Pi4J :: Java Library (Core)
008 * FILENAME      :  PinProvider.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 - 2021 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
032
033import com.pi4j.io.gpio.impl.PinImpl;
034
035import java.util.*;
036
037/**
038 * Pi4J pin definitions
039 *
040 * @author Robert Savage (<a
041 *         href="http://www.savagehomeautomation.com">http://www.savagehomeautomation.com</a>)
042 */
043public abstract class PinProvider {
044
045    protected static final Map<String, Pin> pins = new HashMap<>();
046
047    protected static Pin createDigitalPin(String providerName, int address, String name) {
048        return createDigitalPin(providerName, address, name, EnumSet.allOf(PinEdge.class));
049    }
050
051    protected static Pin createDigitalPin(String providerName, int address, String name, EnumSet<PinPullResistance> resistance, EnumSet<PinEdge> edges) {
052        return createPin(providerName, address, name,
053                EnumSet.of(PinMode.DIGITAL_INPUT, PinMode.DIGITAL_OUTPUT, PinMode.SOFT_PWM_OUTPUT),
054                resistance,
055                edges);
056    }
057
058    protected static Pin createDigitalPin(String providerName, int address, String name, EnumSet<PinEdge> edges) {
059        return createPin(providerName, address, name,
060                EnumSet.of(PinMode.DIGITAL_INPUT, PinMode.DIGITAL_OUTPUT, PinMode.SOFT_PWM_OUTPUT),
061                PinPullResistance.all(),
062                edges);
063    }
064
065    protected static Pin createDigitalAndPwmPin(String providerName, int address, String name, EnumSet<PinEdge> edges) {
066        return createPin(providerName, address, name,
067                         EnumSet.of(PinMode.DIGITAL_INPUT, PinMode.DIGITAL_OUTPUT, PinMode.PWM_OUTPUT),
068                         PinPullResistance.all(),
069                         edges);
070    }
071
072    protected static Pin createDigitalAndPwmPin(String providerName, int address, String name) {
073        return createDigitalAndPwmPin(providerName, address, name, EnumSet.allOf(PinEdge.class));
074    }
075
076    protected static Pin createAnalogInputPin(String providerName, int address, String name) {
077        return createPin(providerName, address, name, EnumSet.of(PinMode.ANALOG_INPUT));
078    }
079
080    protected static Pin createPin(String providerName, int address, String name, EnumSet<PinMode> modes) {
081        Pin pin = new PinImpl(providerName, address, name, modes);
082        pins.put(name, pin);
083        return pin;
084    }
085
086    protected static Pin createPin(String providerName, int address, String name, EnumSet<PinMode> modes,
087                                   EnumSet<PinPullResistance> resistance, EnumSet<PinEdge> edges) {
088        Pin pin = new PinImpl(providerName, address, name, modes, resistance, edges);
089        pins.put(name, pin);
090        return pin;
091    }
092
093    public static Pin getPinByName(String name) {
094        return pins.get(name);
095    }
096
097    public static Pin getPinByAddress(int address) {
098        for(Pin pin : pins.values()){
099            if(pin.getAddress() == address){
100                return pin;
101            }
102        }
103        return null;
104    }
105
106    /**
107     * Get all pin instances from this provider.
108     * @return all pin instances support by this provider
109     */
110    public static Pin[] allPins() {
111        return pins.values().toArray(new Pin[0]);
112    }
113
114    /**
115     * Get all pin instances from this provider that support one of the provided pin modes.
116     * @param mode one or more pin modes that you wish to include in the result set
117     * @return pin instances that support the provided pin modes
118     */
119    public static Pin[] allPins(PinMode ... mode) {
120        List<Pin> results = new ArrayList<>();
121        for(Pin p : pins.values()){
122            EnumSet<PinMode> supported_modes = p.getSupportedPinModes();
123            for(PinMode m : mode){
124                if(supported_modes.contains(m)){
125                    results.add(p);
126                    continue;
127                }
128            }
129        }
130        return results.toArray(new Pin[0]);
131    }
132}