From d6f5eabe0cd212d03233959eacf9b270a270ef83 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 24 Sep 2015 17:33:29 +0200
Subject: [PATCH] Introduce EngineIdleController Class and Interface(s)

---
 .../Simulation/Impl/PowertrainBuilder.cs      |  5 +--
 .../SimulationComponent/ICombustionEngine.cs  |  5 ++-
 .../ICombustionEngineIdleController.cs        | 10 ++++++
 .../Models/SimulationComponent/Impl/Brakes.cs |  2 +-
 .../Models/SimulationComponent/Impl/Clutch.cs |  9 +++--
 .../Impl/CombustionEngine.cs                  | 35 ++++++++++++++++++-
 VectoCore/VectoCore.csproj                    |  1 +
 VectoCoreTest/Integration/CoachPowerTrain.cs  |  5 +--
 .../EngineOnlyCycle/EngineOnlyCycleTest.cs    |  2 +-
 .../SimulationRuns/FullPowertrain.cs          | 15 ++++----
 .../SimulationRuns/MinimalPowertrain.cs       | 12 ++++---
 .../Integration/Truck40tPowerTrain.cs         |  7 ++--
 .../Models/Simulation/DrivingCycleTests.cs    |  4 +--
 .../Models/SimulationComponent/ClutchTest.cs  |  2 +-
 .../CombustionEngineTest.cs                   |  2 +-
 .../Models/SimulationComponent/DriverTest.cs  |  9 ++---
 16 files changed, 94 insertions(+), 31 deletions(-)
 create mode 100644 VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs

diff --git a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index 052aaf2825..f3832255fb 100644
--- a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -70,8 +70,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 					break;
 			}
 
+			var engine = new CombustionEngine(_container, data.EngineData);
 			// gearbox --> clutch
-			tmp = AddComponent(tmp, new Clutch(_container, data.EngineData));
+			tmp = AddComponent(tmp, new Clutch(_container, data.EngineData, engine.GetIdleController()));
 
 
 			// clutch --> direct aux --> ... --> aux_XXX --> directAux
@@ -94,7 +95,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 				tmp = AddComponent(tmp, aux);
 			}
 			// connect aux --> engine
-			AddComponent(tmp, new CombustionEngine(_container, data.EngineData));
+			AddComponent(tmp, engine);
 
 			return _container;
 		}
diff --git a/VectoCore/Models/SimulationComponent/ICombustionEngine.cs b/VectoCore/Models/SimulationComponent/ICombustionEngine.cs
index 6626e33d7e..34b0eaf1c0 100644
--- a/VectoCore/Models/SimulationComponent/ICombustionEngine.cs
+++ b/VectoCore/Models/SimulationComponent/ICombustionEngine.cs
@@ -6,5 +6,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent
 	/// <summary>
 	/// Defines Interfaces for a combustion engine.
 	/// </summary>
