Removed usbdux_firmware.lst because it's just the listing of the assembler which...
[comedilib.git] / demo / mmap.c
1 /*
2  * Example of using commands - asynchronous input
3  * Part of Comedilib
4  *
5  * Copyright (c) 1999,2000 David A. Schleef <ds@schleef.org>
6  *
7  * This file may be freely modified, distributed, and combined with
8  * other software, as long as proper attribution is given in the
9  * source code.
10  */
11
12 /*
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.
16  */
17
18 #include <stdio.h>
19 #include <comedilib.h>
20 #include <fcntl.h>
21 #include <unistd.h>
22 #include <stdlib.h>
23 #include <errno.h>
24 #include <unistd.h>
25 #include <sys/mman.h>
26 #include <string.h>
27 #include "examples.h"
28
29 unsigned int chanlist[256];
30
31 void *map;
32
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);
35
36
37 int main(int argc, char *argv[])
38 {
39         comedi_t *dev;
40         comedi_cmd c,*cmd=&c;
41         int size;
42         int front, back;
43         int ret;
44         int i;
45
46         parse_options(argc,argv);
47
48         dev = comedi_open(filename);
49         if(!dev){
50                 comedi_perror(filename);
51                 exit(1);
52         }
53
54         size = comedi_get_buffer_size(dev,subdevice);
55         fprintf(stderr,"buffer size is %d\n",size);
56
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 ){
60                 perror( "mmap" );
61                 exit(1);
62         }
63
64         for(i=0;i<n_chan;i++){
65                 chanlist[i]=CR_PACK(channel+i,range,aref);
66         }
67
68         //prepare_cmd_lib(dev,subdevice,cmd);
69         prepare_cmd(dev,subdevice,cmd);
70         
71         ret = comedi_command_test(dev,cmd);
72
73         ret = comedi_command_test(dev,cmd);
74
75         if(ret!=0){
76                 fprintf(stderr,"command_test failed\n");
77                 exit(1);
78         }
79
80         dump_cmd(stderr,cmd);
81
82         ret = comedi_command(dev,cmd);
83         if(ret<0){
84                 comedi_perror("comedi_command");
85                 exit(1);
86         }
87
88         front = 0;
89         back = 0;
90         while(1){
91                 front += comedi_get_buffer_contents(dev,subdevice);
92                 if(verbose)fprintf(stderr,"front = %d, back = %d\n",front,back);
93                 if(front<back)break;
94                 if(front==back){
95                         //comedi_poll(dev,subdevice);
96                         usleep(10000);
97                         continue;
98                 }
99
100                 for(i=back;i<front;i+=sizeof(sampl_t)){
101                         static int col = 0;
102                         printf("%d ",*(sampl_t *)(map+(i%size)));
103                         col++;
104                         if(col==n_chan){
105                                 printf("\n");
106                                 col=0;
107                         }
108                 }
109
110                 ret = comedi_mark_buffer_read(dev,subdevice,front-back);
111                 if(ret<0){
112                         comedi_perror("comedi_mark_buffer_read");
113                         break;
114                 }
115                 back = front;
116         }
117
118         return 0;
119 }
120
121 int prepare_cmd_lib(comedi_t *dev,int subdevice,comedi_cmd *cmd)
122 {
123         int ret;
124
125         ret = comedi_get_cmd_generic_timed(dev,subdevice,cmd,1e9/freq);
126         if(ret<0){
127                 comedi_perror("comedi_get_cmd_generic_timed\n");
128                 return ret;
129         }
130
131         cmd->chanlist = chanlist;
132         cmd->chanlist_len = n_chan;
133         cmd->scan_end_arg = n_chan;
134
135         if(cmd->stop_src==TRIG_COUNT)cmd->stop_arg = n_scan;
136
137         return 0;
138 }
139
140 int prepare_cmd(comedi_t *dev,int subdevice,comedi_cmd *cmd)
141 {
142         memset(cmd,0,sizeof(*cmd));
143
144         cmd->subdev = subdevice;
145
146         cmd->flags = 0;
147
148         cmd->start_src = TRIG_NOW;
149         cmd->start_arg = 0;
150
151         cmd->scan_begin_src = TRIG_TIMER;
152         cmd->scan_begin_arg = 1e9/freq;
153
154         cmd->convert_src = TRIG_TIMER;
155         cmd->convert_arg = 1;
156
157         cmd->scan_end_src = TRIG_COUNT;
158         cmd->scan_end_arg = n_chan;
159
160         cmd->stop_src = TRIG_NONE;
161         cmd->stop_arg = 0;
162
163         cmd->chanlist = chanlist;
164         cmd->chanlist_len = n_chan;
165
166         return 0;
167 }
168
169
170