diff --git a/api/gpio.h b/api/gpio.h index b58735e..ab9598f 100644 --- a/api/gpio.h +++ b/api/gpio.h @@ -23,6 +23,8 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #ifdef __cplusplus extern "C" { #endif @@ -32,6 +34,7 @@ typedef struct gpio_struct int pin; int pinMap; char path[64]; + FILE *value_fp; } gpio_t; typedef char gpio_mode_t[16]; @@ -42,6 +45,7 @@ int gpio_set(int pin); void gpio_mode(gpio_t *gpio, gpio_mode_t mode); void gpio_dir(gpio_t *gpio, gpio_dir_t dir); +void gpio_close(gpio_t *gpio); int gpio_read(gpio_t *gpio); void gpio_write(gpio_t *gpio, int value); diff --git a/examples/python/blink-io8.py b/examples/python/blink-io8.py new file mode 100644 index 0000000..3641283 --- /dev/null +++ b/examples/python/blink-io8.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import pymaa as maa +import time + +x = maa.gpio_t() +maa.gpio_init(x, 26) +maa.gpio_dir(x, "out") + +while True: + maa.gpio_write(x,1) + time.sleep(0.2) + maa.gpio_write(x,0) + time.sleep(0.2) diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index e2b5110..4726ee7 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -24,7 +24,9 @@ */ #include +#include #include +#include #include "gpio.h" @@ -32,8 +34,19 @@ extern "C" { #endif +int +gpio_get_valfp(gpio_t *gpio); + void gpio_init(gpio_t *gpio, int pin) { + FILE *export_f; + + if((export_f = fopen("/sys/class/gpio/export", "w")) == NULL) { + fprintf(stderr, "Failed to open export for writing!\n"); + } else { + fprintf(export_f, "%d", pin); + fclose(export_f); + } gpio->pin = pin; } @@ -50,19 +63,63 @@ gpio_mode(gpio_t *gpio, gpio_mode_t mode) { void gpio_dir(gpio_t *gpio, gpio_dir_t dir) { + fclose(gpio->value_fp); + gpio->value_fp = NULL; + char filepath[64]; + snprintf(filepath, 64, "/sys/class/gpio/gpio%d/direction", gpio->pin); + int fd; + fd = open(filepath, O_WRONLY); + if(fd == -1) { + fprintf(stderr, "Failed to open direction for writing!\n"); + } else if(write(fd, dir, 5) == -1) { + fprintf(stderr, "Failed to set direction\n"); + } else { + close(fd); + } } int gpio_read(gpio_t *gpio) { - return 0; + if(gpio->value_fp == NULL) { + gpio_get_valfp(gpio); + } + fseek(gpio->value_fp, SEEK_SET, 0); + char buffer[2]; + fread(buffer, 2, 1, gpio->value_fp); + fseek(gpio->value_fp, SEEK_SET, 0); + return atoi(buffer); } void -gpio_write(gpio_t *gpio, int value){ +gpio_write(gpio_t *gpio, int value) { + if(gpio->value_fp == NULL) { + gpio_get_valfp(gpio); + } + fseek(gpio->value_fp, SEEK_SET, 0); + fprintf(gpio->value_fp, "%d", value); + fseek(gpio->value_fp, SEEK_SET, 0); } +void +gpio_close(gpio_t *gpio) { + +} + +int +gpio_get_valfp(gpio_t *gpio) { + char bu[64]; + sprintf(bu, "/sys/class/gpio/gpio%d/value", gpio->pin); + + if((gpio->value_fp = fopen(bu, "r+b")) == NULL) { + return 1; + } else { + return 0; + } + return 1; +} + #ifdef __cplusplus } #endif