/* * 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; char *power; char *prox_en; char *prox_raw; }; struct device apds990x_dev = { .n = 10, .power = "/sys/class/i2c-adapter/i2c-0/0-0038/power_state", .prox_en = "/sys/class/i2c-adapter/i2c-0/0-0038/prox0_raw_en", .prox_raw = "/sys/class/i2c-adapter/i2c-0/0-0038/prox0_raw", }; int write_file(char *fname, const char *val) { int fd; ssize_t ret; fd = open(fname, O_WRONLY); if (fd < 0) { fprintf(stderr, "%s: %s\n", fname, strerror(errno)); return errno; } ret = write(fd, val, 1); if (ret != 1) { fprintf(stderr, "%s: %s\n", fname, strerror(errno)); close(fd); return errno; } fd = close(fd); if (fd < 0) fprintf(stderr, "%s: %s\n", fname, strerror(errno)); return errno; } int read_proxy(void) { int i, fd; ssize_t ret; char val[6]; fd = open(apds990x_dev.prox_raw, O_RDONLY); if (fd < 0) { fprintf(stderr, "%s: %s\n", apds990x_dev.prox_raw, strerror(errno)); return errno; } for (i = 0; i < apds990x_dev.n; i++) { ret = read(fd, val, 5); printf("read %u stuff\n", ret); if (!ret) { fprintf(stderr, "%s: %s\n", apds990x_dev.prox_raw, strerror(errno)); break; } val[ret] = '\0'; printf("%s\n", val); sleep(1); } return errno; } 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; } printf("checkpoint 1\n"); err = write_file(apds990x_dev.power, ENABLE); printf("checkpoint 2\n"); if (err) return err; err = write_file(apds990x_dev.prox_en, ENABLE); printf("checkpoint 3\n"); if (!err) { read_proxy(); printf("checkpoint 4\n"); write_file(apds990x_dev.prox_en, DISABLE); printf("checkpoint 5\n"); } err = write_file(apds990x_dev.power, DISABLE); printf("checkpoint 6\n"); return err; }