diff options
Diffstat (limited to 'services/sensorservice/SensorDevice.cpp')
-rw-r--r-- | services/sensorservice/SensorDevice.cpp | 214 |
1 files changed, 203 insertions, 11 deletions
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index d82a7e2..88d738c 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -31,6 +31,11 @@ #include "SensorDevice.h" #include "SensorService.h" +#include "sensors_deprecated.h" +#ifdef USE_LGE_ALS_DUMMY +#include <fcntl.h> +#endif + namespace android { // --------------------------------------------------------------------------- class BatteryService : public Singleton<BatteryService> { @@ -98,8 +103,31 @@ ANDROID_SINGLETON_STATIC_INSTANCE(BatteryService) ANDROID_SINGLETON_STATIC_INSTANCE(SensorDevice) +#ifdef USE_LGE_ALS_DUMMY +static ssize_t addDummyLGESensor(sensor_t const **list, ssize_t count) { + struct sensor_t dummy_light = { + name : "Dummy LGE-Star light sensor", + vendor : "CyanogenMod", + version : 1, + handle : SENSOR_TYPE_LIGHT, + type : SENSOR_TYPE_LIGHT, + maxRange : 20, + resolution : 0.1, + power : 20, + }; + void * new_list = malloc((count+1)*sizeof(sensor_t)); + new_list = memcpy(new_list, *list, count*sizeof(sensor_t)); + ((sensor_t *)new_list)[count] = dummy_light; + *list = (sensor_t const *)new_list; + count++; + return count; +} +#endif + SensorDevice::SensorDevice() : mSensorDevice(0), + mOldSensorsEnabled(0), + mOldSensorsCompatMode(false), mSensorModule(0) { status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, @@ -109,19 +137,56 @@ SensorDevice::SensorDevice() SENSORS_HARDWARE_MODULE_ID, strerror(-err)); if (mSensorModule) { +#ifdef ENABLE_SENSORS_COMPAT +#ifdef SENSORS_NO_OPEN_CHECK + sensors_control_open(&mSensorModule->common, &mSensorControlDevice) ; + sensors_data_open(&mSensorModule->common, &mSensorDataDevice) ; + mOldSensorsCompatMode = true; +#else + if (!sensors_control_open(&mSensorModule->common, &mSensorControlDevice)) { + if (sensors_data_open(&mSensorModule->common, &mSensorDataDevice)) { + LOGE("couldn't open data device in backwards-compat mode for module %s (%s)", + SENSORS_HARDWARE_MODULE_ID, strerror(-err)); + } else { + LOGD("Opened sensors in backwards compat mode"); + mOldSensorsCompatMode = true; + } + } else { + LOGE("couldn't open control device in backwards-compat mode for module %s (%s)", + SENSORS_HARDWARE_MODULE_ID, strerror(-err)); + } +#endif +#else err = sensors_open(&mSensorModule->common, &mSensorDevice); - LOGE_IF(err, "couldn't open device for module %s (%s)", SENSORS_HARDWARE_MODULE_ID, strerror(-err)); +#endif + - if (mSensorDevice) { + if (mSensorDevice || mOldSensorsCompatMode) { sensor_t const* list; ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list); + +#ifdef USE_LGE_ALS_DUMMY + count = addDummyLGESensor(&list, count); +#endif + + if (mOldSensorsCompatMode) { + mOldSensorsList = list; + mOldSensorsCount = count; + mSensorDataDevice->data_open(mSensorDataDevice, + mSensorControlDevice->open_data_source(mSensorControlDevice)); + } + mActivationCount.setCapacity(count); Info model; for (size_t i=0 ; i<size_t(count) ; i++) { mActivationCount.add(list[i].handle, model); - mSensorDevice->activate(mSensorDevice, list[i].handle, 0); + if (mOldSensorsCompatMode) { + mSensorControlDevice->activate(mSensorControlDevice, list[i].handle, 0); + } else { + mSensorDevice->activate(mSensorDevice, list[i].handle, 0); + } } } } @@ -157,24 +222,130 @@ void SensorDevice::dump(String8& result, char* buffer, size_t SIZE) ssize_t SensorDevice::getSensorList(sensor_t const** list) { if (!mSensorModule) return NO_INIT; ssize_t count = mSensorModule->get_sensors_list(mSensorModule, list); + +#ifdef USE_LGE_ALS_DUMMY + return addDummyLGESensor(list, count); +#endif return count; } status_t SensorDevice::initCheck() const { - return mSensorDevice && mSensorModule ? NO_ERROR : NO_INIT; + return (mSensorDevice || mOldSensorsCompatMode) && mSensorModule ? NO_ERROR : NO_INIT; } ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { - if (!mSensorDevice) return NO_INIT; - return mSensorDevice->poll(mSensorDevice, buffer, count); + if (!mSensorDevice && !mOldSensorsCompatMode) return NO_INIT; + if (mOldSensorsCompatMode) { + size_t pollsDone = 0; + //LOGV("%d buffers were requested",count); + while (!mOldSensorsEnabled) { + sleep(1); + LOGV("Waiting..."); + } + while (pollsDone < (size_t)mOldSensorsEnabled && pollsDone < count) { + sensors_data_t oldBuffer; + long result = mSensorDataDevice->poll(mSensorDataDevice, &oldBuffer); + int sensorType = -1; + int maxRange = -1; + + if (result == 0x7FFFFFFF) { + continue; + } else { + /* the old data_poll is supposed to return a handle, + * which has to be mapped to the type. */ + for (size_t i=0 ; i<size_t(mOldSensorsCount) && sensorType < 0 ; i++) { + if (mOldSensorsList[i].handle == result) { + sensorType = mOldSensorsList[i].type; + maxRange = mOldSensorsList[i].maxRange; + LOGV("mapped sensor type to %d",sensorType); + } + } + } + if ( sensorType <= 0 || + sensorType > SENSOR_TYPE_ROTATION_VECTOR) { + LOGV("Useless output at round %u from %d",pollsDone, oldBuffer.sensor); + count--; + continue; + } + buffer[pollsDone].version = sizeof(struct sensors_event_t); + buffer[pollsDone].timestamp = oldBuffer.time; + buffer[pollsDone].type = sensorType; + buffer[pollsDone].sensor = result; + /* This part is a union. Regardless of the sensor type, + * we only need to copy a sensors_vec_t and a float */ + buffer[pollsDone].acceleration = oldBuffer.vector; + buffer[pollsDone].temperature = oldBuffer.temperature; + LOGV("Adding results for sensor %d", buffer[pollsDone].sensor); + /* The ALS and PS sensors only report values on change, + * instead of a data "stream" like the others. So don't wait + * for the number of requested samples to fill, and deliver + * it immediately */ + if (sensorType == SENSOR_TYPE_PROXIMITY) { +#ifdef FOXCONN_SENSORS + /* Fix ridiculous API breakages from FIH. */ + /* These idiots are returning -1 for FAR, and 1 for NEAR */ + if (buffer[pollsDone].distance > 0) { + buffer[pollsDone].distance = 0; + } else { + buffer[pollsDone].distance = 1; + } +#elif defined(PROXIMITY_LIES) + if (buffer[pollsDone].distance >= PROXIMITY_LIES) + buffer[pollsDone].distance = maxRange; +#endif + return pollsDone+1; + } else if (sensorType == SENSOR_TYPE_LIGHT) { + return pollsDone+1; + } + pollsDone++; + } + return pollsDone; + } else { + return mSensorDevice->poll(mSensorDevice, buffer, count); + } } status_t SensorDevice::activate(void* ident, int handle, int enabled) { - if (!mSensorDevice) return NO_INIT; + if (!mSensorDevice && !mOldSensorsCompatMode) return NO_INIT; status_t err(NO_ERROR); bool actuateHardware = false; +#ifdef USE_LGE_ALS_DUMMY + + if (handle == SENSOR_TYPE_LIGHT) { + int nwr, ret, fd; + char value[2]; + +#ifdef USE_LGE_ALS_OMAP3 + fd = open("/sys/class/leds/lcd-backlight/als", O_RDWR); + if(fd < 0) + return -ENODEV; + + nwr = sprintf(value, "%s\n", enabled ? "1" : "0"); + write(fd, value, nwr); + close(fd); +#else + fd = open("/sys/devices/platform/star_aat2870.0/lsensor_onoff", O_RDWR); + if(fd < 0) + return -ENODEV; + + nwr = sprintf(value, "%s\n", enabled ? "1" : "0"); + write(fd, value, nwr); + close(fd); + fd = open("/sys/devices/platform/star_aat2870.0/alc", O_RDWR); + if(fd < 0) + return -ENODEV; + + nwr = sprintf(value, "%s\n", enabled ? "2" : "0"); + write(fd, value, nwr); + close(fd); +#endif + + return 0; + + } +#endif Info& info( mActivationCount.editValueFor(handle) ); @@ -213,7 +384,20 @@ status_t SensorDevice::activate(void* ident, int handle, int enabled) if (actuateHardware) { LOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w"); - err = mSensorDevice->activate(mSensorDevice, handle, enabled); + if (mOldSensorsCompatMode) { + if (enabled) + mOldSensorsEnabled++; + else if (mOldSensorsEnabled > 0) + mOldSensorsEnabled--; + LOGV("Activation for %d (%d)",handle,enabled); + if (enabled) { + mSensorControlDevice->wake(mSensorControlDevice); + } + err = mSensorControlDevice->activate(mSensorControlDevice, handle, enabled); + err = 0; + } else { + err = mSensorDevice->activate(mSensorDevice, handle, enabled); + } if (enabled) { LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err)); if (err == 0) { @@ -229,7 +413,11 @@ status_t SensorDevice::activate(void* ident, int handle, int enabled) { // scope for the lock Mutex::Autolock _l(mLock); nsecs_t ns = info.selectDelay(); - mSensorDevice->setDelay(mSensorDevice, handle, ns); + if (mOldSensorsCompatMode) { + mSensorControlDevice->set_delay(mSensorControlDevice, (ns/(1000*1000))); + } else { + mSensorDevice->setDelay(mSensorDevice, handle, ns); + } } return err; @@ -237,13 +425,17 @@ status_t SensorDevice::activate(void* ident, int handle, int enabled) status_t SensorDevice::setDelay(void* ident, int handle, int64_t ns) { - if (!mSensorDevice) return NO_INIT; + if (!mSensorDevice && !mOldSensorsCompatMode) return NO_INIT; Mutex::Autolock _l(mLock); Info& info( mActivationCount.editValueFor(handle) ); status_t err = info.setDelayForIdent(ident, ns); if (err < 0) return err; ns = info.selectDelay(); - return mSensorDevice->setDelay(mSensorDevice, handle, ns); + if (mOldSensorsCompatMode) { + return mSensorControlDevice->set_delay(mSensorControlDevice, (ns/(1000*1000))); + } else { + return mSensorDevice->setDelay(mSensorDevice, handle, ns); + } } // --------------------------------------------------------------------------- |