public SpiConnection(ProcessorPin clock, ProcessorPin ss, ProcessorPin?miso, ProcessorPin?mosi, Endianness endianness)
        {
            this.clock      = clock;
            this.ss         = ss;
            this.miso       = miso;
            this.mosi       = mosi;
            this.endianness = endianness;

            driver = new MemoryGpioConnectionDriver();

            driver.Allocate(clock, PinDirection.Output);
            driver.Write(clock, false);

            driver.Allocate(ss, PinDirection.Output);
            driver.Write(ss, true);

            if (mosi.HasValue)
            {
                driver.Allocate(mosi.Value, PinDirection.Output);
                driver.Write(mosi.Value, false);
            }

            if (miso.HasValue)
            {
                driver.Allocate(miso.Value, PinDirection.Input);
            }
        }
Exemple #2
0
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();
            ILog log = LogManager.GetLogger("GPIO");

            log.Debug("Start");

            PinConfiguration output = ConnectorPin.P1Pin36.Output().Name("Output1");

            PinConfiguration[] outputs = new PinConfiguration[]
            {
                output
            };

            GpioConnection gpio = new GpioConnection(outputs);
            //gpio.Open();

            ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3);

            var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver;

            Mcp3008SpiConnection spi = new Mcp3008SpiConnection(
                driver.Out(adcClock),
                driver.Out(adcCs),
                driver.In(adcMiso),
                driver.Out(adcMosi));

            IInputAnalogPin inputPin = spi.In(Mcp3008Channel.Channel0);

            gpio.Open();
            ElectricPotential volts = ElectricPotential.FromVolts(0);

            while (!Console.KeyAvailable)
            {
                var v = referenceVoltage * (double)inputPin.Read().Relative;
                Console.WriteLine("{0} mV", v.Millivolts);
                if ((Math.Abs(v.Millivolts - volts.Millivolts) > 100))
                {
                    volts = ElectricPotential.FromMillivolts(v.Millivolts);
                    Console.WriteLine("Voltage ch0: {0}", volts.Millivolts.ToString());
                }
                gpio.Toggle("Output1");
                Thread.Sleep(2000);
            }
            gpio.Close();

            //bool bShutdown = false;
            //while(!bShutdown)
            //{

            //    gpio.Toggle(output);
            //    log.Debug("Toggle output");

            //    Thread.Sleep(5000);

            //}
        }
        public void Action(ActionBase baseAction, CancellationToken cancelToken, dynamic config)
        {
            RgbSimpleAction action = (RgbSimpleAction)baseAction;

            // note that config is dynamic so we cast the pin values to integer
            _state = new { state = "setup" };
            var connection = new MemoryGpioConnectionDriver();
            var pins       = new GpioOutputBinaryPin[]
            {
                connection.Out((ProcessorPin)config.pins[0]),
                connection.Out((ProcessorPin)config.pins[1]),
                connection.Out((ProcessorPin)config.pins[2])
            };

            _state = new { state = "preDelay" };
            if (cancelToken.WaitHandle.WaitOne(action.PreDelayMs))
            {
                return;
            }

            for (int loopCounter = 0; loopCounter < action.LoopCount; ++loopCounter)
            {
                for (int i = 0; i < pins.Length; ++i)
                {
                    _state = new { state = $"startValue_{loopCounter}" };
                    pins[i].Write(action.StartValues[i]);
                }

                // wait until possible cancel, but continue if cancelled to at least set end value
                _state = new { state = $"startDuration_{loopCounter}" };
                cancelToken.WaitHandle.WaitOne(action.StartDurationMs);

                for (int i = 0; i < pins.Length; ++i)
                {
                    // only output if it changes
                    if (action.EndValues[i] != action.StartValues[i])
                    {
                        _state = new { state = $"endValue_{loopCounter}" };
                        pins[i].Write(action.EndValues[i]);
                    }
                }

                _state = new { state = $"endDuration_{loopCounter}" };
                if (cancelToken.WaitHandle.WaitOne(action.EndDurationMs))
                {
                    return;
                }
            }

            _state = new { state = "postDelay" };
            if (cancelToken.WaitHandle.WaitOne(action.PostDelayMs))
            {
                return;
            }
        }
        private void Run(string[] args)
        {
            Console.WriteLine("Press any key to exit...");

            var connection = new MemoryGpioConnectionDriver();
            var pcell      = connection.InOut(ProcessorPin.Pin18);

            //
            // See: https://learn.adafruit.com/photocells/using-a-photocell#bonus-reading-photocells-without-analog-pins
            //

            while (!Console.KeyAvailable)
            {
                int reads = 0;

                pcell.AsOutput();
                pcell.Write(false);
                System.Threading.Thread.Sleep(100);                 // allow to go low/false

                pcell.AsInput();
                while (pcell.Read() == false)
                {
                    ++reads;
                    if (reads >= MaxReads)
                    {
                        break;
                    }
                }

                //
                // Note: first couple of reads may be zero
                //

                string output = null;
                if (reads >= MaxReads)
                {
                    output = $"Dark:\treads={reads}";
                }
                else if (reads > 2500)
                {
                    output = $"Medium:\treads={reads}";
                }
                else
                {
                    output = $"Light:\treads={reads}";
                }
                Console.WriteLine(output);

                // wait in between reads
                System.Threading.Thread.Sleep(3000);
            }
        }
