1ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*
2ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Copyright (C) 2008 The Android Open Source Project
3ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
4ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Licensed under the Apache License, Version 2.0 (the "License");
5ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * you may not use this file except in compliance with the License.
6ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * You may obtain a copy of the License at
7ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
8ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *      http://www.apache.org/licenses/LICENSE-2.0
9ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
10ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Unless required by applicable law or agreed to in writing, software
11ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * distributed under the License is distributed on an "AS IS" BASIS,
12ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * See the License for the specific language governing permissions and
14ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * limitations under the License.
15ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
16ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
17ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define LOG_TAG "Sensors"
18ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
19ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <hardware/sensors.h>
20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <fcntl.h>
21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <errno.h>
22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <dirent.h>
23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <math.h>
24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <poll.h>
25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <pthread.h>
26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <stdlib.h>
27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <linux/input.h>
29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <utils/Atomic.h>
31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <utils/Log.h>
32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "sensors.h"
34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#if defined SENSORHAL_ACC_ADXL346
36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AdxlSensor.h"
37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#elif defined SENSORHAL_ACC_KXTF9
38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "KionixSensor.h"
39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#else
40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#error "Sensor configuration ERROR: No sensor is defined."
41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AkmSensor.h"
44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/
46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define DELAY_OUT_TIME 0x7FFFFFFF
48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define LIGHT_SENSOR_POLLTIME    2000000000
50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ACCELERATION     (1<<ID_A)
53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_MAGNETIC_FIELD   (1<<ID_M)
54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ORIENTATION      (1<<ID_O)
55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ACCELERATION_HANDLE     0
57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_MAGNETIC_FIELD_HANDLE   1
58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ORIENTATION_HANDLE      2
59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/
61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/* The SENSORS Module */
63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic const struct sensor_t sSensorList[] = {
64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        { "AK8975 3-axis Magnetic field sensor",
65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          "Asahi Kasei Microdevices",
66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          1,
67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		  SENSORS_MAGNETIC_FIELD_HANDLE,
68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          SENSOR_TYPE_MAGNETIC_FIELD, 1228.8f,
69af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella		  CONVERT_M, 0.35f, 10000, 0, 0, 0, 0, 0, 0, { } },
70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_ADXL346
71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        { "Analog Devices ADXL345/6 3-axis Accelerometer",
72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          "ADI",
73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          1, SENSORS_ACCELERATION_HANDLE,
74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          SENSOR_TYPE_ACCELEROMETER, (GRAVITY_EARTH * 16.0f),
75af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella		  (GRAVITY_EARTH * 16.0f) / 4096.0f, 0.145f, 10000, 0, 0, 0, 0, 0, 0, { } },
76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        { "AK8975 Orientation sensor",
77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          "Asahi Kasei Microdevices",
78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          1, SENSORS_ORIENTATION_HANDLE,
79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          SENSOR_TYPE_ORIENTATION, 360.0f,
80af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella		  CONVERT_O, 0.495f, 10000, 0, 0, 0, 0, 0, 0, { } }
81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_KXTF9
83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        { "Kionix KXTF9 3-axis Accelerometer",
84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          "Kionix",
85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          1, SENSORS_ACCELERATION_HANDLE,
86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          SENSOR_TYPE_ACCELEROMETER, (GRAVITY_EARTH * 2.0f),
87af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella		  (GRAVITY_EARTH) / 1024.0f, 0.7f, 10000, 0, 0, 0, 0, 0, 0, { } },
88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        { "AK8975 Orientation sensor",
89ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          "Asahi Kasei Microdevices",
90ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          1, SENSORS_ORIENTATION_HANDLE,
91ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda          SENSOR_TYPE_ORIENTATION, 360.0f,
92af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella		  CONVERT_O, 1.05f, 10000, 0, 0, 0, 0, 0, 0, { } }
93ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
94ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda};
95ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
96ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
97ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int open_sensors(const struct hw_module_t* module, const char* id,
98ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                        struct hw_device_t** device);
99ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
100ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int sensors__get_sensors_list(struct sensors_module_t* module,
10185d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                                     struct sensor_t const** list)
102ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
103ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        *list = sSensorList;
104ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        return ARRAY_SIZE(sSensorList);
105ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
106ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
107ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic struct hw_module_methods_t sensors_module_methods = {
10885d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev        .open = open_sensors
109ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda};
110ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
111ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastruct sensors_module_t HAL_MODULE_INFO_SYM = {
11285d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev        .common = {
11385d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .tag = HARDWARE_MODULE_TAG,
11485d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .version_major = 1,
11585d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .version_minor = 0,
11685d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .id = SENSORS_HARDWARE_MODULE_ID,
11785d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .name = "AKM Sensor module",
11885d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .author = "Asahi Kasei Microdevices",
11985d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev                .methods = &sensors_module_methods,
120ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        },
12185d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev        .get_sensors_list = sensors__get_sensors_list,
122ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda};
123ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
124ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastruct sensors_poll_context_t {
125ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    struct sensors_poll_device_t device; // must be first
126ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
127ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        sensors_poll_context_t();
128ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        ~sensors_poll_context_t();
129ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int activate(int handle, int enabled);
130ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int setDelay(int handle, int64_t ns);
131ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int setDelay_sub(int handle, int64_t ns);
132ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int pollEvents(sensors_event_t* data, int count);
133ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
134ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaprivate:
135ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    enum {
136ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        acc          = 0,
137ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        akm          = 1,
138ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        numSensorDrivers,
139ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        numFds,
140ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    };
141ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
142ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    static const size_t wake = numFds - 1;
143ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    static const char WAKE_MESSAGE = 'W';
144ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    struct pollfd mPollFds[numFds];
145ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int mWritePipeFd;
146ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    SensorBase* mSensors[numSensorDrivers];
147ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
14885d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev	/* These function will be different depends on
149ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	 * which sensor is implemented in AKMD program.
150ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	 */
151ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int handleToDriver(int handle);
152ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int proxy_enable(int handle, int enabled);
153ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int proxy_setDelay(int handle, int64_t ns);
154ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda};
155ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
156ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/
157ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
158ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudasensors_poll_context_t::sensors_poll_context_t()
159ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
160ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_ADXL346
161ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mSensors[acc] = new AdxlSensor();
162ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
163ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_KXTF9
164ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mSensors[acc] = new KionixSensor();
165ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
166ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[acc].fd = mSensors[acc]->getFd();
167ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[acc].events = POLLIN;
168ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[acc].revents = 0;
169ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
170ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mSensors[akm] = new AkmSensor();
171ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[akm].fd = mSensors[akm]->getFd();
172ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[akm].events = POLLIN;
173ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[akm].revents = 0;
174ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
175ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int wakeFds[2];
176ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int result = pipe(wakeFds);
177ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno));
178ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    fcntl(wakeFds[0], F_SETFL, O_NONBLOCK);
179ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    fcntl(wakeFds[1], F_SETFL, O_NONBLOCK);
180ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mWritePipeFd = wakeFds[1];
181ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
182ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[wake].fd = wakeFds[0];
183ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[wake].events = POLLIN;
184ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    mPollFds[wake].revents = 0;
185ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
186ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
187ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudasensors_poll_context_t::~sensors_poll_context_t() {
188ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    for (int i=0 ; i<numSensorDrivers ; i++) {
189ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        delete mSensors[i];
190ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
191ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    close(mPollFds[wake].fd);
192ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    close(mWritePipeFd);
193ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
194ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
195ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::handleToDriver(int handle) {
196ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	switch (handle) {
197ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_A:
198ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			return acc;
199ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_M:
200ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_O:
201ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			return akm;
202ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
203ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return -EINVAL;
204ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
205ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
206ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::activate(int handle, int enabled) {
207ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int drv = handleToDriver(handle);
208ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int err;
209ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
210ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	switch (handle) {
211ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_A:
212ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_M:
213ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			/* No dependencies */
214ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			break;
215ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
216ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_O:
217ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			/* These sensors depend on ID_A and ID_M */
218ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			mSensors[handleToDriver(ID_A)]->setEnable(ID_A, enabled);
219ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			mSensors[handleToDriver(ID_M)]->setEnable(ID_M, enabled);
220ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			break;
221ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
222ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		default:
223ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			return -EINVAL;
224ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
225ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	err = mSensors[drv]->setEnable(handle, enabled);
226ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
227ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (enabled && !err) {
228ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        const char wakeMessage(WAKE_MESSAGE);
229ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        int result = write(mWritePipeFd, &wakeMessage, 1);
230ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        ALOGE_IF(result<0, "error sending wake message (%s)", strerror(errno));
231ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
232ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return err;
233ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
234ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
235ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::setDelay(int handle, int64_t ns) {
236ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	switch (handle) {
237ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_A:
238ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_M:
239ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			/* No dependencies */
240ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			break;
241ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
242ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		case ID_O:
243ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			/* These sensors depend on ID_A and ID_M */
244ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			setDelay_sub(ID_A, ns);
245ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			setDelay_sub(ID_M, ns);
246ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			break;
247ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
248ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		default:
249ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			return -EINVAL;
250ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
251ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return setDelay_sub(handle, ns);
252ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
253ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
254ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::setDelay_sub(int handle, int64_t ns) {
255ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int drv = handleToDriver(handle);
256ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int en = mSensors[drv]->getEnable(handle);
257ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int64_t cur = mSensors[drv]->getDelay(handle);
258ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int err = 0;
259ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
260ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (en <= 1) {
261ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		/* no dependencies */
262ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (cur != ns) {
263ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			err = mSensors[drv]->setDelay(handle, ns);
264ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
265ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	} else {
266ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		/* has dependencies, choose shorter interval */
267ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (cur > ns) {
268ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			err = mSensors[drv]->setDelay(handle, ns);
26985d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev		}
270ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
271ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return err;
272ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
273ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
274ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
275ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
276ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int nbEvents = 0;
277ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    int n = 0;
278ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
279ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    do {
280ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        // see if we have some leftover from the last poll()
281ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        for (int i=0 ; count && i<numSensorDrivers ; i++) {
282ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            SensorBase* const sensor(mSensors[i]);
283ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) {
284ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                int nb = sensor->readEvents(data, count);
285ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                if (nb < count) {
286ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                    // no more data for this sensor
287ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                    mPollFds[i].revents = 0;
288ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                }
289ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				if ((0 != nb) && (acc == i)) {
290ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda					((AkmSensor*)(mSensors[akm]))->setAccel(&data[nb-1]);
291ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				}
292ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                count -= nb;
293ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                nbEvents += nb;
294ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                data += nb;
295ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            }
296ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        }
297ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
298ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        if (count) {
299ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            // we still have some room, so try to see if we can get
300ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            // some events immediately or just wait if we don't have
301ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            // anything to return
302ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            n = poll(mPollFds, numFds, nbEvents ? 0 : -1);
303ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            if (n<0) {
304ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                ALOGE("poll() failed (%s)", strerror(errno));
305ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                return -errno;
306ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            }
307ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            if (mPollFds[wake].revents & POLLIN) {
308ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                char msg;
309ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                int result = read(mPollFds[wake].fd, &msg, 1);
310ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno));
311ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg));
312ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                mPollFds[wake].revents = 0;
313ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda            }
314ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        }
315ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        // if we have events and space, go read them
316ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    } while (n && count);
317ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
318ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return nbEvents;
319ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
320ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
321ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/
322ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
323ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__close(struct hw_device_t *dev)
324ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
325ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
326ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    if (ctx) {
327ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        delete ctx;
328ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    }
329ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return 0;
330ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
331ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
332ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__activate(struct sensors_poll_device_t *dev,
333ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        int handle, int enabled) {
334ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
335ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return ctx->activate(handle, enabled);
336ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
337ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
338ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__setDelay(struct sensors_poll_device_t *dev,
339ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        int handle, int64_t ns) {
340ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
341ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return ctx->setDelay(handle, ns);
342ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
343ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
344ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__poll(struct sensors_poll_device_t *dev,
345ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        sensors_event_t* data, int count) {
346ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
347ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda    return ctx->pollEvents(data, count);
348ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
349ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
350ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/
351ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
352ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/** Open a new instance of a sensor device using name */
353ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int open_sensors(const struct hw_module_t* module, const char* id,
354ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda                        struct hw_device_t** device)
355ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
356ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        int status = -EINVAL;
357ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        sensors_poll_context_t *dev = new sensors_poll_context_t();
358ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
359ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        memset(&dev->device, 0, sizeof(sensors_poll_device_t));
360ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
361ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.common.tag = HARDWARE_DEVICE_TAG;
362ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.common.version  = 0;
363ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.common.module   = const_cast<hw_module_t*>(module);
364ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.common.close    = poll__close;
365ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.activate        = poll__activate;
366ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.setDelay        = poll__setDelay;
367ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        dev->device.poll            = poll__poll;
368ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
369ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        *device = &dev->device.common;
370ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        status = 0;
371ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
372ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda        return status;
373ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
374ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
375