add nix derivation for compiling with CMAKE
This commit is contained in:
parent
404097a13d
commit
010bb39169
5 changed files with 41 additions and 9 deletions
104
pin_control/src/pin_control.c
Normal file
104
pin_control/src/pin_control.c
Normal file
|
@ -0,0 +1,104 @@
|
|||
#include <stdio.h>
|
||||
#include <gpiod.h>
|
||||
|
||||
// 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) {
|
||||
(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
|
||||
);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue