// SPDX-License-Identifier: LGPL-2.1-or-later /* * This file is part of libgpiod. * * Copyright (C) 2017-2018 Bartosz Golaszewski */ /* Simplified C++ reimplementation of the gpiomon tool. */ #include #include #include namespace { void print_event(const ::gpiod::line_event& event) { if (event.event_type == ::gpiod::line_event::RISING_EDGE) ::std::cout << " RISING EDGE"; else if (event.event_type == ::gpiod::line_event::FALLING_EDGE) ::std::cout << "FALLING EDGE"; else throw ::std::logic_error("invalid event type"); ::std::cout << " "; ::std::cout << ::std::chrono::duration_cast<::std::chrono::seconds>(event.timestamp).count(); ::std::cout << "."; ::std::cout << event.timestamp.count() % 1000000000; ::std::cout << " line: " << event.source.offset(); ::std::cout << ::std::endl; } } /* namespace */ int main(int argc, char **argv) { if (argc < 3) { ::std::cout << "usage: " << argv[0] << " ..." << ::std::endl; return EXIT_FAILURE; } ::std::vector offsets; offsets.reserve(argc); for (int i = 2; i < argc; i++) offsets.push_back(::std::stoul(argv[i])); ::gpiod::chip chip(argv[1]); auto lines = chip.get_lines(offsets); lines.request({ argv[0], ::gpiod::line_request::EVENT_BOTH_EDGES, 0, }); for (;;) { auto events = lines.event_wait(::std::chrono::nanoseconds(1000000000)); if (events) { for (auto& it: events) print_event(it.event_read()); } } return EXIT_SUCCESS; }