chiark / gitweb /
calculate checksums on nmra transmissions
authorian <ian>
Tue, 15 Jan 2008 22:34:10 +0000 (22:34 +0000)
committerian <ian>
Tue, 15 Jan 2008 22:34:10 +0000 (22:34 +0000)
hostside/commands.c
hostside/realtime.h
hostside/retransmit.c

index 369e7aa3e591c44e3a6549327ea752034547eac8..9dd543409b2d11bc6e4df818ccbfcea1768ae21e 100644 (file)
@@ -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;
index 59db14c4a6f127f1449bbc05b1caff7842109f7c..541a5ef7cdf2685483791801f312d52b4f530574 100644 (file)
@@ -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;
index 5372751ecda3ceb2c17c8338fd0982d272010887..d6f16480b026b871cec9e6b9b84cafc0cf4669ce 100644 (file)
@@ -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);
 }