Hi,
I'm trying to do continuous reading/writing, but with the output being a
function of the input. As I understand, the above example constantly outputs the values returned by FunctionGenerator(...). I want to take the most recent inputs and use them to create new outputs.
I have C code that works, but the buffersize needs to be rather large to avoid running out of readable samples. (This just merges 4 inputs to 2 outputs by summing, but the idea is to implement a filter in software.)
TaskHandle OtaskHandle = 0;
TaskHandle ItaskHandle = 0;
main()
{
...
/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk (DAQmxCreateTask("",&ItaskHandle));
DAQmxErrChk (DAQmxCreateAIVoltageChan(ItaskHandle,"Dev1/ai0:3","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(ItaskHandle,NULL, samplerate,DAQmx_Val_Rising,DAQmx_Val_ContSamps,blocksize));
DAQmxErrChk (DAQmxRegisterDoneEvent(ItaskHandle,0,DoneCallback,NULL));
/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk (DAQmxCreateTask("",&OtaskHandle));
DAQmxErrChk (DAQmxCreateAOVoltageChan(OtaskHandle,"Dev1/ao0:1","",
-MAXOUT,MAXOUT,
DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(OtaskHandle,NULL,samplerate,
DAQmx_Val_Rising,
DAQmx_Val_ContSamps,blocksize));
DAQmxErrChk (DAQmxRegisterDoneEvent(OtaskHandle,0,DoneCallback,NULL));
//
DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(ItaskHandle,DAQmx_Val_Acquired_Into_Buffer,blocksize,0,EveryNCallback,NULL));
/*********************************************/
// DAQmx Write Code
/*********************************************/
DAQmxErrChk (DAQmxWriteAnalogF64(OtaskHandle,
blocksize,0,10.0,
DAQmx_Val_GroupByScanNumber,
dataout,NULL,NULL));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(OtaskHandle));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(ItaskHandle));
printf("# Acquiring samples continuously. Press Enter to interrupt\n");
getchar();
...
}
int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
int32 error=0;
char errBuff[2048]={'\0'};
int32 read=0;
float64 data[blocksize*NINCHANNELS];
int i;
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,blocksize,10.0,
DAQmx_Val_GroupByScanNumber ,
data,blocksize*4,
&read,NULL));
if( read>0 ) {
for (i = 0; i < read; i++) {
dataout[i * NOUTCHANNELS] =
(data[i * NINCHANNELS + 2] + data[i * NINCHANNELS + 0]);
dataout[i * NOUTCHANNELS + 1] =
(data[i * NINCHANNELS + 3] + data[i + NINCHANNELS + 1]);
}
}
DAQmxErrChk (DAQmxWriteAnalogF64(OtaskHandle,blocksize,0,10.0,
DAQmx_Val_GroupByScanNumber,
dataout,NULL,NULL));
Error:
if( DAQmxFailed(error) ) {
DAQmxGetExtendedErrorInfo(errBuff,2048);
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
printf("DAQmx Error: %s\n",errBuff);
}
return 0;
}