Exemplo n.º 1
0
int main(void)
{
	RTIME until;
	RT_TASK *task;
	comedi_insn insn[NCHAN];
        unsigned int read_chan[NICHAN]  = { 0 };
        unsigned int write_chan[NOCHAN] = { 0 };
#if !SINGLE_INSN
	comedi_insnlist ilist = { NCHAN, insn };
#endif
#if SIN_FREQ
	lsampl_t sinewave;
	double omega = (2.0*M_PI*SIN_FREQ)/1.0E9;
	double actualtime;
#endif
	lsampl_t *hist;
	lsampl_t data[NCHAN];
	long i, k, n, retval;
	int toggle;
	FILE *fp;

	double tms[2];

#if SINGLE_INSN
	printf("single insn true\n");
#endif
#if SIN_FREQ
	printf(" true\n");
#endif
	signal(SIGKILL, endme);
	signal(SIGTERM, endme);
	hist = malloc(SAMP_FREQ*RUN_TIME*NCHAN*sizeof(lsampl_t) + 1000);
	memset(hist, 0, SAMP_FREQ*RUN_TIME*NCHAN*sizeof(lsampl_t) + 1000);

	start_rt_timer(0);
	task = rt_task_init_schmod(nam2num("MYTASK"), 1, 0, 0, SCHED_FIFO, 0xF);
	printf("COMEDI INSN%s TEST BEGINS: SAMPLING FREQ: %d, RUN TIME: %d.\n", SINGLE_INSN ? "" : "LIST", SAMP_FREQ, RUN_TIME);
	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

	if (init_board()) {;
		printf("Board initialization failed.\n");
		return 1;
	}

        for (i = 0; i < NICHAN; i++) {
		BUILD_AREAD_INSN(insn[i], subdevai, data[i], 1, read_chan[i], AI_RANGE, AREF_GROUND);
        }
        for (i = 0; i < NOCHAN; i++) {
		BUILD_AWRITE_INSN(insn[NICHAN + i], subdevao, data[NICHAN + i], 1, write_chan[i], AO_RANGE, AREF_GROUND);
        }
	printf("done building.\n"); fflush (stdout);
	until = rt_get_time();
	for (toggle = n = k = 0; k < SAMP_FREQ*RUN_TIME && !end; k++) {
#if SIN_FREQ
		actualtime = count2nano(rt_get_time());
		if(k<2) tms[k] = actualtime; 
		sinewave =  (int) (maxdatao/8*sin(omega*actualtime));
		data[NICHAN]     =  sinewave+maxdatao/2;
		//data[NICHAN + 1] = -sinewave+maxdatao/2;
#else
		data[NICHAN]     = toggle*maxdatao/2;
		data[NICHAN + 1] = (1 - toggle)*maxdatao/2;
		toggle = 1 - toggle;
#endif
		
#if SINGLE_INSN
		for (i = 0; i < NCHAN; i++) {
			if ((retval = comedi_do_insn(dev, insn + i)) > 0) {
				 hist[n++] = data[i];
			} else {
				printf("Comedi insn failed # %ld out of %d instructions, retval %ld.\n", i, NCHAN, retval);
				break;
			}
		}
#else
		if ((retval = rt_comedi_do_insnlist(dev, &ilist)) == NCHAN) {
			for (i = 0; i < NCHAN; i++) {
				 hist[n++] = data[i];
			}
		} else {
			printf("Comedi insnlist processed only %lu out of %d instructions.\n", retval, NCHAN);
			break;
		}
#endif
		rt_sleep_until(until += nano2count(SAMP_TIME));
	}

	comedi_cancel(dev, subdevai);
	comedi_cancel(dev, subdevao);
	comedi_data_write(dev, subdevao, 0, 0, AREF_GROUND, 2048);
	comedi_data_write(dev, subdevao, 1, 0, AREF_GROUND, 2048);
	comedi_close(dev);
	printf("COMEDI INSN%s ENDS.\n", SINGLE_INSN ? "" : "LIST");
	printf("t1: %g\n", tms[0]);
	printf("t2: %g\n", tms[1]);
	printf("tdiff: %g\n", tms[1]-tms[0]);
	fp = fopen("rec.dat", "w");
	for (n = k = 0; k < SAMP_FREQ*RUN_TIME; k++) {
		fprintf(fp, "# %ld: ", k);
		for (i = 0; i < NCHAN; i++) {
			fprintf(fp, "%d\t", hist[n++]);
		}
		fprintf(fp, "\n");
	}
	fclose(fp);
	free(hist);

	stop_rt_timer();
	rt_make_soft_real_time();
	rt_task_delete(task);

	return 0;
}
Exemplo n.º 2
0
int main(int argc, char *argv[])
{
	RTIME until;
	RT_TASK *task;
	comedi_insn insn[NCHAN];
	unsigned int read_chan[NICHAN]  = { 2, 3, 4, 5, 6 };
	unsigned int write_chan[NOCHAN] = { 0, 1 };
#if !SINGLE_INSN
	comedi_insnlist ilist = { NCHAN, insn };
#endif
#if SIN_FREQ
	lsampl_t sinewave;
	double omega = (2.0*M_PI*SIN_FREQ)/1.0E9;
	double actualtime;
#endif
	lsampl_t *hist;
	lsampl_t data[NCHAN];
	long i, k, n, retval;
	int toggle;
	FILE *fp;
	struct sockaddr_in addr;

	signal(SIGKILL, endme);
	signal(SIGTERM, endme);
	hist = malloc(SAMP_FREQ*RUN_TIME*NCHAN*sizeof(lsampl_t) + 1000);
	memset(hist, 0, SAMP_FREQ*RUN_TIME*NCHAN*sizeof(lsampl_t) + 1000);

	start_rt_timer(0);
	task = rt_task_init_schmod(nam2num("MYTASK"), 1, 0, 0, SCHED_FIFO, 0xF);

	daqnode = 0;
	if (argc == 2 && strstr(argv[1], "RcvNode=")) {
		inet_aton(argv[1] + 8, &addr.sin_addr);
		daqnode = addr.sin_addr.s_addr;
	}
	if (!daqnode) {
		inet_aton("127.0.0.1", &addr.sin_addr);
		daqnode = addr.sin_addr.s_addr;
	}
	while ((daqport = rt_request_port(daqnode)) <= 0 && daqport != -EINVAL);

	mlockall(MCL_CURRENT | MCL_FUTURE);
	printf("COMEDI INSN%s TEST BEGINS: SAMPLING FREQ: %d, RUN TIME: %d, NODE: %x, PORT: %d.\n", SINGLE_INSN ? "" : "LIST", SAMP_FREQ, RUN_TIME, daqnode, daqport);
	rt_make_hard_real_time();

	if (init_board()) {;
		printf("Board initialization failed.\n");
		return 1;
	}

	for (i = 0; i < NICHAN; i++) {
		BUILD_AREAD_INSN(insn[i], subdevai, data[i], 1, read_chan[i], AI_RANGE, AREF_GROUND);
	}
	for (i = 0; i < NOCHAN; i++) {
		BUILD_AWRITE_INSN(insn[NICHAN + i], subdevao, data[NICHAN + i], 1, write_chan[i], AO_RANGE, AREF_GROUND);
	}

	until = rt_get_time();
	for (toggle = n = k = 0; k < SAMP_FREQ*RUN_TIME && !end /*SAMP_FREQ*RUN_TIME && !end*/; k++) {
#if SIN_FREQ
		actualtime = count2nano(rt_get_time());
		sinewave =  (int) (maxdatao/8*sin(omega*actualtime));
		data[NICHAN]     =  sinewave+maxdatao/2;
		data[NICHAN + 1] = -sinewave+maxdatao/2;
#else
		data[NICHAN]     = toggle*maxdatao/2;
		data[NICHAN + 1] = (1 - toggle)*maxdatao/2;
		toggle = 1 - toggle;
#endif

#if SINGLE_INSN
		for (i = 0; i < NCHAN; i++) {
			if ((retval = RT_comedi_do_insn(daqnode, daqport, dev, insn + i)) > 0) {
				 hist[n++] = data[i];
			} else {
				printf("Comedi insn failed # %ld out of %d instructions, retval %ld.\n", i, NCHAN, retval);
				break;
			}
		}
#else
		if ((retval = RT_comedi_do_insnlist(daqnode, daqport, dev, &ilist)) == NCHAN) {
			for (i = 0; i < NCHAN; i++) {
				 hist[n++] = data[i];
			}
		} else {
			printf("Comedi insnlist processed only %lu out of %d instructions.\n", retval, NCHAN);
			break;
		}
#endif
		rt_sleep_until(until += nano2count(SAMP_TIME));
	}

	RT_comedi_cancel(daqnode, daqport, dev, subdevai);
	RT_comedi_cancel(daqnode, daqport, dev, subdevao);
	RT_comedi_data_write(daqnode, daqport, dev, subdevao, 0, 0, AREF_GROUND, 2048);
	RT_comedi_data_write(daqnode, daqport, dev, subdevao, 1, 0, AREF_GROUND, 2048);
	RT_comedi_close(daqnode, daqport, dev);
	printf("COMEDI INSN%s ENDS.\n", SINGLE_INSN ? "" : "LIST");

	fp = fopen("rec.dat", "w");
	for (n = k = 0; k < SAMP_FREQ*RUN_TIME; k++) {
		fprintf(fp, "# %ld: ", k);
		for (i = 0; i < NCHAN; i++) {
			fprintf(fp, "%d\t", hist[n++]);
		}
		fprintf(fp, "\n");
	}
	fclose(fp);
	free(hist);

	stop_rt_timer();
	rt_make_soft_real_time();
	rt_task_delete(task);

	return 0;
}
Exemplo n.º 3
0
Arquivo: rmtest.c Projeto: ArcEye/RTAI
int main(int argc, char *argv[])
{
	RT_TASK *task;
	lsampl_t data[NCHAN] = { 0 };
	unsigned int val, chan;
	long i;

	comedi_insn insn[NCHAN];
        unsigned int read_chan[NICHAN]  = { 2, 3, 4, 5, 6 };
        unsigned int write_chan[NOCHAN] = { 0, 1 };
	comedi_insnlist ilist = { NCHAN, insn };

	struct sockaddr_in addr;

	signal(SIGKILL, endme);
	signal(SIGTERM, endme);

	start_rt_timer(0);
	task = rt_task_init_schmod(nam2num("MYTASK"), 1, 0, 0, SCHED_FIFO, 0xF);

	daqnode = 0;
#ifdef LOCAL_EXEC
#else
	if (argc == 2 && strstr(argv[1], "DaqNode=")) {
		inet_aton(argv[1] + 8, &addr.sin_addr);
		daqnode = addr.sin_addr.s_addr;
	}
	if (!daqnode) {
		inet_aton("127.0.0.1", &addr.sin_addr);
		daqnode = addr.sin_addr.s_addr;
	}
        while ((daqport = rt_request_port(daqnode)) <= 0 && daqport != -EINVAL);
#endif
	printf("REMOTE COMEDI TEST BEGINS:  NODE = %x, PORT = %d.\n", daqnode, daqport);

	test_init_board();

	RT_comedi_register_callback(daqnode, daqport, dev, subdevai, COMEDI_CB_EOS, NULL, task);
	PRINT("Comedi analog input registered a call back.\n");
	
	test_cmd();

	val = COMEDI_CB_EOS;
	PRINT("COMMAND WREAD TIMED with a %lld (ns) timeout.\n", TIMEOUT);
	RT_comedi_command_data_wread_timed(daqnode, daqport, dev, subdevai, NCHAN, data, TIMEOUT, &val);
	PRINT("COMMAND WREAD TIMED, val = %x.\n", val);
	for (i = 0; i < NCHAN; i++) {
		PRINT("CHAN # %ld, data = %x.\n", i, data[i]);
	}
	RT_comedi_get_driver_name(daqnode, daqport, dev, (char *)data);
	PRINT("GET DRIVER NAME returned %s.\n", (char *)data);
	RT_comedi_command_data_wread(daqnode, daqport, dev, subdevai, NCHAN, data, &val);
	PRINT("COMMAND WREAD, val = %x.\n", val);
	for (i = 0; i < NCHAN; i++) {
		PRINT("CHAN # %ld, data = %x.\n", i, data[i]);
	}
	PRINT("COMMAND WAIT TIMED with a %lld (ns) timeout.\n", TIMEOUT);
	RT_comedi_wait_timed(daqnode, daqport, TIMEOUT, &val);
	PRINT("COMEDI WAIT TIMED, val = %x.\n", val);
	RT_comedi_wait(daqnode, daqport, &val);
	PRINT("COMEDI WAIT, val = %x.\n", val);
	RT_comedi_command_data_read(daqnode, daqport, dev, subdevai, NCHAN, data);
	PRINT("COMMAND READ.\n");
	for (i = 0; i < NCHAN; i++) {
		PRINT("CHAN # %ld, data = %x.\n", i, data[i]);
	}

	PRINT("COMMAND WRITE.\n");
	for (i = 0; i < NCHAN; i++) {
		data[i] = 0xcba + i;
		PRINT("CHAN # %ld, data = %x.\n", i, data[i]);
	}
	rt_comedi_command_data_write(dev, subdevao, NCHAN, data);
	PRINT("COMMAND TRIGGER.\n");
	rt_comedi_trigger(dev, subdevai);

	RT_comedi_data_write(daqnode, daqport, dev, subdevai, 0, 0, AREF_GROUND, 2048);
	PRINT("DATA WRITE: dev = %p, subdev = %u, chan = %u, range = %u, aref = %x, data = %u.\n", dev, subdevai, 0, 0, AREF_GROUND, 2048);
	RT_comedi_data_read(daqnode, daqport, dev, subdevai, 0, 0, AREF_GROUND, data);
	PRINT("DATA READ: dev = %p, subdev = %u, chan = %u, range = %u, aref = %x, data = %x.\n", dev, subdevao, 0, 0, AREF_GROUND, data[0]);
	PRINT("DATA READING DELAYED: dev = %p, subdev = %u, chan = %u, range = %u, aref = %x, data = %x, delay = %u (ns).\n", dev, subdevao, 0, 0, AREF_GROUND, data[0], DATA_READ_DELAY);
	RT_comedi_data_read_delayed(daqnode, daqport, dev, subdevai, 0, 0, AREF_GROUND, data, DATA_READ_DELAY);
	PRINT("DATA READ DELAYED: dev = %p, subdev = %u, chan = %u, range = %u, aref = %x, data = %x.\n", dev, subdevao, 0, 0, AREF_GROUND, data[0]);

	data[0] = 0x77777777;
	data[1] = 0x77777777;
	PRINT("DIO BITFIELD: dev = %p, subdev = %u, write_mask = %x, bits = %x.\n", dev, subdevdg, data[1], data[0]);
	RT_comedi_dio_bitfield(daqnode, daqport, dev, subdevdg, data[1], data);
	PRINT("DIO BITFIELD: dev = %p, subdev = %u, write_mask = %x, bits = %x.\n", dev, subdevdg, data[1], data[0]);

	val = 0x77777777;
	chan = 57;
	PRINT("DIO WRITE: dev = %p, subdev = %u, chan = %u, val= %x.\n", dev, subdevdg, chan, val);
	RT_comedi_dio_write(daqnode, daqport, dev, subdevdg, chan, val);
	PRINT("DIO WRITE: dev = %p, subdev = %u, chan = %u, val= %x.\n", dev, subdevdg, chan, val);

	PRINT("DIO READ: dev = %p, subdev = %u, chan = %u.\n", dev, subdevdg, chan);
	RT_comedi_dio_read(daqnode, daqport, dev, subdevdg, chan, &val);
	PRINT("DIO READ: dev = %p, subdev = %u, chan = %u, val= %x.\n", dev, subdevdg, chan, val);

        for (i = 0; i < NICHAN; i++) {
		data[i] = 1000 + i;
		BUILD_AREAD_INSN(insn[i], subdevai, data[i], 1, read_chan[i], AI_RANGE, AREF_GROUND);
		PRINT("READ INSN: insn = %u, n = %u, data = %u, subdev = %u, chanspec %u.\n", insn[i].insn, insn[i].n, insn[i].data[0], insn[i].subdev, insn[i].chanspec);
        }

        for (i = 0; i < NOCHAN; i++) {
		data[NICHAN + i] = 1000 + i;
		BUILD_AWRITE_INSN(insn[NICHAN + i], subdevao, data[NICHAN + i], 1, write_chan[i], AO_RANGE, AREF_GROUND);
		PRINT("WRIT INSN: insn = %u, n = %u, data = %u, subdev = %u, chanspec = %u.\n", insn[NICHAN + i].insn, insn[NICHAN + i].n, insn[NICHAN + i].data[0], insn[NICHAN + i].subdev, insn[NICHAN + i].chanspec);
        }

	for (i = 0; i < NCHAN; i++) {
		PRINT("1 COMEDI INST: insn = %u, n = %u, data = %u, subdev = %u, chanspec = %u.\n", insn[i].insn, insn[i].n, insn[i].data[0], insn[i].subdev, insn[i].chanspec);
		PRINT("COMEDI INST: %d.\n", RT_comedi_do_insn(daqnode, daqport, dev, insn + i));
		PRINT("2 COMEDI INST: insn = %u, n = %u, data = %x, subdev = %u, chanspec = %u.\n", insn[i].insn, insn[i].n, insn[i].data[0], insn[i].subdev, insn[i].chanspec);
		insn[i].n = 1;
		insn[i].data[0] = 999999;
	}
	PRINT("COMEDI INSTLST: %d.\n", RT_comedi_do_insnlist(daqnode, daqport, dev, &ilist));
	for (i = 0; i < NCHAN; i++) {
		PRINT("COMEDI INSTLST: insn = %u, n = %u, data = %x, subdev = %u, chanspec = %u.\n", insn[i].insn, insn[i].n, insn[i].data[0], insn[i].subdev, insn[i].chanspec);
	}

	RT_comedi_cancel(daqnode, daqport, dev, subdevai);
	RT_comedi_cancel(daqnode, daqport, dev, subdevao);
	RT_comedi_cancel(daqnode, daqport, dev, subdevdg);
	PRINT("COMEDI CANCELs DONE.\n");
	RT_comedi_close(daqnode, daqport, dev);
	PRINT("COMEDI CLOSE.\n");

	stop_rt_timer();
	rt_task_delete(task);

	return 0;
}