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