IDS peak genericC++  v1.7.0
peak_device.hpp
Go to the documentation of this file.
1 
11 #pragma once
12 
13 
20 #include <peak/dll_interface/peak_dll_interface_util.hpp>
21 
22 #include <cstddef>
23 #include <cstdint>
24 #include <memory>
25 #include <string>
26 #include <vector>
27 
28 
29 namespace peak
30 {
31 namespace core
32 {
33 
34 class Interface;
35 
52 class Device
53  : public EventSupportingModule
54  , public std::enable_shared_from_this<Device>
55 {
56 public:
57  Device() = delete;
58  ~Device() override;
59  Device(const Device& other) = delete;
60  Device& operator=(const Device& other) = delete;
61  Device(Device&& other) = delete;
62  Device& operator=(Device&& other) = delete;
63 
65  std::string Key() const;
66 
68  RawInformation Info(int32_t infoCommand) const;
69 
71  std::string ID() const;
72 
74  std::string DisplayName() const;
75 
77  std::string VendorName() const;
78 
80  std::string ModelName() const;
81 
83  std::string Version() const;
84 
86  std::string TLType() const;
87 
89  std::string UserDefinedName() const;
90 
92  std::string SerialNumber() const;
93 
96 
98  uint64_t TimestampTickFrequency() const;
99 
112  std::shared_ptr<class RemoteDevice> RemoteDevice() const;
113 
123  std::vector<std::shared_ptr<DataStreamDescriptor>> DataStreams() const;
124 
126  std::shared_ptr<Interface> ParentInterface() const;
127 
138  {
139  return m_backendHandle;
140  }
141 
142 private:
143  PEAK_MODULE_HANDLE ModuleHandle() const override;
144  PEAK_EVENT_SUPPORTING_MODULE_HANDLE EventSupportingModuleHandle() const override;
145 
146  friend ClassCreator<Device>;
147  Device(PEAK_DEVICE_HANDLE deviceHandle, const std::weak_ptr<Interface>& parentInterface);
148  PEAK_DEVICE_HANDLE m_backendHandle;
149 
150  std::weak_ptr<Interface> m_parentInterface;
151 
152  void Initialize() const override;
153  mutable std::vector<std::shared_ptr<DataStreamDescriptor>> m_dataStreams;
154  mutable std::shared_ptr<class RemoteDevice> m_remoteDevice;
155 
156  std::string m_key;
157 };
158 
159 } /* namespace core */
160 } /* namespace peak */
161 
162 /* Implementation */
163 namespace peak
164 {
165 namespace core
166 {
167 
168 inline Device::Device(PEAK_DEVICE_HANDLE deviceHandle, const std::weak_ptr<Interface>& parentInterface)
169  : m_backendHandle(deviceHandle)
170  , m_parentInterface(parentInterface)
171  , m_key(QueryStringFromCInterfaceFunction([&](char* key, size_t* keySize) {
172  return PEAK_C_ABI_PREFIX PEAK_Device_GetKey(deviceHandle, key, keySize);
173  }))
174 {}
175 
177 {
178  (void)PEAK_C_ABI_PREFIX PEAK_Device_Destruct(m_backendHandle);
179 }
180 
181 inline std::string Device::Key() const
182 {
183  return m_key;
184 }
185 
186 inline RawInformation Device::Info(int32_t infoCommand) const
187 {
188  return QueryRawInformationFromCInterfaceFunction([&](int32_t* dataType, uint8_t* buffer, size_t* bufferSize) {
189  return PEAK_C_ABI_PREFIX PEAK_Device_GetInfo(m_backendHandle, infoCommand, dataType, buffer, bufferSize);
190  });
191 }
192 
193 inline std::string Device::ID() const
194 {
195  return QueryStringFromCInterfaceFunction([&](char* id, size_t* idSize) {
196  return PEAK_C_ABI_PREFIX PEAK_Device_GetID(m_backendHandle, id, idSize);
197  });
198 }
199 
200 inline std::string Device::DisplayName() const
201 {
202  return QueryStringFromCInterfaceFunction([&](char* displayName, size_t* displayNameSize) {
203  return PEAK_C_ABI_PREFIX PEAK_Device_GetDisplayName(m_backendHandle, displayName, displayNameSize);
204  });
205 }
206 
207 inline std::string Device::VendorName() const
208 {
209  return QueryStringFromCInterfaceFunction([&](char* vendorName, size_t* vendorNameSize) {
210  return PEAK_C_ABI_PREFIX PEAK_Device_GetVendorName(m_backendHandle, vendorName, vendorNameSize);
211  });
212 }
213 
214 inline std::string Device::ModelName() const
215 {
216  return QueryStringFromCInterfaceFunction([&](char* modelName, size_t* modelNameSize) {
217  return PEAK_C_ABI_PREFIX PEAK_Device_GetModelName(m_backendHandle, modelName, modelNameSize);
218  });
219 }
220 
221 inline std::string Device::Version() const
222 {
223  return QueryStringFromCInterfaceFunction([&](char* version, size_t* versionSize) {
224  return PEAK_C_ABI_PREFIX PEAK_Device_GetVersion(m_backendHandle, version, versionSize);
225  });
226 }
227 
228 inline std::string Device::TLType() const
229 {
230  return QueryStringFromCInterfaceFunction([&](char* tlType, size_t* tlTypeSize) {
231  return PEAK_C_ABI_PREFIX PEAK_Device_GetTLType(m_backendHandle, tlType, tlTypeSize);
232  });
233 }
234 
235 inline std::string Device::UserDefinedName() const
236 {
237  return QueryStringFromCInterfaceFunction([&](char* userDefinedName, size_t* userDefinedNameSize) {
239  m_backendHandle, userDefinedName, userDefinedNameSize);
240  });
241 }
242 
243 inline std::string Device::SerialNumber() const
244 {
245  return QueryStringFromCInterfaceFunction([&](char* serialNumber, size_t* serialNumberSize) {
246  return PEAK_C_ABI_PREFIX PEAK_Device_GetSerialNumber(m_backendHandle, serialNumber, serialNumberSize);
247  });
248 }
249 
251 {
252  return static_cast<DeviceAccessStatus>(QueryNumericFromCInterfaceFunction<PEAK_DEVICE_ACCESS_STATUS>(
253  [&](PEAK_DEVICE_ACCESS_STATUS* accessStatus) {
254  return PEAK_C_ABI_PREFIX PEAK_Device_GetAccessStatus(m_backendHandle, accessStatus);
255  }));
256 }
257 
258 inline uint64_t Device::TimestampTickFrequency() const
259 {
260  return QueryNumericFromCInterfaceFunction<uint64_t>([&](uint64_t* timestampTickFrequency) {
261  return PEAK_C_ABI_PREFIX PEAK_Device_GetTimestampTickFrequency(m_backendHandle, timestampTickFrequency);
262  });
263 }
264 
265 inline std::shared_ptr<class RemoteDevice> Device::RemoteDevice() const
266 {
267  InitializeIfNecessary();
268 
269  return m_remoteDevice;
270 }
271 
272 inline std::vector<std::shared_ptr<DataStreamDescriptor>> Device::DataStreams() const
273 {
274  InitializeIfNecessary();
275 
276  return m_dataStreams;
277 }
278 
279 inline std::shared_ptr<Interface> Device::ParentInterface() const
280 {
281  return LockOrThrow(m_parentInterface);
282 }
283 
284 inline PEAK_MODULE_HANDLE Device::ModuleHandle() const
285 {
286  auto moduleHandle = QueryNumericFromCInterfaceFunction<PEAK_MODULE_HANDLE>(
287  [&](PEAK_MODULE_HANDLE* _moduleHandle) {
288  return PEAK_C_ABI_PREFIX PEAK_Device_ToModule(m_backendHandle, _moduleHandle);
289  });
290 
291  return moduleHandle;
292 }
293 
294 inline PEAK_EVENT_SUPPORTING_MODULE_HANDLE Device::EventSupportingModuleHandle() const
295 {
296  auto eventSupportingModuleHandle = QueryNumericFromCInterfaceFunction<PEAK_EVENT_SUPPORTING_MODULE_HANDLE>(
297  [&](PEAK_EVENT_SUPPORTING_MODULE_HANDLE* _eventSupportingModuleHandle) {
299  m_backendHandle, _eventSupportingModuleHandle);
300  });
301 
302  return eventSupportingModuleHandle;
303 }
304 
305 inline void Device::Initialize() const
306 {
307  EventSupportingModule::Initialize(); // init data of parent classes (i.e. Module) as well
308 
309  // init data streams
310  auto numDataStreams = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numDataStreams) {
311  return PEAK_C_ABI_PREFIX PEAK_Device_GetNumDataStreams(m_backendHandle, _numDataStreams);
312  });
313 
314  std::vector<std::shared_ptr<DataStreamDescriptor>> dataStreams;
315  for (size_t x = 0; x < numDataStreams; ++x)
316  {
317  auto dataStreamDescriptorHandle = QueryNumericFromCInterfaceFunction<PEAK_DATA_STREAM_DESCRIPTOR_HANDLE>(
318  [&](PEAK_DATA_STREAM_DESCRIPTOR_HANDLE* _dataStreamDescriptorHandle) {
320  m_backendHandle, x, _dataStreamDescriptorHandle);
321  });
322 
323  dataStreams.emplace_back(std::make_shared<ClassCreator<DataStreamDescriptor>>(
324  dataStreamDescriptorHandle, std::const_pointer_cast<Device>(shared_from_this())));
325  }
326 
327  m_dataStreams = dataStreams;
328 
329  // init remote device
330  auto remoteDeviceHandle = QueryNumericFromCInterfaceFunction<PEAK_REMOTE_DEVICE_HANDLE>(
331  [&](PEAK_REMOTE_DEVICE_HANDLE* _remoteDeviceHandle) {
332  return PEAK_C_ABI_PREFIX PEAK_Device_GetRemoteDevice(m_backendHandle, _remoteDeviceHandle);
333  });
334 
335  m_remoteDevice = std::make_shared<ClassCreator<peak::core::RemoteDevice>>(
336  remoteDeviceHandle, std::const_pointer_cast<Device>(shared_from_this()));
337 }
338 
339 } /* namespace core */
340 } /* namespace peak */
PEAK_C_API PEAK_Device_GetDisplayName(PEAK_DEVICE_HANDLE deviceHandle, char *displayName, size_t *displayNameSize)
Asks the given device for its display name.
PEAK_C_API PEAK_Device_GetAccessStatus(PEAK_DEVICE_HANDLE deviceHandle, PEAK_DEVICE_ACCESS_STATUS *accessStatus)
Asks the given device for its access status.
PEAK_C_API PEAK_Device_ToModule(PEAK_DEVICE_HANDLE deviceHandle, PEAK_MODULE_HANDLE *moduleHandle)
Casts the given device to a module.
PEAK_C_API PEAK_Device_GetModelName(PEAK_DEVICE_HANDLE deviceHandle, char *modelName, size_t *modelNameSize)
Asks the given device for its model name.
std::string UserDefinedName() const
Returns the user defined name.
Definition: peak_device.hpp:235
std::string ModelName() const
Returns the model name.
Definition: peak_device.hpp:214
PEAK_C_API PEAK_Device_GetKey(PEAK_DEVICE_HANDLE deviceHandle, char *key, size_t *keySize)
Asks the given device for its key.
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition: peak_dynamic_loader.h:32
struct PEAK_EVENT_SUPPORTING_MODULE * PEAK_EVENT_SUPPORTING_MODULE_HANDLE
Definition: peak_backend.h:459
DeviceAccessStatus AccessStatus() const
Returns the access status.
Definition: peak_device.hpp:250
PEAK_C_API PEAK_Device_GetInfo(PEAK_DEVICE_HANDLE deviceHandle, int32_t infoCommand, int32_t *infoDataType, uint8_t *info, size_t *infoSize)
Asks the given device for an information based on a specific command.
PEAK_C_API PEAK_Device_GetUserDefinedName(PEAK_DEVICE_HANDLE deviceHandle, char *userDefinedName, size_t *userDefinedNameSize)
Asks the given device for its user-defined name.
DeviceAccessStatus
Current accessibility of the device.
Definition: peak_common_device_enums.hpp:24
~Device() override
Definition: peak_device.hpp:176
PEAK_C_API PEAK_Device_GetVersion(PEAK_DEVICE_HANDLE deviceHandle, char *version, size_t *versionSize)
Asks the given device for its version.
std::string ID() const
Returns the ID.
Definition: peak_device.hpp:193
std::string Key() const
Returns the unique key.
Definition: peak_device.hpp:181
Represents a GenTL Device module, i.e. a local virtual Device proxy for the actual hardware RemoteDev...
Definition: peak_device.hpp:52
PEAK_C_API PEAK_Device_GetRemoteDevice(PEAK_DEVICE_HANDLE deviceHandle, PEAK_REMOTE_DEVICE_HANDLE *remoteDeviceHandle)
Asks the given device for its remote device.
std::string Version() const
Returns the version.
Definition: peak_device.hpp:221
struct PEAK_REMOTE_DEVICE * PEAK_REMOTE_DEVICE_HANDLE
Definition: peak_backend.h:375
PEAK_C_API PEAK_Device_Destruct(PEAK_DEVICE_HANDLE deviceHandle)
Delete the given device.
std::string DisplayName() const
Returns the display name.
Definition: peak_device.hpp:200
PEAK_C_API PEAK_Device_GetID(PEAK_DEVICE_HANDLE deviceHandle, char *id, size_t *idSize)
Asks the given device for its ID.
PEAK_C_API PEAK_Device_GetNumDataStreams(PEAK_DEVICE_HANDLE deviceHandle, size_t *numDataStreams)
Asks the given device for its number of data streams.
std::string TLType() const
Returns the TL (transport layer) type.
Definition: peak_device.hpp:228
PEAK_C_API PEAK_Device_GetSerialNumber(PEAK_DEVICE_HANDLE deviceHandle, char *serialNumber, size_t *serialNumberSize)
Asks the given device for its serial number.
PEAK_C_API PEAK_Device_GetTimestampTickFrequency(PEAK_DEVICE_HANDLE deviceHandle, uint64_t *timestampTickFrequency)
Asks the given device for its timestamp tick frequency.
std::string SerialNumber() const
Returns the serial number.
Definition: peak_device.hpp:243
std::shared_ptr< class RemoteDevice > RemoteDevice() const
Returns the remote device of the device.
Definition: peak_device.hpp:265
std::shared_ptr< Interface > ParentInterface() const
Returns the parent interface.
Definition: peak_device.hpp:279
#define PEAK_C_ABI_PREFIX
Definition: peak_dll_defines.h:16
std::string VendorName() const
Returns the vendor name.
Definition: peak_device.hpp:207
int32_t PEAK_DEVICE_ACCESS_STATUS
Definition: peak_backend.h:117
uint64_t TimestampTickFrequency() const
Returns the timestamp tick frequency.
Definition: peak_device.hpp:258
PEAK_C_API PEAK_Device_ToEventSupportingModule(PEAK_DEVICE_HANDLE deviceHandle, PEAK_EVENT_SUPPORTING_MODULE_HANDLE *eventSupportingModuleHandle)
Casts the given device to an event-supporting module.
PEAK_C_API PEAK_Device_GetTLType(PEAK_DEVICE_HANDLE deviceHandle, char *tlType, size_t *tlTypeSize)
Asks the given device for its TL type.
The struct returned by all raw information functions.
Definition: peak_common_structs.hpp:24
PEAK_DEVICE_HANDLE Handle() const
Get the backend handle.
Definition: peak_device.hpp:137
std::vector< std::shared_ptr< DataStreamDescriptor > > DataStreams() const
Returns the data stream list of the device.
Definition: peak_device.hpp:272
struct PEAK_MODULE * PEAK_MODULE_HANDLE
Definition: peak_backend.h:403
PEAK_C_API PEAK_Device_GetDataStream(PEAK_DEVICE_HANDLE deviceHandle, size_t index, PEAK_DATA_STREAM_DESCRIPTOR_HANDLE *dataStreamDescriptorHandle)
Asks the given device for the data stream descriptor with the given index.
struct PEAK_DEVICE * PEAK_DEVICE_HANDLE
Definition: peak_backend.h:371
PEAK_C_API PEAK_Device_GetVendorName(PEAK_DEVICE_HANDLE deviceHandle, char *vendorName, size_t *vendorNameSize)
Asks the given device for its vendor name.
struct PEAK_DATA_STREAM_DESCRIPTOR * PEAK_DATA_STREAM_DESCRIPTOR_HANDLE
Definition: peak_backend.h:379
RawInformation Info(int32_t infoCommand) const
Delivers information based on the given GenTL info command.
Definition: peak_device.hpp:186
The base class for all modules being able to raise events.
Definition: peak_event_supporting_module.hpp:33
Device & operator=(const Device &other)=delete