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