From 62898c68ea10f422bf2fbda1fd6b1ebbf8b99a3b Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 4 Sep 2020 13:27:35 +0200
Subject: [PATCH] fix case where gearshift happens and braking results in
 negative braking power - perform roll action

---
 VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs    | 1 +
 .../SimulationComponent/Impl/DefaultDriverStrategy.cs       | 4 ++++
 .../Models/SimulationComponent/Impl/HybridController.cs     | 3 ++-
 .../Models/SimulationComponent/Strategies/HybridStrategy.cs | 6 ++++--
 .../GenericVehicle_Group5_P2/Transmission/AMT_12.vgbx       | 2 +-
 .../Hyb_P2_Group2/Class2_RigidTruck_ParHyb_ENG.vecto        | 3 +--
 6 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs b/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
index 28fb219983..c11db7a245 100644
--- a/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
+++ b/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
@@ -12,6 +12,7 @@ namespace TUGraz.VectoCommon.Models {
 	public class HybridStrategyLimitedResponse : IHybridStrategyResponse
 	{
 		public Watt Delta { get; set; }
+		public PerSecond DeltaEngineSpeed { get; set; }
 	}
 
 	public class HybridStrategyResponse : IHybridStrategyResponse
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
index a4c2a59a1f..e713396f64 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
@@ -1383,6 +1383,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 								response = Driver.DrivingActionBrake(
 									absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
 									gradient, r);
+								if (response is ResponseOverload) {
+									response = Driver.DrivingActionRoll(absTime, ds,
+										DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+								}
 							}).Case<ResponseOverload>(
 							() => {
 								DataBus.Brakes.BrakePower = 0.SI<Watt>();
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
index fde1a9a869..686d398bf4 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
@@ -102,7 +102,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					if (dryRun) {
 						return new ResponseDryRun(this) {
 							DeltaDragLoad = ovl.Delta,
-							DeltaFullLoad = ovl.Delta
+							DeltaFullLoad = ovl.Delta,
+							DeltaEngineSpeed = ovl.DeltaEngineSpeed
 						};
 					}
 					return new ResponseOverload(this) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
index d59b238004..da75dd5c10 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
@@ -239,7 +239,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				RequestDryRun(absTime, dt, outTorque, outAngularVelocity, currentGear, maxEmDriveSetting);
 			if (maxEmDriveResponse.DeltaFullLoad.IsSmallerOrEqual(0)) {
 				return new HybridStrategyLimitedResponse() {
-					Delta = outTorque * outAngularVelocity - StrategyParameters.MaxDrivetrainPower
+					Delta = outTorque * outAngularVelocity - StrategyParameters.MaxDrivetrainPower,
+					DeltaEngineSpeed = maxEmDriveResponse.DeltaEngineSpeed
 				};
 			}
 
@@ -260,7 +261,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				delta = (outTorque  - maxTorque) * outAngularVelocity;
 			}
 			return new HybridStrategyLimitedResponse() {
-				Delta = delta
+				Delta = delta,
+				DeltaEngineSpeed = maxEmDriveResponse.DeltaEngineSpeed
 			};
 		}
 
diff --git a/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12.vgbx b/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12.vgbx
index 4e9148c1ad..ae0a1a7eba 100644
--- a/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12.vgbx
+++ b/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12.vgbx
@@ -110,7 +110,7 @@
       "Enabled": false
     },
     "DownshiftAfterUpshiftDelay": 6.0,
-    "UpshiftAfterDownshiftDelay": 10.0,
+    "UpshiftAfterDownshiftDelay": 6.0,
     "UpshiftMinAcceleration": 0.1,
     "PowershiftShiftTime": 0.8
   }
diff --git a/VectoCore/VectoCoreTest/TestData/Hybrids/Hyb_P2_Group2/Class2_RigidTruck_ParHyb_ENG.vecto b/VectoCore/VectoCoreTest/TestData/Hybrids/Hyb_P2_Group2/Class2_RigidTruck_ParHyb_ENG.vecto
index 9a8b19e333..fa9c12a68c 100644
--- a/VectoCore/VectoCoreTest/TestData/Hybrids/Hyb_P2_Group2/Class2_RigidTruck_ParHyb_ENG.vecto
+++ b/VectoCore/VectoCoreTest/TestData/Hybrids/Hyb_P2_Group2/Class2_RigidTruck_ParHyb_ENG.vecto
@@ -58,8 +58,7 @@
       "Interurban",
       "MunicipalUtility",
       "Suburban",
-      "Urban",
-
+      "Urban"
     ]
   }
 }
\ No newline at end of file
-- 
GitLab