assert(ps->remain);
switch (ps->remain[0]) {
- case '_': ps->remain++; return ps_needhextoend(ps, rn->d, &rn->l);
+ case '_': ps->remain++; return ps_needhextoend(ps, rn->pi.d, &rn->pi.l);
case '=': hex=1; checksum=1; break;
case ':': hex=1; checksum=0; break;
default: hex=0; checksum=1; break;
if (checksum)
nmra_addchecksum(&nmra);
- nmra_encodeforpic(&nmra, rn->d, &rn->l);
+ nmra_encodeforpic(&nmra, &rn->pi);
return 1;
}
}
rn= mrn ? &mrn->rn : &rn_buf;
- rn->l= sizeof(rn->d);
+ rn->pi.l= sizeof(rn->pi.d);
if (!cmd_nmra_command(ps, rn)) {
if (mrn) { free(mrn->name); free(mrn); }
if (mrn)
retransmit_queue(&mrn->rn);
else
- serial_transmit(rn->d, rn->l);
+ serial_transmit(&rn->pi);
}
static void cmd_noop(ParseState *ps, const CmdInfo *ci) {
if (!ps_neednoargs(ps))
return;
enco_pic_anyinsn(&pi, pii, arg);
- serial_transmit(pi.d, pi.l);
+ serial_transmit(&pi);
}
const CmdInfo toplevel_cmds[]= {
void nmra_problem(NmraParseEncodeCaller *pec, const char *problem);
void nmra_addchecksum(Nmra *packet);
-void nmra_encodeforpic(const Nmra *packet, Byte *picdata, int *lpicdata_r);
- /* picdata should point to COMMAND_ENCODED_MAX bytes */
+void nmra_encodeforpic(const Nmra *packet, PicInsn *pi_out);
#endif /*COMMON_H*/
__attribute__((format(printf,2,3)));
void oowrite(Selector sel, const char *data, int l);
-void serial_transmit(const Byte *command, int length);
+void serial_transmit(const PicInsn *pi);
void output_hex(Selector sel, const char *work,
const Byte *command, int length);
struct RetransmitNode {
/* set by caller: */
- Byte d[COMMAND_ENCODED_MAX];
- int l;
+ PicInsn pi;
/* internal: */
};
}
static void xmit_nmra_raw(void) {
- Byte encoded[COMMAND_ENCODED_MAX];
- int lencoded;
+ PicInsn pi;
dump("xmit_nmra_raw", buf.d, buf.l);
- nmra_encodeforpic(&buf, encoded, &lencoded);
- serial_transmit_now(encoded, lencoded);
+ nmra_encodeforpic(&buf, &pi);
+ serial_transmit_now(pi.d, pi.l);
}
static void xmit_nmra_bytes(void) {
#include "common.h"
#include "nmra.h"
-void nmra_encodeforpic(const Nmra *packet, Byte *encoded, int *lencoded_r) {
+void nmra_encodeforpic(const Nmra *packet, PicInsn *pi) {
const Byte *bp;
int length;
Byte *encp;
assert(length > 0);
assert(length <= NMRA_PACKET_MAX);
- encp= encoded;
+ encp= pi->d;
working= 0xfffc; /* 16-bit temp register. Top working_qty bits */
working_qty= 15; /* are some data bits to encode, rest are clear. */
/* we start with the 14-bit preamble and the packet start bit */
working_qty= 7;
}
}
- assert(encp < encoded + COMMAND_ENCODED_MAX);
+ assert(encp < pi->d + COMMAND_ENCODED_MAX);
*encp++= (working >> 9) & 0x7f; /* top 7 bits, right-justified */
working <<= 7;
working_qty -= 7;
}
- assert(encp > encoded);
+ assert(encp > pi->d);
encp[-1] |= 0x80; /* `end of command' bit */
- *lencoded_r= encp - encoded;
+ pi->l= encp - pi->d;
}
void nmra_addchecksum(Nmra *packet) {
ooprintf(sel, "\n");
}
-void serial_transmit(const Byte *command, int length) {
- output_hex('p', "pic-out", command,length);
- serial_transmit_now(command, length);
+void serial_transmit(const PicInsn *pi) {
+ output_hex('p', "pic-out", pi->d, pi->l);
+ serial_transmit_now(pi->d, pi->l);
}