sudo apt install libgpiod2 libgpiod-dev   
cmake_minimum_required(VERSION 3.10)
project(skaMenu)

# 查找pkg-config
find_package(PkgConfig REQUIRED)

# 使用pkg-config查找libgpiod C++库
pkg_check_modules(GPIODCXX REQUIRED libgpiodcxx)

add_executable(skaMenu src/main.cpp)

# 链接库和设置include目录
target_link_libraries(skaMenu ${GPIODCXX_LIBRARIES})
target_include_directories(skaMenu PRIVATE ${GPIODCXX_INCLUDE_DIRS})
target_compile_options(skaMenu PRIVATE ${GPIODCXX_CFLAGS_OTHER})
#include <iostream>
#include <gpiod.hpp>
#include <vector>
#include <thread>
#include <chrono>
#include <csignal>

const std::vector<unsigned int> BUTTON_PINS = {14, 15, 18};
bool running = true;

void signal_handler(int signal)
{
    std::cout << "\n测试结束" << std::endl;
    running = false;
}

void setup_gpio(gpiod::chip &chip, std::vector<gpiod::line> &lines)
{
    // 设置GPIO为输入
    for (auto pin : BUTTON_PINS)
    {
        auto line = chip.get_line(pin);
        line.request({"button_test", gpiod::line_request::DIRECTION_INPUT, 0});
        lines.push_back(std::move(line));
    }
}

void test_button(std::vector<gpiod::line> &lines)
{
    std::cout << "正在检测14、15、18的按钮" << std::endl;

    while (running)
    {
        for (size_t i = 0; i < lines.size(); i++)
        {
            int button_state = lines[i].get_value();
            unsigned int pin = BUTTON_PINS[i];
            if (button_state == 0)
            {
                // low
                std::cout << "🔘 GPIO" << pin << "按钮被按下!" << std::endl;
            }
            else
            {
                std::cout << "⚪ GPIO" << pin << "按钮未按下" << std::endl;
            }
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        std::cout << "------------------------------" << std::endl;
    }
}

int main()
{
    signal(SIGINT, signal_handler); // 捕获ctrl+c

    try
    {
        // 打开GPIO芯片
        gpiod::chip chip("gpiochip0");
        std::vector<gpiod::line> lines;
        setup_gpio(chip, lines);

        // 测试按钮
        test_button(lines);
    }
    catch (const std::exception &e)
    {
        std::cerr << "错误: " << e.what() << std::endl;
        return 1;
    }

    std::cout << "GPIO清理完成" << std::endl;
    return 0;
}