diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index b256cce35..16dabe8fe 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -111,6 +111,15 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { return c; } +status_t SensorDevice::resetStateWithoutActuatingHardware(void *ident, int handle) +{ + if (!mSensorDevice) return NO_INIT; + Info& info( mActivationCount.editValueFor(handle)); + Mutex::Autolock _l(mLock); + info.rates.removeItem(ident); + return NO_ERROR; +} + status_t SensorDevice::activate(void* ident, int handle, int enabled) { if (!mSensorDevice) return NO_INIT; diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h index b423f40da..c0b357d5c 100644 --- a/services/sensorservice/SensorDevice.h +++ b/services/sensorservice/SensorDevice.h @@ -56,6 +56,7 @@ public: ssize_t poll(sensors_event_t* buffer, size_t count); status_t activate(void* ident, int handle, int enabled); status_t setDelay(void* ident, int handle, int64_t ns); + status_t resetStateWithoutActuatingHardware(void *ident, int handle); void dump(String8& result, char* buffer, size_t SIZE); }; diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp index 468aa6197..cf0a11df6 100644 --- a/services/sensorservice/SensorInterface.cpp +++ b/services/sensorservice/SensorInterface.cpp @@ -54,6 +54,10 @@ status_t HardwareSensor::setDelay(void* ident, int handle, int64_t ns) { return mSensorDevice.setDelay(ident, handle, ns); } +status_t HardwareSensor::resetStateWithoutActuatingHardware(void *ident, int handle) { + return mSensorDevice.resetStateWithoutActuatingHardware(ident, handle); +} + Sensor HardwareSensor::getSensor() const { return mSensor; } diff --git a/services/sensorservice/SensorInterface.h b/services/sensorservice/SensorInterface.h index fb357d769..2e709ae4d 100644 --- a/services/sensorservice/SensorInterface.h +++ b/services/sensorservice/SensorInterface.h @@ -40,6 +40,11 @@ public: virtual status_t setDelay(void* ident, int handle, int64_t ns) = 0; virtual Sensor getSensor() const = 0; virtual bool isVirtual() const = 0; + virtual status_t resetStateWithoutActuatingHardware(void *ident, int handle) { + // Override when you want to clean up for sensors which auto disable + // after trigger, or when enabling sensors fail. + return INVALID_OPERATION; + } }; // --------------------------------------------------------------------------- @@ -61,6 +66,7 @@ public: virtual status_t setDelay(void* ident, int handle, int64_t ns); virtual Sensor getSensor() const; virtual bool isVirtual() const { return false; } + virtual status_t resetStateWithoutActuatingHardware(void *ident, int handle); }; diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 9ca6b457c..ebf5cf0c7 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -242,10 +242,18 @@ status_t SensorService::dump(int fd, const Vector& args) void SensorService::cleanupAutoDisabledSensor(const sp& connection, sensors_event_t const* buffer, const int count) { + SensorInterface* sensor; + status_t err = NO_ERROR; for (int i=0 ; ihasSensor(handle)) { + sensor = mSensorMap.valueFor(handle); + err = sensor ?sensor->resetStateWithoutActuatingHardware(connection.get(), handle) + : status_t(BAD_VALUE); + if (err != NO_ERROR) { + ALOGE("Sensor Inteface: Resetting state failed with err: %d", err); + } cleanupWithoutDisable(connection, handle); } } @@ -530,6 +538,9 @@ status_t SensorService::enable(const sp& connection, status_t err = sensor ? sensor->activate(connection.get(), true) : status_t(BAD_VALUE); if (err != NO_ERROR) { + // enable has failed, reset state in SensorDevice. + status_t resetErr = sensor ? sensor->resetStateWithoutActuatingHardware(connection.get(), + handle) : status_t(BAD_VALUE); // enable has failed, reset our state. cleanupWithoutDisable(connection, handle); }