-	public interface ICombustionEngine : ITnOutProvider, IEngineInfo {}
+	public interface ICombustionEngine : ITnOutProvider, IEngineInfo
+	{
+		ICombustionEngineIdleController GetIdleController();
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs b/VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs
new file mode 100644
index 0000000000..1b2f61d94c
--- /dev/null
+++ b/VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs
@@ -0,0 +1,10 @@
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent
+{
+	public interface ICombustionEngineIdleController : ITnOutPort
+	{
+		void SetRequestPort(ITnOutPort tnOutPort);
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/Models/SimulationComponent/Impl/Brakes.cs b/VectoCore/Models/SimulationComponent/Impl/Brakes.cs
index d37861b0e3..acaba8dbfc 100644
--- a/VectoCore/Models/SimulationComponent/Impl/Brakes.cs
+++ b/VectoCore/Models/SimulationComponent/Impl/Brakes.cs
@@ -34,7 +34,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				if (angularVelocity.IsEqual(0)) {
 					BreakTorque = torque;
 				} else {
-					BreakTorque = Formulas.PowerToTorque(BreakPower, angularVelocity);
+					BreakTorque = BreakPower / angularVelocity;
 				}
 			}
 			if (!dryRun && BreakPower < 0) {
diff --git a/VectoCore/Models/SimulationComponent/Impl/Clutch.cs b/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
index 364cc85f2a..14661335e7 100644
--- a/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
+++ b/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
@@ -17,12 +17,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private const double ClutchEff = 1;
 		private ClutchState _clutchState = SimulationComponent.ClutchState.ClutchSlipping;
 
+		protected ICombustionEngineIdleController IdleController;
 
-		public Clutch(IVehicleContainer cockpit, CombustionEngineData engineData)
+
+		public Clutch(IVehicleContainer cockpit, CombustionEngineData engineData,
+			ICombustionEngineIdleController idleController)
 			: base(cockpit)
 		{
 			_idleSpeed = engineData.IdleSpeed;
 			_ratedSpeed = engineData.FullLoadCurve.RatedSpeed;
+			IdleController = idleController;
 		}
 
 		public ClutchState State()
@@ -56,7 +60,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public IResponse Request(Second absTime, Second dt, NewtonMeter torque, PerSecond angularVelocity, bool dryRun = false)
 		{
 			if (angularVelocity == null) {
-				var retval = NextComponent.Request(absTime, dt, torque, null, dryRun);
+				//var retval = NextComponent.Request(absTime, dt, torque, null, dryRun);
+				var retval = IdleController.Request(absTime, dt, torque, null, dryRun);
 				retval.ClutchPowerRequest = 0.SI<Watt>();
 				return retval;
 			}
diff --git a/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
index e6860d90d8..f9e1ef2027 100644
--- a/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
+++ b/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
@@ -79,6 +79,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			get { return Data.FullLoadCurve.RatedSpeed; }
 		}
 
+		public ICombustionEngineIdleController GetIdleController()
+		{
+			return IdleController ?? new CombustionEngineIdleController(this);
+		}
+
+		protected CombustionEngineIdleController IdleController { get; set; }
+
 		#endregion
 
 		#region ITnOutProvider
@@ -450,6 +457,32 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		#endregion
 
-		public class CombustionEngineIdleController {}
+		protected class CombustionEngineIdleController : ICombustionEngineIdleController
+		{
+			protected CombustionEngine Engine;
+
+			protected ITnOutPort OutPort;
+
+			public CombustionEngineIdleController(CombustionEngine combustionEngine)
+			{
+				Engine = combustionEngine;
+			}
+
+			public void SetRequestPort(ITnOutPort tnOutPort)
+			{
+				OutPort = tnOutPort;
+			}
+
+			public IResponse Request(Second absTime, Second dt, NewtonMeter torque, PerSecond angularVelocity,
+				bool dryRun = false)
+			{
+				throw new NotImplementedException();
+			}
+
+			public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity)
+			{
+				return new ResponseSuccess() { Source = this };
+			}
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore.csproj b/VectoCore/VectoCore.csproj
index 2505b4398f..cdc012fe68 100644
--- a/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore.csproj
@@ -155,6 +155,7 @@
     <Compile Include="Models\SimulationComponent\Data\GearboxType.cs" />
     <Compile Include="Models\SimulationComponent\IAuxiliary.cs" />
     <Compile Include="Models\SimulationComponent\IBrakes.cs" />
+    <Compile Include="Models\SimulationComponent\ICombustionEngineIdleController.cs" />
     <Compile Include="Models\SimulationComponent\IDriverActions.cs" />
     <Compile Include="Models\SimulationComponent\IDriverStrategy.cs" />
     <Compile Include="Models\SimulationComponent\IDrivingCycleInfo.cs" />
diff --git a/VectoCoreTest/Integration/CoachPowerTrain.cs b/VectoCoreTest/Integration/CoachPowerTrain.cs
index 24a7ef13c7..003829bcd2 100644
--- a/VectoCoreTest/Integration/CoachPowerTrain.cs
+++ b/VectoCoreTest/Integration/CoachPowerTrain.cs
@@ -48,6 +48,7 @@ namespace TUGraz.VectoCore.Tests.Integration
 			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
 			var driverData = CreateDriverData(AccelerationFile);
 
+			var engine = new CombustionEngine(container, engineData);
 			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
 			dynamic tmp = Port.AddComponent(cycle, new Driver(container, driverData, new DefaultDriverStrategy()));
 			tmp = Port.AddComponent(tmp, new Vehicle(container, vehicleData));
@@ -55,14 +56,14 @@ namespace TUGraz.VectoCore.Tests.Integration
 			tmp = Port.AddComponent(tmp, new Brakes(container));
 			tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData));
 			tmp = Port.AddComponent(tmp, new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)));
