/* * apds990x proximity sensor testing module * * Copyright (C) 2013 Andi Shyti * * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #define MAX_N 100 #define ENABLE "1" #define DISABLE "0" struct device { unsigned int n; int prox; char *power; char *prox_en; char *prox_raw; }; struct device apds990x_dev = { .n = 10, .power = "/sys/class/i2c-adapter/i2c-12/12-0039/power_state", .prox_en = "/sys/class/i2c-adapter/i2c-12/12-0039/prox0_raw_en", .prox_raw = "/sys/class/i2c-adapter/i2c-12/12-0039/prox0_raw", }; int write_file(char *fname, const char *val) { int fd; ssize_t ret; int retval = 0; fd = open(fname, O_WRONLY); if (fd < 0) { retval = errno; fprintf(stderr, "%s: %s\n", fname, strerror(errno)); return retval; } ret = write(fd, val, 1); if (ret != 1) { retval = errno; fprintf(stderr, "%s: %s\n", fname, strerror(errno)); close(fd); return retval; } fd = close(fd); if (fd < 0) { retval = errno; fprintf(stderr, "%s: %s\n", fname, strerror(errno)); } return retval; } int read_proxy(void) { unsigned int i; int fd, retval = 0; ssize_t ret; char val[6]; for (i = 0; i < apds990x_dev.n; i++) { sleep(1); fd = open(apds990x_dev.prox_raw, O_RDONLY); if (fd < 0) { retval = errno; fprintf(stderr, "%s: %s\n", apds990x_dev.prox_raw, strerror(errno)); return retval; } ret = read(fd, val, sizeof(val)); if (ret < 0) { retval = errno; fprintf(stderr, "%s: %s\n", apds990x_dev.prox_raw, strerror(errno)); break; } /* replace EOF with \n */ val[ret-1] = '\n'; apds990x_dev.prox = (int) strtol(val, NULL, 10); printf("%d\n", apds990x_dev.prox); fd = close(fd); if (fd < 0) { retval = errno; fprintf(stderr, "%s: %s\n", apds990x_dev.prox_raw, strerror(errno)); break; } } return retval; } void print_usage(char *name) { printf("Usage: %s [-n ]\n", name); printf("\n"); printf(" -n - number of readings on the device\n"); printf(" -h, --help - print help menu\n"); } int parse_cmdline(int argc, char *argv[]) { int i; unsigned long int n; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-n")) { n = strtoul(argv[++i], NULL, 10); /* check for overflow */ if (errno) return errno; apds990x_dev.n = ((n > MAX_N) || (n <= 0)) ? MAX_N : (unsigned int) n; } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { print_usage(argv[0]); exit(EXIT_SUCCESS); } else { fprintf(stderr, "%s: %s\n\n", argv[i], strerror(EINVAL)); print_usage(argv[0]); return EINVAL; } } return 0; } int main(int argc, char *argv[]) { int err; if (argc > 1) { err = parse_cmdline(argc, argv); if (err) return err; } err = write_file(apds990x_dev.power, ENABLE); if (err) return err; err = write_file(apds990x_dev.prox_en, ENABLE); if (!err) { read_proxy(); write_file(apds990x_dev.prox_en, DISABLE); } err = write_file(apds990x_dev.power, DISABLE); return err; }