return 2;
}
-static int tas_data_to_teensy(uint8_t b, uint8_t *data)
+static int tas_data_to_teensy(uint8_t b, uint8_t *data, FILE *logf)
{
+ uint8_t t;
+
/* SCBA RLDU */
/* v */
/* ?0SA 00DU, ?1CB RLDU */
data[0] = (b & 0x13) | ((b >> 2) & 0x20);
data[1] = (b & 0x0f) | ((b >> 1) & 0x30);
+
+ if (logf != NULL) {
+ fwrite(&data[0], 1, 1, logf);
+ t = data[1] | 0x40; // expected TH
+ fwrite(&t, 1, 1, logf);
+ }
+
return 2;
}
fd_set rfds, wfds;
const char *tasfn = NULL;
const char *outfn = NULL;
+ const char *logfn = NULL;
uint8_t *tas_data = NULL;
- int use_readinc = 0; // frame increment on read
+ int use_vsync = 0; // frame increment on vsync
int tas_skip = 0;
int enable_sent = 0;
int abort_sent = 0;
struct timeval *timeout = NULL;
struct timeval tout;
FILE *outf = NULL;
+ FILE *logf = NULL;
int i, ret = -1;
int fd;
missing_arg(i);
outfn = argv[i];
continue;
+ case 'l':
+ i++;
+ if (argv[i] == NULL)
+ missing_arg(i);
+ logfn = argv[i];
+ continue;
case 's':
i++;
if (argv[i] == NULL)
missing_arg(i);
tas_skip = atoi(argv[i]);
continue;
- case 'r':
- use_readinc = 1;
+ case 'v':
+ use_vsync = 1;
continue;
default:
fprintf(stderr, "bad arg: %s\n", argv[i]);
if (outfn != NULL) {
outf = fopen(outfn, "w");
if (outf == NULL) {
- fprintf(stderr, "fopen %s: ", tasfn);
+ fprintf(stderr, "fopen %s: ", outfn);
+ perror("");
+ return 1;
+ }
+ }
+
+ if (logfn != NULL) {
+ logf = fopen(logfn, "wb");
+ if (logf == NULL) {
+ fprintf(stderr, "fopen %s: ", logfn);
perror("");
return 1;
}
switch (c) {
case 'r':
enable_sent = 0;
+ if (logf != NULL)
+ rewind(logf);
break;
}
}
for (i = 0; i < sizeof(pkt_out.data); ) {
i += tas_data_to_teensy(tas_data[frames_sent],
- pkt_out.data + i);
+ pkt_out.data + i, logf);
frames_sent++;
if (frames_sent >= frame_count)
}
pkt_out.size = i;
}
- else
+ else {
pkt_out.type = PKT_STREAM_END;
+ if (logf != NULL)
+ fflush(logf);
+ }
ret = submit_urb(dev.fd, &urb[URB_DATA_OUT],
dev.ifaces[0].ep_out, &pkt_out, sizeof(pkt_out));
/* debug text */
buf_dbg[reaped_urb->actual_length] = 0;
printf("%s", buf_dbg);
+
+ // continue receiving debug before sending out stuff
+ tout.tv_sec = 0;
+ tout.tv_usec = 1000;
+ timeout = &tout;
+ continue;
}
else {
fprintf(stderr, "reaped unknown urb? %p #%zu\n",
pkt_out.type = PKT_STREAM_ENABLE;
pkt_out.enable.stream_to = (tas_data != NULL);
pkt_out.enable.stream_from = (outf != NULL);
- pkt_out.enable.use_readinc = use_readinc;
+ pkt_out.enable.use_readinc = !use_vsync;
ret = submit_urb(dev.fd, &urb[URB_DATA_OUT], dev.ifaces[0].ep_out,
&pkt_out, sizeof(pkt_out));
if (outf != NULL)
fclose(outf);
+ if (logf != NULL)
+ fclose(logf);
if (dev.fd != -1) {
/* deal with pending URBs */