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