DeviceSpecificInstantCamera.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. //-----------------------------------------------------------------------------
  2. // Basler pylon SDK
  3. // Copyright (c) 2010-2021 Basler AG
  4. // http://www.baslerweb.com
  5. // Author: Andreas Gau
  6. //-----------------------------------------------------------------------------
  7. /*!
  8. \file
  9. \brief Template for device specific instant camera class.
  10. */
  11. #ifndef INCLUDED_DEVICESPECIFICINSTANTCAMERA_H_4510266
  12. #define INCLUDED_DEVICESPECIFICINSTANTCAMERA_H_4510266
  13. #include <pylon/stdinclude.h>
  14. #include <pylon/InstantCamera.h>
  15. #include <pylon/private/DeviceSpecificConfigurationEventHandlerTie.h>
  16. #include <pylon/private/DeviceSpecificImageEventHandlerTie.h>
  17. #include <pylon/private/DeviceSpecificCameraEventHandlerTie.h>
  18. #include <pylon/Platform.h>
  19. //! Macro for defining a custom instant camera class.
  20. #define PYLON_DEFINE_INSTANT_CAMERA(ClassName, BaseClass) \
  21. PYLON_6_0_DEPRECATED("Use CBaslerUniversalInstantCamera") \
  22. class ClassName : public BaseClass \
  23. { \
  24. public: \
  25. /*! \copybrief CInstantCamera::CInstantCamera()
  26. \copydetails CInstantCamera::CInstantCamera()
  27. */ \
  28. ClassName() \
  29. { \
  30. } \
  31. /*! \copybrief CInstantCamera::CInstantCamera( IPylonDevice* , ECleanup )
  32. \copydetails CInstantCamera::CInstantCamera( IPylonDevice* , ECleanup )
  33. */ \
  34. ClassName( IPylonDevice* pDevice, ECleanup cleanupProcedure = Cleanup_Delete ) : BaseClass( pDevice, cleanupProcedure ) \
  35. { \
  36. } \
  37. /*! \copybrief CInstantCamera::~CInstantCamera
  38. \copydetails CInstantCamera::~CInstantCamera
  39. */ \
  40. ~ClassName() \
  41. { \
  42. Attach( NULL ); \
  43. InternalShutdownEventHandlers(); \
  44. } \
  45. protected: \
  46. /* Create device specific grab result data. This is subject to change without notice */ \
  47. virtual CGrabResultData* CreateDeviceSpecificGrabResultData() \
  48. { \
  49. return new GrabResultData_t(); \
  50. } \
  51. };
  52. namespace Pylon
  53. {
  54. /*!
  55. \class CDeviceSpecificInstantCameraT
  56. \brief Implementation Detail: Header only implementation class for creating device specific Instant Camera classes.
  57. */
  58. template <typename CameraTraitsT>
  59. class CDeviceSpecificInstantCameraT : public CInstantCamera, public CameraTraitsT::CameraParams_t, public CameraTraitsT
  60. {
  61. public:
  62. /*!
  63. \copybrief Pylon::CInstantCamera::CInstantCamera()
  64. \copydetails Pylon::CInstantCamera::CInstantCamera()
  65. */
  66. CDeviceSpecificInstantCameraT();
  67. /*!
  68. \copybrief Pylon::CInstantCamera::CInstantCamera( IPylonDevice* , ECleanup )
  69. \copydetails Pylon::CInstantCamera::CInstantCamera( IPylonDevice* , ECleanup )
  70. */
  71. CDeviceSpecificInstantCameraT( IPylonDevice* pDevice, ECleanup cleanupProcedure = Cleanup_Delete );
  72. /*!
  73. \copybrief Pylon::CInstantCamera::~CInstantCamera()
  74. \copydetails Pylon::CInstantCamera::~CInstantCamera()
  75. */
  76. virtual ~CDeviceSpecificInstantCameraT();
  77. /*
  78. \copybrief Pylon::CInstantCamera::Attach
  79. \copydetails Pylon::CInstantCamera::Attach
  80. */
  81. virtual void Attach( IPylonDevice* pDevice, ECleanup cleanupProcedure = Cleanup_Delete );
  82. /*
  83. \copybrief Pylon::CInstantCamera::DestroyDevice
  84. \copydetails Pylon::CInstantCamera::DestroyDevice
  85. */
  86. virtual void DestroyDevice();
  87. /*
  88. \copybrief Pylon::CInstantCamera::DetachDevice
  89. \copydetails Pylon::CInstantCamera::DetachDevice
  90. */
  91. virtual IPylonDevice* DetachDevice();
  92. /*
  93. \copybrief Pylon::CInstantCamera::Open
  94. \copydetails Pylon::CInstantCamera::Open
  95. */
  96. virtual void Open();
  97. /*
  98. \copybrief Pylon::CInstantCamera::Close
  99. \copydetails Pylon::CInstantCamera::Close
  100. */
  101. virtual void Close();
  102. /*!
  103. \copybrief Pylon::CInstantCamera::RetrieveResult
  104. \copydetails Pylon::CInstantCamera::RetrieveResult
  105. */
  106. virtual bool RetrieveResult( unsigned int timeoutMs, typename CameraTraitsT::GrabResultPtr_t& grabResult, ETimeoutHandling timeoutHandling = TimeoutHandling_ThrowException );
  107. // Also available
  108. using CInstantCamera::RetrieveResult;
  109. /*!
  110. \copybrief Pylon::CInstantCamera::GrabOne
  111. \copydetails Pylon::CInstantCamera::GrabOne
  112. */
  113. virtual bool GrabOne( unsigned int timeoutMs, typename CameraTraitsT::GrabResultPtr_t& grabResult, ETimeoutHandling timeoutHandling = TimeoutHandling_ThrowException );
  114. // Also available
  115. using CInstantCamera::GrabOne;
  116. /*!
  117. \copybrief Pylon::CInstantCamera::RegisterConfiguration( CConfigurationEventHandler*, ERegistrationMode, ECleanup)
  118. \copydetails Pylon::CInstantCamera::RegisterConfiguration( CConfigurationEventHandler*, ERegistrationMode, ECleanup)
  119. */
  120. virtual void RegisterConfiguration( typename CameraTraitsT::ConfigurationEventHandler_t* pConfigurator, ERegistrationMode mode, ECleanup cleanupProcedure );
  121. // Also available
  122. using CInstantCamera::RegisterConfiguration;
  123. /*!
  124. \copybrief Pylon::CInstantCamera::DeregisterConfiguration( CConfigurationEventHandler*)
  125. \copydetails Pylon::CInstantCamera::DeregisterConfiguration( CConfigurationEventHandler*)
  126. */
  127. virtual bool DeregisterConfiguration( typename CameraTraitsT::ConfigurationEventHandler_t* configurator );
  128. // Also available
  129. using CInstantCamera::DeregisterConfiguration;
  130. /*!
  131. \copybrief Pylon::CInstantCamera::RegisterImageEventHandler( CImageEventHandler*, ERegistrationMode, ECleanup)
  132. \copydetails Pylon::CInstantCamera::RegisterImageEventHandler( CImageEventHandler*, ERegistrationMode, ECleanup)
  133. */
  134. virtual void RegisterImageEventHandler( typename CameraTraitsT::ImageEventHandler_t* pImageEventHandler, ERegistrationMode mode, ECleanup cleanupProcedure );
  135. // Also available
  136. using CInstantCamera::RegisterImageEventHandler;
  137. /*!
  138. \copybrief Pylon::CInstantCamera::DeregisterImageEventHandler( CImageEventHandler*)
  139. \copydetails Pylon::CInstantCamera::DeregisterImageEventHandler( CImageEventHandler*)
  140. */
  141. virtual bool DeregisterImageEventHandler( typename CameraTraitsT::ImageEventHandler_t* imageEventHandler );
  142. // Also available
  143. using CInstantCamera::DeregisterImageEventHandler;
  144. /*!
  145. \copybrief Pylon::CInstantCamera::RegisterCameraEventHandler( CCameraEventHandler*, const String_t&, intptr_t, ERegistrationMode, ECleanup, ECameraEventAvailability)
  146. \copydetails Pylon::CInstantCamera::RegisterCameraEventHandler( CCameraEventHandler*, const String_t&, intptr_t, ERegistrationMode, ECleanup, ECameraEventAvailability)
  147. */
  148. virtual void RegisterCameraEventHandler( typename CameraTraitsT::CameraEventHandler_t* pCameraEventHandler, const String_t& nodeName, intptr_t userProvidedId, ERegistrationMode mode, ECleanup cleanupProcedure, ECameraEventAvailability availability = CameraEventAvailability_Mandatory );
  149. // Also available
  150. using CInstantCamera::RegisterCameraEventHandler;
  151. /*!
  152. \copybrief Pylon::CInstantCamera::DeregisterCameraEventHandler( CCameraEventHandler*, const String_t&)
  153. \copydetails Pylon::CInstantCamera::DeregisterCameraEventHandler( CCameraEventHandler*, const String_t&)
  154. */
  155. virtual bool DeregisterCameraEventHandler( typename CameraTraitsT::CameraEventHandler_t* cameraEventHandler, const String_t& nodeName );
  156. // Also available
  157. using CInstantCamera::DeregisterCameraEventHandler;
  158. /*!
  159. \copybrief Pylon::CInstantCamera::GetDeviceInfo
  160. \copydetails Pylon::CInstantCamera::GetDeviceInfo
  161. */
  162. virtual const typename CameraTraitsT::DeviceInfo_t& GetDeviceInfo() const;
  163. /*!
  164. \brief Provides access to the transport layer parameters of the attached %Pylon Device.
  165. \return Reference to the transport layer parameters.
  166. \pre A %Pylon Device is attached.
  167. \error
  168. The Instant Camera object is still valid after error.
  169. \threading
  170. This method is synchronized using the lock provided by GetLock().
  171. */
  172. virtual typename CameraTraitsT::TlParams_t& GetTLParams();
  173. /*!
  174. \brief Provides access to the stream grabber parameters of the attached %Pylon Device.
  175. \return Reference to the stream grabber parameters.
  176. \pre
  177. <ul>
  178. <li> A %Pylon Device is attached.
  179. <li> The %Pylon Device is open.
  180. </ul>
  181. \error
  182. The Instant Camera object is still valid after error.
  183. \threading
  184. This method is synchronized using the lock provided by GetLock().
  185. */
  186. virtual typename CameraTraitsT::StreamGrabberParams_t& GetStreamGrabberParams();
  187. /*!
  188. \brief Provides access to the event grabber parameters of the attached %Pylon Device.
  189. \return Reference to the event grabber parameters.
  190. \pre
  191. <ul>
  192. <li> A %Pylon Device is attached.
  193. <li> The %Pylon Device is open.
  194. </ul>
  195. \error
  196. The Instant Camera object is still valid after error.
  197. \threading
  198. This method is synchronized using the lock provided by GetLock().
  199. */
  200. virtual typename CameraTraitsT::EventGrabberParams_t& GetEventGrabberParams();
  201. // Types used by camera--------------------------------------------------
  202. // Overload CInstantCamera type definitions
  203. typedef typename CameraTraitsT::InstantCamera_t InstantCamera_t;
  204. typedef typename CameraTraitsT::IPylonDevice_t IPylonDevice_t;
  205. typedef typename CameraTraitsT::DeviceInfo_t DeviceInfo_t;
  206. typedef typename CameraTraitsT::ConfigurationEventHandler_t ConfigurationEventHandler_t;
  207. typedef typename CameraTraitsT::ImageEventHandler_t ImageEventHandler_t;
  208. typedef typename CameraTraitsT::CameraEventHandler_t CameraEventHandler_t;
  209. typedef typename CameraTraitsT::GrabResultData_t GrabResultData_t;
  210. typedef typename CameraTraitsT::GrabResultPtr_t GrabResultPtr_t;
  211. protected:
  212. typename CameraTraitsT::TlParams_t* m_pTlParams;
  213. typename CameraTraitsT::StreamGrabberParams_t* m_pStreamGrabberParams;
  214. typename CameraTraitsT::EventGrabberParams_t* m_pEventGrabberParams;
  215. };
  216. // Implementation ----------------------------------------------------------
  217. template <typename CameraTraitsT>
  218. CDeviceSpecificInstantCameraT<CameraTraitsT>::CDeviceSpecificInstantCameraT()
  219. : m_pTlParams( new typename CameraTraitsT::TlParams_t() )
  220. , m_pStreamGrabberParams( new typename CameraTraitsT::StreamGrabberParams_t() )
  221. , m_pEventGrabberParams( new typename CameraTraitsT::EventGrabberParams_t() )
  222. {
  223. }
  224. template <typename CameraTraitsT>
  225. CDeviceSpecificInstantCameraT<CameraTraitsT>::CDeviceSpecificInstantCameraT( IPylonDevice* pDevice, ECleanup cleanupProcedure )
  226. : m_pTlParams( new typename CameraTraitsT::TlParams_t() )
  227. , m_pStreamGrabberParams( new typename CameraTraitsT::StreamGrabberParams_t() )
  228. , m_pEventGrabberParams( new typename CameraTraitsT::EventGrabberParams_t() )
  229. {
  230. this->Attach( pDevice, cleanupProcedure );
  231. }
  232. template <typename CameraTraitsT>
  233. CDeviceSpecificInstantCameraT<CameraTraitsT>::~CDeviceSpecificInstantCameraT()
  234. {
  235. delete m_pTlParams;
  236. m_pTlParams = NULL;
  237. delete m_pStreamGrabberParams;
  238. m_pStreamGrabberParams = NULL;
  239. delete m_pEventGrabberParams;
  240. m_pEventGrabberParams = NULL;
  241. }
  242. template <typename CameraTraitsT>
  243. void CDeviceSpecificInstantCameraT<CameraTraitsT>::Attach( IPylonDevice* pDevice, ECleanup cleanupProcedure )
  244. {
  245. // Check whether device type matches camera type.
  246. if (pDevice)
  247. {
  248. if ( (dynamic_cast<typename CameraTraitsT::IPylonDevice_t*>(pDevice) == NULL)
  249. || (this->HasSpecificDeviceClass() && (pDevice->GetDeviceInfo().GetDeviceClass() != this->DeviceClass()))
  250. )
  251. {
  252. throw LOGICAL_ERROR_EXCEPTION( "The attached pylon device type cannot be used with this type of camera class." );
  253. }
  254. }
  255. AutoLock lock( CInstantCamera::GetLock() );
  256. // Attach the device.
  257. CInstantCamera::Attach( pDevice, cleanupProcedure );
  258. // Update camera parameters.
  259. if (CInstantCamera::IsPylonDeviceAttached())
  260. {
  261. // Set camera parameters.
  262. CameraTraitsT::CameraParams_t::_Initialize( pDevice->GetNodeMap() );
  263. // Set TL parameters.
  264. m_pTlParams->Attach( &CInstantCamera::GetTLNodeMap(), true );
  265. }
  266. else
  267. {
  268. // Reset camera parameters.
  269. CameraTraitsT::CameraParams_t::_Initialize( &CInstantCamera::GetEmptyNodeMap() );
  270. // Reset TL parameters.
  271. m_pTlParams->Attach( &CInstantCamera::GetEmptyNodeMap(), true );
  272. }
  273. }
  274. template <typename CameraTraitsT>
  275. void CDeviceSpecificInstantCameraT<CameraTraitsT>::DestroyDevice()
  276. {
  277. AutoLock lock( CInstantCamera::GetLock() );
  278. // If a device is attached
  279. if (CInstantCamera::IsPylonDeviceAttached())
  280. {
  281. // Reset camera parameters.
  282. CameraTraitsT::CameraParams_t::_Initialize( &CInstantCamera::GetEmptyNodeMap() );
  283. // Reset TL parameters.
  284. m_pTlParams->Attach( &CInstantCamera::GetEmptyNodeMap(), true );
  285. // Perform destroy operation.
  286. CInstantCamera::DestroyDevice();
  287. }
  288. }
  289. template <typename CameraTraitsT>
  290. IPylonDevice* CDeviceSpecificInstantCameraT<CameraTraitsT>::DetachDevice()
  291. {
  292. AutoLock lock( CInstantCamera::GetLock() );
  293. IPylonDevice* pDevice = NULL;
  294. // If a device is attached
  295. if (CInstantCamera::IsPylonDeviceAttached())
  296. {
  297. // Reset camera parameters.
  298. CameraTraitsT::CameraParams_t::_Initialize( &CInstantCamera::GetEmptyNodeMap() );
  299. // Reset TL parameters.
  300. m_pTlParams->Attach( &CInstantCamera::GetEmptyNodeMap(), true );
  301. // Perform detach operation.
  302. pDevice = CInstantCamera::DetachDevice();
  303. }
  304. return pDevice;
  305. }
  306. template <typename CameraTraitsT>
  307. void CDeviceSpecificInstantCameraT<CameraTraitsT>::Open()
  308. {
  309. AutoLock lock( CInstantCamera::GetLock() );
  310. // Perform open operation.
  311. CInstantCamera::Open();
  312. // Set stream grabber parameters.
  313. m_pStreamGrabberParams->Attach( &CInstantCamera::GetStreamGrabberNodeMap(), true );
  314. // Set event grabber parameters.
  315. m_pEventGrabberParams->Attach( &CInstantCamera::GetEventGrabberNodeMap(), true );
  316. }
  317. template <typename CameraTraitsT>
  318. void CDeviceSpecificInstantCameraT<CameraTraitsT>::Close()
  319. {
  320. AutoLock lock( CInstantCamera::GetLock() );
  321. // Reset stream grabber parameters.
  322. m_pStreamGrabberParams->Attach( &CInstantCamera::GetEmptyNodeMap(), true );
  323. // Reset event grabber parameters.
  324. m_pEventGrabberParams->Attach( &CInstantCamera::GetEmptyNodeMap(), true );
  325. // Perform close operation.
  326. CInstantCamera::Close();
  327. }
  328. template <typename CameraTraitsT>
  329. bool CDeviceSpecificInstantCameraT<CameraTraitsT>::RetrieveResult( unsigned int timeoutMs, typename CameraTraitsT::GrabResultPtr_t& grabResult, ETimeoutHandling timeoutHandling )
  330. {
  331. //Release the grab result
  332. grabResult.Release();
  333. // Use basic grab result.
  334. CGrabResultPtr grabResultLocal;
  335. // Call basic RetrieveResult.
  336. CInstantCamera::RetrieveResult( timeoutMs, grabResultLocal, timeoutHandling );
  337. // Convert.
  338. grabResult = grabResultLocal;
  339. // Returns true if grabResultLocal is valid and the conversion to the device specific grab result type has been successful.
  340. return grabResult.IsValid();
  341. }
  342. template <typename CameraTraitsT>
  343. bool CDeviceSpecificInstantCameraT<CameraTraitsT>::GrabOne( unsigned int timeoutMs, typename CameraTraitsT::GrabResultPtr_t& grabResult, ETimeoutHandling timeoutHandling )
  344. {
  345. //Release the grab result
  346. grabResult.Release();
  347. // Use basic grab result.
  348. CGrabResultPtr grabResultLocal;
  349. // Call basic GrabOne.
  350. CInstantCamera::GrabOne( timeoutMs, grabResultLocal, timeoutHandling );
  351. // Convert.
  352. grabResult = grabResultLocal;
  353. // Returns true if grabResultLocal is valid and the conversion to the device specific grab result type has been successful.
  354. return grabResult.IsValid();
  355. }
  356. template <typename CameraTraitsT>
  357. void CDeviceSpecificInstantCameraT<CameraTraitsT>::RegisterConfiguration( typename CameraTraitsT::ConfigurationEventHandler_t* pConfigurator, ERegistrationMode mode, ECleanup cleanupProcedure )
  358. {
  359. typedef CDeviceSpecificConfigurationEventHandlerTie< typename CameraTraitsT::InstantCamera_t, typename CameraTraitsT::ConfigurationEventHandler_t> TieT;
  360. InternalRegisterConfiguration(
  361. pConfigurator ? new TieT( pConfigurator, cleanupProcedure == Cleanup_Delete ) : NULL,
  362. mode,
  363. Cleanup_Delete, // demand deletion of TieT
  364. pConfigurator ? &pConfigurator->DebugGetEventHandlerRegistrationCount() : NULL );
  365. }
  366. template <typename CameraTraitsT>
  367. bool CDeviceSpecificInstantCameraT<CameraTraitsT>::DeregisterConfiguration( typename CameraTraitsT::ConfigurationEventHandler_t* pConfigurator )
  368. {
  369. return InternalDeregisterConfiguration( pConfigurator ? &pConfigurator->DebugGetEventHandlerRegistrationCount() : NULL );
  370. }
  371. template <typename CameraTraitsT>
  372. void CDeviceSpecificInstantCameraT<CameraTraitsT>::RegisterImageEventHandler( typename CameraTraitsT::ImageEventHandler_t* pImageEventHandler, ERegistrationMode mode, ECleanup cleanupProcedure )
  373. {
  374. typedef CDeviceSpecificImageEventHandlerTie< typename CameraTraitsT::InstantCamera_t, typename CameraTraitsT::ImageEventHandler_t> TieT;
  375. InternalRegisterImageEventHandler(
  376. pImageEventHandler ? new TieT( pImageEventHandler, cleanupProcedure == Cleanup_Delete ) : NULL,
  377. mode,
  378. Cleanup_Delete, // demand deletion of TieT
  379. pImageEventHandler ? &pImageEventHandler->DebugGetEventHandlerRegistrationCount() : NULL );
  380. }
  381. template <typename CameraTraitsT>
  382. bool CDeviceSpecificInstantCameraT<CameraTraitsT>::DeregisterImageEventHandler( typename CameraTraitsT::ImageEventHandler_t* pImageEventHandler )
  383. {
  384. return InternalDeregisterImageEventHandler( pImageEventHandler ? &pImageEventHandler->DebugGetEventHandlerRegistrationCount() : NULL );
  385. }
  386. template <typename CameraTraitsT>
  387. void CDeviceSpecificInstantCameraT<CameraTraitsT>::RegisterCameraEventHandler(
  388. typename CameraTraitsT::CameraEventHandler_t* pCameraEventHandler,
  389. const String_t& nodeName,
  390. intptr_t userProvidedId,
  391. ERegistrationMode mode,
  392. ECleanup cleanupProcedure,
  393. ECameraEventAvailability availability )
  394. {
  395. typedef CDeviceSpecificCameraEventHandlerTie< typename CameraTraitsT::InstantCamera_t, typename CameraTraitsT::CameraEventHandler_t> TieT;
  396. InternalRegisterCameraEventHandler(
  397. pCameraEventHandler ? new TieT( pCameraEventHandler, cleanupProcedure == Cleanup_Delete ) : NULL,
  398. nodeName, userProvidedId, mode,
  399. Cleanup_Delete, // demand deletion of TieT
  400. availability,
  401. pCameraEventHandler ? &pCameraEventHandler->DebugGetEventHandlerRegistrationCount() : NULL );
  402. }
  403. template <typename CameraTraitsT>
  404. bool CDeviceSpecificInstantCameraT<CameraTraitsT>::DeregisterCameraEventHandler( typename CameraTraitsT::CameraEventHandler_t* pCameraEventHandler, const String_t& nodeName )
  405. {
  406. return InternalDeregisterCameraEventHandler( pCameraEventHandler ? &pCameraEventHandler->DebugGetEventHandlerRegistrationCount() : NULL, nodeName );
  407. }
  408. template <typename CameraTraitsT>
  409. const typename CameraTraitsT::DeviceInfo_t& CDeviceSpecificInstantCameraT<CameraTraitsT>::GetDeviceInfo() const
  410. {
  411. return static_cast<const typename CameraTraitsT::DeviceInfo_t&>(CInstantCamera::GetDeviceInfo());
  412. }
  413. template <typename CameraTraitsT>
  414. typename CameraTraitsT::TlParams_t& CDeviceSpecificInstantCameraT<CameraTraitsT>::GetTLParams()
  415. {
  416. AutoLock lock( CInstantCamera::GetLock() );
  417. // Enforce preconditions.
  418. CInstantCamera::GetTLNodeMap();
  419. return *m_pTlParams;
  420. }
  421. template <typename CameraTraitsT>
  422. typename CameraTraitsT::StreamGrabberParams_t& CDeviceSpecificInstantCameraT<CameraTraitsT>::GetStreamGrabberParams()
  423. {
  424. AutoLock lock( CInstantCamera::GetLock() );
  425. // Enforce preconditions.
  426. CInstantCamera::GetStreamGrabberNodeMap();
  427. return *m_pStreamGrabberParams;
  428. }
  429. template <typename CameraTraitsT>
  430. typename CameraTraitsT::EventGrabberParams_t& CDeviceSpecificInstantCameraT<CameraTraitsT>::GetEventGrabberParams()
  431. {
  432. AutoLock lock( CInstantCamera::GetLock() );
  433. // Enforce preconditions.
  434. CInstantCamera::GetEventGrabberNodeMap();
  435. return *m_pEventGrabberParams;
  436. }
  437. } // namespace Pylon
  438. #endif /* INCLUDED_DEVICESPECIFICINSTANTCAMERA_H_4510266 */