OrbbecSDK 2.8.6
OrbbecSDK: Software-Development-Kit for Orbbec 3D Cameras
Loading...
Searching...
No Matches
Context.hpp
Go to the documentation of this file.
1// Copyright (c) Orbbec Inc. All Rights Reserved.
2// Licensed under the MIT License.
3
10#pragma once
11
13#include "Types.hpp"
14#include "Error.hpp"
15
16#include <functional>
17#include <memory>
18#include <string>
19#include <unordered_map>
20#include <mutex>
21
22namespace ob {
23
24// forward declarations
25class Device;
26class DeviceInfo;
27class DeviceList;
28
29class Context {
30public:
37 typedef std::function<void(std::shared_ptr<DeviceList> removedList, std::shared_ptr<DeviceList> addedList)> DeviceChangedCallback;
38
45 typedef std::function<void(OBLogSeverity severity, const char *logMsg)> LogCallback;
46
52
53private:
54 ob_context *impl_ = nullptr;
55 std::mutex callbackMtx_;
56
57 std::mutex legacyCallbackMtx_;
58 OBCallbackId legacyCallbackId_ = INVALID_CALLBACK_ID;
59
60 std::unordered_map<OBCallbackId, std::unique_ptr<DeviceChangedCallbackContext>> devChangedCallbacks_;
61 // static LogCallback logCallback_;
62
63public:
72 explicit Context(const char *configPath = "") {
73 ob_error *error = nullptr;
74 impl_ = ob_create_context_with_config(configPath, &error);
75 Error::handle(&error);
76 }
77
81 ~Context() noexcept {
82 // delete contex of C API, which will auto unregister all callbacks
83 ob_error *error = nullptr;
84 ob_delete_context(impl_, &error);
85 Error::handle(&error, false);
86 }
87
93 std::shared_ptr<DeviceList> queryDeviceList() const {
94 ob_error *error = nullptr;
95 auto list = ob_query_device_list(impl_, &error);
96 Error::handle(&error);
97 return std::make_shared<DeviceList>(list);
98 }
99
109 void enableNetDeviceEnumeration(bool enable) const {
110 ob_error *error = nullptr;
111 ob_enable_net_device_enumeration(impl_, enable, &error);
112 Error::handle(&error);
113 }
114
126 bool forceIp(const char *macAddress, const OBNetIpConfig &config) {
127 ob_error *error = nullptr;
128 auto res = ob_force_ip_config(macAddress, config, &error);
129 Error::handle(&error);
130 return res;
131 }
132
143 ob_error *error = nullptr;
144 ob_set_gvcp_port_scheme(impl_, scheme, &error);
145 Error::handle(&error);
146 }
147
154 ob_error *error = nullptr;
155 auto scheme = ob_get_gvcp_port_scheme(impl_, &error);
156 Error::handle(&error);
157 return scheme;
158 }
159
171 std::shared_ptr<Device> createNetDevice(const char *address, uint16_t port, OBDeviceAccessMode accessMode = OB_DEVICE_DEFAULT_ACCESS) const {
172 ob_error *error = nullptr;
173 auto device = ob_create_net_device_ex(impl_, address, port, accessMode, &error);
174 Error::handle(&error);
175 return std::make_shared<Device>(device);
176 }
177
188 std::lock_guard<std::mutex> lock(legacyCallbackMtx_);
189 // remove the last callback first
190 if(legacyCallbackId_ != INVALID_CALLBACK_ID) {
191 unregisterDeviceChangedCallback(legacyCallbackId_);
192 }
193 // register the new callback
194 legacyCallbackId_ = registerDeviceChangedCallback(callback);
195 }
196
198 ob_error *error = nullptr;
199 auto cbCtxHolder = std::unique_ptr<DeviceChangedCallbackContext>(new DeviceChangedCallbackContext({ this, 0, nullptr }));
200 auto id = ob_register_device_changed_callback(impl_, &Context::deviceChangedCallback, (void *)cbCtxHolder.get(), &error);
201 Error::handle(&error);
202
203 cbCtxHolder->callbackId = id;
204 cbCtxHolder->callback = callback;
205 {
206 std::unique_lock<std::mutex> lock(callbackMtx_);
207 devChangedCallbacks_[id] = std::move(cbCtxHolder);
208 }
209 return id;
210 }
211
213 ob_error *error = nullptr;
214 ob_unregister_device_changed_callback(impl_, id, &error);
215 {
216 std::unique_lock<std::mutex> lock(callbackMtx_);
217 if(devChangedCallbacks_.count(id)) {
218 devChangedCallbacks_.erase(id);
219 }
220 }
221 Error::handle(&error);
222 }
223
229 void enableDeviceClockSync(uint64_t repeatIntervalMsec) const {
230 ob_error *error = nullptr;
231 ob_enable_device_clock_sync(impl_, repeatIntervalMsec, &error);
232 Error::handle(&error);
233 }
234
239 void freeIdleMemory() const {
240 ob_error *error = nullptr;
241 ob_free_idle_memory(impl_, &error);
242 Error::handle(&error);
243 }
244
254 ob_error *error = nullptr;
255 ob_set_uvc_backend_type(impl_, type, &error);
256 Error::handle(&error);
257 }
258
265 static void setLoggerSeverity(OBLogSeverity severity) {
266 ob_error *error = nullptr;
267 ob_set_logger_severity(severity, &error);
268 Error::handle(&error);
269 }
270
278 static void setLoggerToFile(OBLogSeverity severity, const char *directory) {
279 ob_error *error = nullptr;
280 ob_set_logger_to_file(severity, directory, &error);
281 Error::handle(&error);
282 }
283
291 static void setLoggerFileName(const std::string &fileName) {
292 ob_error *error = nullptr;
293 ob_set_logger_file_name(fileName.c_str(), &error);
294 Error::handle(&error);
295 }
296
302 static void setLoggerToConsole(OBLogSeverity severity) {
303 ob_error *error = nullptr;
304 ob_set_logger_to_console(severity, &error);
305 Error::handle(&error);
306 }
307
314 static void setLoggerToCallback(OBLogSeverity severity, LogCallback callback) {
315 ob_error *error = nullptr;
316 Context::getLogCallback() = callback;
317 ob_set_logger_to_callback(severity, &Context::logCallback, &Context::getLogCallback(), &error);
318 Error::handle(&error);
319 }
320
331 static void logExternalMessage(OBLogSeverity severity, const std::string &module, const std::string &message, const std::string &file,
332 const std::string &func, int line) {
333 ob_error *error = nullptr;
334 ob_log_external_message(severity, module.c_str(), message.c_str(), file.c_str(), func.c_str(), line, &error);
335 Error::handle(&error);
336 }
337
346 static void setExtensionsDirectory(const char *directory) {
347 ob_error *error = nullptr;
348 ob_set_extensions_directory(directory, &error);
349 Error::handle(&error);
350 }
351
352private:
353 static void deviceChangedCallback(ob_device_list *removedList, ob_device_list *addedList, void *userData) {
354 auto cbCtx = static_cast<DeviceChangedCallbackContext *>(userData);
355 if(cbCtx && cbCtx->ctx && cbCtx->callbackId != INVALID_CALLBACK_ID) {
356 DeviceChangedCallback callbackCopy;
357 {
358 // preventing the captured variables from being released.
359 std::unique_lock<std::mutex> lock(cbCtx->ctx->callbackMtx_);
360 if(cbCtx->ctx->devChangedCallbacks_.count(cbCtx->callbackId)) {
361 callbackCopy = cbCtx->callback;
362 }
363 }
364 auto removed = std::make_shared<DeviceList>(removedList);
365 auto added = std::make_shared<DeviceList>(addedList);
366 callbackCopy(removed, added);
367 }
368 }
369
370 static void logCallback(OBLogSeverity severity, const char *logMsg, void *userData) {
371 auto cb = static_cast<LogCallback *>(userData);
372 if(cb) {
373 (*cb)(severity, logMsg);
374 }
375 }
376
377 // Lazy initialization of the logcallback_. The purpose is to initialize logcallback_ in .hpp
378 static LogCallback &getLogCallback() {
379 static LogCallback logCallback_ = nullptr;
380 return logCallback_;
381 }
382
383// for backward compatibility
384#define enableMultiDeviceSync enableDeviceClockSync
385};
386} // namespace ob
Context is a management class that describes the runtime of the SDK and is responsible for resource a...
OB_EXPORT void ob_set_gvcp_port_scheme(ob_context *context, ob_gvcp_port_scheme scheme, ob_error **error)
Set the GVCP port scheme used for network device discovery and control.
OB_EXPORT void ob_enable_device_clock_sync(ob_context *context, uint64_t repeat_interval_msec, ob_error **error)
Activates device clock synchronization to synchronize the clock of the host and all created devices (...
OB_EXPORT void ob_set_logger_to_callback(ob_log_severity severity, ob_log_callback callback, void *user_data, ob_error **error)
Set the log callback function.
OB_EXPORT bool ob_force_ip_config(const char *macAddress, ob_net_ip_config config, ob_error **error)
"Force" a static IP address configuration in a device identified by its MAC Address.
OB_EXPORT void ob_set_uvc_backend_type(ob_context *context, ob_uvc_backend_type backend_type, ob_error **error)
For linux, there are two ways to enable the UVC backend: libuvc and v4l2. This function is used to se...
OB_EXPORT ob_context * ob_create_context_with_config(const char *config_file_path, ob_error **error)
Create a context object with a specified configuration file.
OB_EXPORT ob_gvcp_port_scheme ob_get_gvcp_port_scheme(ob_context *context, ob_error **error)
Get the current GVCP port scheme.
OB_EXPORT ob_device * ob_create_net_device_ex(ob_context *context, const char *address, uint16_t port, ob_device_access_mode accessMode, ob_error **error)
Create a network device object.
OB_EXPORT void ob_free_idle_memory(ob_context *context, ob_error **error)
Free idle memory from the internal frame memory pool.
OB_EXPORT void ob_set_logger_to_file(ob_log_severity severity, const char *directory, ob_error **error)
Set the log output to a file.
OB_EXPORT void ob_set_logger_severity(ob_log_severity severity, ob_error **error)
Set the global log level.
OB_EXPORT void ob_unregister_device_changed_callback(ob_context *context, ob_callback_id callback_id, ob_error **error)
Unregister a previously registered device plug-in callback function.
OB_EXPORT void ob_set_logger_to_console(ob_log_severity severity, ob_error **error)
Set the log output to the console.
OB_EXPORT void ob_log_external_message(ob_log_severity severity, const char *module, const char *message, const char *file, const char *func, int line, ob_error **error)
Logs a message with severity, file, function, and line info.
OB_EXPORT ob_callback_id ob_register_device_changed_callback(ob_context *context, ob_device_changed_callback callback, void *user_data, ob_error **error)
Register a device plug-in callback function.
OB_EXPORT ob_device_list * ob_query_device_list(ob_context *context, ob_error **error)
Get a list of enumerated devices.
OB_EXPORT void ob_delete_context(ob_context *context, ob_error **error)
Delete a context object.
OB_EXPORT void ob_enable_net_device_enumeration(ob_context *context, bool enable, ob_error **error)
Enable or disable network device enumeration.
OB_EXPORT void ob_set_logger_file_name(const char *file_name, ob_error **error)
Set the log file name for file output.
OB_EXPORT void ob_set_extensions_directory(const char *directory, ob_error **error)
Set the extensions directory.
This file defines the Error class, which describes abnormal errors within the SDK....
@ OB_DEVICE_DEFAULT_ACCESS
Default access: control access for capable devices, ignored otherwise.
Definition ObTypes.h:2021
struct ob_context_t ob_context
Definition ObTypes.h:22
OBGvcpPortScheme
GVCP port scheme.
Definition ObTypes.h:170
enum ob_device_access_mode OBDeviceAccessMode
enum ob_uvc_backend_type OBUvcBackendType
#define INVALID_CALLBACK_ID
Definition ObTypes.h:2155
struct ob_device_list_t ob_device_list
Definition ObTypes.h:25
uint64_t OBCallbackId
Callback Id.
Definition ObTypes.h:2154
OBLogSeverity
log level, the higher the level, the stronger the log filter
Definition ObTypes.h:121
void enableNetDeviceEnumeration(bool enable) const
enable or disable net device enumeration.
Definition Context.hpp:109
std::function< void(std::shared_ptr< DeviceList > removedList, std::shared_ptr< DeviceList > addedList)> DeviceChangedCallback
Type definition for the device changed callback function.
Definition Context.hpp:37
static void setLoggerSeverity(OBLogSeverity severity)
Set the level of the global log, which affects both the log level output to the console,...
Definition Context.hpp:265
static void setLoggerToConsole(OBLogSeverity severity)
Set log output to the console.
Definition Context.hpp:302
void setDeviceChangedCallback(DeviceChangedCallback callback)
Set the device plug-in callback function.
Definition Context.hpp:187
static void setLoggerFileName(const std::string &fileName)
Set the log file name for file output.
Definition Context.hpp:291
bool forceIp(const char *macAddress, const OBNetIpConfig &config)
"Force" a static IP address configuration in a device identified by its MAC Address.
Definition Context.hpp:126
std::function< void(OBLogSeverity severity, const char *logMsg)> LogCallback
Type definition for the log output callback function.
Definition Context.hpp:45
void enableDeviceClockSync(uint64_t repeatIntervalMsec) const
Activates device clock synchronization to synchronize the clock of the host and all created devices (...
Definition Context.hpp:229
static void logExternalMessage(OBLogSeverity severity, const std::string &module, const std::string &message, const std::string &file, const std::string &func, int line)
Logs a message with severity, file, function, and line info.
Definition Context.hpp:331
static void setLoggerToCallback(OBLogSeverity severity, LogCallback callback)
Set the logger to callback.
Definition Context.hpp:314
OBGvcpPortScheme getGvcpPortScheme() const
Get the current GVCP port scheme.
Definition Context.hpp:153
~Context() noexcept
Context destructor.
Definition Context.hpp:81
void unregisterDeviceChangedCallback(OBCallbackId id)
Definition Context.hpp:212
void setUvcBackendType(OBUvcBackendType type) const
For linux, there are two ways to enable the UVC backend: libuvc and v4l2. This function is used to se...
Definition Context.hpp:253
OBCallbackId registerDeviceChangedCallback(DeviceChangedCallback callback)
Definition Context.hpp:197
static void setExtensionsDirectory(const char *directory)
Set the extensions directory.
Definition Context.hpp:346
void freeIdleMemory() const
Frees idle memory from the internal frame memory pool.
Definition Context.hpp:239
Context(const char *configPath="")
Context constructor.
Definition Context.hpp:72
std::shared_ptr< Device > createNetDevice(const char *address, uint16_t port, OBDeviceAccessMode accessMode=OB_DEVICE_DEFAULT_ACCESS) const
Creates a network device with the specified IP address and port.
Definition Context.hpp:171
void setGvcpPortScheme(OBGvcpPortScheme scheme)
Set the GVCP port scheme used for network device discovery and control.
Definition Context.hpp:142
std::shared_ptr< DeviceList > queryDeviceList() const
Queries the enumerated device list.
Definition Context.hpp:93
static void setLoggerToFile(OBLogSeverity severity, const char *directory)
Set log output to a file.
Definition Context.hpp:278
A class describing device information, representing the name, id, serial number and other basic infor...
Definition Device.hpp:900
Class representing a list of devices.
Definition Device.hpp:1141
static void handle(ob_error **error, bool throw_exception=true)
A static function to handle the ob_error and throw an exception if needed.
Definition Error.hpp:38
Definition Context.hpp:22
IP address configuration for network devices (IPv4), used with property OB_STRUCT_DEVICE_IP_ADDR_CONF...
Definition ObTypes.h:1291
The error class exposed by the SDK, users can get detailed error information according to the error.
Definition ObTypes.h:159