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 Vaccaro
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct sensor_t sSensorList[LOCAL_SENSORS];
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int sensors = (sizeof(sSensorList) / sizeof(sensor_t));
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int open_sensors(const struct hw_module_t* module, const char* id,
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        struct hw_device_t** device);
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int sensors__get_sensors_list(struct sensors_module_t* module,
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                     struct sensor_t const** list)
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *list = sSensorList;
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return sensors;
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct hw_module_methods_t sensors_module_methods = {
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        open: open_sensors
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sensors_module_t HAL_MODULE_INFO_SYM = {
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        common: {
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                tag: HARDWARE_MODULE_TAG,
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                version_major: 1,
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                version_minor: 0,
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                id: SENSORS_HARDWARE_MODULE_ID,
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                name: "Invensense module",
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                author: "Invensense Inc.",
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                methods: &sensors_module_methods,
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                dso: NULL,
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                reserved: {0}
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        },
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        get_sensors_list: sensors__get_sensors_list,
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sensors_poll_context_t {
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_device_1_t device; // must be first
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t();
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ~sensors_poll_context_t();
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int activate(int handle, int enabled);
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int setDelay(int handle, int64_t ns);
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int pollEvents(sensors_event_t* data, int count);
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int query(int what, int *value);
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int flush(int handle);
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroprivate:
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    enum {
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mpl = 0,
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        compass,
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpOrient,
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpSign,
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpPed,
120a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro        numSensorDrivers,
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        numFds,
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    };
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    struct pollfd mPollFds[numFds];
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    SensorBase *mSensor;
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    CompassSensor *mCompassSensor;
127e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
128e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    /* Significant Motion wakelock support */
129dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro    bool mSMDWakelockHeld;
130e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarosensors_poll_context_t::sensors_poll_context_t() {
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* TODO: Handle external pressure sensor */
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mCompassSensor = new CompassSensor();
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
142e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    /* No significant motion events pending yet */
143dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro    mSMDWakelockHeld = false;
144e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   /* For Vendor-defined Accel Calibration File Load
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    * Use the Following Constructor and Pass Your Load Cal File Function
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    * MPLSensor *mplSensor = new MPLSensor(mCompassSensor, AccelLoadConfig);
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    */
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
151c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    // Initialize pending flush queue
152c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    SIMPLEQ_INIT(&pending_flush_items_head);
153c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // populate the sensor list
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors =
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mplSensor->populateSensorList(sSensorList, sizeof(sSensorList));
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mSensor = mplSensor;
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].fd = mSensor->getFd();
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].events = POLLIN;
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].revents = 0;
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].fd = mCompassSensor->getFd();
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].events = POLLIN;
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].revents = 0;
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].fd = ((MPLSensor*) mSensor)->getDmpOrientFd();
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].events = POLLPRI;
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].revents = 0;
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].fd = ((MPLSensor*) mSensor)->getDmpSignificantMotionFd();
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].events = POLLPRI;
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].revents = 0;
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpPed].fd = ((MPLSensor*) mSensor)->getDmpPedometerFd();
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpPed].events = POLLPRI;
177a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro    mPollFds[dmpPed].revents = 0;
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarosensors_poll_context_t::~sensors_poll_context_t() {
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    delete mSensor;
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    delete mCompassSensor;
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (int i = 0; i < numSensorDrivers; i++) {
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close(mPollFds[i].fd);
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::activate(int handle, int enabled) {
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int err;
193a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro    err = mSensor->enable(handle, enabled);
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return err;
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::setDelay(int handle, int64_t ns)
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->setDelay(handle, ns);
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::pollEvents(sensors_event_t *data, int count)
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VHANDLER_LOG;
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int nbEvents = 0;
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int nb, polltime = -1;
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
210dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro    if (mSMDWakelockHeld) {
211dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro        mSMDWakelockHeld = false;
212dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro        release_wake_lock(smdWakelockStr);
213e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    }
214e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
215c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    struct handle_entry *handle_element;
216c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_lock(&flush_handles_mutex);
217c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (!SIMPLEQ_EMPTY(&pending_flush_items_head)) {
218c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        sensors_event_t flushCompleteEvent;
219c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.type = SENSOR_TYPE_META_DATA;
220c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.sensor = 0;
221c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        handle_element = SIMPLEQ_FIRST(&pending_flush_items_head);
222c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.meta_data.sensor = handle_element->handle;
223c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        SIMPLEQ_REMOVE_HEAD(&pending_flush_items_head, entries);
224c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        free(handle_element);
225c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        memcpy(data, (void *) &flushCompleteEvent, sizeof(flushCompleteEvent));
226c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(1, "pollEvents() Returning fake flush event completion for handle %d",
227c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro                flushCompleteEvent.meta_data.sensor);
228c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        pthread_mutex_unlock(&flush_handles_mutex);
229c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        return 1;
230c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
231c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_unlock(&flush_handles_mutex);
232c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    polltime = ((MPLSensor*) mSensor)->getStepCountPollTime();
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // look for new events
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    nb = poll(mPollFds, numSensorDrivers, polltime);
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOGI_IF(0, "poll nb=%d, count=%d, pt=%d", nb, count, polltime);
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (nb > 0) {
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        for (int i = 0; count && i < numSensorDrivers; i++) {
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (mPollFds[i].revents & (POLLIN | POLLPRI)) {
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nb = 0;
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if (i == mpl) {
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ((MPLSensor*) mSensor)->buildMpuEvent();
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == compass) {
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ((MPLSensor*) mSensor)->buildCompassEvent();
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpOrient) {
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*)mSensor)->
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                        readDmpOrientEvents(data, count);
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[dmpOrient].revents= 0;
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (isDmpScreenAutoRotationEnabled() && nb > 0) {
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        count -= nb;
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nbEvents += nb;
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        data += nb;
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpSign) {
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                    readDmpSignificantMotionEvents(data, count);
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
261e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                    if (nb) {
262dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro                        if (!mSMDWakelockHeld) {
263e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            /* Hold wakelock until Sensor Services reads event */
264e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            acquire_wake_lock(PARTIAL_WAKE_LOCK, smdWakelockStr);
265e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            LOGI_IF(1, "HAL: grabbed %s wakelock", smdWakelockStr);
266dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro                            mSMDWakelockHeld = true;
267e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        }
268e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
269e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        count -= nb;
270e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        nbEvents += nb;
271e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        data += nb;
272e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                    }
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpPed) {
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_P, 0);
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    count -= nb;
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nbEvents += nb;
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    data += nb;
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if(nb == 0) {
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->readEvents(data, count);
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    LOGI_IF(0, "sensors_mpl:readEvents() - "
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            "i=%d, nb=%d, count=%d, nbEvents=%d, "
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            "data->timestamp=%lld, data->data[0]=%f,",
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            i, nb, count, nbEvents, data->timestamp,
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data->data[0]);
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (nb > 0) {
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        count -= nb;
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nbEvents += nb;
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        data += nb;
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* to see if any step counter events */
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(((MPLSensor*) mSensor)->hasStepCountPendingEvents() == true) {
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = 0;
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_SC, 0);
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGI_IF(SensorBase::HANDLER_DATA, "sensors_mpl:readStepCount() - "
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "nb=%d, count=%d, nbEvents=%d, data->timestamp=%lld, ",
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb, count, nbEvents, data->timestamp);
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (nb > 0) {
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                count -= nb;
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nbEvents += nb;
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                data += nb;
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else if(nb == 0) {
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* to see if any step counter events */
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(((MPLSensor*) mSensor)->hasStepCountPendingEvents() == true) {
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = 0;
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_SC, 0);
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGI_IF(SensorBase::HANDLER_DATA, "sensors_mpl:readStepCount() - "
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "nb=%d, count=%d, nbEvents=%d, data->timestamp=%lld, ",
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb, count, nbEvents, data->timestamp);
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (nb > 0) {
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                count -= nb;
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nbEvents += nb;
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                data += nb;
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return nbEvents;
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::query(int what, int* value)
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->query(what, value);
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::batch(int handle, int flags, int64_t period_ns,
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                  int64_t timeout)
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->batch(handle, flags, period_ns, timeout);
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
344c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarovoid inv_pending_flush(int handle) {
345c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    struct handle_entry *the_entry;
346c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_lock(&flush_handles_mutex);
347c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    the_entry = (struct handle_entry*) malloc(sizeof(struct handle_entry));
348c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (the_entry != NULL) {
349c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(0, "Inserting %d into pending list", handle);
350c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        the_entry->handle = handle;
351c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        SIMPLEQ_INSERT_TAIL(&pending_flush_items_head, the_entry, entries);
352c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    } else {
353c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGE("ERROR malloc'ing space for pending handler flush entry");
354c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
355c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_unlock(&flush_handles_mutex);
356c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro}
357c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::flush(int handle)
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->flush(handle);
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__close(struct hw_device_t *dev)
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ctx) {
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        delete ctx;
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__activate(struct sensors_poll_device_t *dev,
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                          int handle, int enabled)
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->activate(handle, enabled);
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__setDelay(struct sensors_poll_device_t *dev,
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                          int handle, int64_t ns)
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int s= ctx->setDelay(handle, ns);
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return s;
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__poll(struct sensors_poll_device_t *dev,
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      sensors_event_t* data, int count)
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->pollEvents(data, count);
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__query(struct sensors_poll_device_1 *dev,
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int what, int *value)
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->query(what, value);
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__batch(struct sensors_poll_device_1 *dev,
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int handle, int flags, int64_t period_ns, int64_t timeout)
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->batch(handle, flags, period_ns, timeout);
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__flush(struct sensors_poll_device_1 *dev,
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int handle)
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
418c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    int status = ctx->flush(handle);
419c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (handle == SENSORS_STEP_COUNTER_HANDLE) {
420c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(0, "creating flush completion event for handle %d", handle);
421c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        inv_pending_flush(handle);
422c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        return 0;
423c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
424c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    return status;
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** Open a new instance of a sensor device using name */
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int open_sensors(const struct hw_module_t* module, const char* id,
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        struct hw_device_t** device)
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int status = -EINVAL;
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *dev = new sensors_poll_context_t();
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    memset(&dev->device, 0, sizeof(sensors_poll_device_1));
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.tag = HARDWARE_DEVICE_TAG;
440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#if defined ANDROID_KITKAT
441670dfdf96e62446e763f60c7c315fd7e25461242Nick Vaccaro    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_3;
442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.flush           = poll__flush;
443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else
444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_0;
445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.module   = const_cast<hw_module_t*>(module);
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.close    = poll__close;
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.activate        = poll__activate;
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.setDelay        = poll__setDelay;
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.poll            = poll__poll;
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.batch           = poll__batch;
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *device = &dev->device.common;
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    status = 0;
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return status;
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
458