tabby/bin/main.c

347 lines
7 KiB
C
Raw Normal View History

2016-05-28 19:19:08 -05:00
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <tabby/link.h>
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;
2016-05-29 01:13:37 -05:00
uint8_t state = 0,
value = 0,
2016-05-28 19:19:08 -05:00
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: {
2016-05-29 01:14:44 -05:00
response = statusCode;
state = 0;
2016-05-28 19:19:08 -05:00
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;
}