diff options
Diffstat (limited to 'tilt/sensors.cpp')
-rw-r--r-- | tilt/sensors.cpp | 406 |
1 files changed, 0 insertions, 406 deletions
diff --git a/tilt/sensors.cpp b/tilt/sensors.cpp deleted file mode 100644 index 0374cd0..0000000 --- a/tilt/sensors.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright (C) 2015 Intel Corp - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <hardware/sensors.h> -#include <fcntl.h> -#include <errno.h> -#include <dirent.h> -#include <math.h> -#include <poll.h> -#include <pthread.h> -#include <stdlib.h> -#include <string.h> -#include <linux/input.h> -#include <utils/Atomic.h> -#include <utils/Log.h> -#include "sensors.h" -#include "TiltSensor.h" - -#define DELAY_OUT_TIME 0x7FFFFFFF -#define LIGHT_SENSOR_POLLTIME 2000000000 - -#define SENSORS_LIGHT_HANDLE (ID_L) -#define SENSORS_TILT_HANDLE (ID_T) - - -/* The SENSORS Module */ -static struct sensor_t sSensorList[] = { - { "TILT sensor", - "STMicroelectronics", - 1, SENSORS_TILT_HANDLE, - SENSOR_TYPE_WRIST_TILT_GESTURE, 1.0f, 1.0f, 1.0f, 0, 0, 0, - #ifdef ANDROID_L - SENSOR_STRING_TYPE_WRIST_TILT_GESTURE, NULL, 0, SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP, - #else - NULL, NULL, 0, 0, - #endif - { } }, -}; - -static int open_sensors(const struct hw_module_t* module, const char* id, - struct hw_device_t** device); - - - -static int sensors__get_sensors_list(struct sensors_module_t* module, - struct sensor_t const** list) -{ - *list = sSensorList; - return ARRAY_SIZE(sSensorList); -} - -static struct hw_module_methods_t sensors_module_methods = { - open: open_sensors -}; - -struct sensors_module_t HAL_MODULE_INFO_SYM = { - common: { - tag: HARDWARE_MODULE_TAG, - version_major: 1, - version_minor: 0, - id: SENSORS_HARDWARE_MODULE_ID, - name: "Intel MVN Sensor module", - author: "Intel MVN Company", - methods: &sensors_module_methods, - dso: 0, - reserved: {}, - }, - get_sensors_list: sensors__get_sensors_list, -}; - -struct sensors_poll_context_t { -#ifdef HAL_VERSION_GE_1_0 - struct sensors_poll_device_1 device; /* must be first */ -#else - struct sensors_poll_device_t device; /* must be first */ -#endif - sensors_poll_context_t(); - ~sensors_poll_context_t(); - int activate(int handle, int enabled); - int setDelay(int handle, int64_t ns); -#ifdef HAL_VERSION_GT_1_0 - int batch(int handle, int flags, int64_t period_ns, int64_t timeout); - int flush(int handle); -#endif - int pollEvents(sensors_event_t* data, int count); - bool getInitialized() { return mInitialized; }; - -private: - bool mInitialized; - - enum { - TILT = 0, - numSensorDrivers, /* wake pipe goes here */ - flushPipe, /* flush pipe goes here */ - numFds, - }; - - static const size_t wake = numFds - 2; - static const char WAKE_MESSAGE = 'W'; - struct pollfd mPollFds[numFds]; - int mWritePipeFd; - int mFlushWritePipeFd; - SensorBase* mSensors[numSensorDrivers]; - - int handleToDriver(int handle) const { - switch (handle) { - case ID_T: - return TILT; - } - return -EINVAL; - } -}; - - - -sensors_poll_context_t::sensors_poll_context_t() -{ - FUNC_LOG; - mInitialized = false; - /* Must clean this up early or else the destructor will make a mess */ - memset(mSensors, 0, sizeof(mSensors)); - - mSensors[TILT] = new TiltSensor(); - mPollFds[TILT].fd = mSensors[TILT]->getFd(); - mPollFds[TILT].events = POLLIN; - mPollFds[TILT].revents = 0; - - int wakeFds[2]; - int result = pipe(wakeFds); - ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno)); - result = fcntl(wakeFds[0], F_SETFL, O_NONBLOCK); - ALOGE_IF(result<0, "error setting wakeFds[0] access mode (%s)", strerror(errno)); - result = fcntl(wakeFds[1], F_SETFL, O_NONBLOCK); - ALOGE_IF(result<0, "error setting wakeFds[1] access mode (%s)", strerror(errno)); - mWritePipeFd = wakeFds[1]; - - mPollFds[wake].fd = wakeFds[0]; - mPollFds[wake].events = POLLIN; - mPollFds[wake].revents = 0; - - int flushFds[2]; - result = pipe(flushFds); - ALOGE_IF(result<0, "error creating flush pipe (%s)", strerror(errno)); - result = fcntl(flushFds[0], F_SETFL, O_NONBLOCK); - ALOGE_IF(result<0, "error setting flushFds[0] access mode (%s)", strerror(errno)); - result = fcntl(flushFds[1], F_SETFL, O_NONBLOCK); - ALOGE_IF(result<0, "error setting flushFds[1] access mode (%s)", strerror(errno)); - mFlushWritePipeFd = flushFds[1]; - - mPollFds[flushPipe].fd = flushFds[0]; - mPollFds[flushPipe].events = POLLIN; - mPollFds[flushPipe].revents = 0; - mInitialized = true; -} - -sensors_poll_context_t::~sensors_poll_context_t() -{ - FUNC_LOG; - for (int i=0 ; i<numSensorDrivers ; i++) - delete mSensors[i]; - - close(mPollFds[wake].fd); - close(mWritePipeFd); - close(mPollFds[flushPipe].fd); - close(mFlushWritePipeFd); - mInitialized = false; -} - -int sensors_poll_context_t::activate(int handle, int enabled) -{ - FUNC_LOG; - if (!mInitialized) - return -EINVAL; - - int index = handleToDriver(handle); - if (index < 0) - return index; - int err = mSensors[index]->enable(handle, enabled); - if (!err) { - const char wakeMessage(WAKE_MESSAGE); - int result = write(mWritePipeFd, &wakeMessage, 1); - ALOGE_IF(result<0, "error sending wake message (%s)", strerror(errno)); - } - return err; -} - -int sensors_poll_context_t::setDelay(int handle, int64_t ns) -{ - FUNC_LOG; - int index = handleToDriver(handle); - if (index < 0) - return index; - - return mSensors[index]->setDelay(handle, ns); -} - -#ifdef HAL_VERSION_GT_1_0 -int sensors_poll_context_t::batch(int handle, int flags, int64_t period_ns, int64_t timeout) -{ - FUNC_LOG; - int index = handleToDriver(handle); - if (index < 0) - return index; - - return mSensors[index]->batch(handle, flags, period_ns, timeout); -} - -int sensors_poll_context_t::flush(int handle) -{ - FUNC_LOG; - int result; - sensors_event_t flush_event_data; - - int index = handleToDriver(handle); - if (index < 0) return index; - - result = mSensors[index]->isActivated(handle); - if (!result) - return -EINVAL; - - flush_event_data.sensor = 0; - flush_event_data.timestamp = 0; - flush_event_data.meta_data.sensor = handle; - flush_event_data.meta_data.what = META_DATA_FLUSH_COMPLETE; - flush_event_data.type = SENSOR_TYPE_META_DATA; - flush_event_data.version = META_DATA_VERSION; - - result = write(mFlushWritePipeFd, &flush_event_data, sizeof(sensors_event_t)); - ALOGE_IF(result<0, "error sending flush event data (%s)", strerror(errno)); - - return (result >= 0 ? 0 : result); -} - -#endif - -int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count) -{ - FUNC_LOG; - int nbEvents = 0; - int n = 0; - - do { - for (int i=0 ; count && i<numSensorDrivers; i++) { - SensorBase* const sensor(mSensors[i]); - /* See if we have some pending events from the last poll() */ - if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) { - int nb = sensor->readEvents(data, count); - - /* no more data for this sensor */ - if (nb < count) - mPollFds[i].revents = 0; - - count -= nb; - nbEvents += nb; - data += nb; - } - } - - /* flush event data */ - if (count) { - if (mPollFds[flushPipe].revents & POLLIN) { - int nb = read(mPollFds[flushPipe].fd, data, count * sizeof(sensors_event_t)); - if (nb < 0) { - ALOGE("error reading from flush pipe (%s)", strerror(errno)); - return -errno; - } - nb = nb/sizeof(sensors_event_t); - mPollFds[flushPipe].revents = 0; - count -= nb; - nbEvents += nb; - data += nb; - } - } - - - if (count) { - ALOGV("%s: start poll syscall to kernel", __func__); - n = poll(mPollFds, numFds, nbEvents ? 0 : -1); - if (n < 0) { - ALOGE("poll() failed (%s)", strerror(errno)); - return -errno; - } - if (mPollFds[wake].revents & POLLIN) { - char msg; - int result = read(mPollFds[wake].fd, &msg, 1); - ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno)); - ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg)); - mPollFds[wake].revents = 0; - } - } - /* if we have events and space, go read them */ - } while (n && count); - - return nbEvents; -} - -static int poll__close(struct hw_device_t *dev) -{ - FUNC_LOG; - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - if (ctx) - delete ctx; - - return 0; -} - -static int poll__activate(struct sensors_poll_device_t *dev, - int handle, int enabled) -{ - FUNC_LOG; - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - return ctx->activate(handle, enabled); -} - -static int poll__setDelay(struct sensors_poll_device_t *dev, - int handle, int64_t ns) -{ - FUNC_LOG; - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - return ctx->setDelay(handle, ns); -} - -#ifdef HAL_VERSION_GT_1_0 -static int poll__batch(struct sensors_poll_device_1 *dev, - int handle, int flags, int64_t period_ns, int64_t timeout) -{ - FUNC_LOG; - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - return ctx->batch(handle, flags, period_ns, timeout); -} - -static int poll_flush(struct sensors_poll_device_1 *dev, int handle) -{ - FUNC_LOG; - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - return ctx->flush(handle); -} -#endif - -static int poll__poll(struct sensors_poll_device_t *dev, - sensors_event_t* data, int count) -{ - FUNC_LOG; - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - return ctx->pollEvents(data, count); -} - -/* Open a new instance of a sensor device using name */ -static int open_sensors(const struct hw_module_t* module, const char* id, - struct hw_device_t** device) -{ - FUNC_LOG; - int status = -EINVAL; - sensors_poll_context_t *dev = new sensors_poll_context_t(); - - if (!dev->getInitialized()) { - ALOGE("Failed to open the sensors (%s)", id); - return status; - } -#ifdef HAL_VERSION_GE_1_0 - memset(&dev->device, 0, sizeof(sensors_poll_device_1)); -#else - memset(&dev->device, 0, sizeof(sensors_poll_device_t)); -#endif - - dev->device.common.tag = HARDWARE_DEVICE_TAG; -#ifdef ANDROID_L - dev->device.common.version = SENSORS_DEVICE_API_VERSION_1_3; -#endif -#ifdef ANDROID_KK - dev->device.common.version = SENSORS_DEVICE_API_VERSION_1_1; -#endif -#ifdef ANDROID_JBMR2 - dev->device.common.version = SENSORS_DEVICE_API_VERSION_1_0; -#endif -#ifdef ANDROID_JB - dev->device.common.version = 0; -#endif - dev->device.common.module = const_cast<hw_module_t*>(module); - dev->device.common.close = poll__close; - dev->device.activate = poll__activate; - dev->device.setDelay = poll__setDelay; -#ifdef HAL_VERSION_GT_1_0 - dev->device.batch = poll__batch; - dev->device.flush = poll_flush; -#endif - dev->device.poll = poll__poll; - - *device = &dev->device.common; - status = 0; - - return status; -} |