From 00587fb6c33385ac1b36d0be1e916902c8730a23 Mon Sep 17 00:00:00 2001 From: Josh Sawyer <106642518+joshusooyaa@users.noreply.github.com> Date: Wed, 30 Jul 2025 07:35:24 -0700 Subject: [PATCH 1/4] Link libgpiod library Code was calling libgpiod functions without them linked. --- src/modules/libgpiod/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/modules/libgpiod/CMakeLists.txt b/src/modules/libgpiod/CMakeLists.txt index 0538e4bb2..c43dbaf8f 100644 --- a/src/modules/libgpiod/CMakeLists.txt +++ b/src/modules/libgpiod/CMakeLists.txt @@ -1,3 +1,6 @@ +find_package(PkgConfig REQUIRED) +pkg_check_modules(LIBGPIOD REQUIRED IMPORTED_TARGET libgpiod) + set(LIBGPIOD_BIN libgpiod) set(LIBGPIOD_SRCS @@ -9,6 +12,11 @@ set(LIBGPIOD_SRCS add_library(${LIBGPIOD_BIN} SHARED ${LIBGPIOD_SRCS}) +target_linked_libraries(${LIBGPIOD_BIN} + PRIVATE + PkgConfig::LIBGPIOD +) + set_target_properties(${LIBGPIOD_BIN} PROPERTIES COMPILE_FLAGS "${MODULE_COMPILE_FLAGS}" ) From 4938b34c94639936870b23c120fa4ab55bbdfab6 Mon Sep 17 00:00:00 2001 From: Josh Sawyer <106642518+joshusooyaa@users.noreply.github.com> Date: Wed, 30 Jul 2025 07:41:23 -0700 Subject: [PATCH 2/4] Reserve line properly gpiod line requests reserve the line. The original code was attempting to reserve a single line twice by setting both direction and interrupt mode. When the direction is in, setting to input is not required since the code will instead set a rising edge, falling edge (or both) type notifications on a single line. See docs here: https://libgpiod-dlang.dpldocs.info/source/gpiod.d.html#L1054 --- src/modules/libgpiod/LibgpiodPin.cpp | 22 +++++++++++----------- src/modules/libgpiod/LibgpiodPin.hpp | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/modules/libgpiod/LibgpiodPin.cpp b/src/modules/libgpiod/LibgpiodPin.cpp index b2f65ab25..bbdf23b58 100644 --- a/src/modules/libgpiod/LibgpiodPin.cpp +++ b/src/modules/libgpiod/LibgpiodPin.cpp @@ -47,8 +47,7 @@ LibgpiodPin::LibgpiodPin(zmqpp::context &ctx, const std::string &name, const std gpiod_line_ = gpiod_chip_get_line(gpiod_chip_, gpio_offset_); assert(gpiod_line_ != nullptr); - set_direction(direction); - set_interrupt(interrupt_mode); + configure_line(direction, interrupt_mode); } LibgpiodPin::~LibgpiodPin() @@ -68,16 +67,17 @@ void LibgpiodPin::release() } } -void LibgpiodPin::set_direction(Direction dir) +void LibgpiodPin::configure_line(Direction dir, InterruptMode mode) { - if (dir == Direction::In) - { - gpiod_line_request_input(gpiod_line_, module_.general_config()->consumer().c_str()); - } - else - { - gpiod_line_request_output(gpiod_line_, module_.general_config()->consumer().c_str(), initial_value_); - } + if (gpiod_line_) { + gpiod_line_release(gpiod_line_); + } + + if (dir == Direction::Out) { + gpiod_line_request_output(gpiod_line_, module_.general_config()->consumer().c_str(), initial_value_); + } else { + set_interrupt(mode); + } } void LibgpiodPin::set_interrupt(InterruptMode mode) diff --git a/src/modules/libgpiod/LibgpiodPin.hpp b/src/modules/libgpiod/LibgpiodPin.hpp index 1c43ae28e..1d6ea4784 100644 --- a/src/modules/libgpiod/LibgpiodPin.hpp +++ b/src/modules/libgpiod/LibgpiodPin.hpp @@ -124,9 +124,9 @@ class LibgpiodPin void handle_message(); /** - * Write direction to the `direction` file. + * Configure the line with direction to output or set interrupt mode. */ - void set_direction(Direction dir); + void configure_line(Direction dir, InterruptMode mode); /** * Write interrupt mode to the `edge` file. From f3ea9ab2d78e05a6cfb1fcd1d6166c05d110c550 Mon Sep 17 00:00:00 2001 From: joshusooyaa <106642518+joshusooyaa@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:35:19 -0700 Subject: [PATCH 3/4] Fix cmake typo --- src/modules/libgpiod/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/libgpiod/CMakeLists.txt b/src/modules/libgpiod/CMakeLists.txt index c43dbaf8f..efaee1dca 100644 --- a/src/modules/libgpiod/CMakeLists.txt +++ b/src/modules/libgpiod/CMakeLists.txt @@ -12,7 +12,7 @@ set(LIBGPIOD_SRCS add_library(${LIBGPIOD_BIN} SHARED ${LIBGPIOD_SRCS}) -target_linked_libraries(${LIBGPIOD_BIN} +target_link_libraries(${LIBGPIOD_BIN} PRIVATE PkgConfig::LIBGPIOD ) From 3dbe2842056575cc711fcff4ae040f638de988bf Mon Sep 17 00:00:00 2001 From: joshusooyaa <106642518+joshusooyaa@users.noreply.github.com> Date: Mon, 4 Aug 2025 14:06:53 -0700 Subject: [PATCH 4/4] Change interrupt to poll_in poll_pri ignores GPIO interrupt events since they're not priority. poll_in detects GPIO interrupt events as normal input. This resolves the issue with libgpiod module not picking up rfid card swipes. Setting to poll_in fixes this. --- src/modules/libgpiod/LibgpiodPin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/libgpiod/LibgpiodPin.cpp b/src/modules/libgpiod/LibgpiodPin.cpp index bbdf23b58..a9e910f61 100644 --- a/src/modules/libgpiod/LibgpiodPin.cpp +++ b/src/modules/libgpiod/LibgpiodPin.cpp @@ -176,7 +176,7 @@ void LibgpiodPin::register_sockets(zmqpp::reactor *reactor) gpiod_fd_ = gpiod_line_event_get_fd(gpiod_line_); ASSERT_LOG(gpiod_fd_ >= 0, "Bad GPIO line or the line is not setup for event monitoring."); reactor->add(gpiod_fd_, std::bind(&LibgpiodPin::handle_interrupt, this), - zmqpp::poller::poll_pri); + zmqpp::poller::poll_in); } }