added tests and created main

This commit is contained in:
David Schleef 2000-10-10 00:52:10 +00:00
parent 84eef56cd5
commit 809aaa48b9
9 changed files with 211 additions and 315 deletions

View file

@ -6,7 +6,7 @@ LDFLAGS=-L../lib/ -lcomedi
TARG=comedi_test
OBJS=main.o mode1.o
OBJS=main.o mode0_read.o insn_read.o info.o
all: $(TARG)

11
testing/comedi_test.h Normal file
View file

@ -0,0 +1,11 @@
#ifndef _COMEDI_TEST_H_
#define _COMEDI_TEST_H_
extern char *filename;
extern comedi_t *device;
extern int subdevice;
#endif

79
testing/info.c Normal file
View file

@ -0,0 +1,79 @@
#include <stdio.h>
#include <comedilib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <ctype.h>
#include <math.h>
#include <sys/time.h>
#include <string.h>
#include "comedi_test.h"
static char *subdevice_types[]={
"unused",
"analog input",
"analog output",
"digital input",
"digital output",
"digital I/O",
"counter",
"timer",
"memory",
"calibration",
"processor"
};
int test_info(void)
{
int j;
int type;
int chan,n_chans;
int n_ranges;
comedi_range *rng;
printf("rev 1\n");
type = comedi_get_subdevice_type(device,subdevice);
printf("I: subdevice type: %d (%s)\n",type,subdevice_types[type]);
if(type==COMEDI_SUBD_UNUSED)
return 0;
n_chans=comedi_get_n_channels(device,subdevice);
printf(" number of channels: %d\n",n_chans);
if(!comedi_maxdata_is_chan_specific(device,subdevice)){
printf(" max data value: %d\n",comedi_get_maxdata(device,subdevice,0));
}else{
printf(" max data value: (channel specific)\n");
for(chan=0;chan<n_chans;chan++){
printf(" chan%d: %d\n",chan,
comedi_get_maxdata(device,subdevice,chan));
}
}
printf(" ranges:\n");
if(!comedi_range_is_chan_specific(device,subdevice)){
n_ranges=comedi_get_n_ranges(device,subdevice,0);
printf(" all chans:");
for(j=0;j<n_ranges;j++){
rng=comedi_get_range(device,subdevice,0,j);
printf(" [%g,%g]",rng->min,rng->max);
}
printf("\n");
}else{
for(chan=0;chan<n_chans;chan++){
n_ranges=comedi_get_n_ranges(device,subdevice,chan);
printf(" chan%d:",chan);
for(j=0;j<n_ranges;j++){
rng=comedi_get_range(device,subdevice,chan,j);
printf(" [%g,%g]",rng->min,rng->max);
}
printf("\n");
}
}
return 0;
}

View file

@ -1,71 +0,0 @@
/*
This demo opens /dev/comedi0 and looks for an analog input
subdevice. If it finds one, it measures one sample on each
channel for each input range. The value NaN indicates that
the measurement was out of range.
*/
#include <stdio.h>
#include <comedilib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <ctype.h>
extern int verbose_flag;
extern int subdevice;
extern int range;
extern int channel;
extern int aref;
extern char *filename;
comedi_t *device;
int main(int argc, char *argv[])
{
int n_subdevs;
int n_chans,chan;
int n_ranges;
int range;
int rangetype;
int maxdata;
lsampl_t data;
double voltage;
parse_options(argc,argv);
device=comedi_open(filename);
if(!device){
comedi_perror(filename);
exit(0);
}
subdevice=comedi_find_subdevice_by_type(device,COMEDI_SUBD_AI,0);
if(subdevice<0){
printf("no analog input subdevice found\n");
exit(0);
}
n_chans=comedi_get_n_channels(device,subdevice);
for(chan=0;chan<n_chans;chan++){
printf("%d: ",chan);
//n_ranges=comedi_get_n_ranges(device,subdevice,chan);
rangetype=comedi_get_rangetype(device,subdevice,chan);
n_ranges=RANGE_LENGTH(rangetype);
maxdata=comedi_get_maxdata(device,subdevice,chan);
for(range=0;range<n_ranges;range++){
comedi_data_read(device,subdevice,chan,range,aref,&data);
voltage=comedi_to_phys(data,comedi_get_range(device,subdevice,chan,range),maxdata);
printf("%g ",voltage);
}
printf("\n");
}
exit(0);
}

