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