Esempio n. 1
0
 public RoverRobotConfiguration(
     EncoderMotorPort leftMotorPort,
     EncoderMotorPort rightMotorPort,
     ServoMotorPort panMotorPort,
     ServoMotorPort tiltMotorPort,
     DigitalPort frontUltrasoundSensorPort,
     DigitalPort backUltrasoundSensorPort,
     DigitalPort frontRightLedPort,
     DigitalPort frontLeftLedPort,
     DigitalPort backRightLedPort,
     DigitalPort backLeftLedPort,
     AnaloguePort soundSensorPort,
     Color frontRightLedColor,
     Color frontLeftLedColor,
     Color backRightLedColor,
     Color backLeftLedColor)
 {
     LeftMotorPort             = leftMotorPort;
     RightMotorPort            = rightMotorPort;
     PanMotorPort              = panMotorPort;
     TiltMotorPort             = tiltMotorPort;
     FrontUltrasoundSensorPort = frontUltrasoundSensorPort;
     BackUltrasoundSensorPort  = backUltrasoundSensorPort;
     FrontRightLedPort         = frontRightLedPort;
     FrontLeftLedPort          = frontLeftLedPort;
     BackRightLedPort          = backRightLedPort;
     BackLeftLedPort           = backLeftLedPort;
     SoundSensorPort           = soundSensorPort;
     FrontRightLedColor        = frontRightLedColor;
     FrontLeftLedColor         = frontLeftLedColor;
     BackRightLedColor         = backRightLedColor;
     BackLeftLedColor          = backLeftLedColor;
 }
Esempio n. 2
0
 public Buzzer(DigitalPort port) : base(port)
 {
     _controller = new GpioController();
     AddToDisposables(_controller);
     (_buzzPin, _) = Port.ToPinPair();
     _controller.OpenPin(_buzzPin, PinMode.Output);
 }
Esempio n. 3
0
        public static (int pin1, int pin2) ToPinPair(this DigitalPort digitalPort)
        {
            switch (digitalPort)
            {
            case DigitalPort.D0:
                return(22, 23);

            case DigitalPort.D1:
                return(24, 25);

            case DigitalPort.D2:
                return(26, 27);

            case DigitalPort.D3:
                return(5, 6);

            case DigitalPort.D4:
                return(07, 08);

            case DigitalPort.D5:
                return(10, 11);

            case DigitalPort.D6:
                return(12, 13);

            case DigitalPort.D7:
                return(15, 16);

            default:
                throw new ArgumentOutOfRangeException(nameof(digitalPort), digitalPort, null);
            }
        }
Esempio n. 4
0
        public static Led GetOrCreateLed(this IFoundationPlate plate, DigitalPort port, Color displayColor)
        {
            var led   = plate.GetOrCreateDevice <Led>(port);
            var p     = displayColor.ToPixel <Argb32>();
            var alpha = p.A / 255.0;

            led.DisplayProperties.Add(new RgbaCssColor(p.R, p.G, p.B, alpha));
            return(led);
        }
 protected DigitalPortDeviceBase(DigitalPort port, IGpioControllerFactory controllerFactory)
 {
     if (controllerFactory == null)
     {
         throw new ArgumentNullException(nameof(controllerFactory));
     }
     DisplayProperties = new List <DisplayPropertyBase>();
     Port       = port;
     Controller = controllerFactory.GetOrCreateController();
 }
Esempio n. 6
0
        public UltrasonicSensor(DigitalPort port) : base(port)
        {
            (_echoPin, _triggerPin) = port.ToPinPair();
            _controller             = new GpioController(PinNumberingScheme.Logical);
            AddToDisposables(_controller);
            _controller.OpenPin(_echoPin, PinMode.Input);
            _controller.OpenPin(_triggerPin, PinMode.Output);
            _controller.Write(_triggerPin, PinValue.Low);

            _controller.Read(_echoPin);
        }
