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