Exemple #5
0
        static void Main()
        {
            const ConnectorPin adcClock = ConnectorPin.P1Pin12;
            const ConnectorPin adcMiso  = ConnectorPin.P1Pin16;
            const ConnectorPin adcMosi  = ConnectorPin.P1Pin18;
            const ConnectorPin adcCs    = ConnectorPin.P1Pin22;

            Console.WriteLine("MCP-3008 Sample: Reading temperature on Channel 0 and luminosity on Channel 1");
            Console.WriteLine();
            Console.WriteLine("\tClock: {0}", adcClock);
            Console.WriteLine("\tCS: {0}", adcCs);
            Console.WriteLine("\tMOSI: {0}", adcMosi);
            Console.WriteLine("\tMISO: {0}", adcMiso);
            Console.WriteLine();

            ElectricPotential voltage = ElectricPotential.FromVolts(3.3);

            var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver;

            using (var adcConnection = new Mcp3008SpiConnection(
                       driver.Out(adcClock),
                       driver.Out(adcCs),
                       driver.In(adcMiso),
                       driver.Out(adcMosi)))
                using (var temperatureConnection = new Tmp36Connection(
                           adcConnection.In(Mcp3008Channel.Channel0),
                           voltage))
                    using (var lightConnection = new VariableResistiveDividerConnection(
                               adcConnection.In(Mcp3008Channel.Channel1),
                               ResistiveDivider.ForLowerResistor(ElectricResistance.FromKiloohms(10))))
                    {
                        Console.CursorVisible = false;

                        while (!Console.KeyAvailable)
                        {
                            var temperature = temperatureConnection.GetTemperature();
                            var resistor    = lightConnection.GetResistance();
                            var lux         = resistor.ToLux();

                            Console.WriteLine("Temperature = {0,5:0.0} °C\tLight = {1,5:0.0} Lux ({2} ohms)", temperature, lux, (int)resistor.Ohms);

                            Console.CursorTop--;

                            Thread.Sleep(1000);
                        }
                    }

            Console.CursorTop++;
            Console.CursorVisible = true;
        }
