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  std::vector<sensor> query_all_sensors() const
136  {
137  std::vector<sensor> results;
138  for (auto&& dev : query_devices())
139  {
140  auto sensors = dev.query_sensors();
141  std::copy(sensors.begin(), sensors.end(), std::back_inserter(results));
142  }
143  return results;
144  }
145 
146 
148  {
149  rs2_error* e = nullptr;
150  std::shared_ptr<rs2_device> dev(
153  error::handle(e);
154  return device{ dev };
155  }
156 
161  template<class T>
163  {
164  rs2_error* e = nullptr;
166  new devices_changed_callback<T>(std::move(callback)), &e);
167  error::handle(e);
168  }
169 
177  playback load_device(const std::string& file)
178  {
179  rs2_error* e = nullptr;
180  auto device = std::shared_ptr<rs2_device>(
181  rs2_context_add_device(_context.get(), file.c_str(), &e),
184 
185  return playback { device };
186  }
187 
188  void unload_device(const std::string& file)
189  {
190  rs2_error* e = nullptr;
191  rs2_context_remove_device(_context.get(), file.c_str(), &e);
193  }
194 
195 protected:
196  friend class rs2::pipeline;
197  friend class rs2::device_hub;
198 
199  context(std::shared_ptr<rs2_context> ctx)
200  : _context(ctx)
201  {}
202  std::shared_ptr<rs2_context> _context;
203  };
204 
209  {
210  public:
211  explicit device_hub(context ctx)
212  : _ctx(std::move(ctx))
213  {
214  rs2_error* e = nullptr;
215  _device_hub = std::shared_ptr<rs2_device_hub>(
216  rs2_create_device_hub(_ctx._context.get(), &e),
218  error::handle(e);
219  }
220 
226  {
227  rs2_error* e = nullptr;
228  std::shared_ptr<rs2_device> dev(
229  rs2_device_hub_wait_for_device(_ctx._context.get(), _device_hub.get(), &e),
231 
232  error::handle(e);
233 
234  return device(dev);
235 
236  }
237 
241  bool is_connected(const device& dev) const
242  {
243  rs2_error* e = nullptr;
244  auto res = rs2_device_hub_is_device_connected(_device_hub.get(), dev._dev.get(), &e);
245  error::handle(e);
246 
247  return res > 0 ? true : false;
248 
249  }
250  private:
251  context _ctx;
252  std::shared_ptr<rs2_device_hub> _device_hub;
253  };
254 
255 }
256 #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:241
rs2_device_list * rs2_query_devices(const rs2_context *context, rs2_error **error)
void unload_device(const std::string &file)
Definition: rs_context.hpp:188
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:177
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:225
device_list get_removed_devices() const
Definition: rs_context.hpp:66
std::shared_ptr< rs2_sensor > _sensor
Definition: rs_sensor.hpp:421
std::shared_ptr< rs2_context > _context
Definition: rs_context.hpp:202
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:199
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:135
std::shared_ptr< rs2_device > _dev
Definition: rs_device.hpp:143
device get_sensor_parent(const sensor &s) const
Definition: rs_context.hpp:147
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:208
context()
Definition: rs_context.hpp:107
void set_devices_changed_callback(T callback)
Definition: rs_context.hpp:162
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:211