SapTransfer.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. #ifndef _SAPTRANSFER_H_
  2. #define _SAPTRANSFER_H_
  3. // SapTransfer.h : header file
  4. //
  5. #include "SapClassBasicDef.h"
  6. #include "SapPerformance.h"
  7. #include <cfloat>
  8. // Forward declarations
  9. class SAPCLASSBASIC_CLASS SapXferContextInfo;
  10. class SAPCLASSBASIC_CLASS SapTransfer;
  11. class SAPCLASSBASIC_CLASS SapXferCallbackInfo;
  12. #if !SAPERA_DOT_NET
  13. class SAPCLASSBASIC_CLASS SapXferMultiNode;
  14. #endif
  15. typedef void(*SapXferCallback)(SapXferCallbackInfo *);
  16. //
  17. // SapXferPair class declaration
  18. //
  19. class SAPCLASSBASIC_CLASS SapXferPair
  20. {
  21. public:
  22. // Transfer event types
  23. typedef int EventType; // For compatibility with old Sapera++ application code
  24. enum _EventType
  25. {
  26. EventNone = 0,
  27. EventStartOfField = CORXFER_VAL_EVENT_TYPE_START_OF_FIELD,
  28. EventStartOfOdd = CORXFER_VAL_EVENT_TYPE_START_OF_ODD,
  29. EventStartOfEven = CORXFER_VAL_EVENT_TYPE_START_OF_EVEN,
  30. EventStartOfFrame = CORXFER_VAL_EVENT_TYPE_START_OF_FRAME,
  31. EventEndOfField = CORXFER_VAL_EVENT_TYPE_END_OF_FIELD,
  32. EventEndOfOdd = CORXFER_VAL_EVENT_TYPE_END_OF_ODD,
  33. EventEndOfEven = CORXFER_VAL_EVENT_TYPE_END_OF_EVEN,
  34. EventEndOfFrame = CORXFER_VAL_EVENT_TYPE_END_OF_FRAME,
  35. EventEndOfLine = CORXFER_VAL_EVENT_TYPE_END_OF_LINE,
  36. EventEndOfNLines = CORXFER_VAL_EVENT_TYPE_END_OF_NLINES,
  37. EventEndOfTransfer = CORXFER_VAL_EVENT_TYPE_END_OF_TRANSFER,
  38. EventLineUnderrun = CORXFER_VAL_EVENT_TYPE_LINE_UNDERRUN,
  39. EventFieldUnderrun = CORXFER_VAL_EVENT_TYPE_FIELD_UNDERRUN,
  40. EventMask = CORXFER_VAL_EVENT_TYPE_MASK
  41. };
  42. // Transfer cycle modes
  43. typedef int CycleMode;
  44. enum _CycleMode
  45. {
  46. CycleUnknown = -1,
  47. CycleAsynchronous = CORXFER_VAL_CYCLE_MODE_ASYNCHRONOUS,
  48. CycleSynchronous = CORXFER_VAL_CYCLE_MODE_SYNCHRONOUS,
  49. CycleWithTrash = CORXFER_VAL_CYCLE_MODE_SYNCHRONOUS_WITH_TRASH,
  50. CycleOff = CORXFER_VAL_CYCLE_MODE_OFF,
  51. CycleNextEmpty = CORXFER_VAL_CYCLE_MODE_NEXT_EMPTY,
  52. CycleNextWithTrash = CORXFER_VAL_CYCLE_MODE_SYNCHRONOUS_NEXT_EMPTY_WITH_TRASH
  53. };
  54. //Xfer element
  55. typedef int XferElement;
  56. enum _XferElement
  57. {
  58. ElementPair = CORXFER_VAL_ELEMENT_PAIR,
  59. ElementGroup = CORXFER_VAL_ELEMENT_GROUP
  60. };
  61. // Flipping modes
  62. typedef int FlipMode;
  63. enum _FlipMode
  64. {
  65. FlipNone = CORXFER_VAL_FLIP_OFF,
  66. FlipHorizontal = CORXFER_VAL_FLIP_HORZ,
  67. FlipVertical = CORXFER_VAL_FLIP_VERT
  68. };
  69. // Event count source
  70. typedef int EventCountSource;
  71. enum _EventCountSource
  72. {
  73. EventCountNone = CORXFER_VAL_EVENT_COUNT_SOURCE_NONE,
  74. EventCountDst = CORXFER_VAL_EVENT_COUNT_SOURCE_DST,
  75. EventCountSrc = CORXFER_VAL_EVENT_COUNT_SOURCE_SRC
  76. };
  77. // Counter stamp time base
  78. typedef int CounterStampTimeBase;
  79. enum _CounterStampTimeBase
  80. {
  81. CounterStampMicroSec = CORXFER_VAL_TIME_BASE_US,
  82. CounterStampMilliSec = CORXFER_VAL_TIME_BASE_MS,
  83. CounterStampLine = CORXFER_VAL_TIME_BASE_LINE,
  84. CounterStampLineTrigger = CORXFER_VAL_TIME_BASE_LINE_TRIGGER,
  85. CounterStampFrame = CORXFER_VAL_TIME_BASE_FRAME,
  86. CounterStampExtFrameTrigger = CORXFER_VAL_TIME_BASE_EXT_FRAME_TRIGGER,
  87. CounterStampShaftEncoder = CORXFER_VAL_TIME_BASE_SHAFT_ENCODER
  88. };
  89. // Flat-field correction cycle modes
  90. typedef int FlatFieldCycleMode;
  91. enum _FlatFieldCycleMode
  92. {
  93. FlatFieldCycleOff = CORXFER_VAL_FLATFIELD_CYCLE_MODE_OFF,
  94. FlatFieldCycleAutomatic = CORXFER_VAL_FLATFIELD_CYCLE_MODE_AUTOMATIC,
  95. };
  96. // Dynamic LUT cycle modes
  97. typedef int DynamicLutCycleMode;
  98. enum _DynamicLutCycleMode
  99. {
  100. DynamicLutCycleOff = CORXFER_VAL_DYNAMIC_LUT_CYCLE_MODE_OFF,
  101. DynamicLutCycleAutomatic = CORXFER_VAL_DYNAMIC_LUT_CYCLE_MODE_AUTOMATIC,
  102. DynamicLutCycleManual = CORXFER_VAL_DYNAMIC_LUT_CYCLE_MODE_MANUAL,
  103. };
  104. // Various constants
  105. enum MiscValues
  106. {
  107. InvalidFramesOnBoard = -1
  108. };
  109. public:
  110. SapXferPair()
  111. { Construct(NULL, 0, NULL, 0, FALSE); }
  112. SapXferPair(SapXferNode *pSrc, SapXferNode *pDst, BOOL regCallback = TRUE)
  113. { Construct(pSrc, 0, pDst, 0, regCallback); }
  114. SapXferPair(SapXferNode *pSrc, int srcPort, SapXferNode *pDst, int dstPort, BOOL regCallback = TRUE)
  115. { Construct(pSrc, srcPort, pDst, dstPort, regCallback); }
  116. ~SapXferPair() {}
  117. SapXferNode *GetSrc() const { return m_pSrc; }
  118. int GetSrcPort() const { return m_SrcPort; }
  119. int GetSrcIndex() const { return m_SrcPort; }
  120. SapXferNode *GetDst() const { return m_pDst; }
  121. int GetDstPort() const { return m_DstPort; }
  122. BOOL IsRegCallback() const { return m_bRegCallback; }
  123. SapXferCallback GetCallback() const { return m_pCallback; }
  124. void *GetContext() const { return m_pContext; }
  125. SapXferCallback GetTrashCallback() const { return m_pTrashCallback; }
  126. void *GetTrashContext() const { return m_pTrashContext; }
  127. int GetFramesPerCallback() const { return m_FramesPerCallback; }
  128. int GetFramesOnBoard() const { return m_FramesOnBoard; }
  129. int GetRelativeBufferIndex() const { return m_RelativeBufferIndex; }
  130. int GetNbInputFrames() const { return m_NbInputFrames; }
  131. int GetNbOutputFrames() const { return m_NbOutputFrames; }
  132. EventType GetEventType() const { return m_EventType; }
  133. EventCountSource GetEventCountSource() const { return m_EventCountSource; }
  134. CycleMode GetCycleMode() const
  135. {
  136. CycleMode cycleMode = m_CycleMode;
  137. if (cycleMode == SapXferPair::CycleUnknown && GetDst() != NULL)
  138. {
  139. // Determine default mode if none was set by the application
  140. cycleMode = SapXferPair::CycleAsynchronous;
  141. if (GetDst()->GetTrash() != CORHANDLE_NULL)
  142. cycleMode = SapXferPair::CycleWithTrash;
  143. }
  144. return cycleMode;
  145. }
  146. FlipMode GetFlipMode() const
  147. { return m_FlipMode; }
  148. CounterStampTimeBase GetCounterStampTimeBase() const
  149. { return m_CounterStampTimeBase; }
  150. FlatFieldCycleMode GetFlatFieldCycleMode() const
  151. { return m_FlatFieldCycleMode; }
  152. DynamicLutCycleMode GetDynamicLutCycleMode() const
  153. { return m_DynamicLutCycleMode; }
  154. inline BOOL SetCallbackInfo(SapXferCallback pCallback, void *pContext);
  155. inline BOOL SetEventType(EventType eventType);
  156. inline BOOL SetEventCountSource(EventCountSource eventCountSource);
  157. inline BOOL SetCycleMode(CycleMode cycleMode);
  158. inline BOOL SetFlipMode(FlipMode flipMode);
  159. inline BOOL SetCounterStampTimeBase(CounterStampTimeBase counterStampTimeBase);
  160. inline BOOL SetFlatFieldCycleMode(FlatFieldCycleMode flatFieldCycleMode);
  161. inline BOOL SetDynamicLutCycleMode(DynamicLutCycleMode dynamicLutCycleMode);
  162. inline BOOL SetFramesPerCallback(int numFrames);
  163. inline BOOL SetFramesOnBoard(int numFrames);
  164. inline BOOL SetRelativeBufferIndex(int relativeBufferIndex);
  165. inline BOOL SetNbInputFrames(int nbInputFrames);
  166. inline BOOL SetNbOutputFrames(int nbOutputFrames);
  167. inline BOOL SetTrashCallbackInfo(SapXferCallback pCallback, void *pContext);
  168. void SetTransfer(SapTransfer *pXfer) { m_Xfer = pXfer; }
  169. void InternalSetFramesOnBoard(int numFrames) { m_FramesOnBoard = numFrames; }
  170. protected:
  171. // Utility methods
  172. inline void Construct(SapXferNode *pSrc, int srcPort, SapXferNode *pDst, int dstPort, BOOL regCallback);
  173. protected:
  174. // Source/destination node information
  175. SapXferNode* m_pSrc;
  176. int m_SrcPort;
  177. SapXferNode* m_pDst;
  178. int m_DstPort;
  179. // Callback information
  180. BOOL m_bRegCallback;
  181. SapXferCallback m_pCallback; // Overrides SapTransfer callback if specified
  182. void* m_pContext; // Relevant only if overriding SapTransfer callback
  183. SapXferCallback m_pTrashCallback; // Overrides SapTransfer callback if specified
  184. void* m_pTrashContext; // Relevant only if overriding SapTransfer callback
  185. // Transfer parameters
  186. EventType m_EventType; // Current transfer event type
  187. EventCountSource m_EventCountSource; // Current source of event count
  188. CycleMode m_CycleMode; // Current buffer cycle mode
  189. FlipMode m_FlipMode; // Current flipping mode
  190. CounterStampTimeBase m_CounterStampTimeBase; // Current counter-stamp time base
  191. FlatFieldCycleMode m_FlatFieldCycleMode; // Current flat_field cycle mode
  192. DynamicLutCycleMode m_DynamicLutCycleMode; // Current dynamic LUT cycle mode
  193. int m_FramesPerCallback; // Current number of frames per callback
  194. int m_FramesOnBoard; // Current number of onboard frames
  195. int m_RelativeBufferIndex;
  196. int m_NbInputFrames; //number of frames to multiply by.
  197. int m_NbOutputFrames; //number of frames to Divide by.
  198. SapTransfer* m_Xfer; // Reference to transfer object (to make parameter changes active)
  199. };
  200. //
  201. // SapXferPairInfo class declaration
  202. //
  203. class SAPCLASSBASIC_CLASS SapXferPairInfo
  204. {
  205. public:
  206. SapXferPairInfo()
  207. { m_Index = 0; m_pXfer = NULL; m_context = NULL; }
  208. SapXferPairInfo(SapXferPair &pair, int index, SapTransfer *pXfer)
  209. { m_Pair = pair; m_Pair.SetTransfer(pXfer); m_Index = index; m_pXfer = pXfer; m_context = NULL; }
  210. public:
  211. SapXferPair m_Pair; // Transfer pair
  212. int m_Index; // Index in the table
  213. SapTransfer* m_pXfer; // Corresponding transfer object
  214. SapXferContextInfo* m_context;
  215. int m_MaxSnapCount; // Maximum frame count for Snap
  216. SapXferPair::CycleMode m_CycleModeCap; // Cycle mode capability
  217. BOOL m_DynamicLutCap; // Availability of dynamic look-up tables
  218. };
  219. //
  220. // SapXferContextInfo class declaration
  221. //
  222. class SAPCLASSBASIC_CLASS SapXferContextInfo
  223. {
  224. public:
  225. SapXferContextInfo()
  226. { m_PairInfo= NULL; m_dstIndex= 0; }
  227. SapXferContextInfo(SapXferPairInfo *pPairInfo, int dstIndex)
  228. { m_PairInfo= pPairInfo; m_dstIndex= dstIndex;}
  229. public:
  230. SapXferPairInfo* m_PairInfo;
  231. int m_dstIndex;
  232. };
  233. //
  234. // SapXferCounterStampInfo class declaration
  235. //
  236. class SAPCLASSBASIC_CLASS SapXferCounterStampInfo
  237. {
  238. public:
  239. SapXferCounterStampInfo()
  240. {
  241. m_IsSupported = FALSE;
  242. m_IsAvailable = FALSE;
  243. m_MaxValue = 0;
  244. m_EventType = 0;
  245. m_TimeBase = SapXferPair::CounterStampMicroSec;
  246. }
  247. BOOL IsSupported() const { return m_IsSupported; }
  248. BOOL IsAvailable() const { return m_IsAvailable; }
  249. int GetMaxValue() const { return m_MaxValue; }
  250. SapXferPair::EventType GetEventType() const { return m_EventType; }
  251. SapXferPair::CounterStampTimeBase GetTimeBase() const { return m_TimeBase; }
  252. void SetSupported(BOOL isSupported) { m_IsSupported = isSupported; }
  253. void SetAvailable(BOOL isAvailable) { m_IsAvailable = isAvailable; }
  254. void SetMaxValue(int maxValue) { m_MaxValue = maxValue; }
  255. void SetEventType(SapXferPair::EventType eventType) { m_EventType = eventType; }
  256. void SetTimeBase(SapXferPair::CounterStampTimeBase timeBase) { m_TimeBase = timeBase; }
  257. protected:
  258. BOOL m_IsSupported;
  259. BOOL m_IsAvailable;
  260. int m_MaxValue;
  261. SapXferPair::EventType m_EventType;
  262. SapXferPair::CounterStampTimeBase m_TimeBase;
  263. };
  264. //
  265. // SapXferFrameRateInfo class declaration
  266. //
  267. class SAPCLASSBASIC_CLASS SapXferFrameRateInfo
  268. {
  269. public:
  270. SapXferFrameRateInfo();
  271. /// <summary>
  272. /// Check if frame rate calculated from buffer timestamps is available.
  273. /// </summary>
  274. BOOL IsBufferFrameRateAvailable() const { return m_BufferFrameRateEvaluated ? TRUE : FALSE; }
  275. /// <summary>
  276. /// Returns the frame rate calculated from buffer timestamps.
  277. /// </summary>
  278. /// <returns>the frame rate in frames/second</returns>
  279. /// <see cref="IsBufferFrameRateAvailable"/>
  280. float GetBufferFrameRate() const { return m_BufferFrameRate; }
  281. /// <summary>
  282. /// Returns the minimum time between 2 frames.
  283. /// </summary>
  284. /// <returns>a time in milli-seconds (ms)</returns>
  285. /// <see cref="IsBufferFrameRateAvailable"/>
  286. float GetMinTimePerFrame() const;
  287. /// <summary>
  288. /// Returns the maximum time between 2 frames.
  289. /// </summary>
  290. /// <returns>a time in milli-seconds (ms)</returns>
  291. /// <see cref="IsBufferFrameRateAvailable"/>
  292. float GetMaxTimePerFrame() const;
  293. /// <summary>
  294. /// Check if live frame rate from timer is available.
  295. /// </summary>
  296. BOOL IsLiveFrameRateAvailable() const { return m_LiveFrameRateEvaluated ? TRUE : FALSE; }
  297. /// <summary>
  298. /// When time base is not a physical measure of time,
  299. // like a shaft encoder for example,
  300. // we use performance timers from SapPerformance to APPROXIMATE
  301. // the real frame rate.
  302. /// </summary>
  303. float GetLiveFrameRate() const { return m_LiveFrameRate; }
  304. /// <summary>
  305. /// Check if live frame rate calculation is stalled.
  306. /// This will happen when no new frame has been received for quite
  307. /// some time now.
  308. /// </summary>
  309. BOOL IsLiveFrameRateStalled();
  310. /// <summary>
  311. /// Resets the internal values.
  312. /// Automatically called before starting a new transfer stream.
  313. /// </summary>
  314. void Reset();
  315. public:
  316. /* INTERNAL USE ONLY */
  317. void SetValues(float frameRate = 0.f, float timePerFrame = 0.f);
  318. void AccumulateFrames(int increment = 1);
  319. protected:
  320. /* for use with SetValues() */
  321. float m_BufferFrameRate;
  322. float m_MinTimePerFrameFromCounterStamp;
  323. float m_MaxTimePerFrameFromCounterStamp;
  324. bool m_BufferFrameRateEvaluated;
  325. /* for use with AccumulateFrames() */
  326. float m_LiveFrameRate;
  327. INT32 m_AccFrameCount;
  328. SapPerformance m_PerfMonitor;
  329. bool m_LiveFrameRateEvaluated;
  330. bool m_ForceReset;
  331. };
  332. //
  333. // SapTransfer class declaration
  334. //
  335. class SAPCLASSBASIC_CLASS SapTransfer : public SapManager
  336. {
  337. public:
  338. // Transfer start modes
  339. typedef int StartMode;
  340. enum _StartMode
  341. {
  342. StartAsynchronous = CORXFER_VAL_START_MODE_ASYNCHRONOUS,
  343. StartSynchronous = CORXFER_VAL_START_MODE_SYNCHRONOUS,
  344. StartHalfAsynchronous = CORXFER_VAL_START_MODE_HALF_ASYNCHRONOUS,
  345. StartSequential = CORXFER_VAL_START_MODE_SEQUENTIAL
  346. };
  347. // Various constants
  348. enum MiscValues
  349. {
  350. MaxPairs = 64,
  351. MaxMultiNode = 16
  352. };
  353. public:
  354. // Constructor/Destructor
  355. SapTransfer(SapXferCallback pCallback = NULL, void *pContext = NULL, SapLocation location = SapLocation::ServerUnknown);
  356. SapTransfer(SapXferCallback pCallback, SapXferCallback pTrashCallback, void *pContext, SapLocation location = SapLocation::ServerUnknown);
  357. SapTransfer(const SapTransfer &xfer);
  358. virtual ~SapTransfer();
  359. SapTransfer &operator= (const SapTransfer &xfer);
  360. public:
  361. // Creation/destruction
  362. virtual BOOL Create();
  363. virtual BOOL Destroy();
  364. virtual BOOL Connect();
  365. virtual BOOL Disconnect();
  366. // Access to implementation
  367. BOOL AddPair(SapXferPair &pair);
  368. BOOL RemoveAllPairs();
  369. SapXferPair *GetPair(int pairIndex);
  370. int GetNumPairs() const { return m_NumPairs; }
  371. const SapXferPairInfo *GetPairInfo() const { return m_Pairs; }
  372. const SapXferCounterStampInfo *GetCounterStampInfo(int pairIndex) const;
  373. virtual CORHANDLE GetHandle() const { return m_hXfer; }
  374. SapLocation GetLocation() const { return m_Location; }
  375. virtual SapXferCallback GetCallback() const { return m_pCallback; }
  376. virtual SapXferCallback GetTrashCallback() const { return m_pTrashCallback; }
  377. virtual void *GetContext() const { return m_pContext; }
  378. virtual BOOL IsGrabbing() const { return m_bGrab; }
  379. virtual BOOL IsAutoEmpty() const { return m_bAutoEmpty; }
  380. virtual BOOL IsAutoConnect() const { return m_bAutoConnect; }
  381. virtual BOOL IsConnected() const { return m_bConnected; }
  382. virtual StartMode GetStartMode() const { return m_StartMode; }
  383. virtual BOOL IsCycleModeAvailable(int pairIndex, SapXferPair::CycleMode cycleMode);
  384. virtual int GetConnectTimeout() const { return m_ConnectTimeout; }
  385. BOOL SetLocation(SapLocation location);
  386. virtual BOOL SetCallbackInfo(SapXferCallback pCallback, void *pContext = NULL);
  387. virtual BOOL SetTrashCallbackInfo(SapXferCallback pTrashCallback);
  388. virtual void SetAutoEmpty(BOOL bAutoEmpty);
  389. virtual void SetAutoConnect(BOOL bAutoConnect);
  390. virtual BOOL IsCapabilityValid(int cap);
  391. virtual BOOL IsParameterValid(int param);
  392. virtual BOOL GetCapability(int cap, void *pValue);
  393. virtual BOOL GetParameter(int param, void *pValue);
  394. virtual BOOL SetParameter(int param, int value);
  395. virtual BOOL SetParameter(int param, void *pValue);
  396. virtual BOOL Select(int pairIndex, int srcIndex = -1, int dstIndex = -1);
  397. virtual BOOL Select(SapXferPair* pPair, int srcIndex = -1, int dstIndex = -1);
  398. virtual BOOL SetStartMode(StartMode startMode);
  399. virtual BOOL SetConnectTimeout(int timeout);
  400. // Dynamic LUT management
  401. BOOL IsDynamicLutAvailable(int pairIndex = 0);
  402. // Frame rate statistics
  403. SapXferFrameRateInfo* GetFrameRateStatistics();
  404. virtual BOOL UpdateFrameRateStatistics();
  405. #if !SAPERA_DOT_NET
  406. //obosolete functions that are included for compatibility
  407. //with older applications.
  408. //Use the XferMultiNode functions instead
  409. BOOL AddRtProDesign(SapXferMultiNode *pRtProDesign) { return AddXferMultiNode(pRtProDesign); }
  410. BOOL RemoveRtProDesigns(SapXferMultiNode *pRtProDesign) { return RemoveXferMultiNode(pRtProDesign); }
  411. BOOL RemoveAllRtProDesigns() { return RemoveAllXferMultiNode(); }
  412. BOOL AddXferMultiNode(SapXferMultiNode *pXferMultiNode);
  413. BOOL RemoveXferMultiNode(SapXferMultiNode *pXferMultiNode);
  414. BOOL RemoveAllXferMultiNode();
  415. #endif
  416. // Utility methods
  417. virtual BOOL SetCallbackInfo(SapXferPair* pPair);
  418. virtual BOOL SetTrashCallbackInfo(SapXferPair* pPair);
  419. virtual BOOL SetEventType(SapXferPair* pPair);
  420. virtual BOOL SetEventCountSource(SapXferPair* pPair);
  421. virtual BOOL SetCycleMode(SapXferPair* pPair);
  422. virtual BOOL SetFlipMode(SapXferPair* pPair);
  423. virtual BOOL SetCounterStampTimeBase(SapXferPair* pPair);
  424. virtual BOOL SetFlatFieldCycleMode(SapXferPair* pPair);
  425. virtual BOOL SetDynamicLutCycleMode(SapXferPair* pPair);
  426. virtual BOOL SetFramesPerCallback(SapXferPair* pPair);
  427. virtual BOOL SetFramesOnBoard(SapXferPair* pPair);
  428. virtual BOOL SetRelativeBufferIndex(SapXferPair* pPair);
  429. virtual BOOL SetNbInputFrames(SapXferPair* pPair);
  430. virtual BOOL SetNbOutputFrames(SapXferPair* pPair);
  431. virtual BOOL RegisterCallback(SapXferPair::EventType eventType, SapXferCallback callback, void *context, UINT32 xferElement);
  432. virtual BOOL UnregisterCallback();
  433. virtual BOOL UpdateParameters(void);
  434. // Obsolete methods
  435. BOOL Add(SapXferPair &pair) { return AddPair(pair); }
  436. void RemoveAll() { RemoveAllPairs(); }
  437. public:
  438. // Transfer Control
  439. virtual BOOL Snap(int count = 1);
  440. virtual BOOL Grab();
  441. virtual BOOL Freeze();
  442. virtual BOOL Abort();
  443. virtual BOOL Wait(int timeout);
  444. virtual BOOL Init(BOOL resetIndex = TRUE);
  445. protected:
  446. // Utility methods
  447. void Construct(SapXferCallback pCallback, SapXferCallback pTrashCallback, void *pContext, SapLocation location, int numPairs, const SapXferPairInfo *pPairs, BOOL bAutoEmpty, BOOL bAutoConnect = TRUE);
  448. virtual BOOL SetStartMode();
  449. virtual BOOL XferIsCycleModeAvailable(SapXferPair* pPair, SapXferPair::CycleMode cycleMode);
  450. virtual BOOL CreatePair(int pairIndex);
  451. virtual BOOL DestroyPair(int pairIndex);
  452. virtual BOOL GetCapabilities(int pairIndex);
  453. virtual BOOL SetParameters(int pairIndex);
  454. virtual BOOL SetParameters(void);
  455. void GetIndexesFromSourceDest(SapXferPair* pPair, int* srcIndex, int* dstIndex);
  456. void SetSourceDestIndexes(SapXferPair* pPair, int srcIndex, int dstIndex);
  457. virtual BOOL FindPairIndex(SapXferPair* pPair, int* pIndex);
  458. // Callback functions
  459. static SAPSTATUS CCONV OnNormal(void *context, UINT32 eventType, UINT32 eventCount);
  460. static SAPSTATUS CCONV OnTrash(void *context, UINT32 eventType, UINT32 eventCount);
  461. static SAPSTATUS CCONV OnNormalEx(void *context, COREVENTINFO eventInfo);
  462. BOOL ExecuteCallback(void *context, UINT32 eventType, UINT32 eventCount, COREVENTINFO eventInfo);
  463. protected:
  464. // Parameters
  465. SapXferCallback m_pCallback; // Application callback function
  466. SapXferCallback m_pTrashCallback; // Application callback function for trash buffers
  467. void *m_pContext; // Application context
  468. SapLocation m_Location; // Transfer location
  469. SapXferPairInfo m_Pairs[MaxPairs]; // Table of transfer pairs
  470. int m_NumPairs; // Number of transfer pairs
  471. BOOL m_bAutoEmpty; // TRUE to automatically empty buffers
  472. BOOL m_bAutoConnect; // TRUE to automatically connect the transfer object to the hardware
  473. // when calling the create function
  474. BOOL m_bMultiBuffersUsed[MaxPairs];// True if pair supports multibuffer mechanism
  475. int m_pXferElement;
  476. // Counter stamp capabilities
  477. SapXferCounterStampInfo m_CounterStampInfo[MaxPairs];
  478. BOOL m_bNewCallbackViaConstructor;
  479. BOOL m_bOldCallback;
  480. SapXferFrameRateInfo m_XferFrameRateInfo;
  481. #if !SAPERA_DOT_NET
  482. SapXferMultiNode *m_pXferMultiNode[MaxMultiNode];
  483. #endif
  484. // Sapera transfer module settings
  485. CORXFER m_hXfer; // Transfer handle
  486. StartMode m_StartMode; // Current start mode
  487. int m_ConnectTimeout; // Override the communication timeout when calling Connect()
  488. // Flags
  489. BOOL m_bGrab; // TRUE if transfer is active
  490. BOOL m_NoConnect; // TRUE for some special transfer pairs that do not need to be connected
  491. BOOL m_bConnected; // TRUE if transfer object is connected to hardware, FALSE otherwise
  492. };
  493. //
  494. // SapXferCallbackInfo class declaration
  495. //
  496. class SAPCLASSBASIC_CLASS SapXferCallbackInfo
  497. {
  498. public:
  499. SapXferCallbackInfo(SapTransfer *pXfer, void *context, SapXferPair::EventType eventType, int eventCount, BOOL isTrash, int pairIndex)
  500. { m_pXfer = pXfer; m_Context = context; m_EventType = eventType; m_EventCount = eventCount; m_bTrash = isTrash; m_PairIndex = pairIndex; m_NewCallback = FALSE;}
  501. SapXferCallbackInfo(SapTransfer *pXfer, void *context, COREVENTINFO eventInfo, BOOL isTrash, int pairIndex);
  502. ~SapXferCallbackInfo() {}
  503. // Obsolete constructor
  504. SapXferCallbackInfo(void *context, SapXferPair::EventType eventType, int eventCount, BOOL isTrash, int pairIndex)
  505. { m_pXfer = NULL; m_Context = context; m_EventType = eventType; m_EventCount = eventCount; m_bTrash = isTrash; m_PairIndex = pairIndex; }
  506. SapTransfer *GetTransfer() const { return m_pXfer; }
  507. void *GetContext() const { return m_Context; }
  508. BOOL IsTrash() const { return m_bTrash; }
  509. int GetPairIndex() const { return m_PairIndex; }
  510. COREVENTINFO GetEventInfo() const { return m_EventInfo; }
  511. //Event Count
  512. int GetEventCount() const { return m_EventCount; }
  513. BOOL GetEventCount(int *eventCount);
  514. //Event Type
  515. SapXferPair::EventType GetEventType() const { return m_EventType; }
  516. BOOL GetEventType(SapXferPair::EventType *eventType);
  517. //Timestamp
  518. BOOL GetHostTimeStamp(UINT64 *hostTimeStamp);
  519. BOOL GetAuxiliaryTimeStamp(UINT64 *auxTimeStamp);
  520. // Custom Parameters
  521. BOOL GetCustomData(void **customData);
  522. BOOL GetCustomSize(int *customSize);
  523. // Unnamed Parameters
  524. BOOL GetGenericParam0(int *paramValue);
  525. BOOL GetGenericParam1(int *paramValue);
  526. BOOL GetGenericParam2(int *paramValue);
  527. BOOL GetGenericParam3(int *paramValue);
  528. protected:
  529. SapTransfer *m_pXfer;
  530. void *m_Context;
  531. SapXferPair::EventType m_EventType;
  532. int m_EventCount;
  533. BOOL m_bTrash;
  534. int m_PairIndex;
  535. COREVENTINFO m_EventInfo;
  536. BOOL m_NewCallback;
  537. };
  538. //
  539. // SapXferPair class inline implementation
  540. //
  541. inline BOOL SapXferPair::SetCallbackInfo(SapXferCallback pCallback, void *pContext)
  542. {
  543. m_pCallback = pCallback;
  544. m_pContext = pContext;
  545. if (m_Xfer && *m_Xfer)
  546. return m_Xfer->SetCallbackInfo(this);
  547. else
  548. return TRUE;
  549. }
  550. inline BOOL SapXferPair::SetTrashCallbackInfo(SapXferCallback pCallback, void *pContext)
  551. {
  552. m_pTrashCallback = pCallback;
  553. m_pTrashContext = pContext;
  554. if (m_Xfer && *m_Xfer)
  555. return m_Xfer->SetTrashCallbackInfo(this);
  556. else
  557. return TRUE;
  558. }
  559. inline BOOL SapXferPair::SetEventType(EventType eventType)
  560. {
  561. m_EventType = eventType;
  562. if (m_Xfer && *m_Xfer)
  563. return m_Xfer->SetEventType(this);
  564. else
  565. return TRUE;
  566. }
  567. inline BOOL SapXferPair::SetEventCountSource(EventCountSource eventCountSource)
  568. {
  569. m_EventCountSource = eventCountSource;
  570. if (m_Xfer && *m_Xfer)
  571. return m_Xfer->SetEventCountSource(this);
  572. else
  573. return TRUE;
  574. }
  575. inline BOOL SapXferPair::SetCycleMode(CycleMode cycleMode)
  576. {
  577. m_CycleMode = cycleMode;
  578. if (m_Xfer && *m_Xfer)
  579. return m_Xfer->SetCycleMode(this);
  580. else
  581. return TRUE;
  582. }
  583. inline BOOL SapXferPair::SetFlipMode(FlipMode flipMode)
  584. {
  585. m_FlipMode = flipMode;
  586. if (m_Xfer && *m_Xfer)
  587. return m_Xfer->SetFlipMode(this);
  588. else
  589. return TRUE;
  590. }
  591. inline BOOL SapXferPair::SetCounterStampTimeBase(CounterStampTimeBase counterStampTimeBase)
  592. {
  593. m_CounterStampTimeBase = counterStampTimeBase;
  594. if (m_Xfer && *m_Xfer)
  595. return m_Xfer->SetCounterStampTimeBase(this);
  596. else
  597. return TRUE;
  598. }
  599. inline BOOL SapXferPair::SetFlatFieldCycleMode(FlatFieldCycleMode flatFieldCycleMode)
  600. {
  601. m_FlatFieldCycleMode = flatFieldCycleMode;
  602. if (m_Xfer && *m_Xfer)
  603. return m_Xfer->SetFlatFieldCycleMode(this);
  604. else
  605. return TRUE;
  606. }
  607. inline BOOL SapXferPair::SetDynamicLutCycleMode(DynamicLutCycleMode dynamicLutCycleMode)
  608. {
  609. m_DynamicLutCycleMode = dynamicLutCycleMode;
  610. if (m_Xfer && *m_Xfer)
  611. return m_Xfer->SetDynamicLutCycleMode(this);
  612. else
  613. return TRUE;
  614. }
  615. inline BOOL SapXferPair::SetFramesPerCallback(int numFrames)
  616. {
  617. int nDstCount = GetDst()->GetCount();
  618. if (numFrames > nDstCount / 2)
  619. numFrames = nDstCount / 2 + ((nDstCount & 1) ? 1 : 0);
  620. if (numFrames > 0)
  621. {
  622. m_FramesPerCallback = numFrames;
  623. if (m_Xfer && *m_Xfer)
  624. m_Xfer->SetFramesPerCallback(this);
  625. else
  626. return TRUE;
  627. }
  628. return FALSE;
  629. }
  630. inline BOOL SapXferPair::SetFramesOnBoard(int numFrames)
  631. {
  632. if (numFrames > 0)
  633. {
  634. m_FramesOnBoard = numFrames;
  635. if (m_Xfer && *m_Xfer)
  636. {
  637. if (!m_Xfer->SetFramesOnBoard(this))
  638. return FALSE;
  639. return m_Xfer->UpdateParameters();
  640. }
  641. else
  642. return TRUE;
  643. }
  644. return FALSE;
  645. }
  646. inline BOOL SapXferPair::SetRelativeBufferIndex(int relativeBufferIndex)
  647. {
  648. m_RelativeBufferIndex = relativeBufferIndex;
  649. if (m_Xfer && *m_Xfer)
  650. return m_Xfer->SetRelativeBufferIndex(this);
  651. else
  652. return TRUE;
  653. }
  654. inline BOOL SapXferPair::SetNbInputFrames(int nbInputFrames)
  655. {
  656. if (nbInputFrames > 0)
  657. {
  658. m_NbInputFrames = nbInputFrames;
  659. if (m_Xfer && *m_Xfer)
  660. return m_Xfer->SetNbInputFrames(this);
  661. else
  662. return TRUE;
  663. }
  664. return FALSE;
  665. }
  666. inline BOOL SapXferPair::SetNbOutputFrames(int nbOutputFrames)
  667. {
  668. if (nbOutputFrames > 0)
  669. {
  670. m_NbOutputFrames = nbOutputFrames;
  671. if (m_Xfer && *m_Xfer)
  672. return m_Xfer->SetNbOutputFrames(this);
  673. else
  674. return TRUE;
  675. }
  676. return FALSE;
  677. }
  678. inline void SapXferPair::Construct(SapXferNode *pSrc, int srcPort, SapXferNode *pDst, int dstPort, BOOL regCallback)
  679. {
  680. m_pSrc = pSrc;
  681. m_SrcPort = srcPort;
  682. m_pDst = pDst;
  683. m_DstPort = dstPort;
  684. m_bRegCallback = regCallback;
  685. m_pCallback = NULL;
  686. m_pContext = NULL;
  687. m_pTrashCallback = NULL;
  688. m_pTrashContext = NULL;
  689. m_FramesPerCallback = 1;
  690. m_FramesOnBoard = InvalidFramesOnBoard;
  691. m_RelativeBufferIndex = 0;
  692. m_NbInputFrames = 1;
  693. m_NbOutputFrames = 1;
  694. m_EventType = EventEndOfFrame;
  695. m_EventCountSource = EventCountDst;
  696. m_CycleMode = CycleUnknown;
  697. m_FlipMode = FlipNone;
  698. m_CounterStampTimeBase = CounterStampMicroSec;
  699. m_FlatFieldCycleMode = FlatFieldCycleOff;
  700. m_DynamicLutCycleMode = DynamicLutCycleOff;
  701. m_Xfer = NULL;
  702. }
  703. #endif // _SAPTRANSFER_H_