summaryrefslogtreecommitdiff
path: root/contrib/binreplay.c
diff options
context:
space:
mode:
authorChris Kuethe <chris.kuethe@gmail.com>2007-07-01 04:43:10 +0000
committerChris Kuethe <chris.kuethe@gmail.com>2007-07-01 04:43:10 +0000
commitbfe93562ec2e3e63374b40ab2d3431f8008080f8 (patch)
treee616efbcc0d19d9ba3ad927882ba2f1a8dfeb177 /contrib/binreplay.c
parentdde8e62313bb21f723e238bc9350159027ef57ef (diff)
downloadgpsd-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.c149
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);
+}