chiark / gitweb /
generate nmra checksums
authorian <ian>
Wed, 5 Jan 2005 00:38:07 +0000 (00:38 +0000)
committerian <ian>
Wed, 5 Jan 2005 00:38:07 +0000 (00:38 +0000)
hostside/hostside.h
hostside/main.c
hostside/nmra.c
hostside/serialio.c

index 279bae8086d2df1baca00b38a64e736469e8b460..8e5dfe6b7b76beacc4d195bdabc4ba6eb64d3f3e 100644 (file)
@@ -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*/
index 186bc1c708653600f2f324f7b24e7d69ec40cadf..dab5244f9b19a407bc43e54701031ffbda292ab8 100644 (file)
@@ -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;
 }
index 7c48f465db05b220ca9d42b16e2bb49bf3e245a4..e6697daee387a60108c0857556bfd277dbed6343 100644 (file)
@@ -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);
 }
index 5502a21394bab54ee175cbd67f8c12dc3fc1b74e..b4bd7fb10a3d8d2f64c11f2f890d03044e868107 100644 (file)
@@ -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);