192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/* 292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Copyright (C) 2008-2014 The Android Open Source Project 392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * 492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Licensed under the Apache License, Version 2.0 (the "License"); 592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * you may not use this file except in compliance with the License. 692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * You may obtain a copy of the License at 792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * 892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * http://www.apache.org/licenses/LICENSE-2.0 992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * 1092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Unless required by applicable law or agreed to in writing, software 1192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * distributed under the License is distributed on an "AS IS" BASIS, 1292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * See the License for the specific language governing permissions and 1492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * limitations under the License. 1592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang */ 1692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 1792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <dirent.h> 1892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <errno.h> 1992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <fcntl.h> 2092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <linux/input.h> 2192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <math.h> 2292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <poll.h> 2392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <sys/select.h> 2492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <unistd.h> 2592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 2692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <cutils/log.h> 2792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 2892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include "SensorBase.h" 2992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/ 3192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#undef LOG_TAG 3392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define LOG_TAG "CwMcuSensor" 3492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 3592af8b26d261f8ce50980eeb41cf1406edb9f530Andy ChuangSensorBase::SensorBase( 3692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang const char* dev_name, 3792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang const char* data_name) 3892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang : dev_name(dev_name) 3992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang , data_name(data_name) 4092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang , dev_fd(-1) 4192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang , data_fd(-1) 4292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 4392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 4492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 4592af8b26d261f8ce50980eeb41cf1406edb9f530Andy ChuangSensorBase::~SensorBase() { 4692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (data_fd >= 0) { 4792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang close(data_fd); 4892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 4992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (dev_fd >= 0) { 5092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang close(dev_fd); 5192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 5292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 5392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 5492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint SensorBase::open_device() { 5592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (dev_fd<0 && dev_name) { 5692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev_fd = open(dev_name, O_RDONLY); 5792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno)); 5892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 5992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return 0; 6092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 6192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 6292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint SensorBase::close_device() { 6392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (dev_fd >= 0) { 6492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang close(dev_fd); 6592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang dev_fd = -1; 6692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 6792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return 0; 6892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 6992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 7092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint SensorBase::write_sys_attribute( 7192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang const char *path, const char *value, int bytes) 7292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{ 7392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang int fd, amt; 7492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 7592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang fd = open(path, O_WRONLY); 7692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (fd < 0) { 7792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE("SensorBase: write_attr failed to open %s (%s)", 7892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang path, strerror(errno)); 7992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return -1; 8092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 8192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 8292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang amt = write(fd, value, bytes); 8392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang amt = ((amt == -1) ? -errno : 0); 8492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang ALOGE_IF(amt < 0, "SensorBase: write_int failed to write %s (%s)", 8592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang path, strerror(errno)); 8692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang close(fd); 8792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return amt; 8892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 8992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 9092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint SensorBase::getFd() const { 9192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang if (!data_name) { 9292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return dev_fd; 9392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang } 9492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return data_fd; 9592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 9692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 9792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint SensorBase::setDelay(int32_t, int64_t) { 9892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return 0; 9992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 10092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 10192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint64_t SensorBase::getDelay(int32_t) { 10292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return 0; 10392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 10492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 10592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangbool SensorBase::hasPendingEvents() const { 10692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return false; 10792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 10892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 10992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint64_t SensorBase::getTimestamp() { 11092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang struct timespec t; 11192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang t.tv_sec = t.tv_nsec = 0; 112943627d217c7a01dafaa02078005ceb4dd5d1eeaHanson_Pu clock_gettime(CLOCK_BOOTTIME, &t); 11392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang return int64_t(t.tv_sec)*NS_PER_SEC + t.tv_nsec; 11492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang} 11592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang 116