ds5-factory.cpp
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2016 Intel Corporation. All Rights Reserved.
3 
4 #include <mutex>
5 #include <chrono>
6 #include <vector>
7 #include <iterator>
8 #include <cstddef>
9 
10 #include "device.h"
11 #include "context.h"
12 #include "image.h"
13 #include "metadata-parser.h"
14 
15 #include "ds5-factory.h"
16 #include "ds5-private.h"
17 #include "ds5-options.h"
18 #include "ds5-timestamp.h"
19 #include "ds5-nonmonochrome.h"
20 #include "ds5-active.h"
21 #include "ds5-color.h"
22 #include "ds5-motion.h"
23 #include "ds5-thermal-monitor.h"
24 #include "sync.h"
25 
26 #include "../firmware_logger_device.h"
27 #include "device-calibration.h"
28 
29 namespace librealsense
30 {
31  // PSR
35  {
36  public:
37  rs400_device(std::shared_ptr<context> ctx,
39  bool register_device_notifications)
40  : device(ctx, group, register_device_notifications),
41  ds5_device(ctx, group),
42  ds5_nonmonochrome(ctx, group),
47 
48  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
49 
50  std::vector<tagged_profile> get_profiles_tags() const override
51  {
52  std::vector<tagged_profile> tags;
53  auto usb_spec = get_usb_spec();
55  {
58  tags.push_back({ RS2_STREAM_INFRARED, 2, 1280, 720, RS2_FORMAT_RGB8, 30, profile_tag::PROFILE_TAG_SUPERSET });
59  }
60  else
61  {
64  tags.push_back({ RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_RGB8, 15, profile_tag::PROFILE_TAG_SUPERSET });
65  }
66  return tags;
67  };
68  };
69 
70  // DS5U_S
71  class rs405u_device : public ds5u_device,
74  {
75  public:
76  rs405u_device(std::shared_ptr<context> ctx,
78  bool register_device_notifications)
79  : device(ctx, group, register_device_notifications),
80  ds5u_device(ctx, group),
85 
86  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
87 
88  std::vector<tagged_profile> get_profiles_tags() const override
89  {
90  std::vector<tagged_profile> tags;
91  auto usb_spec = get_usb_spec();
93  {
96  tags.push_back({ RS2_STREAM_INFRARED, 2, 1152, 1152, RS2_FORMAT_Y16, 30, profile_tag::PROFILE_TAG_SUPERSET });
97  }
98  else
99  {
102  tags.push_back({ RS2_STREAM_INFRARED, 2, 1152, 1152, RS2_FORMAT_Y16, 15, profile_tag::PROFILE_TAG_SUPERSET });
103  }
104  return tags;
105  };
106 
107  bool contradicts(const stream_profile_interface* a, const std::vector<stream_profile>& others) const override
108  {
109  if (auto vid_a = dynamic_cast<const video_stream_profile_interface*>(a))
110  {
111  for (auto request : others)
112  {
113  if (a->get_framerate() != 0 && request.fps != 0 && (a->get_framerate() != request.fps))
114  return true;
115  }
116  }
117  return false;
118  }
119  };
120 
121  // ASR (D460)
123  public ds5_active,
124  public ds5_advanced_mode_base,
126  {
127  public:
128  rs410_device(std::shared_ptr<context> ctx,
130  bool register_device_notifications)
131  : device(ctx, group, register_device_notifications),
132  ds5_device(ctx, group),
133  ds5_nonmonochrome(ctx, group),
134  ds5_active(ctx, group),
139 
140  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
141 
142  std::vector<tagged_profile> get_profiles_tags() const override
143  {
144  std::vector<tagged_profile> tags;
145  auto usb_spec = get_usb_spec();
147  {
150  }
151  else
152  {
153  //TODO: F416 currntlly detected as RS_USB2_PID when connected via USB2 port
154  }
155  return tags;
156  };
157  };
158 
159  // ASRC
161  public ds5_active,
162  public ds5_color,
163  public ds5_advanced_mode_base,
165  {
166  public:
167  rs415_device(std::shared_ptr<context> ctx,
169  bool register_device_notifications)
170  : device(ctx, group, register_device_notifications),
171  ds5_device(ctx, group),
172  ds5_nonmonochrome(ctx, group),
173  ds5_active(ctx, group),
174  ds5_color(ctx, group),
179 
180  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
181 
182  std::vector<tagged_profile> get_profiles_tags() const override
183  {
184  std::vector<tagged_profile> tags;
185  auto usb_spec = get_usb_spec();
187  {
190  tags.push_back({ RS2_STREAM_INFRARED, -1, 1280, 720, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
191  }
192  else
193  {
196  tags.push_back({ RS2_STREAM_INFRARED, -1, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
197  }
198  return tags;
199  };
200  };
201 
203  public ds5_active,
204  public ds5_advanced_mode_base,
206  {
207  public:
208  rs416_device(std::shared_ptr<context> ctx,
210  bool register_device_notifications)
211  : device(ctx, group, register_device_notifications),
212  ds5_device(ctx, group),
213  ds5_nonmonochrome(ctx, group),
214  ds5_active(ctx, group),
219 
220  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
221 
222  std::vector<tagged_profile> get_profiles_tags() const override
223  {
224  std::vector<tagged_profile> tags;
225  auto usb_spec = get_usb_spec();
227  {
230  }
231  else
232  {
235  }
236  return tags;
237  };
238 
239  bool contradicts(const stream_profile_interface* a, const std::vector<stream_profile>& others) const override
240  {
241  if (auto vid_a = dynamic_cast<const video_stream_profile_interface*>(a))
242  {
243  for (auto request : others)
244  {
245  if (a->get_framerate() != 0 && request.fps != 0 && (a->get_framerate() != request.fps))
246  return true;
247  }
248  }
249  return false;
250  }
251  };
252 
254  public ds5_nonmonochrome,
255  public ds5_active,
256  public ds5_color,
257  public ds5_advanced_mode_base,
259 
260  {
261  public:
262  rs416_rgb_device(std::shared_ptr<context> ctx,
264  bool register_device_notifications)
265  : device(ctx, group, register_device_notifications),
266  ds5_device(ctx, group),
267  ds5_nonmonochrome(ctx, group),
268  ds5_active(ctx, group),
269  ds5_color(ctx, group),
274 
275  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
276 
277  std::vector<tagged_profile> get_profiles_tags() const override
278  {
279  std::vector<tagged_profile> tags;
280  auto usb_spec = get_usb_spec();
282  {
285  tags.push_back({ RS2_STREAM_INFRARED, 1, 720, 720, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
286  }
287  else
288  {
291  tags.push_back({ RS2_STREAM_INFRARED, 1, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
292  }
293  return tags;
294  };
295 
296  bool contradicts(const stream_profile_interface* a, const std::vector<stream_profile>& others) const override
297  {
298  if (auto vid_a = dynamic_cast<const video_stream_profile_interface*>(a))
299  {
300  for (auto request : others)
301  {
302  if (a->get_framerate() != 0 && request.fps != 0 && (a->get_framerate() != request.fps))
303  return true;
304  }
305  }
306  return false;
307  }
308  };
309 
310  // PWGT
311  class rs420_mm_device : public ds5_motion,
312  public ds5_advanced_mode_base,
314  {
315  public:
316  rs420_mm_device(std::shared_ptr<context> ctx,
318  bool register_device_notifications)
319  : device(ctx, group, register_device_notifications),
320  ds5_device(ctx, group),
321  ds5_motion(ctx, group),
326 
327  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
328 
329  std::vector<tagged_profile> get_profiles_tags() const override
330  {
331  std::vector<tagged_profile> tags;
332  auto usb_spec = get_usb_spec();
334  {
337  tags.push_back({ RS2_STREAM_INFRARED, 2, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
338  }
339  else
340  {
343  tags.push_back({ RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
344  }
345 
346  if (_fw_version >= firmware_version("5.10.4.0"))
347  {
352  }
353 
354  return tags;
355  };
356  };
357 
358  // PWG
359  class rs420_device : public ds5_device,
360  public ds5_advanced_mode_base,
362  {
363  public:
364  rs420_device(std::shared_ptr<context> ctx,
366  bool register_device_notifications)
367  : device(ctx, group, register_device_notifications),
368  ds5_device(ctx, group),
373 
374  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
375 
376  std::vector<tagged_profile> get_profiles_tags() const override
377  {
378  std::vector<tagged_profile> tags;
379  auto usb_spec = get_usb_spec();
381  {
384  tags.push_back({ RS2_STREAM_INFRARED, 2, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
385  }
386  else
387  {
390  tags.push_back({ RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
391  }
392  return tags;
393  };
394  };
395 
396  // AWG
397  class rs430_device : public ds5_active,
398  public ds5_advanced_mode_base,
400  {
401  public:
402  rs430_device(std::shared_ptr<context> ctx,
404  bool register_device_notifications)
405  : device(ctx, group, register_device_notifications),
406  ds5_device(ctx, group),
407  ds5_active(ctx, group),
412 
413  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
414 
415  std::vector<tagged_profile> get_profiles_tags() const override
416  {
417  std::vector<tagged_profile> tags;
418  auto usb_spec = get_usb_spec();
420  {
423  tags.push_back({ RS2_STREAM_INFRARED, 2, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
424  }
425  else
426  {
429  tags.push_back({ RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
430  }
431  return tags;
432  };
433  };
434 
435  class rs430i_device : public ds5_active,
436  public ds5_advanced_mode_base,
437  public ds5_motion,
439  {
440  public:
441  rs430i_device(std::shared_ptr<context> ctx,
443  bool register_device_notifications)
444  : device(ctx, group, register_device_notifications),
445  ds5_device(ctx, group),
446  ds5_active(ctx, group),
448  ds5_motion(ctx, group),
452  {}
453 
454  std::vector<tagged_profile> get_profiles_tags() const override
455  {
456  std::vector<tagged_profile> tags;
457  auto usb_spec = get_usb_spec();
459  {
462  tags.push_back({ RS2_STREAM_INFRARED, 2, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
463  }
464  else
465  {
468  tags.push_back({ RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
469  }
473 
474  return tags;
475  };
476  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
477  };
478 
479  // AWGT
480  class rs430_mm_device : public ds5_active,
481  public ds5_motion,
482  public ds5_advanced_mode_base,
484  {
485  public:
486  rs430_mm_device(std::shared_ptr<context> ctx,
488  bool register_device_notifications)
489  : device(ctx, group, register_device_notifications),
490  ds5_device(ctx, group),
491  ds5_active(ctx, group),
492  ds5_motion(ctx, group),
497 
498  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
499 
500  std::vector<tagged_profile> get_profiles_tags() const override
501  {
502  std::vector<tagged_profile> tags;
503  auto usb_spec = get_usb_spec();
505  {
508  tags.push_back({ RS2_STREAM_INFRARED, 2, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
509 
510  }
511  else
512  {
515  tags.push_back({ RS2_STREAM_INFRARED, 2, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
516  }
517 
519  if (_fw_version >= firmware_version("5.10.4.0")) // Back-compat with records is required
520  {
524  }
525 
526  return tags;
527  };
528  };
529 
530  // AWGC
531  class rs435_device : public ds5_active,
532  public ds5_color,
533  public ds5_advanced_mode_base,
535  {
536  public:
537  rs435_device(std::shared_ptr<context> ctx,
539  bool register_device_notifications)
540  : device(ctx, group, register_device_notifications),
541  ds5_device(ctx, group),
542  ds5_active(ctx, group),
543  ds5_color(ctx, group),
548 
549  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
550 
551  std::vector<tagged_profile> get_profiles_tags() const override
552  {
553  std::vector<tagged_profile> tags;
554  auto usb_spec = get_usb_spec();
556  {
559  tags.push_back({ RS2_STREAM_INFRARED, -1, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
560  }
561  else
562  {
565  tags.push_back({ RS2_STREAM_INFRARED, -1, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
566  }
567  return tags;
568  };
569  };
570 
571  // AWGCT
573  public ds5_color,
574  public ds5_motion,
575  public ds5_advanced_mode_base,
577  {
578  public:
579  rs430_rgb_mm_device(std::shared_ptr<context> ctx,
581  bool register_device_notifications)
582  : device(ctx, group, register_device_notifications),
583  ds5_device(ctx, group),
584  ds5_active(ctx, group),
585  ds5_color(ctx, group),
586  ds5_motion(ctx, group),
591 
592  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
593 
594  std::vector<tagged_profile> get_profiles_tags() const override
595  {
596  std::vector<tagged_profile> tags;
597  auto usb_spec = get_usb_spec();
599  {
602  tags.push_back({ RS2_STREAM_INFRARED, -1, 848, 480, RS2_FORMAT_Y8, 30, profile_tag::PROFILE_TAG_SUPERSET });
603  }
604  else
605  {
608  tags.push_back({ RS2_STREAM_INFRARED, -1, 640, 480, RS2_FORMAT_Y8, 15, profile_tag::PROFILE_TAG_SUPERSET });
609  }
610  return tags;
611  };
612  };
613 
614 
615  class rs435i_device : public ds5_active,
616  public ds5_color,
617  public ds5_motion,
618  public ds5_advanced_mode_base,
620  {
621  public:
622  rs435i_device(std::shared_ptr<context> ctx,
624  bool register_device_notifications)
625  : device(ctx, group, register_device_notifications),
626  ds5_device(ctx, group),
627  ds5_active(ctx, group),
628  ds5_color(ctx, group),
629  ds5_motion(ctx, group),
634  {
635  check_and_restore_rgb_stream_extrinsic();
636  }
637 
638  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
639 
640  std::vector<tagged_profile> get_profiles_tags() const override
641  {
642  std::vector<tagged_profile> tags;
643  auto usb_spec = get_usb_spec();
645 
646  int depth_width = usb3mode ? 848 : 640;
647  int depth_height = usb3mode ? 480 : 480;
648  int color_width = usb3mode ? 1280 : 640;
649  int color_height = usb3mode ? 720 : 480;
650  int fps = usb3mode ? 30 : 15;
651 
658  return tags;
659  };
660  bool compress_while_record() const override { return false; }
661 
662  private:
664  {
665  for(auto iter = 0, rec =0; iter < 2; iter++, rec++)
666  {
667  std::vector<byte> cal;
668  try
669  {
670  cal = *_color_calib_table_raw;
671  }
672  catch (...)
673  {
674  LOG_WARNING("Cannot read RGB calibration table");
675  }
676 
677  if (!is_rgb_extrinsic_valid(cal) && !rec)
678  {
679  restore_rgb_extrinsic();
680  }
681  else
682  break;
683  };
684  }
685 
686  bool is_rgb_extrinsic_valid(const std::vector<uint8_t>& raw_data) const
687  {
688  try
689  {
690  // verify extrinsic calibration table structure
691  auto table = ds::check_calib<ds::rgb_calibration_table>(raw_data);
692 
693  if ( (table->header.version != 0 && table->header.version != 0xffff) && (table->header.table_size >= sizeof(ds::rgb_calibration_table) - sizeof(ds::table_header)))
694  {
695  float3 trans_vector = table->translation_rect;
696  // Translation Heuristic tests
697  auto found = false;
698  for (auto i = 0; i < 3; i++)
699  {
700  //Nan/Infinity are not allowed
701  if (!std::isfinite(trans_vector[i]))
702  {
703  LOG_WARNING("RGB extrinsic - translation is corrupted: " << trans_vector);
704  return false;
705  }
706  // Translation must be assigned for at least one axis
707  if (std::fabs(trans_vector[i]) > std::numeric_limits<float>::epsilon())
708  found = true;
709  }
710 
711  if (!found)
712  {
713  LOG_WARNING("RGB extrinsic - invalid (zero) translation: " << trans_vector);
714  return false;
715  }
716 
717  // Rotation Heuristic tests
718  auto num_found = 0;
719  float3x3 rect_rot_mat = table->rotation_matrix_rect;
720  for (auto i = 0; i < 3; i++)
721  {
722  for (auto j = 0; j < 3; j++)
723  {
724  //Nan/Infinity are not allowed
725  if (!std::isfinite(rect_rot_mat(i, j)))
726  {
727  LOG_DEBUG("RGB extrinsic - rotation matrix corrupted:\n" << rect_rot_mat);
728  return false;
729  }
730 
731  if (std::fabs(rect_rot_mat(i, j)) > std::numeric_limits<float>::epsilon())
732  num_found++;
733  }
734  }
735 
736  bool res = (num_found >= 3); // At least three matrix indexes must be non-zero
737  if (!res) // At least three matrix indexes must be non-zero
738  LOG_DEBUG("RGB extrinsic - rotation matrix invalid:\n" << rect_rot_mat);
739 
740  return res;
741  }
742  else
743  {
744  LOG_WARNING("RGB extrinsic - header corrupted: "
745  << "Version: " <<std::setfill('0') << std::setw(4) << std::hex << table->header.version
746  << ", type " << std::dec << table->header.table_type << ", size " << table->header.table_size);
747  return false;
748  }
749  }
750  catch (...)
751  {
752  return false;
753  }
754  }
755 
756  void assign_rgb_stream_extrinsic(const std::vector<byte>& calib)
757  {
758  //write calibration to preset
760  cmd.data = calib;
761  ds5_device::_hw_monitor->send(cmd);
762  }
763 
764  std::vector<byte> read_sector(const uint32_t address, const uint16_t size) const
765  {
767  throw std::runtime_error(to_string() << "Device memory read failed. max size: "
769  << ", requested: " << int(size));
770  command cmd(ds::fw_cmd::FRB, address, size);
771  return ds5_device::_hw_monitor->send(cmd);
772  }
773 
774  std::vector<byte> read_rgb_gold() const
775  {
777  return ds5_device::_hw_monitor->send(cmd);
778  }
779 
780  std::vector<byte> restore_calib_factory_settings() const
781  {
783  return ds5_device::_hw_monitor->send(cmd);
784  }
785 
787  {
788  bool res = false;
789  LOG_WARNING("invalid RGB extrinsic was identified, recovery routine was invoked");
790  try
791  {
792  if ((res = is_rgb_extrinsic_valid(read_rgb_gold())))
793  {
794  restore_calib_factory_settings();
795  }
796  else
797  {
798  if (_fw_version == firmware_version("5.11.6.200"))
799  {
800  const uint32_t gold_address = 0x17c49c;
801  const uint16_t bytes_to_read = 0x100;
802  auto alt_calib = read_sector(gold_address, bytes_to_read);
803  if ((res = is_rgb_extrinsic_valid(alt_calib)))
804  assign_rgb_stream_extrinsic(alt_calib);
805  else
806  res = false;
807  }
808  else
809  res = false;
810  }
811 
812  // Update device's internal state
813  if (res)
814  {
815  LOG_WARNING("RGB stream extrinsic successfully recovered");
817  _color_extrinsic.get()->reset();
819  }
820  else
821  {
822  LOG_ERROR("RGB Extrinsic recovery routine failed");
823  _color_extrinsic.get()->reset();
824  }
825  }
826  catch (...)
827  {
828  LOG_ERROR("RGB Extrinsic recovery routine failed");
829  }
830  }
831  };
832 
833  class rs465_device : public ds5_active,
834  public ds5_nonmonochrome,
835  public ds5_color,
836  public ds5_motion,
837  public ds5_advanced_mode_base,
839  {
840  public:
841  rs465_device(std::shared_ptr<context> ctx,
843  bool register_device_notifications)
844  : device(ctx, group, register_device_notifications),
845  ds5_device(ctx, group),
846  ds5_active(ctx, group),
847  ds5_color(ctx, group),
848  ds5_motion(ctx, group),
849  ds5_nonmonochrome(ctx, group),
854 
855  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
856 
857  std::vector<tagged_profile> get_profiles_tags() const override
858  {
859  std::vector<tagged_profile> tags;
860  auto usb_spec = get_usb_spec();
862 
863  int width = usb3mode ? 1280 : 640;
864  int height = usb3mode ? 720 : 480;
865  int fps = usb3mode ? 30 : 15;
866 
872 
873  return tags;
874  };
875  };
876 
877  class rs400_imu_device : public ds5_motion,
878  public ds5_advanced_mode_base,
880  {
881  public:
882  rs400_imu_device(std::shared_ptr<context> ctx,
884  bool register_device_notifications)
885  : device(ctx, group, register_device_notifications),
886  ds5_device(ctx, group),
887  ds5_motion(ctx, group),
892 
893  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
894 
895  std::vector<tagged_profile> get_profiles_tags() const override
896  {
897  std::vector<tagged_profile> tags;
901 
902  return tags;
903  };
904  };
905 
906  class rs405_device : public ds5_color,
907  public ds5_nonmonochrome,
908  public ds5_advanced_mode_base,
910  {
911  public:
912  rs405_device(std::shared_ptr<context> ctx,
914  bool register_device_notifications)
915  : device(ctx, group, register_device_notifications),
916  ds5_device(ctx, group),
917  ds5_color(ctx, group),
918  ds5_nonmonochrome(ctx, group),
923 
924  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
925 
926  std::vector<tagged_profile> get_profiles_tags() const override
927  {
928  std::vector<tagged_profile> tags;
929  auto usb_spec = get_usb_spec();
931 
932  int depth_width = usb3mode ? 848 : 640;
933  int depth_height = usb3mode ? 480 : 480;
934  int color_width = usb3mode ? 848 : 640;
935  int color_height = usb3mode ? 480 : 480;
936  int fps = usb3mode ? 30 : 15;
937 
941 
942  return tags;
943  }
944 
945  bool compress_while_record() const override { return false; }
946  };
947 
949  public ds5_active,
950  public ds5_color,
951  public ds5_motion,
952  public ds5_advanced_mode_base,
953  public firmware_logger_device,
954  public ds5_thermal_tracking
955  {
956  public:
957  rs455_device(std::shared_ptr<context> ctx,
959  bool register_device_notifications)
960  : device(ctx, group, register_device_notifications),
961  ds5_device(ctx, group),
962  ds5_nonmonochrome(ctx, group),
963  ds5_active(ctx, group),
964  ds5_color(ctx, group),
965  ds5_motion(ctx, group),
971  {}
972 
973  std::shared_ptr<matcher> create_matcher(const frame_holder& frame) const override;
974 
975  std::vector<tagged_profile> get_profiles_tags() const override
976  {
977  std::vector<tagged_profile> tags;
978  auto usb_spec = get_usb_spec();
980 
981  int depth_width = usb3mode ? 848 : 640;
982  int depth_height = usb3mode ? 480 : 480;
983  int color_width = usb3mode ? 1280 : 640;
984  int color_height = usb3mode ? 720 : 480;
985  int fps = usb3mode ? 30 : 15;
986 
993 
994  return tags;
995  }
996 
997  bool compress_while_record() const override { return false; }
998 
999  };
1000 
1001  std::shared_ptr<device_interface> ds5_info::create(std::shared_ptr<context> ctx,
1002  bool register_device_notifications) const
1003  {
1004  using namespace ds;
1005 
1006  if (_depth.size() == 0) throw std::runtime_error("Depth Camera not found!");
1007  auto pid = _depth.front().pid;
1008  platform::backend_device_group group{_depth, _hwm, _hid};
1009 
1010  switch(pid)
1011  {
1012  case RS400_PID:
1013  return std::make_shared<rs400_device>(ctx, group, register_device_notifications);
1014  case RS405U_PID:
1015  return std::make_shared<rs405u_device>(ctx, group, register_device_notifications);
1016  case RS410_PID:
1017  case RS460_PID:
1018  return std::make_shared<rs410_device>(ctx, group, register_device_notifications);
1019  case RS415_PID:
1020  return std::make_shared<rs415_device>(ctx, group, register_device_notifications);
1021  case RS416_PID:
1022  return std::make_shared<rs416_device>(ctx, group, register_device_notifications);
1023  case RS416_RGB_PID:
1024  return std::make_shared<rs416_rgb_device>(ctx, group, register_device_notifications);
1025  case RS420_PID:
1026  return std::make_shared<rs420_device>(ctx, group, register_device_notifications);
1027  case RS420_MM_PID:
1028  return std::make_shared<rs420_mm_device>(ctx, group, register_device_notifications);
1029  case RS430_PID:
1030  return std::make_shared<rs430_device>(ctx, group, register_device_notifications);
1031  case RS430I_PID:
1032  return std::make_shared<rs430i_device>(ctx, group, register_device_notifications);
1033  case RS430_MM_PID:
1034  return std::make_shared<rs430_mm_device>(ctx, group, register_device_notifications);
1035  case RS430_MM_RGB_PID:
1036  return std::make_shared<rs430_rgb_mm_device>(ctx, group, register_device_notifications);
1037  case RS435_RGB_PID:
1038  return std::make_shared<rs435_device>(ctx, group, register_device_notifications);
1039  case RS435I_PID:
1040  return std::make_shared<rs435i_device>(ctx, group, register_device_notifications);
1041  case RS465_PID:
1042  return std::make_shared<rs465_device>(ctx, group, register_device_notifications);
1043  case RS_USB2_PID:
1044  return std::make_shared<rs410_device>(ctx, group, register_device_notifications);
1045  case RS400_IMU_PID:
1046  return std::make_shared<rs400_imu_device>(ctx, group, register_device_notifications);
1047  case ds::RS405_PID:
1048  return std::make_shared<rs405_device>(ctx, group, register_device_notifications);
1049  case ds::RS455_PID:
1050  return std::make_shared<rs455_device>(ctx, group, register_device_notifications);
1051  default:
1052  throw std::runtime_error(to_string() << "Unsupported RS400 model! 0x"
1053  << std::hex << std::setw(4) << std::setfill('0') <<(int)pid);
1054  }
1055  }
1056 
1057  std::vector<std::shared_ptr<device_info>> ds5_info::pick_ds5_devices(
1058  std::shared_ptr<context> ctx,
1060  {
1061  std::vector<platform::uvc_device_info> chosen;
1062  std::vector<std::shared_ptr<device_info>> results;
1063 
1064  auto valid_pid = filter_by_product(group.uvc_devices, ds::rs400_sku_pid);
1065  auto group_devices = group_devices_and_hids_by_unique_id(group_devices_by_unique_id(valid_pid), group.hid_devices);
1066 
1067  for (auto& g : group_devices)
1068  {
1069  auto& devices = g.first;
1070  auto& hids = g.second;
1071 
1072  bool all_sensors_present = mi_present(devices, 0);
1073 
1074  // Device with multi sensors can be enabled only if all sensors (RGB + Depth) are present
1075  auto is_pid_of_multisensor_device = [](int pid) { return std::find(std::begin(ds::multi_sensors_pid), std::end(ds::multi_sensors_pid), pid) != std::end(ds::multi_sensors_pid); };
1076  bool is_device_multisensor = false;
1077  for (auto&& uvc : devices)
1078  {
1079  if (is_pid_of_multisensor_device(uvc.pid))
1080  is_device_multisensor = true;
1081  }
1082 
1083  if(is_device_multisensor)
1084  {
1085  all_sensors_present = all_sensors_present && mi_present(devices, 3);
1086  }
1087 
1088 
1089 #if !defined(__APPLE__) // Not supported by macos
1090  auto is_pid_of_hid_sensor_device = [](int pid) { return std::find(std::begin(ds::hid_sensors_pid), std::end(ds::hid_sensors_pid), pid) != std::end(ds::hid_sensors_pid); };
1091  bool is_device_hid_sensor = false;
1092  for (auto&& uvc : devices)
1093  {
1094  if (is_pid_of_hid_sensor_device(uvc.pid))
1095  is_device_hid_sensor = true;
1096  }
1097 
1098  // Device with hids can be enabled only if both hids (gyro and accelerometer) are present
1099  // Assuming that hids amount of 2 and above guarantee that gyro and accelerometer are present
1100  if (is_device_hid_sensor)
1101  {
1102  all_sensors_present &= (hids.size() >= 2);
1103  }
1104 #endif
1105 
1106  if (!devices.empty() && all_sensors_present)
1107  {
1109 
1110  std::vector<platform::usb_device_info> hwm_devices;
1111  if (ds::try_fetch_usb_device(group.usb_devices, devices.front(), hwm))
1112  {
1113  hwm_devices.push_back(hwm);
1114  }
1115  else
1116  {
1117  LOG_DEBUG("try_fetch_usb_device(...) failed.");
1118  }
1119 
1120  auto info = std::make_shared<ds5_info>(ctx, devices, hwm_devices, hids);
1121  chosen.insert(chosen.end(), devices.begin(), devices.end());
1122  results.push_back(info);
1123 
1124  }
1125  else
1126  {
1127  LOG_WARNING("DS5 group_devices is empty.");
1128  }
1129  }
1130 
1131  trim_device_list(group.uvc_devices, chosen);
1132 
1133  return results;
1134  }
1135 
1136 
1137  inline std::shared_ptr<matcher> create_composite_matcher(std::vector<std::shared_ptr<matcher>> matchers)
1138  {
1139  return std::make_shared<timestamp_composite_matcher>(matchers);
1140  }
1141 
1142  std::shared_ptr<matcher> rs400_device::create_matcher(const frame_holder& frame) const
1143  {
1144  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get()};
1146  }
1147 
1148  std::shared_ptr<matcher> rs405u_device::create_matcher(const frame_holder& frame) const
1149  {
1150  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get()};
1152  }
1153 
1154  std::shared_ptr<matcher> rs410_device::create_matcher(const frame_holder& frame) const
1155  {
1156  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get()};
1158  }
1159 
1160  std::shared_ptr<matcher> rs415_device::create_matcher(const frame_holder& frame) const
1161  {
1162  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1164  }
1165 
1166  std::shared_ptr<matcher> rs465_device::create_matcher(const frame_holder& frame) const
1167  {
1168  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1169  // TODO - A proper matcher for High-FPS sensor is required
1170  std::vector<stream_interface*> mm_streams = { _accel_stream.get(), _gyro_stream.get() };
1171  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1173  }
1174 
1175  std::shared_ptr<matcher> rs416_device::create_matcher(const frame_holder& frame) const
1176  {
1177  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get() };
1179  }
1180 
1181  std::shared_ptr<matcher> rs416_rgb_device::create_matcher(const frame_holder& frame) const
1182  {
1183  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1185  }
1186 
1187  std::shared_ptr<matcher> rs420_mm_device::create_matcher(const frame_holder& frame) const
1188  {
1189  //TODO: add matcher to mm
1190  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get()};
1191  std::vector<stream_interface*> mm_streams = {
1192  _fisheye_stream.get(),
1193  _accel_stream.get(),
1194  _gyro_stream.get()
1195  };
1196  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1198  }
1199 
1200  std::shared_ptr<matcher> rs420_device::create_matcher(const frame_holder& frame) const
1201  {
1202  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get()};
1204  }
1205 
1206  std::shared_ptr<matcher> rs430_device::create_matcher(const frame_holder& frame) const
1207  {
1208  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get() };
1210  }
1211 
1212  std::shared_ptr<matcher> rs430_mm_device::create_matcher(const frame_holder& frame) const
1213  {
1214  //TODO: add matcher to mm
1215  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get() };
1216  std::vector<stream_interface*> mm_streams = {
1217  _fisheye_stream.get(),
1218  _accel_stream.get(),
1219  _gyro_stream.get()
1220  };
1221  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1223  }
1224 
1225  std::shared_ptr<matcher> rs435_device::create_matcher(const frame_holder& frame) const
1226  {
1227  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1229  }
1230 
1231  std::shared_ptr<matcher> rs430_rgb_mm_device::create_matcher(const frame_holder& frame) const
1232  {
1233  //TODO: add matcher to mm
1234  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1235  std::vector<stream_interface*> mm_streams = {
1236  _fisheye_stream.get(),
1237  _accel_stream.get(),
1238  _gyro_stream.get()
1239  };
1240  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1242  }
1243 
1244  std::shared_ptr<matcher> rs430i_device::create_matcher(const frame_holder& frame) const
1245  {
1246  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get() };
1247  // TODO - A proper matcher for High-FPS sensor is required
1248  std::vector<stream_interface*> mm_streams = { _accel_stream.get(), _gyro_stream.get() };
1249  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1251  }
1252 
1253  std::shared_ptr<matcher> rs435i_device::create_matcher(const frame_holder& frame) const
1254  {
1255  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1256  // TODO - A proper matcher for High-FPS sensor is required
1257  std::vector<stream_interface*> mm_streams = { _accel_stream.get(), _gyro_stream.get()};
1258  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1260  }
1261 
1262  std::shared_ptr<matcher> rs400_imu_device::create_matcher(const frame_holder& frame) const
1263  {
1264  // TODO - A proper matcher for High-FPS sensor is required
1265  std::vector<stream_interface*> mm_streams = { _accel_stream.get(), _gyro_stream.get()};
1266  return matcher_factory::create(RS2_MATCHER_DEFAULT, mm_streams);
1267  }
1268 
1269  std::shared_ptr<matcher> rs405_device::create_matcher(const frame_holder& frame) const
1270  {
1271  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1273  }
1274 
1275  std::shared_ptr<matcher> rs455_device::create_matcher(const frame_holder& frame) const
1276  {
1277  std::vector<stream_interface*> streams = { _depth_stream.get() , _left_ir_stream.get() , _right_ir_stream.get(), _color_stream.get() };
1278  std::vector<stream_interface*> mm_streams = { _accel_stream.get(), _gyro_stream.get()};
1279  streams.insert(streams.end(), mm_streams.begin(), mm_streams.end());
1281  }
1282 }
rs435_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
std::vector< tagged_profile > get_profiles_tags() const override
rs435i_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
GLuint GLuint end
GLboolean GLboolean g
firmware_version _fw_version
Definition: ds5-device.h:88
std::shared_ptr< hw_monitor > _hw_monitor
Definition: ds5-device.h:87
std::vector< platform::uvc_device_info > filter_by_product(const std::vector< platform::uvc_device_info > &devices, const std::set< uint16_t > &pid_list)
Definition: context.cpp:478
std::vector< tagged_profile > get_profiles_tags() const override
std::vector< tagged_profile > get_profiles_tags() const override
std::vector< tagged_profile > get_profiles_tags() const override
bool compress_while_record() const override
platform::usb_spec get_usb_spec() const
void trim_device_list(std::vector< platform::usb_device_info > &devices, const std::vector< platform::usb_device_info > &chosen)
Definition: context.cpp:600
bool contradicts(const stream_profile_interface *a, const std::vector< stream_profile > &others) const override
std::shared_ptr< stream_interface > _color_stream
Definition: ds5-device.h:95
std::vector< tagged_profile > get_profiles_tags() const override
#define LOG_WARNING(...)
Definition: src/types.h:241
std::vector< tagged_profile > get_profiles_tags() const override
const uint16_t RS415_PID
Definition: ds5-private.h:27
rs455_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
std::vector< tagged_profile > get_profiles_tags() const override
std::vector< tagged_profile > get_profiles_tags() const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::vector< tagged_profile > get_profiles_tags() const override
std::shared_ptr< hw_monitor > _hw_monitor
std::vector< tagged_profile > get_profiles_tags() const override
static const std::set< std::uint16_t > hid_sensors_pid
Definition: ds5-private.h:103
const uint16_t RS460_PID
Definition: ds5-private.h:39
const uint16_t RS435_RGB_PID
Definition: ds5-private.h:40
synthetic_sensor & get_depth_sensor()
Definition: ds5-device.h:41
unsigned short uint16_t
Definition: stdint.h:79
rs430_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
rs416_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
std::vector< byte > read_rgb_gold() const
bool contradicts(const stream_profile_interface *a, const std::vector< stream_profile > &others) const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
rs405_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
std::shared_ptr< lazy< rs2_extrinsics > > _color_extrinsic
Definition: ds5-device.h:107
std::vector< tagged_profile > get_profiles_tags() const override
Definition: ds5-factory.cpp:50
std::vector< tagged_profile > get_profiles_tags() const override
GLboolean GLboolean GLboolean GLboolean a
rs415_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
const uint16_t RS400_IMU_PID
Definition: ds5-private.h:33
def info(name, value, persistent=False)
Definition: test.py:301
const uint16_t RS416_RGB_PID
Definition: ds5-private.h:46
not_this_one begin(...)
std::shared_ptr< ds5_thermal_monitor > _thermal_monitor
Definition: ds5-device.h:104
bool contradicts(const stream_profile_interface *a, const std::vector< stream_profile > &others) const override
std::vector< byte > read_sector(const uint32_t address, const uint16_t size) const
const uint16_t RS405U_PID
Definition: ds5-private.h:41
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
bool compress_while_record() const override
void register_extrinsics(const stream_interface &from, const stream_interface &to, std::weak_ptr< lazy< rs2_extrinsics >> extr)
Definition: environment.cpp:28
static const uint16_t HW_MONITOR_COMMAND_SIZE
std::vector< hid_device_info > hid_devices
Definition: backend.h:527
const uint16_t RS455_PID
Definition: ds5-private.h:48
std::vector< std::pair< std::vector< platform::uvc_device_info >, std::vector< platform::hid_device_info > > > group_devices_and_hids_by_unique_id(const std::vector< std::vector< platform::uvc_device_info >> &devices, const std::vector< platform::hid_device_info > &hids)
Definition: context.cpp:501
dictionary streams
Definition: t265_stereo.py:140
GLsizeiptr size
std::vector< std::vector< platform::uvc_device_info > > group_devices_by_unique_id(const std::vector< platform::uvc_device_info > &devices)
Definition: context.cpp:583
const uint16_t RS410_PID
Definition: ds5-private.h:26
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
rs416_rgb_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
bool try_fetch_usb_device(std::vector< platform::usb_device_info > &devices, const platform::uvc_device_info &info, platform::usb_device_info &result)
static const std::set< std::uint16_t > rs400_sku_pid
Definition: ds5-private.h:65
rs420_mm_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
unsigned int uint32_t
Definition: stdint.h:80
std::vector< byte > restore_calib_factory_settings() const
std::vector< tagged_profile > get_profiles_tags() const override
devices
Definition: test-fg.py:9
GLboolean GLuint group
Definition: glext.h:5688
GLdouble GLdouble x2
bool is_rgb_extrinsic_valid(const std::vector< uint8_t > &raw_data) const
rs410_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
GLint GLsizei GLsizei height
rs430i_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::vector< uint8_t > data
Definition: hw-monitor.h:240
std::shared_ptr< stream_interface > _depth_stream
Definition: ds5-device.h:92
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
def find(dir, mask)
Definition: file.py:25
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
rs430_mm_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
GLint j
const uint16_t RS420_PID
Definition: ds5-private.h:34
command get_flash_logs_command() const
const uint16_t RS_USB2_PID
Definition: ds5-private.h:30
lazy< std::vector< uint8_t > > _color_calib_table_raw
Definition: ds5-device.h:106
rs405u_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
Definition: ds5-factory.cpp:76
std::shared_ptr< stream_interface > _left_ir_stream
Definition: ds5-device.h:93
#define LOG_ERROR(...)
Definition: src/types.h:242
std::vector< tagged_profile > get_profiles_tags() const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
command get_firmware_logs_command() const
rs465_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
std::vector< tagged_profile > get_profiles_tags() const override
Definition: ds5-factory.cpp:88
const uint16_t RS416_PID
Definition: ds5-private.h:43
static environment & get_instance()
extrinsics_graph & get_extrinsics_graph()
std::shared_ptr< device_interface > create(std::shared_ptr< context > ctx, bool register_device_notifications) const override
rs420_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
GLenum GLenum GLsizei void * table
const uint16_t RS430_PID
Definition: ds5-private.h:28
GLuint GLfloat GLfloat GLfloat x1
Definition: glext.h:9721
rs430_rgb_mm_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
const uint16_t RS420_MM_PID
Definition: ds5-private.h:35
const uint16_t RS435I_PID
Definition: ds5-private.h:42
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
rs400_device(std::shared_ptr< context > ctx, const platform::backend_device_group &group, bool register_device_notifications)
Definition: ds5-factory.cpp:37
static std::vector< std::shared_ptr< device_info > > pick_ds5_devices(std::shared_ptr< context > ctx, platform::backend_device_group &gproup)
std::vector< usb_device_info > usb_devices
Definition: backend.h:526
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
bool compress_while_record() const override
GLuint GLuint64EXT address
Definition: glext.h:11417
rs400_imu_device(std::shared_ptr< context > ctx, const platform::backend_device_group group, bool register_device_notifications)
const uint16_t RS430_MM_RGB_PID
Definition: ds5-private.h:38
std::shared_ptr< matcher > create_composite_matcher(std::vector< std::shared_ptr< matcher >> matchers)
virtual uint32_t get_framerate() const =0
std::vector< tagged_profile > get_profiles_tags() const override
int i
void assign_rgb_stream_extrinsic(const std::vector< byte > &calib)
GLuint res
Definition: glext.h:8856
void reset() const
Definition: src/types.h:466
static const std::set< std::uint16_t > multi_sensors_pid
Definition: ds5-private.h:90
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
std::shared_ptr< matcher > create_matcher(const frame_holder &frame) const override
#define LOG_DEBUG(...)
Definition: src/types.h:239
std::vector< uvc_device_info > uvc_devices
Definition: backend.h:525
std::vector< tagged_profile > get_profiles_tags() const override
std::vector< tagged_profile > get_profiles_tags() const override
const uint16_t RS465_PID
Definition: ds5-private.h:45
std::shared_ptr< stream_interface > _right_ir_stream
Definition: ds5-device.h:94
const uint16_t RS400_PID
Definition: ds5-private.h:25
const uint16_t RS430I_PID
Definition: ds5-private.h:44
GLint GLsizei width
const uint16_t RS430_MM_PID
Definition: ds5-private.h:29
const uint16_t RS405_PID
Definition: ds5-private.h:47
bool mi_present(const std::vector< platform::uvc_device_info > &devices, uint32_t mi)
Definition: context.cpp:624
std::string to_string(T value)
static std::shared_ptr< matcher > create(rs2_matchers matcher, std::vector< stream_interface * > profiles)
Definition: device.cpp:11


librealsense2
Author(s): Sergey Dorodnicov , Doron Hirshberg , Mark Horn , Reagan Lopez , Itay Carpis
autogenerated on Mon May 3 2021 02:47:12