mmap demo and testing
[comedilib.git] / testing / mmap.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 <sys/mman.h>
14 #include "comedi_test.h"
15
16 static int comedi_get_cmd_fast_1chan(comedi_t *it,unsigned int s,comedi_cmd *cmd);
17
18 #define N_SAMPLES 10000
19
20 #define BUFSZ N_SAMPLES*sizeof(sampl_t)
21
22 #define MAPLEN 20480
23
24 int test_mmap(void)
25 {
26         comedi_cmd cmd;
27         char buf[BUFSZ];
28         unsigned int chanlist[1];
29         int go;
30         int total=0;
31         int ret;
32         void *b;
33         sampl_t *map;
34
35         if(comedi_get_cmd_fast_1chan(device,subdevice,&cmd)<0){
36                 printf("  not supported\n");
37                 return 0;
38         }
39
40         map=mmap(NULL,MAPLEN,PROT_READ,MAP_SHARED,comedi_fileno(device),0);
41         if(!map){
42                 printf("E: mmap() failed\n");
43                 return 0;
44         }
45
46         cmd.chanlist = chanlist;
47         cmd.scan_end_arg = 1;
48         cmd.stop_arg = N_SAMPLES;
49         cmd.chanlist_len = 1;
50         chanlist[0] = CR_PACK(0,0,0);
51
52         comedi_command(device,&cmd);
53
54         go=1;
55         b=buf;
56         while(go){
57                 ret = read(comedi_fileno(device),b,BUFSZ);
58                 if(ret<0){
59                         if(errno==EAGAIN){
60                                 usleep(10000);
61                         }else{
62                                 go = 0;
63                                 perror("read");
64                         }
65                 }else if(ret==0){
66                         go = 0;
67                 }else{
68                         total += ret;
69                         b += ret;
70                         printf("read %d %d\n",ret,total);
71                 }
72         }
73         if(memcmp(buf,map,total)){
74                 printf("E: mmap compare failed\n");
75         }else{
76                 printf("compare ok\n");
77         }
78         munmap(map,MAPLEN);
79
80         return 0;
81 }
82
83 static int comedi_get_cmd_src_mask(comedi_t *it,unsigned int s,comedi_cmd *cmd)
84 {
85         memset(cmd,0,sizeof(*cmd));
86
87         cmd->subdev = s;
88
89         cmd->flags = 0;
90
91         cmd->start_src = TRIG_ANY;
92         cmd->scan_begin_src = TRIG_ANY;
93         cmd->convert_src = TRIG_ANY;
94         cmd->scan_end_src = TRIG_ANY;
95         cmd->stop_src = TRIG_ANY;
96
97         return comedi_command_test(it,cmd);
98 }
99
100
101 static int comedi_get_cmd_fast_1chan(comedi_t *it,unsigned int s,comedi_cmd *cmd)
102 {
103         int ret;
104
105         ret = comedi_get_cmd_src_mask(it,s,cmd);
106         if(ret<0)return ret;
107
108         cmd->chanlist_len = 1;
109
110         cmd->scan_end_src = TRIG_COUNT;
111         cmd->scan_end_arg = 1;
112
113         if(cmd->convert_src&TRIG_TIMER){
114                 if(cmd->scan_begin_src&TRIG_FOLLOW){
115                         cmd->convert_src = TRIG_TIMER;
116                         cmd->scan_begin_src = TRIG_FOLLOW;
117                 }else{
118                         cmd->convert_src = TRIG_TIMER;
119                         cmd->scan_begin_src = TRIG_TIMER;
120                 }
121         }else{
122                 printf("can't do timed?!?\n");
123                 return -1;
124         }
125         if(cmd->stop_src&TRIG_COUNT){
126                 cmd->stop_src=TRIG_COUNT;
127                 cmd->stop_arg=2;
128         }else if(cmd->stop_src&TRIG_NONE){
129                 cmd->stop_src=TRIG_NONE;
130                 cmd->stop_arg=0;
131         }else{
132                 printf("can't find a good stop_src\n");
133                 return -1;
134         }
135
136         ret=comedi_command_test(it,cmd);
137         if(ret==3){
138                 /* good */
139                 ret=comedi_command_test(it,cmd);
140         }
141         if(ret==4 || ret==0){
142                 return 0;
143         }
144         return -1;
145 }
146