nidaqmx_cont_ao_test.cpp
1 #define SIZEOF_INT 4
2 #define SIZEOF_LONG 4
3 #define SIZEOF_VOID_P 4
4 #define SIZEOF_SHORT 2
5 #define SIZEOF_FLOAT 4
6 #define SIZEOF_DOUBLE 8
7 #define msecsleep(x) (x)
8 
9 #include "support.h"
10 
11 #include <stdint.h>
12 
13 
14 void my_assert(char const*s, int d) {
15  fprintf(stderr, "Err:%s:%d\n", s, d);
16  abort();
17 }
18 
19 #include <NIDAQmx.h>
20 
21 using std::max;
22 using std::min;
23 
24 static const unsigned int BUF_SIZE_HINT =65536*16;
25 static const unsigned int CB_TRANSFER_SIZE = (BUF_SIZE_HINT/2);
26 #define NUM_AO_CH 2
27 #define OVERSAMP_AO 1
28 
29 int16 m_genBufAO[CB_TRANSFER_SIZE * NUM_AO_CH];
30 
31 TaskHandle m_taskAO;
32 void _CHECK_DAQMX_RET(int ret, const char *file, int line) {
33  if(ret != 0) {
34  char str[2048];
35  DAQmxGetExtendedErrorInfo(str, sizeof(str));
36  fprintf(stderr, "%s\n@ %s: %d\n", str, file, line);
37  }
38  if( ret < 0 )
39  throw int(ret);
40 }
41 #define CHECK_DAQMX_RET(ret) _CHECK_DAQMX_RET(ret, __FILE__, __LINE__)
42 
43 int32
44 _genCallBackAO(TaskHandle task, int32 /*type*/, uInt32 transfer_size, void *data)
45 {
46  try {
47  #define NUM_CB_DIV (transfer_size/128)
48  for(int cnt = 0; cnt < NUM_CB_DIV; cnt++) {
49  uInt32 num_samps = transfer_size / NUM_CB_DIV;
50 
51  int32 samps;
52 
53 
54  CHECK_DAQMX_RET(DAQmxWriteBinaryI16(m_taskAO, num_samps, false, 0.3,
55  DAQmx_Val_GroupByScanNumber, &m_genBufAO[cnt * num_samps * NUM_AO_CH],
56  &samps, NULL));
57 
58 /* CHECK_DAQMX_RET(DAQmxWriteRaw(m_taskAO, num_samps, false, -1,
59  &m_genBufAO[cnt * num_samps * NUM_AO_CH],
60  &samps, NULL));
61 */ if(samps != num_samps)
62  fprintf(stderr, "!%d != %d\n", samps, num_samps);
63  }
64  }
65  catch (...) {
66  }
67 }
68 
69 int
70 main(int argc, char **argv)
71 {
72  for(int i = 0; i < CB_TRANSFER_SIZE; i++) {
73  m_genBufAO[2 * i] = lrint(cos(i * 2 * PI / 20) * 5000u);
74  m_genBufAO[2 * i + 1] = lrint(sin(i * 2 * PI / 20) * 20000u);
75  }
76  try {
77  CHECK_DAQMX_RET(DAQmxCreateTask("", &m_taskAO));
78 
79  CHECK_DAQMX_RET(DAQmxCreateAOVoltageChan(m_taskAO, "Dev1/ao0:1", "",
80  -1.0, 1.0, DAQmx_Val_Volts, NULL));
81 
82  //DMA is slower than interrupts!
83  CHECK_DAQMX_RET(DAQmxSetAODataXferMech(m_taskAO,
84  "Dev1/ao0:1",
85  DAQmx_Val_Interrupts));
86 
87  CHECK_DAQMX_RET(DAQmxCfgSampClkTiming(m_taskAO, "",
88  15e5, DAQmx_Val_Rising, DAQmx_Val_ContSamps,
89  BUF_SIZE_HINT * OVERSAMP_AO));
90 
91  //Buffer setup.
92 // CHECK_DAQMX_RET(DAQmxSetAODataXferReqCond(m_taskAO,
93 // "Dev1/ao0:1",
94 //// DAQmx_Val_OnBrdMemNotFull));
95 // DAQmx_Val_OnBrdMemHalfFullOrLess));
96 // CHECK_DAQMX_RET(DAQmxSetWriteWaitMode(m_taskAO, DAQmx_Val_Poll));
97 
98  CHECK_DAQMX_RET(DAQmxCfgOutputBuffer(m_taskAO, BUF_SIZE_HINT ));
99  uInt32 bufsize;
100  CHECK_DAQMX_RET(DAQmxGetBufOutputBufSize(m_taskAO, &bufsize));
101  printf("Using bufsize = %d\n", (int)bufsize);
102  CHECK_DAQMX_RET(DAQmxGetBufOutputOnbrdBufSize(m_taskAO, &bufsize));
103  printf("On-board bufsize = %d\n", bufsize);
104 
105  CHECK_DAQMX_RET(DAQmxSetWriteRegenMode(m_taskAO, DAQmx_Val_DoNotAllowRegen));
106 
107 /* CHECK_DAQMX_RET(DAQmxRegisterEveryNSamplesEvent(m_taskAO,
108  DAQmx_Val_Transferred_From_Buffer, CB_TRANSFER_SIZE, 0,
109  _genCallBackAO, NULL));
110 */
111  _genCallBackAO(m_taskAO,DAQmx_Val_Transferred_From_Buffer, CB_TRANSFER_SIZE,
112  NULL);
113  _genCallBackAO(m_taskAO,DAQmx_Val_Transferred_From_Buffer, CB_TRANSFER_SIZE,
114  NULL);
115  CHECK_DAQMX_RET(DAQmxStartTask(m_taskAO));
116  for(unsigned int i = 0; i < 16; i++)
117  _genCallBackAO(m_taskAO,DAQmx_Val_Transferred_From_Buffer, CB_TRANSFER_SIZE,
118  NULL);
119 
120  getchar();
121  }
122  catch (...) {
123  }
124  DAQmxStopTask(m_taskAO);
125  DAQmxClearTask(m_taskAO);
126 
127 
128 }

Generated for KAME4 by  doxygen 1.8.3