diff options
Diffstat (limited to 'libsensors/sensors.cpp')
-rw-r--r-- | libsensors/sensors.cpp | 374 |
1 files changed, 0 insertions, 374 deletions
diff --git a/libsensors/sensors.cpp b/libsensors/sensors.cpp deleted file mode 100644 index a0194ef..0000000 --- a/libsensors/sensors.cpp +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * 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. - */ - -#define LOG_TAG "Sensors" - -#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 <linux/input.h> - - -#include <utils/Atomic.h> -#include <utils/Log.h> - -#include "sensors.h" - -#include "LightSensor.h" -#include "ProximitySensor.h" -//#include "BoschYamaha.h" -#include "AccelSensor.h" -#include "CompassSensor.h" -#include "OrientationSensor.h" - -/*****************************************************************************/ - -#define DELAY_OUT_TIME 0x7FFFFFFF - -#define LIGHT_SENSOR_POLLTIME 2000000000 - - -#define SENSORS_ACCELERATION (1<<ID_A) -#define SENSORS_MAGNETIC_FIELD (1<<ID_M) -#define SENSORS_ORIENTATION (1<<ID_O) -#define SENSORS_LIGHT (1<<ID_L) -#define SENSORS_PROXIMITY (1<<ID_P) -#define SENSORS_GYROSCOPE (1<<ID_GY) - -#define SENSORS_ACCELERATION_HANDLE 0 -#define SENSORS_MAGNETIC_FIELD_HANDLE 1 -#define SENSORS_ORIENTATION_HANDLE 2 -#define SENSORS_LIGHT_HANDLE 3 -#define SENSORS_PROXIMITY_HANDLE 4 -#define SENSORS_GYROSCOPE_HANDLE 5 - -#define AKM_FTRACE 0 -#define AKM_DEBUG 0 -#define AKM_DATA 0 - -/*****************************************************************************/ - -/* The SENSORS Module */ -static const struct sensor_t sSensorList[] = { - - { "LIS3DH Acceleration Sensor", - "STMicroelectronics", - 1, SENSORS_ACCELERATION_HANDLE, - SENSOR_TYPE_ACCELEROMETER, RANGE_A, RESOLUTION_A, 0.20f, 10000, { } }, - { "MS-3R (YAS532) Magnetic Sensor", - "Yamaha Corporation", - 1, SENSORS_MAGNETIC_FIELD_HANDLE, - SENSOR_TYPE_MAGNETIC_FIELD, 2000.0f, 0.06f, 6.8f, 10000, { } }, - { "MS-x Orientation Sensor", - "Yamaha Corporation", - 1, SENSORS_ORIENTATION_HANDLE, - SENSOR_TYPE_ORIENTATION, 360.0f, CONVERT_O, 7.8f, 10000, { } }, - { "AL3201 Light Sensor", - "LITEON", - 1, SENSORS_LIGHT_HANDLE, - SENSOR_TYPE_LIGHT, 10240.0f, 1.0f, 0.75f, 0, { } }, -}; - - -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: "Samsung Sensor module", - author: "Samsung Electronic Company", - methods: &sensors_module_methods, - }, - get_sensors_list: sensors__get_sensors_list, -}; - -struct sensors_poll_context_t { - struct sensors_poll_device_t device; // must be first - - sensors_poll_context_t(); - ~sensors_poll_context_t(); - int activate(int handle, int enabled); - int setDelay(int handle, int64_t ns); - int pollEvents(sensors_event_t* data, int count); - -private: - enum { - light = 0, - proximity = 1, - bosch = 2, - yamaha = 3, - orientation = 4, - numSensorDrivers, - numFds, - }; - - static const size_t wake = numFds - 1; - static const char WAKE_MESSAGE = 'W'; - struct pollfd mPollFds[numFds]; - int mWritePipeFd; - SensorBase* mSensors[numSensorDrivers]; - - // For keeping track of usage (only count from system) - bool mAccelActive; - bool mMagnetActive; - bool mOrientationActive; - - int real_activate(int handle, int enabled); - - int handleToDriver(int handle) const { - switch (handle) { - - case ID_A: - return bosch; - case ID_M: - return yamaha; - case ID_O: - return orientation; - case ID_P: - return proximity; - case ID_L: - return light; - - } - return -EINVAL; - } -}; - -/*****************************************************************************/ - -sensors_poll_context_t::sensors_poll_context_t() -{ - mSensors[light] = new LightSensor(); - mPollFds[light].fd = mSensors[light]->getFd(); - mPollFds[light].events = POLLIN; - mPollFds[light].revents = 0; - - mSensors[proximity] = new ProximitySensor(); - mPollFds[proximity].fd = mSensors[proximity]->getFd(); - mPollFds[proximity].events = POLLIN; - mPollFds[proximity].revents = 0; - - mSensors[bosch] = new AccelSensor(); - mPollFds[bosch].fd = mSensors[bosch]->getFd(); - mPollFds[bosch].events = POLLIN; - mPollFds[bosch].revents = 0; - - mSensors[yamaha] = new CompassSensor(); - mPollFds[yamaha].fd = mSensors[yamaha]->getFd(); - mPollFds[yamaha].events = POLLIN; - mPollFds[yamaha].revents = 0; - - mSensors[orientation] = new OrientationSensor(); - mPollFds[orientation].fd = mSensors[orientation]->getFd(); - mPollFds[orientation].events = POLLIN; - mPollFds[orientation].revents = 0; - - int wakeFds[2]; - int result = pipe(wakeFds); - ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno)); - fcntl(wakeFds[0], F_SETFL, O_NONBLOCK); - fcntl(wakeFds[1], F_SETFL, O_NONBLOCK); - mWritePipeFd = wakeFds[1]; - - mPollFds[wake].fd = wakeFds[0]; - mPollFds[wake].events = POLLIN; - mPollFds[wake].revents = 0; - - mAccelActive = false; - mMagnetActive = false; - mOrientationActive = false; -} - -sensors_poll_context_t::~sensors_poll_context_t() { - for (int i=0 ; i<numSensorDrivers ; i++) { - delete mSensors[i]; - } - close(mPollFds[wake].fd); - close(mWritePipeFd); -} - -int sensors_poll_context_t::activate(int handle, int enabled) { - int err; - - // Orientation requires accelerometer and magnetic sensor - if (handle == ID_O) { - mOrientationActive = enabled ? true : false; - if (!mAccelActive) { - err = real_activate(ID_A, enabled); - if (err) return err; - } - if (!mMagnetActive) { - err = real_activate(ID_M, enabled); - if (err) return err; - } - } - // Keep track of magnetic and accelerometer use from system - else if (handle == ID_A) { - mAccelActive = enabled ? true : false; - // No need to enable or disable if orientation sensor is active as that will handle it - if (mOrientationActive) return 0; - } - else if (handle == ID_M) { - mMagnetActive = enabled ? true : false; - // No need to enable or disable if orientation sensor is active as that will handle it - if (mOrientationActive) return 0; - } - - return real_activate(handle, enabled); -} - -int sensors_poll_context_t::real_activate(int handle, int enabled) { - int index = handleToDriver(handle); - if (index < 0) return index; - int err = mSensors[index]->enable(handle, enabled); - if (enabled && !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) { - - int index = handleToDriver(handle); - if (index < 0) return index; - return mSensors[index]->setDelay(handle, ns); -} - -int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count) -{ - int nbEvents = 0; - int n = 0; - - do { - // see if we have some leftover from the last poll() - for (int i=0 ; count && i<numSensorDrivers ; i++) { - SensorBase* const sensor(mSensors[i]); - if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) { - int nb = sensor->readEvents(data, count); - if (nb < count) { - // no more data for this sensor - mPollFds[i].revents = 0; - } - count -= nb; - nbEvents += nb; - data += nb; - } - } - - if (count) { - // we still have some room, so try to see if we can get - // some events immediately or just wait if we don't have - // anything to return - do { - n = poll(mPollFds, numFds, nbEvents ? 0 : -1); - } while (n < 0 && errno == EINTR); - 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) -{ - 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) { - 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) { - sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; - return ctx->setDelay(handle, ns); -} - -static int poll__poll(struct sensors_poll_device_t *dev, - sensors_event_t* data, int count) { - 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) -{ - int status = -EINVAL; - sensors_poll_context_t *dev = new sensors_poll_context_t(); - - memset(&dev->device, 0, sizeof(sensors_poll_device_t)); - - dev->device.common.tag = HARDWARE_DEVICE_TAG; - dev->device.common.version = 0; - 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; - dev->device.poll = poll__poll; - - *device = &dev->device.common; - status = 0; - - return status; -} - |