chiark / gitweb /
res_movposset needed because we can restart the resolution, losing track of what...
authorian <ian>
Sun, 8 Jun 2008 20:10:23 +0000 (20:10 +0000)
committerian <ian>
Sun, 8 Jun 2008 20:10:23 +0000 (20:10 +0000)
hostside/record.c
hostside/resolve.c
hostside/safety.h

index d55757955d2308ca417cc98f1cba5bf70f549f0a..29dcc60b4754f8773d1564126e7573f801f0b53b 100644 (file)
@@ -425,6 +425,7 @@ static void alloc(void) {
       FOR_SEG {
        seg->owner= 0;
        seg->seg_inverted= 0;
+       seg->res_movposset= 0;
        seg->movposcomb= -1;
        seg->moving= 0;
        seg->motion= seg->motion_newplan= 0;
index ac855884b7157bae3e956e4db2887792b29ba71d..e7045ab33828ff3ebfb99aae942e2810ae315d3a 100644 (file)
@@ -168,9 +168,12 @@ static int resmain_getmovpos(TrackLocation *t, TrackAdvanceContext *c,
     d->tr_backwards ^= d->owner->backwards;
     *use_io= d->movposcomb;
     DPRINTF(resolving,main, "getmovpos %s E %u\n", pn, *use_io);
-  } else {
+  } else if (!d->res_movposset) {
     *use_io= -1;
     DPRINTF(resolving,main, "getmovpos %s N -1\n", pn);
+  } else if (d->motion) {
+    *use_io= movpos_change_intent(d->motion);
+    DPRINTF(resolving,main, "getmovpos %s M %u\n", pn, *use_io);
   }
   return 0;
 }
@@ -324,58 +327,53 @@ static int resolve_complete_main(void) {
       problems++;
     }
   }
