X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/3db3fc270d517ca76518b47950f5240990e84cc5..1eb82e46a20fba718e0dd0e7ced354451189ea09:/binwire.c diff --git a/binwire.c b/binwire.c index a878a5d..cef0924 100644 --- a/binwire.c +++ b/binwire.c @@ -7,10 +7,13 @@ void dowrite(char *s, int len) { - int i; - for (i=0; i 1) ? 1 : (len-i); + + write(1, s+i, cs); + i += cs; } } @@ -23,22 +26,26 @@ int waitchar(int timeout) return poll(&pfd, 1, timeout) == 1; } -void expect(char *s, int len) +int expect(char *s, int len) { int i; char c; for (i=0; i < len; i++) { - if (waitchar(100) == 0) + if (waitchar(1000) == 0) { fprintf(stderr, "Timeout reached in expect (expected %c)\n", s[i]); - return; + return 1; } while (read(0, &c, 1) == 0) fprintf(stderr, "Short read...\n"); if (c != s[i]) + { fprintf(stderr, "Expect failed: expected %d, got %d (pos %d)\n", s[i], c, i); + return 1; + } } + return 0; } void expect_no_chars() @@ -55,8 +62,6 @@ void expect_no_chars() } if (cs) fprintf(stderr, "Expect no chars failed: got %d chars\n", cs); - - } void main(int argc, char **argv) @@ -64,6 +69,7 @@ void main(int argc, char **argv) unsigned char buf[259]; int sz; int rfd; + int tc = 0; if (argc < 2) { @@ -83,13 +89,32 @@ void main(int argc, char **argv) expect_no_chars(); while ((sz = read(rfd, buf+3, 255)) > 0) { + int rv; + char abuf[5]; buf[0] = 0x1B; buf[1] = 'D'; buf[2] = sz+1; + abuf[0] = 0x1B; + abuf[1] = 'A'; + abuf[2] = (tc >> 16) & 0xFF; + abuf[3] = (tc >> 8) & 0xFF; + abuf[4] = tc & 0xFF; + tc += sz; + retry: + dowrite(abuf, 5); + rv = expect("A", 1); dowrite(buf, sz + 3); - fprintf(stderr, "Data sent\n"); - expect("D", 1); + fprintf(stderr, "Data sent (%d)\n", tc); + rv |= expect("D", 1); expect_no_chars(); + if (rv) + { + printf("Failure to ack... retrying\n"); + dowrite("...", 3); + rv = expect("...", 3); + expect_no_chars(); + goto retry; + } } exit(0); } \ No newline at end of file