164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/* 264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Copyright (C) 2012 Invensense, Inc. 364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* 464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Licensed under the Apache License, Version 2.0 (the "License"); 564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* you may not use this file except in compliance with the License. 664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* You may obtain a copy of the License at 764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* 864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* http://www.apache.org/licenses/LICENSE-2.0 964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* 1064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Unless required by applicable law or agreed to in writing, software 1164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* distributed under the License is distributed on an "AS IS" BASIS, 1264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* See the License for the specific language governing permissions and 1464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* limitations under the License. 1564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*/ 1664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 1764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <fcntl.h> 1864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <errno.h> 1964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <math.h> 2064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <poll.h> 2164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <dirent.h> 2264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <sys/select.h> 2364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <cutils/log.h> 2464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <linux/input.h> 2564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 2664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "SensorBase.h" 2764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "local_log_def.h" 2864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 2964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/*****************************************************************************/ 3064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 3164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan RajeswaranSensorBase::SensorBase(const char* dev_name, 3264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran const char* data_name) : dev_name(dev_name), 3364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran data_name(data_name), 3464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran dev_fd(-1), 3564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran data_fd(-1) 3664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 3764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (data_name) { 3864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran data_fd = openInput(data_name); 3964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 4064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 4164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 4264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan RajeswaranSensorBase::~SensorBase() 4364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 4464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (data_fd >= 0) { 4564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran close(data_fd); 4664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 4764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (dev_fd >= 0) { 4864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran close(dev_fd); 4964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 5064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 5164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 5264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranint SensorBase::open_device() 5364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 5464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (dev_fd<0 && dev_name) { 5564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran dev_fd = open(dev_name, O_RDONLY); 5664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno)); 5764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 5864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return 0; 5964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 6064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 6164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranint SensorBase::close_device() 6264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 6364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (dev_fd >= 0) { 6464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran close(dev_fd); 6564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran dev_fd = -1; 6664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 6764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return 0; 6864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 6964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 7064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranint SensorBase::getFd() const 7164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 7264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (!data_name) { 7364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return dev_fd; 7464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 7564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return data_fd; 7664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 7764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 786a9192470eceac080b9d84081dac0c98e2362fe9Mark Salyzynint SensorBase::setDelay(int32_t /*handle*/, int64_t /*ns*/) 7964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 8064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return 0; 8164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 8264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 8364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranbool SensorBase::hasPendingEvents() const 8464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 8564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return false; 8664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 8764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 8864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranint SensorBase::openInput(const char *inputName) 8964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 9064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran int fd = -1; 9164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran const char *dirname = "/dev/input"; 9264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran char devname[PATH_MAX]; 9364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran char *filename; 9464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran DIR *dir; 9564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran struct dirent *de; 9664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran dir = opendir(dirname); 9764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if(dir == NULL) 9864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return -1; 9964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran strcpy(devname, dirname); 10064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran filename = devname + strlen(devname); 10164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran *filename++ = '/'; 10264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran while((de = readdir(dir))) { 10364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if(de->d_name[0] == '.' && 10464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran (de->d_name[1] == '\0' || 10564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran (de->d_name[1] == '.' && de->d_name[2] == '\0'))) 10664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran continue; 10764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran strcpy(filename, de->d_name); 10864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran fd = open(devname, O_RDONLY); 10964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGV_IF(EXTRA_VERBOSE, "path open %s", devname); 11064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGI("path open %s", devname); 11164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (fd >= 0) { 11264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran char name[80]; 11364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) { 11464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran name[0] = '\0'; 11564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 11664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGV_IF(EXTRA_VERBOSE, "name read %s", name); 11764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran if (!strcmp(name, inputName)) { 11864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran strcpy(input_name, filename); 11964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran break; 12064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } else { 12164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran close(fd); 12264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran fd = -1; 12364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 12464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 12564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran } 12664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran closedir(dir); 12764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran LOGE_IF(fd < 0, "couldn't find '%s' input device", inputName); 12864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return fd; 12964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 13064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran 1316a9192470eceac080b9d84081dac0c98e2362fe9Mark Salyzynint SensorBase::enable(int32_t /*handle*/, int /*enabled*/) 13264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{ 13364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran return 0; 13464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran} 135