42
testing/insn_read.c Normal file
View file

@ -0,0 +1,42 @@
#include <stdio.h>
#include <comedilib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <ctype.h>
#include <math.h>
#include <sys/time.h>
#include <string.h>
#include "comedi_test.h"
int test_insn_read(void)
{
comedi_insn it;
lsampl_t data;
int save_errno;
int ret;
printf("rev 1\n");
memset(&it,0,sizeof(it));
it.subdev = subdevice;
it.insn = INSN_READ;
it.n = 1;
it.chanspec = CR_PACK(0,0,0);
it.data = &data;
ret = comedi_do_insn(device,&it);
save_errno = errno;
printf("comedi_do_insn: %d\n",ret);
if(ret<0){
printf("W: comedi_do_insn: errno=%d %s\n",save_errno,strerror(save_errno));
}
return 0;
}

View file

@ -11,6 +11,7 @@
#include <ctype.h>
#include <malloc.h>
#include "comedi_test.h"
char *filename="/dev/comedi0";
int verbose_flag;
@ -21,54 +22,52 @@ int channel;
int aref;
int range;
int test_info(void);
int test_mode0_read(void);
int test_insn_read(void);
int parse_options(int argc, char *argv[])
struct test_struct{
char *name;
int (*do_test)(void);
};
struct test_struct tests[]={
{ "info", test_info },
{ "mode0_read", test_mode0_read },
{ "insn_read", test_insn_read },
};
static int n_tests = sizeof(tests)/sizeof(tests[0]);
int main(int argc, char *argv[])
{
int c;
int i;
while (1) {
c = getopt(argc, argv, "acsrfvdgom");
c = getopt(argc, argv, "f");
if (c == -1)
break;
switch (c) {
case 'f':
filename = argv[optind];
break;
case 's':
sscanf(argv[optind],"%d",&subdevice);
break;
case 'c':
sscanf(argv[optind],"%d",&channel);
break;
case 'a':
sscanf(argv[optind],"%d",&aref);
break;
case 'r':
sscanf(argv[optind],"%d",&range);
break;
case 'v':
verbose_flag = 1;
break;
case 'd':
aref=AREF_DIFF;
break;
case 'g':
aref=AREF_GROUND;
break;
case 'o':
aref=AREF_OTHER;
break;
case 'm':
aref=AREF_COMMON;
break;
default:
printf("bad option\n");
exit(1);
}
}
return argc;
device = comedi_open(filename);
for(subdevice=0;subdevice<comedi_get_n_subdevices(device);subdevice++){
printf("I:\n");
printf("I: subdevice %d\n",subdevice);
for(i=0;i<n_tests;i++){
printf("I: testing %s...\n",tests[i].name);
tests[i].do_test();
}
}
return 0;
}

48
testing/mode0_read.c Normal file
View file

@ -0,0 +1,48 @@
#include <stdio.h>
#include <comedilib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <ctype.h>
#include <math.h>
#include <sys/time.h>
#include <string.h>
#include "comedi_test.h"
int test_mode0_read(void)
{
comedi_trig it;
lsampl_t data;
unsigned int chanspec;
int save_errno;
int ret;
printf("rev 1\n");
memset(&it,0,sizeof(it));
it.subdev = subdevice;
it.mode = 0;
it.n_chan = 1;
it.chanlist = &chanspec;
it.data = (sampl_t *)&data;
it.n = 1;
chanspec = CR_PACK(0,0,0);
ret = comedi_trigger(device,&it);
save_errno = errno;
printf("comedi_trig_ioctl: %d\n",ret);
if(ret<0){
printf("W: comedi_trig_ioctl: errno=%d %s\n",save_errno,
strerror(save_errno));
}
return 0;
}

View file

