/// <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);
            }
        }
Exemple #3
0
        /// <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;
            }
        }
Exemple #5
0
        /// <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);
        }
Exemple #7
0
        /// <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;
            }
        }
Exemple #9
0
 /// <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;
            }
        }
Exemple #11
0
 /// <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));
 }