Intel® RealSense™ Cross Platform API
Intel Realsense Cross-platform API
rs_context.hpp
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2017 Intel Corporation. All Rights Reserved.
3 
4 #ifndef LIBREALSENSE_RS2_CONTEXT_HPP
5 #define LIBREALSENSE_RS2_CONTEXT_HPP
6 
7 #include "rs_types.hpp"
8 #include "rs_record_playback.hpp"
9 #include "rs_processing.hpp"
10 
11 namespace rs2
12 {
14  {
15  public:
17  :_removed(removed), _added(added) {}
18 
23  bool was_removed(const rs2::device& dev) const
24  {
25  rs2_error* e = nullptr;
26 
27  if (!dev)
28  return false;
29 
30  auto res = rs2_device_list_contains(_removed.get_list(), dev.get().get(), &e);
31  error::handle(e);
32 
33  return res > 0;
34  }
35 
40  bool was_added(const rs2::device& dev) const
41  {
42  rs2_error* e = nullptr;
43 
44  if (!dev)
45  return false;
46 
47  auto res = rs2_device_list_contains(_added.get_list(), dev.get().get(), &e);
48  error::handle(e);
49 
50  return res > 0;
51  }
52 
58  {
59  return _added;
60  }
61 
67  {
68  return _removed;
69  }
70 
71  private:
72  device_list _removed;
73  device_list _added;
74  };
75 
76  template<class T>
78  {
79  T _callback;
80 
81  public:
82  explicit devices_changed_callback(T callback) : _callback(callback) {}
83 
84  void on_devices_changed(rs2_device_list* removed, rs2_device_list* added) override
85  {
86  std::shared_ptr<rs2_device_list> old(removed, rs2_delete_device_list);
87  std::shared_ptr<rs2_device_list> news(added, rs2_delete_device_list);
88 
89 
90  event_information info({ device_list(old), device_list(news) });
91  _callback(info);
92  }
93 
94  void release() override { delete this; }
95  };
96 
97  class pipeline;
98  class device_hub;
99 
104  class context
105  {
106  public:
108  {
109  rs2_error* e = nullptr;
110  _context = std::shared_ptr<rs2_context>(
113  error::handle(e);
114  }
115 
121  {
122  rs2_error* e = nullptr;
123  std::shared_ptr<rs2_device_list> list(
124  rs2_query_devices(_context.get(), &e),
126  error::handle(e);
127 
128  return device_list(list);
129  }
130 
135  device_list query_devices(int mask) const
136  {
137  rs2_error* e = nullptr;
138  std::shared_ptr<rs2_device_list> list(
139  rs2_query_devices_ex(_context.get(), mask, &e),
141  error::handle(e);
142 
143  return device_list(list);
144  }
145 
150  std::vector<sensor> query_all_sensors() const
151  {
152  std::vector<sensor> results;
153  for (auto&& dev : query_devices())
154  {
155  auto sensors = dev.query_sensors();
156  std::copy(sensors.begin(), sensors.end(), std::back_inserter(results));
157  }
158  return results;
159  }
160 
161 
163  {
164  rs2_error* e = nullptr;
165  std::shared_ptr<rs2_device> dev(
168  error::handle(e);
169  return device{ dev };
170  }
171 
176  template<class T>
178  {
179  rs2_error* e = nullptr;
181  new devices_changed_callback<T>(std::move(callback)), &e);
182  error::handle(e);
183  }
184 
192  playback load_device(const std::string& file)
193  {
194  rs2_error* e = nullptr;
195  auto device = std::shared_ptr<rs2_device>(
196  rs2_context_add_device(_context.get(), file.c_str(), &e),
199 
200  return playback { device };
201  }
202 
203  void unload_device(const std::string& file)
204  {
205  rs2_error* e = nullptr;
206  rs2_context_remove_device(_context.get(), file.c_str(), &e);
208  }
209 
210 protected:
211  friend class rs2::pipeline;
212  friend class rs2::device_hub;
213 
214  context(std::shared_ptr<rs2_context> ctx)
215  : _context(ctx)
216  {}
217  std::shared_ptr<rs2_context> _context;
218  };
219 
224  {
225  public:
226  explicit device_hub(context ctx)
227  : _ctx(std::move(ctx))
228  {
229  rs2_error* e = nullptr;
230  _device_hub = std::shared_ptr<rs2_device_hub>(
231  rs2_create_device_hub(_ctx._context.get(), &e),
233  error::handle(e);
234  }
235 
241  {
242  rs2_error* e = nullptr;
243  std::shared_ptr<rs2_device> dev(
244  rs2_device_hub_wait_for_device(_ctx._context.get(), _device_hub.get(), &e),
246 
247  error::handle(e);
248 
249  return device(dev);
250 
251  }
252 
256  bool is_connected(const device& dev) const
257  {
258  rs2_error* e = nullptr;
259  auto res = rs2_device_hub_is_device_connected(_device_hub.get(), dev._dev.get(), &e);
260  error::handle(e);
261 
262  return res > 0 ? true : false;
263 
264  }
265  private:
266  context _ctx;
267  std::shared_ptr<rs2_device_hub> _device_hub;
268  };
269 
270 }
271 #endif // LIBREALSENSE_RS2_CONTEXT_HPP
Definition: rs_record_playback.hpp:27
Definition: rs_sensor.hpp:232
void release() override
Definition: rs_context.hpp:94
void on_devices_changed(rs2_device_list *removed, rs2_device_list *added) override
Definition: rs_context.hpp:84
int rs2_device_list_contains(const rs2_device_list *info_list, const rs2_device *device, rs2_error **error)
Definition: rs_context.hpp:13
#define RS2_API_VERSION
Definition: rs.h:37
bool is_connected(const device &dev) const
Definition: rs_context.hpp:256
rs2_device_list * rs2_query_devices(const rs2_context *context, rs2_error **error)
void unload_device(const std::string &file)
Definition: rs_context.hpp:203
rs2_device_hub * rs2_create_device_hub(const rs2_context *context, rs2_error **error)
Creates RealSense device_hub .
playback load_device(const std::string &file)
Definition: rs_context.hpp:192
rs2_device * rs2_create_device_from_sensor(const rs2_sensor *sensor, rs2_error **error)
void rs2_delete_device(rs2_device *device)
rs2_context * rs2_create_context(int api_version, rs2_error **error)
Creates RealSense context that is required for the rest of the API.
void rs2_delete_context(rs2_context *context)
Frees the relevant context object.
rs2_device * rs2_context_add_device(rs2_context *ctx, const char *file, rs2_error **error)
Definition: rs_context.hpp:11
Definition: rs_context.hpp:104
device_list get_new_devices() const
Definition: rs_context.hpp:57
bool was_added(const rs2::device &dev) const
Definition: rs_context.hpp:40
device_list query_devices() const
Definition: rs_context.hpp:120
device wait_for_device() const
Definition: rs_context.hpp:240
device_list get_removed_devices() const
Definition: rs_context.hpp:66
std::shared_ptr< rs2_sensor > _sensor
Definition: rs_sensor.hpp:421
rs2_device_list * rs2_query_devices_ex(const rs2_context *context, int product_mask, rs2_error **error)
std::shared_ptr< rs2_context > _context
Definition: rs_context.hpp:217
int rs2_device_hub_is_device_connected(const rs2_device_hub *hub, const rs2_device *device, rs2_error **error)
bool was_removed(const rs2::device &dev) const
Definition: rs_context.hpp:23
const std::shared_ptr< rs2_device > & get() const
Definition: rs_device.hpp:116
event_information(device_list removed, device_list added)
Definition: rs_context.hpp:16
context(std::shared_ptr< rs2_context > ctx)
Definition: rs_context.hpp:214
void rs2_delete_device_hub(const rs2_device_hub *hub)
Frees the relevant device hub object.
std::vector< sensor > query_all_sensors() const
Generate a flat list of all available sensors from all RealSense devices.
Definition: rs_context.hpp:150
std::shared_ptr< rs2_device > _dev
Definition: rs_device.hpp:143
device get_sensor_parent(const sensor &s) const
Definition: rs_context.hpp:162
device_list query_devices(int mask) const
Definition: rs_context.hpp:135
static void handle(rs2_error *e)
Definition: rs_types.hpp:121
Definition: rs_pipeline.hpp:335
rs2_device * rs2_device_hub_wait_for_device(rs2_context *ctx, const rs2_device_hub *hub, rs2_error **error)
Definition: rs_device.hpp:184
Definition: rs_context.hpp:223
context()
Definition: rs_context.hpp:107
void set_devices_changed_callback(T callback)
Definition: rs_context.hpp:177
void rs2_set_devices_changed_callback_cpp(rs2_context *context, rs2_devices_changed_callback *callback, rs2_error **error)
devices_changed_callback(T callback)
Definition: rs_context.hpp:82
void rs2_context_remove_device(rs2_context *ctx, const char *file, rs2_error **error)
struct rs2_device_list rs2_device_list
Definition: rs_types.h:156
Definition: rs_context.hpp:77
Definition: rs_types.hpp:53
struct rs2_error rs2_error
Definition: rs_types.h:149
void rs2_delete_device_list(rs2_device_list *info_list)
Definition: rs_device.hpp:18
const rs2_device_list * get_list() const
Definition: rs_device.hpp:281
device_hub(context ctx)
Definition: rs_context.hpp:226