13 #include "comedi_test.h"
15 void probe_max_1chan(comedi_t *it,int s);
16 char *tobinary(char *s,int bits,int n);
17 char *cmd_src(int src,char *buf);
18 int count_bits(unsigned int bits);
20 int test_cmd_no_cmd(void)
25 if(comedi_get_subdevice_flags(device,subdevice)&SDF_CMD){
26 printf("not applicable\n");
30 ret = comedi_get_cmd_src_mask(device,subdevice,&cmd);
33 printf("got EIO, good\n");
35 printf("E: comedi_get_cmd_src_mask: %s\n",
39 printf("E: comedi_get_cmd_src_mask returned %d\n",ret);
45 int test_cmd_probe_src_mask(void)
51 if(!(comedi_get_subdevice_flags(device,subdevice)&SDF_CMD)){
52 printf("not applicable\n");
58 ret = comedi_get_cmd_src_mask(device,subdevice,&cmd);
60 printf("E: comedi_get_cmd_src_mask failed %s\n",
64 printf("command source mask:\n");
65 printf(" start: %s\n",cmd_src(cmd.start_src,buf));
66 printf(" scan_begin: %s\n",cmd_src(cmd.scan_begin_src,buf));
67 printf(" convert: %s\n",cmd_src(cmd.convert_src,buf));
68 printf(" scan_end: %s\n",cmd_src(cmd.scan_end_src,buf));
69 printf(" stop: %s\n",cmd_src(cmd.stop_src,buf));
74 int test_cmd_probe_fast_1chan(void)
79 if(!(comedi_get_subdevice_flags(device,subdevice)&SDF_CMD)){
80 printf("not applicable\n");
84 printf("command fast 1chan:\n");
85 if(comedi_get_cmd_generic_timed(device,subdevice, &cmd, 1, 1)<0){
86 printf(" not supported\n");
89 printf(" start: %s %d\n",
90 cmd_src(cmd.start_src,buf),cmd.start_arg);
91 printf(" scan_begin: %s %d\n",
92 cmd_src(cmd.scan_begin_src,buf),cmd.scan_begin_arg);
93 printf(" convert: %s %d\n",
94 cmd_src(cmd.convert_src,buf),cmd.convert_arg);
95 printf(" scan_end: %s %d\n",
96 cmd_src(cmd.scan_end_src,buf),cmd.scan_end_arg);
97 printf(" stop: %s %d\n",
98 cmd_src(cmd.stop_src,buf),cmd.stop_arg);
105 int test_cmd_read_fast_1chan(void)
109 unsigned int chanlist[1];
113 unsigned int flags = comedi_get_subdevice_flags(device,subdevice);
115 if(!(flags&SDF_CMD) || (comedi_get_read_subdevice(device)!=subdevice)){
116 printf("not applicable\n");
120 if(comedi_get_cmd_generic_timed(device, subdevice, &cmd, 1, 1)<0){
121 printf(" not supported\n");
125 if(realtime)cmd.flags |= TRIG_RT;
126 cmd.chanlist = chanlist;
127 cmd.scan_end_arg = 1;
128 cmd.stop_arg = 100000;
129 cmd.chanlist_len = 1;
130 chanlist[0] = CR_PACK(0,0,0);
132 comedi_command(device,&cmd);
136 ret = read(comedi_fileno(device),buf,BUFSZ);
148 if(verbose)printf("read %d %d\n",ret,total);
155 int test_cmd_write_fast_1chan(void)
159 unsigned int chanlist[1];
163 unsigned int flags = comedi_get_subdevice_flags(device,subdevice);
164 static const int num_samples = 100000;
168 if((flags & SDF_LSAMPL))
170 num_bytes = num_samples * sizeof(lsampl_t);
173 num_bytes = num_samples * sizeof(sampl_t);
175 if(!(flags&SDF_CMD) || (comedi_get_write_subdevice(device)!=subdevice)){
176 printf("not applicable\n");
180 if(comedi_get_cmd_generic_timed(device, subdevice, &cmd, 1, 1)<0){
181 printf(" not supported\n");
184 cmd.flags |= CMDF_WRITE;
186 if(realtime)cmd.flags |= TRIG_RT;
187 cmd.chanlist = chanlist;
188 cmd.scan_end_arg = 1;
189 cmd.stop_arg = num_samples;
190 cmd.chanlist_len = 1;
191 chanlist[0] = CR_PACK(0,0,0);
195 ret = comedi_command(device,&cmd);
197 perror("comedi_command");
202 wc = num_bytes-total;
206 ret = write(comedi_fileno(device), buf, wc);
216 if(verbose)printf("write %d %d\n",ret,total);
219 ret = comedi_internal_trigger(device, subdevice, 0);
221 comedi_perror("E: comedi_internal_trigger");
222 comedi_cancel(device, subdevice);
225 if(verbose)printf("inttrig\n");
227 go=(total<num_bytes);
229 wc = num_bytes-total;
233 ret = write(comedi_fileno(device),buf,wc);
245 if(verbose)printf("write %d %d\n",ret,total);
246 //deal with case where output doesn't support stop_src=TRIG_COUNT
247 if(total >= num_bytes)
253 // make sure all samples have been written out
256 int flags = comedi_get_subdevice_flags(device,subdevice);
259 printf("E: comedi_get_subdevice_flags returned %i\n", flags);
262 if((flags & SDF_RUNNING) == 0){
267 // cancel needed in the case of stop_src==TRIG_NONE
268 if(comedi_cancel(device, subdevice))
269 printf("E: comedi_cancel() failed");
273 int test_cmd_logic_bug(void)
279 if(!(comedi_get_subdevice_flags(device,subdevice)&SDF_CMD)){
280 printf("not applicable\n");
286 ret = comedi_get_cmd_src_mask(device,subdevice,&cmd);
288 printf("E: comedi_get_cmd_src_mask failed\n");
292 if(count_bits(cmd.start_src)>1){ cmd.start_src=0; ok=1; }
293 if(count_bits(cmd.scan_begin_src)>1){ cmd.scan_begin_src=0; ok=1; }
294 if(count_bits(cmd.convert_src)>1){ cmd.convert_src=0; ok=1; }
295 if(count_bits(cmd.scan_end_src)>1){ cmd.scan_end_src=0; ok=1; }
296 if(count_bits(cmd.stop_src)>1){ cmd.stop_src=0; ok=1; }
299 printf("not applicable (no source choices)\n");
303 ret = comedi_command_test(device,&cmd);
305 printf("E: command_test returned %d, expected 1, (allowed src==0)\n",ret);
307 printf("command_test returned %d, good\n",ret);
313 int count_bits(unsigned int bits)
323 char *tobinary(char *s,int bits,int n)
329 *t++=(bits&bit)?'1':'0';
335 char *cmd_src(int src,char *buf)
339 if(src&TRIG_NONE)strcat(buf,"none|");
340 if(src&TRIG_NOW)strcat(buf,"now|");
341 if(src&TRIG_FOLLOW)strcat(buf,"follow|");
342 if(src&TRIG_TIME)strcat(buf,"time|");
343 if(src&TRIG_TIMER)strcat(buf,"timer|");
344 if(src&TRIG_COUNT)strcat(buf,"count|");
345 if(src&TRIG_EXT)strcat(buf,"ext|");
346 if(src&TRIG_INT)strcat(buf,"int|");
349 sprintf(buf,"unknown(0x%02x)",src);
351 buf[strlen(buf)-1]=0;