chiark / gitweb /
new resolution placement; try make it compile
authorian <ian>
Tue, 22 Apr 2008 20:46:15 +0000 (20:46 +0000)
committerian <ian>
Tue, 22 Apr 2008 20:46:15 +0000 (20:46 +0000)
hostside/resolve.c
hostside/safety.c
hostside/safety.h
hostside/speed.c

index c43e26908ef5d9484c583ecf162c59cdfb149698..11dad34911724ffc5d6daa982b49f58c0c15e37a 100644 (file)
 /* We record R in tra->resolution,
  * U in segi->mark0 and D in segi->res_detect */
 #define iselem_u mark0
+#define resfin_done mark0
 
 void resolve_begin(void) {
   SEG_IV;
@@ -359,8 +360,7 @@ int resolve_complete(void) {
 
 typedef struct {
   Train *train;
-  Segment *foredetect;
-  int minclear, backwards;
+  int extraspace;
 } FindEndUserContext;
 
 static int segdist(Segment *seg) {
@@ -368,21 +368,23 @@ static int segdist(Segment *seg) {
   return seg->i->poscombs[seg->movposcomb].dist;
 }
 
-static int foundend(FindEndUserContext *u, Segment *seg) {
-  u->foredetect= seg;
-  return -1;
-}
-static int findend_nextseg(TrackLocation *t, struct TrackAdvanceContext *c,
-                          MovPosComb *mpc_io, Segment *before) {
+static int findhead_nextseg(TrackLocation *t, struct TrackAdvanceContext *c,
+                           MovPosComb *mpc_io, Segment *before) {
   FindEndUserContext *u= c->u;
-  t->seg->tr_backwards= t->backwards ^ u->backwards;
-  if (t->seg->owner != train) return foundend(u, before);
-  if (!t->seg->res_detect) { u->minclear= 0; return foundend(u, before);
+  if (t->seg->owner != train) return -1;
+  if (!t->seg->res_detect) { u->extraspace= 0; return -1; }
+  
+  u->train->foredetect= seg;
+  t->seg->tr_backwards= t->backwards;
+  t->seg->res_detect= 0;
   return 0;
 }
-static int findend_trackend(TrackLocation *t, struct TrackAdvanceContext *c) {
-  FindEndUserContext *u= c->u;
-  return foundend(u, t->seg);
+
+static int walkback_nextseg(TrackLocation *t, struct TrackAdvanceContext *c,
+                           MovPosComb *mpc_io, Segment *before) {
+  if (t->seg->owner != train) return -1;
+  t->seg->tr_backwards= !t->backwards;
+  t->seg->resfin_done= 1;
 }
 
 static void resolve_train_finalise(Segment *startpoint) {
@@ -394,83 +396,58 @@ static void resolve_train_finalise(Segment *startpoint) {
   assert(startpoint->owner);
   tra= startpoint->owner;
 
-  startpoint->res_detect= 0; /* clear these as we use them up */
-
   t.seg= startpoint;
   t.remain= 0;
   t.backwards= t.seg->tr_backwards ^ tra->backwards;
-    /* we're going to clear tra->backwards */
+
+  tra->backwards= 0;
 
   tc.distance= INT_MAX;
-  tc.nextseg= findend_nextseg;
-  tc.trackend= findend_trackend;
+  tc.nextseg= findhead_nextseg;
+  tc.trackend= 0;
   tc.getmovpos= 0;
   tc.u= &u;
 
-  u.minclear= MARGIN_NOSE + tra->head;
-  u.backwards= 0;
+  u.extraspace= MARGIN_NOSE + tra->head;
 
-  r= trackloc_advance(&t,&tc);  assert(!r);
+  r= findhead_nextseg(&t,&c,0,0); assert(!r);
+  trackloc_advance(&t,&tc);
 
   tra->foredetect= u->foredetect;
-  tra->maxinto= segdist(tra->foredetect) - u->minclear;
+  tra->maxinto= segdist(tra->foredetect) - u->extraspace;
   if (tra->maxinto < 0) tra->maxinto= 0;
   tra->uncertainty= tra->maxinto;
 
-  t.seg= tra->foredetect;
-  t.remain= 
-
-    u->maxinto= u->uncertainty= segdist(before);
-
-      
-    u->detcanoccupy= tra->head;
-    return -1;
-
-t->seg->res_detect
-  if (
-  
-
-  if (t->seg->owner != before->owner)
-    return -1;
-  t->seg->owner->foredetect= t->seg;
-}
-
-
-
-  
+  FOR_SEG {
+    if (seg->owner == tra) seg->res_detect= 0;
+    seg->resfin_done= 0;
+  }
 
-  tra->backwards= 0;
-  
   t.seg= tra->foredetect;
   t.remain= 0;
-
-  trackloc_advance(&t,&tc);
-    }
-
+  t.backwards= !tra->foredetect->tr_backwards;
   
+  tc.distance= tra->detectable + tra->tail + MARGIN_NOSE;
+  tc.nextseg= walkback_nextseg;
 
-  for (;;) {
-    
-
-      Segment *notify, *onwards;
-      const SegPosCombInfo *pci;
-      const SegmentLinkInfo *link;
-      
-      notify= seg;
-      for (;;) {
-       seg->res_detect= 0;
-       assert(notify->movposcomb >= 0);
-
-       pci= &notify->i->poscombs[notify->movposcomb];
-       link= &pci->link[notify->tr_backwards];
+  r= walkback_nextseg(&t,&tc,0,0); assert(!r);
+  trackloc_advance(&t,&tc);
 
-       if (!SOMEP(link->next)) break;
-       onwards= &segments[link->next];
-       if (!onwards->res_detect) break;
-       if (onwards->owner != seg->owner) break;
+  if (u->distance) {
+    tra->uncertainty -= u->distance;
+    if (tra->uncertainty < 0)
+      safety_panic(tra, t.seg, "resolved train location too small by %d!",
+                  -tra->uncertainty);
+  }
 
-       notify= onwards;
-      }
+  FOR_SEG {
+    seg->owner= 0;
+    if (seg->resfin_done) {
+      seg->owner= tra;
+      seg->resfin_done= 0;
+    }
+  }
+}
   
 
 void resolve_motioncheck(void) {
@@ -484,19 +461,5 @@ void resolve_motioncheck(void) {
     if (seg->res_detect)
       resolve_train_finalise(seg);
 
-    
-      seg->owner->foredetect= seg; /* initial guess */
-    }
-  
-
-  FOR_TRA
-
-  FOR_SEG {
-    if (seg->res_detect) {
-      
-      safety_notify_detection(notify);
-    }
-  }
-  
   sta_finalising_done();
 }
index 5bca8e3f7547b3bec05fdfa794b0c9d8bc2e7e26..1eaf1e20d47c5dc901bb71645749a54707d97d5e 100644 (file)
@@ -209,7 +209,7 @@ Segment *segments;
  *  adv. fdet 1 seg                          T         N        F     
  *   adv. nose                       T                  N     ProblemPredicted
  *
- * Oops, so set sigstopping and speed 0:
+ * Oops, so stop:
  *                                                   DETECT
  *  real stop dist                                   >>>>>
  *                   +++++++++++|+++++++++++|++++++++++|XXXXXX
@@ -323,7 +323,7 @@ static int nose_nextseg(TrackLocation *t, TrackAdvanceContext *c,
 
   /* Is it empty ? */
 
-  if (u->train->sigstopping && t->seg->owner != u->train)
+  if (speedmanager_stopping(train) && t->seg->owner != u->train)
     return EC_SignallingHorizonReached;
 
   if (t->seg->owner) {
@@ -672,7 +672,6 @@ void safety_notify_detection(Segment *seg) {
 
   assert(ec == EC_SignallingPredictedProblem);
 
-  tra->sigstopping= 1;
   ec= speedmanager_speedchange_request(tra,0, 0,(char*)"detection sigstop");
    /* that calls predict_confirm with our supplied arguments */
   assert(!ec);
index 249337362e3897062130f5a21f384e7f878c46ad..67b3704ace9fca94fd45bf0f25661416b5d4b93e 100644 (file)
@@ -44,9 +44,6 @@ struct Train {
   unsigned
     backwards:1, /* train is moving backwards wrt its own front and back */
 
-  /* Speed: */
-    sigstopping:1, /* set and cleared by speed.c */
-
   /* Startup resolution (resolve.c): */
     resolution:2; /* for use by speedmanager */
 
@@ -209,6 +206,7 @@ ErrorCode speedmanager_speedchange_request(Train *tra, int step,
 void speedmanager_reset_train(Train *tra);
 double speedmanager_speed_maxestimate(Train *tra);
 double speedmanager_stoppingdistance(Train *tra);
+int speedmanager_speed_stopping(Train *tra);
 
 /*========== actual.c ==========*/
 /* actual.c should only be called from safety.c.
index 2a4e013c3cda6535bfaccc7d003e75655168b569..6b22f254c19e5d748309427a0c41d954fce7726f 100644 (file)
@@ -15,10 +15,6 @@ static void xmit(Train *tra) {
 static void decel_done(TimeoutEvent *toev) {
   Train *tra= (void*)((char*)toev - offsetof(Train, speed.decel));
   tra->speed.speed= tra->speedcurve[tra->speed.step];
-  if (tra->sigstopping) {
-    assert(!tra->speed.step);
-    train_nose_restricttoowner(tra);
-    tra->sigstopping= 0;
 }
 
 static const SpeedRange *stop_info(Train *tra, double speed) {
@@ -83,6 +79,10 @@ double speedmanager_stoppingdistance(Train *tra) {
   return xs;
 }
 
+int speedmanager_speed_stopping(Train *tra) {
+  return tra->speed.try_speed < 0 && !tra->speed.speed;
+}  
+
 ErrorCode speedmanager_speedchange_request(Train *tra, int step,
                            PredictionProblemCallback *ppc, void *ppcu) {
   ErrorCode ec, ec2;
@@ -102,6 +102,8 @@ ErrorCode speedmanager_speedchange_request(Train *tra, int step,
     tra->speed.decel.duration= stop_info(tra,vnow)->ts;
     toev_start(&tra->speed.decel);
     tra->speed.speed= vnow;
+    ec= predict_confirm(tra,0, 0,(char*)"deceleration forbidden");
+    assert(!ec);
     xmit(tra);
     return 0;
   }
@@ -120,7 +122,6 @@ ErrorCode speedmanager_speedchange_request(Train *tra, int step,
   toev_stop(&tra->speed.decel);
   tra->speed.speed= vtarg;
   tra->speed.try_speed= -1;
-  tra->sigstopping= 0;
   xmit(tra);
   return 0;
 }
@@ -128,7 +129,6 @@ ErrorCode speedmanager_speedchange_request(Train *tra, int step,
 void speedmanager_reset_train(Train *tra) {
   Nmra n;
   
-  tra->sigstopping= 0;
   tra->speed.step= 0;
   toev_init(&tra->speed.decel);
   tra->speed.decel.callback= decel_done;