diff options
Diffstat (limited to 'libsensors_iio/src/SensorBase.h')
-rw-r--r-- | libsensors_iio/src/SensorBase.h | 157 |
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 */ |