chiark / gitweb /
hostside/safety: correctly pass JUSTDET back to predict() inside safetymanager_safety...
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 2 Jan 2011 01:37:11 +0000 (01:37 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 2 Jan 2011 01:37:11 +0000 (01:37 +0000)
hostside/safety.c
hostside/safety.h
hostside/speed.c

index bb3d2ed48d0767fdc619bb33b5be7cbabcda8c9f..2780bc007648f389607bcea32d46aaad25e3fc85 100644 (file)
@@ -1264,7 +1264,7 @@ void safety_notify_detection(Segment *seg) {
   tra->maxinto= tra->uncertainty= maxinto;
 
   report_train_position(tra);
-  speedmanager_safety_stop(tra,tnow);
+  speedmanager_safety_stop(tra,tnow, PREDF_JUSTDET|PREDF_OLDPLAN);
 }
 
 ErrorCode safety_movposchange(Segment *seg, MovPosComb comb,
index 4ab7b6134a6a2ffe8a0154a49721ff21612d2602..d61e88a3b215e8c39c62917f9e9f7251fd80c214 100644 (file)
@@ -255,7 +255,9 @@ ErrorCode speedmanager_speedchange_request(Train *tra, int step,
                            PredictionProblemCallback *ppc, void *ppcu);
   /* ppc and ppcu as for predict_confirm */
 
-void speedmanager_safety_stop(Train *tra, struct timeval tnow);
+void speedmanager_safety_stop(Train *tra, struct timeval tnow,
+                             unsigned predictflags);
+  /* Ignores value of PREDF_OLDPLAN */
 void speedmanager_reset_train(Train *tra);
 
 void speedmanager_getinfo(Train *tra, struct timeval tnow, SpeedInfo*);
index 06e57c9b5a164edae9ad380946ce61ac80e8454c..44f21acc58e4af7b71532e2af5c3684a69843f46 100644 (file)
@@ -107,7 +107,10 @@ int speedmanager_stopped(Train *tra) {
 }  
 
 static ErrorCode request_core(Train *tra, int step, struct timeval tnow,
+                             unsigned predictflags,
                              PredictionProblemCallback *ppc, void *ppcu) {
+  /* We ignore the value of PREDF_OLDPLAN in predictflags, as we can tell
+   * whether the old plan is good by the change in speed */
   ErrorCode ec, ec2;
   double vnow, vtarg, vmax;
   SpeedInfo try;
@@ -140,13 +143,15 @@ static ErrorCode request_core(Train *tra, int step, struct timeval tnow,
     tra->uncertainty += tra->maxinto - oldmaxinto;
   }
 
+  predictflags &= ~PREDF_OLDPLAN;
+
   ec= predict(tra,tnow,
-             step <= tra->speed.step ? PREDF_OLDPLAN : 0,
+             predictflags | (step <= tra->speed.step ? PREDF_OLDPLAN : 0),
              0,0, &try, ppc,ppcu);
   if (ec) {
     tra->uncertainty -= tra->maxinto - oldmaxinto;
     tra->maxinto= oldmaxinto;
-    ec2= predict(tra,tnow, PREDF_OLDPLAN,0,0, 0,
+    ec2= predict(tra,tnow, predictflags | PREDF_OLDPLAN, 0,0, 0,
                 0,(char*)"abandoned acceleration");
     assert(!ec2);
     return ec;
@@ -172,12 +177,13 @@ ErrorCode speedmanager_speedchange_request(Train *tra, int step,
 
   MUSTECR( safety_checktrain(tra,ppc,ppcu) );
   mgettimeofday(&tnow);
-  return request_core(tra,step,tnow,ppc,ppcu);
+  return request_core(tra,step, tnow,0, ppc,ppcu);
 }
 
-void speedmanager_safety_stop(Train *tra, struct timeval tnow) {
+void speedmanager_safety_stop(Train *tra, struct timeval tnow,
+                             unsigned predictflags) {
   ErrorCode ec;
-  ec= request_core(tra,0,tnow,0,(char*)"emergency stop");
+  ec= request_core(tra,0,tnow,predictflags, 0,(char*)"emergency stop");
   assert(!ec);
 }