/// <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)); }
/// <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)); }
/// <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); }
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]); }
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); }
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] }); } } }
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; } }
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; } }
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); }
public void Update() { _pinValues = _driver.Read(_globalPins); }