From a5599df1d3e873eedd7753b5500eb28aedf05931 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Wed, 2 Jan 2019 10:13:40 +0100
Subject: [PATCH] allow driver strategy to override announced driving action.

necessary if slight braking is required when accelerating from stop due to engine inertia (special case, vehicle stops too early when halting uphill)
---
 .../VectoCore/Models/SimulationComponent/IDriverActions.cs   | 4 +++-
 .../Models/SimulationComponent/Impl/DefaultDriverStrategy.cs | 2 +-
 .../VectoCore/Models/SimulationComponent/Impl/Driver.cs      | 5 ++---
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/IDriverActions.cs b/VectoCore/VectoCore/Models/SimulationComponent/IDriverActions.cs
index d76fbcf605..aba54b2fcf 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/IDriverActions.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/IDriverActions.cs
@@ -32,6 +32,7 @@
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent
@@ -83,12 +84,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent
 		/// <param name="gradient"></param>
 		/// <param name="previousResponse"></param>
 		/// <param name="targetDistance"></param>
+		/// <param name="overrideAction"></param>
 		/// <returns>
 		/// * ResponseSuccess
 		/// * ResponseDrivingCycleDistanceExceeded: vehicle is at low speed, coasting would lead to stop before ds is reached.
 		/// </returns>
 		IResponse DrivingActionBrake(Second absTime, Meter ds, MeterPerSecond nextTargetSpeed, Radian gradient,
-			IResponse previousResponse = null, Meter targetDistance = null);
+			IResponse previousResponse = null, Meter targetDistance = null, DrivingAction? overrideAction = null);
 
 		/// <summary>
 		/// perform a 'roll driving action', i.e., the clutch is open and the vehicle rolls without motoring. adjust the acceleration 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
index 054ad5684a..fd02cf2bd4 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
@@ -653,7 +653,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 				response = Driver.DrivingActionAccelerate(absTime, ds, 1.KMPHtoMeterPerSecond(), gradient);
 				if (response is ResponseUnderload) {
-					response = Driver.DrivingActionBrake(absTime, ds, 1.KMPHtoMeterPerSecond(), gradient, response);
+					response = Driver.DrivingActionBrake(absTime, ds, 1.KMPHtoMeterPerSecond(), gradient, response, overrideAction: DrivingAction.Accelerate);
 				}
 			} else {
 				response = Driver.DrivingActionBrake(
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
index 34bfd9b2a0..6427763daa 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
@@ -478,10 +478,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return response;
 		}
 
-		public IResponse DrivingActionBrake(Second absTime, Meter ds, MeterPerSecond nextTargetSpeed, Radian gradient,
-			IResponse previousResponse = null, Meter targetDistance = null)
+		public IResponse DrivingActionBrake(Second absTime, Meter ds, MeterPerSecond nextTargetSpeed, Radian gradient, IResponse previousResponse = null, Meter targetDistance = null, DrivingAction? overrideAction = null)
 		{
-			DrivingAction = DrivingAction.Brake;
+			DrivingAction = overrideAction ?? DrivingAction.Brake;
 			IterationStatistics.Increment(this, "Brake");
 			Log.Debug("DrivingAction Brake");
 
-- 
GitLab