16#include <peak/dll_interface/peak_dll_interface_util.hpp>
17#include <peak/generic/peak_t_callback_manager.hpp>
20#include <unordered_map>
36struct DeviceFoundCallbackContainer;
47 ,
public std::enable_shared_from_this<Interface>
51 using DeviceFoundCallback = std::function<void(
const std::shared_ptr<DeviceDescriptor>& foundDevice)>;
271 struct DeviceFoundCallbackContainer
273 std::weak_ptr<Interface> _Interface;
276 struct DeviceDisconnectedCallbackContainer
278 std::weak_ptr<Interface> _Interface;
281 struct DeviceReconnectedCallbackContainer
283 std::weak_ptr<Interface> _Interface;
286 static void PEAK_CALL_CONV DeviceFoundCallbackCWrapper(
288 static void PEAK_CALL_CONV DeviceLostCallbackCWrapper(
289 const char* lostDeviceId,
size_t lostDeviceIdSize,
void* context);
290 static void PEAK_CALL_CONV DeviceDisconnectedCallbackCWrapper(
294 static void PEAK_CALL_CONV DeviceListChangedCallbackCWrapper(
void* context);
301 void InitializeUpdateMechanismIfNecessary();
303 friend ClassCreator<Interface>;
307 std::weak_ptr<System> m_parentSystem;
309 std::unique_ptr<TCallbackManager<PEAK_DEVICE_FOUND_CALLBACK_HANDLE, DeviceFoundCallbackContainer>>
310 m_deviceFoundCallbackManager;
311 std::unique_ptr<TCallbackManager<PEAK_DEVICE_LOST_CALLBACK_HANDLE, DeviceLostCallback>>
312 m_deviceLostCallbackManager;
314 std::unique_ptr<TCallbackManager<PEAK_DEVICE_DISCONNECTED_CALLBACK_HANDLE, DeviceDisconnectedCallbackContainer>>
315 m_deviceDisconnectedCallbackManager;
316 std::unique_ptr<TCallbackManager<PEAK_DEVICE_RECONNECTED_CALLBACK_HANDLE, DeviceReconnectedCallbackContainer>>
317 m_deviceReconnectedCallbackManager;
319 std::unique_ptr<TCallbackManager<PEAK_DEVICE_LIST_CHANGED_CALLBACK_HANDLE, DeviceListChangedCallback>>
320 m_deviceListChangedCallbackManager;
322 std::vector<std::shared_ptr<DeviceDescriptor>> m_devices;
323 std::unordered_map<std::string, std::shared_ptr<DeviceDescriptor>> m_devicesByKey;
324 std::unordered_map<std::string, std::string> m_devicesKeyById;
325 mutable std::mutex m_devicesMutex;
326 std::once_flag m_updateMechanismInitializedFlag;
341 : m_backendHandle(interfaceHandle)
342 , m_parentSystem(parentSystem)
343 , m_key(QueryStringFromCInterfaceFunction([&](char* key, size_t* keySize) {
347 m_deviceFoundCallbackManager =
348 std::make_unique<TCallbackManager<PEAK_DEVICE_FOUND_CALLBACK_HANDLE, DeviceFoundCallbackContainer>>(
349 [&](
void* callbackContext) {
350 return QueryNumericFromCInterfaceFunction<PEAK_DEVICE_FOUND_CALLBACK_HANDLE>(
353 m_backendHandle, DeviceFoundCallbackCWrapper, callbackContext, deviceFoundCallbackHandle);
357 CallAndCheckCInterfaceFunction([&] {
359 m_backendHandle, callbackHandle);
363 m_deviceLostCallbackManager =
364 std::make_unique<TCallbackManager<PEAK_DEVICE_LOST_CALLBACK_HANDLE, DeviceLostCallback>>(
365 [&](
void* callbackContext) {
366 return QueryNumericFromCInterfaceFunction<PEAK_DEVICE_LOST_CALLBACK_HANDLE>(
369 m_backendHandle, DeviceLostCallbackCWrapper, callbackContext, deviceLostCallbackHandle);
373 CallAndCheckCInterfaceFunction([&] {
375 m_backendHandle, callbackHandle);
379 m_deviceDisconnectedCallbackManager = std::make_unique<
380 TCallbackManager<PEAK_DEVICE_DISCONNECTED_CALLBACK_HANDLE, DeviceDisconnectedCallbackContainer>>(
381 [&](
void* callbackContext) {
382 return QueryNumericFromCInterfaceFunction<PEAK_DEVICE_DISCONNECTED_CALLBACK_HANDLE>(
385 DeviceDisconnectedCallbackCWrapper, callbackContext, deviceDisconnectedCallbackHandle);
389 CallAndCheckCInterfaceFunction([&] {
391 m_backendHandle, callbackHandle);
395 m_deviceReconnectedCallbackManager = std::make_unique<
396 TCallbackManager<PEAK_DEVICE_RECONNECTED_CALLBACK_HANDLE, DeviceReconnectedCallbackContainer>>(
397 [&](
void* callbackContext) {
398 return QueryNumericFromCInterfaceFunction<PEAK_DEVICE_RECONNECTED_CALLBACK_HANDLE>(
401 DeviceReconnectedCallbackCWrapper, callbackContext, deviceReconnectedCallbackHandle);
405 CallAndCheckCInterfaceFunction([&] {
407 m_backendHandle, callbackHandle);
411 m_deviceListChangedCallbackManager =
412 std::make_unique<TCallbackManager<PEAK_DEVICE_LIST_CHANGED_CALLBACK_HANDLE, DeviceListChangedCallback>>(
413 [&](
void* callbackContext) {
414 return QueryNumericFromCInterfaceFunction<PEAK_DEVICE_LIST_CHANGED_CALLBACK_HANDLE>(
417 DeviceListChangedCallbackCWrapper, callbackContext, deviceListChangedCallbackHandle);
421 CallAndCheckCInterfaceFunction([&] {
423 m_backendHandle, callbackHandle);
432 m_deviceFoundCallbackManager->UnregisterAllCallbacks();
433 m_deviceLostCallbackManager->UnregisterAllCallbacks();
435 m_deviceDisconnectedCallbackManager->UnregisterAllCallbacks();
436 m_deviceReconnectedCallbackManager->UnregisterAllCallbacks();
438 m_deviceListChangedCallbackManager->UnregisterAllCallbacks();
453 return QueryRawInformationFromCInterfaceFunction([&](int32_t* dataType, uint8_t* buffer,
size_t* bufferSize) {
455 m_backendHandle, infoCommand, dataType, buffer, bufferSize);
461 return QueryStringFromCInterfaceFunction([&](
char*
id,
size_t* idSize) {
468 return QueryStringFromCInterfaceFunction([&](
char* displayName,
size_t* displayNameSize) {
475 return QueryStringFromCInterfaceFunction([&](
char* tlType,
size_t* tlTypeSize) {
482 InitializeUpdateMechanismIfNecessary();
484 CallAndCheckCInterfaceFunction(
490 std::lock_guard<std::mutex> lock(m_devicesMutex);
496 return LockOrThrow(m_parentSystem);
503 m_deviceFoundCallbackManager->RegisterCallback(DeviceFoundCallbackContainer{ shared_from_this(), callback }));
508 m_deviceFoundCallbackManager->UnregisterCallback(
516 DeviceReconnectedCallbackContainer{ shared_from_this(), callback }));
521 m_deviceReconnectedCallbackManager->UnregisterCallback(
529 DeviceDisconnectedCallbackContainer{ shared_from_this(), callback }));
534 m_deviceDisconnectedCallbackManager->UnregisterCallback(
546 m_deviceLostCallbackManager->UnregisterCallback(
554 m_deviceListChangedCallbackManager->RegisterCallback(callback));
559 m_deviceListChangedCallbackManager->UnregisterCallback(
563inline void PEAK_CALL_CONV Interface::DeviceFoundCallbackCWrapper(
566 auto callbackContainer =
static_cast<DeviceFoundCallbackContainer*
>(context);
568 auto interfaceDescriptor = callbackContainer->_Interface.lock()->GetOrAddFoundDevice(foundDevice);
570 callbackContainer->Callback(interfaceDescriptor);
573inline void PEAK_CALL_CONV Interface::DeviceLostCallbackCWrapper(
574 const char* lostDeviceId,
size_t lostDeviceIdSize,
void* context)
578 callback->operator()(std::string(lostDeviceId, lostDeviceIdSize - 1));
581inline void PEAK_CALL_CONV Interface::DeviceDisconnectedCallbackCWrapper(
584 auto callbackContainer =
static_cast<DeviceDisconnectedCallbackContainer*
>(context);
586 auto deviceDescriptor = callbackContainer->_Interface.lock()->GetOrAddFoundDevice(foundDevice);
588 callbackContainer->Callback(deviceDescriptor);
592 PEAK_DEVICE_RECONNECT_INFORMATION reconnectInformation,
void* context)
594 auto callbackContainer =
static_cast<DeviceReconnectedCallbackContainer*
>(context);
596 auto deviceDescriptor = callbackContainer->_Interface.lock()->GetOrAddFoundDevice(foundDevice);
598 callbackContainer->Callback(deviceDescriptor, DeviceReconnectInformation(std::move(reconnectInformation)));
601inline void PEAK_CALL_CONV Interface::DeviceListChangedCallbackCWrapper(
void* context)
604 callback->operator()();
609 std::lock_guard<std::mutex> lock(m_devicesMutex);
611 const auto deviceKey = QueryStringFromCInterfaceFunction([&](
char* key,
size_t* keySize) {
614 auto keyDevicePairIterator = m_devicesByKey.find(deviceKey);
615 if (keyDevicePairIterator == m_devicesByKey.end())
617 auto deviceDescriptor = std::static_pointer_cast<DeviceDescriptor>(
618 std::make_shared<ClassCreator<DeviceDescriptor>>(
619 foundDevice, std::weak_ptr<Interface>{ shared_from_this() }));
620 m_devices.emplace_back(deviceDescriptor);
621 m_devicesByKey.emplace(deviceKey, deviceDescriptor);
622 m_devicesKeyById.emplace(deviceDescriptor->ID(), deviceKey);
624 return deviceDescriptor;
627 return keyDevicePairIterator->second;
632 auto moduleHandle = QueryNumericFromCInterfaceFunction<PEAK_MODULE_HANDLE>(
642 auto eventSupportingModuleHandle = QueryNumericFromCInterfaceFunction<PEAK_EVENT_SUPPORTING_MODULE_HANDLE>(
645 m_backendHandle, _eventSupportingModuleHandle);
648 return eventSupportingModuleHandle;
651inline void Interface::InitializeUpdateMechanismIfNecessary()
653 std::call_once(m_updateMechanismInitializedFlag, [&] {
660 std::lock_guard<std::mutex> lock(m_devicesMutex);
661 const auto lostDeviceKey = m_devicesKeyById.at(lostDeviceId);
662 m_devices.erase(std::remove_if(std::begin(m_devices), std::end(m_devices),
663 [lostDeviceKey](
const std::shared_ptr<DeviceDescriptor>& device) {
664 return device->Key() == lostDeviceKey;
666 std::end(m_devices));
667 m_devicesByKey.erase(lostDeviceKey);
668 m_devicesKeyById.erase(lostDeviceId);
EventSupportingModule()=default
virtual PEAK_EVENT_SUPPORTING_MODULE_HANDLE EventSupportingModuleHandle() const =0
The base class for all exceptions thrown by the library.
Definition peak_exception.hpp:24
std::function< void()> DeviceListChangedCallback
Definition peak_interface.hpp:68
~Interface() override
Definition peak_interface.hpp:428
PEAK_COMMON_NO_DISCARD std::shared_ptr< System > ParentSystem() const
Returns the parent system.
Definition peak_interface.hpp:494
PEAK_COMMON_NO_DISCARD std::string TLType() const
Returns the TL (transport layer) type.
Definition peak_interface.hpp:473
PEAK_COMMON_NO_DISCARD RawInformation Info(int32_t infoCommand) const
Delivers information based on the given GenTL info command.
Definition peak_interface.hpp:451
Interface(Interface &&other)=delete
Interface(const Interface &other)=delete
Interface & operator=(const Interface &other)=delete
DeviceReconnectedCallback * DeviceReconnectedCallbackHandle
Definition peak_interface.hpp:62
void UpdateDevices(Timeout timeout_ms)
Searches for devices.
Definition peak_interface.hpp:480
void UnregisterDeviceReconnectedCallback(DeviceReconnectedCallbackHandle callbackHandle)
Unregisters a device reconnected callback.
Definition peak_interface.hpp:519
void UnregisterDeviceListChangedCallback(DeviceListChangedCallbackHandle callbackHandle)
Unregisters a device list changed callback.
Definition peak_interface.hpp:557
DeviceDisconnectedCallbackHandle RegisterDeviceDisconnectedCallback(const DeviceDisconnectedCallback &callback)
Registers a callback for signaling a disconnected device.
Definition peak_interface.hpp:525
DeviceReconnectedCallbackHandle RegisterDeviceReconnectedCallback(const DeviceReconnectedCallback &callback)
Registers a callback for signaling a reconnected device.
Definition peak_interface.hpp:512
PEAK_COMMON_NO_DISCARD std::string ID() const
Returns the ID.
Definition peak_interface.hpp:459
DeviceListChangedCallbackHandle RegisterDeviceListChangedCallback(const DeviceListChangedCallback &callback)
Registers a callback for signaling a device list changed.
Definition peak_interface.hpp:550
std::function< void( const std::shared_ptr< DeviceDescriptor > &reconnectedDevice, DeviceReconnectInformation reconnectInformation)> DeviceReconnectedCallback
Definition peak_interface.hpp:59
void UnregisterDeviceDisconnectedCallback(DeviceDisconnectedCallbackHandle callbackHandle)
Unregisters a device disconnected callback.
Definition peak_interface.hpp:532
std::function< void(const std::shared_ptr< DeviceDescriptor > &foundDevice)> DeviceFoundCallback
Definition peak_interface.hpp:51
DeviceListChangedCallback * DeviceListChangedCallbackHandle
Definition peak_interface.hpp:70
PEAK_COMMON_NO_DISCARD std::vector< std::shared_ptr< DeviceDescriptor > > Devices() const
Returns the device list.
Definition peak_interface.hpp:488
PEAK_COMMON_NO_DISCARD std::string DisplayName() const
Returns the display name.
Definition peak_interface.hpp:466
DeviceLostCallbackHandle RegisterDeviceLostCallback(const DeviceLostCallback &callback)
Registers a callback for signaling a lost device.
Definition peak_interface.hpp:538
DeviceLostCallback * DeviceLostCallbackHandle
Definition peak_interface.hpp:66
Interface & operator=(Interface &&other)=delete
DeviceFoundCallback * DeviceFoundCallbackHandle
Definition peak_interface.hpp:53
void UnregisterDeviceFoundCallback(DeviceFoundCallbackHandle callbackHandle)
Unregisters a device found callback.
Definition peak_interface.hpp:506
void UnregisterDeviceLostCallback(DeviceLostCallbackHandle callbackHandle)
Unregisters a device lost callback.
Definition peak_interface.hpp:544
DeviceFoundCallbackHandle RegisterDeviceFoundCallback(const DeviceFoundCallback &callback)
Registers a callback for signaling a found device.
Definition peak_interface.hpp:499
PEAK_COMMON_NO_DISCARD std::string Key() const
Returns the unique key.
Definition peak_interface.hpp:446
DeviceDisconnectedCallback * DeviceDisconnectedCallbackHandle
Definition peak_interface.hpp:57
std::function< void(const std::string &lostDeviceId)> DeviceLostCallback
Definition peak_interface.hpp:64
std::function< void(const std::shared_ptr< DeviceDescriptor > &disconnectedDevice)> DeviceDisconnectedCallback
Definition peak_interface.hpp:55
virtual PEAK_MODULE_HANDLE ModuleHandle() const =0
Represents a GenTL System module.
Definition peak_system.hpp:49
Represents a timeout value in milliseconds.
Definition peak_timeout.hpp:28
The "core" namespace contains the direct GenAPI and GenTL wrapper.
Definition peak_buffer.hpp:32
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition peak_buffer.hpp:29
PEAK_C_API PEAK_DeviceDescriptor_GetKey(PEAK_DEVICE_DESCRIPTOR_HANDLE deviceDescriptorHandle, char *key, size_t *keySize)
Asks the given device descriptor for its key.
struct PEAK_MODULE * PEAK_MODULE_HANDLE
Definition peak_backend.h:419
PEAK_C_API PEAK_Interface_ToEventSupportingModule(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_EVENT_SUPPORTING_MODULE_HANDLE *eventSupportingModuleHandle)
Casts the given interface to an event-supporting module.
PEAK_C_API PEAK_Interface_GetInfo(PEAK_INTERFACE_HANDLE interfaceHandle, int32_t infoCommand, int32_t *infoDataType, uint8_t *info, size_t *infoSize)
Asks the given interface for an information based on a specific command.
PEAK_C_API PEAK_Interface_UnregisterDeviceFoundCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_FOUND_CALLBACK_HANDLE callbackHandle)
Unregisters the device-found callback with the given handle from the given interface.
PEAK_C_API PEAK_Interface_ToModule(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_MODULE_HANDLE *moduleHandle)
Casts the given interface to a module.
struct PEAK_INTERFACE * PEAK_INTERFACE_HANDLE
Definition peak_backend.h:379
PEAK_C_API PEAK_Interface_GetTLType(PEAK_INTERFACE_HANDLE interfaceHandle, char *tlType, size_t *tlTypeSize)
Asks the given interface for its TL type.
PEAK_DEVICE_DISCONNETED_CALLBACK * PEAK_DEVICE_DISCONNECTED_CALLBACK_HANDLE
Definition peak_backend.h:568
PEAK_C_API PEAK_Interface_UnregisterDeviceListChangedCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_LIST_CHANGED_CALLBACK_HANDLE callbackHandle)
Unregisters the device-list-changed callback with the given handle from the given interface.
struct PEAK_EVENT_SUPPORTING_MODULE * PEAK_EVENT_SUPPORTING_MODULE_HANDLE
Definition peak_backend.h:475
PEAK_C_API PEAK_Interface_RegisterDeviceLostCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_LOST_CALLBACK callback, void *callbackContext, PEAK_DEVICE_LOST_CALLBACK_HANDLE *callbackHandle)
Registers a callback signaling a lost device at the given interface.
PEAK_DEVICE_LOST_CALLBACK * PEAK_DEVICE_LOST_CALLBACK_HANDLE
Definition peak_backend.h:570
PEAK_DEVICE_RECONNECTED_CALLBACK * PEAK_DEVICE_RECONNECTED_CALLBACK_HANDLE
Definition peak_backend.h:566
PEAK_C_API PEAK_Interface_UnregisterDeviceDisconnectedCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_DISCONNECTED_CALLBACK_HANDLE callbackHandle)
Unregisters the device disconnected callback with the given handle from the given interface.
PEAK_DEVICE_FOUND_CALLBACK * PEAK_DEVICE_FOUND_CALLBACK_HANDLE
Definition peak_backend.h:564
PEAK_DEVICE_LIST_CHANGED_CALLBACK * PEAK_DEVICE_LIST_CHANGED_CALLBACK_HANDLE
Definition peak_backend.h:572
PEAK_C_API PEAK_Interface_RegisterDeviceFoundCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_FOUND_CALLBACK callback, void *callbackContext, PEAK_DEVICE_FOUND_CALLBACK_HANDLE *callbackHandle)
Registers a callback signaling a found device at the given interface.
PEAK_C_API PEAK_Interface_RegisterDeviceDisconnectedCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_DISCONNETED_CALLBACK callback, void *callbackContext, PEAK_DEVICE_DISCONNECTED_CALLBACK_HANDLE *callbackHandle)
Registers a callback signaling a disconnected device that is now waiting to be reconnected at the giv...
PEAK_C_API PEAK_Interface_RegisterDeviceReconnectedCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_RECONNECTED_CALLBACK callback, void *callbackContext, PEAK_DEVICE_RECONNECTED_CALLBACK_HANDLE *callbackHandle)
Registers a callback signaling a reconnected device at the given interface.
PEAK_C_API PEAK_Interface_UnregisterDeviceLostCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_LOST_CALLBACK_HANDLE callbackHandle)
Unregisters the device-lost callback with the given handle from the given interface.
PEAK_C_API PEAK_Interface_RegisterDeviceListChangedCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_LIST_CHANGED_CALLBACK callback, void *callbackContext, PEAK_DEVICE_LIST_CHANGED_CALLBACK_HANDLE *callbackHandle)
Registers a callback signaling a change in the device list at the given interface.
PEAK_C_API PEAK_Interface_Destruct(PEAK_INTERFACE_HANDLE interfaceHandle)
Destroys the given interface.
PEAK_C_API PEAK_Interface_UnregisterDeviceReconnectedCallback(PEAK_INTERFACE_HANDLE interfaceHandle, PEAK_DEVICE_RECONNECTED_CALLBACK_HANDLE callbackHandle)
Unregisters the device-reconnected callback with the given handle from the given interface.
PEAK_C_API PEAK_Interface_GetDisplayName(PEAK_INTERFACE_HANDLE interfaceHandle, char *displayName, size_t *displayNameSize)
Asks the given interface for its display name.
struct PEAK_DEVICE_DESCRIPTOR * PEAK_DEVICE_DESCRIPTOR_HANDLE
Definition peak_backend.h:383
PEAK_C_API PEAK_Interface_GetKey(PEAK_INTERFACE_HANDLE interfaceHandle, char *key, size_t *keySize)
Asks the given interface for its key.
PEAK_C_API PEAK_Interface_GetID(PEAK_INTERFACE_HANDLE interfaceHandle, char *id, size_t *idSize)
Asks the given interface for its ID.
PEAK_C_API PEAK_Interface_UpdateDevices(PEAK_INTERFACE_HANDLE interfaceHandle, uint64_t timeout_ms)
Tells the given interface to update its devices with the given timeout.
#define PEAK_COMMON_NO_DISCARD
Definition peak_common_defines.h:89
#define PEAK_C_ABI_PREFIX
Definition peak_dll_defines.h:13
Definition peak_backend.h:534