added
[comedilib.git] / demo / sigio.c
1 /*
2  * SIGIO example
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 #define _GNU_SOURCE
13
14 #include <stdio.h>
15 #include <comedilib.h>
16 #include <fcntl.h>
17 #include <unistd.h>
18 #include <errno.h>
19 #include <getopt.h>
20 #include <ctype.h>
21 #include <signal.h>
22 #include <string.h>
23 #include <sys/time.h>
24 #include "examples.h"
25
26 comedi_t *device;
27
28
29 void print_time(void);
30
31 void sigio_handler(int sig)
32 {
33         print_time();
34 }
35
36 void print_time(void)
37 {
38         struct timeval tv;
39         static struct timeval oldtime={0};
40         int dsec,dusec;
41
42         gettimeofday(&tv,NULL);
43
44         dsec=tv.tv_sec-oldtime.tv_sec;
45         dusec=tv.tv_usec-oldtime.tv_usec;
46         if(dusec<0){
47                 dsec--;
48                 dusec+=1000000;
49         }
50         printf("%d.%06d +%d.%06d\n",(int)tv.tv_sec,(int)tv.tv_usec,dsec,dusec);
51
52         oldtime=tv;
53 }
54
55 int out_subd;
56
57 void config_output(void)
58 {
59         int i;
60
61         for(i=0;i<8;i++){
62                 comedi_dio_config(device,out_subd,i,COMEDI_OUTPUT);
63         }
64 }
65
66 int count;
67
68 #define BUFSZ 1024
69 sampl_t buf[BUFSZ];
70
71 void do_cmd_1(comedi_t *dev);
72 void do_cmd_2(comedi_t *dev);
73 void do_cmd(comedi_t *dev,comedi_cmd *cmd);
74
75 int main(int argc, char *argv[])
76 {
77         char *fn = NULL;
78         comedi_t *dev;
79         struct sigaction sa;
80         int ret;
81         sigset_t sigset;
82         int flags;
83
84         //fn = "/dev/comedi1";
85         fn = "/dev/comedi0";
86
87         dev = comedi_open(fn);
88         if(!dev){
89                 perror(fn);
90                 exit(1);
91         }
92         device = dev;
93
94         subdevice = 0;
95         out_subd = 2;
96
97         config_output();
98
99         fcntl(comedi_fileno(dev),F_SETOWN,getpid());
100         flags = fcntl(comedi_fileno(dev),F_GETFL);
101         ret = fcntl(comedi_fileno(dev),F_SETFL,flags|O_ASYNC);
102         //ret = fcntl(comedi_fileno(dev),F_SETFL,O_NONBLOCK|O_ASYNC);
103         if(ret<0)perror("fcntl");
104
105         memset(&sa,0,sizeof(sa));
106         sa.sa_handler = &sigio_handler;
107         ret = sigaction(SIGIO,&sa,NULL);
108         if(ret<0)perror("sigaction");
109
110         sigemptyset(&sigset);
111         sigaddset(&sigset,SIGIO);
112         ret = sigprocmask(SIG_UNBLOCK,&sigset,NULL);
113         if(ret<0)perror("sigprocmask");
114
115 #if 0
116         {
117         struct sched_param p;
118         memset(&p,0,sizeof(p));
119         p.sched_priority = 1;
120         ret = sched_setscheduler(0,SCHED_FIFO,&p);
121         if(ret<0)perror("sched_setscheduler");
122         }
123 #endif
124
125         do_cmd_1(dev);
126
127         return 0;
128 }
129
130 void do_cmd(comedi_t *dev,comedi_cmd *cmd)
131 {
132         int total=0;
133         int ret;
134         int go;
135
136         ret=comedi_command_test(dev,cmd);
137
138         printf("test ret=%d\n",ret);
139         if(ret<0){
140                 printf("errno=%d\n",errno);
141                 comedi_perror("comedi_command_test");
142                 return;
143         }
144
145         dump_cmd(stdout,cmd);
146
147         ret=comedi_command_test(dev,cmd);
148
149         printf("test ret=%d\n",ret);
150         if(ret<0){
151                 printf("errno=%d\n",errno);
152                 comedi_perror("comedi_command_test");
153                 return;
154         }
155
156         dump_cmd(stdout,cmd);
157
158         ret=comedi_command(dev,cmd);
159
160         printf("ret=%d\n",ret);
161         if(ret<0){
162                 printf("errno=%d\n",errno);
163                 comedi_perror("comedi_command");
164                 return;
165         }
166
167         go=1;
168         while(go){
169                 ret=read(comedi_fileno(dev),buf,BUFSZ);
170                 if(ret<0){
171                         if(errno==EAGAIN){
172                                 printf("EAGAIN\n");
173                                 usleep(10000);
174                         }else{
175                                 go = 0;
176                                 perror("read");
177                         }
178                 }else if(ret==0){
179                         go = 0;
180                 }else{
181                         //int i;
182
183                         total+=ret;
184                         //printf("read %d %d\n",ret,total);
185                         //printf("count = %d\n",count);
186                         //print_time();
187                 }
188         }
189 }
190
191 unsigned int chanlist[0];
192 /*
193  * This part of the demo measures channels 1, 2, 3, 4 at a rate of
194  * 10 khz, with the inter-sample time at 10 us (100 khz).  The number
195  * of scans measured is 10.  This is analogous to the old mode2
196  * acquisition.
197  */
198 void do_cmd_1(comedi_t *dev)
199 {
200         comedi_cmd cmd;
201
202         memset(&cmd,0,sizeof(cmd));
203
204         /* the subdevice that the command is sent to */
205         cmd.subdev =    subdevice;
206
207         /* flags */
208         cmd.flags =     TRIG_WAKE_EOS;
209
210         cmd.start_src =         TRIG_NOW;
211         cmd.start_arg =         0;
212
213         cmd.scan_begin_src =    TRIG_TIMER;
214         cmd.scan_begin_arg =    msec_to_nsec(100);
215
216 #if 1
217         cmd.convert_src =       TRIG_TIMER;
218         cmd.convert_arg =       1;
219 #else
220         cmd.convert_src =       TRIG_ANY;
221         cmd.convert_arg =       0;
222 #endif
223
224         cmd.scan_end_src =      TRIG_COUNT;
225         cmd.scan_end_arg =      1;
226
227         cmd.stop_src =          TRIG_NONE;
228         cmd.stop_arg =          0;
229
230         cmd.chanlist =          chanlist;
231         cmd.chanlist_len =      1;
232
233         chanlist[0]=CR_PACK(0,0,0);
234
235         do_cmd(dev,&cmd);
236 }
237