Beispiel #1
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));
            }
        }
Beispiel #2
0
        /// <summary>
        /// Constructor for a single SPI device.
        /// </summary>
        /// <param name="desg">SPI device designator.</param>
        /// <param name="mode">SPI clock mode.</param>
        /// <param name="wordsize">SPI transfer word size.</param>
        /// <param name="speed">SPI transfer speed.</param>
        /// <param name="cspin">SPI slave select GPIO pin number, or
        /// <c>AUTOCHIPSELECT</c>.</param>
        public Device(IO.Objects.libsimpleio.Device.Designator desg, int mode,
                      int wordsize, int speed,
                      IO.Objects.libsimpleio.GPIO.Pin cspin = AUTOCHIPSELECT)
        {
            // Validate the I2C bus 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");
            }

            System.String devname = System.String.Format("/dev/spidev{0}.{1}",
                                                         desg.chip, desg.chan);

            IO.Bindings.libsimpleio.SPI_open(devname, mode, wordsize,
                                             speed, out this.myfd, out int error);

            if (error != 0)
            {
                throw new Exception("SPI_open() failed, " +
                                    errno.strerror(error));
            }

            if (cspin == AUTOCHIPSELECT)
            {
                this.myfdcs = IO.Bindings.libsimpleio.SPI_AUTO_CS;
            }
            else
            {
                this.myfdcs = cspin.fd;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Constructor for a single DAC output.
        /// </summary>
        /// <param name="desg">DAC output designator.</param>
        /// <param name="resolution">Bits of resolution.</param>
        /// <param name="sample">Initial DAC output sample.</param>
        public Sample(IO.Objects.libsimpleio.Device.Designator desg,
                      int resolution, int sample = 0)
        {
            int error;

            // Validate the DAC output 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");
            }

            IO.Bindings.libsimpleio.DAC_open((int)desg.chip, (int)desg.chan,
                                             out this.myfd, out error);

            if (error != 0)
            {
                throw new Exception("DAC_open() failed, " +
                                    errno.strerror(error));
            }

            this.nbits  = resolution;
            this.sample = sample;
        }
Beispiel #4
0
        /// <summary>
        /// Constructor for a single PWM output.
        /// </summary>
        /// <param name="desg">PWM output designator.</param>
        /// <param name="frequency">PWM pulse frequency.</param>
        /// <param name="dutycycle">Initial PWM output duty cycle.
        /// Allowed values are 0.0 to 100.0 percent.</param>
        /// <param name="polarity">PWM output polarity.</param>
        public Output(IO.Objects.libsimpleio.Device.Designator desg,
                      int frequency, double dutycycle = IO.Interfaces.PWM.DutyCycles.Minimum,
                      int polarity = IO.Bindings.libsimpleio.PWM_POLARITY_ACTIVEHIGH)
        {
            // Validate the PWM output 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");
            }

            // Validate other parameters

            if (frequency < 1)
            {
                throw new Exception("Invalid frequency");
            }

            if ((dutycycle < IO.Interfaces.PWM.DutyCycles.Minimum) ||
                (dutycycle > IO.Interfaces.PWM.DutyCycles.Maximum))
            {
                throw new Exception("Invalid duty cycle");
            }

            if ((polarity < IO.Bindings.libsimpleio.PWM_POLARITY_ACTIVELOW) ||
                (polarity > IO.Bindings.libsimpleio.PWM_POLARITY_ACTIVEHIGH))
            {
                throw new Exception("Invalid polarity");
            }

            this.period = (int)(1.0E9 / frequency);
            int ontime = (int)(dutycycle / IO.Interfaces.PWM.DutyCycles.Maximum * this.period);
            int error;

            IO.Bindings.libsimpleio.PWM_configure((int)desg.chip,
                                                  (int)desg.chan, period, ontime, (int)polarity, out error);

            if (error != 0)
            {
                throw new Exception("PWM_configure() failed, " +
                                    errno.strerror(error));
            }

            IO.Bindings.libsimpleio.PWM_open((int)desg.chip,
                                             (int)desg.chan, out this.myfd, out error);

            if (error != 0)
            {
                throw new Exception("PWM_open() failed, " +
                                    errno.strerror(error));
            }
        }