Exemple #6
0
        public static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Starting application");
                var driver = new MemoryGpioConnectionDriver();

                var lcdSpiSettings = new SpiConnectionSettings();
                lcdSpiSettings.BitsPerWord = 8;
                lcdSpiSettings.MaxSpeed    = 3932160;
                lcdSpiSettings.Delay       = 0;
                lcdSpiSettings.Mode        = SpiMode.Mode0;

                var adsSpiSettings = new SpiConnectionSettings();
                adsSpiSettings.BitsPerWord = 8;
                adsSpiSettings.MaxSpeed    = 3932160;
                adsSpiSettings.Delay       = 0;
                adsSpiSettings.Mode        = SpiMode.Mode1;

                var spi0 = new NativeSpiConnection("/dev/spidev0.0", lcdSpiSettings);
                var spi1 = new NativeSpiConnection("/dev/spidev0.1", adsSpiSettings);

                var lcdRegisterSelectGpio = ConnectorPin.P1Pin11;
                driver.In(lcdRegisterSelectGpio).Read();
                var lcdRegisterSelectOut = driver.Out(lcdRegisterSelectGpio);

                var lcdResetGpio = ConnectorPin.P1Pin16;
                var lcdResetOut  = driver.Out(lcdResetGpio);

                using (var deviceConnection = new Ti430BoostAds1118Connection(spi0, spi1, lcdRegisterSelectOut, lcdResetOut))
                {
                    deviceConnection.InitializeLcd();
                    deviceConnection.DisplayStringOnLcd(LcdLine.FirstLine, "Hello!");
                    Thread.Sleep(500);

                    deviceConnection.ClearLcd();

                    var temp = deviceConnection.GetMeasurement();
                    deviceConnection.DisplayStringOnLcd(LcdLine.SecondLine, string.Format("TEMP: {0} C", temp));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught!");
                Console.WriteLine("Exception Message: {0}", ex.Message);
                Console.WriteLine("Stack Trace: {0}", ex.StackTrace);
            }
        }
        public void Action(ActionBase baseAction, CancellationToken cancelToken, dynamic config)
        {
            LedBuzzerSimpleAction action = (LedBuzzerSimpleAction)baseAction;

            // note that config is dynamic so we cast the pin values to integer
            _state = new { state = "setup" };
            var connection = new MemoryGpioConnectionDriver();
            var pinLed     = connection.Out((ProcessorPin)config.pinLed);
            var pinBuzzer  = connection.Out((ProcessorPin)config.pinBuzzer);

            _state = new { state = "preDelay" };
            if (cancelToken.WaitHandle.WaitOne(action.PreDelayMs))
            {
                return;
            }

            for (int loopCounter = 0; loopCounter < action.LoopCount; ++loopCounter)
            {
                _state = new { state = $"startValue_{loopCounter}" };
                pinLed.Write(action.StartValue);
                pinBuzzer.Write(action.StartValue);

                // wait until possible cancel, but continue if cancelled to at least set end value
                _state = new { state = $"startDuration_{loopCounter}" };
                cancelToken.WaitHandle.WaitOne(action.StartDurationMs);

                // only output if it changes
                if (action.EndValue != action.StartValue)
                {
                    _state = new { state = $"endValue_{loopCounter}" };
                    pinLed.Write(action.EndValue);
                    pinBuzzer.Write(action.EndValue);
                }

                _state = new { state = $"endDuration_{loopCounter}" };
                if (cancelToken.WaitHandle.WaitOne(action.EndDurationMs))
                {
                    return;
                }
            }

            _state = new { state = "postDelay" };
            if (cancelToken.WaitHandle.WaitOne(action.PostDelayMs))
            {
                return;
            }
        }
Exemple #8
0
        public void Initialize(ConnectorPin adcClock, ConnectorPin adcMiso, ConnectorPin adcMosi, ConnectorPin adcCs)
        {
            AdcClock = adcClock;
            AdcMiso  = adcMiso;
            AdcMosi  = adcMosi;
            AdcCs    = adcCs;

            Console.WriteLine("MCP-3008 Sample: Reading temperature on Channel 0 and luminosity on Channel 1");
            Console.WriteLine();
            Console.WriteLine("\tClock: {0}", adcClock);
            Console.WriteLine("\tCS: {0}", adcCs);
            Console.WriteLine("\tMOSI: {0}", adcMosi);
            Console.WriteLine("\tMISO: {0}", adcMiso);
            Console.WriteLine();

            _driver        = new MemoryGpioConnectionDriver();
            _adcConnection = new Mcp3008SpiConnection(
                _driver.Out(AdcClock),
                _driver.Out(AdcCs),
                _driver.In(AdcMiso),
                _driver.Out(AdcMosi));
        }
