triviOS/pin_control/pin_control.c

103 lines
2.7 KiB
C
Raw Normal View History

2023-09-11 10:05:35 +02:00
#include <stdio.h>
#include <gpiod.h>
#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;
}
}
}