static void Main(string[] args) { // gpio driver LibGpiodDriver gpioDrv = new LibGpiodDriver(); // gpio ctrl for bank 0 GpioController gpioCtl = new GpioController(PinNumberingScheme.Logical, gpioDrv); // open pin 7 on bank0 int blueLed = 7; gpioCtl.OpenPin(blueLed, PinMode.Output); // blink forever while (true) { // LED turn on gpioCtl.Write(blueLed, PinValue.High); Console.WriteLine($"{blueLed} set to High"); Thread.Sleep(500); // LED turn off gpioCtl.Write(blueLed, PinValue.Low); Console.WriteLine($"{blueLed} set to Low"); Thread.Sleep(500); } }
static int Main(string[] args) { // check arguments if (args.Length < 2) { Console.WriteLine("Usage ./HelloWorld GPIO-BANK GPIO-LINE"); return(-1); } int gpioBank = Int32.Parse(args[0]); int gpioLine = Int32.Parse(args[1]); // /dev/gpiochip[args[0]] LibGpiodDriver gpiodDriver = new LibGpiodDriver(gpioBank); GpioController gpioController = new GpioController(PinNumberingScheme.Logical, gpiodDriver); // open gpiochip[args[0]] line args[1] gpioController.OpenPin(gpioLine, PinMode.Output); while (true) { gpioController.Write(gpioLine, PinValue.Low); Thread.Sleep(500); gpioController.Write(gpioLine, PinValue.High); Thread.Sleep(500); } }
static void Main(string[] args) { try { var drvGpio = new LibGpiodDriver(GPIOCHIP); controller = new GpioController(PinNumberingScheme.Logical, drvGpio); //set value if (!controller.IsPinOpen(LED_PIN) && !controller.IsPinOpen(BUTTON_PIN)) { controller.OpenPin(LED_PIN, PinMode.Output); controller.OpenPin(BUTTON_PIN, PinMode.Input); } else { Console.WriteLine("LED_PIN or BUTTON_PIN is busy"); exitCode = -1; return; } controller.Write(LED_PIN, ledPinValue); //LED OFF // Console.WriteLine("CTRL+C to interrupt the read operation:"); controller.RegisterCallbackForPinValueChangedEvent(BUTTON_PIN, PinEventTypes.Rising, (o, e) => { ledPinValue = !ledPinValue; controller.Write(LED_PIN, ledPinValue); Console.WriteLine($"Press button, LED={ledPinValue}"); }); //Console ConsoleKeyInfo cki; while (true) { Console.Write("Press any key, or 'X' to quit, or "); Console.WriteLine("CTRL+C to interrupt the read operation:"); // Start a console read operation. Do not display the input. cki = Console.ReadKey(true); // Announce the name of the key that was pressed . Console.WriteLine($" Key pressed: {cki.Key}\n"); // Exit if the user pressed the 'X' key. if (cki.Key == ConsoleKey.X) { break; } } } catch (Exception ex) { Console.WriteLine($"Error: {ex}"); exitCode = -2; } finally { if (controller is not null) { controller.Dispose(); } } Environment.Exit(exitCode); }
public Button(int pin, GpioController gpioController = null, bool shoudlDispose = true) { var unixDriver = new LibGpiodDriver(); _gpioController = gpioController ?? new GpioController(PinNumberingScheme.Logical, unixDriver); _shouldDispose = shoudlDispose; _pin = pin; _gpioController.OpenPin(_pin, PinMode.Input); // For some reason, the libgpiod doesn't work properly for the trigging, so need to be done manually //_gpioController.RegisterCallbackForPinValueChangedEvent(_pin, PinEventTypes.Falling | PinEventTypes.Rising, pinChangeEvent); _lastActionTimer = new Timer(ButtonEventTimer); _running = true; }
// TODO: remove try catch after https://github.com/dotnet/corefx/issues/32015 deployed public static UnixDriver Create() { UnixDriver driver = null; try { driver = new LibGpiodDriver(); } catch (DllNotFoundException) { driver = new SysfsDriver(); } return(driver); }
// TODO: remove try catch after https://github.com/dotnet/corefx/issues/32015 deployed public static UnixDriver Create() { UnixDriver driver = null; try { driver = new LibGpiodDriver(); } catch (PlatformNotSupportedException) { driver = new SysFsDriver(); } return(driver); }
static void Main(string[] args) { // gpio driver for bank0 LibGpiodDriver gpioDrv = new LibGpiodDriver(); // gpio driver for bank1 LibGpiodDriver gpioDrv1 = new LibGpiodDriver(1); // gpio ctrl for bank 0 GpioController gpioCtl = new GpioController(PinNumberingScheme.Logical, gpioDrv); // gpio ctrl for bank 1 GpioController gpioCtl1 = new GpioController(PinNumberingScheme.Logical, gpioDrv1); // open pin 8 on bank0 int redLed = 8; gpioCtl.OpenPin(redLed, PinMode.Output); // open pin 3 on bank 1 int redButton = 3; gpioCtl1.OpenPin(redButton, PinMode.Input); // status aux PinValue redLedValue = PinValue.Low; // check input while (true) { // read the pin PinValue readButton = gpioCtl1.Read(redButton); // if the button is pressed if (readButton == PinValue.High) { // invert the value from redLed redLedValue = (redLedValue == PinValue.Low) ? PinValue.High : PinValue.Low; gpioCtl.Write(redLed, redLedValue); } // let's sleep to debounce Thread.Sleep(500); } }
/// <summary> /// Static factory method /// </summary> /// <returns>An instance of GpioDriver, depending on which one fits</returns> // TODO: remove try catch after https://github.com/dotnet/corefx/issues/32015 deployed public static UnixDriver Create() { if (Environment.OSVersion.Platform != PlatformID.Unix) { throw new PlatformNotSupportedException(nameof(UnixDriver) + " is only supported on Linux/Unix"); } UnixDriver?driver = null; try { driver = new LibGpiodDriver(); } catch (PlatformNotSupportedException) { driver = new SysFsDriver(); } return(driver); }
public GPIODeviceService() { // reference to /dev/gpiochip1 libGpiod = new LibGpiodDriver(1); // use reference on this controller gpiochip1 = new GpioController(PinNumberingScheme.Logical, libGpiod); // open output pins gpiochip1.OpenPin(LED_BLUE_PIN, PinMode.Output); gpiochip1.OpenPin(LED_YELLOW_PIN, PinMode.Output); // open input pins gpiochip1.OpenPin(BUTTON_RED_PIN, PinMode.Input); gpiochip1.RegisterCallbackForPinValueChangedEvent(BUTTON_RED_PIN, PinEventTypes.Rising, (sender, pinValueChangedEventArgs) => { NotifyButtonRedPressed?.Invoke(); }); }
public static void Initialize() { // Default to SDL interface for cross platform desktop support Platform = HardwareType.PC; Screen = ScreenType.SDLWindow480x360; // Check for supported embedded platforms if (File.Exists("/proc/device-tree/model")) { var model = File.ReadAllText("/proc/device-tree/model"); if (model.Contains("Orange Pi")) { Platform = HardwareType.OrangePi; } else if (model.Contains("Raspberry Pi")) { Platform = HardwareType.RaspberryPi; } } // Check for supported embedded screens if (File.Exists("/sys/class/graphics/fb1/virtual_size")) { var size = File.ReadAllText("/sys/class/graphics/fb1/virtual_size"); switch (size) { case "480,320": Screen = ScreenType.FB480x360; break; case "800,480": Screen = ScreenType.FB800x480; break; } } else if (File.Exists("/sys/class/graphics/fb0/virtual_size")) { var size = File.ReadAllText("/sys/class/graphics/fb0/virtual_size"); switch (size) { case "480,320": Screen = ScreenType.FB480x360; break; case "800,480": Screen = ScreenType.FB800x480; break; } } // Check for supported embedded screens if (File.Exists("/sys/class/graphics/fb1/virtual_size")) { var size = File.ReadAllText("/sys/class/graphics/fb1/virtual_size"); switch (size) { case "480,320": Screen = ScreenType.FB480x360; break; case "800,480": Screen = ScreenType.FB800x480; break; } } else if (File.Exists("/sys/class/graphics/fb0/virtual_size")) { var size = File.ReadAllText("/sys/class/graphics/fb0/virtual_size"); switch (size) { case "480,320": Screen = ScreenType.FB480x360; break; case "800,480": Screen = ScreenType.FB800x480; break; } } switch (Platform) { case HardwareType.OrangePi: serialPort = new SerialPort("/dev/ttyS3", 9600, Parity.None, 8, StopBits.One); address0Pin = 11; address1Pin = 6; address2Pin = 0; address3Pin = 3; address4Pin = 7; address5Pin = 8; address6Pin = 10; address7Pin = 20; triggerPin = 9; ledPin = 200; beeperPin = 201; break; case HardwareType.RaspberryPi: serialPort = new SerialPort("/dev/serial0", 9600, Parity.None, 8, StopBits.One); address0Pin = 3; address1Pin = 4; address2Pin = 27; address3Pin = 22; address4Pin = 5; address5Pin = 6; address6Pin = 19; address7Pin = 26; triggerPin = 13; ledPin = 12; beeperPin = 16; break; } switch (Platform) { case HardwareType.OrangePi: case HardwareType.RaspberryPi: W26Pipe.Initalize(); serialPort.Open(); var driver = new LibGpiodDriver(0); gpio = new GpioController(PinNumberingScheme.Logical, driver); gpio.OpenPin(address0Pin, PinMode.Output); gpio.OpenPin(address1Pin, PinMode.Output); gpio.OpenPin(address2Pin, PinMode.Output); gpio.OpenPin(address3Pin, PinMode.Output); gpio.OpenPin(address4Pin, PinMode.Output); gpio.OpenPin(address5Pin, PinMode.Output); gpio.OpenPin(address6Pin, PinMode.Output); gpio.OpenPin(address7Pin, PinMode.Output); gpio.OpenPin(triggerPin, PinMode.Output); gpio.OpenPin(ledPin, PinMode.Output); gpio.OpenPin(beeperPin, PinMode.Output); break; } Logout(); }
static void Main(string[] args) { //run: dotnet-gpioset 1 36=1 //----------------------------------------------- try { int? int_gpiochip = null, int_pin = null; PinValue?pin_value = null; #if DEBUG Console.WriteLine("Debug version"); int_gpiochip = 1; int_pin = 36; pin_value = PinValue.High; #endif if (args.Length == 2) { //Read args if (int.TryParse(args[0], out int output)) { int_gpiochip = output; } Regex r = new Regex(@"\d+=\d+"); //36=1 if (r.IsMatch(args[1])) //check: 36=1 { var i = args[1].Split("="); if (int.TryParse(i[0], out output)) { int_pin = output; } if (int.TryParse(i[1], out output)) { pin_value = (output != 0) ? PinValue.High : PinValue.Low; } } } if ((int_gpiochip is null) || (int_pin is null) || (pin_value is null)) { Console.WriteLine("Error: invalid parameters. Sample: dotnet-gpioset 1 36=1"); Environment.Exit(-1); } Console.WriteLine($"Args gpiochip={int_gpiochip}, pin={int_pin}, value={pin_value}"); var drvGpio = new LibGpiodDriver(int_gpiochip.Value); controller = new GpioController(PinNumberingScheme.Logical, drvGpio); //set value if (!controller.IsPinOpen(int_pin.Value)) { controller.OpenPin(int_pin.Value, PinMode.Output); controller.Write(int_pin.Value, pin_value.Value); controller.ClosePin(int_pin.Value); Console.WriteLine("OK"); } else { Console.WriteLine("Error: Device or resource busy"); exitCode = -2; } } catch (Exception ex) { Console.WriteLine($"Error: {ex}"); exitCode = -3; } finally { if (controller is not null) { controller.Dispose(); } } Environment.Exit(exitCode); }