1cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro/* 2cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* Copyright (C) 2012 Invensense, Inc. 3cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* 4cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* Licensed under the Apache License, Version 2.0 (the "License"); 5cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* you may not use this file except in compliance with the License. 6cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* You may obtain a copy of the License at 7cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* 8cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* http://www.apache.org/licenses/LICENSE-2.0 9cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* 10cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* Unless required by applicable law or agreed to in writing, software 11cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* distributed under the License is distributed on an "AS IS" BASIS, 12cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* See the License for the specific language governing permissions and 14cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro* limitations under the License. 15cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro*/ 16cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 17cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <fcntl.h> 18cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <errno.h> 19cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <math.h> 20cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <poll.h> 21cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <unistd.h> 22cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <stdlib.h> 23cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <dirent.h> 24cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <sys/select.h> 25cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <cutils/log.h> 26cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <linux/input.h> 27cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 28cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include <cutils/properties.h> 29cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 30cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#include "SensorBase.h" 31cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 32cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro/*****************************************************************************/ 33cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 34cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro// static vars 35cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::PROCESS_VERBOSE = false; 36cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::EXTRA_VERBOSE = false; 37cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::SYSFS_VERBOSE = false; 38cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 39cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::FUNC_ENTRY = false; 40cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::HANDLER_ENTRY = false; 41cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::ENG_VERBOSE = false; 42cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::INPUT_DATA = false; 43cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::HANDLER_DATA = false; 44cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 45cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick VaccaroSensorBase::SensorBase(const char* dev_name, 46cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro const char* data_name) 47cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro : dev_name(dev_name), 48cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro data_name(data_name), 49cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro dev_fd(-1), 50cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro data_fd(-1) 51cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 52cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (data_name) { 53cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro data_fd = openInput(data_name); 54cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 55cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 56cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro char value[PROPERTY_VALUE_MAX]; 57cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.verbose.basic", value, "0"); 58cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 59cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro PROCESS_VERBOSE = true; 60cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 61cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.verbose.extra", value, "0"); 62cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 63cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro EXTRA_VERBOSE = true; 64cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 65cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.verbose.sysfs", value, "0"); 66cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 67cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro SYSFS_VERBOSE = true; 68cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 69cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.verbose.engineering", value, "0"); 70cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 71cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro ENG_VERBOSE = true; 72cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 73cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.entry.function", value, "0"); 74cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 75cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro FUNC_ENTRY = true; 76cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 77cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.entry.handler", value, "0"); 78cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 79cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro HANDLER_ENTRY = true; 80cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 81cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.data.input", value, "0"); 82cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 83cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro INPUT_DATA = true; 84cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 85cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro property_get("invn.hal.data.handler", value, "0"); 86cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (atoi(value)) { 87cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro HANDLER_DATA = true; 88cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 89cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 90cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 91cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick VaccaroSensorBase::~SensorBase() 92cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 93cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (data_fd >= 0) { 94cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro close(data_fd); 95cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 96cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (dev_fd >= 0) { 97cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro close(dev_fd); 98cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 99cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 100cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 101cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::open_device() 102cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 103cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (dev_fd<0 && dev_name) { 104cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro dev_fd = open(dev_name, O_RDONLY); 105cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro LOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno)); 106cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 107cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 108cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 109cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 110cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::close_device() 111cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 112cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (dev_fd >= 0) { 113cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro close(dev_fd); 114cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro dev_fd = -1; 115cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 116cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 117cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 118cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 119cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::getFd() const 120cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 121cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (!data_name) { 122cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return dev_fd; 123cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 124cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return data_fd; 125cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 126cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 127cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::setDelay(int32_t handle, int64_t ns) 128cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 129cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 130cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 131cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 132cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccarobool SensorBase::hasPendingEvents() const 133cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 134cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return false; 135cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 136cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 137cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint64_t SensorBase::getTimestamp() 138cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 139cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro struct timespec t; 140cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro t.tv_sec = t.tv_nsec = 0; 141cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro clock_gettime(CLOCK_MONOTONIC, &t); 142cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return int64_t(t.tv_sec) * 1000000000LL + t.tv_nsec; 143cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 144cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 145cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::openInput(const char *inputName) 146cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 147cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro int fd = -1; 148cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro const char *dirname = "/dev/input"; 149cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro char devname[PATH_MAX]; 150cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro char *filename; 151cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro DIR *dir; 152cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro struct dirent *de; 153cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro dir = opendir(dirname); 154cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if(dir == NULL) 155cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return -1; 156cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro strcpy(devname, dirname); 157cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro filename = devname + strlen(devname); 158cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro *filename++ = '/'; 159cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro while((de = readdir(dir))) { 160cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if(de->d_name[0] == '.' && 161cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro (de->d_name[1] == '\0' || 162cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro (de->d_name[1] == '.' && de->d_name[2] == '\0'))) 163cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro continue; 164cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro strcpy(filename, de->d_name); 165cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro fd = open(devname, O_RDONLY); 166cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro LOGV_IF(EXTRA_VERBOSE, "path open %s", devname); 167cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro LOGI("path open %s", devname); 168cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (fd >= 0) { 169cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro char name[80]; 170cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) { 171cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro name[0] = '\0'; 172cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 173cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro LOGV_IF(EXTRA_VERBOSE, "name read %s", name); 174cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro if (!strcmp(name, inputName)) { 175cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro strcpy(input_name, filename); 176cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro break; 177cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } else { 178cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro close(fd); 179cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro fd = -1; 180cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 181cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 182cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro } 183cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro closedir(dir); 184cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro LOGE_IF(fd < 0, "couldn't find '%s' input device", inputName); 185cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return fd; 186cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 187cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 188cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::enable(int32_t handle, int enabled) 189cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 190cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 191cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 192cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 193cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::query(int what, int* value) 194cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 195cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 196cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 197cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 198cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::batch(int handle, int flags, int64_t period_ns, int64_t timeout) 199cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 200cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 201cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 202cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro 203cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaroint SensorBase::flush(int handle) 204cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro{ 205cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro return 0; 206cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro} 207