On Mon, Jun 15, 2020 at 09:39:45PM +0200, Gerrit Wyen wrote: > Hi, > > can someone explain the following behavior and whether it is a bug? > > When reading two lines at once via get_values() in response to an edge event > I only receive the correct value for the first line (second line is high > during the test but always reported as low). > See example code below: > > lines.request({ > “gpiotest”, ::gpiod::line_request::EVENT_BOTH_EDGES, > 0, > }); > > auto events = lines.event_wait(::std::chrono::seconds(10)); > if (events) { > auto values = lines.get_values(); > for (auto& it: values) { > ::std::cout << it; > } > } > > However reading the same lines via get_value() one by one after the event > works correctly. Like so: > > for (auto& it: lines) { ::std::cout << it.get_value(); } > > > Also, when reading them without waiting for the event with > line_request::DIRECTION_INPUT the correct values are returned by > get_values() as well as by get_value(). > > This behavior was tested on multiple different devices. > > I have written some test cases and can confirm that behaviour with libgpiod v1.5. When you request the lines with DIRECTION_INPUT, libgpiod is using a linehandle (which works), but with EVENT_BOTH_EDGES it is using a collection of linevents (which doesn't). I would consider that a bug - linehandles (lines without edge detection) and lineevents (lines with edge detection) are treated differently in the GPIO uAPI and libgpiod should be hiding that from you - and is failing to do that. The issue here is that the underlying function that retrieves the values, gpiod_line_get_value_bulk, assumes it is dealing with a linehandle that can be read in bulk by the kernel, not a collection of lineevents that must be read individually, so it is only getting the value of the first line in the set. It should be getting the event lines individually, as you are, and collecting those values into the response. Until there is a fix, the workaround is to read the event lines individually - as you have already discovered. Cheers, Kent.