2000-02-02 05:14:23 +00:00
|
|
|
/*
|
2000-10-19 06:28:27 +00:00
|
|
|
* This is a little helper function to parse options that
|
|
|
|
* are common to most of the examples.
|
2000-02-02 05:14:23 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <comedilib.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <getopt.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <malloc.h>
|
2001-03-01 21:57:00 +00:00
|
|
|
#include <string.h>
|
2001-07-14 00:50:52 +00:00
|
|
|
#include <stdlib.h>
|
2000-10-19 06:28:27 +00:00
|
|
|
#include "examples.h"
|
2000-02-02 05:14:23 +00:00
|
|
|
|
2007-01-03 21:14:53 +00:00
|
|
|
static char * const default_filename = "/dev/comedi0";
|
2000-02-02 05:14:23 +00:00
|
|
|
|
2007-01-03 21:14:53 +00:00
|
|
|
void init_parsed_options(struct parsed_options *options)
|
|
|
|
{
|
|
|
|
memset(options, 0, sizeof(struct parsed_options));
|
|
|
|
options->filename = default_filename;
|
|
|
|
options->aref = AREF_GROUND;
|
|
|
|
options->n_chan = 4;
|
|
|
|
options->n_scan = 1000;
|
|
|
|
options->freq = 1000.0;
|
|
|
|
options->physical = 0;
|
|
|
|
options->value = 0.;
|
|
|
|
}
|
2000-02-02 05:14:23 +00:00
|
|
|
|
2007-01-03 21:14:53 +00:00
|
|
|
int parse_options(struct parsed_options *options, int argc, char *argv[])
|
2000-02-02 05:14:23 +00:00
|
|
|
{
|
|
|
|
int c;
|
|
|
|
|
2006-07-20 11:51:54 +00:00
|
|
|
while (-1 != (c = getopt(argc, argv, "a:c:s:r:f:n:N:F:pvdgom"))) {
|
2000-02-02 05:14:23 +00:00
|
|
|
switch (c) {
|
|
|
|
case 'f':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->filename = optarg;
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 's':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->subdevice = strtoul(optarg, NULL, 0);
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'c':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->channel = strtoul(optarg, NULL, 0);
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'a':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->aref = strtoul(optarg, NULL, 0);
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'r':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->range = strtoul(optarg, NULL, 0);
|
2001-07-14 00:50:52 +00:00
|
|
|
break;
|
|
|
|
case 'n':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->n_chan = strtoul(optarg, NULL, 0);
|
2001-07-14 00:50:52 +00:00
|
|
|
break;
|
|
|
|
case 'N':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->n_scan = strtoul(optarg, NULL, 0);
|
2001-07-14 00:50:52 +00:00
|
|
|
break;
|
|
|
|
case 'F':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->freq = strtod(optarg, NULL);
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
2006-07-20 11:51:54 +00:00
|
|
|
case 'p':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->physical = 1;
|
2006-07-20 11:51:54 +00:00
|
|
|
break;
|
2000-02-02 05:14:23 +00:00
|
|
|
case 'v':
|
2007-01-03 21:14:53 +00:00
|
|
|
++options->verbose;
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'd':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->aref = AREF_DIFF;
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'g':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->aref = AREF_GROUND;
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'o':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->aref = AREF_OTHER;
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
case 'm':
|
2007-01-03 21:14:53 +00:00
|
|
|
options->aref = AREF_COMMON;
|
2000-02-02 05:14:23 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
printf("bad option\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
2000-05-27 00:55:34 +00:00
|
|
|
if(optind < argc) {
|
|
|
|
/* data value */
|
2007-01-03 21:14:53 +00:00
|
|
|
options->value = strtod(argv[optind++], NULL);
|
2000-05-27 00:55:34 +00:00
|
|
|
}
|
2000-02-02 05:14:23 +00:00
|
|
|
|
|
|
|
return argc;
|
|
|
|
}
|
|
|
|
|
2001-03-01 21:57:00 +00:00
|
|
|
char *cmd_src(int src,char *buf)
|
|
|
|
{
|
|
|
|
buf[0]=0;
|
|
|
|
|
|
|
|
if(src&TRIG_NONE)strcat(buf,"none|");
|
|
|
|
if(src&TRIG_NOW)strcat(buf,"now|");
|
|
|
|
if(src&TRIG_FOLLOW)strcat(buf, "follow|");
|
|
|
|
if(src&TRIG_TIME)strcat(buf, "time|");
|
|
|
|
if(src&TRIG_TIMER)strcat(buf, "timer|");
|
|
|
|
if(src&TRIG_COUNT)strcat(buf, "count|");
|
|
|
|
if(src&TRIG_EXT)strcat(buf, "ext|");
|
|
|
|
if(src&TRIG_INT)strcat(buf, "int|");
|
2001-07-14 00:50:52 +00:00
|
|
|
#ifdef TRIG_OTHER
|
|
|
|
if(src&TRIG_OTHER)strcat(buf, "other|");
|
|
|
|
#endif
|
2001-03-01 21:57:00 +00:00
|
|
|
|
|
|
|
if(strlen(buf)==0){
|
2001-07-14 00:50:52 +00:00
|
|
|
sprintf(buf,"unknown(0x%08x)",src);
|
2001-03-01 21:57:00 +00:00
|
|
|
}else{
|
|
|
|
buf[strlen(buf)-1]=0;
|
|
|
|
}
|
2000-02-02 05:14:23 +00:00
|
|
|
|
2001-03-01 21:57:00 +00:00
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
|
2001-07-14 00:50:52 +00:00
|
|
|
void dump_cmd(FILE *out,comedi_cmd *cmd)
|
2001-03-01 21:57:00 +00:00
|
|
|
{
|
|
|
|
char buf[100];
|
|
|
|
|
2001-07-14 00:50:52 +00:00
|
|
|
fprintf(out,"start: %-8s %d\n",
|
2001-03-01 21:57:00 +00:00
|
|
|
cmd_src(cmd->start_src,buf),
|
|
|
|
cmd->start_arg);
|
|
|
|
|
2001-07-14 00:50:52 +00:00
|
|
|
fprintf(out,"scan_begin: %-8s %d\n",
|
2001-03-01 21:57:00 +00:00
|
|
|
cmd_src(cmd->scan_begin_src,buf),
|
|
|
|
cmd->scan_begin_arg);
|
|
|
|
|
2001-07-14 00:50:52 +00:00
|
|
|
fprintf(out,"convert: %-8s %d\n",
|
2001-03-01 21:57:00 +00:00
|
|
|
cmd_src(cmd->convert_src,buf),
|
|
|
|
cmd->convert_arg);
|
|
|
|
|
2001-07-14 00:50:52 +00:00
|
|
|
fprintf(out,"scan_end: %-8s %d\n",
|
2001-03-01 21:57:00 +00:00
|
|
|
cmd_src(cmd->scan_end_src,buf),
|
|
|
|
cmd->scan_end_arg);
|
|
|
|
|
2001-07-14 00:50:52 +00:00
|
|
|
fprintf(out,"stop: %-8s %d\n",
|
2001-03-01 21:57:00 +00:00
|
|
|
cmd_src(cmd->stop_src,buf),
|
|
|
|
cmd->stop_arg);
|
|
|
|
}
|
2000-02-02 05:14:23 +00:00
|
|
|
|
2007-01-08 21:53:59 +00:00
|
|
|
int arm(comedi_t *device, unsigned subdevice, lsampl_t source)
|
|
|
|
{
|
|
|
|
comedi_insn insn;
|
|
|
|
lsampl_t data[2];
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
memset(&insn, 0, sizeof(comedi_insn));
|
|
|
|
insn.insn = INSN_CONFIG;
|
|
|
|
insn.subdev = subdevice;
|
|
|
|
insn.chanspec = 0;
|
|
|
|
insn.data = data;
|
|
|
|
insn.n = sizeof(data) / sizeof(data[0]);
|
|
|
|
data[0] = INSN_CONFIG_ARM;
|
|
|
|
data[1] = source;
|
|
|
|
|
|
|
|
retval = comedi_do_insn(device, &insn);
|
|
|
|
if(retval < 0)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s: error:\n", __FUNCTION__);
|
|
|
|
comedi_perror("comedi_do_insn");
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This resets the count to zero and disarms the counter. The counter output
|
|
|
|
is set low. */
|
|
|
|
int reset_counter(comedi_t *device, unsigned subdevice)
|
|
|
|
{
|
|
|
|
comedi_insn insn;
|
|
|
|
lsampl_t data[1];
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
memset(&insn, 0, sizeof(comedi_insn));
|
|
|
|
insn.insn = INSN_CONFIG;
|
|
|
|
insn.subdev = subdevice;
|
|
|
|
insn.chanspec = 0;
|
|
|
|
insn.data = data;
|
|
|
|
insn.n = sizeof(data) / sizeof(data[0]);
|
|
|
|
data[0] = INSN_CONFIG_RESET;
|
|
|
|
|
|
|
|
retval = comedi_do_insn(device, &insn);
|
|
|
|
if(retval < 0)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s: error:\n", __FUNCTION__);
|
|
|
|
comedi_perror("comedi_do_insn");
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int set_counter_mode(comedi_t *device, unsigned subdevice, lsampl_t mode_bits)
|
|
|
|
{
|
|
|
|
comedi_insn insn;
|
|
|
|
lsampl_t data[2];
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
memset(&insn, 0, sizeof(comedi_insn));
|
|
|
|
insn.insn = INSN_CONFIG;
|
|
|
|
insn.subdev = subdevice;
|
|
|
|
insn.chanspec = 0;
|
|
|
|
insn.data = data;
|
|
|
|
insn.n = sizeof(data) / sizeof(data[0]);
|
|
|
|
data[0] = INSN_CONFIG_SET_COUNTER_MODE;
|
|
|
|
data[1] = mode_bits;
|
|
|
|
|
|
|
|
retval = comedi_do_insn(device, &insn);
|
|
|
|
if(retval < 0)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s: error:\n", __FUNCTION__);
|
|
|
|
comedi_perror("comedi_do_insn");
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int set_clock_source(comedi_t *device, unsigned subdevice, lsampl_t clock, lsampl_t period_ns)
|
|
|
|
{
|
|
|
|
comedi_insn insn;
|
|
|
|
lsampl_t data[3];
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
memset(&insn, 0, sizeof(comedi_insn));
|
|
|
|
insn.insn = INSN_CONFIG;
|
|
|
|
insn.subdev = subdevice;
|
|
|
|
insn.chanspec = 0;
|
|
|
|
insn.data = data;
|
|
|
|
insn.n = sizeof(data) / sizeof(data[0]);
|
|
|
|
data[0] = INSN_CONFIG_SET_CLOCK_SRC;
|
|
|
|
data[1] = clock;
|
|
|
|
data[2] = period_ns;
|
|
|
|
|
|
|
|
retval = comedi_do_insn(device, &insn);
|
|
|
|
if(retval < 0)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s: error:\n", __FUNCTION__);
|
|
|
|
comedi_perror("comedi_do_insn");
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int set_gate_source(comedi_t *device, unsigned subdevice, lsampl_t gate_index, lsampl_t gate_source)
|
|
|
|
{
|
|
|
|
comedi_insn insn;
|
|
|
|
lsampl_t data[3];
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
memset(&insn, 0, sizeof(comedi_insn));
|
|
|
|
insn.insn = INSN_CONFIG;
|
|
|
|
insn.subdev = subdevice;
|
|
|
|
insn.chanspec = 0;
|
|
|
|
insn.data = data;
|
|
|
|
insn.n = sizeof(data) / sizeof(data[0]);
|
|
|
|
data[0] = INSN_CONFIG_SET_GATE_SRC;
|
|
|
|
data[1] = gate_index;
|
|
|
|
data[2] = gate_source;
|
|
|
|
|
|
|
|
retval = comedi_do_insn(device, &insn);
|
|
|
|
if(retval < 0)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s: error:\n", __FUNCTION__);
|
|
|
|
comedi_perror("comedi_do_insn");
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2007-08-10 18:48:03 +00:00
|
|
|
|
|
|
|
int comedi_internal_trigger(comedi_t *dev, unsigned int subd, unsigned int trignum)
|
|
|
|
{
|
|
|
|
comedi_insn insn;
|
|
|
|
lsampl_t data[1];
|
|
|
|
|
|
|
|
memset(&insn, 0, sizeof(comedi_insn));
|
|
|
|
insn.insn = INSN_INTTRIG;
|
|
|
|
insn.subdev = subd;
|
|
|
|
insn.data = data;
|
|
|
|
insn.n = 1;
|
|
|
|
|
|
|
|
data[0] = trignum;
|
|
|
|
|
|
|
|
return comedi_do_insn(dev, &insn);
|
|
|
|
}
|