示例#1
0
文件: kcomedi.c 项目: cjecho/RTAI
static inline int __rt_comedi_command_data_wread(void *dev, unsigned int subdev, long nchans, lsampl_t *data, RTIME until, unsigned int *cbmaskarg, int waitmode)
{
	unsigned int cbmask, mask;
	long retval, kspace;
	if ((kspace = KSPACE(cbmaskarg))) {
		mask = cbmaskarg[0];
	} else {
		rt_get_user(mask, cbmaskarg);
	}
	switch (waitmode) {
		case WAIT:
			retval = rt_comedi_wait(&cbmask);
			break;
		case WAITIF:
			retval = rt_comedi_wait_if(&cbmask);
			break;
		case WAITUNTIL:
			retval = _rt_comedi_wait_until(&cbmask, until);
			break;
		default: // useless, just to avoid compiler warnings
			return RTE_PERM;
	}
	if (!retval && (mask & cbmask)) {
		if (kspace) {
			cbmaskarg[0] = cbmask;
		} else {
			rt_put_user(cbmask, cbmaskarg);
		}
		return rt_comedi_command_data_read(dev, subdev, nchans, data);
	}
	return retval;
}
示例#2
0
文件: cmd.c 项目: ArcEye/RTAI
int main(void)
{
	RT_TASK *task;

	lsampl_t *hist;
	lsampl_t data[NCHAN] = { 0 };
	unsigned int val;
	long i, k, n, cnt = 0, retval = 0;
	FILE *fp;

	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 CMD TEST BEGINS: SAMPLING FREQ: %d, RUN TIME: %d.\n", SAMP_FREQ, RUN_TIME);
	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

	if (init_board()) {;
		printf("Board initialization failed.\n");
		return 1;
	}
	rt_comedi_register_callback(dev, subdev, COMEDI_CB_EOS, NULL, task);
	do_cmd();

	for (n = k = 0; k < SAMP_FREQ*RUN_TIME && !end; k++) {
#if ONECALL

		val = COMEDI_CB_EOS;
#if TIMEDCALL
		retval += rt_comedi_command_data_wread_timed(dev, subdev, NCHAN, data, nano2count(TIMEOUT), &val);
#else
		retval += rt_comedi_command_data_wread(dev, subdev, NCHAN, data,&val);
#endif

#else

		val = 0;
#if TIMEDCALL
		retval += rt_comedi_wait_timed(nano2count(TIMEOUT), &val);
#else
		retval += rt_comedi_wait(&val);
#endif

#endif
		if (val & COMEDI_CB_EOS) {
#if !ONECALL
			rt_comedi_command_data_read(dev, subdev, NCHAN, data);
#endif
//			printf("Read %ld: %u.\n", k, data[0]);
			for (i = 0; i < NCHAN; i++) {
				 hist[n++] = data[i];
			}
		} else {
			printf("Callback mask does not match: %lu.\n", ++cnt);
		}
	}

	comedi_cancel(dev, subdev);
	comedi_close(dev);
	printf("COMEDI TEST ENDS.\n");

	if (retval < 0) {
		printf("rt_comedi_wait_timed overruns: %d\n", abs(retval));
	}
	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;
}