2
* poll.c - Example of using comedi_poll() with Comedi
5
* Copyright (c) 1999,2000 David A. Schleef <ds@schleef.org>
7
* This file may be freely modified, distributed, and combined with
8
* other software, as long as proper attribution is given in the
13
* An example for using comedi_poll() in asynchronous input,
14
* so you can ask the driver to pull samples that may be waiting
15
* on the board into the buffer (so they can be read).
19
#include <comedilib.h>
39
unsigned int chanlist[4];
43
void prepare_cmd(comedi_t *dev,comedi_cmd *cmd);
44
void do_cmd(comedi_t *dev,comedi_cmd *cmd);
46
#define sec_to_nsec(x) ((x)*1000000000)
47
#define sec_to_usec(x) ((x)*1000000)
48
#define sec_to_msec(x) ((x)*1000)
49
#define msec_to_nsec(x) ((x)*1000000)
50
#define msec_to_usec(x) ((x)*1000)
51
#define usec_to_nsec(x) ((x)*1000)
53
int main(int argc, char *argv[])
58
parse_options(argc,argv);
60
device = comedi_open(filename);
66
fcntl(comedi_fileno(device),F_SETFL,O_NONBLOCK);
68
for(i=0;i<n_chans;i++){
69
chanlist[i]=CR_PACK(channel+i,range,aref);
72
prepare_cmd(device,&cmd);
79
void do_cmd(comedi_t *dev,comedi_cmd *cmd)
85
struct timeval timeout;
87
ret=comedi_command_test(dev,cmd);
89
printf("test ret=%d\n",ret);
91
printf("errno=%d\n",errno);
92
comedi_perror("comedi_command_test");
98
ret=comedi_command_test(dev,cmd);
100
printf("test ret=%d\n",ret);
102
printf("errno=%d\n",errno);
103
comedi_perror("comedi_command_test");
107
dump_cmd(stdout,cmd);
109
ret=comedi_command(dev,cmd);
111
printf("ret=%d\n",ret);
113
printf("errno=%d\n",errno);
114
comedi_perror("comedi_command");
121
FD_SET(comedi_fileno(device),&rdset);
123
timeout.tv_usec = 50000;
124
ret = select(comedi_fileno(dev)+1,&rdset,NULL,NULL,&timeout);
125
//printf("select returned %d\n",ret);
130
printf("timeout, polling...\n");
131
ret = comedi_poll(device,0);
132
printf("poll returned %d\n",ret);
133
}else if(FD_ISSET(comedi_fileno(device),&rdset)){
134
/* comedi file descriptor became ready */
135
//printf("comedi file descriptor ready\n");
136
ret=read(comedi_fileno(dev),buf,sizeof(buf));
137
printf("read returned %d\n",ret);
148
//printf("read %d %d\n",ret,total);
149
for(i=0;i<ret/sizeof(sampl_t);i++){
150
printf("%d\n",buf[i]);
154
/* unknown file descriptor became ready */
155
printf("unknown file descriptor ready\n");
161
* This part of the demo measures channels 1, 2, 3, 4 at a rate of
162
* 10 khz, with the inter-sample time at 10 us (100 khz). The number
163
* of scans measured is 10. This is analogous to the old mode2
166
void prepare_cmd(comedi_t *dev,comedi_cmd *cmd)
168
memset(cmd,0,sizeof(*cmd));
170
/* the subdevice that the command is sent to */
171
cmd->subdev = subdevice;
176
/* each event requires a trigger, which is specified
177
by a source and an argument. For example, to specify
178
an external digital line 3 as a source, you would use
179
src=TRIG_EXT and arg=3. */
181
/* In this case, we specify using TRIG_NOW to start
182
* acquisition immediately when the command is issued.
183
* The argument of TRIG_NOW is "number of nsec after
184
* NOW", but no driver supports it yet. Also, no driver
185
* currently supports using a start_src other than
187
cmd->start_src = TRIG_NOW;
190
/* The timing of the beginning of each scan is controlled
191
* by scan_begin. TRIG_TIMER specifies that scan_start
192
* events occur periodically at a rate of scan_begin_arg
193
* nanoseconds between scans. */
194
cmd->scan_begin_src = TRIG_TIMER;
195
cmd->scan_begin_arg = msec_to_nsec(100);
197
/* The timing between each sample in a scan is controlled
198
* by convert. Like above, TRIG_TIMER specifies that
199
* convert events occur periodically at a rate of convert_arg
200
* nanoseconds between scans. */
201
cmd->convert_src = TRIG_TIMER;
202
cmd->convert_arg = msec_to_nsec(1);
204
/* The end of each scan is almost always specified using
205
* TRIG_COUNT, with the argument being the same as the
206
* number of channels in the chanlist. You could probably
207
* find a device that allows something else, but it would
209
cmd->scan_end_src = TRIG_COUNT;
210
cmd->scan_end_arg = n_chans; /* number of channels */
212
/* The end of acquisition is controlled by stop_src and
213
* stop_arg. The src will typically be TRIG_COUNT or
214
* TRIG_NONE. Specifying TRIG_COUNT will stop acquisition
215
* after stop_arg number of scans, or TRIG_NONE will
216
* cause acquisition to continue until stopped using
217
* comedi_cancel(). */
218
cmd->stop_src = TRIG_COUNT;
219
cmd->stop_arg = n_scans;
221
/* the channel list determined which channels are sampled.
222
In general, chanlist_len is the same as scan_end_arg. Most
223
boards require this. */
224
cmd->chanlist = chanlist;
225
cmd->chanlist_len = n_chans;