add pin control library

This commit is contained in:
Fabian Montero 2023-09-11 02:05:35 -06:00
parent a0c9c5eb99
commit ef16376aba
Signed by: fabian
GPG key ID: 1FFAC35E1798174F
4 changed files with 138 additions and 0 deletions

13
pin_control/main.c Normal file
View file

@ -0,0 +1,13 @@
#include "pin_control.h"
int main() {
int button_pin = 5;
int button_response;
button_response = wait_for_button_press(button_pin);
printf("Button press detected on pin: %d\n", button_response);
cleanup_gpio();
return 0;
}

102
pin_control/pin_control.c Normal file
View file

@ -0,0 +1,102 @@
#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;
}
}
}

22
pin_control/pin_control.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef GPIO_CONTROL_H
#define GPIO_CONTROL_H
int init_gpio();
void cleanup_gpio();
int set_pin_state(int pin, int state);
int read_button(int pin);
int turn_on_pin(int pin);
int turn_off_pin(int pin);
int turn_on_all_pins();
int turn_off_all_pins();
int wait_for_button_press(int button_pin);
#endif /* GPIO_CONTROL_H */

1
pin_control/readme.md Normal file
View file

@ -0,0 +1 @@
gcc -o pin_contro_test main.c pin_control.c -lgpiod