001package com.pi4j.io.gpio;
002
003import java.util.Map;
004
005/*
006 * #%L
007 * **********************************************************************
008 * ORGANIZATION  :  Pi4J
009 * PROJECT       :  Pi4J :: Java Library (Core)
010 * FILENAME      :  SimulatedGpioProvider.java
011 *
012 * This file is part of the Pi4J project. More information about
013 * this project can be found here:  https://www.pi4j.com/
014 * **********************************************************************
015 * %%
016 * Copyright (C) 2012 - 2021 Pi4J
017 * %%
018 * This program is free software: you can redistribute it and/or modify
019 * it under the terms of the GNU Lesser General Public License as
020 * published by the Free Software Foundation, either version 3 of the
021 * License, or (at your option) any later version.
022 *
023 * This program is distributed in the hope that it will be useful,
024 * but WITHOUT ANY WARRANTY; without even the implied warranty of
025 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
026 * GNU General Lesser Public License for more details.
027 *
028 * You should have received a copy of the GNU General Lesser Public
029 * License along with this program.  If not, see
030 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
031 * #L%
032 */
033
034
035/**
036 * A simulator to aid in development of RI Pi systems using a standard PC dev
037 * environment.
038 *
039 * To use the simulator you need two environment variables:
040 *
041 * The standard PI4J platform statement MUST point to the simulator:
042 *
043 * PI4J_PLATFORM=Simulated
044 *
045 * A second environment variable that defines the platform that is to be
046 * simulated.
047 *
048 * SimulatedPlatform=<Real Platform's Name>
049 *
050 * e.g.
051 *
052 * SimultatedPlatform=RaspberryPi GPIO Provider
053 *
054 * If you don't provide a value for theSimulatedPlatform the system assumes that
055 * you want to use the raspberry pi platform: RaspiGpioProvider
056 *
057 * @author bsutton
058 *
059 */
060public class SimulatedGpioProvider extends GpioProviderBase implements GpioProvider {
061
062    // We use the name of the platform that we are simulating.
063    public static String NAME;
064
065    public SimulatedGpioProvider() {
066        Map<String, String> env = System.getenv();
067
068        String config = env.get("SimulatedPlatform");
069
070        // If no specific platform is specified we default to simulating the raspberry pi
071        if (config == null) {
072            NAME = RaspiGpioProvider.NAME;
073            return;
074        }
075
076        NAME = config;
077    }
078
079    @Override
080    public String getName() {
081        return NAME;
082    }
083
084    public void setState(Pin pin, PinState state) {
085        // cache pin state
086        getPinCache(pin).setState(state);
087
088        // dispatch event
089        dispatchPinDigitalStateChangeEvent(pin, state);
090    }
091
092    public void setAnalogValue(Pin pin, double value) {
093        // cache pin state
094        getPinCache(pin).setAnalogValue(value);
095
096        // dispatch event
097        dispatchPinAnalogValueChangeEvent(pin, value);
098    }
099
100}