Beispiel #5
0
        /// <summary>
        /// Constructor for a single servo output.
        /// </summary>
        /// <param name="desg">PWM output designator.</param>
        /// <param name="frequency">PWM pulse frequency.</param>
        /// <param name="position">Initial servo position.</param>
        public Output(IO.Objects.libsimpleio.Device.Designator desg, int frequency = 50,
                      double position = IO.Interfaces.Servo.Positions.Neutral)
        {
            // Validate the PWM output 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");
            }

            // Validate other parameters


            if ((frequency < 1) || (frequency > 400))
            {
                throw new Exception("Invalid frequency");
            }

            if ((position < IO.Interfaces.Servo.Positions.Minimum) ||
                (position > IO.Interfaces.Servo.Positions.Maximum))
            {
                throw new Exception("Invalid position");
            }

            int period = (int)(1E9 / frequency + 0.5);
            int ontime = (int)(1500000.0 + 500000.0 * position);
            int error;

            IO.Bindings.libsimpleio.PWM_configure((int)desg.chip,
                                                  (int)desg.chan, period, ontime,
                                                  IO.Bindings.libsimpleio.PWM_POLARITY_ACTIVEHIGH, out error);

            if (error != 0)
            {
                throw new Exception("PWM_configure() failed, " +
                                    errno.strerror(error));
            }

            IO.Bindings.libsimpleio.PWM_open((int)desg.chip,
                                             (int)desg.chan, out this.myfd, out error);

            if (error != 0)
            {
                throw new Exception("PWM_open() failed, " +
                                    errno.strerror(error));
            }
        }
Beispiel #6
0
 public SocketEntry(
     Shield.Kinds shield,
     int num,
     bool ShareI2C,
     // mikroBUS GPIO pins
     IO.Objects.libsimpleio.Device.Designator AN,
     IO.Objects.libsimpleio.Device.Designator RST,
     IO.Objects.libsimpleio.Device.Designator CS,
     IO.Objects.libsimpleio.Device.Designator SCK,
     IO.Objects.libsimpleio.Device.Designator MISO,
     IO.Objects.libsimpleio.Device.Designator MOSI,
     IO.Objects.libsimpleio.Device.Designator SDA,
     IO.Objects.libsimpleio.Device.Designator SCL,
     IO.Objects.libsimpleio.Device.Designator TX,
     IO.Objects.libsimpleio.Device.Designator RX,
     IO.Objects.libsimpleio.Device.Designator INT,
     IO.Objects.libsimpleio.Device.Designator PWM,
     // mikroBUS devices
     IO.Objects.libsimpleio.Device.Designator AIN,
     IO.Objects.libsimpleio.Device.Designator I2CBus,
     IO.Objects.libsimpleio.Device.Designator PWMOut,
     IO.Objects.libsimpleio.Device.Designator SPIDev,
     string UART)
 {
     this.shield   = shield;
     this.num      = num;
     this.ShareI2C = ShareI2C;
     // mikroBUS GPIO pins
     this.AN   = AN;
     this.RST  = RST;
     this.CS   = CS;
     this.SCK  = SCK;
     this.MISO = MISO;
     this.MOSI = MOSI;
     this.SDA  = SDA;
     this.SCL  = SCL;
     this.TX   = TX;
     this.RX   = RX;
     this.INT  = INT;
     this.PWM  = PWM;
     // mikroBUS devices
     this.AIN    = AIN;
     this.I2CBus = I2CBus;
     this.PWMOut = PWMOut;
     this.SPIDev = SPIDev;
     this.UART   = UART;
 }
