2 * simple test harness for now
3 * asserts on usage errors
4 * see README for usage info
7 * ./hostside /dev/ttySn DATA nmra
8 * ./hostside /dev/ttySn DATA command already encoded - raw transmit
9 * DATA is an even number of hex digits in a single arg
22 const char *progname= "hostside-old";
23 static FILE *dump_stream= 0;
25 static int repeat_delay= -1, iterations= -1;
26 static const char *serial_port;
30 void die_hook(void) { }
31 void die_vprintf_hook(const char *fmt, va_list al) { }
33 static void pahex(const char **argv) {
34 const char *data_string;
41 while ((data_string= *argv++)) {
42 l= strlen(data_string);
43 if (l&1) badusage("hex argument odd length");
47 if (c >= buf.d + sizeof(buf.d)) badusage("too much hex");
49 hbuf[0]= data_string[i*2];
50 hbuf[1]= data_string[i*2+1];
52 *c++= strtoul(hbuf,&ep,16);
53 if (ep!=&hbuf[2]) badusage("bad hex in hex argument");
59 struct NmraParseEncodeCaller {
60 const char *const *argv;
63 unsigned long nmra_argnumber(NmraParseEncodeCaller *pec, int argi) {
69 errno=0; l= strtoul(arg,&ep,0);
70 if (errno || *ep || ep==arg) badusage("bad numeric arg value");
74 void nmra_problem(NmraParseEncodeCaller *pec, const char *problem) {
78 static void dump(const char *what, const Byte *data, int length) {
79 if (!dump_stream) return;
80 fprintf(dump_stream,"%-25s %3d ",what,length);
82 fprintf(dump_stream," %02x", *data);
86 fprintf(dump_stream,"\n");
89 static void xmit_command(void) {
90 dump("xmit_command", buf.d, buf.l);
91 serial_transmit_now(buf.d, buf.l);
94 static void xmit_nmra_raw(void) {
97 dump("xmit_nmra_raw", buf.d, buf.l);
98 nmra_encodeforpic(&buf, &pi);
99 serial_transmit_now(pi.d, pi.l);
102 static void xmit_nmra_bytes(void) {
105 nmra_addchecksum(&buf);
110 int main(int argc, const char **argv) {
111 void (*xmitter)(void);
114 if (!*argv++) badusage("need argv[0]");
116 while ((arg=*argv++) && *arg=='-') {
119 case 's': serial_port= arg; break;
120 case 'i': iterations= atoi(arg); break;
121 case 'f': serial_fudge_delay= atoi(arg); break;
122 case 'w': repeat_delay= atoi(arg); break;
123 case 'd': dump_stream= stdout; goto noarg;
124 default: badusage("uknown option");
125 noarg: if (*arg) badusage("option with value where forbidden");
129 if (!serial_port) badusage("need serial port option");
131 if (!arg) badusage("need arg");
134 if (!strcmp(arg,#f)) { \
143 NmraParseEncodeCaller pec;
145 for (argc=0; argv[argc]; argc++);
146 nmra_parse_encode(&buf, arg, strlen(arg), argc, &pec);
147 xmitter= xmit_nmra_bytes;
150 serial_open(serial_port);
155 if (repeat_delay < 0) break;
156 if (iterations >= 0 && !iterations--) break;
157 if (repeat_delay > 0) usleep(repeat_delay);