#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); } 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; } int button_presssed(int event, unsigned int pin, const struct timespec * timestamp, void *data) { * (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 { time_t 3600; /* Seconds */ long 0; /* Nanoseconds */ } ts; gpiod_ctxless_event_monitor_multiple(chip, GPIOD_CTXLESS_EVENT_FALLING_EDGE, pins, 5, true, "house-leds", ts, // big timout NULL, button_presssed, &pressed_pin ) }