You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KED/examples/pin_control.c

72 lines
1.9 KiB

/**
* @file gpio_control.c
* @brief CLI utility to control GPIOs using KED GPIO interface (Linux).
*/
#include "../ked/peripherals/gpio/gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* @brief Simple command-line tool to test the GPIO API.
*/
int main(int argc, char* argv[]) {
if (argc < 4) {
printf("Usage: %s -pin <BCM_number> -[set|reset|toggle|read]\n", argv[0]);
return 1;
}
unsigned int pin = 0;
const char* action = NULL;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-pin") == 0 && i + 1 < argc) {
pin = (unsigned int)atoi(argv[++i]);
} else if (strncmp(argv[i], "-", 1) == 0) {
action = argv[i] + 1; // skip '-' prefix
}
}
if (pin == 0 || !action) {
fprintf(stderr, "Invalid usage.\n");
return 1;
}
gpio_t gpio;
gpio_config cfg = {
.chipname = "/dev/gpiochip0",
.line_offset = pin,
.mode = GPIO_MODE_DEFAULT,
.direction = (strcmp(action, "read") == 0) ? GPIO_DIRECTION_INPUT : GPIO_DIRECTION_OUTPUT,
.bias = GPIO_BIAS_NONE
};
gpio_error_t err = ked_gpio_init(&gpio, &cfg);
if (err != GPIO_OK) {
if (gpio.on_error) gpio.on_error(err);
return 1;
}
if (strcmp(action, "set") == 0) {
gpio.set(true);
//printf("GPIO%u set HIGH\n", pin);
} else if (strcmp(action, "reset") == 0) {
gpio.set(false);
//printf("GPIO%u set LOW\n", pin);
} else if (strcmp(action, "toggle") == 0) {
gpio.toggle();
//printf("GPIO%u toggled\n", pin);
} else if (strcmp(action, "read") == 0) {
bool value = gpio.read();
printf("%s\n", value ? "1" : "0");
} else {
fprintf(stderr, "Unknown action: %s\n", action);
if (gpio.on_error) gpio.on_error(GPIO_ERR_UNKNOWN);
return 1;
}
gpio.deinit();
return 0;
}