chiark / gitweb /
can do repeat; slightly saner internal handling of arg parsing
authorian <ian>
Sun, 9 Jan 2005 01:59:24 +0000 (01:59 +0000)
committerian <ian>
Sun, 9 Jan 2005 01:59:24 +0000 (01:59 +0000)
hostside/main.c

index d0e184a8e8d6affcc5d75127286273266e5a274b..5a34e3fb6487b8a6757270a9319ee8131d70e919 100644 (file)
@@ -11,6 +11,7 @@
 #include <string.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include "hostside.h"
 
@@ -18,32 +19,43 @@ int main(int argc, const char **argv) {
   int l, i;
   char hbuf[3], *ep;
   Byte buf[NMRA_PACKET_MAX + COMMAND_ENCODED_MAX];
+
+  int repeat_delay= -1;
+  const char *serial_port, *data_string, *instruction;
   
-  assert(argc==4 || argc==5);
-  assert(argv[3]);
-  serial_open(argv[1]);
+  assert(argc>=4 && argc<=6);
+  serial_port= argv[1];
+  data_string= argv[2];
+  instruction= argv[3];
+  if (argc>4) serial_fudge_delay= atoi(argv[4]);
+  if (argc>5) repeat_delay= atoi(argv[5]);
+
+  serial_open(serial_port);
 
-  l= strlen(argv[2]);
+  l= strlen(data_string);
   assert(!(l&1));
   l >>= 1;
   assert(l<=sizeof(buf));
 
   for (i=0; i<l; i++) {
-    hbuf[0]= argv[2][i*2];
-    hbuf[1]= argv[2][i*2+1];
+    hbuf[0]= data_string[i*2];
+    hbuf[1]= data_string[i*2+1];
     hbuf[2]= 0;
     buf[i]= strtoul(hbuf,&ep,16);
     assert(ep==&hbuf[2]);
   }
 
-  if (argc==5)
-    serial_fudge_delay= atoi(argv[4]);
-
-  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();
+  for (;;) {
+    
+    switch (instruction[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();
+    }
+
+    if (repeat_delay < 0) break;
+    if (repeat_delay > 0) usleep(repeat_delay);
   }
 
   return 0;