fixing includes for exit(), memset() for gcc 2.96 compiler warnings
[comedilib.git] / testing / main.c
1 /*
2  */
3
4 #include <stdio.h>
5 #include <comedilib.h>
6 #include <fcntl.h>
7 #include <unistd.h>
8 #include <stdlib.h>
9 #include <sys/ioctl.h>
10 #include <errno.h>
11 #include <getopt.h>
12 #include <ctype.h>
13 #include <malloc.h>
14 #include <string.h>
15
16 #include "comedi_test.h"
17
18 char *filename="/dev/comedi0";
19 int verbose_flag;
20 comedi_t *device;
21
22 int subdevice;
23 int channel;
24 int aref;
25 int range;
26
27 int test_info(void);
28 int test_mode0_read(void);
29 int test_insn_read(void);
30 int test_insn_read_0(void);
31 int test_insn_read_time(void);
32 int test_cmd_no_cmd(void);
33 int test_cmd_probe_src_mask(void);
34 int test_cmd_probe_fast_1chan(void);
35 int test_cmd_read_fast_1chan(void);
36 int test_cmd_write_fast_1chan(void);
37 int test_cmd_logic_bug(void);
38 int test_cmd_fifo_depth_check(void);
39 int test_cmd_start_inttrig(void);
40 int test_mmap(void);
41 int test_read_select(void);
42 int test_cmd_continuous(void);
43 int test_bufconfig(void);
44
45 #define TEST_NEVER 0
46 #define TEST_STD 1
47
48 struct test_struct{
49         char *name;
50         int (*do_test)(void);
51         int flags;
52 };
53 struct test_struct tests[]={
54         { "info", test_info, TEST_STD },
55         { "mode0_read", test_mode0_read, TEST_NEVER },
56         { "insn_read", test_insn_read, TEST_STD },
57         { "insn_read_0", test_insn_read_0, TEST_STD },
58         { "insn_read_time", test_insn_read_time, TEST_STD },
59         { "cmd_no_cmd", test_cmd_no_cmd, TEST_STD },
60         { "cmd_probe_src_mask", test_cmd_probe_src_mask, TEST_STD },
61         { "cmd_probe_fast_1chan", test_cmd_probe_fast_1chan, TEST_STD },
62         { "cmd_read_fast_1chan", test_cmd_read_fast_1chan, TEST_STD },
63         { "cmd_write_fast_1chan", test_cmd_write_fast_1chan, TEST_STD },
64         { "cmd_logic_bug", test_cmd_logic_bug, TEST_STD },
65         { "cmd_fifo_depth_check", test_cmd_fifo_depth_check, TEST_STD },
66         { "cmd_start_inttrig", test_cmd_start_inttrig, TEST_STD },
67         { "mmap", test_mmap, TEST_STD },
68         { "read_select", test_read_select, TEST_STD },
69         { "cmd_continuous", test_cmd_continuous, TEST_NEVER },
70         { "bufconfig", test_bufconfig, TEST_STD },
71 };
72 static int n_tests = sizeof(tests)/sizeof(tests[0]);
73
74 int only_subdevice;
75 int verbose;
76 char *only_test;
77 int realtime;
78
79 static void get_capabilities(unsigned int subd);
80 static void print_device_info(void);
81
82 void help(int ret)
83 {
84         int i;
85
86         fprintf(stderr,
87 "comedi_test [options]\n"
88 "  --device, -f <device_file>   Use device <device_file>\n"
89 "  --realtime, -r               Use real-time interrupts, if available\n"
90 "  --subdevice, -s <index>      Only test subdevice <index>\n"
91 "  --test, -t <test>            Only run test <test>\n"
92 "  --verbose, -v                Be verbose\n"
93 "  --help, -h                   Print this message\n"
94 "Available tests: ");
95         for(i=0;i<n_tests;i++){
96                 fprintf(stderr,"%s ",tests[i].name);
97         }
98         fprintf(stderr,"\n");
99
100         exit(ret);
101 }
102
103 static struct option longopts[]={
104         { "device", 1, 0, 'f' },
105         { "realtime", 0, 0, 'r' },
106         { "subdevice", 1, 0, 's' },
107         { "test", 1, 0, 't' },
108         { "verbose", 0, 0, 'v' },
109         { "help", 0, 0, 'h' },
110         {0}
111 };
112
113 int main(int argc, char *argv[])
114 {
115         int c;
116         int i;
117
118         setvbuf(stdout,NULL,_IONBF,0);
119
120         while (1) {
121                 c = getopt_long(argc, argv, "f:rs:t:v", longopts, NULL);
122                 if (c == -1)
123                         break;
124                 switch (c) {
125                 case 'f':
126                         filename = optarg;
127                         break;
128                 case 'r':
129                         realtime = 1;
130                         break;
131                 case 's':
132                         only_subdevice = 1;
133                         sscanf(optarg,"%d",&subdevice);
134                         break;
135                 case 't':
136                         only_test = optarg;
137                         break;
138                 case 'h':
139                         help(0);
140                         break;
141                 case 'v':
142                         verbose = 1;
143                         break;
144                 default:
145                         help(1);
146                         break;
147                 }
148         }
149
150         device = comedi_open(filename);
151         if(!device){
152                 printf("E: comedi_open(\"%s\"): %s\n",filename,strerror(errno));
153                 exit(1);
154         }
155
156         print_device_info();
157
158         for(;subdevice<comedi_get_n_subdevices(device);subdevice++){
159                 printf("I:\n");
160                 printf("I: subdevice %d\n",subdevice);
161                 get_capabilities(subdevice);
162                 if(only_test){
163                         for(i=0;i<n_tests;i++){
164                                 if(!strcmp(tests[i].name,only_test)){
165                                         printf("I: testing %s...\n",tests[i].name);
166                                         tests[i].do_test();
167                                 }
168                         }
169                 }else{
170                         for(i=0;i<n_tests;i++){
171                                 if(tests[i].flags&TEST_STD){
172                                         printf("I: testing %s...\n",tests[i].name);
173                                         tests[i].do_test();
174                                 }
175                         }
176                 }
177                 if(only_subdevice)break;
178         }
179
180         return 0;
181 }
182
183 unsigned int capabilities;
184
185 static void get_capabilities(unsigned int subd)
186 {
187         int type;
188         int flags;
189
190         capabilities = 0;
191
192         type = comedi_get_subdevice_type(device,subd);
193
194         flags = comedi_get_subdevice_flags(device,subd);
195
196 }
197
198 static void print_device_info(void)
199 {
200         int vers = comedi_get_version_code(device);
201
202         printf("I: Comedi version: %d.%d.%d\n",(vers>>16)&0xff,
203                 (vers>>8)&0xff,vers&0xff);
204         printf("I: Comedilib version: unknown =)\n");
205         printf("I: driver name: %s\n",comedi_get_driver_name(device));
206         printf("I: device name: %s\n",comedi_get_board_name(device));
207 }
208
209
210