From: ian Date: Wed, 5 Jan 2005 00:38:07 +0000 (+0000) Subject: generate nmra checksums X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=774102c2f858e1de3bad1a366f1eab587acbb230;p=trains.git generate nmra checksums --- diff --git a/hostside/hostside.h b/hostside/hostside.h index 279bae8..8e5dfe6 100644 --- a/hostside/hostside.h +++ b/hostside/hostside.h @@ -8,10 +8,11 @@ typedef unsigned char Byte; #define COMMAND_ENCODED_MAX 16 #define NMRA_PACKET_MAX ((COMMAND_ENCODED_MAX*7 - 14) / 8) -void nmra_transmit(const Byte *nmra_packet, int length); +void xmit_nmra_raw(const Byte *with_csum, int length); +void xmit_nmra(const Byte *without_csum, int length); +void xmit_command(const Byte *command, int length); void sysfatal(const char *m); void serial_open(const char *device); -void command_transmit(const Byte *command, int length); #endif /*HOSTSIDE_H*/ diff --git a/hostside/main.c b/hostside/main.c index 186bc1c..dab5244 100644 --- a/hostside/main.c +++ b/hostside/main.c @@ -19,7 +19,8 @@ int main(int argc, const char **argv) { char hbuf[3], *ep; Byte buf[NMRA_PACKET_MAX + COMMAND_ENCODED_MAX]; - assert(argc==3 || (argc==4 && !strcmp(argv[3],"command"))); + assert(argc==4); + assert(argv[3]); serial_open(argv[1]); l= strlen(argv[2]); @@ -35,10 +36,12 @@ int main(int argc, const char **argv) { assert(ep==&hbuf[2]); } - if (argc==4) - command_transmit(buf,l); - else - nmra_transmit(buf,l); + switch (argv[3][0]) { + case 'c': xmit_command(buf,l); break; + case 'r': xmit_nmra_raw(buf,l); break; + case 'n': xmit_nmra(buf,l); break; + default: abort(); + } return 0; } diff --git a/hostside/nmra.c b/hostside/nmra.c index 7c48f46..e6697da 100644 --- a/hostside/nmra.c +++ b/hostside/nmra.c @@ -4,7 +4,7 @@ #include "hostside.h" -void nmra_transmit(const Byte *nmra_packet, int length) { +void xmit_nmra_raw(const Byte *nmra_packet, int length) { Byte encoded[COMMAND_ENCODED_MAX], *encp; unsigned working, newbits; int working_qty; @@ -43,5 +43,22 @@ void nmra_transmit(const Byte *nmra_packet, int length) { assert(encp > encoded); encp[-1] |= 0x80; /* `end of command' bit */ - command_transmit(encoded, encp - encoded); + xmit_command(encoded, encp - encoded); +} + +void xmit_nmra(const Byte *without_csum, int length) { + Byte with_csum[NMRA_PACKET_MAX]; + const Byte *in; + Byte *out; + int left; + unsigned running; + + assert(length >=0 && length < sizeof(with_csum)); + for (left=length, running=0, in=without_csum, out=with_csum; + left>0; + in++, out++, left--) + running ^= (*out = *in); + + *out= running; + xmit_nmra_raw(with_csum, length+1); } diff --git a/hostside/serialio.c b/hostside/serialio.c index 5502a21..b4bd7fb 100644 --- a/hostside/serialio.c +++ b/hostside/serialio.c @@ -22,7 +22,7 @@ void serial_open(const char *device) { if (serial_fd<0) sysfatal(device); } -void command_transmit(const Byte *command, int length) { +void xmit_command(const Byte *command, int length) { int r; assert(length <= COMMAND_ENCODED_MAX);