From 4b4e4972088d82cac99941398834d8e6d661682c Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Oct 2020 01:08:03 +0000 Subject: fish --- arm.c | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 arm.c (limited to 'arm.c') diff --git a/arm.c b/arm.c new file mode 100644 index 0000000..3e6510b --- /dev/null +++ b/arm.c @@ -0,0 +1,234 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + + +int happy = 0; + +int valid_fn (unsigned char fn) +{ + switch (fn) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x08: + case 0x39: + case 0x09: + case 0x43: + case 0x45: + case 0x4E: + case 0x4F: + case 0x50: + case 0x40: + case 0x3F: + case 0x23: + case 0x26: + case 0x41: + case 0x58: + case 0x4C: + case 0x56: + case 0x76: + case 0x49: + return 1; + } + + return 0; +} + +int ackable (unsigned char fn) +{ + switch (fn) { + + + case 0x09: + case 0x39: + case 0x08: + case 0x38: + case 0x40: + case 0x43: + case 0x58: + return 0; + } + + return 1; +} + + +void ack (int fd) +{ + char buf[3]; + + buf[0] = 0; + buf[1] = 0x38; + buf[2] = 0xff ^ buf[0] ^ buf[1]; + + write (fd, buf, sizeof (buf)); + +} + +int rx_pkt (int fd, unsigned char *pkt, unsigned len) +{ + unsigned char parity = 0xff; + unsigned i; + + for (i = 0; i < len; ++i) + parity ^= pkt[i]; + + if (parity) return -1; + + happy++; + + for (i = 2; i < len - 1; ++i) { + if ((pkt[i] > 31) && (pkt[i] < 127)) + putchar (pkt[i]); + else + printf ("\\x%02x", pkt[i]); + } + + printf ("\n"); + + if ((pkt[0] & 0x40) && ackable (pkt[1])) ack (fd); + + return 0; +} + + + +int rx (int fd) +{ + static unsigned char pkt[67]; + static unsigned ptr; + unsigned char byte; + unsigned len; + + if (read (fd, &byte, 1) != 1) { + ptr = 0; + return -1; + } + + pkt[ptr++] = byte; + + if (ptr > 2 && !valid_fn (pkt[1])) { + ptr = 0; + return 0; + } + + len = pkt[0] & 0x3f; + + if (ptr == (len + 3)) { + ptr = 0; + return rx_pkt (fd, pkt, len + 3); + } + + return 0; +} + + + +int transact (int fd, int ack, unsigned char fn, void *data, unsigned len, int timeout) +{ + struct timeval tv = {0}; + int rc; + fd_set rfds; + unsigned char buf[67], parity; + unsigned i; + + happy = 0; + + tv.tv_sec = timeout; + + buf[0] = len; + + if (ack) buf[0] |= 0x40; + + buf[1] = fn; + + memcpy (&buf[2], data, len); + + parity = 0xff; + + for (i = 0; i < (len + 2); ++i) + parity ^= buf[i]; + + buf[i] = parity; + i++; + + + write (fd, buf, i); + + fwrite (data, 1, len, stdout); + + printf (" => "); + fflush (stdout); + + + + while (!happy) { + + FD_ZERO (&rfds); + + FD_SET (fd, &rfds); + + rc = select (fd + 1, &rfds, NULL, NULL, &tv); + + if (!rc) break; + + rx (fd); + + } + + return happy; +} + + + +int main (int argc, char *argv[]) +{ + struct sockaddr_in sin; + int fd; + + unsigned char buf[128]; + + fd = socket (PF_INET, SOCK_STREAM, 0); + + sin.sin_family = AF_INET; + sin.sin_port = htons (10005); + inet_aton ("10.32.52.66", &sin.sin_addr); + + connect (fd, (struct sockaddr *)&sin, sizeof (sin)); + + + + transact (fd, 1, 0x3f, "543210", 6, 4); + transact (fd, 1, 0x43, "SA", 2, 4); + + transact (fd, 1, 0x3f, "543210", 6, 4); + transact (fd, 1, 0x43, "SA91", 4, 4); + + transact (fd, 1, 0x3f, "543210", 6, 4); + transact (fd, 1, 0x43, "SA92", 4, 4); + + if (argc == 2) { + sprintf (buf, "SA1*%s", argv[1]); + transact (fd, 1, 0x3f, "543210", 6, 4); + transact (fd, 1, 0x43, buf, strlen (buf), 4); + } + + close (fd); +} + -- cgit v1.2.3