summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAravind Akella <aakella@google.com>2013-10-15 15:43:10 -0700
committerAravind Akella <aakella@google.com>2013-10-25 13:58:58 -0700
commitb4099e77ec2bf8e9d4259ff30f0cb1d621deed91 (patch)
tree500daf25d053a329e6f2a995aae77270f5f2cea3
parent8507586903fa803abf535853a169913f2cf2e555 (diff)
downloadframeworks_native-b4099e77ec2bf8e9d4259ff30f0cb1d621deed91.zip
frameworks_native-b4099e77ec2bf8e9d4259ff30f0cb1d621deed91.tar.gz
frameworks_native-b4099e77ec2bf8e9d4259ff30f0cb1d621deed91.tar.bz2
Bug fixes for SensorService
i) Emulate Flush for AOSP Fusion Sesnsors on newer HALs that support batching. ii) Early return if there are no events for the current SensorEventConnection. Bug: 11325707, 11376538 Change-Id: Idb856302463649a99d3d5d0c965bb06ba06b8e1d
-rw-r--r--services/sensorservice/SensorService.cpp12
-rw-r--r--services/sensorservice/SensorService.h1
2 files changed, 12 insertions, 1 deletions
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 555d843..a2f4332 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -480,6 +480,11 @@ String8 SensorService::getSensorName(int handle) const {
return result;
}
+bool SensorService::isVirtualSensor(int handle) const {
+ SensorInterface* sensor = mSensorMap.valueFor(handle);
+ return sensor->isVirtual();
+}
+
Vector<Sensor> SensorService::getSensorList()
{
char value[PROPERTY_VALUE_MAX];
@@ -858,6 +863,11 @@ status_t SensorService::SensorEventConnection::sendEvents(
}
}
+ // Early return if there are no events for this connection.
+ if (count == 0) {
+ return status_t(NO_ERROR);
+ }
+
// NOTE: ASensorEvent and sensors_event_t are the same type
ssize_t size = SensorEventQueue::write(mChannel,
reinterpret_cast<ASensorEvent const*>(scratch), count);
@@ -922,7 +932,7 @@ status_t SensorService::SensorEventConnection::flush() {
// Loop through all sensors for this connection and call flush on each of them.
for (size_t i = 0; i < mSensorInfo.size(); ++i) {
const int handle = mSensorInfo.keyAt(i);
- if (halVersion < SENSORS_DEVICE_API_VERSION_1_1) {
+ if (halVersion < SENSORS_DEVICE_API_VERSION_1_1 || mService->isVirtualSensor(handle)) {
// For older devices just increment pending flush count which will send a trivial
// flush complete event.
FlushInfo& flushInfo = mSensorInfo.editValueFor(handle);
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index 6c1691a..c968319 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -130,6 +130,7 @@ class SensorService :
DefaultKeyedVector<int, SensorInterface*> getActiveVirtualSensors() const;
String8 getSensorName(int handle) const;
+ bool isVirtualSensor(int handle) const;
void recordLastValue(sensors_event_t const * buffer, size_t count);
static void sortEventBuffer(sensors_event_t* buffer, size_t count);
Sensor registerSensor(SensorInterface* sensor);