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