18 #include <peak/generic/peak_t_callback_manager.hpp> 25 #include <type_traits> 26 #include <unordered_map> 27 #include <unordered_set> 85 using SystemFoundCallback = std::function<void(const std::shared_ptr<const core::System>& foundSystem)>;
97 using DeviceFoundCallback = std::function<void(const std::shared_ptr<core::DeviceDescriptor>& foundDevice)>;
229 std::vector<std::shared_ptr<const core::System>>
Systems()
const;
239 std::vector<std::shared_ptr<const core::Interface>>
Interfaces()
const;
249 std::vector<std::shared_ptr<core::DeviceDescriptor>>
Devices()
const;
406 void GetLostDevicesFromLostInterfaces(
407 const std::unordered_set<std::string>& lostInterfaces, std::vector<std::string>& lostDevices);
409 void TriggerSystemFoundCallbacks(
const std::shared_ptr<const core::System>& foundSystem)
const;
410 void TriggerInterfaceFoundCallbacks(
const std::shared_ptr<const core::Interface>& foundInterface)
const;
411 void TriggerInterfaceLostCallbacks(
const std::string& lostInterfaceKey)
const;
412 void TriggerDeviceFoundCallbacks(
const std::shared_ptr<core::DeviceDescriptor>& foundDevice)
const;
413 void TriggerDeviceLostCallbacks(
const std::string& lostDeviceKey)
const;
415 void CheckDevicesOpened()
const;
417 std::mutex m_updateMutex;
418 std::atomic<core::Timeout> m_interfaceUpdateTimeout_ms{ 100 };
419 std::atomic<core::Timeout> m_deviceUpdateTimeout_ms{ 300 };
421 std::vector<std::string> m_producerLibrariesToAdd;
423 std::unordered_map<std::string, std::shared_ptr<core::ProducerLibrary>> m_producerLibraries;
424 std::vector<std::shared_ptr<const core::System>> m_systems;
425 std::vector<std::shared_ptr<const core::Interface>> m_interfaces;
426 std::vector<std::shared_ptr<core::DeviceDescriptor>> m_devices;
430 std::weak_ptr<core::Device> device;
431 std::string displayName;
433 std::vector<OpenedDevice> m_openedDevices;
435 core::TTriggerCallbackManager<SystemFoundCallbackHandle, SystemFoundCallback> m_systemFoundCallbackManager;
436 core::TTriggerCallbackManager<InterfaceFoundCallbackHandle, InterfaceFoundCallback> m_interfaceFoundCallbackManager;
437 core::TTriggerCallbackManager<InterfaceLostCallbackHandle, InterfaceLostCallback> m_interfaceLostCallbackManager;
438 core::TTriggerCallbackManager<DeviceFoundCallbackHandle, DeviceFoundCallback> m_deviceFoundCallbackManager;
439 core::TTriggerCallbackManager<DeviceLostCallbackHandle, DeviceLostCallback> m_deviceLostCallbackManager;
441 std::mutex m_producerLibrariesToAddMutex;
442 mutable std::mutex m_systemsMutex;
443 mutable std::mutex m_interfacesMutex;
444 mutable std::mutex m_devicesMutex;
445 mutable std::mutex m_openedDevicesMutex;
448 template <
typename T,
449 typename std::enable_if<(noexcept(std::declval<T>()())
450 || (std::is_pointer<
typename std::decay<T>::type>::value && __cplusplus < 201703L)
453 && std::is_same<
void, decltype(std::declval<T>()())>::value && std::is_move_constructible<T>::value
454 && std::is_nothrow_move_constructible<T>::value,
457 template <
typename T>
464 RAIIGuard(T&& fun) noexcept
465 : m_fun(std::forward<T>(fun))
467 RAIIGuard(RAIIGuard
const&) =
delete;
468 RAIIGuard(RAIIGuard&& other) noexcept
469 : m_fun(std::move(other.m_fun))
471 ~RAIIGuard() noexcept
476 template <
typename T>
477 static RAIIGuard<T> makeRAIIGuard(T&& fun) noexcept
479 return { std::forward<T>(fun) };
492 return deviceManager;
495 inline DeviceManager::DeviceManager()
497 if (QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([](
PEAK_BOOL8* isInitialized) {
503 "IDS peak API library not initialized. Call peak::Library::Initialize() / " 504 "PEAK_C_ABI_PREFIX PEAK_InitializeLibrary() before anything else.");
510 std::lock_guard<std::mutex> lock(m_producerLibrariesToAddMutex);
512 m_producerLibrariesToAdd.emplace_back(ctiPath);
518 std::lock_guard<std::mutex> lockUpdate(m_updateMutex);
520 std::vector<std::shared_ptr<core::System>> allFoundSystems;
521 std::vector<std::shared_ptr<core::Interface>> allFoundInterfaces;
522 std::vector<std::string> allLostInterfaces;
523 std::vector<std::shared_ptr<core::DeviceDescriptor>> allFoundDevices;
524 std::vector<std::string> allLostDevices;
526 auto interfaceUpdateTimeout_ms = m_interfaceUpdateTimeout_ms.load();
527 auto deviceUpdateTimeout_ms = m_deviceUpdateTimeout_ms.load();
529 std::vector<std::string> ctiPaths;
537 std::lock_guard<std::mutex> lock(m_producerLibrariesToAddMutex);
539 ctiPaths.reserve(ctiPaths.size() + m_producerLibrariesToAdd.size());
541 std::begin(m_producerLibrariesToAdd), std::end(m_producerLibrariesToAdd), std::back_inserter(ctiPaths));
543 m_producerLibrariesToAdd.clear();
545 for (
const auto& ctiPath : ctiPaths)
547 if (!m_producerLibraries.count(ctiPath))
552 auto system = producerLibrary->System()->OpenSystem();
554 m_producerLibraries.emplace(ctiPath, producerLibrary);
555 allFoundSystems.emplace_back(system);
573 errorCallback(
"[CTI - " + ctiPath +
"]: " + ex.what());
582 auto interfaceUpdateFunc = [&interfaceUpdateTimeout_ms, &errorCallback](
const std::shared_ptr<core::System>& system)
583 -> std::tuple<std::vector<std::shared_ptr<core::Interface>>, std::vector<std::string>> {
584 std::vector<std::shared_ptr<core::Interface>> foundInterfaces;
585 std::vector<std::string> lostInterfaces;
589 auto foundCallbackHandle = system->RegisterInterfaceFoundCallback(
590 [&foundInterfaces](
const std::shared_ptr<core::InterfaceDescriptor>& foundInterface) {
591 foundInterfaces.emplace_back(foundInterface->OpenInterface());
593 auto const foundCallbackCleanupGuard = makeRAIIGuard([system, &foundCallbackHandle]() noexcept {
596 system->UnregisterInterfaceFoundCallback(foundCallbackHandle);
604 auto keysById = std::unordered_map<std::string, std::string>();
605 for (
const auto& iface : system->Interfaces())
607 keysById.emplace(iface->ID(), iface->Key());
609 auto lostCallbackHandle = system->RegisterInterfaceLostCallback(
610 [&lostInterfaces, &keysById](
const std::string& lostInterfaceId) {
611 auto idKeyPairIt = keysById.find(lostInterfaceId);
613 if (idKeyPairIt != keysById.end())
615 lostInterfaces.emplace_back((*idKeyPairIt).second);
618 auto const lostCallbackCleanupGuard = makeRAIIGuard([system, &lostCallbackHandle]() noexcept {
621 system->UnregisterInterfaceLostCallback(lostCallbackHandle);
629 system->UpdateInterfaces(interfaceUpdateTimeout_ms);
637 errorCallback(
"[System - " + system->Key() +
"]: " + ex.what());
644 return std::make_tuple(foundInterfaces, lostInterfaces);
648 const std::launch launchPolicy =
650 std::vector<std::future<std::tuple<std::vector<std::shared_ptr<core::Interface>>, std::vector<std::string>>>>
651 interfaceUpdateFutures;
652 for (
const auto& system : m_systems)
654 interfaceUpdateFutures.emplace_back(
655 std::async(launchPolicy, interfaceUpdateFunc, std::const_pointer_cast<core::System>(system)));
657 for (
const auto& system : allFoundSystems)
659 interfaceUpdateFutures.emplace_back(std::async(launchPolicy, interfaceUpdateFunc, system));
661 for (
auto& future : interfaceUpdateFutures)
663 auto foundLostInterfacesTuple = future.get();
664 auto foundInterfaces = std::get<0>(foundLostInterfacesTuple);
665 auto lostInterfaces = std::get<1>(foundLostInterfacesTuple);
666 allFoundInterfaces.reserve(allFoundInterfaces.size() + foundInterfaces.size());
667 std::move(std::begin(foundInterfaces), std::end(foundInterfaces), std::back_inserter(allFoundInterfaces));
668 allLostInterfaces.reserve(allLostInterfaces.size() + lostInterfaces.size());
669 std::move(std::begin(lostInterfaces), std::end(lostInterfaces), std::back_inserter(allLostInterfaces));
672 auto deviceUpdateFunc = [
this, &deviceUpdateTimeout_ms, &errorCallback](
673 const std::shared_ptr<core::Interface>& iface)
674 -> std::tuple<std::vector<std::shared_ptr<core::DeviceDescriptor>>, std::vector<std::string>> {
675 std::vector<std::shared_ptr<core::DeviceDescriptor>> foundDevices;
676 std::vector<std::string> lostDevices;
680 auto foundCallbackHandle = iface->RegisterDeviceFoundCallback(
681 [
this, &foundDevices](
const std::shared_ptr<core::DeviceDescriptor>& foundDevice) {
682 foundDevice->RegisterDeviceOpenedCallback(
683 [
this](
const std::shared_ptr<core::Device>& openedDevice) {
684 std::lock_guard<std::mutex> lock(m_openedDevicesMutex);
687 m_openedDevices.erase(std::remove_if(std::begin(m_openedDevices), std::end(m_openedDevices),
688 [](
const OpenedDevice& dev) {
return dev.device.expired(); }),
689 std::end(m_openedDevices));
693 device.device = openedDevice;
694 device.displayName = openedDevice->DisplayName();
695 m_openedDevices.push_back(device);
698 foundDevices.emplace_back(foundDevice);
700 auto const foundCallbackCleanupGuard = makeRAIIGuard([iface, &foundCallbackHandle]() noexcept {
703 iface->UnregisterDeviceFoundCallback(foundCallbackHandle);
711 auto keysById = std::unordered_map<std::string, std::string>();
712 for (
const auto& device : iface->Devices())
714 keysById.emplace(device->ID(), device->Key());
716 auto lostCallbackHandle = iface->RegisterDeviceLostCallback(
717 [&lostDevices, &keysById](
const std::string& lostDeviceId) {
718 auto idKeyPairIt = keysById.find(lostDeviceId);
720 if (idKeyPairIt != keysById.end())
722 lostDevices.emplace_back((*idKeyPairIt).second);
725 auto const lostCallbackCleanupGuard = makeRAIIGuard([iface, &lostCallbackHandle]() noexcept {
728 iface->UnregisterDeviceLostCallback(lostCallbackHandle);
736 iface->UpdateDevices(deviceUpdateTimeout_ms);
744 errorCallback(
"[Interface - " + iface->Key() +
"]: " + ex.what());
751 return std::make_tuple(foundDevices, lostDevices);
755 std::vector<std::future<std::tuple<std::vector<std::shared_ptr<core::DeviceDescriptor>>, std::vector<std::string>>>>
757 for (
const auto& iface : m_interfaces)
759 deviceUpdateFutures.emplace_back(
760 std::async(launchPolicy, deviceUpdateFunc, std::const_pointer_cast<core::Interface>(iface)));
762 for (
const auto& iface : allFoundInterfaces)
764 deviceUpdateFutures.emplace_back(std::async(launchPolicy, deviceUpdateFunc, iface));
766 for (
auto& future : deviceUpdateFutures)
768 auto foundLostDevicesTuple = future.get();
769 auto foundDevices = std::get<0>(foundLostDevicesTuple);
770 auto lostDevices = std::get<1>(foundLostDevicesTuple);
771 allFoundDevices.reserve(allFoundDevices.size() + foundDevices.size());
772 std::move(std::begin(foundDevices), std::end(foundDevices), std::back_inserter(allFoundDevices));
773 allLostDevices.reserve(allLostDevices.size() + lostDevices.size());
774 std::move(std::begin(lostDevices), std::end(lostDevices), std::back_inserter(allLostDevices));
778 for (
const auto& foundSystem : allFoundSystems)
780 TriggerSystemFoundCallbacks(foundSystem);
783 for (
const auto& foundInterface : allFoundInterfaces)
785 TriggerInterfaceFoundCallbacks(foundInterface);
787 std::unordered_set<std::string> allLostInterfacesLookUp;
788 for (
const auto& lostInterfaceKey : allLostInterfaces)
790 TriggerInterfaceLostCallbacks(lostInterfaceKey);
791 allLostInterfacesLookUp.emplace(lostInterfaceKey);
794 for (
const auto& foundDevice : allFoundDevices)
796 TriggerDeviceFoundCallbacks(foundDevice);
798 GetLostDevicesFromLostInterfaces(allLostInterfacesLookUp, allLostDevices);
799 for (
const auto& lostDeviceKey : allLostDevices)
801 TriggerDeviceLostCallbacks(lostDeviceKey);
806 std::lock_guard<std::mutex> lock(m_systemsMutex);
807 std::lock_guard<std::mutex> lock2(m_interfacesMutex);
808 std::lock_guard<std::mutex> lock3(m_devicesMutex);
810 m_systems.reserve(m_systems.size() + allFoundSystems.size());
811 std::move(std::begin(allFoundSystems), std::end(allFoundSystems), std::back_inserter(m_systems));
813 for (
const auto& lostInterfaceKey : allLostInterfaces)
815 m_interfaces.erase(std::find_if(std::begin(m_interfaces), std::end(m_interfaces),
816 [&lostInterfaceKey](
const std::shared_ptr<const core::Interface>& interfaceToCheck) ->
bool {
817 return interfaceToCheck->Key() == lostInterfaceKey;
820 m_interfaces.reserve(m_interfaces.size() + allFoundInterfaces.size());
821 std::move(std::begin(allFoundInterfaces), std::end(allFoundInterfaces), std::back_inserter(m_interfaces));
823 for (
const auto& lostDeviceKey : allLostDevices)
825 m_devices.erase(std::find_if(std::begin(m_devices), std::end(m_devices),
826 [&lostDeviceKey](
const std::shared_ptr<core::DeviceDescriptor>& deviceToCheck) ->
bool {
827 return deviceToCheck->Key() == lostDeviceKey;
830 m_devices.reserve(m_devices.size() + allFoundDevices.size());
831 std::move(std::begin(allFoundDevices), std::end(allFoundDevices), std::back_inserter(m_devices));
837 std::lock_guard<std::mutex> lockUpdate(m_updateMutex);
842 CheckDevicesOpened();
846 std::lock_guard<std::mutex> lock(m_systemsMutex);
847 std::lock_guard<std::mutex> lock2(m_interfacesMutex);
848 std::lock_guard<std::mutex> lock3(m_devicesMutex);
850 for (
const auto& lostDevice : m_devices)
852 TriggerDeviceLostCallbacks(lostDevice->Key());
856 for (
const auto& lostInterface : m_interfaces)
858 TriggerInterfaceLostCallbacks(lostInterface->Key());
860 m_interfaces.clear();
863 m_producerLibraries.clear();
867 std::lock_guard<std::mutex> lock(m_producerLibrariesToAddMutex);
868 m_producerLibrariesToAdd.clear();
872 inline void DeviceManager::CheckDevicesOpened()
const 874 size_t openDevicesFound = 0;
875 std::string deviceDisplayNames;
878 std::lock_guard<std::mutex> lock(m_openedDevicesMutex);
880 for (
const auto& openedDevice : m_openedDevices)
882 auto openDevice = openedDevice.device.lock();
886 deviceDisplayNames += openedDevice.displayName;
887 deviceDisplayNames +=
" ";
892 if (openDevicesFound > 0)
895 "Can't reset the device manager while there are devices open. The following devices (" 896 + std::to_string(openDevicesFound) +
") are open: " + deviceDisplayNames);
902 return m_interfaceUpdateTimeout_ms;
907 m_interfaceUpdateTimeout_ms = timeout_ms;
912 return m_deviceUpdateTimeout_ms;
917 m_deviceUpdateTimeout_ms = timeout_ms;
922 std::lock_guard<std::mutex> lock(m_systemsMutex);
929 std::lock_guard<std::mutex> lock(m_interfacesMutex);
936 std::lock_guard<std::mutex> lock(m_devicesMutex);
944 return m_systemFoundCallbackManager.RegisterCallback(callback);
949 m_systemFoundCallbackManager.UnregisterCallback(callbackHandle);
955 return m_interfaceFoundCallbackManager.RegisterCallback(callback);
960 m_interfaceFoundCallbackManager.UnregisterCallback(callbackHandle);
966 return m_interfaceLostCallbackManager.RegisterCallback(callback);
971 m_interfaceLostCallbackManager.UnregisterCallback(callbackHandle);
977 return m_deviceFoundCallbackManager.RegisterCallback(callback);
982 m_deviceFoundCallbackManager.UnregisterCallback(callbackHandle);
988 return m_deviceLostCallbackManager.RegisterCallback(callback);
993 m_deviceLostCallbackManager.UnregisterCallback(callbackHandle);
996 inline void DeviceManager::GetLostDevicesFromLostInterfaces(
997 const std::unordered_set<std::string>& lostInterfaces, std::vector<std::string>& lostDevices)
999 std::lock_guard<std::mutex> lock(m_devicesMutex);
1001 for (
const auto& device : m_devices)
1003 if (lostInterfaces.count(device->ParentInterface()->Key()))
1005 lostDevices.emplace_back(device->Key());
1010 inline void DeviceManager::TriggerSystemFoundCallbacks(
const std::shared_ptr<const core::System>& foundSystem)
const 1012 m_systemFoundCallbackManager.TriggerCallbacks(foundSystem);
1015 inline void DeviceManager::TriggerInterfaceFoundCallbacks(
1016 const std::shared_ptr<const core::Interface>& foundInterface)
const 1018 m_interfaceFoundCallbackManager.TriggerCallbacks(foundInterface);
1021 inline void DeviceManager::TriggerInterfaceLostCallbacks(
const std::string& lostInterfaceKey)
const 1023 m_interfaceLostCallbackManager.TriggerCallbacks(lostInterfaceKey);
1026 inline void DeviceManager::TriggerDeviceFoundCallbacks(
const std::shared_ptr<core::DeviceDescriptor>& foundDevice)
const 1028 m_deviceFoundCallbackManager.TriggerCallbacks(foundDevice);
1031 inline void DeviceManager::TriggerDeviceLostCallbacks(
const std::string& lostDeviceKey)
const 1033 m_deviceLostCallbackManager.TriggerCallbacks(lostDeviceKey);
std::function< void(const std::string &errorDescription)> UpdateErrorCallback
Definition: peak_device_manager.hpp:105
void AddProducerLibrary(const std::string &ctiPath)
Adds the given producer library (CTI).
Definition: peak_device_manager.hpp:508
std::function< void(const std::string &lostInterfaceKey)> InterfaceLostCallback
Definition: peak_device_manager.hpp:93
static std::shared_ptr< ProducerLibrary > Open(const std::string &ctiPath)
Opens the given producer library (CTI).
Definition: peak_producer_library.hpp:109
std::vector< std::shared_ptr< core::DeviceDescriptor > > Devices() const
Returns the found devices.
Definition: peak_device_manager.hpp:934
int8_t PEAK_BOOL8
Definition: peak_backend.h:26
void SetDeviceUpdateTimeout(core::Timeout timeout_ms)
Sets the device update timeout.
Definition: peak_device_manager.hpp:915
UpdatePolicy
Enum holding the possible update policies.
Definition: peak_device_manager.hpp:72
ResetPolicy
Enum holding the possible reset policies.
Definition: peak_device_manager.hpp:78
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition: peak_dynamic_loader.h:32
DeviceLostCallbackHandle RegisterDeviceLostCallback(const DeviceLostCallback &callback)
Registers a callback for signaling a lost device.
Definition: peak_device_manager.hpp:985
The exception thrown for signaling that the library was not initialized.
Definition: peak_exception.hpp:123
std::function< void(const std::shared_ptr< const core::Interface > &foundInterface)> InterfaceFoundCallback
Definition: peak_device_manager.hpp:89
std::vector< std::shared_ptr< const core::Interface > > Interfaces() const
Returns the found and opened interfaces.
Definition: peak_device_manager.hpp:927
InterfaceLostCallback * InterfaceLostCallbackHandle
Definition: peak_device_manager.hpp:95
std::function< void(const std::shared_ptr< const core::System > &foundSystem)> SystemFoundCallback
Definition: peak_device_manager.hpp:85
SystemFoundCallbackHandle RegisterSystemFoundCallback(const SystemFoundCallback &callback)
Registers a callback for signaling a found system.
Definition: peak_device_manager.hpp:941
void Reset(ResetPolicy resetPolicy=ResetPolicy::ErrorOnOpenDevices)
Resets the DeviceManager.
Definition: peak_device_manager.hpp:835
void UnregisterSystemFoundCallback(SystemFoundCallbackHandle callbackHandle)
Unregisters a system found callback.
Definition: peak_device_manager.hpp:947
core::Timeout InterfaceUpdateTimeout() const
Returns the interface update timeout.
Definition: peak_device_manager.hpp:900
void UnregisterInterfaceFoundCallback(InterfaceFoundCallbackHandle callbackHandle)
Unregisters a interface found callback.
Definition: peak_device_manager.hpp:958
InterfaceFoundCallbackHandle RegisterInterfaceFoundCallback(const InterfaceFoundCallback &callback)
Registers a callback for signaling a found interface.
Definition: peak_device_manager.hpp:952
PEAK_C_API PEAK_Library_IsInitialized(PEAK_BOOL8 *isInitialized)
Checks if the IDS peak API library is initialized.
void Update(UpdatePolicy updatePolicy=UpdatePolicy::ScanEnvironmentForProducerLibraries, const UpdateErrorCallback &errorCallback=UpdateErrorCallback())
Starts an update.
Definition: peak_device_manager.hpp:515
static std::vector< std::string > CollectCTIPaths()
Collects producer library paths found in the current environment.
Definition: peak_environment_inspector.hpp:71
DeviceLostCallback * DeviceLostCallbackHandle
Definition: peak_device_manager.hpp:103
Represents a timeout value in milliseconds.
Definition: peak_timeout.hpp:30
The exception thrown for internal errors.
Definition: peak_exception.hpp:57
The base class for all exceptions thrown by the library.
Definition: peak_exception.hpp:25
DeviceFoundCallbackHandle RegisterDeviceFoundCallback(const DeviceFoundCallback &callback)
Registers a callback for signaling a found device.
Definition: peak_device_manager.hpp:974
The global DeviceManager (singleton) searches all installed producer libraries (*.cti) and enumerates the modules contained in them.
Definition: peak_device_manager.hpp:68
std::function< void(const std::shared_ptr< core::DeviceDescriptor > &foundDevice)> DeviceFoundCallback
Definition: peak_device_manager.hpp:97
#define PEAK_C_ABI_PREFIX
Definition: peak_dll_defines.h:16
static DeviceManager & Instance()
Returns the global DeviceManager.
Definition: peak_device_manager.hpp:489
InterfaceLostCallbackHandle RegisterInterfaceLostCallback(const InterfaceLostCallback &callback)
Registers a callback for signaling a lost interface.
Definition: peak_device_manager.hpp:963
std::function< void(const std::string &lostDeviceKey)> DeviceLostCallback
Definition: peak_device_manager.hpp:101
void UnregisterDeviceLostCallback(DeviceLostCallbackHandle callbackHandle)
Unregisters a device lost callback.
Definition: peak_device_manager.hpp:991
SystemFoundCallback * SystemFoundCallbackHandle
Definition: peak_device_manager.hpp:87
The exception thrown for signaling a feature is not available in the device.
Definition: peak_exception.hpp:97
InterfaceFoundCallback * InterfaceFoundCallbackHandle
Definition: peak_device_manager.hpp:91
DeviceFoundCallback * DeviceFoundCallbackHandle
Definition: peak_device_manager.hpp:99
std::vector< std::shared_ptr< const core::System > > Systems() const
Returns the found and opened systems.
Definition: peak_device_manager.hpp:920
void UnregisterInterfaceLostCallback(InterfaceLostCallbackHandle callbackHandle)
Unregisters an interface lost callback.
Definition: peak_device_manager.hpp:969
core::Timeout DeviceUpdateTimeout() const
Returns the device update timeout.
Definition: peak_device_manager.hpp:910
void UnregisterDeviceFoundCallback(DeviceFoundCallbackHandle callbackHandle)
Unregisters a device found callback.
Definition: peak_device_manager.hpp:980
void SetInterfaceUpdateTimeout(core::Timeout timeout_ms)
Sets the interface update timeout.
Definition: peak_device_manager.hpp:905