#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*/
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]);
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;
}
#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;
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);
}
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);