| /* |
| * 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 <poll.h> |
| #include <vector> |
| |
| #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 POLL_TIMEOUT_FLUSH_EVENT (-1) |
| #define POLL_TIMEOUT_DATA_EVENT (1000) |
| |
| #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(); |
| |
| std::vector<int64_t> timestamp; |
| 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 WritePipeWithPoll(sensors_event_t *event_data, int size, int timeout); |
| virtual int FlushData(bool); |
| |
| 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(); |
| }; |
| |
| int64_t get_monotonic_time(void); |
| |
| #endif /* ST_SENSOR_BASE_H */ |