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; }
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; }