Beispiel #1
0
        /// <summary>
        /// Reads the status of the specified pins.
        /// </summary>
        /// <param name="pins">The pins.</param>
        /// <returns>
        /// The pins status.
        /// </returns>
        public ProcessorPins Read(ProcessorPins pins)
        {
            var pinGroupAddress = this.gpioAddress + (int)(Interop.Bcm2835Gplev0 + (0U * 4));
            var value           = SafeReadUInt32(pinGroupAddress);

            return((ProcessorPins)((uint)pins & value));
        }
Beispiel #2
0
 /// <summary>
 /// Enumerates the specified pins.
 /// </summary>
 /// <param name="pins">The pins.</param>
 /// <returns>The pins.</returns>
 public static IEnumerable <ProcessorPin> Enumerate(this ProcessorPins pins)
 {
     return(((Enum.GetValues(typeof(ProcessorPin)) as ProcessorPin[]) ?? new ProcessorPin[0])
            .Distinct()
            .Where(p => (pins & (ProcessorPins)((uint)1 << (int)p)) != ProcessorPins.None)
            .ToArray());
 }
        /// <summary>
        /// Reads the status of the specified pins.
        /// </summary>
        /// <param name="pins">The pins.</param>
        /// <returns>
        /// The pins status.
        /// </returns>
        public ProcessorPins Read(ProcessorPins pins)
        {
            var pinGroupAddress = gpioAddress + (int)(Interop.BCM2835_GPLEV0 + (uint)0 * 4);
            var value           = SafeReadUInt32(pinGroupAddress);

            return((ProcessorPins)((uint)pins & value));
        }
Beispiel #4
0
 /// <summary>
 /// Reads the status of the specified pins.
 /// </summary>
 /// <param name="pins">The pins.</param>
 /// <returns>
 /// The pins status.
 /// </returns>
 public ProcessorPins Read(ProcessorPins pins)
 {
     return(pins.Enumerate()
            .Select(p => this.Read(p) ? (ProcessorPins)(1U << (int)p) : ProcessorPins.None)
            .Aggregate(
                ProcessorPins.None,
                (a, p) => a | p));
 }
 /// <summary>
 /// Reads the status of the specified pins.
 /// </summary>
 /// <param name="pins">The pins.</param>
 /// <returns>
 /// The pins status.
 /// </returns>
 public ProcessorPins Read(ProcessorPins pins)
 {
     return pins.Enumerate()
         .Select(p => Read(p) ? (ProcessorPins) ((uint) 1 << (int) p) : ProcessorPins.None)
         .Aggregate(
             ProcessorPins.None,
             (a, p) => a | p);
 }
Beispiel #6
0
        public void enumerateTest()
        {
            var pins1 = new ProcessorPins();

            pins1.Set(0, true);
            var pins = pins1.Enumerate();

            Assert.AreEqual(1, pins.Count());
            Assert.AreEqual(0, pins.ToArray()[0]);
        }
Beispiel #7
0
        public void compareNETest()
        {
            var pins1 = new ProcessorPins();
            var pins2 = new ProcessorPins();

            pins2.Set(0, true);
            Assert.AreNotEqual(pins1, pins2);
            pins1.Set(1, true);
            Assert.AreNotEqual(pins1, pins2);
        }
Beispiel #8
0
        private void Allocate(PinConfiguration configuration)
        {
            if (configuration.StatusChangedAction != null)
            {
                var handler = new EventHandler <PinStatusEventArgs>((sender, args) =>
                {
                    if (args.Configuration == configuration)
                    {
                        configuration.StatusChangedAction(args.Enabled);
                    }
                });
                pinEvents[configuration.Pin] = handler;
                PinStatusChanged            += handler;
            }

            Driver.Allocate(configuration.Pin, configuration.Direction);
            var outputConfiguration = configuration as OutputPinConfiguration;

            if (outputConfiguration != null)
            {
                this[configuration.Pin] = outputConfiguration.Enabled;
            }
            else
            {
                var inputConfiguration = (InputPinConfiguration)configuration;
                var pinValue           = Driver.Read(inputConfiguration.Pin);

                var pin = (ProcessorPins)((ulong)1 << (int)inputConfiguration.Pin);
                inputPins = inputPins | pin;
                Console.WriteLine(pin);
                Console.WriteLine(inputPins);
                pinRawValues = Driver.Read(inputPins);

                if (inputConfiguration.Resistor != PinResistor.None && (Driver.GetCapabilities() & GpioConnectionDriverCapabilities.CanSetPinResistor) > 0)
                {
                    Driver.SetPinResistor(inputConfiguration.Pin, inputConfiguration.Resistor);
                }

                var switchConfiguration = inputConfiguration as SwitchInputPinConfiguration;
                if (switchConfiguration != null)
                {
                    pinValues[inputConfiguration.Pin] = switchConfiguration.Enabled;
                    OnPinStatusChanged(new PinStatusEventArgs {
                        Configuration = inputConfiguration, Enabled = pinValues[inputConfiguration.Pin]
                    });
                }
                else
                {
                    pinValues[inputConfiguration.Pin] = inputConfiguration.GetEffective(pinValue);
                    OnPinStatusChanged(new PinStatusEventArgs {
                        Configuration = inputConfiguration, Enabled = pinValues[inputConfiguration.Pin]
                    });
                }
            }
        }
