Merge "Fix activation issue with auto disabled sensors." into jb-mr2-dev

This commit is contained in:
Jaikumar Ganesh 2013-04-18 04:56:29 +00:00 committed by Android (Google) Code Review
commit 379f0f04cc
5 changed files with 31 additions and 0 deletions

View File

@ -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;

View File

@ -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);
};

View File

@ -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;
}

View File

@ -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);
};

View File

@ -242,10 +242,18 @@ status_t SensorService::dump(int fd, const Vector<String16>& args)
void SensorService::cleanupAutoDisabledSensor(const sp<SensorEventConnection>& connection,
sensors_event_t const* buffer, const int count) {
SensorInterface* sensor;
status_t err = NO_ERROR;
for (int i=0 ; i<count ; i++) {
int handle = buffer[i].sensor;
if (getSensorType(handle) == SENSOR_TYPE_SIGNIFICANT_MOTION) {
if (connection->hasSensor(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<SensorEventConnection>& 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);
}