-			tmp = Port.AddComponent(tmp, new Clutch(container, engineData));
+			tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController()));
 
 			var aux = new Auxiliary(container);
 			aux.AddConstant("", 0.SI<Watt>());
 
 			tmp = Port.AddComponent(tmp, aux);
 
-			Port.AddComponent(tmp, new CombustionEngine(container, engineData));
+			Port.AddComponent(tmp, engine);
 
 			return container;
 		}
diff --git a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs
index 86d87d3484..751d0df538 100644
--- a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs
+++ b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs
@@ -82,7 +82,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle
 			var angularVelocity = 644.4445.RPMtoRad();
 			var power = 2329.973.SI<Watt>();
 
-			gearbox.OutPort().Request(absTime, dt, Formulas.PowerToTorque(power, angularVelocity), angularVelocity);
+			gearbox.OutPort().Request(absTime, dt, power / angularVelocity, angularVelocity);
 
 			foreach (var sc in vehicleContainer.SimulationComponents()) {
 				sc.CommitSimulationStep(dataWriter);
diff --git a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
index 8aa3661f5a..4784c93be4 100644
--- a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
+++ b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
@@ -58,8 +58,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData));
 			var gbx = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
 			tmp = Port.AddComponent(tmp, gbx);
-			tmp = Port.AddComponent(tmp, new Clutch(container, engineData));
-			Port.AddComponent(tmp, new CombustionEngine(container, engineData));
+			var engine = new CombustionEngine(container, engineData);
+			tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController()));
+			Port.AddComponent(tmp, engine);
 
 			cyclePort.Initialize();
 
@@ -114,8 +115,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData));
 			var gbx = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
 			tmp = Port.AddComponent(tmp, gbx);
-			tmp = Port.AddComponent(tmp, new Clutch(container, engineData));
-			Port.AddComponent(tmp, new CombustionEngine(container, engineData));
+			var engine = new CombustionEngine(container, engineData);
+			tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController()));
+			Port.AddComponent(tmp, engine);
 
 			cyclePort.Initialize();
 
@@ -186,8 +188,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			tmp = Port.AddComponent(tmp, new Brakes(container));
 			tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData));
 			tmp = Port.AddComponent(tmp, new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)));
-			tmp = Port.AddComponent(tmp, new Clutch(container, engineData));
-			Port.AddComponent(tmp, new CombustionEngine(container, engineData));
+			var engine = new CombustionEngine(container, engineData);
+			tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController()));
+			Port.AddComponent(tmp, engine);
 
 			cyclePort.Initialize();
 
diff --git a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
index e2f6627baf..b59165ec3e 100644
--- a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
+++ b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
@@ -53,8 +53,8 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
 			tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData));
 
-			tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData));
 			var engine = new CombustionEngine(vehicleContainer, engineData);
+			tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController()));
 			Port.AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer);
@@ -104,8 +104,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
 			tmp = Port.AddComponent(tmp, new Brakes(vehicleContainer));
 			tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData));
-			tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData));
-			Port.AddComponent(tmp, new CombustionEngine(vehicleContainer, engineData));
+			var engine = new CombustionEngine(vehicleContainer, engineData);
+			tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController()));
+			Port.AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer);
 
@@ -173,8 +174,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
 			tmp = Port.AddComponent(tmp, new Brakes(vehicleContainer));
 			tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData));
-			tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData));
-			Port.AddComponent(tmp, new CombustionEngine(vehicleContainer, engineData));
+			var engine = new CombustionEngine(vehicleContainer, engineData);
+			tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController()));
+			Port.AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer);
 
diff --git a/VectoCoreTest/Integration/Truck40tPowerTrain.cs b/VectoCoreTest/Integration/Truck40tPowerTrain.cs
index a84ce2cfbf..d0cf2c748b 100644
--- a/VectoCoreTest/Integration/Truck40tPowerTrain.cs
+++ b/VectoCoreTest/Integration/Truck40tPowerTrain.cs
@@ -55,6 +55,7 @@ namespace TUGraz.VectoCore.Tests.Integration
 			var vehicleData = CreateVehicleData(massExtra, loading);
 			var driverData = CreateDriverData(AccelerationFile);
 
