summaryrefslogtreecommitdiff
path: root/libsensors_iio/src/SensorBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsensors_iio/src/SensorBase.cpp')
-rw-r--r--libsensors_iio/src/SensorBase.cpp539
1 files changed, 0 insertions, 539 deletions
diff --git a/libsensors_iio/src/SensorBase.cpp b/libsensors_iio/src/SensorBase.cpp
deleted file mode 100644
index bfee207..0000000
--- a/libsensors_iio/src/SensorBase.cpp
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * STMicroelectronics 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 <signal.h>
-#include <time.h>
-
-#include "SensorBase.h"
-
-int64_t get_monotonic_time(void)
-{
- int err;
- struct timespec tm;
-
- err = clock_gettime(CLOCK_BOOTTIME, &tm);
- if (err < 0) {
- ALOGE("get_monotonic_time failed, err=%d", err);
- return err;
- }
-
- ALOGD("get_monotonic_time %ld, %ld", tm.tv_sec, tm.tv_nsec);
- return (int64_t) tm.tv_sec * 1000000000 + (int64_t) tm.tv_nsec;
-}
-
-SensorBase::SensorBase(const char *name, int handle, int type, int pipe_data_fd)
-{
- int i;
-
- if (strlen(name) + 1 > SENSOR_BASE_ANDROID_NAME_MAX) {
- memcpy(android_name, name, SENSOR_BASE_ANDROID_NAME_MAX - 1);
- android_name[SENSOR_BASE_ANDROID_NAME_MAX - 1] = '\0';
- } else
- memcpy(android_name, name, strlen(name) + 1);
-
- memset(&sensor_t_data, 0, sizeof(sensor_t));
- memset(&sensor_event, 0, sizeof(sensors_event_t));
- memset(type_dependencies, 0, SENSOR_BASE_MAX_DEPENDENCY * sizeof(int));
- memset(sensors_pollrates, 0, ST_HAL_IIO_MAX_DEVICES * sizeof(int64_t));
- memset(last_timestap_pushed, 0, ST_HAL_IIO_MAX_DEVICES * sizeof(int64_t));
-
- for (i = 0; i < ST_HAL_IIO_MAX_DEVICES; i++)
- sensors_timeout[i] = INT64_MAX;
-
- sensor_event.version = sizeof(sensors_event_t);
- sensor_event.sensor = handle;
- sensor_event.type = type;
-
- sensor_t_data.name = android_name;
- sensor_t_data.handle = handle;
- sensor_t_data.type = type;
- sensor_t_data.vendor = "STMicroelectronics";
- sensor_t_data.version = 1;
-
- real_pollrate = 0;
- dependencies_num = 0;
- last_data_timestamp = 0;
- enabled_sensors_mask = 0;
- sensors_to_trigger_num = 0;
- type_sensor_need_trigger = -ENODEV;
- sensors_to_push_data_num = 0;
- num_data_axis = SENSOR_BASE_3AXIS;
-
- android_pipe_fd = pipe_data_fd;
-
- pthread_mutex_init(&mutext.trigger_mutex, NULL);
- pthread_cond_init(&mutext.trigger_data_cond, NULL);
-
- valid_class = true;
-}
-
-SensorBase::~SensorBase()
-{
- int i;
-
- for (i = 0; i < (int)dependencies_num; i++)
- DeAllocateBufferForDependencyData(i);
-}
-
-bool SensorBase::IsValidClass()
-{
- return valid_class;
-}
-
-int SensorBase::GetHandle()
-{
- return sensor_t_data.handle;
-}
-
-int SensorBase::GetType()
-{
- return sensor_t_data.type;
-}
-
-int SensorBase::GetMaxFifoLenght()
-{
- return sensor_t_data.fifoMaxEventCount;
-}
-
-void SensorBase::SetBitEnableMask(int handle)
-{
- enabled_sensors_mask |= (1ULL << handle);
-}
-
-void SensorBase::ResetBitEnableMask(int handle)
-{
- enabled_sensors_mask &= ~(1ULL << handle);
-}
-
-char* SensorBase::GetName()
-{
- return (char *)sensor_t_data.name;
-}
-
-int SensorBase::Enable(int handle, bool enable)
-{
- int err, i = 0;
-#if (CONFIG_ST_HAL_DEBUG_LEVEL >= ST_HAL_DEBUG_INFO)
- bool old_status = GetStatus();
-#endif /* CONFIG_ST_HAL_DEBUG_LEVEL */
-
- if ((enable && !GetStatus()) || (!enable && !GetStatusExcludeHandle(handle))) {
- for (i = 0; i < (int)dependencies_num; i++) {
- err = dependencies[i]->Enable(sensor_event.sensor, enable);
- if (err < 0)
- goto restore_enable_dependencies;
- }
- }
-
- if (enable)
- SetBitEnableMask(handle);
- else {
- err = SetDelay(handle, 0, INT64_MAX);
- if (err < 0)
- goto restore_enable_dependencies;
-
- ResetBitEnableMask(handle);
- }
-
-#if (CONFIG_ST_HAL_DEBUG_LEVEL >= ST_HAL_DEBUG_INFO)
- if (((old_status && !GetStatus()) || (!old_status && GetStatus())) && (sensor_t_data.type < SENSOR_TYPE_ST_CUSTOM_NO_SENSOR)) {
- if (GetStatus())
- ALOGI("\"%s\": power-on (sensor type: %d).", sensor_t_data.name, sensor_t_data.type);
- else
- ALOGI("\"%s\": power-off (sensor type: %d).", sensor_t_data.name, sensor_t_data.type);
- }
-#endif /* CONFIG_ST_HAL_DEBUG_LEVEL */
-
- return 0;
-
-restore_enable_dependencies:
- for (i--; i >= 0; i--)
- dependencies[i]->Enable(sensor_event.sensor, !enable);
-
- return err;
-}
-
-bool SensorBase::GetStatusExcludeHandle(int handle)
-{
- return (enabled_sensors_mask & ~(1ULL << handle)) > 0 ? true : false;
-}
-
-bool SensorBase::GetStatusOfHandle(int handle)
-{
- return (enabled_sensors_mask & (1ULL << handle)) > 0 ? true : false;
-}
-
-bool SensorBase::GetStatus()
-{
- return enabled_sensors_mask > 0 ? true : false;
-}
-
-int SensorBase::SetDelay(int handle, int64_t period_ns, int64_t timeout)
-{
- int err, i;
- int64_t restore_min_timeout, restore_min_period_ms;
-
- restore_min_timeout = sensors_timeout[handle];
- restore_min_period_ms = sensors_pollrates[handle];
-
- sensors_pollrates[handle] = period_ns;
- sensors_timeout[handle] = timeout;
-
- for (i = 0; i < (int)dependencies_num; i++) {
- err = dependencies[i]->SetDelay(sensor_event.sensor, GetMinPeriod(), GetMinTimeout());
- if (err < 0)
- goto restore_delay_dependencies;
- }
-
-#if (CONFIG_ST_HAL_DEBUG_LEVEL >= ST_HAL_DEBUG_INFO)
- if ((handle == sensor_t_data.handle) && (period_ns > 0))
- ALOGI("\"%s\": changed pollrate to %.2f Hz, timeout %lld ms (sensor type: %d).",
- sensor_t_data.name, NS_TO_FREQUENCY((float)(uint64_t)period_ns),
- (uint64_t)NS_TO_MS((uint64_t)timeout), sensor_t_data.type);
-#endif /* CONFIG_ST_HAL_DEBUG_LEVEL */
-
- return 0;
-
-restore_delay_dependencies:
- sensors_pollrates[handle] = restore_min_period_ms;
- sensors_timeout[handle] = restore_min_timeout;
-
- for (i--; i >= 0; i--)
- dependencies[i]->SetDelay(sensor_event.sensor, GetMinPeriod(), GetMinTimeout());
-
- return err;
-}
-
-int64_t SensorBase::GetDelay()
-{
- return sensors_pollrates[sensor_event.sensor];
-}
-
-int64_t SensorBase::GetRealPollrate()
-{
- return real_pollrate;
-}
-
-void SensorBase::GetDepenciesTypeList(int type[SENSOR_BASE_MAX_DEPENDENCY])
-{
- memcpy(type, type_dependencies, SENSOR_BASE_MAX_DEPENDENCY * sizeof(int));
-}
-
-trigger_mutex* SensorBase::GetMutexForTrigger()
-{
- return &mutext;
-}
-
-int SensorBase::GetSensorNeedTriggerType()
-{
- return type_sensor_need_trigger;
-}
-
-int SensorBase::AddSensorDependency(SensorBase *p)
-{
- int err;
- uint32_t sensor_wake_flag;
- struct sensor_t dependecy_data;
-
- if (dependencies_num >= SENSOR_BASE_MAX_DEPENDENCY) {
- ALOGE("%s: Failed to add dependency, too many dependencies.", android_name);
- return -ENOMEM;
- }
-
- err = AllocateBufferForDependencyData(dependencies_num, p->GetMaxFifoLenght());
- if (err < 0)
- return err;
-
- err = p->AddSensorToDataPush(this);
- if (err < 0) {
- DeAllocateBufferForDependencyData(dependencies_num);
- return err;
- }
-
- p->FillSensor_tData(&dependecy_data);
- sensor_t_data.power += dependecy_data.power;
-
- sensor_wake_flag = (dependecy_data.flags & SENSOR_FLAG_WAKE_UP);
- if (dependencies_num == 0)
- sensor_t_data.flags |= sensor_wake_flag;
- else {
- if (!sensor_wake_flag)
- sensor_t_data.flags &= ~sensor_wake_flag;
- }
-
- handle_remapping[p->GetHandle()] = dependencies_num;
- dependencies[dependencies_num] = p;
- dependencies_num++;
-
- return 0;
-}
-
-void SensorBase::RemoveSensorDependency(SensorBase *p)
-{
- int i;
-
- for (i = 0; i < (int)dependencies_num; i++) {
- if (p == dependencies[i])
- break;
- }
- if (i == (int)dependencies_num)
- return;
-
- DeAllocateBufferForDependencyData(i);
- p->RemoveSensorToDataPush(this);
-
- for (; i < (int)dependencies_num - 1; i++)
- dependencies[i] = dependencies[i + 1];
-
- dependencies_num--;
-}
-
-int SensorBase::AllocateBufferForDependencyData(int dependency_id, unsigned int max_fifo_len)
-{
- circular_buffer_data[dependency_id] = new CircularBuffer(max_fifo_len < 2 ? 2 : max_fifo_len);
- if (!circular_buffer_data[dependency_id])
- return -ENOMEM;
-
- return 0;
-}
-
-void SensorBase::DeAllocateBufferForDependencyData(int dependency_id)
-{
- delete circular_buffer_data[dependency_id];
-}
-
-int SensorBase::AddSensorToDataPush(SensorBase *t)
-{
- int err;
-
- if (sensors_to_push_data_num >= SENSOR_BASE_MAX_DEPENDENCY) {
- ALOGE("%s: Failed to add dependency data, too many sensors to push data.", android_name);
- return -ENOMEM;
- }
-
- sensors_to_push_data_type[sensors_to_push_data_num] = t->GetType();
- sensors_to_push_data[sensors_to_push_data_num] = t;
- sensors_to_push_data_num++;
-
- return 0;
-}
-
-void SensorBase::RemoveSensorToDataPush(SensorBase *t)
-{
- int i;
-
- for (i = 0; i < (int)sensors_to_push_data_num; i++) {
- if (t == sensors_to_push_data[i])
- break;
- }
- if (i == (int)sensors_to_push_data_num)
- return;
-
- for (; i < (int)sensors_to_push_data_num - 1; i++)
- sensors_to_push_data[i] = sensors_to_push_data[i + 1];
-
- sensors_to_push_data_num--;
-}
-
-int SensorBase::AddSensorToTrigger(SensorBase *t)
-{
- int err;
-
- if (sensors_to_trigger_num >= SENSOR_BASE_MAX_DEPENDENCY) {
- ALOGE("%s: Failed to add dependency, too many sensors to trigger.", android_name);
- return -ENOMEM;
- }
-
- sensors_to_trigger[sensors_to_trigger_num] = t;
- sensors_to_trigger_num++;
-
- return 0;
-}
-
-bool SensorBase::FillSensor_tData(struct sensor_t *data)
-{
- memcpy(data, &sensor_t_data, sizeof(struct sensor_t));
-
- if (sensor_t_data.type >= SENSOR_TYPE_ST_CUSTOM_NO_SENSOR)
- return false;
-
- return true;
-}
-
-int SensorBase::WritePipeWithPoll(sensors_event_t *event_data, int size, int timeout)
-{
- int err;
- struct pollfd poll_fd;
-
- poll_fd.fd = android_pipe_fd;
- poll_fd.events = POLLOUT;
-
- err = poll(&poll_fd, (unsigned long)1, timeout);
- if (err < 0) {
- ALOGE("%s: error happened when polling pipe, errno: %d.", android_name, errno);
- return err;
- }
-
- if (err == 0) {
- ALOGE("%s: polling pipe timeout, timeout = %d.", android_name, timeout);
- return err;
- }
-
- if (poll_fd.revents&POLLOUT) {
- err = write(android_pipe_fd, event_data, size);
- if (err <= 0) {
- ALOGE("%s: Failed to write to pipe, timeout: %d, errno: %d.",
- android_name, timeout, errno);
- return err;
- }
- } else {
- ALOGE("%s: polling was breaked by unexpected event: %d", android_name, poll_fd.revents);
- return -EAGAIN;
- }
-
- return err;
-}
-
-int SensorBase::FlushData(bool)
-{
- int err = 0, retry = 3;
- sensors_event_t flush_event_data;
-
- flush_event_data.sensor = 0;
- flush_event_data.timestamp = 0;
- flush_event_data.meta_data.sensor = sensor_t_data.handle;
- flush_event_data.meta_data.what = META_DATA_FLUSH_COMPLETE;
- flush_event_data.type = SENSOR_TYPE_META_DATA;
- flush_event_data.version = META_DATA_VERSION;
-
- while (retry) {
- err = WritePipeWithPoll(&flush_event_data, sizeof(sensor_event),
- POLL_TIMEOUT_FLUSH_EVENT);
- if (err > 0)
- break;
-
- 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 flush event data to pipe, err=%d.", android_name, err);
- else
- ALOGD("SensorBase::FlushData completed.");
-
- return err;
-}
-
-void SensorBase::WriteDataToPipe()
-{
- int err;
-
- if (!GetStatusOfHandle(sensor_t_data.handle))
- return;
-
- if (sensor_event.timestamp > last_data_timestamp) {
- err = WritePipeWithPoll(&sensor_event, sizeof(sensor_event),
- POLL_TIMEOUT_DATA_EVENT);
- if (err <= 0) {
- ALOGE("%s: Failed to write sensor data to pipe.", android_name);
- return;
- }
-
- last_data_timestamp = sensor_event.timestamp;
- }
-}
-
-void SensorBase::ProcessData(SensorBaseData *data)
-{
- int i;
- trigger_mutex *dep_mutex;
-
- for (i = 0; i < (int)sensors_to_push_data_num; i++) {
- if (sensors_to_push_data[i]->GetStatus())
- sensors_to_push_data[i]->ReceiveDataFromDependency(sensor_t_data.handle, data);
- }
-
- for (i = 0; i < (int)sensors_to_trigger_num; i++) {
- if (sensors_to_trigger[i]->GetStatus()) {
- dep_mutex = sensors_to_trigger[i]->GetMutexForTrigger();
- pthread_mutex_lock(&dep_mutex->trigger_mutex);
- pthread_cond_signal(&dep_mutex->trigger_data_cond);
- pthread_mutex_unlock(&dep_mutex->trigger_mutex);
- }
- }
-}
-
-void SensorBase::ProcessEvent(struct iio_event_data __attribute__((unused))*event_data)
-{
- return;
-}
-
-void SensorBase::TriggerEventReceived()
-{
- return;
-}
-
-void SensorBase::ReceiveDataFromDependency(int handle, SensorBaseData *data)
-{
- if (data->timestamp >= last_timestap_pushed[handle]) {
- circular_buffer_data[handle_remapping[handle]]->writeElement(data);
- last_timestap_pushed[handle] = data->timestamp;
- }
-
- return;
-}
-
-int SensorBase::GetLatestValidDataFromDependency(int dependency_id, SensorBaseData *data)
-{
- return circular_buffer_data[dependency_id]->readElement(data);
-}
-
-
-int64_t SensorBase::GetMinTimeout()
-{
- int i;
- int64_t min = INT64_MAX;
-
- for (i = 0; i < ST_HAL_IIO_MAX_DEVICES; i++) {
- if (sensors_timeout[i] < min)
- min = sensors_timeout[i];
- }
-
- return min;
-}
-
-int64_t SensorBase::GetMinPeriod()
-{
- int i;
- int64_t min = INT64_MAX;
-
- for (i = 0; i < ST_HAL_IIO_MAX_DEVICES; i++) {
- if ((sensors_pollrates[i] < min) && (sensors_pollrates[i] > 0))
- min = sensors_pollrates[i];
- }
-
- return min;
-}
-
-void *SensorBase::ThreadWork(void *context)
-{
- SensorBase *mypointer = (SensorBase *)context;
-
- mypointer->ThreadTask();
-
- return mypointer;
-}
-
-void SensorBase::ThreadTask()
-{
- pthread_exit(NULL);
-}