diff options
Diffstat (limited to 'meta-facebook/meta-wedge/recipes-wedge/rackmon/rackmon/gpiowatch.c')
-rw-r--r-- | meta-facebook/meta-wedge/recipes-wedge/rackmon/rackmon/gpiowatch.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/meta-facebook/meta-wedge/recipes-wedge/rackmon/rackmon/gpiowatch.c b/meta-facebook/meta-wedge/recipes-wedge/rackmon/rackmon/gpiowatch.c new file mode 100644 index 0000000..11b5471 --- /dev/null +++ b/meta-facebook/meta-wedge/recipes-wedge/rackmon/rackmon/gpiowatch.c @@ -0,0 +1,93 @@ +/* + * Copyright 2014-present Facebook. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> +#include <fcntl.h> + +#define CHECK(x) { if((x) < 0) { \ + error = x; \ + goto cleanup; \ +} } + +#define CHECKNULL(x) { if((x) == NULL) { \ + error = -1; \ + goto cleanup; \ +} } + +typedef struct { + int fd; + int gpio; + char value; +} wgpio; + +int main(int argc, char **argv) { + int error = 0; + int nfds = argc - 1; + int i = 0; + int polliv = 10000; + wgpio* wgpios = NULL; + + if(argc < 2) { + fprintf(stderr, "Usage: %s <gpio num> [gpio num] [gpio num...]\n", argv[0]); + exit(1); + } + if(getenv("POLL_US")) { + polliv = atoi(getenv("POLL_US")); + } + + wgpios = calloc(nfds, sizeof(wgpio)); + CHECKNULL(wgpios) + + fprintf(stderr, "Watching %d gpios:", nfds); + for(i = 1; i < argc; i++) { + char filename[255]; + int gpio_num = atoi(argv[i]); + wgpios[i - 1].gpio = gpio_num; + snprintf(filename, 255, "/sys/class/gpio/gpio%d/value", gpio_num); + wgpios[i - 1].fd = open(filename, O_RDONLY); + CHECK(wgpios[i - 1].fd); + CHECK(read(wgpios[i - 1].fd, &(wgpios[i - 1].value), 1)); + fprintf(stderr, " %d (currently: %c)", gpio_num, wgpios[i - 1].value); + } + fprintf(stderr, "\n"); + + do { + usleep(polliv); + for(i = 0; i < nfds; i++) { + wgpio* w = &wgpios[i]; + char value; + lseek(w->fd, 0, SEEK_SET); + CHECK(read(w->fd, &value, 1)); + if(value != w->value) { + printf("GPIO%d: %c -> %c\n", w->gpio, w->value, value); + w->value = value; + } + } + } while (1); + +cleanup: + if(error != 0) { + fprintf(stderr, "Error %d: %s\n", errno, strerror(errno)); + error = 1; + } + return error; +} |