#include #include #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 read_button(int pin) { // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_get_line.html struct gpiod_line *line = gpiod_chip_get_line(chip, pin + PIN_OFFSET); if (!line) { printf("Error getting GPIO line"); return -1; } // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_request_input.html if (gpiod_line_request_input(line, "house-leds") < 0) { printf("Error setting GPIO line direction to input"); gpiod_line_release(line); return -1; } // https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_get_value.html int value = gpiod_line_get_value(line); gpiod_line_release(line); return value; // either 0 or 1 } 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 wait_for_button_press(int button_pin) { while (1) { int button_state = read_button(button_pin); // maybe make it so that this works with a range of pins instead of just one if (button_state == 1) { return button_pin; } } }