summaryrefslogtreecommitdiff
path: root/libsensors_iio/src/HWSensorBase.cpp
diff options
context:
space:
mode:
authorSaadi Maalem <saadi.maalem@intel.com>2015-11-11 19:43:28 +0100
committerZhengyin Qian <qianzy@google.com>2015-11-11 14:00:20 -0800
commit6ff827fc04e3b85791eea931904c1236763cbb40 (patch)
tree55e27ac75df0899fc328b4a542fdcf38793f51e0 /libsensors_iio/src/HWSensorBase.cpp
parentb219170d10f1c119ae79f39271239399cb373760 (diff)
downloadsensors-6ff827fc04e3b85791eea931904c1236763cbb40.tar.gz
sensor: poll for POLLOUT event before writing pipe
Poll with timeout = -1 for flush complete event and timeout = 1000 for regular sensor event flush requests are tracked with vector. This requires to include stlport. As stlport olverloads pow(), all calls to this function are also modified to avoid ambiguous calls. Change-Id: I4f8bd97289dbc3e18b5fb0911aa84bde4f401ad8 Signed-off-by: Like Yan <like.yan@intel.com>
Diffstat (limited to 'libsensors_iio/src/HWSensorBase.cpp')
-rw-r--r--libsensors_iio/src/HWSensorBase.cpp34
1 files changed, 21 insertions, 13 deletions
diff --git a/libsensors_iio/src/HWSensorBase.cpp b/libsensors_iio/src/HWSensorBase.cpp
index c3c941e..0e7c383 100644
--- a/libsensors_iio/src/HWSensorBase.cpp
+++ b/libsensors_iio/src/HWSensorBase.cpp
@@ -18,6 +18,7 @@
#include "HWSensorBase.h"
#define DEFAULT_HRTIMER_PERIOD_NS (200000000)
+#define LOCAL_REPORTING_MODE_MASK 6
/**
@@ -328,7 +329,7 @@ int HWSensorBase::FlushData(bool need_report_event)
ALOGD("HWSensorBase::FlushData type=%d, flags=%lld", type, flags);
/* No flush events for One-shot sensors */
- if (SENSOR_FLAG_ONE_SHOT_MODE == (flags & REPORTING_MODE_MASK))
+ if (SENSOR_FLAG_ONE_SHOT_MODE == (flags & LOCAL_REPORTING_MODE_MASK))
return -EINVAL;
if (GetStatus()) {
@@ -373,9 +374,9 @@ int HWSensorBase::FlushData(bool need_report_event)
*/
if (need_report_event && (report_at_once || ((type != SENSOR_TYPE_ACCELEROMETER) &&
(type != SENSOR_TYPE_GYROSCOPE))))
- return SensorBase::FlushData(true);
- else
- return 0;
+ SensorBase::FlushData(true);
+
+ return 0;
} else
return -EINVAL;
@@ -507,7 +508,7 @@ int HWSensorBaseWithPollrate::SetDelay(int handle, int64_t period_ns, int64_t ti
void HWSensorBaseWithPollrate::WriteDataToPipe()
{
- int err;
+ int err, retry = 3;
std::vector<int64_t>::iterator it;
if (!GetStatusOfHandle(sensor_t_data.handle))
@@ -530,16 +531,23 @@ void HWSensorBaseWithPollrate::WriteDataToPipe()
flush_event_data.type = SENSOR_TYPE_META_DATA;
flush_event_data.version = META_DATA_VERSION;
- err = write(android_pipe_fd, &flush_event_data, sizeof(sensor_event));
+ while (retry) {
+ err = SensorBase::WritePipeWithPoll(&flush_event_data, sizeof(sensor_event),
+ POLL_TIMEOUT_FLUSH_EVENT);
+ if (err > 0)
+ break;
- if (err < 0) {
- ALOGE("%s: Writing flush_complete event failed, errno=%d", android_name, errno);
- return;
+ retry--;
+ ALOGI("%s: Retry writing flush event data to pipe, retry_cnt: %d.", android_name, 3-retry);
}
+ if (retry == 0)
+ ALOGE("%s: Failed to write HW flush_complete, err=%d", android_name, err);
+ else
+ ALOGD("write hw flush complete event to pipe succeed.");
+
last_timestamp = *it;
it = SensorBase::timestamp.erase(it);
- ALOGD("write hw flush complete event to pipe succeed.");
} else
break;
}
@@ -547,9 +555,9 @@ void HWSensorBaseWithPollrate::WriteDataToPipe()
/* Scale the real_pollrate by 9/10 because LSM6DS3 ODR has +/-10% skew */
if (sensor_event.timestamp >= (last_data_timestamp + real_pollrate * 9 / 10)) {
- err = write(android_pipe_fd, &sensor_event, sizeof(sensor_event));
- if (err < 0) {
- ALOGE("%s: Write sensor data failed, errno=%d", android_name, errno);
+ err = SensorBase::WritePipeWithPoll(&sensor_event, sizeof(sensor_event), POLL_TIMEOUT_DATA_EVENT);
+ if (err <= 0) {
+ ALOGE("%s: Write sensor data failed.", android_name);
return;
}