chiark / gitweb /
better management of new planning
authorian <ian>
Sun, 18 May 2008 20:09:57 +0000 (20:09 +0000)
committerian <ian>
Sun, 18 May 2008 20:09:57 +0000 (20:09 +0000)
hostside/commands.c
hostside/safety.c

index 7da070c4e52e3bfe2d2c0bdd27efc68008a9091f..b3b8bb2be796d33890ec136ff7db2e9759c48ce7 100644 (file)
@@ -254,7 +254,7 @@ static int cmd_movpos(ParseState *ps, const CmdInfo *ci) {
   }
   
   ms= -1;
-  if (ps->remain)
+  if (ps->remain && CIXF_FORCE)
     MUSTECR( ps_neednumber(ps,&ms,0,100000,"milliseconds") );
 
   MUSTECR( ps_neednoargs(ps) );
index f4941731fb1967dde7f2214bcf1969fc9dabd71f..67181f743245591f64a587a6464500b4bace8f3e 100644 (file)
@@ -852,6 +852,7 @@ ErrorCode predict(Train *tra, struct timeval tnow, unsigned flags,
            "-V"[ seg->pred_vacated ],
            "-p"[ seg->will_polarise ]);
 
+    /* set ownership and det_ignore */
     if (seg->pred_present || seg->pred_vacated) {
       seg->owner= tra;
       seg->det_ignore= seg->now_present;
@@ -859,6 +860,20 @@ ErrorCode predict(Train *tra, struct timeval tnow, unsigned flags,
       seg->det_ignore= 0;
       seg->owner= 0;
     }
+
+    /* garbage collect our previous plan */
+    if (!seg->owner) {
+      assert(!seg->motion_newplan);
+      if (!seg->moving) {
+       movpos_unreserve(seg->motion);
+       seg->motion= 0;
+      }
+    }
+    if (seg->owner != tra)
+      continue;
+
+    /* now it's our segment: */
+
     if (seg->motion_newplan == seg->motion) {
       seg->motion_newplan= 0;
     } else {
@@ -902,6 +917,12 @@ ErrorCode predict(Train *tra, struct timeval tnow, unsigned flags,
     actual_inversions_done();
 
   report_train_ownerships(tra,u.hindmost,0);
+
+  if (u.desire_move && !u.desire_move->owner)
+    /* Oh!  Train must be slower and less far advanced than expected.
+     * Well, then we can move it right away. */
+    return movpos_change(u.desire_move,u.desire_movposcomb,-1,0);
+
   return 0;
 
  xproblem:
@@ -1072,7 +1093,7 @@ ErrorCode safety_movposchange(Segment *seg, MovPosComb comb,
   u.train= seg->owner;
 
   if (!seg->owner)
-    return 0;
+    return movpos_change(seg,comb,-1,0);
 
   if (allow_queueing<2) {
     if (seg->det_ignore)