2 * Example of using commands - asynchronous input
5 * Copyright (c) 1999,2000 David A. Schleef <ds@schleef.org>
7 * This file may be freely modified, distributed, and combined with
8 * other software, as long as proper attribution is given in the
13 * An example for directly using Comedi commands. Comedi commands
14 * are used for asynchronous acquisition, with the timing controlled
15 * by on-board timers or external events.
19 #include <comedilib.h>
29 unsigned int chanlist[256];
33 int prepare_cmd_lib(comedi_t *dev,int subdevice,comedi_cmd *cmd);
34 int prepare_cmd(comedi_t *dev,int subdevice,comedi_cmd *cmd);
37 int main(int argc, char *argv[])
46 parse_options(argc,argv);
48 dev = comedi_open(filename);
50 comedi_perror(filename);
54 size = comedi_get_buffer_size(dev,subdevice);
55 fprintf(stderr,"buffer size is %d\n",size);
57 map=mmap(NULL,size,PROT_READ,MAP_SHARED,comedi_fileno(dev),0);
58 fprintf(stderr,"map=%p\n",map);
59 if( map == MAP_FAILED ){
64 for(i=0;i<n_chan;i++){
65 chanlist[i]=CR_PACK(channel+i,range,aref);
68 //prepare_cmd_lib(dev,subdevice,cmd);
69 prepare_cmd(dev,subdevice,cmd);
71 ret = comedi_command_test(dev,cmd);
73 ret = comedi_command_test(dev,cmd);
76 fprintf(stderr,"command_test failed\n");
82 ret = comedi_command(dev,cmd);
84 comedi_perror("comedi_command");
91 front += comedi_get_buffer_contents(dev,subdevice);
92 if(verbose)fprintf(stderr,"front = %d, back = %d\n",front,back);
95 //comedi_poll(dev,subdevice);
100 for(i=back;i<front;i+=sizeof(sampl_t)){
102 printf("%d ",*(sampl_t *)(map+(i%size)));
110 ret = comedi_mark_buffer_read(dev,subdevice,front-back);
112 comedi_perror("comedi_mark_buffer_read");
121 int prepare_cmd_lib(comedi_t *dev,int subdevice,comedi_cmd *cmd)
125 ret = comedi_get_cmd_generic_timed(dev,subdevice,cmd,1e9/freq);
127 comedi_perror("comedi_get_cmd_generic_timed\n");
131 cmd->chanlist = chanlist;
132 cmd->chanlist_len = n_chan;
133 cmd->scan_end_arg = n_chan;
135 if(cmd->stop_src==TRIG_COUNT)cmd->stop_arg = n_scan;
140 int prepare_cmd(comedi_t *dev,int subdevice,comedi_cmd *cmd)
142 memset(cmd,0,sizeof(*cmd));
144 cmd->subdev = subdevice;
148 cmd->start_src = TRIG_NOW;
151 cmd->scan_begin_src = TRIG_TIMER;
152 cmd->scan_begin_arg = 1e9/freq;
154 cmd->convert_src = TRIG_TIMER;
155 cmd->convert_arg = 1;
157 cmd->scan_end_src = TRIG_COUNT;
158 cmd->scan_end_arg = n_chan;
160 cmd->stop_src = TRIG_NONE;
163 cmd->chanlist = chanlist;
164 cmd->chanlist_len = n_chan;