/* A little input demo for mode 1 Mode 1 uses a timer to acquire samples at regular intervals. It scans through the channel list, and then repeats. */ #include #include #include #include #include #include #include #include #include #include #include #define BUFSZ 1000 #define N_CHANS 1000 extern int verbose_flag; extern int subdevice; extern int range; extern int channel; extern int aref; extern char *filename; comedi_t *device; void parse_options(int argc,char *argv[]); sampl_t data[BUFSZ]; unsigned int chanlist[N_CHANS]; int ai_mode1_test(double freq,int n_chans,int n_scans); int main(int argc, char *argv[]) { parse_options(argc,argv); device=comedi_open(filename); if(!device){ comedi_perror(filename); exit(0); } subdevice=comedi_find_subdevice_by_type(device,COMEDI_SUBD_AI,0); if(subdevice<0){ printf("no analog input subdevice found\n"); exit(0); } while(1){ printf("Testing mode 1:\n"); printf("10 hz, 1 chan\n"); ai_mode1_test(10.0,1,10); printf("100 hz, 1 chan\n"); ai_mode1_test(100.0,1,100); printf("1000 hz, 1 chan\n"); ai_mode1_test(1000.0,1,1000); printf("10000 hz, 1 chan\n"); ai_mode1_test(10000.0,1,10000); printf("100000 hz, 1 chan\n"); ai_mode1_test(100000.0,1,100000); printf("100000 hz, 2 chan\n"); ai_mode1_test(100000.0,2,50000); printf("100000 hz, 16 chans\n"); ai_mode1_test(100000.0,16,100000/16); } return 0; } int ai_mode1_test(double freq,int n_chans,int n_scans) { comedi_trig it; int err; int n,i; double actual_freq; void *data_ptr; int n_left; int maxchan; struct timeval start,stop; int m; memset(&it,0,sizeof(it)); it.subdev = subdevice; it.mode = 1; it.n_chan = n_chans; it.chanlist = chanlist; it.data = data; it.n = n_scans; maxchan = comedi_get_n_channels(device,subdevice); /* pack the channel list */ for(i=0;i0){ m=n_left; if(m>=BUFSZ)m=BUFSZ; if((n=read(comedi_fileno(device),data_ptr,m))<0){ perror("read"); exit(1); } //printf("read %d\n",n); n_left-=n; //data_ptr+=n; } gettimeofday(&stop,NULL); if(stop.tv_usec<=start.tv_usec){ stop.tv_usec+=1000000; stop.tv_sec--; } stop.tv_sec-=start.tv_sec; stop.tv_usec-=start.tv_usec; printf("actual time elapsed: %d.%06d s.\n",(int)stop.tv_sec,(int)stop.tv_usec); printf("expected time: %g\n",n_scans*n_chans/actual_freq); return 0; }