#include #include #include #include #include #include #include static void usage(int argc, char **argv, char *message, ...) { if (message) { va_list args; va_start(args, message); vfprintf(stderr, message, args); fprintf(stderr, "\n"); va_end(args); } fprintf(stderr, "usage: %s device\n", argv[0]); exit(1); } int main(int argc, char **argv) { int fd; ssize_t len; uint8_t state = 0, value = 0, compression = 0, dataLengthLSB = 0, dataLengthMSB = 0, acknowledgeCode = 129, statusCode = 0; uint16_t dataPosition = 0; if (argc != 2) { usage(argc, argv, "No device specified"); } if ((fd = tabby_link_open(argv[1])) < 0) { fprintf(stderr, "%s: %s: %s: %s\n", argv[0], "tabby_link_open()", argv[1], strerror(errno)); goto error_link_open; } while ((len = tabby_link_recv(fd, &value, 1)) >= 0) { uint8_t response = 0; fprintf(stderr, "state %d recv 0x%02x\n", state, value); switch (state) { case 0: { if (value == 136) { state = 1; } response = 0; break; } case 1: { if (value == 51) { state = 2; response = 0; } else { state = 0; response = 0; } break; } case 2: { if (value == 1) { state = 3; response = 0; compression = 0; dataLengthLSB = 0; dataLengthMSB = 0; } else if (value == 2) { state = 50; response = 0; } else if (value == 4) { state = 20; response = 0; } else if (value == 15) { state = 90; response = 0; } else { state = 0; response = 5; } break; } case 3: { compression = value; response = 0; state = 4; break; } case 4: { dataLengthLSB = value; response = 0; state = 5; break; } case 5: { dataLengthMSB = value; response = 0; state = 6; break; } case 6: { response = 0; state = 7; break; } case 7: { response = 129; state = 8; break; } case 8: { response = 129; state = 20; break; } case 20: { compression = value; response = 0; state = 21; break; } case 21: { dataLengthLSB = value; response = 0; state = 22; break; } case 22: { dataLengthMSB = value; response = 0; state = 23; dataPosition = 256 * dataLengthMSB + dataLengthLSB; break; } case 23: { dataPosition--; if (dataPosition == 0 || dataPosition == 65535) { state = 24; } else { state = 23; } response = 0; break; } case 24: { response = 0; state = 25; break; } case 26: { response = acknowledgeCode; state = 27; break; } case 27: { response = statusCode; state = 0; break; } case 50: { response = 0; state = 51; break; } case 51: { response = 0; state = 52; break; } case 52: { response = 0; state = 53; break; } case 53: { response = 0; state = 54; break; } case 54: { response = 0; state = 55; break; } case 55: { response = 0; state = 56; break; } case 56: { response = 0; state = 57; break; } case 57: { response = 0; state = 58; break; } case 58: { response = acknowledgeCode; state = 59; break; } case 59: { response = statusCode; state = 0; break; } case 90: { response = 0; state = 91; break; } case 91: { response = 0; state = 92; break; } case 92: { response = 0; state = 93; break; } case 93: { response = 0; state = 94; break; } case 94: { response = 129; state = 95; break; } case 95: { response = statusCode; state = 0; break; } default: { response = 0; state = 0; break; } } fprintf(stderr, "send 0x%02x\n", response); if (tabby_link_send(fd, &response, 1) < 0) { fprintf(stderr, "%s: %s: %s: %s\n", argv[0], "tabby_link_send()", argv[1], strerror(errno)); goto error_link_send; } } tabby_link_close(fd); return 0; error_link_send: tabby_link_close(fd); error_link_open: return 1; }