Exemple #9
0
        public void InitGpio()
        {
            outputs = new PinConfiguration[]
            {
                Station1OutputPin.Output().Name("Station1"),
                Station2OutputPin.Output().Name("Station2"),
                Station3OutputPin.Output().Name("Station3"),
                Station4OutputPin.Output().Name("Station4"),
                Station5OutputPin.Output().Name("Station5"),
                Station6OutputPin.Output().Name("Station6"),
                Station7OutputPin.Output().Name("Station7"),
                Station8OutputPin.Output().Name("Station8"),
                PumpOperationPin.Output().Name("PumpOperation"),
                TankRelayOutputPin.Output().Name("TankRelay"),
                SpareOutputPin.Output().Name("Spare"),
                ResetRelayOutputPin.Output().Name("ResetRelay")
            };
            connection = new GpioConnection(outputs);

            connection.Add(LowPressureFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("LowPressureFaultInput {0}", b ? "on" : "off");
                bLowPressureFaultState = b;
                CreateEvent(EventType.IOEvent, string.Format("Input {0} on", LowPressureFaultInputPin.ToString()));
                CreateEvent(EventType.FaultEvent, string.Format("Low pressure fault  {0}", b ? "detected" : "cleared"));
            }));

            connection.Add(HighPressureFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("HighPressureFaultInput {0}", b ? "on" : "off");
                bHighPressureFaultState = b;
                CreateEvent(EventType.IOEvent, string.Format("Input {0} {1}", HighPressureFaultInputPin.ToString(), b ? "on" : "off"));
                CreateEvent(EventType.FaultEvent, string.Format("High pressure fault {0}", b ? "detected" : "cleared"));
            }));

            connection.Add(LowWellFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("LowWellFaultInput {0}", b ? "on" : "off");
                bLowWellFaultState = b;
                CreateEvent(EventType.IOEvent, string.Format("Input {0} {1}", LowWellFaultInputPin.ToString(), b ? "on" : "off"));
                CreateEvent(EventType.FaultEvent, string.Format("Low well fault {0}", b ? "detected" : "cleared"));
                if (b)
                {
                    dtFaultStartDate = DateTime.Now;
                    Log(string.Format("Initializing timeout at {0}", dtFaultStartDate.ToString()));
                    ChangeState(State.WaitForTimeout);
                }
                else
                {
                    ChangeState(State.Monitor);
                }
            }));

            connection.Add(OverloadFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("OverloadFaultInput {0}", b ? "on" : "off");
                bOverloadFaultState = b;
            }));

            //ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3);

            var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver;

            Mcp3008SpiConnection spi = new Mcp3008SpiConnection(
                driver.Out(adcClock),
                driver.Out(adcCs),
                driver.In(adcMiso),
                driver.Out(adcMosi));

            spiInput = spi.In(Mcp3008Channel.Channel0);

            connection.Open();
        }
Exemple #10
0
        static void Main(string[] args)
        {
            Console.WriteLine("GPIOTestHarness");
            bool Station1OutputState = false;
            bool Station2OutputState = false;
            bool Station3OutputState = false;
            bool Station4OutputState = false;

            //var Output1 = Station1OutputPin.Output();
            //var Output2 = Station2OutputPin.Output();
            //var Output3 = Station3OutputPin.Output();
            //var Output4 = Station4OutputPin.Output();
            var pins = new PinConfiguration[]
            {
                Station1OutputPin.Output().Name("Output1"),
                Station2OutputPin.Output().Name("Output2"),
                Station3OutputPin.Output().Name("Output3"),
                Station4OutputPin.Output().Name("Output4")
            };
            //var settings = new GpioConnectionSettings();
            var connection = new GpioConnection(pins);

            var Input1 = LowPressureFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("LowPressureFaultInput {0}", b ? "on" : "off");
                if (Station1OutputState != b)
                {
                    connection.Toggle("Output1"); Station1OutputState = b;
                }
            });

            connection.Add(Input1);
            var Input2 = HighPressureFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("HighPressureFaultInput {0}", b ? "on" : "off");
                if (Station2OutputState != b)
                {
                    connection.Toggle("Output2"); Station2OutputState = b;
                }
            });

            connection.Add(Input2);
            var Input3 = LowWellFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("LowWellFaultInput {0}", b ? "on" : "off");
                if (Station3OutputState != b)
                {
                    connection.Toggle("Output3"); Station3OutputState = b;
                }
            });

            connection.Add(Input3);
            var Input4 = OverloadFaultInputPin.Input().OnStatusChanged(b =>
            {
                Console.WriteLine("OverloadFaultInput {0}", b ? "on" : "off");
                if (Station4OutputState != b)
                {
                    connection.Toggle("Output4"); Station4OutputState = b;
                }
            });

            connection.Add(Input4);

            ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3);

            var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver;

            Mcp3008SpiConnection spi = new Mcp3008SpiConnection(
                driver.Out(adcClock),
                driver.Out(adcCs),
                driver.In(adcMiso),
                driver.Out(adcMosi));

            IInputAnalogPin inputPin = spi.In(Mcp3008Channel.Channel0);

            connection.Open();
            ElectricPotential volts = ElectricPotential.FromVolts(0);

            while (!Console.KeyAvailable)
            {
                var v = referenceVoltage * (double)inputPin.Read().Relative;
                if ((Math.Abs(v.Millivolts - volts.Millivolts) > 100))
                {
                    volts = ElectricPotential.FromMillivolts(v.Millivolts);
                    Console.WriteLine("Voltage ch0: {0}", volts.Millivolts.ToString());
                }
            }
            connection.Close();
        }