Пример #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;
 }
Пример #2
0
 public Buzzer(DigitalPort port) : base(port)
 {
     _controller = new GpioController();
     AddToDisposables(_controller);
     (_buzzPin, _) = Port.ToPinPair();
     _controller.OpenPin(_buzzPin, PinMode.Output);
 }
Пример #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);
            }
        }
Пример #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();
 }
Пример #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);
        }
Пример #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;
        }
Пример #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);
            }
        }
Пример #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);
        }
Пример #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;
        }
Пример #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));
        }
Пример #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;
        }
Пример #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);
        }
Пример #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();
        }
Пример #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);
            }
        }
Пример #16
0
 public static Buzzer GetOrCreateBuzzer(this IFoundationPlate plate, DigitalPort port)
 {
     return(plate.GetOrCreateDevice <Buzzer>(port));
 }
Пример #17
0
 public T GetOrCreateDevice <T>(DigitalPort port) where T : DigitalPortDeviceBase
 {
     return(_foundationPlate.GetOrCreateDevice <T>(port));
 }
Пример #18
0
 public T GetOrCreateDevice <T>(DigitalPort port, Func <DigitalPort, IGpioControllerFactory, T> factory) where T : DigitalPortDeviceBase
 {
     return(_foundationPlate.GetOrCreateDevice(port, factory));
 }
Пример #19
0
 public T GetOrCreateDevice <T>(DigitalPort port, Func <DigitalPort, IGpioControllerFactory, T> factory) where T : DigitalPortDeviceBase
 {
     return(_digitalConnectedDeviceFactory.GetOrCreateDevice <T>(port, (p) => factory(p, PiTop4Board)));
 }
Пример #20
0
 public Buzzer(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
 {
     (_buzzPin, _) = Port.ToPinPair();
     AddToDisposables(Controller.OpenPin(_buzzPin, PinMode.Output));
 }
Пример #21
0
 protected DigitalPortDeviceBase(DigitalPort port)
 {
     DisplayProperties = new List <DisplayPropertyBase>();
     Port = port;
 }
Пример #22
0
 public static UltrasonicSensor GetOrCreateUltrasonicSensor(this IFoundationPlate plate, DigitalPort port)
 {
     return(plate.GetOrCreateDevice <UltrasonicSensor>(port));
 }
Пример #23
0
 public static Led GetOrCreateLed(this IFoundationPlate plate, DigitalPort port)
 {
     return(plate.GetOrCreateDevice <Led>(port));
 }
Пример #24
0
 public T GetOrCreateDevice <T>(DigitalPort port) where T : DigitalPortDeviceBase
 {
     return(_digitalConnectedDeviceFactory.GetOrCreateDevice <T>(port));
 }
Пример #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();
            }
        }
Пример #26
0
 public static extern StandardDriverStatusCode SetDigitalPortOff(
     short handle,
     DigitalPort port);
Пример #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();
            }
        }
Пример #28
0
 public UltrasonicSensor(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
 {
     (_echoPin, _triggerPin) = port.ToPinPair();
 }
Пример #29
0
 public Led(DigitalPort port, IGpioControllerFactory controllerFactory) : base(port, controllerFactory)
 {
     (_ledPin, _) = Port.ToPinPair();
 }
Пример #30
0
 public static extern StandardDriverStatusCode SetDigitalPortOn(
     short handle,
     DigitalPort port,
     short[] logicTresholdLevels,
     short logicThresholdLevelLength,
     DigitalPortHysteresis hysteresis);