Beispiel #7
0
        static void Main(string[] args)
        {
            Console.WriteLine("\nGPIO Button and LED Test\n");

            // Create GPIO pin objects

            IO.Objects.libsimpleio.Device.Designator desg_Button =
                new IO.Objects.libsimpleio.Device.Designator(0, 6);

            IO.Interfaces.GPIO.Pin Button =
                new IO.Objects.libsimpleio.GPIO.Pin(desg_Button,
                                                    IO.Interfaces.GPIO.Direction.Input);

            IO.Objects.libsimpleio.Device.Designator desg_LED =
                new IO.Objects.libsimpleio.Device.Designator(0, 26);

            IO.Interfaces.GPIO.Pin LED =
                new IO.Objects.libsimpleio.GPIO.Pin(desg_LED,
                                                    IO.Interfaces.GPIO.Direction.Output, false);

            // Force initial state change

            bool ButtonOld = false;
            bool ButtonNew = false;

            ButtonOld = !Button.state;

            // Main event loop

            for (;;)
            {
                ButtonNew = Button.state;

                if (ButtonNew != ButtonOld)
                {
                    Console.WriteLine(ButtonNew ? "PRESSED" : "RELEASED");
                    LED.state = ButtonNew;
                    ButtonOld = ButtonNew;
                }

                System.Threading.Thread.Sleep(100);
            }
        }
Beispiel #8
0
        /// <summary>
        /// Constructor for a single I<sup>2</sup>C bus controller.
        /// </summary>
        /// <param name="desg">I<sup>2</sup> bus designator.</param>
        public Bus(IO.Objects.libsimpleio.Device.Designator desg)
        {
            // Validate the I2C bus designator

            if ((desg.chip == IO.Objects.libsimpleio.Device.Designator.Unavailable.chip) ||
                (desg.chip != 0) ||
                (desg.chan == IO.Objects.libsimpleio.Device.Designator.Unavailable.chan))
            {
                throw new Exception("Invalid designator");
            }

            System.String devname = System.String.Format("/dev/i2c-{0}", desg.chan);

            IO.Bindings.libsimpleio.I2C_open(devname, out this.myfd,
                                             out int error);

            if (error != 0)
            {
                throw new Exception("I2C_open() failed, " +
                                    errno.strerror(error));
            }
        }
Beispiel #9
0
        static void Main(string[] args)
        {
            Console.WriteLine("\nGPIO Interrupt Button and LED Test\n");

            // Create GPIO pin objects

            IO.Objects.libsimpleio.Device.Designator desg_Button =
                new IO.Objects.libsimpleio.Device.Designator(0, 6);

            IO.Interfaces.GPIO.Pin Button =
                new IO.Objects.libsimpleio.GPIO.Pin(desg_Button,
                                                    IO.Interfaces.GPIO.Direction.Input, false,
                                                    IO.Objects.libsimpleio.GPIO.Pin.Driver.PushPull,
                                                    IO.Objects.libsimpleio.GPIO.Pin.Edge.Both);

            IO.Objects.libsimpleio.Device.Designator desg_LED =
                new IO.Objects.libsimpleio.Device.Designator(0, 26);

            IO.Interfaces.GPIO.Pin LED =
                new IO.Objects.libsimpleio.GPIO.Pin(desg_LED,
                                                    IO.Interfaces.GPIO.Direction.Output, false);

            // Main event loop

            for (;;)
            {
                if (Button.state)
                {
                    Console.WriteLine("PRESSED");
                    LED.state = true;
                }
                else
                {
                    Console.WriteLine("RELEASED");
                    LED.state = false;
                }
            }
        }
Beispiel #10
0
        static void Main(string[] args)
        {
            Console.WriteLine("\nMuntsOS C# LED Test\n");

            // Configure a GPIO output to drive an LED

            IO.Objects.libsimpleio.Device.Designator desg_LED =
                new IO.Objects.libsimpleio.Device.Designator(0, 26);

            IO.Interfaces.GPIO.Pin LED =
                new IO.Objects.libsimpleio.GPIO.Pin(desg_LED,
                                                    IO.Interfaces.GPIO.Direction.Output);

            // Flash the LED forever (until killed)

            Console.WriteLine("Press CONTROL-C to exit.\n");

            for (;;)
            {
                LED.state = !LED.state;
                System.Threading.Thread.Sleep(500);
            }
        }