From 8690a229e714ac80d8d79ef2be13097b5909bab6 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 15 Jan 2008 22:34:10 +0000 Subject: [PATCH] calculate checksums on nmra transmissions --- hostside/commands.c | 2 +- hostside/realtime.h | 15 ++++++++------- hostside/retransmit.c | 13 +++++++------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/hostside/commands.c b/hostside/commands.c index 369e7aa..9dd5434 100644 --- a/hostside/commands.c +++ b/hostside/commands.c @@ -102,7 +102,7 @@ static void cmd_nmra(ParseState *ps, const CmdInfo *ci) { 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; diff --git a/hostside/realtime.h b/hostside/realtime.h index 59db14c..541a5ef 100644 --- a/hostside/realtime.h +++ b/hostside/realtime.h @@ -34,8 +34,9 @@ typedef unsigned Retransmit__Time; /* 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; @@ -53,13 +54,13 @@ union RetransmitUrgentNode { 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; diff --git a/hostside/retransmit.c b/hostside/retransmit.c index 5372751..d6f1648 100644 --- a/hostside/retransmit.c +++ b/hostside/retransmit.c @@ -59,6 +59,7 @@ void retransmit_start(void) { Nmra n; enco_nmra_idle(&n); + nmra_addchecksum(&n); nmra_encodeforpic(&n, &linefill); retransmit_something(); @@ -104,11 +105,11 @@ void retransmit_something(void) { 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); } @@ -116,18 +117,18 @@ void retransmit_relaxed_cancel(RetransmitRelaxedNode *rlx) { 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); } -- 2.30.2