From 34977df03b4767ad6a41da7dcd2b9ebf9beb98df Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Tue, 23 Aug 2016 16:46:28 +0200
Subject: [PATCH] CycleClutch: Added Search for Idling-Operating point if
 ResponseUnderload from Engine

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

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleClutch.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleClutch.cs
index 1a674c3138..b481cb442f 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleClutch.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleClutch.cs
@@ -29,9 +29,13 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
 using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 {
@@ -59,7 +63,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			} else {
 				// disengaged -> clutch open
 				var retVal = NextComponent.Request(absTime, dt, outTorque, angularVelocityIn, dryRun);
-				return retVal;
+				if (dryRun) {
+					return retVal;
+				} else {
+					retVal.Switch().
+						Case<ResponseSuccess>().
+						Case<ResponseUnderload>(r => {
+							var angularSpeed = SearchAlgorithm.Search(angularVelocityIn, r.Delta,
+								Constants.SimulationSettings.EngineIdlingSearchInterval,
+								getYValue: result => ((ResponseDryRun)result).DeltaDragLoad,
+								evaluateFunction: n => NextComponent.Request(absTime, dt, outTorque, n, true),
+								criterion: result => ((ResponseDryRun)result).DeltaDragLoad.Value());
+							Log.Debug(
+								"Found operating point for idling in cycle clutch. absTime: {0}, dt: {1}, torque: {2}, angularSpeed: {3}",
+								absTime, dt,
+								outTorque, angularSpeed);
+							retVal = NextComponent.Request(absTime, dt, outTorque, angularSpeed);
+						}).
+						Default(r => { throw new UnexpectedResponseException("searching CycleClutch Idling point", r); });
+
+					return retVal;
+				}
 			}
 		}
 
-- 
GitLab