/// <summary> /// Constructor for a single GPIO pin. /// </summary> /// <param name="chip">Linux kernel GPIO chip number.</param> /// <param name="line">Linux kernel GPIO line number.</param> /// <param name="dir">Data direction.</param> /// <param name="state">Initial output state.</param> /// <param name="driver">Output driver setting</param> /// <param name="edge">Interrupt edge setting.</param> /// <param name="polarity">Polarity setting.</param> public Pin(uint chip, uint line, IO.Interfaces.GPIO.Direction dir, bool state = false, Driver driver = Driver.PushPull, Edge edge = Edge.None, Polarity polarity = Polarity.ActiveHigh) { // Validate the GPIO chip and line numbers if (chip == Unavailable.chip) { throw new System.Exception("GPIO chip number is invalid"); } if (line == Unavailable.line) { throw new System.Exception("GPIO line number is invalid"); } int flags; int events; int error; CalculateFlags(dir, driver, edge, polarity, out flags, out events, out this.kind); IO.Bindings.libsimpleio.libGPIO.GPIO_line_open((int)chip, (int)line, flags, events, state ? 1 : 0, out this.myfd, out error); if (error != 0) { throw new Exception("GPIO_line_open() failed", error); } }
/// <summary> /// Constructor for a single GPIO pin. /// </summary> /// <param name="pin">GPIO pin designator.</param> /// <param name="dir">Data direction.</param> /// <param name="state">Initial output state.</param> /// <param name="driver">Output driver setting</param> /// <param name="edge">Interrupt edge setting.</param> /// <param name="polarity">Polarity setting.</param> public Pin(Designator pin, IO.Interfaces.GPIO.Direction dir, bool state = false, Driver driver = Driver.PushPull, Edge edge = Edge.None, Polarity polarity = Polarity.ActiveHigh) { // Validate the GPIO pin designator if ((pin.chip == Unavailable.chip) || (pin.line == Unavailable.line)) { throw new Exception("GPIO pin designator is invalid"); } int flags; int events; int error; CalculateFlags(dir, driver, edge, polarity, out flags, out events, out this.kind); IO.Bindings.libsimpleio.libGPIO.GPIO_line_open((int)pin.chip, (int)pin.line, flags, events, state ? 1 : 0, out this.myfd, out error); if (error != 0) { throw new Exception("GPIO_line_open() failed", error); } }
/// <summary> /// Create a single MCP23017 GPIO pin. /// </summary> /// <param name="dev">MCP23017 device object.</param> /// <param name="channel">MCP23017 I/O channel number.</param> /// <param name="dir">GPIO pin data direction.</param> /// <param name="state">Initial GPIO output state.</param> public Pin(IO.Devices.MCP23017.Device dev, int channel, IO.Interfaces.GPIO.Direction dir, bool state = false) { // Validate parameters if ((channel < IO.Devices.MCP23017.Device.MinChannel) || (channel > IO.Devices.MCP23017.Device.MaxChannel)) { throw new System.Exception("Invalid channel number."); } mask = (uint)(1 << channel); if (dir == IO.Interfaces.GPIO.Direction.Output) { dev.Direction |= mask; } else { dev.Direction &= ~mask; } this.dev = dev; this.state = state; }
/// <summary> /// Constructor for a single GPIO pin. /// </summary> /// <param name="dev">PCA9534 (or similar) device.</param> /// <param name="num">GPIO pin number.</param> /// <param name="dir">Data direction.</param> /// <param name="state">Initial output state.</param> public Pin(PCA9534.Device dev, int num, IO.Interfaces.GPIO.Direction dir, bool state = false) { // Validate parameters if ((num < 0) || (num >= PCA9534.Device.MAX_PINS)) { throw new Exception("Invalid GPIO pin number parameter"); } this.dev = dev; this.mask = (byte)(1 << num); this.dir = dir; if (dir == IO.Interfaces.GPIO.Direction.Input) { this.dev.Write(PCA9534.Device.ConfigurationReg, (byte)(this.dev.Config | this.mask)); } else { this.dev.Write(PCA9534.Device.ConfigurationReg, (byte)(this.dev.Config & ~this.mask)); this.state = state; } }
/// <summary> /// Constructor for a single GPIO pin. /// </summary> /// <param name="desg">GPIO pin designator.</param> /// <param name="dir">Data direction.</param> /// <param name="state">Initial GPIO output state.</param> /// <param name="driver">Output driver setting.</param> /// <param name="edge">Interrupt edge setting.</param> /// <param name="polarity">Polarity setting.</param> public Pin(IO.Objects.libsimpleio.Device.Designator desg, IO.Interfaces.GPIO.Direction dir, bool state = false, Driver driver = Driver.PushPull, Edge edge = Edge.None, Polarity polarity = Polarity.ActiveHigh) { // Validate the GPIO pin designator if ((desg.chip == IO.Objects.libsimpleio.Device.Designator.Unavailable.chip) || (desg.chan == IO.Objects.libsimpleio.Device.Designator.Unavailable.chan)) { throw new Exception("Invalid designator"); } int flags; int events; int error; CalculateFlags(dir, driver, edge, polarity, out flags, out events, out this.kind); IO.Bindings.libsimpleio.GPIO_line_open((int)desg.chip, (int)desg.chan, flags, events, state ? 1 : 0, out this.myfd, out error); if (error != 0) { throw new Exception("GPIO_line_open() failed, " + errno.strerror(error)); } }
/// <summary> /// Create a remote GPIO pin. /// </summary> /// <param name="dev">Remote I/O device object.</param> /// <param name="num">GPIO pin number: 0 to 127.</param> /// <param name="dir">GPIO pin data direction: Input or Output.</param> /// <param name="state">GPIO pin initial output state: true or false. Ignored for input pins.</param> /// <remarks>Use <c>Device.GPIO_Create()</c> instead of this constructor.</remarks> public GPIO(Device dev, int num, IO.Interfaces.GPIO.Direction dir, bool state = false) { this.device = dev; this.num = num; // Validate parameters if ((num < 0) || (num >= Device.MAX_CHANNELS)) { throw new Exception("Invalid GPIO pin number"); } if ((dir < IO.Interfaces.GPIO.Direction.Input) || (dir > IO.Interfaces.GPIO.Direction.Output)) { throw new Exception("Invalid GPIO pin direction"); } int bytenum = num / 8; byte bitmask = (byte)(1 << (7 - num % 8)); Message cmd = new Message(0); Message resp = new Message(); cmd.payload[0] = (byte)MessageTypes.GPIO_CONFIGURE_REQUEST; cmd.payload[2 + bytenum] |= bitmask; if (dir == IO.Interfaces.GPIO.Direction.Output) { cmd.payload[18 + bytenum] |= bitmask; } device.Dispatcher(cmd, resp); cmd = new Message(0); cmd.payload[0] = (byte)MessageTypes.GPIO_WRITE_REQUEST; cmd.payload[2 + bytenum] |= bitmask; if (state == true) { cmd.payload[18 + bytenum] |= bitmask; } device.Dispatcher(cmd, resp); }
/// <summary> /// Create an AD5593R GPIO pin. /// </summary> /// <param name="dev">AD5593R device object.</param> /// <param name="channel">AD5593R I/O channel number (0 to 7).</param> /// <param name="dir">GPIO pin data direction.</param> /// <param name="state">Initial GPIO output state.</param> public Pin(IO.Devices.AD5593R.Device dev, int channel, IO.Interfaces.GPIO.Direction dir, bool state = false) { this.dev = dev; mask = (byte)(1 << channel); notmask = (byte)~mask; // Configure the AD5593 I/O channel if (dir == IO.Interfaces.GPIO.Direction.Input) { dev.ConfigureChannel(channel, PinMode.GPIO_Input); isinput = true; } else { dev.ConfigureChannel(channel, PinMode.GPIO_Output); isinput = false; this.state = state; } }
/// <summary> /// Constructor for a single GPIO pin. /// </summary> /// <param name="dev">PCA8574 (or similar) device.</param> /// <param name="num">GPIO pin number.</param> /// <param name="dir">Data direction.</param> /// <param name="state">Initial output state.</param> public Pin(PCA8574.Device dev, int num, IO.Interfaces.GPIO.Direction dir, bool state = false) { // Validate parameters if ((num < 0) || (num >= PCA8574.Device.MAX_PINS)) { throw new System.Exception("Invalid GPIO pin number parameter"); } this.dev = dev; this.mask = (byte)(1 << num); this.dir = dir; if (dir == IO.Interfaces.GPIO.Direction.Input) { this.state = true; } else { this.state = state; } }
/// <summary> /// Create an MCP23017 GPIO pin object. /// </summary> /// <param name="channel">MCP23017 channel number (0 to 15).</param> /// <param name="dir">GPIO pin data direction.</param> /// <param name="state">Initial GPIO output state.</param> /// <returns>GPIO pin object.</returns> public IO.Interfaces.GPIO.Pin GPIO_Create(int channel, IO.Interfaces.GPIO.Direction dir, bool state = false) { return(new IO.Devices.MCP23017.GPIO.Pin(this, channel, dir, state)); }
private void CalculateFlags(IO.Interfaces.GPIO.Direction dir, Driver driver, Edge edge, Polarity polarity, out int flags, out int events, out Kinds kind) { flags = 0; events = 0; kind = Kinds.Input; // Validate parameters if ((dir < IO.Interfaces.GPIO.Direction.Input) || (dir > IO.Interfaces.GPIO.Direction.Output)) { throw new Exception("Invalid direction parameter"); } if ((driver < Driver.PushPull) || (driver > Driver.OpenSource)) { throw new Exception("Invalid driver parameter"); } if ((edge < Edge.None) || (edge > Edge.Both)) { throw new Exception("Invalid edge parameter"); } if ((polarity < Polarity.ActiveLow) || (polarity > Polarity.ActiveHigh)) { throw new Exception("Invalid polarity parameter"); } // Set flags for the GPIO pin data direction switch (dir) { case IO.Interfaces.GPIO.Direction.Input: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_INPUT; break; case IO.Interfaces.GPIO.Direction.Output: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_OUTPUT; break; } // Set flags for the GPIO pin output driver switch (driver) { case Driver.PushPull: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_PUSH_PULL; break; case Driver.OpenDrain: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_OPEN_DRAIN; break; case Driver.OpenSource: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_OPEN_SOURCE; break; } // Set flags for the GPIO pin polarity switch (polarity) { case Polarity.ActiveLow: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_ACTIVE_LOW; break; case Polarity.ActiveHigh: flags |= IO.Bindings.libsimpleio.libGPIO.LINE_REQUEST_ACTIVE_HIGH; break; } // Set flags for the GPIO pin input interrupt trigger edge(s) switch (edge) { case Edge.None: events |= IO.Bindings.libsimpleio.libGPIO.EVENT_REQUEST_NONE; break; case Edge.Rising: events |= IO.Bindings.libsimpleio.libGPIO.EVENT_REQUEST_RISING; break; case Edge.Falling: events |= IO.Bindings.libsimpleio.libGPIO.EVENT_REQUEST_FALLING; break; case Edge.Both: events |= IO.Bindings.libsimpleio.libGPIO.EVENT_REQUEST_BOTH; break; } if (dir == Interfaces.GPIO.Direction.Output) { kind = Kinds.Output; } else if (edge != Edge.None) { kind = Kinds.Interrupt; } else { kind = Kinds.Input; } }
/// <summary> /// Factory function for creating GPIO pins. /// </summary> /// <param name="channel">MCP23017 channel number (0 to 15).</param> /// <param name="dir">GPIO pin direction.</param> /// <param name="state">Initial GPIO output state.</param> /// <returns>GPIO pin object.</returns> public IO.Interfaces.GPIO.Pin GPIO(int channel, IO.Interfaces.GPIO.Direction dir, bool state = false) { return(mydev.GPIO_Create(channel, dir, state)); }
/// <summary> /// Create a remote GPIO pin object. /// </summary> /// <param name="num">GPIO pin number: 0 to 127.</param> /// <param name="dir">GPIO pin data direction: Input or Output.</param> /// <param name="state">GPIO pin initial output state: true or false. Ignored for input pins.</param> /// <returns>GPIO pin object.</returns> public GPIO GPIO_Create(int num, IO.Interfaces.GPIO.Direction dir, bool state = false) { return(new GPIO(this, num, dir, state)); }