AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
ntv2task.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 #include "ntv2task.h"
10 #include "ntv2debug.h"
11 #include "ntv2utils.h"
12 
13 #include <string.h>
14 #include <iomanip>
15 
16 #ifndef NULL
17 #define NULL (0)
18 #endif
19 
20 using namespace std;
21 
22 
24 {
25  Init();
26 }
27 
29 {
30  *this = other;
31 }
32 
34 {
35 }
36 
38 {
39  m_AutoCircTask.taskVersion = AUTOCIRCULATE_TASK_VERSION;
40  m_AutoCircTask.taskSize = sizeof(AutoCircGenericTask);
41  m_AutoCircTask.maxTasks = AUTOCIRCULATE_TASK_MAX_TASKS;
42  m_AutoCircTask.numTasks = 0;
43  m_AutoCircTask.taskArray = m_TaskArray;
44  InitTaskArray(m_TaskArray, AUTOCIRCULATE_TASK_MAX_TASKS);
45 }
46 
48 {
49  m_AutoCircTask.numTasks = 0;
50 }
51 
53  ULWord registerNum,
54  ULWord registerValue,
55  ULWord registerMask,
56  ULWord registerShift)
57 {
58  ULWord index = m_AutoCircTask.numTasks;
59 
60  if(index >= m_AutoCircTask.maxTasks)
61  {
62  return NULL;
63  }
64 
65  AutoCircGenericTask* pGeneric = &m_TaskArray[index];
67 
68  pGeneric->u.registerTask.regNum = registerNum;
69  pGeneric->u.registerTask.mask = registerMask;
70  pGeneric->u.registerTask.shift = registerShift;
71  pGeneric->u.registerTask.value = registerValue;
72 
73  index++;
74  m_AutoCircTask.numTasks = index;
75 
76  return pGeneric;
77 }
78 
80  ULWord registerNum,
81  ULWord registerMask,
82  ULWord registerShift)
83 {
84  ULWord index = m_AutoCircTask.numTasks;
85 
86  if(index >= m_AutoCircTask.maxTasks)
87  {
88  return NULL;
89  }
90 
91  AutoCircGenericTask* pGeneric = &m_TaskArray[index];
93 
94  pGeneric->u.registerTask.regNum = registerNum;
95  pGeneric->u.registerTask.mask = registerMask;
96  pGeneric->u.registerTask.shift = registerShift;
97  pGeneric->u.registerTask.value = 0;
98 
99  index++;
100  m_AutoCircTask.numTasks = index;
101 
102  return pGeneric;
103 }
104 
105 
107  RP188_STRUCT* pTCInOut1,
108  RP188_STRUCT* pTCInOut2,
109  RP188_STRUCT* pLTCEmbedded,
110  RP188_STRUCT* pLTCAnalog,
111  RP188_STRUCT* pLTCEmbedded2,
112  RP188_STRUCT* pLTCAnalog2,
113  RP188_STRUCT* pTCInOut3,
114  RP188_STRUCT* pTCInOut4,
115  RP188_STRUCT* pTCInOut5,
116  RP188_STRUCT* pTCInOut6,
117  RP188_STRUCT* pTCInOut7,
118  RP188_STRUCT* pTCInOut8)
119 {
120  ULWord index = m_AutoCircTask.numTasks;
121 
122  if(index >= m_AutoCircTask.maxTasks)
123  {
124  return NULL;
125  }
126 
127  AutoCircGenericTask* pGeneric = &m_TaskArray[index];
128  memset((void*)pGeneric, 0, sizeof(AutoCircGenericTask));
129 
130  pGeneric->taskType = eAutoCircTaskTimeCodeWrite;
131 
132  if(pTCInOut1 != NULL)
133  {
134  pGeneric->u.timeCodeTask.TCInOut1 = *pTCInOut1;
135  }
136  else
137  {
138  pGeneric->u.timeCodeTask.TCInOut1.Low = 0xffffffff;
139  }
140  if(pTCInOut2 != NULL)
141  {
142  pGeneric->u.timeCodeTask.TCInOut2 = *pTCInOut2;
143  }
144  else
145  {
146  pGeneric->u.timeCodeTask.TCInOut2.Low = 0xffffffff;
147  }
148  if(pTCInOut3 != NULL)
149  {
150  pGeneric->u.timeCodeTask.TCInOut3 = *pTCInOut3;
151  }
152  else
153  {
154  pGeneric->u.timeCodeTask.TCInOut3.Low = 0xffffffff;
155  }
156  if(pTCInOut4 != NULL)
157  {
158  pGeneric->u.timeCodeTask.TCInOut4 = *pTCInOut4;
159  }
160  else
161  {
162  pGeneric->u.timeCodeTask.TCInOut4.Low = 0xffffffff;
163  }
164  if(pTCInOut5 != NULL)
165  {
166  pGeneric->u.timeCodeTask.TCInOut5 = *pTCInOut5;
167  }
168  else
169  {
170  pGeneric->u.timeCodeTask.TCInOut5.Low = 0xffffffff;
171  }
172  if(pTCInOut6 != NULL)
173  {
174  pGeneric->u.timeCodeTask.TCInOut6 = *pTCInOut6;
175  }
176  else
177  {
178  pGeneric->u.timeCodeTask.TCInOut6.Low = 0xffffffff;
179  }
180  if(pTCInOut7 != NULL)
181  {
182  pGeneric->u.timeCodeTask.TCInOut7 = *pTCInOut7;
183  }
184  else
185  {
186  pGeneric->u.timeCodeTask.TCInOut7.Low = 0xffffffff;
187  }
188  if(pTCInOut8 != NULL)
189  {
190  pGeneric->u.timeCodeTask.TCInOut8 = *pTCInOut8;
191  }
192  else
193  {
194  pGeneric->u.timeCodeTask.TCInOut8.Low = 0xffffffff;
195  }
196  if(pLTCEmbedded != NULL)
197  {
198  pGeneric->u.timeCodeTask.LTCEmbedded = *pLTCEmbedded;
199  }
200  else
201  {
202  pGeneric->u.timeCodeTask.LTCEmbedded.Low = 0xffffffff;
203  }
204  if(pLTCAnalog != NULL)
205  {
206  pGeneric->u.timeCodeTask.LTCAnalog = *pLTCAnalog;
207  }
208  else
209  {
210  pGeneric->u.timeCodeTask.LTCAnalog.Low = 0xffffffff;
211  }
212  if(pLTCEmbedded2 != NULL)
213  {
214  pGeneric->u.timeCodeTask.LTCEmbedded2 = *pLTCEmbedded2;
215  }
216  else
217  {
218  pGeneric->u.timeCodeTask.LTCEmbedded2.Low = 0xffffffff;
219  }
220  if(pLTCAnalog2 != NULL)
221  {
222  pGeneric->u.timeCodeTask.LTCAnalog2 = *pLTCAnalog2;
223  }
224  else
225  {
226  pGeneric->u.timeCodeTask.LTCAnalog2.Low = 0xffffffff;
227  }
228 
229  index++;
230  m_AutoCircTask.numTasks = index;
231 
232  return pGeneric;
233 }
234 
236 {
237  ULWord index = m_AutoCircTask.numTasks;
238 
239  if(index >= m_AutoCircTask.maxTasks)
240  {
241  return NULL;
242  }
243 
244  AutoCircGenericTask* pGeneric = &m_TaskArray[index];
245  memset((void*)pGeneric, 0, sizeof(AutoCircGenericTask));
246 
247  pGeneric->taskType = eAutoCircTaskTimeCodeRead;
248 
249  index++;
250  m_AutoCircTask.numTasks = index;
251 
252  return pGeneric;
253 }
254 
256 {
257  if(index >= m_AutoCircTask.numTasks)
258  {
259  return NULL;
260  }
261 
262  return &m_TaskArray[index];
263 }
264 
265 
266 const AutoCircGenericTask & CNTV2Task::GetTask (const ULWord inIndex) const
267 {
268  if (inIndex >= m_AutoCircTask.numTasks)
269  {
270  static AutoCircGenericTask nullTask;
271  ::memset ((void*)&nullTask, 0, sizeof (nullTask));
272  return nullTask;
273  }
274  else
275  return m_TaskArray [inIndex];
276 }
277 
278 
280 {
281  return m_AutoCircTask.numTasks;
282 }
283 
285 {
286  return m_AutoCircTask.maxTasks;
287 }
288 
290 {
291  return &m_AutoCircTask;
292 }
293 
294 static const string AutoCircTaskTypeToString (const AutoCircTaskType inTaskType)
295 {
296  switch (inTaskType)
297  {
298  case eAutoCircTaskNone: return "<none>";
299  case eAutoCircTaskRegisterWrite: return "RegWrite";
300  case eAutoCircTaskRegisterRead: return "RegRead";
301  case eAutoCircTaskTimeCodeWrite: return "TCWrite";
302  case eAutoCircTaskTimeCodeRead: return "TCRead";
303  case MAX_NUM_AutoCircTaskTypes: break;
304  }
305  return "";
306 }
307 
308 
309 ostream & operator << (ostream & inOutStream, const AutoCircRegisterTask & inObj)
310 {
311  return inOutStream << "reg=" << inObj.regNum << ", mask=0x" << hex << setw (8) << setfill ('0') << inObj.mask << dec
312  << ", shift=" << inObj.shift << ", value=0x" << hex << setw (8) << setfill ('0') << inObj.value << dec;
313 }
314 
315 
316 ostream & operator << (ostream & inOutStream, const AutoCircTimeCodeTask & inObj)
317 {
318  return inOutStream << " TCInOut1: " << inObj.TCInOut1 << endl
319  << " TCInOut2: " << inObj.TCInOut2 << endl
320  << " TCInOut3: " << inObj.TCInOut3 << endl
321  << " TCInOut4: " << inObj.TCInOut4 << endl
322  << " TCInOut5: " << inObj.TCInOut5 << endl
323  << " TCInOut6: " << inObj.TCInOut6 << endl
324  << " TCInOut7: " << inObj.TCInOut7 << endl
325  << " TCInOut8: " << inObj.TCInOut8 << endl
326  << " LTCEmbedded: " << inObj.LTCEmbedded << endl
327  << "LTCEmbedded2: " << inObj.LTCEmbedded2 << endl
328  << "LTCEmbedded3: " << inObj.LTCEmbedded3 << endl
329  << "LTCEmbedded4: " << inObj.LTCEmbedded4 << endl
330  << "LTCEmbedded5: " << inObj.LTCEmbedded5 << endl
331  << "LTCEmbedded6: " << inObj.LTCEmbedded6 << endl
332  << "LTCEmbedded7: " << inObj.LTCEmbedded7 << endl
333  << "LTCEmbedded8: " << inObj.LTCEmbedded8 << endl
334  << " LTCAnalog: " << inObj.LTCAnalog << endl
335  << " LTCAnalog2: " << inObj.LTCAnalog2;
336 }
337 
338 
339 ostream & operator << (ostream & inOutStream, const AutoCircGenericTask & inObj)
340 {
341  inOutStream << ::AutoCircTaskTypeToString (inObj.taskType);
342  if (NTV2_IS_REGISTER_TASK (inObj.taskType))
343  inOutStream << ": " << inObj.u.registerTask;
344  else if (NTV2_IS_TIMECODE_TASK (inObj.taskType))
345  inOutStream << ":" << endl << inObj.u.timeCodeTask;
346  return inOutStream;
347 }
348 
349 
350 ostream & operator << (ostream & inOutStream, const CNTV2Task & inObj)
351 {
352  const ULWord nTasks (inObj.GetNumTasks ());
353  inOutStream << nTasks << " task(s):" << endl;
354  for (ULWord num (0); num < nTasks; num++)
355  {
356  const AutoCircGenericTask & task (inObj.GetTask (num));
357  inOutStream << "[" << num << "] " << task << endl;
358  }
359  return inOutStream;
360 }
361 
362 
364 {
365  if(pTaskArray == NULL)
366  {
367  return false;
368  }
369 
370  memset((void*)pTaskArray, 0, numTasks * sizeof(AutoCircGenericTask));
371 
372  return true;
373 }
374 
376  const AutoCircGenericTask* pSrcArray, ULWord srcSize, ULWord srcNum)
377 {
378  ULWord i;
379 
380  // copy src to dst with support for changes in sizeof(AutoCircGenericTask)
381 
382  if((pSrcArray == NULL) || (pDstArray == NULL))
383  {
384  return false;
385  }
386 
387  ULWord transferSize = srcSize;
388  if(transferSize > dstSize)
389  {
390  transferSize = dstSize;
391  }
392 
393  ULWord transferNum = srcNum;
394  if(transferNum > dstMax)
395  {
396  transferNum = dstMax;
397  }
398 
399  UByte* pSrc = (UByte*)pSrcArray;
400  UByte* pDst = (UByte*)pDstArray;
401 
402  for(i = 0; i < transferNum; i++)
403  {
404  memcpy(pDst, pSrc, transferSize);
405  pSrc += srcSize;
406  pDst += dstSize;
407  }
408 
409  return transferNum;
410 }
411 
413 {
414  InitTaskArray(m_TaskArray, AUTOCIRCULATE_TASK_MAX_TASKS);
415 
416  m_AutoCircTask.numTasks = CopyTaskArray(m_TaskArray, m_AutoCircTask.taskSize, m_AutoCircTask.maxTasks,
418 
419  return *this;
420 }
AutoCircTimeCodeTask::TCInOut7
RP188_STRUCT TCInOut7
Definition: ntv2publicinterface.h:4685
AutoCircGenericTask::registerTask
AutoCircRegisterTask registerTask
Definition: ntv2publicinterface.h:4700
AutoCircRegisterTask
Definition: ntv2publicinterface.h:4665
AutoCircGenericTask
struct AutoCircGenericTask AutoCircGenericTask
AutoCircRegisterTask::mask
ULWord mask
Definition: ntv2publicinterface.h:4668
AutoCircTimeCodeTask::TCInOut8
RP188_STRUCT TCInOut8
Definition: ntv2publicinterface.h:4686
eAutoCircTaskRegisterWrite
@ eAutoCircTaskRegisterWrite
Definition: ntv2publicinterface.h:4646
AUTOCIRCULATE_TASK_VERSION
#define AUTOCIRCULATE_TASK_VERSION
Definition: ntv2publicinterface.h:4637
ntv2task.h
Declares the CNTV2Task class (deprecated).
AutoCircTimeCodeTask::LTCEmbedded
RP188_STRUCT LTCEmbedded
Definition: ntv2publicinterface.h:4677
CNTV2Task
The AutoCirculate "task" facility is deprecated. Use the new AutoCirculate APIs.
Definition: ntv2task.h:21
AutoCircTimeCodeTask::TCInOut4
RP188_STRUCT TCInOut4
Definition: ntv2publicinterface.h:4682
AutoCircRegisterTask::value
ULWord value
Definition: ntv2publicinterface.h:4670
AutoCircGenericTask::taskType
AutoCircTaskType taskType
Definition: ntv2publicinterface.h:4697
eAutoCircTaskNone
@ eAutoCircTaskNone
Definition: ntv2publicinterface.h:4645
CNTV2Task::AddTimeCodeWriteTask
virtual AutoCircGenericTask * AddTimeCodeWriteTask(RP188_STRUCT *pTCInOut1=NULL, RP188_STRUCT *pTCInOut2=NULL, RP188_STRUCT *pLTCEmbedded=NULL, RP188_STRUCT *pLTCAnalog=NULL, RP188_STRUCT *pLTCEmbedded2=NULL, RP188_STRUCT *pLTCAnalog2=NULL, RP188_STRUCT *pTCInOut3=NULL, RP188_STRUCT *pTCInOut4=NULL, RP188_STRUCT *pTCInOut5=NULL, RP188_STRUCT *pTCInOut6=NULL, RP188_STRUCT *pTCInOut7=NULL, RP188_STRUCT *pTCInOut8=NULL)
Definition: ntv2task.cpp:106
AutoCircTimeCodeTask::LTCAnalog
RP188_STRUCT LTCAnalog
Definition: ntv2publicinterface.h:4678
AUTOCIRCULATE_TASK_STRUCT::taskSize
ULWord taskSize
Definition: ntv2publicinterface.h:4727
operator<<
ostream & operator<<(ostream &inOutStream, const AutoCircRegisterTask &inObj)
Definition: ntv2task.cpp:309
ntv2debug.h
CNTV2Task::CopyTaskArray
static ULWord CopyTaskArray(AutoCircGenericTask *pDstArray, ULWord dstSize, ULWord dstMax, const AutoCircGenericTask *pSrcArray, ULWord srcSize, ULWord srcNum)
Definition: ntv2task.cpp:375
CNTV2Task::m_AutoCircTask
AUTOCIRCULATE_TASK_STRUCT m_AutoCircTask
Definition: ntv2task.h:88
AutoCircGenericTask
Definition: ntv2publicinterface.h:4695
CNTV2Task::Init
virtual void Init()
Definition: ntv2task.cpp:37
CNTV2Task::AddRegisterWriteTask
virtual AutoCircGenericTask * AddRegisterWriteTask(ULWord registerNum, ULWord registerValue, ULWord registerMask=0xffffffff, ULWord registerShift=0)
Definition: ntv2task.cpp:52
ULWord
uint32_t ULWord
Definition: ajatypes.h:246
AUTOCIRCULATE_TASK_MAX_TASKS
#define AUTOCIRCULATE_TASK_MAX_TASKS
Definition: ntv2publicinterface.h:4638
AutoCircTimeCodeTask::LTCEmbedded4
RP188_STRUCT LTCEmbedded4
Definition: ntv2publicinterface.h:4688
AutoCircTimeCodeTask::TCInOut6
RP188_STRUCT TCInOut6
Definition: ntv2publicinterface.h:4684
AutoCircTimeCodeTask::TCInOut1
RP188_STRUCT TCInOut1
Definition: ntv2publicinterface.h:4675
CNTV2Task::CNTV2Task
CNTV2Task()
Definition: ntv2task.cpp:23
AutoCircTimeCodeTask::TCInOut5
RP188_STRUCT TCInOut5
Definition: ntv2publicinterface.h:4683
AutoCircTimeCodeTask::LTCEmbedded7
RP188_STRUCT LTCEmbedded7
Definition: ntv2publicinterface.h:4691
AutoCircTimeCodeTask::TCInOut3
RP188_STRUCT TCInOut3
Definition: ntv2publicinterface.h:4681
ntv2utils.h
Declares numerous NTV2 utility functions.
CNTV2Task::GetTaskStruct
virtual PAUTOCIRCULATE_TASK_STRUCT GetTaskStruct()
Definition: ntv2task.cpp:289
CNTV2Task::GetNumTasks
virtual ULWord GetNumTasks(void) const
Definition: ntv2task.cpp:279
CNTV2Task::GetTask
virtual AutoCircGenericTask * GetTask(ULWord index)
Definition: ntv2task.cpp:255
AutoCircGenericTask::u
union AutoCircGenericTask::@32 u
RP188_STRUCT
Definition: ntv2publicinterface.h:4052
CNTV2Task::AddRegisterReadTask
virtual AutoCircGenericTask * AddRegisterReadTask(ULWord registerNum, ULWord registerMask=0xffffffff, ULWord registerShift=0)
Definition: ntv2task.cpp:79
AutoCircTimeCodeTask::LTCEmbedded8
RP188_STRUCT LTCEmbedded8
Definition: ntv2publicinterface.h:4692
eAutoCircTaskRegisterRead
@ eAutoCircTaskRegisterRead
Definition: ntv2publicinterface.h:4647
MAX_NUM_AutoCircTaskTypes
@ MAX_NUM_AutoCircTaskTypes
Definition: ntv2publicinterface.h:4650
AutoCircTimeCodeTask::LTCAnalog2
RP188_STRUCT LTCAnalog2
Definition: ntv2publicinterface.h:4680
RP188_STRUCT::Low
ULWord Low
Definition: ntv2publicinterface.h:4054
AutoCircGenericTask::timeCodeTask
AutoCircTimeCodeTask timeCodeTask
Definition: ntv2publicinterface.h:4701
UByte
uint8_t UByte
Definition: ajatypes.h:241
NULL
#define NULL
Definition: ntv2task.cpp:17
AutoCircTimeCodeTask
Definition: ntv2publicinterface.h:4673
AutoCircTaskTypeToString
static const string AutoCircTaskTypeToString(const AutoCircTaskType inTaskType)
Definition: ntv2task.cpp:294
AutoCircTimeCodeTask::LTCEmbedded6
RP188_STRUCT LTCEmbedded6
Definition: ntv2publicinterface.h:4690
eAutoCircTaskTimeCodeWrite
@ eAutoCircTaskTimeCodeWrite
Definition: ntv2publicinterface.h:4648
AutoCircTimeCodeTask::LTCEmbedded2
RP188_STRUCT LTCEmbedded2
Definition: ntv2publicinterface.h:4679
CNTV2Task::GetMaxTasks
virtual ULWord GetMaxTasks(void) const
Definition: ntv2task.cpp:284
CNTV2Task::InitTaskArray
static bool InitTaskArray(AutoCircGenericTask *pTaskArray, ULWord numTasks)
Definition: ntv2task.cpp:363
NTV2_IS_REGISTER_TASK
#define NTV2_IS_REGISTER_TASK(_x_)
Definition: ntv2publicinterface.h:4658
CNTV2Task::Clear
virtual void Clear()
Definition: ntv2task.cpp:47
AUTOCIRCULATE_TASK_STRUCT::numTasks
ULWord numTasks
Definition: ntv2publicinterface.h:4728
AutoCircTimeCodeTask::TCInOut2
RP188_STRUCT TCInOut2
Definition: ntv2publicinterface.h:4676
AUTOCIRCULATE_TASK_STRUCT
Definition: ntv2publicinterface.h:4724
CNTV2Task::operator=
virtual CNTV2Task & operator=(const CNTV2Task &other)
Definition: ntv2task.cpp:412
CNTV2Task::m_TaskArray
AutoCircGenericTask m_TaskArray[128]
Definition: ntv2task.h:89
CNTV2Task::~CNTV2Task
virtual ~CNTV2Task()
Definition: ntv2task.cpp:33
eAutoCircTaskTimeCodeRead
@ eAutoCircTaskTimeCodeRead
Definition: ntv2publicinterface.h:4649
AutoCircRegisterTask::regNum
ULWord regNum
Definition: ntv2publicinterface.h:4667
AutoCircRegisterTask::shift
ULWord shift
Definition: ntv2publicinterface.h:4669
NTV2_IS_TIMECODE_TASK
#define NTV2_IS_TIMECODE_TASK(_x_)
Definition: ntv2publicinterface.h:4662
AutoCircTimeCodeTask::LTCEmbedded5
RP188_STRUCT LTCEmbedded5
Definition: ntv2publicinterface.h:4689
CNTV2Task::AddTimeCodeReadTask
virtual AutoCircGenericTask * AddTimeCodeReadTask()
Definition: ntv2task.cpp:235
AutoCircTaskType
AutoCircTaskType
These are the available AutoCirculate task types.
Definition: ntv2publicinterface.h:4643
AutoCircTimeCodeTask::LTCEmbedded3
RP188_STRUCT LTCEmbedded3
Definition: ntv2publicinterface.h:4687