#include #include // https://docs.kernel.org/driver-api/gpio/using-gpio.html #define GPIO_CHIP "gpiochip0" struct gpiod_chip *chip; int init_gpio() { // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_open_by_name.html chip = gpiod_chip_open_by_name(GPIO_CHIP); if (!chip) { printf("Error opening GPIO chip"); return -1; } return 0; } void cleanup_gpio() { // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_close.html gpiod_chip_close(chip); } static int set_pin_state(int pin, int state) { // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_get_line.html struct gpiod_line *line = gpiod_chip_get_line(chip, pin); // this may need an offset if (!line) { printf("Error getting GPIO line"); return -1; } // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_request_output.html if (gpiod_line_request_output(line, "house-leds", state) < 0) { printf("Error setting GPIO line direction"); gpiod_line_release(line); return -1; } // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_set_value.html if (gpiod_line_set_value(line, state) < 0) { printf("Error setting GPIO line value"); gpiod_line_release(line); return -1; } // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_release.html gpiod_line_release(line); return 0; } int turn_on_pin(int pin) { return set_pin_state(pin, 1); } int turn_off_pin(int pin) { return set_pin_state(pin, 0); } int turn_on_all_pins() { for (int pin = 0; pin <= 5; pin++) { if (turn_on_pin(pin) < 0) return -1; } return 0; } int turn_off_all_pins() { for (int pin = 0; pin <= 5; pin++) { if (turn_off_pin(pin) < 0) return -1; } return 0; } static int button_presssed(int event, unsigned int pin, const struct timespec * timestamp, void *data) { (void) event; (void) timestamp; * (int *) data = (int) pin; return GPIOD_CTXLESS_EVENT_POLL_RET_STOP; } int wait_for_button_press(unsigned int pins[]) { // https://www.lane-fu.com/linuxmirror/libgpiod/doc/html/group______high__level____.html#ga3ac28eb59bbd31b8b2298f76047d377d int pressed_pin = -1; struct timespec ts = { .tv_sec = 3600, .tv_nsec = 0, }; return gpiod_ctxless_event_monitor_multiple(GPIO_CHIP, GPIOD_CTXLESS_EVENT_FALLING_EDGE, pins, 5, true, "house-leds", &ts, // big timout NULL, button_presssed, &pressed_pin ); }