summaryrefslogtreecommitdiff
path: root/libsensors_iio/src/HWSensorBase.h
blob: f9e1113676258fc4b4b7a8c14a73648d32503146 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * 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_HWSENSOR_BASE_H
#define ST_HWSENSOR_BASE_H

#include <poll.h>
#include <math.h>

#include "SensorBase.h"

extern "C" {
	#include "iio_utils.h"
	#include "events.h"
	#include "sensor_cal.h"
};

#define HW_SENSOR_BASE_DEFAULT_IIO_BUFFER_LEN	(2)
#define HW_SENSOR_BASE_IIO_SYSFS_PATH_MAX	(50)
#define HW_SENSOR_BASE_IIO_DEVICE_NAME_MAX	(30)
#define HW_SENSOR_BASE_MAX_CHANNELS		(8)

#define FILENAME_BUFFER_ENABLE			"buffer/enable"
#define FILENAME_BUFFER_LENGTH			"buffer/length"
#define FILENAME_BUFFER_STORE_LENGTH		"buffer/store_length"
#define FILENAME_SAMPLING_FREQ			"sampling_frequency"
#define FILENAME_MAX_RATE_DELIVERY		"max_delivery_rate"
#define FILENAME_HRTIMER_TRIGGER_FREQ		"frequency"
#define FILENAME_FLUSH				"flush"

struct HWSensorBaseCommonData {
	char iio_sysfs_path[HW_SENSOR_BASE_IIO_SYSFS_PATH_MAX];
	char device_name[HW_SENSOR_BASE_IIO_DEVICE_NAME_MAX];
	unsigned int iio_dev_num;

	int num_channels;
	struct iio_channel_info channels[HW_SENSOR_BASE_MAX_CHANNELS];

	struct iio_scale_available sa;
} typedef HWSensorBaseCommonData;


class HWSensorBase;
class HWSensorBaseWithPollrate;

/*
 * class HWSensorBase
 */
class HWSensorBase : public SensorBase {
protected:
	struct pollfd pollfd_iio[2];
	ssize_t scan_size;
	uint8_t *sensor_data;
	unsigned int current_fifo_len;
	HWSensorBaseCommonData common_data;

	int WriteBufferLenght(unsigned int buf_len, unsigned int store_len);

public:
	HWSensorBase(HWSensorBaseCommonData *data, const char *name,
				int handle, int sensor_type, unsigned int hw_fifo_len,
				int pipe_data_fd, float power_consumption);
	virtual ~HWSensorBase();

	virtual int Enable(int handle, bool enable);
	virtual int FlushData(bool need_report_event);
	virtual void ThreadTask();
};


/*
 * class HWSensorBaseWithPollrate
 */
class HWSensorBaseWithPollrate : public HWSensorBase {
private:
	struct iio_sampling_frequency_available sampling_frequency_available;

public:
	HWSensorBaseWithPollrate(HWSensorBaseCommonData *data, const char *name,
			struct iio_sampling_frequency_available *sfa, int handle,
			int sensor_type, unsigned int hw_fifo_len, int pipe_data_fd,
			float power_consumption);
	virtual ~HWSensorBaseWithPollrate();

	virtual int SetDelay(int handle, int64_t period_ns, int64_t timeout);
	virtual void WriteDataToPipe();
};

#endif /* ST_HWSENSOR_BASE_H */