From 47b786d882d0ac8cf965d05644638b8ef4d0b9f4 Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Thu, 14 Apr 2022 16:38:25 +0200
Subject: [PATCH] DefaultDriverStrategy.DoBrake: Added debug variable for
 response history

---
 .../Impl/DefaultDriverStrategy.cs             | 69 +++++++++++++------
 1 file changed, 47 insertions(+), 22 deletions(-)

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
index deec758f40..c24b81ff83 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
@@ -1222,22 +1222,26 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			Meter brakingDistance, Meter currentDistance)
 		{
 			IResponse response;
-			Log.Debug(
-				"Phase: BRAKE. breaking distance: {0} start braking @ {1}", brakingDistance,
+			var debug = new DebugData();
+
+			Log.Debug("Phase: BRAKE. breaking distance: {0} start braking @ {1}", brakingDistance,
 				DriverStrategy.BrakeTrigger.BrakingStartDistance);
+
 			if (DriverStrategy.BrakeTrigger.BrakingStartDistance.IsSmaller(
-				currentDistance,
-				Constants.SimulationSettings.DriverActionDistanceTolerance / 2)) {
-				Log.Info(
-					"Expected Braking Deceleration could not be reached! {0}",
+				currentDistance, Constants.SimulationSettings.DriverActionDistanceTolerance / 2)) {
+				Log.Info("Expected Braking Deceleration could not be reached! {0}",
 					DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance);
 			}
-			var targetDistance = DataBus.VehicleInfo.VehicleSpeed < Constants.SimulationSettings.MinVelocityForCoast
-				? DriverStrategy.BrakeTrigger.TriggerDistance
-				: null;
+
+			Meter targetDistance = null;
+			if (DataBus.VehicleInfo.VehicleSpeed < Constants.SimulationSettings.MinVelocityForCoast) {
+				targetDistance = DriverStrategy.BrakeTrigger.TriggerDistance;
+			}
+
 			if (targetDistance == null && DriverStrategy.BrakeTrigger.NextTargetSpeed.IsEqual(0.SI<MeterPerSecond>())) {
 				targetDistance = DriverStrategy.BrakeTrigger.TriggerDistance - DefaultDriverStrategy.BrakingSafetyMargin;
 			}
+
 			Driver.DriverBehavior = DrivingBehavior.Braking;
 
 			if (DataBus.VehicleInfo.VehicleSpeed.IsEqual(0) && DriverStrategy.BrakeTrigger.NextTargetSpeed.IsEqual(0)) {
@@ -1248,62 +1252,81 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				}
 
 				response = Driver.DrivingActionAccelerate(absTime, ds, 1.KMPHtoMeterPerSecond(), gradient);
+				debug.Add(new { a = "(1) Accelerate", response });
+
 				if (response is ResponseUnderload) {
-					response = Driver.DrivingActionBrake(
-						absTime, ds, 1.KMPHtoMeterPerSecond(), gradient, response, overrideAction: DrivingAction.Accelerate);
+					response = Driver.DrivingActionBrake(absTime, ds, 1.KMPHtoMeterPerSecond(), gradient, response,
+						overrideAction: DrivingAction.Accelerate);
+					debug.Add(new { a = "(2) Brake", response });
 				}
 			} else {
-				response = Driver.DrivingActionBrake(
-					absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
+				response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
 					gradient, targetDistance: targetDistance);
+				debug.Add(new { a = "(3) Brake", response });
 			}
 
-			if ((DataBus.GearboxInfo.GearboxType.AutomaticTransmission() || DataBus.HybridControllerInfo != null) && response == null) {
+			if ((DataBus.GearboxInfo.GearboxType.AutomaticTransmission() || DataBus.HybridControllerInfo != null)
+				&& response == null) {
 				for (var i = 0; i < 3 && response == null; i++) {
 					DataBus.Brakes.BrakePower = 0.SI<Watt>();
-					response = Driver.DrivingActionBrake(
-						absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
+					response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
 						gradient, targetDistance: targetDistance);
+					debug.Add(new { a = "(4) Brake", response });
 				}
 
 				if (response == null) {
 					throw new VectoException("No valid operating point found");
 				}
 			}
-
 			switch (response) {
 				case ResponseOverload r:
 					Log.Info("Brake -> Got OverloadResponse during brake action - desired deceleration could not be reached! response: {0}", r);
 					if (!DataBus.ClutchInfo.ClutchClosed(absTime)) {
 						Log.Info("Brake -> Overload -> Clutch is open - Trying roll action");
 						response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
-						if (response is ResponseSpeedLimitExceeded)
+						debug.Add(new { a = "(5) Roll", response });
+						if (response is ResponseSpeedLimitExceeded) {
 							response = Driver.DrivingActionBrake(absTime, ds, targetVelocity, gradient);
+							debug.Add(new { a = "(6) Brake", response });
+						}
 					} else {
 						Log.Info("Brake -> Overload -> Clutch is closed - Trying brake action again");
 						DataBus.Brakes.BrakePower = 0.SI<Watt>();
 						DataBus.HybridControllerCtl?.RepeatDrivingAction(absTime);
 						response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
 							gradient, targetDistance: targetDistance);
+						debug.Add(new { a = "(7) Brake", response });
 						if (response is ResponseOverload) {
 							Log.Info("Brake -> Overload -> 2nd Brake -> Overload -> Trying accelerate action");
 							var gear = DataBus.GearboxInfo.Gear;
-							if (DataBus.GearboxInfo.GearEngaged(absTime))
+							if (DataBus.GearboxInfo.GearEngaged(absTime)) {
 								response = Driver.DrivingActionAccelerate(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
-							else
-								response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
+								debug.Add(new { a = "(8) Accelerate", response });
+							} else {
+								//try {
+									response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
+									debug.Add(new { a = "(9) Roll", response });
+								//} catch (VectoException e) {
+								//	debug.Add(new { a = "(10) Exception", e });
+								//	Log.Info("Got a VectoException {e}", e);
+								//	response = Driver.DrivingActionCoast(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+								//	debug.Add(new { a = "(11) Coast", response });
+								//}
+							}
 
 							switch (response) {
 								case ResponseGearShift _:
-									Log.Info("Brake -> Overload -> 2nd Brake -> Accelerate -> Got GearShift response, performing roll action");
+									Log.Info("Brake -> Overload -> 2nd Brake -> Accelerate or Roll -> Got GearShift response, performing roll action");
 									response = Driver.DrivingActionRoll(absTime, ds,
 										DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+									debug.Add(new { a = "(12) Roll", response });
 									break;
 								case ResponseUnderload _:
 									if (gear.Gear != DataBus.GearboxInfo.Gear.Gear) {
 										// AT Gearbox switched gears, shift losses are no longer applied, try once more...
 										response = Driver.DrivingActionAccelerate(absTime, ds,
 											DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+										debug.Add(new { a = "(13 Accelerate", response });
 									}
 									break;
 							}
@@ -1317,9 +1340,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					DataBus.Brakes.BrakePower = 0.SI<Watt>();
 					response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
 						gradient, targetDistance: targetDistance);
+					debug.Add(new { a = "(14) Brake", response });
 					if (response is ResponseOverload) {
 						Log.Info("Brake -> Gearshift -> Overload -> trying roll action (no gear engaged)");
 						response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+						debug.Add(new { a = "(15) Roll", response });
 					}
 					break;
 			}
-- 
GitLab