summaryrefslogtreecommitdiff
path: root/libsensors_iio/src/SWSensorBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsensors_iio/src/SWSensorBase.cpp')
-rw-r--r--libsensors_iio/src/SWSensorBase.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/libsensors_iio/src/SWSensorBase.cpp b/libsensors_iio/src/SWSensorBase.cpp
new file mode 100644
index 0000000..b08b225
--- /dev/null
+++ b/libsensors_iio/src/SWSensorBase.cpp
@@ -0,0 +1,148 @@
+/*
+ * STMicroelectronics SW Sensor Base Class
+ *
+ * Copyright 2013-2015 STMicroelectronics Inc.
+ * Author: Denis Ciocca - <denis.ciocca@st.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ */
+
+#include <fcntl.h>
+#include <assert.h>
+#include <string.h>
+
+#include "SWSensorBase.h"
+
+SWSensorBase::SWSensorBase(const char *name, int handle, int sensor_type, int pipe_data_fd,
+ bool use_dependency_resolution, bool use_dependency_range, bool use_dependency_delay,
+ bool use_dependency_name) : SensorBase(name, handle, sensor_type, pipe_data_fd)
+{
+ dependency_resolution = use_dependency_resolution;
+ dependency_range = use_dependency_range;
+ dependency_delay = use_dependency_delay;
+ dependency_name = use_dependency_name;
+
+ return;
+}
+
+SWSensorBase::~SWSensorBase()
+{
+ return;
+}
+
+int SWSensorBase::AddSensorDependency(SensorBase *p)
+{
+ struct sensor_t dependecy_data;
+
+ if (sensor_t_data.fifoMaxEventCount == 0)
+ sensor_t_data.fifoMaxEventCount = p->GetMaxFifoLenght();
+ else {
+ if (p->GetMaxFifoLenght() < (int)sensor_t_data.fifoMaxEventCount)
+ sensor_t_data.fifoMaxEventCount = p->GetMaxFifoLenght();
+ }
+
+ p->FillSensor_tData(&dependecy_data);
+
+ if (dependency_resolution)
+ sensor_t_data.resolution = dependecy_data.resolution;
+
+ if (dependency_range)
+ sensor_t_data.maxRange = dependecy_data.maxRange;
+
+ if (dependency_delay) {
+ if (sensor_t_data.minDelay == 0)
+ sensor_t_data.minDelay = dependecy_data.minDelay;
+ else {
+ if (dependecy_data.minDelay > sensor_t_data.minDelay)
+ sensor_t_data.minDelay = dependecy_data.minDelay;
+ }
+
+ if (sensor_t_data.maxDelay == 0)
+ sensor_t_data.maxDelay = dependecy_data.maxDelay;
+ else {
+ if (dependecy_data.maxDelay < sensor_t_data.maxDelay)
+ sensor_t_data.maxDelay = dependecy_data.maxDelay;
+ }
+ }
+
+ if (dependency_name) {
+ memcpy((char *)sensor_t_data.name, dependecy_data.name, strlen(dependecy_data.name) + 1);
+ }
+
+ return SensorBase::AddSensorDependency(p);
+}
+
+int SWSensorBase::FlushData()
+{
+ int err, i;
+
+ if (GetStatus() && (GetMinTimeout() > 0)) {
+ for (i = 0; i < (int)dependencies_num; i++) {
+ err = dependencies[i]->FlushData();
+ if (err < 0)
+ return -EINVAL;
+ }
+ } else
+ return -EINVAL;
+
+ return SensorBase::FlushData();
+}
+
+void SWSensorBase::ThreadTask()
+{
+ while (true) {
+ pthread_mutex_lock(&mutext.trigger_mutex);
+ pthread_cond_wait(&mutext.trigger_data_cond, &mutext.trigger_mutex);
+ TriggerEventReceived();
+ pthread_mutex_unlock(&mutext.trigger_mutex);
+ }
+}
+
+
+SWSensorBaseWithPollrate::SWSensorBaseWithPollrate(const char *name, int handle, int sensor_type, int pipe_data_fd,
+ bool use_dependency_resolution, bool use_dependency_range, bool use_dependency_delay,
+ bool use_dependency_name) : SWSensorBase(name, handle, sensor_type, pipe_data_fd,
+ use_dependency_resolution, use_dependency_range, use_dependency_delay, use_dependency_name)
+{
+
+}
+
+SWSensorBaseWithPollrate::~SWSensorBaseWithPollrate()
+{
+
+}
+
+int SWSensorBaseWithPollrate::SetDelay(int handle, int64_t period_ns, int64_t timeout)
+{
+ int i, err;
+ int64_t temp_real_pollrate = 0;
+
+ err = SWSensorBase::SetDelay(handle, period_ns, timeout);
+ if (err < 0)
+ return err;
+
+ for (i = 0; i < (int)dependencies_num; i++) {
+ if (temp_real_pollrate < GetMinPeriod())
+ temp_real_pollrate = GetMinPeriod();
+ }
+
+ return 0;
+}
+
+void SWSensorBaseWithPollrate::WriteDataToPipe()
+{
+ int err;
+
+ if (!GetStatusOfHandle(sensor_t_data.handle))
+ return;
+
+ if (sensor_event.timestamp > (last_data_timestamp + GetDelay())) {
+ err = write(android_pipe_fd, &sensor_event, sizeof(sensor_event));
+ if (err < 0) {
+ ALOGE("%s: Failed to write sensor data to pipe.", android_name);
+ return;
+ }
+
+ last_data_timestamp = sensor_event.timestamp;
+ }
+}