aboutsummaryrefslogtreecommitdiff
path: root/sensors.hpp
blob: 7d7da3137cd0e87b276c62cf29a74995061c0bd9 (plain) (blame)
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
#ifndef SENSORS_HPP
#define SENSORS_HPP
#include <cstdint>
#include <string>
#include <any>
#include <experimental/filesystem>
#include <functional>
#include <unordered_map>
#include <tuple>
#include <vector>

#define IIODEV_SYSFS_PATH_BASE "/sys/bus/iio/devices/iio:device"
#define DEV_PATH "/dev/iio:device"

namespace filesystem=std::experimental::filesystem::v1;

struct scan_t
{
	bool is_le;
	bool is_signed;
	uint8_t bits,storagebits;
	uint8_t shift,repeat;
};

class SensorBase
{
	private:
		int devfd;
		int workerquit;
		int readsize;
		std::function<void(SensorBase*)> readercb;
		std::vector<std::tuple<int,std::string,scan_t>> enabled_scan_elem;
		
		void enable_buffer();
		void parse_type_string(std::string type,scan_t* ti);
		void readbuffer();
	protected:
		std::string type,sensor_basename;
		filesystem::path devbufpath;
		filesystem::path sysfspath;
		std::unordered_map<std::string,std::any> dict;

		void enable_scan_element(std::string elem);
		
		virtual void enable_scan_elements()=0;
		virtual void update_values()=0;
	public:
		virtual ~SensorBase(){}
		void init(int id,std::string _sensor_basename);
		void deinit();
		void reset();
		void worker();
		void quit_worker();
		void set_reader_callback(std::function<void(SensorBase*)> cb);
		static std::string get_type(int id);
		static int detect_sensor(std::string type);
};
#endif