+			var engine = new CombustionEngine(container, engineData);
 			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
 			dynamic tmp = Port.AddComponent(cycle, new Driver(container, driverData, new DefaultDriverStrategy()));
 			tmp = Port.AddComponent(tmp, new Vehicle(container, vehicleData));
@@ -62,14 +63,16 @@ namespace TUGraz.VectoCore.Tests.Integration
 			tmp = Port.AddComponent(tmp, new Brakes(container));
 			tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData));
 			tmp = Port.AddComponent(tmp, new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)));
-			tmp = Port.AddComponent(tmp, new Clutch(container, engineData));
+			var clutch = new Clutch(container, engineData, engine.GetIdleController());
+			engine.GetIdleController().SetRequestPort(clutch);
+			tmp = Port.AddComponent(tmp, clutch);
 
 			var aux = new Auxiliary(container);
 			aux.AddConstant("", 0.SI<Watt>());
 
 			tmp = Port.AddComponent(tmp, aux);
 
-			Port.AddComponent(tmp, new CombustionEngine(container, engineData));
+			Port.AddComponent(tmp, engine);
 
 			return container;
 		}
diff --git a/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs b/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs
index 096a973318..2409282395 100644
--- a/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs
+++ b/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs
@@ -74,7 +74,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			Assert.AreEqual(absTime, outPort.AbsTime);
 			Assert.AreEqual(dt, outPort.Dt);
 			Assert.AreEqual(743.2361.RPMtoRad(), outPort.AngularVelocity);
-			Assert.AreEqual(Formulas.PowerToTorque(2779.576.SI<Watt>(), 743.2361.RPMtoRad()), outPort.Torque);
+			Assert.AreEqual(2779.576.SI<Watt>() / 743.2361.RPMtoRad(), outPort.Torque);
 
 			// ========================
 
@@ -95,7 +95,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 				Assert.AreEqual(absTime, outPort.AbsTime);
 				Assert.AreEqual(dt, outPort.Dt);
 				Assert.AreEqual(1584.731.RPMtoRad(), outPort.AngularVelocity);
-				Assert.AreEqual(Formulas.PowerToTorque(3380.548.SI<Watt>(), 1584.731.RPMtoRad()), outPort.Torque);
+				Assert.AreEqual(3380.548.SI<Watt>() / 1584.731.RPMtoRad(), outPort.Torque);
 
 				absTime += dt;
 			}
diff --git a/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs b/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs
index bc726dae75..88877f8ffa 100644
--- a/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs
+++ b/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs
@@ -22,7 +22,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(CoachEngine);
 			var gearbox = new MockGearbox(container);
 
-			var clutch = new Clutch(container, engineData);
+			var clutch = new Clutch(container, engineData, null);
 
 			var inPort = clutch.InPort();
 			var outPort = new MockTnOutPort();
diff --git a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs
index 1127b0d6a8..671e92727f 100644
--- a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs
+++ b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs
@@ -206,7 +206,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(CoachEngine);
 			var engine = new CombustionEngine(container, engineData);
 
-			var clutch = new Clutch(container, engineData);
+			var clutch = new Clutch(container, engineData, engine.GetIdleController());
 
 			var driver = new MockDriver(container);
 
diff --git a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs
index 204c9bfed6..0857517930 100644
--- a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs
+++ b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs
@@ -50,7 +50,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 
 			dynamic tmp = AddComponent(driver, new Vehicle(vehicleContainer, vehicleData));
 			tmp = AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
-			tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData));
+			tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController()));
 			AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer) { Gear = 1 };
@@ -105,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 
 			dynamic tmp = AddComponent(driver, new Vehicle(vehicleContainer, vehicleData));
 			tmp = AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
-			tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData));
+			tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController()));
 			AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer);
@@ -163,8 +163,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 
 			dynamic tmp = AddComponent(driver, new Vehicle(vehicleContainer, vehicleData));
 			tmp = AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
-			tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData));
-			AddComponent(tmp, new CombustionEngine(vehicleContainer, engineData));
+			var engine = new CombustionEngine(vehicleContainer, engineData);
+			tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController()));
+			AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer);
 
-- 
GitLab