Beispiel #9
0
        private void CheckInputPins()
        {
            var newPinValues = Driver.Read(inputPins);

            var changes = newPinValues ^ pinRawValues;

            if (changes == ProcessorPins.None)
            {
                return;
            }

            var notifiedConfigurations = new List <PinConfiguration>();

            foreach (var np in changes.Enumerate())
            {
                var processorPin = (ProcessorPins)((uint)1 << (int)np);
                var oldPinValue  = (pinRawValues & processorPin) != ProcessorPins.None;
                var newPinValue  = (newPinValues & processorPin) != ProcessorPins.None;

                if (oldPinValue != newPinValue)
                {
                    var pin       = (InputPinConfiguration)pinConfigurations[np];
                    var switchPin = pin as SwitchInputPinConfiguration;

                    if (switchPin != null)
                    {
                        if (pin.GetEffective(newPinValue))
                        {
                            pinValues[np] = !pinValues[np];
                            notifiedConfigurations.Add(pin);
                        }
                    }
                    else
                    {
                        pinValues[np] = pin.GetEffective(newPinValue);
                        notifiedConfigurations.Add(pin);
                    }
                }
            }

            pinRawValues = newPinValues;

            // Only fires events once all states have been modified.
            foreach (var pin in notifiedConfigurations)
            {
                OnPinStatusChanged(new PinStatusEventArgs {
                    Configuration = pin, Enabled = pinValues[pin.Pin]
                });
            }
        }
        /// <summary>
        /// Clears pin attached to this connection.
        /// </summary>
        public void Clear()
        {
            lock (pinConfigurations)
            {
                foreach (var pinConfiguration in pinConfigurations.Values)
                {
                    Release(pinConfiguration);
                }

                pinConfigurations.Clear();
                namedPins.Clear();
                pinValues.Clear();

                pinRawValues = ProcessorPins.None;
                inputPins    = ProcessorPins.None;
            }
        }
