c++gpio

Using c++ libgpiod library, how can I set gpio lines to be outputs and manipulate single lines with set_value() function?


I just started using c++ bindings of libgpiod library and have problem with settings gpios. I know, that I can create long vector of values, and apply it in all at once, but I would like to be able to set their direction, and control them separately. How can I do that?

What I tried is this:

First: Working code with applying all values at once:

#include <gpiod.hpp>

int main(int argc, char **argv)
    {

    ::gpiod::chip chip("gpiochip0");
    auto lines = chip.get_all_lines();

    ::gpiod::line_request requestOutputs = {
        argv[0],
        ::gpiod::line_request::DIRECTION_OUTPUT,
        0
    };

    int value_to_be_set = 0xAAAAAAA ; //example value
    ::std::vector<int> values;

    for (int i = 0; i < 32; i++)
    {
        values.push_back((value_to_be_set >> i) & 1UL);
    }

    lines.request(requestOutputs, values);
    lines.release();

    return EXIT_SUCCESS;
}

Second, my approach to do that I want:

#include <gpiod.hpp>

int main(int argc, char **argv)
{
    ::gpiod::chip chip("gpiochip0");
    auto lines = chip.get_all_lines();

    ::gpiod::line_request requestOutputs = {
        argv[0],
        ::gpiod::line_request::DIRECTION_OUTPUT,
        0
    };
    lines.request(requestOutputs);

    int value_to_be_set = 0xAAAAAAA; //example value

    for (int i = 0; i < 32; i++)
    {
        // This does not set value :(
        lines.get(i).set_value((value_to_be_set >> i) & 1UL);
    }

    lines.release();

    return EXIT_SUCCESS;
}

Solution

  • I also could not find a simple C++ example to toggle a single GPIO line using the latest Raspberry PI libraries.

    There is a multi-line example below but this is not what was originally asked: https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/tree/bindings/cxx

    Below is an example that will cause GPIO17 to go high then low to create a single line output pulse.

    // Use gpio drivers to toggle a single GPIO
    // line on Raspberry Pi
    
    // Use following commands to install prerequisites and build
    // sudo apt install gpiod
    // sudo apt install libgpiod-dev
    // g++ -Wall -o gpio gpip.cpp -lgpiodcxx
    
    #include <iostream>
    #include <gpiod.hpp>
    #include <unistd.h>
     
    int main(void)
    { 
       ::gpiod::chip chip("gpiochip0");
       
       auto line = chip.get_line(17);  // GPIO17
       line.request({"example", gpiod::line_request::DIRECTION_OUTPUT, 0},1);  
       
       usleep(100000); //waiting 100,000 us or 0.1 seconds
       
       line.set_value(0);
       line.release();
    }