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
33e397638747e057a7e9fad17ca07ebda5a4d47760Steven Moreland#include <cutils/atomic.h>
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <utils/Log.h>
35822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro#include <utils/SystemClock.h>
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "sensors.h"
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "MPLSensor.h"
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
40822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro/*
41822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro * Vendor-defined Accel Load Calibration File Method
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @param[out] Accel bias, length 3.  In HW units scaled by 2^16 in body frame
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @return '0' for a successful load, '1' otherwise
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * example: int AccelLoadConfig(long* offset);
45822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro * End of Vendor-defined Accel Load Cal Method
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*****************************************************************************/
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* The SENSORS Module */
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOCAL_SENSORS (NumSensors + 1)
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#else
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOCAL_SENSORS (NumSensors)
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
57c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostruct handle_entry {
58c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    SIMPLEQ_ENTRY(handle_entry) entries;
59c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    int handle;
60c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro};
61c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
62c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostatic SIMPLEQ_HEAD(simplehead, handle_entry) pending_flush_items_head;
63c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostruct simplehead *headp;
64c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarostatic pthread_mutex_t flush_handles_mutex = PTHREAD_MUTEX_INITIALIZER;
65c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
66e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccarostatic const char *smdWakelockStr = "significant motion";
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
85980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Linstatic int sensors_set_operation_mode(unsigned int mode)
86980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin{
87980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin    LOGI("%s", __FUNCTION__);
88980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin    LOGI("%s: stub function: ignoring mode request (%d)", __FUNCTION__,
89980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin                 mode);
90980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin    return 0;
91980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin}
92980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sensors_module_t HAL_MODULE_INFO_SYM = {
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        common: {
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                tag: HARDWARE_MODULE_TAG,
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                version_major: 1,
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                version_minor: 0,
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                id: SENSORS_HARDWARE_MODULE_ID,
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                name: "Invensense module",
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                author: "Invensense Inc.",
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                methods: &sensors_module_methods,
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                dso: NULL,
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                reserved: {0}
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        },
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        get_sensors_list: sensors__get_sensors_list,
106980569f04a36cc492e61c357a1c06d2386b0586fChing Tzung Lin        set_operation_mode: sensors_set_operation_mode
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct sensors_poll_context_t {
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_device_1_t device; // must be first
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t();
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    ~sensors_poll_context_t();
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int activate(int handle, int enabled);
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int setDelay(int handle, int64_t ns);
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int pollEvents(sensors_event_t* data, int count);
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int query(int what, int *value);
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
1199b7ebb5143dd692c20fc9348ae999450133dad57Nick Vaccaro#if defined ANDROID_KITKAT || defined ANDROID_LOLLIPOP
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int flush(int handle);
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
122822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro    int64_t getTimestamp();
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroprivate:
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    enum {
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        mpl = 0,
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        compass,
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpOrient,
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpSign,
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        dmpPed,
131a73d574dda77810ae10046c68e7a9aa38ad77603Nick Vaccaro        numSensorDrivers,
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        numFds,
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    };
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    struct pollfd mPollFds[numFds];
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    SensorBase *mSensor;
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    CompassSensor *mCompassSensor;
138e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
139e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    /* Significant Motion wakelock support */
140dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro    bool mSMDWakelockHeld;
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarosensors_poll_context_t::sensors_poll_context_t() {
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VFUNC_LOG;
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* TODO: Handle external pressure sensor */
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mCompassSensor = new CompassSensor();
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
152e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    /* No significant motion events pending yet */
153dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro    mSMDWakelockHeld = false;
154e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   /* For Vendor-defined Accel Calibration File Load
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    * Use the Following Constructor and Pass Your Load Cal File Function
157822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro    *
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    * MPLSensor *mplSensor = new MPLSensor(mCompassSensor, AccelLoadConfig);
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    */
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
161c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    // Initialize pending flush queue
162c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    SIMPLEQ_INIT(&pending_flush_items_head);
163c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // populate the sensor list
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors =
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            mplSensor->populateSensorList(sSensorList, sizeof(sSensorList));
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mSensor = mplSensor;
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].fd = mSensor->getFd();
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].events = POLLIN;
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[mpl].revents = 0;
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].fd = mCompassSensor->getFd();
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].events = POLLIN;
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[compass].revents = 0;
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].fd = ((MPLSensor*) mSensor)->getDmpOrientFd();
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].events = POLLPRI;
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpOrient].revents = 0;
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].fd = ((MPLSensor*) mSensor)->getDmpSignificantMotionFd();
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].events = POLLPRI;
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpSign].revents = 0;
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpPed].fd = ((MPLSensor*) mSensor)->getDmpPedometerFd();
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    mPollFds[dmpPed].events = POLLPRI;
187822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro    mPollFds[dmpPed].revents = 0;
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarosensors_poll_context_t::~sensors_poll_context_t() {
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    delete mSensor;
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    delete mCompassSensor;
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    for (int i = 0; i < numSensorDrivers; i++) {
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        close(mPollFds[i].fd);
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::activate(int handle, int enabled) {
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int err;
203822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro    err = mSensor->enable(handle, enabled);
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return err;
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::setDelay(int handle, int64_t ns)
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->setDelay(handle, ns);
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
213822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaroint64_t sensors_poll_context_t::getTimestamp()
214822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro{
215822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro    return android::elapsedRealtimeNano();
216822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro}
217822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::pollEvents(sensors_event_t *data, int count)
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    VHANDLER_LOG;
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int nbEvents = 0;
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int nb, polltime = -1;
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
225dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro    if (mSMDWakelockHeld) {
226dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro        mSMDWakelockHeld = false;
227dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro        release_wake_lock(smdWakelockStr);
228e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro    }
229e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
230c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    struct handle_entry *handle_element;
231c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_lock(&flush_handles_mutex);
232c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (!SIMPLEQ_EMPTY(&pending_flush_items_head)) {
233c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        sensors_event_t flushCompleteEvent;
234c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.type = SENSOR_TYPE_META_DATA;
235c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.sensor = 0;
236c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        handle_element = SIMPLEQ_FIRST(&pending_flush_items_head);
237c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        flushCompleteEvent.meta_data.sensor = handle_element->handle;
238c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        SIMPLEQ_REMOVE_HEAD(&pending_flush_items_head, entries);
239c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        free(handle_element);
240c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        memcpy(data, (void *) &flushCompleteEvent, sizeof(flushCompleteEvent));
241c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(1, "pollEvents() Returning fake flush event completion for handle %d",
242c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro                flushCompleteEvent.meta_data.sensor);
243c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        pthread_mutex_unlock(&flush_handles_mutex);
244c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        return 1;
245c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
246c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_unlock(&flush_handles_mutex);
247c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    polltime = ((MPLSensor*) mSensor)->getStepCountPollTime();
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // look for new events
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    nb = poll(mPollFds, numSensorDrivers, polltime);
252822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro    LOGI_IF(0, "poll nb=%d, count=%d, pt=%d ts=%lld", nb, count, polltime, getTimestamp());
253d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro    if (nb == 0 && count > 0) {
254d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro        /* to see if any step counter events */
255d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro        if(((MPLSensor*) mSensor)->hasStepCountPendingEvents() == true) {
256d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro            nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
257d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro                            data, count, ID_SC, 0);
258d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro            LOGI_IF(SensorBase::HANDLER_DATA, "sensors_mpl:readStepCount() - "
259d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro                    "nb=%d, count=%d, nbEvents=%d, data->timestamp=%lld, ",
260d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro                    nb, count, nbEvents, data->timestamp);
261d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro            if (nb > 0) {
262d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro                count -= nb;
263d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro                nbEvents += nb;
264d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro                data += nb;
265d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro            }
266d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro        }
267d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro    } else while (nb > 0) {
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        for (int i = 0; count && i < numSensorDrivers; i++) {
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (mPollFds[i].revents & (POLLIN | POLLPRI)) {
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nb = 0;
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if (i == mpl) {
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ((MPLSensor*) mSensor)->buildMpuEvent();
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == compass) {
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ((MPLSensor*) mSensor)->buildCompassEvent();
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpOrient) {
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*)mSensor)->
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                        readDmpOrientEvents(data, count);
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[dmpOrient].revents= 0;
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (isDmpScreenAutoRotationEnabled() && nb > 0) {
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        count -= nb;
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nbEvents += nb;
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        data += nb;
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpSign) {
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                    readDmpSignificantMotionEvents(data, count);
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
290e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                    if (nb) {
291dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro                        if (!mSMDWakelockHeld) {
292e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            /* Hold wakelock until Sensor Services reads event */
293e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            acquire_wake_lock(PARTIAL_WAKE_LOCK, smdWakelockStr);
294e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                            LOGI_IF(1, "HAL: grabbed %s wakelock", smdWakelockStr);
295dda0105984d0d83ffbdc3644d7d4735a86b88867Nick Vaccaro                            mSMDWakelockHeld = true;
296e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        }
297e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro
298e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        count -= nb;
299e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        nbEvents += nb;
300e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                        data += nb;
301e7bd2580e55c618e98fd95619f2e4e44a9d6a332Nick Vaccaro                    }
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else if (i == dmpPed) {
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_P, 0);
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    mPollFds[i].revents = 0;
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    count -= nb;
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nbEvents += nb;
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    data += nb;
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
310d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if(nb == 0) {
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb = ((MPLSensor*) mSensor)->readEvents(data, count);
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    LOGI_IF(0, "sensors_mpl:readEvents() - "
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            "i=%d, nb=%d, count=%d, nbEvents=%d, "
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            "data->timestamp=%lld, data->data[0]=%f,",
316822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaro                            i, nb, count, nbEvents, data->timestamp,
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data->data[0]);
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (nb > 0) {
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        count -= nb;
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nbEvents += nb;
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        data += nb;
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        /* to see if any step counter events */
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if(((MPLSensor*) mSensor)->hasStepCountPendingEvents() == true) {
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = 0;
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = ((MPLSensor*) mSensor)->readDmpPedometerEvents(
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            data, count, ID_SC, 0);
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            LOGI_IF(SensorBase::HANDLER_DATA, "sensors_mpl:readStepCount() - "
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    "nb=%d, count=%d, nbEvents=%d, data->timestamp=%lld, ",
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nb, count, nbEvents, data->timestamp);
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (nb > 0) {
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                count -= nb;
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nbEvents += nb;
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                data += nb;
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
341d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro        if (count > 0) {
342d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro            // We still have room for more events, try an immediate poll for more data
343d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro            nb = poll(mPollFds, numSensorDrivers, 0);
344d47d7879a03b983dc3546b717c729f7294e16c7fNick Vaccaro        } else {
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            nb = 0;
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return nbEvents;
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::query(int what, int* value)
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->query(what, value);
355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
357822ea53e105f41ec8b861f03ae9ea7f0111cef2bNick Vaccaroint sensors_poll_context_t::batch(int handle, int flags, int64_t period_ns,
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                                  int64_t timeout)
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->batch(handle, flags, period_ns, timeout);
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
3649b7ebb5143dd692c20fc9348ae999450133dad57Nick Vaccaro#if defined ANDROID_KITKAT || defined ANDROID_LOLLIPOP
3659b7ebb5143dd692c20fc9348ae999450133dad57Nick Vaccaro
366c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccarovoid inv_pending_flush(int handle) {
367c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    struct handle_entry *the_entry;
368c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_lock(&flush_handles_mutex);
369c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    the_entry = (struct handle_entry*) malloc(sizeof(struct handle_entry));
370c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (the_entry != NULL) {
371c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(0, "Inserting %d into pending list", handle);
372c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        the_entry->handle = handle;
373c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        SIMPLEQ_INSERT_TAIL(&pending_flush_items_head, the_entry, entries);
374c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    } else {
375c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGE("ERROR malloc'ing space for pending handler flush entry");
376c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
377c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    pthread_mutex_unlock(&flush_handles_mutex);
378c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro}
379c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint sensors_poll_context_t::flush(int handle)
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return mSensor->flush(handle);
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__close(struct hw_device_t *dev)
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (ctx) {
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        delete ctx;
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__activate(struct sensors_poll_device_t *dev,
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                          int handle, int enabled)
401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->activate(handle, enabled);
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__setDelay(struct sensors_poll_device_t *dev,
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                          int handle, int64_t ns)
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int s= ctx->setDelay(handle, ns);
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return s;
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__poll(struct sensors_poll_device_t *dev,
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      sensors_event_t* data, int count)
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->pollEvents(data, count);
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__query(struct sensors_poll_device_1 *dev,
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int what, int *value)
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->query(what, value);
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__batch(struct sensors_poll_device_1 *dev,
429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int handle, int flags, int64_t period_ns, int64_t timeout)
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return ctx->batch(handle, flags, period_ns, timeout);
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
4359b7ebb5143dd692c20fc9348ae999450133dad57Nick Vaccaro#if defined ANDROID_KITKAT || defined ANDROID_LOLLIPOP
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int poll__flush(struct sensors_poll_device_1 *dev,
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                      int handle)
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
440c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    int status = ctx->flush(handle);
441c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    if (handle == SENSORS_STEP_COUNTER_HANDLE) {
442c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        LOGI_IF(0, "creating flush completion event for handle %d", handle);
443c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        inv_pending_flush(handle);
444c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro        return 0;
445c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    }
446c6a022ca9e5b696874fb3ce0cc988f949a06533eNick Vaccaro    return status;
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************/
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** Open a new instance of a sensor device using name */
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int open_sensors(const struct hw_module_t* module, const char* id,
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        struct hw_device_t** device)
454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FUNC_LOG;
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int status = -EINVAL;
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    sensors_poll_context_t *dev = new sensors_poll_context_t();
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    memset(&dev->device, 0, sizeof(sensors_poll_device_1));
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.tag = HARDWARE_DEVICE_TAG;
462670dfdf96e62446e763f60c7c315fd7e25461242Nick Vaccaro    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_3;
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.flush           = poll__flush;
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.module   = const_cast<hw_module_t*>(module);
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.common.close    = poll__close;
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.activate        = poll__activate;
467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.setDelay        = poll__setDelay;
468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dev->device.poll            = poll__poll;
469a38914db2fd5b3192bfa8fbd46269aa860d7937bNick Vaccaro    dev->device.batch           = poll__batch;
470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *device = &dev->device.common;
472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    status = 0;
473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return status;
475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
476