Beispiel #11
0
        public void diffTest()
        {
            var pins1 = new ProcessorPins();

            pins1.Set(2, true);
            pins1.Set(7, true);

            var pins2 = new ProcessorPins();

            pins2.Set(2, true);

            var pins = pins2.Diff(pins1);

            Assert.AreEqual(pins1.Count, pins.Count);
            Assert.AreEqual(true, pins.Get(7));
            Assert.AreEqual(false, pins.Get(2));
        }
        /// <summary>
        /// Reads the status of the specified pins.
        /// </summary>
        /// <param name="pins">The pins.</param>
        /// <returns>
        /// The pins status.
        /// </returns>
        public ProcessorPins Read(ProcessorPins pins)
        {
            IntPtr pinGroupAddress;

            if ((ulong)pins <= ((ulong)1 << 31))
            {
                pinGroupAddress = gpioAddress + (int)(OP.BCM2835_GPLEV0);
                uint value = SafeReadUInt32(pinGroupAddress);
                //Console.WriteLine($"Reading GPLEV0 status pis:{(uint)pins} pinGroupAddress:{pinGroupAddress.ToString("X8")} value:{value} pin:{(ProcessorPins)((ulong)pins & value)}");
                return((ProcessorPins)((uint)pins & value));
            }
            else
            {
                ulong pins2 = (ulong)pins >> 32;
                pinGroupAddress = gpioAddress + (int)(OP.BCM2835_GPLEV1);
                uint value = SafeReadUInt32(pinGroupAddress);
                //Console.WriteLine($"Reading GPLEV1 status pis:{(ulong)pins} pinGroupAddress:{pinGroupAddress.ToString("X8")} value:{value} pin:{(ProcessorPins)(((ulong)pins2 & value) << 32)}");
                return((ProcessorPins)(((ulong)pins2 & value) << 32));
            }
        }
        /// <summary>
        /// Removes the specified pin.
        /// </summary>
        /// <param name="configuration">The pin configuration.</param>
        public void Remove(PinConfiguration configuration)
        {
            lock (pinConfigurations)
            {
                lock (timer)
                {
                    if (IsOpened)
                    {
                        Release(configuration);
                    }
                }

                pinConfigurations.Remove(configuration.Pin);
                if (!string.IsNullOrEmpty(configuration.Name))
                {
                    namedPins.Remove(configuration.Name);
                }
                pinValues.Remove(configuration.Pin);

                var pin = (ProcessorPins)((uint)1 << (int)configuration.Pin);
                inputPins    &= ~pin;
                pinRawValues &= ~pin;
            }
        }
        private void Allocate(PinConfiguration configuration)
        {
            if (configuration.StatusChangedAction != null)
            {
                var handler = new EventHandler<PinStatusEventArgs>((sender, args) =>
                                                                       {
                                                                           if (args.Configuration == configuration)
                                                                               configuration.StatusChangedAction(args.Enabled);
                                                                       });
                pinEvents[configuration.Pin] = handler;
                PinStatusChanged += handler;
            }

            Driver.Allocate(configuration.Pin, configuration.Direction);
            var outputConfiguration = configuration as OutputPinConfiguration;
            if (outputConfiguration != null)
                this[configuration.Pin] = outputConfiguration.Enabled;
            else
            {
                var inputConfiguration = (InputPinConfiguration) configuration;
                var pinValue = Driver.Read(inputConfiguration.Pin);

                var pin = (ProcessorPins)((uint)1 << (int)inputConfiguration.Pin);
                inputPins = inputPins | pin;
                pinRawValues = Driver.Read(inputPins);

                if (inputConfiguration.Resistor != PinResistor.None)
                    Driver.SetPinResistor(inputConfiguration.Pin, inputConfiguration.Resistor);

                var switchConfiguration = inputConfiguration as SwitchInputPinConfiguration;
                if (switchConfiguration != null)
                {
                    pinValues[inputConfiguration.Pin] = switchConfiguration.Enabled;
                    OnPinStatusChanged(new PinStatusEventArgs { Configuration = inputConfiguration, Enabled = pinValues[inputConfiguration.Pin] });
                }
                else
                {
                    pinValues[inputConfiguration.Pin] = inputConfiguration.GetEffective(pinValue);
                    OnPinStatusChanged(new PinStatusEventArgs { Configuration = inputConfiguration, Enabled = pinValues[inputConfiguration.Pin] });
                }
            }
        }
        /// <summary>
        /// Removes the specified pin.
        /// </summary>
        /// <param name="configuration">The pin configuration.</param>
        public void Remove(PinConfiguration configuration)
        {
            lock (pinConfigurations)
            {
                lock (timer)
                {
                    if (IsOpened)
                        Release(configuration);
                }

                pinConfigurations.Remove(configuration.Pin);
                if (!string.IsNullOrEmpty(configuration.Name))
                    namedPins.Remove(configuration.Name);
                pinValues.Remove(configuration.Pin);

                var pin = (ProcessorPins)((uint)1 << (int)configuration.Pin);
                inputPins = inputPins & ~pin;
                pinRawValues = pinRawValues & ~pin;
            }
        }
        /// <summary>
        /// Clears pin attached to this connection.
        /// </summary>
        public void Clear()
        {
            lock (pinConfigurations)
            {
                foreach (var pinConfiguration in pinConfigurations.Values)
                    Release(pinConfiguration);

                pinConfigurations.Clear();
                namedPins.Clear();
                pinValues.Clear();

                pinRawValues = ProcessorPins.None;
                inputPins = ProcessorPins.None;
            }
        }
