diff options
author | Chris Kuethe <chris.kuethe@gmail.com> | 2007-07-01 04:43:10 +0000 |
---|---|---|
committer | Chris Kuethe <chris.kuethe@gmail.com> | 2007-07-01 04:43:10 +0000 |
commit | bfe93562ec2e3e63374b40ab2d3431f8008080f8 (patch) | |
tree | e616efbcc0d19d9ba3ad927882ba2f1a8dfeb177 /contrib/binreplay.c | |
parent | dde8e62313bb21f723e238bc9350159027ef57ef (diff) | |
download | gpsd-bfe93562ec2e3e63374b40ab2d3431f8008080f8.tar.gz |
usage: binreplay [-d <device>] [-r <data_rate>] [-s <port_speed>] <file>
some extra goo. data rate <= port speed. under certain conditions one
may wish to have the device spray data as fast as the port will allow,
and other times the data should be a little slower to arrive.
Diffstat (limited to 'contrib/binreplay.c')
-rw-r--r-- | contrib/binreplay.c | 149 |
1 files changed, 108 insertions, 41 deletions
diff --git a/contrib/binreplay.c b/contrib/binreplay.c index d1838e4e..ca22e126 100644 --- a/contrib/binreplay.c +++ b/contrib/binreplay.c @@ -9,37 +9,82 @@ #include <unistd.h> #include <util.h> -#define WRLEN 256 +#define WRLEN 64 void spinner(int); +void usage(void); int main( int argc, char **argv){ struct stat sb; struct termios term; char *buf, tn[32]; - int ifd, ofd, sfd, t, l, speed; - - if (argc != 3 ){ - fprintf(stderr, "usage: binreplay <speed> <file>\n"); - return 1; + int ifd, ofd, sfd; + int dflag = 0, c, sleeptime, len, rate = 0, speed = 0; + + while((c = getopt(argc, argv, "d:r:s:")) != -1) { + switch(c){ + case 'd': + dflag = 1; + strlcpy(tn, optarg, 32); + break; + case 'r': + rate = atoi(optarg); + switch (rate) { + case 230400: + case 115200: + case 57600: + case 38400: + case 28800: + case 19200: + case 14400: + case 9600: + case 4800: + break; + default: + fprintf(stderr, "invalid data rate: %d\n", rate); + return 1; + } + break; + case 's': + speed = atoi(optarg); + switch (speed) { + case 230400: + case 115200: + case 57600: + case 38400: + case 28800: + case 19200: + case 14400: + case 9600: + case 4800: + break; + default: + fprintf(stderr, "invalid port speed: %d\n", speed); + return 1; + } + break; + default: + usage(); + } } + argc -= optind; + argv += optind; - speed = atoi(argv[1]); - switch (speed) { - case 230400: - case 115200: - case 57600: - case 38400: - case 28800: - case 14400: - case 9600: - case 4800: - break; - default: - fprintf(stderr, "invalid speed\n"); + if (argc != 1) + usage(); + + if (rate > speed){ + printf("data rate cannot be higher than port speed.\n"); return 1; } - if ((ifd = open(argv[2], O_RDONLY, 0444)) == -1) + if (0 == rate && 0 != speed) + rate = speed; + + if (0 == rate && 0 == speed) + rate = speed = 4800; + + printf("opening %s\n", argv[0]); + if ((ifd = open(argv[0], O_RDONLY, 0444)) == -1) err(1, "open"); if (fstat(ifd, &sb) == -1) @@ -48,27 +93,45 @@ int main( int argc, char **argv){ if ((buf = mmap(0, sb.st_size, PROT_READ, MAP_FILE, ifd, 0)) == MAP_FAILED) err(1, "mmap"); - cfmakeraw(&term); - cfsetospeed(&term, speed); - cfsetispeed(&term, speed); - if (openpty(&ofd, &sfd, tn, &term, NULL) == -1) - err(1, "openpty"); - - tcsetattr(ofd, TCSANOW, &term); - tcsetattr(sfd, TCSANOW, &term); - - chmod(tn, 0444); - printf("configured %s for %dbps\n", tn, speed); - t = 1000000 / (speed / 8); - - for(l = 0; l < sb.st_size; l += WRLEN ){ - write(ofd, buf+l, WRLEN ); - tcdrain(ofd); -// tcdrain(sfd); - tcflush(ofd, TCIFLUSH); - tcflush(sfd, TCIFLUSH); - spinner( l ); - usleep(t); + if (dflag){ + if ((ofd = open(tn, O_RDWR|O_NOCTTY, 0644)) == -1) + err(1, "open"); + tcgetattr(ofd, &term); + cfmakeraw(&term); + cfsetispeed(&term, speed); + cfsetospeed(&term, speed); +#if 0 + term.c_cflag &= ~(PARENB | PARODD | CRTSCTS); + term.c_cflag |= CREAD | CLOCAL; + term.c_iflag = term.c_oflag = term.c_lflag = (tcflag_t) 0; +#endif + tcflush(ofd, TCIOFLUSH); + tcsetattr(ofd, TCSANOW, &term); + tcflush(ofd, TCIOFLUSH); + } else { + cfmakeraw(&term); + cfsetospeed(&term, speed); + cfsetispeed(&term, speed); + if (openpty(&ofd, &sfd, tn, &term, NULL) == -1) + err(1, "openpty"); + + tcsetattr(ofd, TCSANOW, &term); + tcsetattr(sfd, TCSANOW, &term); + } + + sleeptime = 1000000 / (speed / (WRLEN * 10)); + printf("configured %s for %dbps - write delay %dus\n", tn, speed, sleeptime); + + for(len = 0; len < sb.st_size; len += WRLEN ){ + write(ofd, buf+len, WRLEN ); + // tcdrain(ofd); + if (0 == dflag){ + tcflush(ofd, TCIFLUSH); + // tcdrain(sfd); + tcflush(sfd, TCIFLUSH); + } + spinner( len ); + usleep(sleeptime); } munmap(buf, sb.st_size); @@ -91,3 +154,7 @@ void spinner(int n){ fflush(stderr); } +void usage(void){ + fprintf(stderr, "usage: binreplay [-d <device>] [-r <data_rate>] [-s <port_speed>] <file>\n"); + exit(1); +} |