Intel® RealSense™ Cross Platform API
Intel Realsense Cross-platform API
hw-monitor.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 
4 #pragma once
5 
6 #include "sensor.h"
7 #include <mutex>
8 
9 const uint8_t IV_COMMAND_FIRMWARE_UPDATE_MODE = 0x01;
10 const uint8_t IV_COMMAND_GET_CALIBRATION_DATA = 0x02;
11 const uint8_t IV_COMMAND_LASER_POWER = 0x03;
12 const uint8_t IV_COMMAND_DEPTH_ACCURACY = 0x04;
13 const uint8_t IV_COMMAND_ZUNIT = 0x05;
14 const uint8_t IV_COMMAND_LOW_CONFIDENCE_LEVEL = 0x06;
15 const uint8_t IV_COMMAND_INTENSITY_IMAGE_TYPE = 0x07;
17 const uint8_t IV_COMMAND_POWER_GEAR = 0x09;
18 const uint8_t IV_COMMAND_FILTER_OPTION = 0x0A;
19 const uint8_t IV_COMMAND_VERSION = 0x0B;
21 
22 const uint8_t IVCAM_MONITOR_INTERFACE = 0x4;
23 const uint8_t IVCAM_MONITOR_ENDPOINT_OUT = 0x1;
24 const uint8_t IVCAM_MONITOR_ENDPOINT_IN = 0x81;
25 const uint8_t IVCAM_MIN_SUPPORTED_VERSION = 13;
26 const uint8_t IVCAM_MONITOR_HEADER_SIZE = (sizeof(uint32_t) * 6);
27 const uint8_t NUM_OF_CALIBRATION_PARAMS = 100;
28 const uint8_t PARAMETERS2_BUFFER_SIZE = 50;
29 const uint8_t SIZE_OF_CALIB_HEADER_BYTES = 4;
30 const uint8_t NUM_OF_CALIBRATION_COEFFS = 64;
31 
32 const uint16_t MAX_SIZE_OF_CALIB_PARAM_BYTES = 800;
33 const uint16_t SIZE_OF_CALIB_PARAM_BYTES = 512;
34 const uint16_t IVCAM_MONITOR_MAGIC_NUMBER = 0xcdab;
35 const uint16_t IVCAM_MONITOR_MAX_BUFFER_SIZE = 1024;
36 const uint16_t IVCAM_MONITOR_MUTEX_TIMEOUT = 3000;
37 const uint16_t HW_MONITOR_COMMAND_SIZE = 1000;
38 const uint16_t HW_MONITOR_BUFFER_SIZE = 1024;
39 const uint16_t HW_MONITOR_DATA_SIZE_OFFSET = 1020;
40 const uint16_t SIZE_OF_HW_MONITOR_HEADER = 4;
41 
42 
43 
44 namespace librealsense
45 {
46  class uvc_sensor;
47 
49  {
50  public:
51  locked_transfer(std::shared_ptr<platform::command_transfer> command_transfer, uvc_sensor& uvc_ep)
52  :_command_transfer(command_transfer),
53  _uvc_sensor_base(uvc_ep)
54  {}
55 
56  std::vector<uint8_t> send_receive(
57  const std::vector<uint8_t>& data,
58  int timeout_ms = 5000,
59  bool require_response = true)
60  {
61  std::lock_guard<std::recursive_mutex> lock(_local_mtx);
62  return _uvc_sensor_base.invoke_powered([&]
64  {
65  std::lock_guard<platform::uvc_device> lock(dev);
66  return _command_transfer->send_receive(data, timeout_ms, require_response);
67  });
68  }
69 
70  private:
71  std::shared_ptr<platform::command_transfer> _command_transfer;
72  uvc_sensor& _uvc_sensor_base;
73  std::recursive_mutex _local_mtx;
74  };
75 
76  struct command
77  {
78  uint8_t cmd;
79  int param1;
80  int param2;
81  int param3;
82  int param4;
83  std::vector<uint8_t> data;
84  int timeout_ms = 5000;
85  bool require_response = true;
86 
87  explicit command(uint8_t cmd, int param1 = 0, int param2 = 0,
88  int param3 = 0, int param4 = 0, int timeout_ms = 5000,
89  bool require_response = true)
90  : cmd(cmd), param1(param1),
91  param2(param2),
92  param3(param3), param4(param4),
93  timeout_ms(timeout_ms), require_response(require_response)
94  {
95  }
96  };
97 
98  class hw_monitor
99  {
100  struct hwmon_cmd
101  {
102  uint8_t cmd;
103  int param1;
104  int param2;
105  int param3;
106  int param4;
107  uint8_t data[HW_MONITOR_BUFFER_SIZE];
108  int sizeOfSendCommandData;
109  long timeOut;
110  bool oneDirection;
111  uint8_t receivedCommandData[HW_MONITOR_BUFFER_SIZE];
112  size_t receivedCommandDataLength;
113  uint8_t receivedOpcode[4];
114 
115  explicit hwmon_cmd(uint8_t cmd_id)
116  : cmd(cmd_id),
117  param1(0),
118  param2(0),
119  param3(0),
120  param4(0),
121  sizeOfSendCommandData(0),
122  timeOut(5000),
123  oneDirection(false),
124  receivedCommandDataLength(0)
125  {}
126 
127 
128  explicit hwmon_cmd(const command& cmd)
129  : cmd(cmd.cmd),
130  param1(cmd.param1),
131  param2(cmd.param2),
132  param3(cmd.param3),
133  param4(cmd.param4),
134  sizeOfSendCommandData(std::min((uint16_t)cmd.data.size(), HW_MONITOR_BUFFER_SIZE)),
135  timeOut(cmd.timeout_ms),
136  oneDirection(!cmd.require_response),
137  receivedCommandDataLength(0)
138  {
139  librealsense::copy(data, cmd.data.data(), sizeOfSendCommandData);
140  }
141  };
142 
143  struct hwmon_cmd_details
144  {
145  bool oneDirection;
146  std::array<uint8_t, HW_MONITOR_COMMAND_SIZE> sendCommandData;
147  int sizeOfSendCommandData;
148  long timeOut;
149  std::array<uint8_t, 4> receivedOpcode;
150  std::array<uint8_t, HW_MONITOR_BUFFER_SIZE> receivedCommandData;
151  size_t receivedCommandDataLength;
152  };
153 
154  static void fill_usb_buffer(int opCodeNumber, int p1, int p2, int p3, int p4, uint8_t* data, int dataLength, uint8_t* bufferToSend, int& length);
155  void execute_usb_command(uint8_t *out, size_t outSize, uint32_t& op, uint8_t* in, size_t& inSize) const;
156  static void update_cmd_details(hwmon_cmd_details& details, size_t receivedCmdLen, unsigned char* outputBuffer);
157  void send_hw_monitor_command(hwmon_cmd_details& details) const;
158 
159  std::shared_ptr<locked_transfer> _locked_transfer;
160  public:
161  explicit hw_monitor(std::shared_ptr<locked_transfer> locked_transfer)
162  : _locked_transfer(std::move(locked_transfer))
163  {}
164 
165  std::vector<uint8_t> send(std::vector<uint8_t> data) const;
166  std::vector<uint8_t> send(command cmd) const;
167  void get_gvd(size_t sz, unsigned char* gvd, uint8_t gvd_cmd) const;
168  std::string get_firmware_version_string(int gvd_cmd, uint32_t offset) const;
169  std::string get_module_serial_string(uint8_t gvd_cmd, uint32_t offset) const;
170  bool is_camera_locked(uint8_t gvd_cmd, uint32_t offset) const;
171  };
172 }
const uint8_t IVCAM_MONITOR_ENDPOINT_IN
Definition: hw-monitor.h:24
const uint8_t IV_COMMAND_POWER_GEAR
Definition: hw-monitor.h:17
auto invoke_powered(T action) -> decltype(action(*static_cast< platform::uvc_device *>(nullptr)))
Definition: sensor.h:195
const uint8_t IV_COMMAND_CONFIDENCE_THRESHHOLD
Definition: hw-monitor.h:20
const uint8_t IV_COMMAND_FIRMWARE_UPDATE_MODE
Definition: hw-monitor.h:9
int param4
Definition: hw-monitor.h:82
const uint8_t NUM_OF_CALIBRATION_COEFFS
Definition: hw-monitor.h:30
Definition: hw-monitor.h:98
const uint8_t IVCAM_MONITOR_INTERFACE
Definition: hw-monitor.h:22
int param2
Definition: hw-monitor.h:80
const uint8_t IV_COMMAND_FILTER_OPTION
Definition: hw-monitor.h:18
Definition: stream.h:188
const uint16_t IVCAM_MONITOR_MAGIC_NUMBER
Definition: hw-monitor.h:34
Definition: algo.h:16
locked_transfer(std::shared_ptr< platform::command_transfer > command_transfer, uvc_sensor &uvc_ep)
Definition: hw-monitor.h:51
const uint8_t IV_COMMAND_INTENSITY_IMAGE_TYPE
Definition: hw-monitor.h:15
const uint8_t IV_COMMAND_ZUNIT
Definition: hw-monitor.h:13
int timeout_ms
Definition: hw-monitor.h:84
const uint8_t SIZE_OF_CALIB_HEADER_BYTES
Definition: hw-monitor.h:29
std::vector< uint8_t > send_receive(const std::vector< uint8_t > &data, int timeout_ms=5000, bool require_response=true)
Definition: hw-monitor.h:56
std::vector< uint8_t > data
Definition: hw-monitor.h:83
const uint8_t PARAMETERS2_BUFFER_SIZE
Definition: hw-monitor.h:28
const uint8_t IV_COMMAND_MOTION_VS_RANGE_TRADE
Definition: hw-monitor.h:16
const uint16_t SIZE_OF_CALIB_PARAM_BYTES
Definition: hw-monitor.h:33
const uint8_t IVCAM_MIN_SUPPORTED_VERSION
Definition: hw-monitor.h:25
const uint16_t IVCAM_MONITOR_MAX_BUFFER_SIZE
Definition: hw-monitor.h:35
int param3
Definition: hw-monitor.h:81
const uint16_t HW_MONITOR_BUFFER_SIZE
Definition: hw-monitor.h:38
uint8_t cmd
Definition: hw-monitor.h:78
const uint8_t NUM_OF_CALIBRATION_PARAMS
Definition: hw-monitor.h:27
const uint16_t HW_MONITOR_COMMAND_SIZE
Definition: hw-monitor.h:37
const uint16_t HW_MONITOR_DATA_SIZE_OFFSET
Definition: hw-monitor.h:39
Definition: hw-monitor.h:48
const uint8_t IV_COMMAND_GET_CALIBRATION_DATA
Definition: hw-monitor.h:10
const uint16_t MAX_SIZE_OF_CALIB_PARAM_BYTES
Definition: hw-monitor.h:32
command(uint8_t cmd, int param1=0, int param2=0, int param3=0, int param4=0, int timeout_ms=5000, bool require_response=true)
Definition: hw-monitor.h:87
const uint8_t IV_COMMAND_DEPTH_ACCURACY
Definition: hw-monitor.h:12
const uint16_t SIZE_OF_HW_MONITOR_HEADER
Definition: hw-monitor.h:40
const uint8_t IVCAM_MONITOR_HEADER_SIZE
Definition: hw-monitor.h:26
bool require_response
Definition: hw-monitor.h:85
Definition: backend.h:411
const uint8_t IV_COMMAND_LASER_POWER
Definition: hw-monitor.h:11
int param1
Definition: hw-monitor.h:79
const uint8_t IV_COMMAND_VERSION
Definition: hw-monitor.h:19
const uint8_t IVCAM_MONITOR_ENDPOINT_OUT
Definition: hw-monitor.h:23
const uint16_t IVCAM_MONITOR_MUTEX_TIMEOUT
Definition: hw-monitor.h:36
hw_monitor(std::shared_ptr< locked_transfer > locked_transfer)
Definition: hw-monitor.h:161
Definition: hw-monitor.h:76
Definition: sensor.h:174
void copy(void *dst, void const *src, size_t size)
const uint8_t IV_COMMAND_LOW_CONFIDENCE_LEVEL
Definition: hw-monitor.h:14