@ -1,149 +0,0 @@
/*
A little input demo for mode 1
Mode 1 uses a timer to acquire samples at regular intervals.
It scans through the channel list, and then repeats.
*/
#include <stdio.h>
#include <comedilib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <ctype.h>
#include <math.h>
#include <sys/time.h>
#include <string.h>
#define BUFSZ 1000
#define N_CHANS 1000
extern int verbose_flag;
extern int subdevice;
extern int range;
extern int channel;
extern int aref;
extern char *filename;
comedi_t *device;
void parse_options(int argc,char *argv[]);
sampl_t data[BUFSZ];
unsigned int chanlist[N_CHANS];
int ai_mode1_test(double freq,int n_chans,int n_scans);
int main(int argc, char *argv[])
{
parse_options(argc,argv);
device=comedi_open(filename);
if(!device){
comedi_perror(filename);
exit(0);
}
subdevice=comedi_find_subdevice_by_type(device,COMEDI_SUBD_AI,0);
if(subdevice<0){
printf("no analog input subdevice found\n");
exit(0);
}
while(1){
printf("Testing mode 1:\n");
printf("10 hz, 1 chan\n");
ai_mode1_test(10.0,1,10);
printf("100 hz, 1 chan\n");
ai_mode1_test(100.0,1,100);
printf("1000 hz, 1 chan\n");
ai_mode1_test(1000.0,1,1000);
printf("10000 hz, 1 chan\n");
ai_mode1_test(10000.0,1,10000);
printf("100000 hz, 1 chan\n");
ai_mode1_test(100000.0,1,100000);
printf("100000 hz, 2 chan\n");
ai_mode1_test(100000.0,2,50000);
printf("100000 hz, 16 chans\n");
ai_mode1_test(100000.0,16,100000/16);
}
return 0;
}
int ai_mode1_test(double freq,int n_chans,int n_scans)
{
comedi_trig it;
int err;
int n,i;
double actual_freq;
void *data_ptr;
int n_left;
int maxchan;
struct timeval start,stop;
int m;
memset(&it,0,sizeof(it));
it.subdev = subdevice;
it.mode = 1;
it.n_chan = n_chans;
it.chanlist = chanlist;
it.data = data;
it.n = n_scans;
maxchan = comedi_get_n_channels(device,subdevice);
/* pack the channel list */
for(i=0;i<n_chans;i++){
chanlist[i] = CR_PACK(i%maxchan, range, aref);
}
comedi_get_timer(device,subdevice,freq,&it.trigvar,&actual_freq);
printf("primary actual frequency=%g timer value=%d\n",actual_freq,it.trigvar);
gettimeofday(&start,NULL);
if ((err = comedi_trigger(device, &it)) < 0) {
perror("ioctl");
}
data_ptr=data;
n_left=n_scans*n_chans*sizeof(sampl_t);
while(n_left>0){
m=n_left;
if(m>=BUFSZ)m=BUFSZ;
if((n=read(comedi_fileno(device),data_ptr,m))<0){
perror("read");
exit(1);
}
//printf("read %d\n",n);
n_left-=n;
//data_ptr+=n;
}
gettimeofday(&stop,NULL);
if(stop.tv_usec<=start.tv_usec){
stop.tv_usec+=1000000;
stop.tv_sec--;
}
stop.tv_sec-=start.tv_sec;
stop.tv_usec-=start.tv_usec;
printf("actual time elapsed: %d.%06d s.\n",(int)stop.tv_sec,(int)stop.tv_usec);
printf("expected time: %g\n",n_scans*n_chans/actual_freq);
return 0;
}

View file

@ -1,63 +0,0 @@
/*
A little input demo for mode 2
Mode 2 uses two different timers to convert samples.
The primary timer determines the time between scans,
and the secondary timer determines the time between
samples in a scan.
The time between scans is in trigval; the time
between samples is selected by trigval1. Conversion
from seconds or Hz is done using the standard timer
routines.
*/
#include <stdio.h>
#include <comedilib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <ctype.h>
#define N_SCANS 10
#define N_CHANS 16
int subdevice = 0;
int chan=0;
int range = 0;
int aref = AREF_GROUND;
double freq = 1000;
#define N_SAMPLES 1000
double data[N_SAMPLES];
int main(int argc, char *argv[])
{
char *fn = NULL;
int i;
comedi_t *dev;
fn = "/dev/comedi0";
dev = comedi_open(fn);
#if 0
for(i=0;i<10;i++){
range=comedi_find_range(dev,subdevice,chan,0,-i,i);
printf("%d\n",range);
}
#endif
comedi_timed_1chan(dev,subdevice,chan,range,aref,freq,N_SAMPLES,data);
for(i=0;i<N_SAMPLES;i++){
printf("%g\n",data[i]);
}
return 0;
}