001package com.pi4j.platform;
002
003/*
004 * #%L
005 * **********************************************************************
006 * ORGANIZATION  :  Pi4J
007 * PROJECT       :  Pi4J :: Java Library (Core)
008 * FILENAME      :  Platform.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
032import com.pi4j.io.gpio.*;
033import com.pi4j.io.i2c.I2CFactoryProvider;
034import com.pi4j.io.i2c.impl.I2CProviderImpl;
035import com.pi4j.system.SystemInfoProvider;
036import com.pi4j.system.impl.*;
037
038/**
039 * <p>
040 * This enumeration defines the platforms supported by Pi4J.
041 * </p>
042 *
043 * @see <a href="https://www.pi4j.com/">https://www.pi4j.com/</a>
044 * @author Robert Savage (<a
045 *         href="http://www.savagehomeautomation.com">http://www.savagehomeautomation.com</a>)
046 */
047public enum Platform {
048    // SUPPORTED PLATFORMS
049    RASPBERRYPI("raspberrypi", "Raspberry Pi"),
050    BANANAPI("bananapi", "BananaPi"),
051    BANANAPRO("bananapro", "BananaPro"),
052    BPI("bpi", "Synovoip BPI"),
053    ODROID("odroid", "Odroid"),
054    ORANGEPI("orangepi", "OrangePi"),
055    NANOPI("nanopi", "NanoPi"),
056    SIMULATED("simulated", "Simulated");
057
058    // private variables
059    protected String platformId = null;
060    protected String label = null;
061
062    /**
063     * Private default constructor
064     * @param platformId
065     * @param label
066     */
067    private Platform(String platformId, String label) {
068        this.platformId = platformId;
069        this.label = label;
070    }
071
072    /**
073     * Get the platform's friendly string name/label.
074     * @return label of platform
075     */
076    public String getLabel() {
077        return this.label;
078    }
079
080    /**
081     * Get the platform's friendly string name/label.
082     * @return label of platform
083     */
084    public String label() {
085        return getLabel();
086    }
087
088    /**
089     * Get the platform's unique identifier string.
090     * @return platform id string
091     */
092    public String getId() {
093        return platformId;
094    }
095
096    /**
097     * Get the platform's unique identifier string.
098     * @return platform id string
099     */
100    public String id() {
101        return getId();
102    }
103
104    /**
105     * Lookup a platform enumeration by the platform's unique identifier string.
106     * @return platform enumeration
107     */
108    public static Platform fromId(String platformId) {
109        for(Platform platform : Platform.values()) {
110            if(platform.id().equalsIgnoreCase(platformId))
111                return platform;
112        }
113        return null;
114    }
115
116
117    public GpioProvider getGpioProvider() {
118        return getGpioProvider(this);
119    }
120
121    public static GpioProvider getGpioProvider(Platform platform) {
122        // create the provider based on the PlatformManager's selected platform
123        switch (PlatformManager.getPlatform()) {
124            case RASPBERRYPI: {
125                return new RaspiGpioProvider();
126            }
127            case BANANAPI: {
128                return new BananaPiGpioProvider();
129            }
130            case BANANAPRO: {
131                return new BananaProGpioProvider();
132            }
133            case BPI: {
134                return new BpiGpioProvider();
135            }
136            case ODROID: {
137                return new OdroidGpioProvider();
138            }
139            case ORANGEPI: {
140                return new OrangePiGpioProvider();
141            }
142            case NANOPI: {
143                return new NanoPiGpioProvider();
144            }
145            case SIMULATED: {
146                return new SimulatedGpioProvider();
147            }
148            default: {
149                // if a platform cannot be determine, then assume it's the default RaspberryPi
150                return new RaspiGpioProvider();
151            }
152        }
153    }
154
155    public I2CFactoryProvider getI2CFactoryProvider() {
156        return getI2CFactoryProvider(this);
157    }
158
159    public static I2CFactoryProvider getI2CFactoryProvider(Platform platform) {
160        return new I2CProviderImpl();
161    }
162
163    public SystemInfoProvider getSystemInfoProvider() {
164        return getSystemInfoProvider(this);
165    }
166
167    public static SystemInfoProvider getSystemInfoProvider(Platform platform) {
168        // return the system info provider based on the provided platform
169        switch(platform) {
170            case RASPBERRYPI: {
171                return new RaspiSystemInfoProvider();
172            }
173            case BANANAPI: {
174                return new BananaPiSystemInfoProvider();
175            }
176            case BANANAPRO: {
177                return new BananaProSystemInfoProvider();
178            }
179            case BPI: {
180                return new BpiSystemInfoProvider();
181            }
182            case ODROID: {
183                return new OdroidSystemInfoProvider();
184            }
185            case ORANGEPI: {
186                return new OrangePiSystemInfoProvider();
187            }
188            case NANOPI: {
189                return new NanoPiSystemInfoProvider();
190            }
191            default: {
192                // if a platform cannot be determine, then assume it's the default RaspberryPi
193                return new RaspiSystemInfoProvider();
194            }
195        }
196    }
197}