You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
8.3 KiB
284 lines
8.3 KiB
2 months ago
|
// License: Apache 2.0. See LICENSE file in root directory.
|
||
|
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
|
||
|
|
||
|
#ifndef LIBREALSENSE_RS2_CONTEXT_HPP
|
||
|
#define LIBREALSENSE_RS2_CONTEXT_HPP
|
||
|
|
||
|
#include "rs_types.hpp"
|
||
|
#include "rs_record_playback.hpp"
|
||
|
#include "rs_processing.hpp"
|
||
|
|
||
|
namespace rs2
|
||
|
{
|
||
|
class event_information
|
||
|
{
|
||
|
public:
|
||
|
event_information(device_list removed, device_list added)
|
||
|
:_removed(removed), _added(added) {}
|
||
|
|
||
|
/**
|
||
|
* check if a specific device was disconnected
|
||
|
* \return true if device disconnected, false if device connected
|
||
|
*/
|
||
|
bool was_removed(const rs2::device& dev) const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
|
||
|
if (!dev)
|
||
|
return false;
|
||
|
|
||
|
auto res = rs2_device_list_contains(_removed.get_list(), dev.get().get(), &e);
|
||
|
error::handle(e);
|
||
|
|
||
|
return res > 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* check if a specific device was added
|
||
|
* \return true if device added, false otherwise
|
||
|
*/
|
||
|
bool was_added(const rs2::device& dev) const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
|
||
|
if (!dev)
|
||
|
return false;
|
||
|
|
||
|
auto res = rs2_device_list_contains(_added.get_list(), dev.get().get(), &e);
|
||
|
error::handle(e);
|
||
|
|
||
|
return res > 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* returns a list of all newly connected devices
|
||
|
* \return the list of all new connected devices
|
||
|
*/
|
||
|
device_list get_new_devices() const
|
||
|
{
|
||
|
return _added;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
device_list _removed;
|
||
|
device_list _added;
|
||
|
};
|
||
|
|
||
|
template<class T>
|
||
|
class devices_changed_callback : public rs2_devices_changed_callback
|
||
|
{
|
||
|
T _callback;
|
||
|
|
||
|
public:
|
||
|
explicit devices_changed_callback(T callback) : _callback(callback) {}
|
||
|
|
||
|
void on_devices_changed(rs2_device_list* removed, rs2_device_list* added) override
|
||
|
{
|
||
|
std::shared_ptr<rs2_device_list> old(removed, rs2_delete_device_list);
|
||
|
std::shared_ptr<rs2_device_list> news(added, rs2_delete_device_list);
|
||
|
|
||
|
|
||
|
event_information info({ device_list(old), device_list(news) });
|
||
|
_callback(info);
|
||
|
}
|
||
|
|
||
|
void release() override { delete this; }
|
||
|
};
|
||
|
|
||
|
class pipeline;
|
||
|
class device_hub;
|
||
|
class software_device;
|
||
|
|
||
|
/**
|
||
|
* default librealsense context class
|
||
|
* includes realsense API version as provided by RS2_API_VERSION macro
|
||
|
*/
|
||
|
class context
|
||
|
{
|
||
|
public:
|
||
|
enum uninitialized_t { uninitialized };
|
||
|
context( uninitialized_t )
|
||
|
{
|
||
|
}
|
||
|
context( char const * json_settings = nullptr )
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
_context = std::shared_ptr<rs2_context>(
|
||
|
rs2_create_context_ex( RS2_API_VERSION, json_settings, &e ),
|
||
|
rs2_delete_context);
|
||
|
error::handle(e);
|
||
|
}
|
||
|
context( std::string const & json_settings )
|
||
|
: context( json_settings.c_str() )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
operator bool() const { return !! _context; }
|
||
|
|
||
|
/**
|
||
|
* create a static snapshot of all connected devices at the time of the call
|
||
|
* \return the list of devices connected devices at the time of the call
|
||
|
*/
|
||
|
device_list query_devices() const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
std::shared_ptr<rs2_device_list> list(
|
||
|
rs2_query_devices(_context.get(), &e),
|
||
|
rs2_delete_device_list);
|
||
|
error::handle(e);
|
||
|
|
||
|
return device_list(list);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* create a static snapshot of all connected devices at the time of the call
|
||
|
* \return the list of devices connected devices at the time of the call
|
||
|
*/
|
||
|
device_list query_devices(int mask) const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
std::shared_ptr<rs2_device_list> list(
|
||
|
rs2_query_devices_ex(_context.get(), mask, &e),
|
||
|
rs2_delete_device_list);
|
||
|
error::handle(e);
|
||
|
|
||
|
return device_list(list);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Generate a flat list of all available sensors from all RealSense devices
|
||
|
* @return List of sensors
|
||
|
*/
|
||
|
std::vector<sensor> query_all_sensors() const
|
||
|
{
|
||
|
std::vector<sensor> results;
|
||
|
for (auto&& dev : query_devices())
|
||
|
{
|
||
|
auto sensors = dev.query_sensors();
|
||
|
std::copy(sensors.begin(), sensors.end(), std::back_inserter(results));
|
||
|
}
|
||
|
return results;
|
||
|
}
|
||
|
|
||
|
|
||
|
device get_sensor_parent(const sensor& s) const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
std::shared_ptr<rs2_device> dev(
|
||
|
rs2_create_device_from_sensor(s._sensor.get(), &e),
|
||
|
rs2_delete_device);
|
||
|
error::handle(e);
|
||
|
return device{ dev };
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* register devices changed callback
|
||
|
* \param[in] callback devices changed callback
|
||
|
*/
|
||
|
template<class T>
|
||
|
void set_devices_changed_callback(T callback)
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
rs2_set_devices_changed_callback_cpp(_context.get(),
|
||
|
new devices_changed_callback<T>(std::move(callback)), &e);
|
||
|
error::handle(e);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a device from a RealSense file
|
||
|
*
|
||
|
* On successful load, the device will be appended to the context and a devices_changed event triggered
|
||
|
* @param file Path to a RealSense File
|
||
|
* @return A playback device matching the given file
|
||
|
*/
|
||
|
playback load_device(const std::string& file)
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
auto device = std::shared_ptr<rs2_device>(
|
||
|
rs2_context_add_device(_context.get(), file.c_str(), &e),
|
||
|
rs2_delete_device);
|
||
|
rs2::error::handle(e);
|
||
|
|
||
|
return playback { device };
|
||
|
}
|
||
|
|
||
|
void unload_device(const std::string& file)
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
rs2_context_remove_device(_context.get(), file.c_str(), &e);
|
||
|
rs2::error::handle(e);
|
||
|
}
|
||
|
|
||
|
void unload_tracking_module()
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
rs2_context_unload_tracking_module(_context.get(), &e);
|
||
|
rs2::error::handle(e);
|
||
|
}
|
||
|
|
||
|
context(std::shared_ptr<rs2_context> ctx)
|
||
|
: _context(ctx)
|
||
|
{}
|
||
|
explicit operator std::shared_ptr<rs2_context>() { return _context; };
|
||
|
protected:
|
||
|
friend class rs2::pipeline;
|
||
|
friend class rs2::device_hub;
|
||
|
friend class rs2::software_device;
|
||
|
|
||
|
std::shared_ptr<rs2_context> _context;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* device_hub class - encapsulate the handling of connect and disconnect events
|
||
|
*/
|
||
|
class device_hub
|
||
|
{
|
||
|
public:
|
||
|
explicit device_hub(context ctx)
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
_device_hub = std::shared_ptr<rs2_device_hub>(
|
||
|
rs2_create_device_hub(ctx._context.get(), &e),
|
||
|
rs2_delete_device_hub);
|
||
|
error::handle(e);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* If any device is connected return it, otherwise wait until next RealSense device connects.
|
||
|
* Calling this method multiple times will cycle through connected devices
|
||
|
*/
|
||
|
device wait_for_device() const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
std::shared_ptr<rs2_device> dev(
|
||
|
rs2_device_hub_wait_for_device(_device_hub.get(), &e),
|
||
|
rs2_delete_device);
|
||
|
|
||
|
error::handle(e);
|
||
|
|
||
|
return device(dev);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if device is still connected
|
||
|
*/
|
||
|
bool is_connected(const device& dev) const
|
||
|
{
|
||
|
rs2_error* e = nullptr;
|
||
|
auto res = rs2_device_hub_is_device_connected(_device_hub.get(), dev._dev.get(), &e);
|
||
|
error::handle(e);
|
||
|
|
||
|
return res > 0 ? true : false;
|
||
|
|
||
|
}
|
||
|
|
||
|
explicit operator std::shared_ptr<rs2_device_hub>() { return _device_hub; }
|
||
|
explicit device_hub(std::shared_ptr<rs2_device_hub> hub) : _device_hub(std::move(hub)) {}
|
||
|
private:
|
||
|
std::shared_ptr<rs2_device_hub> _device_hub;
|
||
|
};
|
||
|
|
||
|
}
|
||
|
#endif // LIBREALSENSE_RS2_CONTEXT_HPP
|