示例#1
0
        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);
            }
        }
示例#2
0
        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);
 }
示例#4
0
        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;
        }
示例#5
0
        // 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);
        }
示例#6
0
        // 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);
        }
示例#7
0
        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);
            }
        }
示例#8
0
    /// <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);
        }