From b3378b352744ec09a1ce9f4577dc79473e84ca89 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 29 Jan 2018 17:03:17 +0100
Subject: [PATCH] Extend Driver functionality: if no operating point can be
 found because the vehicle already stopped and no acceleration > 0 can be
 achieved (e.g. because steep uphill and the gearbox is disengaged), insert a
 'halt' action and drive off again

---
 .../Models/SimulationComponent/Impl/Driver.cs | 26 ++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
index 894dd1b709..c9c7b0cbf4 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
@@ -181,6 +181,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 						response);
 				}
 
+				if (nextOperatingPoint == null && absTime > 0 && DataBus.VehicleStopped) {
+					Log.Info(
+						"No operating point found! Vehicle stopped! trying HALT action");
+					DataBus.BrakePower = 1.SI<Watt>();
+					retVal = DrivingActionHalt(absTime, operatingPoint.SimulationInterval, 0.SI<MeterPerSecond>(), gradient);
+
+					retVal.SimulationDistance = 0.SI<Meter>();
+					retVal.Acceleration = 0.SI<MeterPerSquareSecond>();
+					retVal.SimulationInterval = operatingPoint.SimulationInterval;
+					retVal.OperatingPoint = new OperatingPoint() {
+						Acceleration = retVal.Acceleration,
+						SimulationDistance = retVal.SimulationDistance,
+						SimulationInterval = operatingPoint.SimulationInterval
+					};
+					return retVal;
+				} 
+
 				var limitedOperatingPoint = nextOperatingPoint;
 				if (!(retVal is ResponseEngineSpeedTooHigh || DataBus.ClutchClosed(absTime))) {
 					limitedOperatingPoint = LimitAccelerationByDriverModel(nextOperatingPoint,
@@ -746,12 +763,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 								retVal.Acceleration = tmp.Acceleration;
 								retVal.SimulationInterval = tmp.SimulationInterval;
 								retVal.SimulationDistance = tmp.SimulationDistance;
+
+
+							} else {
+								retVal.Acceleration = acc;
+								retVal.SimulationDistance = 0.SI<Meter>();
 							}
 							IterationStatistics.Increment(this, "SearchOperatingPoint");
 							DriverAcceleration = acc;
 							var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, true);
 							response.OperatingPoint = retVal;
 							return response;
+							
 						},
 					criterion: response => {
 						var r = (ResponseDryRun)response;
@@ -768,6 +791,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 							var r = (ResponseDryRun)response;
 							return r != null && !actionRoll && !ds.IsEqual(r.OperatingPoint.SimulationDistance);
 						});
+				return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance);
 			} catch (VectoSearchAbortedException) {
 				// search aborted, try to go ahead with the last acceleration
 			} catch (Exception) {
@@ -779,7 +803,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				DriverData.AccelerationCurve.MaxAcceleration())) {
 				Log.Info("Operating Point outside driver acceleration limits: a: {0}", retVal.Acceleration);
 			}
-			return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance);
+			return null;
 		}
 
 		private static Watt GetOrigDelta(IResponse initialResponse, bool coastingOrRoll, bool actionRoll)
-- 
GitLab