PicInsn *pi, pi_buf;
ManualRetransmitNode *mrn=0;
- void (*retrans)(RetransmitUrgentNode *urg, const Nmra *n)= 0;
+ void (*retrans)(RetransmitUrgentNode *urg, Nmra *n)= 0;
if (ps->remain) {
if (ps->remain[0]=='*') retrans= retransmit_urgent_queue;
/* Contents of the retransmission nodes is generally all for use by
* retransmit.c only; as a special exception, caller may edit pi
* directly. Normally, though, pi is set by supplying an NMRA
- * command to one of the _queue functions; _queue will update pi
- * iff the Nmra* is non-null */
+ * command to one of the _queue functions; iff the Nmra* is
+ * non-null, _queue will add an NMRA checksum and update pi.
+ */
struct RetransmitRelaxedNode {
PicInsn pi;
DLIST_NODE(RetransmitRelaxedNode) rr;
void retransmit_start(void);
void retransmit_something(void);
-void retransmit_relaxed_queue(RetransmitRelaxedNode *rn, const Nmra *n);
-void retransmit_relaxed_requeue(RetransmitRelaxedNode *rn, const Nmra *n);
+void retransmit_relaxed_queue(RetransmitRelaxedNode *rn, Nmra *n);
+void retransmit_relaxed_requeue(RetransmitRelaxedNode *rn, Nmra *n);
void retransmit_relaxed_cancel(RetransmitRelaxedNode *rn);
-void retransmit_urgent_queue(RetransmitUrgentNode *rn, const Nmra *n);
-void retransmit_urgent_queue_relaxed(RetransmitUrgentNode *urg, const Nmra *n);
-void retransmit_urgent_requeue(RetransmitUrgentNode *rn, const Nmra *n);
+void retransmit_urgent_queue(RetransmitUrgentNode *rn, Nmra *n);
+void retransmit_urgent_queue_relaxed(RetransmitUrgentNode *urg, Nmra *n);
+void retransmit_urgent_requeue(RetransmitUrgentNode *rn, Nmra *n);
void retransmit_urgent_cancel(RetransmitUrgentNode *rn);
/* ... NB: these are NOT idempotent. Use _requeue it's queued;
Nmra n;
enco_nmra_idle(&n);
+ nmra_addchecksum(&n);
nmra_encodeforpic(&n, &linefill);
retransmit_something();
serial_transmit(&linefill);
}
-void retransmit_relaxed_queue(RetransmitRelaxedNode *rn, const Nmra *n) {
- if (n) nmra_encodeforpic(n, &rn->pi);
+void retransmit_relaxed_queue(RetransmitRelaxedNode *rn, Nmra *n) {
+ if (n) { nmra_addchecksum(n); nmra_encodeforpic(n, &rn->pi); }
DLIST2_PREPEND(relaxed,rn,rr);
}
-void retransmit_relaxed_requeue(RetransmitRelaxedNode *rn, const Nmra *n) {
+void retransmit_relaxed_requeue(RetransmitRelaxedNode *rn, Nmra *n) {
retransmit_relaxed_cancel(rn);
retransmit_relaxed_queue(rn, n);
}
DLIST2_REMOVE(relaxed,rlx,rr);
}
-void retransmit_urgent_queue(RetransmitUrgentNode *urg, const Nmra *n) {
+void retransmit_urgent_queue(RetransmitUrgentNode *urg, Nmra *n) {
retransmit_relaxed_queue(&urg->u.relaxed, n);
urg->u.ix= 0;
urg->u.when= elapsed;
DLIST2_APPEND(speedies[0].queue,urg,u.queue);
}
-void retransmit_urgent_queue_relaxed(RetransmitUrgentNode *urg, const Nmra *n){
+void retransmit_urgent_queue_relaxed(RetransmitUrgentNode *urg, Nmra *n){
retransmit_relaxed_queue(&urg->u.relaxed, n);
urg->u.ix= -1;
urg->u.when= elapsed;
}
-void retransmit_urgent_requeue(RetransmitUrgentNode *rn, const Nmra *n) {
+void retransmit_urgent_requeue(RetransmitUrgentNode *rn, Nmra *n) {
retransmit_urgent_cancel(rn);
retransmit_urgent_queue(rn, n);
}