-  return problems;
-}
-
-static int resolve_complete_movpos_segment(Segment *d) {
-  int problems= 0;
+    
   TrackAdvanceContext tac;
   MovPosComb target;
   tac.getmovpos= resmain_getmovpos;
 
-  d->iselem_u= 0;
+  FOR_SEGMENT(d,NOOP,NOOP) {
+    if (problems) return problems;
 
-  target= just_getmovpos(d,&tac);
+    d->iselem_u= 0;
 
-  if (d->i->invertible) {
-    Segment *interferer= segment_interferes(&tac,d);
-    if (interferer) {
-      actual_inversions_start();
-      d->seg_inverted= interferer->seg_inverted
-       ^ d->i->interferes_polarity_opposed;
-      actual_inversions_segment(d);
-      actual_inversions_done();
+    target= just_getmovpos(d,&tac);
+
+    if (d->i->invertible) {
+      Segment *interferer= segment_interferes(&tac,d);
+      if (interferer) {
+       actual_inversions_start();
+       d->seg_inverted= interferer->seg_inverted
+           ^ d->i->interferes_polarity_opposed;
+       actual_inversions_segment(d);
+       actual_inversions_done();
+      }
     }
-  }
 
-  if (d->i->n_poscombs>1) {
-    d->movposcomb= -1;
-    if (target >= 0) {
-      assert(!d->motion);
-      ErrorCode ec= movpos_reserve(d,-1,&d->motion,target,-1);
-      if (ec) {
-       ouprintf("resolution movpos-change-failed %s/%s %s\n",
-                d->i->pname, d->i->poscombs[target].pname,
-                errorcodelist[ec]);
-       problems++;
+    if (d->i->n_poscombs>1) {
+      if (target >= 0) {
+       if (!d->moving) {
+         movpos_unreserve(d->motion);
+         d->motion= 0;
+       }
+       ErrorCode ec= movpos_reserve(d,-1,&d->motion,target,-1);
+       if (ec) {
+         ouprintf("resolution movpos-change-failed %s/%s %s\n",
+                  d->i->pname, d->i->poscombs[target].pname,
+                  errorcodelist[ec]);
+         problems++;
+       } else {
+         d->res_movposset= 1;
+       }
       }
+    } else {
+      assert(!d->i->n_movfeats);
+      d->movposcomb= 0;
     }
-  } else {
-    assert(!d->i->n_movfeats);
-    d->movposcomb= 0;
   }
   return problems;
 }
 
-static int resolve_complete_movpos(void) {
-  SEGMENT_ITERVARS(d);
-  int problems= 0;
-
-  FOR_SEGMENT(d,NOOP,NOOP)
-    problems += resolve_complete_movpos_segment(d);
-  return problems;
-}
-
 #undef iselem_u
 
 /*---------- heads and tails of trains, final placement ----------*/
@@ -389,6 +387,18 @@ typedef struct {
   int extraspace;
 } FindEndUserContext;
 
+static int findends_getmovpos(TrackLocation *t, TrackAdvanceContext *c,
+                             MovPosComb *use_io) {
+  const char *pn= t->seg->i->pname;
+  if (t->seg->motion) *use_io= movpos_change_intent(t->seg->motion);
+  if (*use_io<0) {
+    DPRINTF(resolving,ends, " getmovpos %s fails\n", pn);
+    return -1;
+  }
+  DPRINTF(resolving,ends, " getmovpos %s -> %d\n", pn, *use_io);
+  return 0;
+}
+
 static int segdist(Segment *seg) {
   TrackLocation t;
   int r;
@@ -397,7 +407,7 @@ static int segdist(Segment *seg) {
   t.seg= seg;
   mpc= seg->movposcomb;
   
-  r= resmain_getmovpos(&t,0,&mpc);
+  r= findends_getmovpos(&t,0,&mpc);
   assert(!r);  assert(mpc >= 0);
   return seg->i->poscombs[mpc].dist;
 }
@@ -482,7 +492,7 @@ static int resolve_complete_ends_train(Train *tra) {
 
   tc.distance= TL_DIST_INF;
   tc.nextseg= findhead_nextseg;
-  tc.getmovpos= resmain_getmovpos;
+  tc.getmovpos= findends_getmovpos;
   tc.trackend= 0;
   tc.u= &u;
 
@@ -500,11 +510,6 @@ static int resolve_complete_ends_train(Train *tra) {
          tra->foredetect->tr_backwards?"-":"", tra->foredetect->i->pname,
          segdist(tra->foredetect));
 
-//  if (u.furthest != tra->foredetect) {
-//    int problems= resolve_complete_movpos_segment(u.furthest);
-//    if (problems) return problems;
-//  }
-
   tra->maxinto= segdist(tra->foredetect) - u.extraspace;
   if (tra->maxinto < 0) {
     ouprintf("resolution mispositioned head %s %s %d\n",
@@ -591,8 +596,6 @@ int resolve_complete(void) {
   problems= resolve_complete_main();
   if (!problems)
     problems += resolve_complete_ends();
-  if (!problems)
-    problems += resolve_complete_movpos();
 
   if (problems) {
     ouprintf("resolution problems %d\n",problems);
@@ -623,5 +626,9 @@ void resolve_motioncheck(void) {
   FOR_SEG
     if (seg->moving) return;
 
+  FOR_SEG
+    if (seg->i->n_poscombs>1 && !seg->res_movposset)
+      seg->movposcomb= -1;
+
   sta_finalising_done();
 }
index 452eaced5729b203dfbffebbb5e49d239a06e74a..6756e92b025099531a0ae607facb3f1195c562bd 100644 (file)
@@ -74,6 +74,7 @@ struct Segment {
     det_ignore:1, det_expected:1, /* safety.c */
     moving:1, /* feature(s) have been told to change */
     mark0,mark1,mark2,mark3, /* for temporary private uses */
+    res_movposset:1, /* we have set the position so it is known good */
     res_detect:1; /* detection noticed here during resolution */
   MovPosComb movposcomb; /* -1 means not known or moving */
   MovPosChange *motion; /* if ->moving, owned by movpos, otherwise by safety */