3 #define SIZEOF_VOID_P 4
6 #define SIZEOF_DOUBLE 8
7 #define msecsleep(x) (x)
14 void my_assert(
char const*s,
int d) {
15 fprintf(stderr,
"Err:%s:%d\n", s, d);
24 static const unsigned int BUF_SIZE_HINT =65536*16;
25 static const unsigned int CB_TRANSFER_SIZE = (BUF_SIZE_HINT/2);
29 int16 m_genBufAO[CB_TRANSFER_SIZE * NUM_AO_CH];
32 void _CHECK_DAQMX_RET(
int ret,
const char *file,
int line) {
35 DAQmxGetExtendedErrorInfo(str,
sizeof(str));
36 fprintf(stderr,
"%s\n@ %s: %d\n", str, file, line);
41 #define CHECK_DAQMX_RET(ret) _CHECK_DAQMX_RET(ret, __FILE__, __LINE__)
44 _genCallBackAO(TaskHandle task, int32 , uInt32 transfer_size,
void *data)
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;
54 CHECK_DAQMX_RET(DAQmxWriteBinaryI16(m_taskAO, num_samps,
false, 0.3,
55 DAQmx_Val_GroupByScanNumber, &m_genBufAO[cnt * num_samps * NUM_AO_CH],
61 if(samps != num_samps)
62 fprintf(stderr,
"!%d != %d\n", samps, num_samps);
70 main(
int argc,
char **argv)
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);
77 CHECK_DAQMX_RET(DAQmxCreateTask(
"", &m_taskAO));
79 CHECK_DAQMX_RET(DAQmxCreateAOVoltageChan(m_taskAO,
"Dev1/ao0:1",
"",
80 -1.0, 1.0, DAQmx_Val_Volts, NULL));
83 CHECK_DAQMX_RET(DAQmxSetAODataXferMech(m_taskAO,
85 DAQmx_Val_Interrupts));
87 CHECK_DAQMX_RET(DAQmxCfgSampClkTiming(m_taskAO,
"",
88 15e5, DAQmx_Val_Rising, DAQmx_Val_ContSamps,
89 BUF_SIZE_HINT * OVERSAMP_AO));
98 CHECK_DAQMX_RET(DAQmxCfgOutputBuffer(m_taskAO, BUF_SIZE_HINT ));
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);
105 CHECK_DAQMX_RET(DAQmxSetWriteRegenMode(m_taskAO, DAQmx_Val_DoNotAllowRegen));
111 _genCallBackAO(m_taskAO,DAQmx_Val_Transferred_From_Buffer, CB_TRANSFER_SIZE,
113 _genCallBackAO(m_taskAO,DAQmx_Val_Transferred_From_Buffer, CB_TRANSFER_SIZE,
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,
124 DAQmxStopTask(m_taskAO);
125 DAQmxClearTask(m_taskAO);