summaryrefslogtreecommitdiff
path: root/libsensors_iio/src/SensorBase.h
diff options
context:
space:
mode:
Diffstat (limited to 'libsensors_iio/src/SensorBase.h')
-rw-r--r--libsensors_iio/src/SensorBase.h157
1 files changed, 157 insertions, 0 deletions
diff --git a/libsensors_iio/src/SensorBase.h b/libsensors_iio/src/SensorBase.h
new file mode 100644
index 0000000..6187ec3
--- /dev/null
+++ b/libsensors_iio/src/SensorBase.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2013-2015 STMicroelectronics
+ * Author: Denis Ciocca - <denis.ciocca@st.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ST_SENSOR_BASE_H
+#define ST_SENSOR_BASE_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <pthread.h>
+#include <errno.h>
+
+#include <hardware/sensors.h>
+#include <cutils/log.h>
+
+#include "common_data.h"
+#include <CircularBuffer.h>
+
+#define SENSOR_BASE_0AXIS (0)
+#define SENSOR_BASE_1AXIS (1)
+#define SENSOR_BASE_3AXIS (3)
+#define SENSOR_BASE_4AXIS (4)
+
+#define SENSOR_BASE_DEPENDENCY_0 (0)
+#define SENSOR_BASE_DEPENDENCY_1 (1)
+#define SENSOR_BASE_DEPENDENCY_2 (2)
+#define SENSOR_BASE_DEPENDENCY_3 (3)
+#define SENSOR_BASE_DEPENDENCY_4 (4)
+#define SENSOR_BASE_MAX_DEPENDENCY (5)
+
+#define SENSOR_BASE_ANDROID_NAME_MAX (40)
+
+#define GAUSS_TO_UTESLA(x) ((x) * 100.0f)
+#define NS_TO_FREQUENCY(x) (1E9 / x)
+#define FREQUENCY_TO_NS(x) (1E9 / x)
+#define FREQUENCY_TO_US(x) (1E6 / x)
+#define NS_TO_MS(x) (x / 1E6)
+#define NS_TO_S(x) (x / 1E9)
+
+typedef struct trigger_mutex {
+ pthread_mutex_t trigger_mutex;
+ pthread_cond_t trigger_data_cond;
+} trigger_mutex;
+
+class SensorBase;
+
+/*
+ * class SensorBase
+ */
+class SensorBase {
+private:
+ int64_t enabled_sensors_mask;
+ int64_t sensors_timeout[ST_HAL_IIO_MAX_DEVICES];
+ int64_t sensors_pollrates[ST_HAL_IIO_MAX_DEVICES];
+ int64_t last_timestap_pushed[ST_HAL_IIO_MAX_DEVICES];
+
+ CircularBuffer *circular_buffer_data[SENSOR_BASE_MAX_DEPENDENCY];
+
+protected:
+ bool valid_class;
+ char android_name[SENSOR_BASE_ANDROID_NAME_MAX];
+
+ int android_pipe_fd;
+ int type_sensor_need_trigger;
+ int handle_remapping[ST_HAL_IIO_MAX_DEVICES];
+ int type_dependencies[SENSOR_BASE_MAX_DEPENDENCY];
+ int sensors_to_push_data_type[SENSOR_BASE_MAX_DEPENDENCY];
+
+ unsigned int num_data_axis;
+ unsigned int dependencies_num;
+ unsigned int sensors_to_trigger_num;
+ unsigned int sensors_to_push_data_num;
+
+ int64_t real_pollrate;
+ int64_t last_data_timestamp;
+
+ SensorBase *sensors_to_push_data[SENSOR_BASE_MAX_DEPENDENCY];
+ SensorBase *sensors_to_trigger[SENSOR_BASE_MAX_DEPENDENCY];
+ SensorBase *dependencies[SENSOR_BASE_MAX_DEPENDENCY];
+ sensors_event_t sensor_event;
+ struct sensor_t sensor_t_data;
+
+ trigger_mutex mutext;
+
+ int64_t GetMinTimeout();
+ int64_t GetMinPeriod();
+
+ void SetBitEnableMask(int handle);
+ void ResetBitEnableMask(int handle);
+
+ bool GetStatusExcludeHandle(int handle);
+ bool GetStatusOfHandle(int handle);
+
+ int AllocateBufferForDependencyData(int dependency_id, unsigned int max_fifo_len);
+ void DeAllocateBufferForDependencyData(int dependency_id);
+
+ int AddSensorToDataPush(SensorBase *t);
+ void RemoveSensorToDataPush(SensorBase *t);
+
+public:
+ SensorBase(const char *name, int handle, int type, int pipe_data_fd);
+ virtual ~SensorBase();
+ bool IsValidClass();
+
+ int GetHandle();
+ int GetType();
+ int GetMaxFifoLenght();
+
+ char* GetName();
+
+ virtual int Enable(int handle, bool enable);
+ bool GetStatus();
+
+ virtual int SetDelay(int handle, int64_t period_ns, int64_t timeout);
+ int64_t GetDelay();
+ int64_t GetRealPollrate();
+
+ void GetDepenciesTypeList(int type[SENSOR_BASE_MAX_DEPENDENCY]);
+ int AddSensorDependency(SensorBase *p);
+ void RemoveSensorDependency(SensorBase *p);
+
+ trigger_mutex* GetMutexForTrigger();
+ int GetSensorNeedTriggerType();
+ int AddSensorToTrigger(SensorBase *t);
+
+ bool FillSensor_tData(struct sensor_t *data);
+
+ virtual int FlushData();
+
+ virtual void ProcessData(SensorBaseData *data);
+ virtual void ProcessEvent(struct iio_event_data *event_data);
+ virtual void TriggerEventReceived();
+ virtual void WriteDataToPipe();
+ virtual void ReceiveDataFromDependency(int handle, SensorBaseData *data);
+
+ virtual int GetLatestValidDataFromDependency(int dependency_id, SensorBaseData *data);
+
+ static void *ThreadWork(void *context);
+ virtual void ThreadTask();
+};
+
+#endif /* ST_SENSOR_BASE_H */