/// <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> /// 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; } }
/// <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; }
/// <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)); } }
/// <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)); } }
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; }
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); } }
/// <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)); } }
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; } } }
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); } }