added get_subdevice_flags()
[comedilib.git] / testing / select.c
1
2 #include <stdio.h>
3 #include <comedilib.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <sys/ioctl.h>
7 #include <errno.h>
8 #include <getopt.h>
9 #include <ctype.h>
10 #include <math.h>
11 #include <sys/time.h>
12 #include <string.h>
13 #include "comedi_test.h"
14
15 static int comedi_get_cmd_src_mask(comedi_t *it,unsigned int s,comedi_cmd *cmd);
16 static int comedi_get_cmd_fast_1chan(comedi_t *it,unsigned int s,comedi_cmd *cmd);
17
18 #define BUFSZ 10000
19
20 int test_read_select(void)
21 {
22         comedi_cmd cmd;
23         char buf[BUFSZ];
24         unsigned int chanlist[1];
25         int go;
26         int total=0;
27         int ret;
28         int chunks=0;
29         int length=100000;
30         fd_set rdset;
31         struct timeval timeout;
32
33         if(comedi_get_cmd_fast_1chan(device,subdevice,&cmd)<0){
34                 printf("  not supported\n");
35                 return 0;
36         }
37
38         cmd.chanlist = chanlist;
39         cmd.scan_end_arg = 1;
40         cmd.stop_arg = length;
41         cmd.chanlist_len = 1;
42         chanlist[0] = CR_PACK(0,0,0);
43
44         //fcntl(comedi_fileno(device),F_SETFL,O_NONBLOCK);
45
46         comedi_command(device,&cmd);
47
48         go=1;
49         while(go){
50                 FD_ZERO(&rdset);
51                 FD_SET(comedi_fileno(device),&rdset);
52                 timeout.tv_sec = 0;
53                 timeout.tv_usec = 10000;
54                 ret = select(comedi_fileno(device)+1,&rdset,NULL,NULL,&timeout);
55                 if(ret<0){
56                         perror("select");
57                 }else if(ret==0){
58                         if(verbose)printf("timeout\n");
59                 }else{
60                         ret = read(comedi_fileno(device),buf,BUFSZ);
61                         if(verbose)printf("read==%d\n",ret);
62                         if(ret<0){
63                                 if(errno==EAGAIN){
64                                         printf("E: got EAGAIN!\n");
65                                 }else{
66                                         go = 0;
67                                         perror("read");
68                                 }
69                         }else if(ret==0){
70                                 go = 0;
71                         }else{
72                                 total += ret;
73                                 chunks++;
74                         }
75                 }
76         }
77
78         return 0;
79 }
80
81 static int comedi_get_cmd_src_mask(comedi_t *it,unsigned int s,comedi_cmd *cmd)
82 {
83         memset(cmd,0,sizeof(*cmd));
84
85         cmd->subdev = s;
86
87         cmd->flags = 0;
88
89         cmd->start_src = TRIG_ANY;
90         cmd->scan_begin_src = TRIG_ANY;
91         cmd->convert_src = TRIG_ANY;
92         cmd->scan_end_src = TRIG_ANY;
93         cmd->stop_src = TRIG_ANY;
94
95         return comedi_command_test(it,cmd);
96 }
97
98
99 static int comedi_get_cmd_fast_1chan(comedi_t *it,unsigned int s,comedi_cmd *cmd)
100 {
101         int ret;
102
103         ret = comedi_get_cmd_src_mask(it,s,cmd);
104         if(ret<0)return ret;
105
106         cmd->chanlist_len = 1;
107
108         cmd->scan_end_src = TRIG_COUNT;
109         cmd->scan_end_arg = 1;
110
111         if(cmd->convert_src&TRIG_TIMER){
112                 if(cmd->scan_begin_src&TRIG_FOLLOW){
113                         cmd->convert_src = TRIG_TIMER;
114                         cmd->scan_begin_src = TRIG_FOLLOW;
115                 }else{
116                         cmd->convert_src = TRIG_TIMER;
117                         cmd->scan_begin_src = TRIG_TIMER;
118                 }
119         }else{
120                 printf("can't do timed?!?\n");
121                 return -1;
122         }
123         if(cmd->stop_src&TRIG_COUNT){
124                 cmd->stop_src=TRIG_COUNT;
125                 cmd->stop_arg=2;
126         }else if(cmd->stop_src&TRIG_NONE){
127                 cmd->stop_src=TRIG_NONE;
128                 cmd->stop_arg=0;
129         }else{
130                 printf("can't find a good stop_src\n");
131                 return -1;
132         }
133
134         ret=comedi_command_test(it,cmd);
135         if(ret==3){
136                 /* good */
137                 ret=comedi_command_test(it,cmd);
138         }
139         if(ret==4 || ret==0){
140                 return 0;
141         }
142         return -1;
143 }
144