chiark / gitweb /
wip reorg with new scalars instead of justarrive
authorian <ian>
Sun, 13 Feb 2005 19:18:11 +0000 (19:18 +0000)
committerian <ian>
Sun, 13 Feb 2005 19:18:11 +0000 (19:18 +0000)
hostside/safety.c
hostside/safety.h

index 54b7cd8641e76065438239176c9631308feaabfe..4900e1df5f27056665fcedf66004377626acaadc 100644 (file)
@@ -103,8 +103,8 @@ void lay_train_checkclash(ErrorCode *ec, SegmentLinkInfo *lnki
   lay_train_checkclash2( 
 
 static void lay_train(ErrorCode *ec, TrainNum tran,
-                     TrackLocation tloc, long advance,
-                     unsigned pass) {
+                     TrackLocation tloc, long into,
+                     unsigned backwards, long speed) {
   /* pass 0: update actual train location, check for train clashing
    * with itself (ie, fail if we find segment with same train and
    * tr_updated set.
@@ -117,13 +117,20 @@ static void lay_train(ErrorCode *ec, TrainNum tran,
 
   if (*ec) return;
 
-  remain= overall= advance + tra->speed * SPEED_CLEAR_MULT;
+  segn= tra->segn;
+  seg= &s->segs[segn];
+  tloc.segn= segn;
+  tloc.into= into;
+  tloc.backwards= seg->tr_backwards ^ backwards;
+
+  remain= overall= advance + speed * SPEED_CLEAR_MULT;
 
   for (;;) {
-    seg= &s->segs[tloc.segn];
-    segi= &info_segment[tloc.segn];
+    segn= tloc.segn;
+    seg= &s->segs[segn];
+    segi= &info_segment[segn];
 
-    if (pass==0) {
+    if (check_clash) {
       if (seg->tr_updated) {
        *ec= safety_problem(tloc.segn, tran, tran, "collision with itself");
        return;
@@ -138,23 +145,10 @@ static void lay_train(ErrorCode *ec, TrainNum tran,
     }
     
     seg->owned= 1;
-    seg->owner_backwards= tloc.backwards;
+    seg->owner_backwards= tloc.backwards ^ backwards;
     seg->tr_updated= 1;
     seg->tran= tran;
 
-    seg->tr_justarrived= pass==0 && remain && tra->justarrived;
-    
-      lay_train_checkclash(ec, trackloc_segmentlink_near());
-      if (!remain && tra->justarrived) {
-       
-       
-      if (tloc.into <= JUSTARRIVED_INTOMAX) {
-       seg->tr_justarrived= 1;
-      } else {
-       lay_train_checkclash(&ec, trackloc_segmentlink_far());
-      }
-
-
     dist_until= (overall - remain) - advance;
     time_until= (SPEED_FACTOR * dist_until) / tra->speed;
     *(pass==0 ? &seg->until_here : &seg->until_detect)= time_until;
@@ -191,20 +185,12 @@ void safety_train_changed(TrainNum tran) {
   segn= tra->foredetect;
   seg= &s->seg[segn];
 
-  tloc.segn= segn;
-  tloc.into= 0;
-  tloc.backwards= seg->tr_backwards;
-
-  tloc.into= trackloc_remaininseg(&tloc);
-  if (tra->justarrived && tloc.into > JUSTARRIVED_DIST)
-    tloc.into= JUSTARRIVED_DIST;
-
   head= tra->backwards ? trai->tail : trai->head;
   lay_train(tran, &ec, tloc, head, 0,1);
 
   ec= 0;
-  lay_train(&ec, tran, tloc, head, 0,1);
-  lay_train(&ec, tran, tloc, 0,    1,0);
+  lay_train(&ec, tran, tloc, head, 0);
+  lay_train(&ec, tran, tloc, 0,    1);
   lay_train_done(tran);
   if (ec) return ec;
 
@@ -226,19 +212,27 @@ void safety_notify_detection(SegmentNum segn) {
   SegmentState *seg = s->seg[segn];
   TrainNum tran = segs->owner;
   TrainState *tra = s->tras[tran];
+  TrackLocation tloc;
 
   if (seg->detectable_now) return;
   if (!seg->detectable_future)
     safety_panic(segn, NONE, "unexpected detection");
 
-  tra->foredetect= segn;
-  tra->justarrived= 0;
+  tloc.segn= segn;
+  tloc.into= 0;
+  tloc.backwards= seg->tr_backwards;
 
+  tra->foredetect= segn;
+  tra->maxinto= trackloc_remaininseg(&tloc);
+  
   if (seg->autostop) {
-    actual_setspeed(tran, 0);
-    tra->justarrived= 1;
+    seg->autostop= 0;
+    speedmanager_setspeed(tran, 0);
+    if (tra->maxinto > AUTOSTOP_UNCERTAINTY)
+      tra->maxinto= AUTOSTOP_UNCERTAINTY;
   }
-
+  tra->uncertainty= tra->maxinto;
+    
   ec= safety_train_changed(tran);
   if (ec) {
     logmsg(tran, segn, "emergency stop");
index aaedd5b66137be2c21c3c25c8ce0e34aea8cae09..31e200617602b0fe10b7d3e57e20551fa70927cd 100644 (file)
@@ -11,9 +11,9 @@ typedef short Distance;
 typedef char Speed; /* non-negative, units of 4mm/s */
 
 typedef struct {
-  SegmentNum foredetect;
-  unsigned
-    justarrived:1, /* is stopped just after triggering foredetect segment */
+  SegmentNum foredetect; /* train's detectable part is at most maxinto */
+  Distance maxinto, uncertainty; /* into foredetect but train may be */
+  unsigned                       /* uncertainty less far advanced */
     backwards:1; /* train is moving backwards wrt its own front and back */
   Speed speed;
 } TrainState;
@@ -35,7 +35,6 @@ typedef struct {
 typedef struct {
   unsigned next_backwards:1;
   SegmentNum next;
-  SegmentNum clashing;
   Distance dist;
 } SegmentLinkInfo;