#include "usbpulse.h" #include #define MAXDEV 4 struct devinfo { int addr; int fd; int delay; int durat; double amp; int invert; }; int detect_init(struct devinfo *di, int devs, int master) { int i, ret; for(i = 0; i < devs; i++) { usbtm_set_trig_master(di[i].fd, 0); usbtm_set_detect_line(di[i].fd, 0, 1); } usbtm_set_detect_line(master, 0, 1); usbtm_get_detect_line(master, &ret); if(!ret) { fprintf(stderr, "Nektere z propojenych zarizeni neni pripojeno na USB!\n"); return 0; } usbtm_set_detect_line(master, 1, 0); for(i = 1; i < devs; i++) { usbtm_set_detect_line(di[i].fd, 0, 1); usbtm_get_detect_line(di[i].fd, &ret); if(ret) { fprintf(stderr, "Nektere uvedene zarizeni neni propojeno s ostatnimi!\n"); return 0; } } for(i = 0; i < devs; i++) if(!pulse100_init_pulse(di[i].fd, i==0)) return 0; usbtm_set_clock_master(master, 1); usbtm_set_trig_master(master, 1); return 1; } int main(int argc, char *argv[]) { int opt, exp = 3, help = 0; struct devinfo di[MAXDEV]; float defamp = 2; int m, base, max, i, devs = 0; int master; while((opt = getopt(argc, argv, "d:a:ie:u:h?")) != -1) switch(opt) { case 'd': if(devs == MAXDEV) { help = 1; break; } if(sscanf(optarg, "%i:%i,%i", &di[devs].addr, &di[devs].delay, &di[devs].durat) != 3) help = 1; if(di[devs].delay < 0 || di[devs].durat < 0) help = 1; di[devs].amp = defamp; di[devs].invert = 0; devs++; break; case 'a': if(!devs) defamp = atof(optarg); else di[devs-1].amp = atof(optarg); break; case 'i': if(!devs) help = 1; else di[devs-1].invert = 1; break; case 'e': exp = atoi(optarg); break; case 'u': if(!strcmp(optarg, "s")) exp = 0; else if(!strcmp(optarg, "ms")) exp = 3; else if(!strcmp(optarg, "us")) exp = 6; else help = 1; break; default: help = 1; break; } if(help || optind != argc || defamp < 1 || devs < 2 || exp < 0 || exp > 8) { printf("Pouziti: %s [-e exp|-u unit] [-d dev:delay,dur] [-a amp] [-i] [-d...\n" " dev je cislo zarizeni %sn, na ktere se pripojit.\n" " Prvni uvedene zarizeni bude plnit funkci Trigger Master.\n" " delay je relativni doba zacatku pulsu, dur jeho trvani.\n" " Casova jednotka je urcena unit (s, ms, us) nebo exp (0 az 8;\n" " 0 = s, 3 = ms, 6 = us), vychozi je ms.\n" " amp je amplituda daneho pulsu, -i zapina inverzi jeho logicke hodnoty,\n" " pricemz obe tyto volby se vztahuji pouze na predchozi -d.\n" " Jestlize je uvedeno pred prvnim -d, urcuje vychozi hodnotu (jinak 2V).\n", argv[0], DEVNAME); return 0; } for(i = 0; i < devs; i++) if(!opendev(di[i].addr, &di[i].fd)) { fprintf(stderr, deverror(di[i].addr)); return 1; } master = di[0].fd; if(!detect_init(di, devs, master)) { for(i = 0; i < devs; i++) closedev(di[i].addr, di[i].fd); return 1; } for(base = 1, i = 8; i > exp; i--) base *= 10; if(exp > 5) { m = 1<<(exp - 5); base >>= 8-exp; } else { m = 1; base >>= 3; } max = 0; for(i = 0; i < devs; i++) if(di[i].delay + di[i].durat > max) max = di[i].delay + di[i].durat; for(i = 0; i < devs; i++) { pulse100_set_pll(di[i].fd, m, 1, 1, 0); pulse100_set_amplitude(di[i].fd, di[i].amp); pulse100_set_xyz(di[i].fd, max*base+2, (max-di[i].delay-di[i].durat)*base, (max-di[i].delay)*base); pulse100_set_bypass(di[i].fd, 0); pulse100_set_prng(di[i].fd, 0); pulse100_set_invert(di[i].fd, di[i].invert); pulse100_set_enable(di[i].fd, 1); } for(i = 0; i < devs; i++) { pulse100_set_trigger(di[i].fd, 0); pulse100_set_arm(di[i].fd, 0); pulse100_set_run(di[i].fd, 0); } for(i = 0; i < devs; i++) { pulse100_set_run(di[i].fd, 1); pulse100_set_oneshot(di[i].fd, 1); pulse100_set_arm(di[i].fd, 1); } pulse100_set_trigger(master, 1); sleep((int)(1/12.5E6*base/m*max)+1); for(i = 0; i < devs; i++) closedev(di[i].addr, di[i].fd); return 0; }