Beispiel #17
0
    public GpioHal(IList<Pin> pins, string driverName = "", bool useProcessorPinsNames = false, PinResistor inputResistor = PinResistor.PullUp)
    {
      _inUse = false;
      _driver = GetDriver(driverName);  // GPIO driver
      _inputResistor = inputResistor;   // Pullup/pulldown input resistors
      _pins = new Dictionary<string, ProcessorPin>(); // Global pins

      foreach (var pin in pins)
      {
        ProcessorPin procPin;

        if (useProcessorPinsNames)
        {
          ConnectorPin userPin;

          if (!Enum.TryParse(pin.Source, true, out userPin))
          {
            throw new HardwareException(string.Format("raspberry connector pin {0} not found", pin.Source));
          }

          procPin = userPin.ToProcessor();
        }
        else
        {
          if (!Enum.TryParse(pin.Source, true, out procPin))
          {
            throw new HardwareException(string.Format("raspberry processor pin {0} not found", pin.Source));
          }
        }

        switch (pin.Type)
        {
          case PinTypes.Input:
          case PinTypes.Counter:
          case PinTypes.Analog:

            //Allocate pin
            _driver.Allocate(procPin, PinDirection.Input);

            //Set pullup/pulldown resistor
            if (_inputResistor != PinResistor.None && (_driver.GetCapabilities() & GpioConnectionDriverCapabilities.CanSetPinResistor) > 0)
              _driver.SetPinResistor(procPin, _inputResistor);

            break;
          case PinTypes.Output:
          case PinTypes.Pwm:
            //Allocate output pin
            _driver.Allocate(procPin, PinDirection.Output);
            break;
        }

        //set input pins in global input pins
        _globalPins |= (ProcessorPins)((uint)1 << (int)procPin);

        //Add proessor pin
        _pins.Add(pin.Source, procPin);

      }
      Info = new HardwareInfo
      {
        Name = "Raspberry model " + Raspberry.Board.Current.Model + "GPIO HAL",
        Inputs = GpioConnectionSettings.ConnectorPinout == Raspberry.ConnectorPinout.Rev2 ? 26 : 17,
        Outputs = GpioConnectionSettings.ConnectorPinout == Raspberry.ConnectorPinout.Rev2 ? 26 : 17,
        Analogs = 0,
        Pwms = 0,
        Counters = 0,
        Vendor = "Raspberry foundation"
      };
    }
 /// <summary>
 /// Reads the status of the specified pins.
 /// </summary>
 /// <param name="pins">The pins.</param>
 /// <returns>
 /// The pins status.
 /// </returns>
 public ProcessorPins Read(ProcessorPins pins)
 {
     var value = Interop.bcm2835_gpioperi_read(0);
     return (ProcessorPins)((uint)pins & value);
 }
        private void CheckInputPins()
        {
            var newPinValues = Driver.Read(inputPins);
            
            var changes = newPinValues ^ pinRawValues;
            if (changes == ProcessorPins.None)
                return;

            var notifiedConfigurations = new List<PinConfiguration>();
            foreach (var np in changes.Enumerate())
            {
                var processorPin = (ProcessorPins) ((uint) 1 << (int) np);
                var oldPinValue = (pinRawValues & processorPin) != ProcessorPins.None;
                var newPinValue = (newPinValues & processorPin) != ProcessorPins.None;

                if (oldPinValue != newPinValue)
                {
                    var pin = (InputPinConfiguration) pinConfigurations[np];
                    var switchPin = pin as SwitchInputPinConfiguration;

                    if (switchPin != null)
                    {
                        if (pin.GetEffective(newPinValue))
                        {
                            pinValues[np] = !pinValues[np];
                            notifiedConfigurations.Add(pin);
                        }
                    }
                    else
                    {
                        pinValues[np] = pin.GetEffective(newPinValue);
                        notifiedConfigurations.Add(pin);
                    }
                }
            }

            pinRawValues = newPinValues;

            // Only fires events once all states have been modified.
            foreach (var pin in notifiedConfigurations)
                OnPinStatusChanged(new PinStatusEventArgs {Configuration = pin, Enabled = pinValues[pin.Pin]});
        }
        /// <summary>
        /// Reads the status of the specified pins.
        /// </summary>
        /// <param name="pins">The pins.</param>
        /// <returns>
        /// The pins status.
        /// </returns>
        public ProcessorPins Read(ProcessorPins pins)
        {
            var pinGroupAddress = gpioAddress + (int)(Interop.BCM2835_GPLEV0 + (uint)0 * 4);
            var value = SafeReadUInt32(pinGroupAddress);

            return (ProcessorPins)((uint)pins & value);
        }
Beispiel #21
0
 public void Update()
 {
   _pinValues = _driver.Read(_globalPins);
 }