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