#include #include #include #include #include #include #include #include #include void sprog_process(const struct sprog_family *fam, void *arg, int nstdin, int nstdout); void sprog_error(const char *text, ...) { va_list l; va_start(l, text); vfprintf(stderr, text, l); va_end(l); } void sprog_sleep(int msec) { usleep(msec * 1000); } void sprog_communicate(const struct sprog_family *fam, const char *port, int baud) { void *arg; struct serial_device dev; serial_open(&dev, port, baud); arg = fam->setup(&dev); sprog_process(fam, arg, dev.fd, dev.fd); } int sprog_waitdata(int timeout) { fd_set read_set; struct timeval tval; FD_ZERO(&read_set); FD_SET(1, &read_set); tval.tv_sec = timeout/1000; tval.tv_usec = (timeout%1000)*1000; if(select(1+1, &read_set, NULL, NULL, &tval)!=1) return 0; return 1; } void sprog_process(const struct sprog_family *fam, void *arg, int nstdin, int nstdout) { int oldstdin; int oldstdout; oldstdin = dup(0); oldstdout = dup(1); dup2(nstdin, 0); dup2(nstdout, 1); fam->init(arg); dup2(oldstdin, 0); dup2(oldstdout, 1); }