OrbbecSDK 2.6.3
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
144 std::shared_ptr<Device> createNetDevice(const char *address, uint16_t port, OBDeviceAccessMode accessMode = OB_DEVICE_DEFAULT_ACCESS) const {
145 ob_error *error = nullptr;
146 auto device = ob_create_net_device_ex(impl_, address, port, accessMode, &error);
147 Error::handle(&error);
148 return std::make_shared<Device>(device);
149 }
150
161 std::lock_guard<std::mutex> lock(legacyCallbackMtx_);
162 // remove the last callback first
163 if(legacyCallbackId_ != INVALID_CALLBACK_ID) {
164 unregisterDeviceChangedCallback(legacyCallbackId_);
165 }
166 // register the new callback
167 legacyCallbackId_ = registerDeviceChangedCallback(callback);
168 }
169
171 ob_error *error = nullptr;
172 auto cbCtxHolder = std::unique_ptr<DeviceChangedCallbackContext>(new DeviceChangedCallbackContext({ this, 0, nullptr }));
173 auto id = ob_register_device_changed_callback(impl_, &Context::deviceChangedCallback, (void *)cbCtxHolder.get(), &error);
174 Error::handle(&error);
175
176 cbCtxHolder->callbackId = id;
177 cbCtxHolder->callback = callback;
178 {
179 std::unique_lock<std::mutex> lock(callbackMtx_);
180 devChangedCallbacks_[id] = std::move(cbCtxHolder);
181 }
182 return id;
183 }
184
186 ob_error *error = nullptr;
187 ob_unregister_device_changed_callback(impl_, id, &error);
188 {
189 std::unique_lock<std::mutex> lock(callbackMtx_);
190 if(devChangedCallbacks_.count(id)) {
191 devChangedCallbacks_.erase(id);
192 }
193 }
194 Error::handle(&error);
195 }
196
202 void enableDeviceClockSync(uint64_t repeatIntervalMsec) const {
203 ob_error *error = nullptr;
204 ob_enable_device_clock_sync(impl_, repeatIntervalMsec, &error);
205 Error::handle(&error);
206 }
207
212 void freeIdleMemory() const {
213 ob_error *error = nullptr;
214 ob_free_idle_memory(impl_, &error);
215 Error::handle(&error);
216 }
217
227 ob_error *error = nullptr;
228 ob_set_uvc_backend_type(impl_, type, &error);
229 Error::handle(&error);
230 }
231
238 static void setLoggerSeverity(OBLogSeverity severity) {
239 ob_error *error = nullptr;
240 ob_set_logger_severity(severity, &error);
241 Error::handle(&error);
242 }
243
251 static void setLoggerToFile(OBLogSeverity severity, const char *directory) {
252 ob_error *error = nullptr;
253 ob_set_logger_to_file(severity, directory, &error);
254 Error::handle(&error);
255 }
256
264 static void setLoggerFileName(const std::string &fileName) {
265 ob_error *error = nullptr;
266 ob_set_logger_file_name(fileName.c_str(), &error);
267 Error::handle(&error);
268 }
269
275 static void setLoggerToConsole(OBLogSeverity severity) {
276 ob_error *error = nullptr;
277 ob_set_logger_to_console(severity, &error);
278 Error::handle(&error);
279 }
280
287 static void setLoggerToCallback(OBLogSeverity severity, LogCallback callback) {
288 ob_error *error = nullptr;
289 Context::getLogCallback() = callback;
290 ob_set_logger_to_callback(severity, &Context::logCallback, &Context::getLogCallback(), &error);
291 Error::handle(&error);
292 }
293
304 static void logExternalMessage(OBLogSeverity severity, const std::string &module, const std::string &message, const std::string &file,
305 const std::string &func, int line) {
306 ob_error *error = nullptr;
307 ob_log_external_message(severity, module.c_str(), message.c_str(), file.c_str(), func.c_str(), line, &error);
308 Error::handle(&error);
309 }
310
319 static void setExtensionsDirectory(const char *directory) {
320 ob_error *error = nullptr;
321 ob_set_extensions_directory(directory, &error);
322 Error::handle(&error);
323 }
324
325private:
326 static void deviceChangedCallback(ob_device_list *removedList, ob_device_list *addedList, void *userData) {
327 auto cbCtx = static_cast<DeviceChangedCallbackContext *>(userData);
328 if(cbCtx && cbCtx->ctx && cbCtx->callbackId != INVALID_CALLBACK_ID) {
329 DeviceChangedCallback callbackCopy;
330 {
331 // preventing the captured variables from being released.
332 std::unique_lock<std::mutex> lock(cbCtx->ctx->callbackMtx_);
333 if(cbCtx->ctx->devChangedCallbacks_.count(cbCtx->callbackId)) {
334 callbackCopy = cbCtx->callback;
335 }
336 }
337 auto removed = std::make_shared<DeviceList>(removedList);
338 auto added = std::make_shared<DeviceList>(addedList);
339 callbackCopy(removed, added);
340 }
341 }
342
343 static void logCallback(OBLogSeverity severity, const char *logMsg, void *userData) {
344 auto cb = static_cast<LogCallback *>(userData);
345 if(cb) {
346 (*cb)(severity, logMsg);
347 }
348 }
349
350 // Lazy initialization of the logcallback_. The purpose is to initialize logcallback_ in .hpp
351 static LogCallback &getLogCallback() {
352 static LogCallback logCallback_ = nullptr;
353 return logCallback_;
354 }
355
356// for backward compatibility
357#define enableMultiDeviceSync enableDeviceClockSync
358};
359} // namespace ob
Context is a management class that describes the runtime of the SDK and is responsible for resource a...
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_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:1822
struct ob_context_t ob_context
Definition ObTypes.h:22
enum ob_device_access_mode OBDeviceAccessMode
enum ob_uvc_backend_type OBUvcBackendType
#define INVALID_CALLBACK_ID
Definition ObTypes.h:1934
struct ob_device_list_t ob_device_list
Definition ObTypes.h:25
uint64_t OBCallbackId
Callback Id.
Definition ObTypes.h:1933
OBLogSeverity
log level, the higher the level, the stronger the log filter
Definition ObTypes.h:85
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:238
static void setLoggerToConsole(OBLogSeverity severity)
Set log output to the console.
Definition Context.hpp:275
void setDeviceChangedCallback(DeviceChangedCallback callback)
Set the device plug-in callback function.
Definition Context.hpp:160
static void setLoggerFileName(const std::string &fileName)
Set the log file name for file output.
Definition Context.hpp:264
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:202
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:304
static void setLoggerToCallback(OBLogSeverity severity, LogCallback callback)
Set the logger to callback.
Definition Context.hpp:287
~Context() noexcept
Context destructor.
Definition Context.hpp:81
void unregisterDeviceChangedCallback(OBCallbackId id)
Definition Context.hpp:185
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:226
OBCallbackId registerDeviceChangedCallback(DeviceChangedCallback callback)
Definition Context.hpp:170
static void setExtensionsDirectory(const char *directory)
Set the extensions directory.
Definition Context.hpp:319
void freeIdleMemory() const
Frees idle memory from the internal frame memory pool.
Definition Context.hpp:212
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:144
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:251
A class describing device information, representing the name, id, serial number and other basic infor...
Definition Device.hpp:889
Class representing a list of devices.
Definition Device.hpp:1130
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)
Definition ObTypes.h:1156
The error class exposed by the SDK, users can get detailed error information according to the error.
Definition ObTypes.h:119