backend-hid.h
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2015 Intel Corporation. All Rights Reserved.
3 #pragma once
4 
5 #include "backend.h"
6 #include "types.h"
7 
8 #include <limits.h>
9 #include <list>
10 
11 namespace librealsense
12 {
13  namespace platform
14  {
15  const uint32_t hid_buf_len = 128;
16 
18  {
19  std::string input = "";
20  std::string device_path = "";
21  int index = -1;
22  bool enabled = false;
23 
31  // TODO: parse 'offset' and 'scale'
32  };
33 
34  // SYSFS or HAL for (IIO) device drivers differs requires a non-standard std::fstream operation mode:
35  // The first in/out operation selects the mode exclusively.
36  // Switching from read to write or vice versa requires fstream's close/open sequence.
37  // Writing/appending to the fstream requires flush synchronization
38  template<typename T>
39  inline bool write_fs_attribute(const std::string& path, const T& val)
40  {
42  "write_fs_attribute supports arithmetic and std::string types only");
43 
44  bool res = false;
45  std::fstream fs_handle(path);
46  if (!fs_handle.good())
47  {
48  LOG_WARNING(__FUNCTION__ <<" with " << val << " failed. The specified path " << path << " is not valid");
49  return res;
50  }
51 
52  try // Read/Modify/Confirm
53  {
54  T cval{};
55  fs_handle >> cval;
56 
57  if (cval!=val)
58  {
59  fs_handle.close();
60  fs_handle.open(path);
61  fs_handle << val;
62  fs_handle.flush();
63  std::ifstream vnv_handle(path);
64  vnv_handle >> cval;
65  fs_handle >> cval;
66  res = (cval==val);
67  if (!res)
68  LOG_WARNING(__FUNCTION__ << " Could not change " << cval << " to " << val << " : path " << path);
69  }
70  }
71  catch (const std::exception& exc)
72  {
73  LOG_WARNING(__FUNCTION__ << " with " << path << " failed: " << exc.what());
74  }
75 
76  return res;
77  }
78 
79  // manage an IIO input. or what is called a scan.
80  class hid_input
81  {
82  public:
83  hid_input(const std::string& iio_device_path, const std::string& input_name);
84  ~hid_input();
85 
86  // enable scan input. doing so cause the input to be part of the data provided in the polling.
87  void enable(bool is_enable);
88 
89  const hid_input_info& get_hid_input_info() const { return info; }
90 
91  private:
92  // initialize the input by reading the input parameters.
93  void init();
94 
96  };
97 
99  public:
100  hid_custom_sensor(const std::string& device_path, const std::string& sensor_name);
101 
103 
104  std::vector<uint8_t> get_report_data(const std::string& report_name, custom_sensor_report_field report_field);
105 
106  const std::string& get_sensor_name() const { return _custom_sensor_name; }
107 
108  // start capturing and polling.
109  void start_capture(hid_callback sensor_callback);
110 
111  void stop_capture();
112  private:
113  std::vector<uint8_t> read_report(const std::string& name_report_path);
114 
115  void init();
116 
117  void enable(bool state);
118 
119  void signal_stop();
120 
121  int _fd;
122  int _stop_pipe_fd[2]; // write to _stop_pipe_fd[1] and read from _stop_pipe_fd[0]
123  std::map<std::string, std::string> _reports;
124  std::string _custom_device_path;
125  std::string _custom_sensor_name;
126  std::string _custom_device_name;
128  std::atomic<bool> _is_capturing;
129  std::unique_ptr<std::thread> _hid_thread;
130  };
131 
132  // declare device sensor with all of its inputs.
134  public:
135  iio_hid_sensor(const std::string& device_path, uint32_t frequency);
136 
137  ~iio_hid_sensor();
138 
139  // start capturing and polling.
140  void start_capture(hid_callback sensor_callback);
141 
142  void stop_capture();
143 
144  const std::string& get_sensor_name() const { return _sensor_name; }
145 
146  private:
147  void clear_buffer();
148 
149  void set_frequency(uint32_t frequency);
150  void set_power(bool on);
151 
152  void signal_stop();
153 
154  bool has_metadata();
155 
156  static bool sort_hids(hid_input* first, hid_input* second);
157 
158  void create_channel_array();
159 
160  // initialize the device sensor. reading its name and all of its inputs.
161  void init(uint32_t frequency);
162 
163  // calculate the storage size of a scan
164  uint32_t get_channel_size() const;
165 
166  // calculate the actual size of data
167  uint32_t get_output_size() const;
168 
169  std::string get_sampling_frequency_name() const;
170 
171  // read the IIO device inputs.
172  void read_device_inputs();
173 
174  int _stop_pipe_fd[2]; // write to _stop_pipe_fd[1] and read from _stop_pipe_fd[0]
175  int _fd;
177  std::string _iio_device_path;
178  std::string _sensor_name;
180  std::list<hid_input*> _inputs;
181  std::list<hid_input*> _channels;
183  std::atomic<bool> _is_capturing;
184  std::unique_ptr<std::thread> _hid_thread;
185  std::unique_ptr<std::thread> _pm_thread; // Delayed initialization due to power-up sequence
186  dispatcher _pm_dispatcher; // Asynchronous power management
187  };
188 
189  class v4l_hid_device : public hid_device
190  {
191  public:
193 
194  ~v4l_hid_device();
195 
196  void register_profiles(const std::vector<hid_profile>& hid_profiles) override { _hid_profiles = hid_profiles;}
197 
198  void open(const std::vector<hid_profile>& hid_profiles) override;
199 
200  void close() override;
201 
202  std::vector<hid_sensor> get_sensors() override;
203 
204  void start_capture(hid_callback callback) override;
205 
206  void stop_capture() override;
207 
208  std::vector<uint8_t> get_custom_report_data(const std::string& custom_sensor_name,
209  const std::string& report_name,
210  custom_sensor_report_field report_field) override;
211 
212  static void foreach_hid_device(std::function<void(const hid_device_info&)> action);
213 
214  private:
215  static bool get_hid_device_info(const char* dev_path, hid_device_info& device_info);
216 
217  std::vector<hid_profile> _hid_profiles;
218  std::vector<hid_device_info> _hid_device_infos;
219  std::vector<std::unique_ptr<iio_hid_sensor>> _iio_hid_sensors;
220  std::vector<std::unique_ptr<hid_custom_sensor>> _hid_custom_sensors;
221  std::vector<iio_hid_sensor*> _streaming_iio_sensors;
222  std::vector<hid_custom_sensor*> _streaming_custom_sensors;
223  static constexpr const char* custom_id{"custom"};
224  };
225  }
226 }
librealsense::platform::iio_hid_sensor::_inputs
std::list< hid_input * > _inputs
Definition: backend-hid.h:180
librealsense::platform::write_fs_attribute
bool write_fs_attribute(const std::string &path, const T &val)
Definition: backend-hid.h:39
librealsense::platform::hid_input::get_hid_input_info
const hid_input_info & get_hid_input_info() const
Definition: backend-hid.h:89
librealsense::platform::iio_hid_sensor::_channels
std::list< hid_input * > _channels
Definition: backend-hid.h:181
librealsense::platform::hid_device
Definition: backend.h:337
librealsense
Definition: calibration-model.h:9
librealsense::platform::v4l_hid_device::_hid_profiles
std::vector< hid_profile > _hid_profiles
Definition: backend-hid.h:217
librealsense::platform::hid_custom_sensor::read_report
std::vector< uint8_t > read_report(const std::string &name_report_path)
Definition: backend-hid.cpp:348
librealsense::platform::hid_custom_sensor::_custom_device_name
std::string _custom_device_name
Definition: backend-hid.h:126
librealsense::platform::v4l_hid_device::open
void open(const std::vector< hid_profile > &hid_profiles) override
Definition: backend-hid.cpp:964
enabled
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glad/glad/glad.h:3607
librealsense::platform::hid_custom_sensor::_is_capturing
std::atomic< bool > _is_capturing
Definition: backend-hid.h:128
librealsense::platform::hid_custom_sensor::_reports
std::map< std::string, std::string > _reports
Definition: backend-hid.h:123
librealsense::platform::iio_hid_sensor::init
void init(uint32_t frequency)
Definition: backend-hid.cpp:757
librealsense::platform::hid_custom_sensor::signal_stop
void signal_stop()
Definition: backend-hid.cpp:437
librealsense::device_info
Definition: context.h:43
librealsense::platform::hid_device_info
Definition: hid-types.h:75
librealsense::platform::v4l_hid_device::get_sensors
std::vector< hid_sensor > get_sensors() override
Definition: backend-hid.cpp:1024
librealsense::platform::iio_hid_sensor::_iio_device_number
int _iio_device_number
Definition: backend-hid.h:176
librealsense::platform::v4l_hid_device::_hid_custom_sensors
std::vector< std::unique_ptr< hid_custom_sensor > > _hid_custom_sensors
Definition: backend-hid.h:220
librealsense::platform::hid_custom_sensor::_callback
hid_callback _callback
Definition: backend-hid.h:127
librealsense::platform::hid_custom_sensor::_hid_thread
std::unique_ptr< std::thread > _hid_thread
Definition: backend-hid.h:129
librealsense::platform::hid_custom_sensor::stop_capture
void stop_capture()
Definition: backend-hid.cpp:322
librealsense::platform::iio_hid_sensor::signal_stop
void signal_stop()
Definition: backend-hid.cpp:720
librealsense::platform::iio_hid_sensor::get_channel_size
uint32_t get_channel_size() const
Definition: backend-hid.cpp:824
rspy.devices.path
path
Definition: devices.py:50
librealsense::platform::iio_hid_sensor::create_channel_array
void create_channel_array()
Definition: backend-hid.cpp:742
librealsense::platform::v4l_hid_device::custom_id
static constexpr const char * custom_id
Definition: backend-hid.h:223
librealsense::platform::hid_input_info::is_signed
uint32_t is_signed
Definition: backend-hid.h:27
index
GLuint index
Definition: glad/glad/glad.h:2777
librealsense::platform::iio_hid_sensor::stop_capture
void stop_capture()
Definition: backend-hid.cpp:638
librealsense::platform::v4l_hid_device::_iio_hid_sensors
std::vector< std::unique_ptr< iio_hid_sensor > > _iio_hid_sensors
Definition: backend-hid.h:219
librealsense::bytes
Definition: align.cpp:15
librealsense::platform::iio_hid_sensor::_sampling_frequency_name
std::string _sampling_frequency_name
Definition: backend-hid.h:179
librealsense::platform::hid_input::init
void init()
Definition: backend-hid.cpp:79
librealsense::platform::v4l_hid_device::register_profiles
void register_profiles(const std::vector< hid_profile > &hid_profiles) override
Definition: backend-hid.h:196
librealsense::platform::hid_input::hid_input
hid_input(const std::string &iio_device_path, const std::string &input_name)
Definition: backend-hid.cpp:38
librealsense::platform::iio_hid_sensor::iio_hid_sensor
iio_hid_sensor(const std::string &device_path, uint32_t frequency)
Definition: backend-hid.cpp:447
librealsense::platform::iio_hid_sensor
Definition: backend-hid.h:133
librealsense::platform::hid_buf_len
const uint32_t hid_buf_len
Definition: backend-hid.h:15
librealsense::platform::iio_hid_sensor::has_metadata
bool has_metadata()
Definition: backend-hid.cpp:730
librealsense::platform::iio_hid_sensor::get_sensor_name
const std::string & get_sensor_name() const
Definition: backend-hid.h:144
rspy.test.info
def info(name, value, persistent=False)
Definition: test.py:327
dispatcher
Definition: concurrency.h:272
librealsense::platform::hid_input_info::bits_used
uint32_t bits_used
Definition: backend-hid.h:25
LOG_WARNING
#define LOG_WARNING(...)
Definition: easyloggingpp.h:57
librealsense::platform::hid_custom_sensor::start_capture
void start_capture(hid_callback sensor_callback)
Definition: backend-hid.cpp:201
librealsense::platform::iio_hid_sensor::start_capture
void start_capture(hid_callback sensor_callback)
Definition: backend-hid.cpp:480
librealsense::platform::v4l_hid_device::v4l_hid_device
v4l_hid_device(const hid_device_info &info)
Definition: backend-hid.cpp:936
val
GLuint GLfloat * val
Definition: glad/glad/glad.h:3411
librealsense::platform::hid_custom_sensor::hid_custom_sensor
hid_custom_sensor(const std::string &device_path, const std::string &sensor_name)
Definition: backend-hid.cpp:153
librealsense::platform::hid_input::~hid_input
~hid_input()
Definition: backend-hid.cpp:55
librealsense::platform::hid_custom_sensor::~hid_custom_sensor
~hid_custom_sensor()
Definition: backend-hid.cpp:166
uint32_t
unsigned int uint32_t
Definition: stdint.h:80
librealsense::platform::iio_hid_sensor::_fd
int _fd
Definition: backend-hid.h:175
librealsense::platform::hid_input_info
Definition: backend-hid.h:17
librealsense::platform::hid_input_info::input
std::string input
Definition: backend-hid.h:19
value
GLfloat value
Definition: glad/glad/glad.h:2099
uint64_t
unsigned __int64 uint64_t
Definition: stdint.h:90
librealsense::platform::hid_custom_sensor::get_sensor_name
const std::string & get_sensor_name() const
Definition: backend-hid.h:106
librealsense::platform::iio_hid_sensor::read_device_inputs
void read_device_inputs()
Definition: backend-hid.cpp:894
librealsense::platform::v4l_hid_device
Definition: backend-hid.h:189
t265_stereo.callback
def callback(frame)
Definition: t265_stereo.py:91
location
GLint location
Definition: glad/glad/glad.h:2834
librealsense::platform::iio_hid_sensor::clear_buffer
void clear_buffer()
Definition: backend-hid.cpp:662
librealsense::platform::iio_hid_sensor::get_output_size
uint32_t get_output_size() const
Definition: backend-hid.cpp:849
librealsense::platform::hid_custom_sensor
Definition: backend-hid.h:98
librealsense::platform::v4l_hid_device::stop_capture
void stop_capture() override
Definition: backend-hid.cpp:1105
librealsense::platform::v4l_hid_device::foreach_hid_device
static void foreach_hid_device(std::function< void(const hid_device_info &)> action)
Definition: backend-hid.cpp:1138
librealsense::platform::v4l_hid_device::close
void close() override
Definition: backend-hid.cpp:1009
librealsense::platform::hid_custom_sensor::_stop_pipe_fd
int _stop_pipe_fd[2]
Definition: backend-hid.h:122
librealsense::platform::hid_custom_sensor::enable
void enable(bool state)
Definition: backend-hid.cpp:412
librealsense::platform::hid_custom_sensor::_fd
int _fd
Definition: backend-hid.h:121
librealsense::platform::v4l_hid_device::~v4l_hid_device
~v4l_hid_device()
Definition: backend-hid.cpp:951
backend.h
librealsense::platform::hid_custom_sensor::_custom_device_path
std::string _custom_device_path
Definition: backend-hid.h:124
librealsense::platform::iio_hid_sensor::_hid_thread
std::unique_ptr< std::thread > _hid_thread
Definition: backend-hid.h:184
t265_stereo.T
T
Definition: t265_stereo.py:157
librealsense::platform::iio_hid_sensor::_iio_device_path
std::string _iio_device_path
Definition: backend-hid.h:177
librealsense::platform::hid_custom_sensor::get_report_data
std::vector< uint8_t > get_report_data(const std::string &report_name, custom_sensor_report_field report_field)
Definition: backend-hid.cpp:179
rspy.devices.action
string action
Definition: devices.py:737
librealsense::platform::iio_hid_sensor::_pm_dispatcher
dispatcher _pm_dispatcher
Definition: backend-hid.h:186
librealsense::platform::hid_input
Definition: backend-hid.h:80
librealsense::platform::custom_sensor_report_field
custom_sensor_report_field
Definition: backend.h:311
librealsense::platform::hid_input_info::shift
uint32_t shift
Definition: backend-hid.h:29
librealsense::platform::hid_custom_sensor::init
void init()
Definition: backend-hid.cpp:367
librealsense::big_endian
Definition: src/types.h:227
first
GLint first
Definition: glad/glad/glad.h:2301
librealsense::platform::iio_hid_sensor::sort_hids
static bool sort_hids(hid_input *first, hid_input *second)
Definition: backend-hid.cpp:737
librealsense::platform::iio_hid_sensor::set_frequency
void set_frequency(uint32_t frequency)
Definition: backend-hid.cpp:689
state
Definition: rs-measure.cpp:80
librealsense::platform::v4l_hid_device::_streaming_custom_sensors
std::vector< hid_custom_sensor * > _streaming_custom_sensors
Definition: backend-hid.h:222
librealsense::platform::iio_hid_sensor::set_power
void set_power(bool on)
Definition: backend-hid.cpp:704
librealsense::platform::iio_hid_sensor::_is_capturing
std::atomic< bool > _is_capturing
Definition: backend-hid.h:183
librealsense::platform::hid_input_info::mask
uint64_t mask
Definition: backend-hid.h:30
librealsense::platform::v4l_hid_device::start_capture
void start_capture(hid_callback callback) override
Definition: backend-hid.cpp:1039
librealsense::platform::v4l_hid_device::get_custom_report_data
std::vector< uint8_t > get_custom_report_data(const std::string &custom_sensor_name, const std::string &report_name, custom_sensor_report_field report_field) override
Definition: backend-hid.cpp:1122
librealsense::platform::iio_hid_sensor::_sensor_name
std::string _sensor_name
Definition: backend-hid.h:178
librealsense::platform::iio_hid_sensor::~iio_hid_sensor
~iio_hid_sensor()
Definition: backend-hid.cpp:461
librealsense::platform::hid_callback
std::function< void(const sensor_data &)> hid_callback
Definition: backend.h:335
librealsense::platform::v4l_hid_device::_hid_device_infos
std::vector< hid_device_info > _hid_device_infos
Definition: backend-hid.h:218
librealsense::platform::hid_input_info::device_path
std::string device_path
Definition: backend-hid.h:20
librealsense::platform::v4l_hid_device::get_hid_device_info
static bool get_hid_device_info(const char *dev_path, hid_device_info &device_info)
Definition: backend-hid.cpp:1212
librealsense::platform::hid_input::info
hid_input_info info
Definition: backend-hid.h:95
librealsense::platform::iio_hid_sensor::_callback
hid_callback _callback
Definition: backend-hid.h:182
librealsense::platform::iio_hid_sensor::_pm_thread
std::unique_ptr< std::thread > _pm_thread
Definition: backend-hid.h:185
librealsense::platform::hid_custom_sensor::_custom_sensor_name
std::string _custom_sensor_name
Definition: backend-hid.h:125
librealsense::platform::iio_hid_sensor::get_sampling_frequency_name
std::string get_sampling_frequency_name() const
Definition: backend-hid.cpp:863
librealsense::platform::hid_input::enable
void enable(bool is_enable)
Definition: backend-hid.cpp:61
librealsense::platform::iio_hid_sensor::_stop_pipe_fd
int _stop_pipe_fd[2]
Definition: backend-hid.h:174
librealsense::platform::v4l_hid_device::_streaming_iio_sensors
std::vector< iio_hid_sensor * > _streaming_iio_sensors
Definition: backend-hid.h:221


librealsense2
Author(s): LibRealSense ROS Team
autogenerated on Thu Dec 22 2022 03:13:13