Esempio n. 7
0
        public Button(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
        {
            var(buttonPin, _) = Port.ToPinPair();
            var openPinAsDisposable = Controller.OpenPinAsDisposable(buttonPin, PinMode.Input);
            var registerCallbackForPinValueChangedEventAsDisposable = Controller.RegisterCallbackForPinValueChangedEventAsDisposable(buttonPin, PinEventTypes.Falling | PinEventTypes.Rising, Callback);

            AddToDisposables(registerCallbackForPinValueChangedEventAsDisposable);
            AddToDisposables(openPinAsDisposable);

            IsPressed = Controller.Read(buttonPin) == PinValue.Low;
        }
Esempio n. 8
0
        public static IEnumerable <DigitalPort> GetDigitalPortRange(this DigitalPort first, int count)
        {
            var current = first;

            yield return(current);

            for (int i = 0; i < (count - 1); i++)
            {
                current = current.NextDigitalPort();
                yield return(current);
            }
        }
Esempio n. 9
0
        public T GetOrCreateDigitalDevice <T>(DigitalPort port, Func <DigitalPort, T> factory) where T : DigitalPortDeviceBase
        {
            if (_digitalPortDevices.TryGetValue(port, out var digitalDevice) && digitalDevice is T requestedDevice)
            {
                return(requestedDevice);
            }

            var newDevice = factory(port);

            _disposables.Add(newDevice);
            _digitalPortDevices[port] = newDevice;
            return(newDevice);
        }
Esempio n. 10
0
        public Button(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
        {
            var(buttonPin, _) = Port.ToPinPair();

            AddToDisposables(Disposable.Create(() =>
            {
                Controller.UnregisterCallbackForPinValueChangedEvent(buttonPin, Callback);
            }));

            AddToDisposables(Controller.OpenPin(buttonPin, PinMode.Input));
            Controller.RegisterCallbackForPinValueChangedEvent(buttonPin, PinEventTypes.Falling | PinEventTypes.Rising, Callback);

            IsPressed = Controller.Read(buttonPin) == PinValue.Low;
        }
Esempio n. 11
0
        private static Task TestButton(DigitalPort buttonPort, DigitalPort[] ledPorts)
        {
            var cancellationSource = new CancellationTokenSource();
            var plate = new Plate();

            Task.Run(() =>
            {
                var button = plate.GetOrCreateDigitalDevice <Button>(buttonPort);

                foreach (var digitalPort in ledPorts)
                {
                    plate.GetOrCreateDigitalDevice <Led>(digitalPort);
                }

                AllLedOff(plate);
                var leds = plate.DigitalDevices.OfType <Led>().ToArray();

                var buttonStream = Observable
                                   .FromEventPattern <bool>(h => button.PressedChanged += h, h => button.PressedChanged -= h);
                var pos = -1;
                buttonStream
                .Where(e => e.EventArgs)
                .Select(_ =>
                {
                    var next = ((pos + 1) % leds.Length);
                    var pair = new { Prev = pos, Next = ((pos + 1) % leds.Length) };
                    pos      = next;
                    return(pair);
                })
                .Subscribe(p =>
                {
                    if (p.Prev >= 0)
                    {
                        leds[p.Prev].Off();
                    }
                    leds[p.Next].On();
                    PrintPlate(plate);
                });

                PrintPlate(plate);
                Console.WriteLine("press enter key to exit");
            }, cancellationSource.Token);

            return(Task.Run(() =>
            {
                Console.ReadLine();
                plate.Dispose();
                cancellationSource.Cancel(false);
            }, cancellationSource.Token));
        }
Esempio n. 12
0
        public Button(DigitalPort port) : base(port)
        {
            var(buttonPin, _) = Port.ToPinPair();
            var controller = new GpioController(PinNumberingScheme.Logical);

            AddToDisposables(Disposable.Create(() =>
            {
                controller.UnregisterCallbackForPinValueChangedEvent(buttonPin, Callback);
                controller.Dispose();
            }));

            controller.OpenPin(buttonPin, PinMode.Input);
            controller.RegisterCallbackForPinValueChangedEvent(buttonPin, PinEventTypes.Falling | PinEventTypes.Rising, Callback);

            IsPressed = controller.Read(buttonPin) == PinValue.Low;
        }
Esempio n. 13
0
        /// <summary>
        /// Convenience method to get the current soil moisture. For frequent reads, use
        /// StartUpdating() and StopUpdating().
        /// </summary>
        /// <param name="sampleCount">The number of sample readings to take.
        /// Must be greater than 0.</param>
        /// <param name="sampleInterval">The interval, in milliseconds, between
        /// sample readings.</param>
        /// <returns></returns>
        public float Read(int sampleCount = 10, int sampleInterval = 40)
        {
            DigitalPort.Write(GpioPinValue.High);
            //float voltage = await AnalogInputPort.Read(sampleCount, sampleInterval);
            float voltage = 0;

            // read the voltage
            for (int i = 0; i < sampleCount; i++)
            {
                var tmp = AnalogInputPort.ReadValue();
                voltage += tmp;
                Thread.Sleep(sampleInterval);
            }
            voltage /= sampleCount;
            DigitalPort.Write(GpioPinValue.Low);

            // convert and save to our temp property for later retrieval
            Moisture = VoltageToMoisture(voltage);
            return(Moisture);
        }
Esempio n. 14
0
        public T GetOrCreateDigitalDevice <T>(DigitalPort port) where T : DigitalPortDeviceBase
        {
            if (!_factories.TryGetValue(typeof(T), out var factory))
            {
                var ctor = typeof(T).GetConstructor(new[] { typeof(DigitalPort) });
                if (ctor != null)
                {
                    factory = (p) => Activator.CreateInstance(typeof(T), p);
                    _factories[typeof(T)] = factory;
                }
            }

            if (factory != null)
            {
                var newDevice = factory.Invoke(port) as T;
                _disposables.Add(newDevice);
                _digitalPortDevices[port] = newDevice;
                return(newDevice);
            }

            throw new InvalidOperationException();
        }
Esempio n. 15
0
        public static DigitalPort NextDigitalPort(this DigitalPort digitalPort, bool wrap = false)
        {
            switch (digitalPort)
            {
            case DigitalPort.D0:
                return(DigitalPort.D1);

            case DigitalPort.D1:
                return(DigitalPort.D2);

            case DigitalPort.D2:
                return(DigitalPort.D3);

            case DigitalPort.D3:
                return(DigitalPort.D4);

            case DigitalPort.D4:
                return(DigitalPort.D5);

            case DigitalPort.D5:
                return(DigitalPort.D6);

            case DigitalPort.D6:
                return(DigitalPort.D7);

            case DigitalPort.D7:
                if (!wrap)
                {
                    throw new InvalidOperationException("D7 is the last DigitalPort.");
                }
                return(DigitalPort.D1);

            default:
                throw new ArgumentOutOfRangeException(nameof(digitalPort), digitalPort, null);
            }
        }
Esempio n. 16
0
 public static Buzzer GetOrCreateBuzzer(this IFoundationPlate plate, DigitalPort port)
 {
     return(plate.GetOrCreateDevice <Buzzer>(port));
 }
 public T GetOrCreateDevice <T>(DigitalPort port) where T : DigitalPortDeviceBase
 {
     return(_foundationPlate.GetOrCreateDevice <T>(port));
 }
 public T GetOrCreateDevice <T>(DigitalPort port, Func <DigitalPort, IGpioControllerFactory, T> factory) where T : DigitalPortDeviceBase
 {
     return(_foundationPlate.GetOrCreateDevice(port, factory));
 }
 public T GetOrCreateDevice <T>(DigitalPort port, Func <DigitalPort, IGpioControllerFactory, T> factory) where T : DigitalPortDeviceBase
 {
     return(_digitalConnectedDeviceFactory.GetOrCreateDevice <T>(port, (p) => factory(p, PiTop4Board)));
 }
Esempio n. 20
0
 public Buzzer(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
 {
     (_buzzPin, _) = Port.ToPinPair();
     AddToDisposables(Controller.OpenPin(_buzzPin, PinMode.Output));
 }
Esempio n. 21
0
 protected DigitalPortDeviceBase(DigitalPort port)
 {
     DisplayProperties = new List <DisplayPropertyBase>();
     Port = port;
 }
Esempio n. 22
0
 public static UltrasonicSensor GetOrCreateUltrasonicSensor(this IFoundationPlate plate, DigitalPort port)
 {
     return(plate.GetOrCreateDevice <UltrasonicSensor>(port));
 }
Esempio n. 23
0
 public static Led GetOrCreateLed(this IFoundationPlate plate, DigitalPort port)
 {
     return(plate.GetOrCreateDevice <Led>(port));
 }
 public T GetOrCreateDevice <T>(DigitalPort port) where T : DigitalPortDeviceBase
 {
     return(_digitalConnectedDeviceFactory.GetOrCreateDevice <T>(port));
 }
Esempio n. 25
0
        private static Task TestSemaphore(DigitalPort ultrasonicSensorPort, DigitalPort greenLedPort, DigitalPort yellowLedPort, DigitalPort redLedPort, int greenThreshold, int yellowThreshold, int redThreshold)
        {
            var board = PiTop4Board.Instance;
            var plate = board.GetOrCreatePlate <FoundationPlate>();

            var cancellationSource = new CancellationTokenSource();
            var greenLed           = plate.GetOrCreateLed(greenLedPort, Color.Green);
            var yellowLed          = plate.GetOrCreateLed(yellowLedPort, Color.Yellow);
            var redLed             = plate.GetOrCreateLed(redLedPort, Color.Red);

            ClearLeds();
            Task.Run(() =>
            {
                var sensor = plate.GetOrCreateUltrasonicSensor(ultrasonicSensorPort);
                Observable
                .Interval(TimeSpan.FromSeconds(0.5))
                .Subscribe(_ =>
                {
                    var distance = sensor.Distance.Value;


                    switch (distance)
                    {
                    case { } x when x > greenThreshold:
                        greenLed.On();
                        yellowLed.Off();
                        redLed.Off();
                        break;

                    case { } x when x <greenThreshold && x> yellowThreshold:
                        greenLed.Off();
                        yellowLed.On();
                        redLed.Off();
                        break;

                    case { } x when x < redThreshold:
                        greenLed.Off();
                        yellowLed.Off();
                        redLed.On();
                        break;
                    }
                });

                Console.WriteLine("press enter key to exit");
            }, cancellationSource.Token);


            return(Task.Run(() =>
            {
                Console.ReadLine();
                board.Dispose();
                ClearLeds();
                cancellationSource.Cancel(false);
            }, cancellationSource.Token));

            void ClearLeds()
            {
                greenLed.Off();
                yellowLed.Off();
                redLed.Off();
            }
        }
Esempio n. 26
0
 public static extern StandardDriverStatusCode SetDigitalPortOff(
     short handle,
     DigitalPort port);
Esempio n. 27
0
        private static Task TestSemaphore(DigitalPort ultrasonicSensorPort, DigitalPort greenLedPort, DigitalPort yellowLedPort, DigitalPort redLedPort, int greenThreshold, int yellowThreshold, int redThreshold)
        {
            var module = new PiTopModule();
            var plate  = module.GetOrCreatePlate <FoundationPlate>();

            var cancellationSource = new CancellationTokenSource();
            var greenLed           = plate.GetOrCreateDevice <Led>(greenLedPort);

            greenLed.DisplayProperties.Add(new NamedCssColor("green"));
            var yellowLed = plate.GetOrCreateDevice <Led>(yellowLedPort);

            yellowLed.DisplayProperties.Add(new NamedCssColor("yellow"));
            var redLed = plate.GetOrCreateDevice <Led>(redLedPort);

            redLed.DisplayProperties.Add(new NamedCssColor("red"));
            ClearLeds();
            Task.Run(() =>
            {
                var sensor = plate.GetOrCreateDevice <UltrasonicSensor>(ultrasonicSensorPort);
                Observable
                .Interval(TimeSpan.FromSeconds(0.5))
                .Subscribe(_ =>
                {
                    var distance = sensor.Distance.Value;


                    switch (distance)
                    {
                    case { } x when x > greenThreshold:
                        greenLed.On();
                        yellowLed.Off();
                        redLed.Off();
                        break;

                    case { } x when x <greenThreshold && x> yellowThreshold:
                        greenLed.Off();
                        yellowLed.On();
                        redLed.Off();
                        break;

                    case { } x when x < redThreshold:
                        greenLed.Off();
                        yellowLed.Off();
                        redLed.On();
                        break;
                    }
                });

                Console.WriteLine("press enter key to exit");
            }, cancellationSource.Token);


            return(Task.Run(() =>
            {
                Console.ReadLine();
                module.Dispose();
                ClearLeds();
                cancellationSource.Cancel(false);
            }, cancellationSource.Token));

            void ClearLeds()
            {
                greenLed.Off();
                yellowLed.Off();
                redLed.Off();
            }
        }
Esempio n. 28
0
 public UltrasonicSensor(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
 {
     (_echoPin, _triggerPin) = port.ToPinPair();
 }
Esempio n. 29
0
 public Led(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
 {
     (_ledPin, _) = Port.ToPinPair();
 }
Esempio n. 30
0
 public static extern StandardDriverStatusCode SetDigitalPortOn(
     short handle,
     DigitalPort port,
     short[] logicTresholdLevels,
     short logicThresholdLevelLength,
     DigitalPortHysteresis hysteresis);