sensors_mpl.cpp revision e7bd2580e55c618e98fd95619f2e4e44a9d6a332
1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
2a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro* Copyright (C) 2014 Invensense, Inc.
3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*
4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* Licensed under the Apache License, Version 2.0 (the "License");
5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* you may not use this file except in compliance with the License.
6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* You may obtain a copy of the License at
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*      http://www.apache.org/licenses/LICENSE-2.0
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* Unless required by applicable law or agreed to in writing, software
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* distributed under the License is distributed on an "AS IS" BASIS,
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* See the License for the specific language governing permissions and
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro* limitations under the License.
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FUNC_LOG LOGV("%s", __PRETTY_FUNCTION__)
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
19e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro#include <hardware_legacy/power.h>
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <hardware/sensors.h>
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <fcntl.h>
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <errno.h>
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <math.h>
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <poll.h>
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <pthread.h>
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdlib.h>
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
29c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro#include <sys/queue.h>
30c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/input.h>
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <utils/Atomic.h>
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <utils/Log.h>
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "sensors.h"
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "MPLSensor.h"
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Vendor-defined Accel Load Calibration File Method
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @param[out] Accel bias, length 3.  In HW units scaled by 2^16 in body frame
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @return '0' for a successful load, '1' otherwise
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * example: int AccelLoadConfig(long* offset);
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * End of Vendor-defined Accel Load Cal Method
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*****************************************************************************/
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* The SENSORS Module */
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOCAL_SENSORS (NumSensors + 1)
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOCAL_SENSORS (NumSensors)
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
56c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostruct handle_entry {
57c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    SIMPLEQ_ENTRY(handle_entry) entries;
58c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    int handle;
59c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro};
60c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
61c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostatic SIMPLEQ_HEAD(simplehead, handle_entry) pending_flush_items_head;
62c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostruct simplehead *headp;
63c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostatic pthread_mutex_t flush_handles_mutex = PTHREAD_MUTEX_INITIALIZER;
64c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
65e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccarostatic const char *smdWakelockStr = "significant motion";
66e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccarostatic pthread_mutex_t mSMDWakelockMutex = PTHREAD_MUTEX_INITIALIZER;
67e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct sensor_t sSensorList[LOCAL_SENSORS];
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int sensors = (sizeof(sSensorList) / sizeof(sensor_t));
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int open_sensors(const struct hw_module_t* module, const char* id,
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        struct hw_device_t** device);
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int sensors__get_sensors_list(struct sensors_module_t* module,
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                     struct sensor_t const** list)
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *list = sSensorList;
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return sensors;
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct hw_module_methods_t sensors_module_methods = {
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        open: open_sensors
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sensors_module_t HAL_MODULE_INFO_SYM = {
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        common: {
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                tag: HARDWARE_MODULE_TAG,
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                version_major: 1,
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                version_minor: 0,
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                id: SENSORS_HARDWARE_MODULE_ID,
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                name: "Invensense module",
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                author: "Invensense Inc.",
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                methods: &sensors_module_methods,
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                dso: NULL,
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                reserved: {0}
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        },
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        get_sensors_list: sensors__get_sensors_list,
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sensors_poll_context_t {
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_device_1_t device; // must be first
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t();
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ~sensors_poll_context_t();
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int activate(int handle, int enabled);
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int setDelay(int handle, int64_t ns);
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int pollEvents(sensors_event_t* data, int count);
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int query(int what, int *value);
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int flush(int handle);
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroprivate:
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    enum {
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mpl = 0,
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        compass,
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpOrient,
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpSign,
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpPed,
121a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro        numSensorDrivers,
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        numFds,
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    };
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    struct pollfd mPollFds[numFds];
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    SensorBase *mSensor;
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    CompassSensor *mCompassSensor;
128e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
129e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    /* Significant Motion wakelock support */
130e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    unsigned long mSMDEventsPending;
131e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarosensors_poll_context_t::sensors_poll_context_t() {
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* TODO: Handle external pressure sensor */
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mCompassSensor = new CompassSensor();
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
143e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    /* No significant motion events pending yet */
144e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    mSMDEventsPending = 0;
145e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   /* For Vendor-defined Accel Calibration File Load
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    * Use the Following Constructor and Pass Your Load Cal File Function
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    * MPLSensor *mplSensor = new MPLSensor(mCompassSensor, AccelLoadConfig);
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    */
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
152c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    // Initialize pending flush queue
153c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    SIMPLEQ_INIT(&pending_flush_items_head);
154c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // populate the sensor list
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors =
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mplSensor->populateSensorList(sSensorList, sizeof(sSensorList));
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mSensor = mplSensor;
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].fd = mSensor->getFd();
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].events = POLLIN;
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].revents = 0;
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].fd = mCompassSensor->getFd();
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].events = POLLIN;
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].revents = 0;
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].fd = ((MPLSensor*) mSensor)->getDmpOrientFd();
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].events = POLLPRI;
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].revents = 0;
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].fd = ((MPLSensor*) mSensor)->getDmpSignificantMotionFd();
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].events = POLLPRI;
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].revents = 0;
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpPed].fd = ((MPLSensor*) mSensor)->getDmpPedometerFd();
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpPed].events = POLLPRI;
178a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro    mPollFds[dmpPed].revents = 0;
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarosensors_poll_context_t::~sensors_poll_context_t() {
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    delete mSensor;
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    delete mCompassSensor;
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (int i = 0; i < numSensorDrivers; i++) {
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close(mPollFds[i].fd);
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::activate(int handle, int enabled) {
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int err;
194a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro    err = mSensor->enable(handle, enabled);
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return err;
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::setDelay(int handle, int64_t ns)
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->setDelay(handle, ns);
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::pollEvents(sensors_event_t *data, int count)
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VHANDLER_LOG;
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int nbEvents = 0;
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int nb, polltime = -1;
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
211e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
212e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    pthread_mutex_lock(&mSMDWakelockMutex);
213e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    if (mSMDEventsPending) {
214e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro        mSMDEventsPending--;
215e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro        /* If there are no more events pending, release our wakelock */
216e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro        if (!mSMDEventsPending)
217e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro            release_wake_lock(smdWakelockStr);
218e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    }
219e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    pthread_mutex_unlock(&mSMDWakelockMutex);
220e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
221c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    struct handle_entry *handle_element;
222c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_lock(&flush_handles_mutex);
223c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (!SIMPLEQ_EMPTY(&pending_flush_items_head)) {
224c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        sensors_event_t flushCompleteEvent;
225c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.type = SENSOR_TYPE_META_DATA;
226c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.sensor = 0;
227c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        handle_element = SIMPLEQ_FIRST(&pending_flush_items_head);
228c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.meta_data.sensor = handle_element->handle;
229c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        SIMPLEQ_REMOVE_HEAD(&pending_flush_items_head, entries);
230c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        free(handle_element);
231c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        memcpy(data, (void *) &flushCompleteEvent, sizeof(flushCompleteEvent));
232c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(1, "pollEvents() Returning fake flush event completion for handle %d",
233c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro                flushCompleteEvent.meta_data.sensor);
234c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        pthread_mutex_unlock(&flush_handles_mutex);
235c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        return 1;
236c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
237c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_unlock(&flush_handles_mutex);
238c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    polltime = ((MPLSensor*) mSensor)->getStepCountPollTime();
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // look for new events
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    nb = poll(mPollFds, numSensorDrivers, polltime);
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGI_IF(0, "poll nb=%d, count=%d, pt=%d", nb, count, polltime);
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (nb > 0) {
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        for (int i = 0; count && i < numSensorDrivers; i++) {
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (mPollFds[i].revents & (POLLIN | POLLPRI)) {
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nb = 0;
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if (i == mpl) {
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ((MPLSensor*) mSensor)->buildMpuEvent();
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == compass) {
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ((MPLSensor*) mSensor)->buildCompassEvent();
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpOrient) {
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*)mSensor)->
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                        readDmpOrientEvents(data, count);
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[dmpOrient].revents= 0;
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (isDmpScreenAutoRotationEnabled() && nb > 0) {
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        count -= nb;
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nbEvents += nb;
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        data += nb;
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpSign) {
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                    readDmpSignificantMotionEvents(data, count);
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
267e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                    if (nb) {
268e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        pthread_mutex_lock(&mSMDWakelockMutex);
269e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        /* if mSMDEventsPending != 0, the wakelock is already held */
270e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        if (!mSMDEventsPending) {
271e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            /* Hold wakelock until Sensor Services reads event */
272e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            acquire_wake_lock(PARTIAL_WAKE_LOCK, smdWakelockStr);
273e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            LOGI_IF(1, "HAL: grabbed %s wakelock", smdWakelockStr);
274e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        }
275e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        mSMDEventsPending++;
276e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        pthread_mutex_unlock(&mSMDWakelockMutex);
277e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
278e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        count -= nb;
279e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        nbEvents += nb;
280e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        data += nb;
281e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                    }
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpPed) {
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_P, 0);
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    count -= nb;
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nbEvents += nb;
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    data += nb;
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if(nb == 0) {
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->readEvents(data, count);
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    LOGI_IF(0, "sensors_mpl:readEvents() - "
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            "i=%d, nb=%d, count=%d, nbEvents=%d, "
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            "data->timestamp=%lld, data->data[0]=%f,",
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            i, nb, count, nbEvents, data->timestamp,
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data->data[0]);
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (nb > 0) {
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        count -= nb;
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nbEvents += nb;
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        data += nb;
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* to see if any step counter events */
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(((MPLSensor*) mSensor)->hasStepCountPendingEvents() == true) {
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = 0;
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_SC, 0);
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGI_IF(SensorBase::HANDLER_DATA, "sensors_mpl:readStepCount() - "
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "nb=%d, count=%d, nbEvents=%d, data->timestamp=%lld, ",
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb, count, nbEvents, data->timestamp);
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (nb > 0) {
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                count -= nb;
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nbEvents += nb;
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                data += nb;
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else if(nb == 0) {
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* to see if any step counter events */
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(((MPLSensor*) mSensor)->hasStepCountPendingEvents() == true) {
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = 0;
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_SC, 0);
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGI_IF(SensorBase::HANDLER_DATA, "sensors_mpl:readStepCount() - "
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "nb=%d, count=%d, nbEvents=%d, data->timestamp=%lld, ",
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb, count, nbEvents, data->timestamp);
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (nb > 0) {
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                count -= nb;
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nbEvents += nb;
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                data += nb;
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return nbEvents;
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::query(int what, int* value)
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->query(what, value);
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::batch(int handle, int flags, int64_t period_ns,
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                  int64_t timeout)
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->batch(handle, flags, period_ns, timeout);
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
353c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarovoid inv_pending_flush(int handle) {
354c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    struct handle_entry *the_entry;
355c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_lock(&flush_handles_mutex);
356c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    the_entry = (struct handle_entry*) malloc(sizeof(struct handle_entry));
357c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (the_entry != NULL) {
358c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(0, "Inserting %d into pending list", handle);
359c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        the_entry->handle = handle;
360c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        SIMPLEQ_INSERT_TAIL(&pending_flush_items_head, the_entry, entries);
361c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    } else {
362c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGE("ERROR malloc'ing space for pending handler flush entry");
363c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
364c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_unlock(&flush_handles_mutex);
365c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro}
366c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::flush(int handle)
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->flush(handle);
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__close(struct hw_device_t *dev)
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ctx) {
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        delete ctx;
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__activate(struct sensors_poll_device_t *dev,
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                          int handle, int enabled)
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->activate(handle, enabled);
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__setDelay(struct sensors_poll_device_t *dev,
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                          int handle, int64_t ns)
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int s= ctx->setDelay(handle, ns);
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return s;
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__poll(struct sensors_poll_device_t *dev,
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      sensors_event_t* data, int count)
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->pollEvents(data, count);
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__query(struct sensors_poll_device_1 *dev,
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int what, int *value)
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->query(what, value);
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__batch(struct sensors_poll_device_1 *dev,
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int handle, int flags, int64_t period_ns, int64_t timeout)
417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->batch(handle, flags, period_ns, timeout);
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__flush(struct sensors_poll_device_1 *dev,
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int handle)
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
427c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    int status = ctx->flush(handle);
428c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (handle == SENSORS_STEP_COUNTER_HANDLE) {
429c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(0, "creating flush completion event for handle %d", handle);
430c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        inv_pending_flush(handle);
431c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        return 0;
432c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
433c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    return status;
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** Open a new instance of a sensor device using name */
439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int open_sensors(const struct hw_module_t* module, const char* id,
440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        struct hw_device_t** device)
441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int status = -EINVAL;
444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *dev = new sensors_poll_context_t();
445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    memset(&dev->device, 0, sizeof(sensors_poll_device_1));
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.tag = HARDWARE_DEVICE_TAG;
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
450670dfdf96e62446e763f60c7c315fd7e25461242Nick Vaccaro    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_3;
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.flush           = poll__flush;
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_0;
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.module   = const_cast<hw_module_t*>(module);
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.close    = poll__close;
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.activate        = poll__activate;
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.setDelay        = poll__setDelay;
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.poll            = poll__poll;
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.batch           = poll__batch;
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *device = &dev->device.common;
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    status = 0;
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return status;
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
467