From 2cd91b71760b3cdf85cb820548263f18c5f84dc5 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sat, 28 May 2016 19:19:08 -0500 Subject: [PATCH] Add a frontend because I can --- Makefile | 2 + bin/Makefile | 29 +++++ bin/main.c | 346 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 377 insertions(+) create mode 100644 bin/Makefile create mode 100644 bin/main.c diff --git a/Makefile b/Makefile index 3850a7c..7482e56 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ all: $(MAKE) -C avr all $(MAKE) -C src all + $(MAKE) -C bin all flash: $(MAKE) -C avr flash @@ -8,3 +9,4 @@ flash: clean: $(MAKE) -C avr clean $(MAKE) -C src clean + $(MAKE) -C bin clean diff --git a/bin/Makefile b/bin/Makefile new file mode 100644 index 0000000..4621519 --- /dev/null +++ b/bin/Makefile @@ -0,0 +1,29 @@ +include ../mk/build.mk + +CC = $(CROSS)cc + +INCLUDE_PATH = ../include + +CFLAGS += -I$(INCLUDE_PATH) +LDFLAGS = + +TABBY = tabby +TABBY_OBJS = main.o +TABBY_STATIC = ../src/lib$(LIBNAME).a +TABBY_HEADERS = +TABBY_LDFLAGS = -lz + +LIBNAME = tabby + +PROGRAMS = $(TABBY) + +RM = /bin/rm +INSTALL = /usr/bin/install + +all: $(PROGRAMS) + +$(TABBY): $(TABBY_OBJS) $(TABBY_HEADERS) $(TABBY_STATIC) + $(CC) $(TABBY_OBJS) $(TABBY_LDFLAGS) $(TABBY_STATIC) -o $@ + +clean: + $(RM) -f $(PROGRAMS) $(TABBY_OBJS) diff --git a/bin/main.c b/bin/main.c new file mode 100644 index 0000000..e53bd4e --- /dev/null +++ b/bin/main.c @@ -0,0 +1,346 @@ +#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; + int state = 0; + + uint8_t 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; +}