From 6061b46e3a7320c8c604858311fb720b00f946e2 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at>
Date: Wed, 23 Nov 2022 09:53:04 +0100
Subject: [PATCH] updated data adapter

---
 .../EngineeringDataAdapter.cs                 | 12 ++--
 .../DeclarationDataAdapterHeavyLorry.cs       | 64 ++++++++++++++-----
 .../IDeclarationDataAdapter.cs                |  5 +-
 .../Models/Connector/Ports/Impl/Response.cs   |  6 +-
 .../SimulationComponent/Impl/AxleGear.cs      |  5 +-
 .../Impl/BatteryElectricMotorController.cs    |  3 +-
 .../SimulationComponent/Impl/ElectricMotor.cs | 19 +++---
 .../Models/SimulationComponent/Impl/PEVPTO.cs | 53 ++++++++++-----
 8 files changed, 112 insertions(+), 55 deletions(-)

diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index afd6807124..d18eb2d5f5 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -430,21 +430,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		}
 
 		private static void SetEngineeringData(
-			IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal)
-		{
+			IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal) {
 			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
 			retVal.TractionInterruption = gearbox.Type == GearboxType.APTN || gearbox.Type == GearboxType.IHPC ? 0.SI<Second>() : gearbox.TractionInterruption;
 		}
 
-		public AxleGearData CreateAxleGearData(IAxleGearInputData data)
-		{
+		public AxleGearData CreateAxleGearData(IAxleGearInputData data) {
 			var retVal = SetCommonAxleGearData(data);
 			retVal.AxleGear.LossMap = ReadAxleLossMap(data, true);
 			return retVal;
 		}
 
-		public AngledriveData CreateAngledriveData(IAngledriveInputData data)
-		{
+		public AngledriveData CreateAngledriveData(IAngledriveInputData data) {
 			return DoCreateAngledriveData(data, true);
 		}
 
@@ -469,8 +466,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return auxList;
 		}
 
-		internal DriverData CreateDriverData(IDriverEngineeringInputData driver)
-		{
+		internal DriverData CreateDriverData(IDriverEngineeringInputData driver) {
 			if (driver.SavedInDeclarationMode) {
 				WarnEngineeringMode("DriverData");
 			}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
index 7079734f55..07a8260d7c 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
@@ -91,7 +91,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			}
 
 			public abstract void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
-				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action,
+				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData,
 				Action<SuperCapData> setSuperCapData);
 
 
@@ -105,7 +105,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				throw new NotImplementedException();
 			}
 
-			public virtual HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData)
+			public virtual HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData,
+				SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode)
 			{
 				throw new NotImplementedException();
 			}
@@ -232,7 +233,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			}
 
 			public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
-				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action,
+				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData,
 				Action<SuperCapData> setSuperCapData)
 			{
 				throw new NotImplementedException();
@@ -244,6 +245,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter();
 			private ElectricMachinesDataAdapter _electricMachinesDataAdapter = new ElectricMachinesDataAdapter();
 			private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter();
+			protected IAuxiliaryDataAdapter _auxAdapter = new HeavyLorryAuxiliaryDataAdapter();
 			public override CombustionEngineData CreateEngineData(
 				IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
 			{
@@ -271,6 +273,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				return _eletricStorageAdapter.CreateSuperCapData(reessInputData);
 			}
 
+			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData,
+				IBusAuxiliariesDeclarationData busAuxData,
+				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles,
+				VectoSimulationJobType jobType)
+			{
+				return _auxAdapter.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength,
+					numSteeredAxles, jobType);
+			}
+
 			//public RetarderData CreateRetarderData 
 
 			#endregion
@@ -285,12 +296,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			private SerialHybridStrategyParameterDataAdapter _hybridStrategyParameterData =
 				new SerialHybridStrategyParameterDataAdapter();
 
-			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData,
-				IBusAuxiliariesDeclarationData busAuxData,
-				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles,
-				VectoSimulationJobType jobType)
+			protected ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter();
+
+
+			public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData,
+				SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode)
 			{
-				throw new NotImplementedException();
+				return _hybridStrategyParameterData.CreateHybridStrategyParameters(runDataBatteryData,
+					runDataSuperCapData, vehicleMass, ovcMode);
 			}
 
 			#endregion
@@ -310,9 +323,20 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				return null;
 			}
 			public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
-				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, Action<SuperCapData> setSuperCapData)
+				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData)
 			{
-				throw new NotImplementedException();
+				var batteryData = _electricStorageAdapter.CreateBatteryData(componentsElectricStorage, jobType, ovc);
+				var superCapData = _electricStorageAdapter.CreateSuperCapData(componentsElectricStorage);
+
+
+
+				if (superCapData != null && batteryData != null)
+				{
+					throw new VectoException("SuperCap AND Battery not supported");
+				}
+
+				setBatteryData(batteryData);
+				setSuperCapData(superCapData);
 			}
 
 
@@ -326,6 +350,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			private ParallelHybridStrategyParameterDataAdapter _hybridStrategyDataAdapter =
 				new ParallelHybridStrategyParameterDataAdapter();
 
+			private PTODataAdapterLorry _ptoAdapterLorry = new PTODataAdapterLorry();
 			protected override GearboxType[] SupportedGearboxTypes => new[]
 				{ GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial };
 			private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null);
@@ -346,12 +371,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			}
 
 			public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
-				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, Action<SuperCapData> setSuperCapData)
+				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData)
 			{
 				throw new NotImplementedException();
 			}
 
-			public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData)
+			public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData,
+				SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode)
 			{
 				return _hybridStrategyDataAdapter.CreateHybridStrategyParameters(runDataBatteryData, runDataSuperCapData);
 			}
@@ -362,13 +388,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 
 			public override PTOData CreatePTOCycleData(IGearboxDeclarationInputData gbx, IPTOTransmissionInputData pto)
 			{
-				throw new NotImplementedException();
+				return _ptoAdapterLorry.CreateDefaultPTOData(pto, gbx);
 			}
 
 			public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData,
 				IGearboxDeclarationInputData gbx)
 			{
-				throw new NotImplementedException();
+				return _ptoAdapterLorry.CreatePTOTransmissionData(ptoData, gbx);
 			}
 
 			#endregion
@@ -453,7 +479,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData,
 				IGearboxDeclarationInputData gbx)
 			{
-				return _ptoDataAdapter.CreatePTOTransmissionData(ptoData, gbx);
+				var result = _ptoDataAdapter.CreatePTOTransmissionData(ptoData, gbx);
+				return result;
 			}
 
 			#endregion
@@ -474,7 +501,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				return _gearBoxDataAdaper.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes);
 			}
 
-			public override ShiftStrategyParameters CreateGearshiftData(double axleRatio, PerSecond engineIdlingSpeed, GearboxType gearboxType, int gearsCount)
+			public override ShiftStrategyParameters CreateGearshiftData(double axleRatio, PerSecond engineIdlingSpeed,
+				GearboxType gearboxType, int gearsCount)
 			{
 				return _gearBoxDataAdaper.CreateGearshiftData(axleRatio, engineIdlingSpeed, gearboxType, gearsCount);
 			}
@@ -511,6 +539,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				{ GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial, GearboxType.APTN };
 
 			#endregion
+
+
 		}
 		public class PEV_E3 : BatteryElectric { }
 		public class PEV_E4 : BatteryElectric { }
@@ -532,7 +562,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			}
 
 			public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
-				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, Action<SuperCapData> setSuperCapData)
+				VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData)
 			{
 				throw new NotImplementedException();
 			}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
index dd731be03e..e8ef3e49ab 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
@@ -70,13 +70,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null);
 
 		void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
-			VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action,
+			VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData,
 			Action<SuperCapData> setSuperCapData);
 		BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage,
 			VectoSimulationJobType jobType,
 			bool ovc);
 		SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage);
-		HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData);
+		HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData,
+			SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode);
 		ShiftStrategyParameters CreateDummyGearshiftStrategy();
 	}
 
diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
index cc8874e06f..5c6b0f4ace 100644
--- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
+++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
@@ -140,7 +140,11 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl
 	[DebuggerDisplay("Overload({Delta,nq})")]
 	public class ResponseOverload : AbstractResponse
 	{
-		public Watt Delta { get; set; }
+		public Watt Delta
+		{
+			get;
+			set;
+		}
 		public ResponseOverload(object source) : base(source) { }
 	}
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs
index dc0116d06b..d8a66e3599 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs
@@ -41,7 +41,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 {
 	public class AxleGear : TransmissionComponent, IAxlegear, IUpdateable
 	{
-		public AxleGear(IVehicleContainer container, AxleGearData modelData) : base(container, modelData.AxleGear) { }
+		public AxleGear(IVehicleContainer container, AxleGearData modelData) : base(container, modelData.AxleGear)
+		{
+
+		}
 
 		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
 		{
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs
index 4a235dfd6d..f032bc3c80 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs
@@ -36,7 +36,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 					: Formulas.InertiaPower(currOutAngularVelocity, prevOutAngularVelocity, 
 						ElectricMotorData.Inertia, dt) / avgSpeed;
 				//var dragTorque = ElectricMotorData.DragCurve.Lookup()
-				return (-inertiaTorqueLoss); //.LimitTo(maxDriveTorque, maxRecuperationTorque);
+				//return ((-1)*(inertiaTorqueLoss + outTorque)).LimitTo(maxDriveTorque, maxRecuperationTorque ?? VectoMath.Max(maxDriveTorque, 0.SI<NewtonMeter>())); //.LimitTo(maxDriveTorque, maxRecuperationTorque);
+				return -inertiaTorqueLoss;
 			}
             if (DataBus.DriverInfo.DrivingAction == DrivingAction.Coast ||
                 DataBus.DriverInfo.DrivingAction == DrivingAction.Roll) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
index ae0251cdb3..220dc2a231 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
@@ -196,7 +196,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var emTorqueDt = Control.MechanicalAssistPower(absTime, dt, outTorque,
 				PreviousState.DrivetrainSpeed, outAngularVelocity, maxDriveTorqueDt, maxRecuperationTorqueDt, Position, dryRun);
 
-			var emTorque = emTorqueDt == null ? null : ConvertDrivetrainTorqueToEm(avgDtSpeed, emTorqueDt);
+			var emTorque = (emTorqueDt == null)
+				? null 
+				: ConvertDrivetrainTorqueToEm(avgDtSpeed, emTorqueDt);
 			var emOff = emTorqueDt == null;
 
 			if (!dryRun && !DataBus.IsTestPowertrain && emTorqueDt != null && NextComponent != null && (emTorque.IsSmaller(maxDriveTorqueEm ?? 0.SI<NewtonMeter>(), 1e-3) ||
@@ -238,13 +240,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				emTorque = 0.SI<NewtonMeter>();
 			}
 
-			if (Position == PowertrainPosition.BatteryElectricE2 && !DataBus.GearboxInfo.GearEngaged(absTime)) {
-				// electric motor is after the gearbox but no gear engaged - ignore inertia and drag...
-				emTorqueDt = 0.SI<NewtonMeter>();
-				emTorque = 0.SI<NewtonMeter>();
-			}
+            if (Position == PowertrainPosition.BatteryElectricE2 && !DataBus.GearboxInfo.GearEngaged(absTime))
+            {
+                // electric motor is after the gearbox but no gear engaged - ignore inertia and drag...
+                emTorqueDt = 0.SI<NewtonMeter>();
+                emTorque = 0.SI<NewtonMeter>();
+            }
 
-			if (Position == PowertrainPosition.HybridP1 && !DataBus.EngineCtl.CombustionEngineOn) {
+            if (Position == PowertrainPosition.HybridP1 && !DataBus.EngineCtl.CombustionEngineOn) {
 				// electric motor is directly connected to the ICE, ICE is off and EM is off - do not apply drag loss
 				emTorqueDt = 0.SI<NewtonMeter>();
 				emTorque = 0.SI<NewtonMeter>();
@@ -263,7 +266,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			// inertia torque 'brakes' - electric motor has to provide this torque in addition (T_inertia > 0 when angular speed increases)
 			// emTorque < 0 when propelling, emTorqueMap needs to be 'more negative' to provide torque for inertia
 			// emTorque > 0 when recuperating, inertia 'brakes' in addition, emTorqueMap is decreased
-			var emTorqueMap = emTorque - inertiaTorqueEm ;
+			var emTorqueMap = emTorque - inertiaTorqueEm;
 			if (emOff) {
 				// not used later 
 				emTorqueMap = null;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs
index 6fcfa4e524..930ba6d813 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs
@@ -11,7 +11,7 @@ using TUGraz.VectoCore.OutputData;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 {
-	public class PEVPTO : StatefulProviderComponent<PEVPTO.State, ITnOutPort, ITnInPort, ITnOutPort>,
+	public class PEVPtoTransm : StatefulProviderComponent<PEVPtoTransm.State, ITnOutPort, ITnInPort, ITnOutPort>,
 		IPowerTrainComponent, ITnInPort, ITnOutPort
 	{
 		public class State
@@ -23,7 +23,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		protected readonly Dictionary<string, Func<PerSecond, Second, Second, bool, NewtonMeter>> Auxiliaries =
 			new Dictionary<string, Func<PerSecond, Second, Second, bool, NewtonMeter>>();
 
-		public PEVPTO(IVehicleContainer container) : base(container)
+		public PEVPtoTransm(IVehicleContainer container) : base(container)
 		{
 			
 		}
@@ -58,21 +58,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				: outAngularVelocity;
 
 			var torqueLoss = 0.SI<NewtonMeter>();
-			if (!DataBus.GearboxInfo.GearEngaged(absTime)) {
-				var powerDemands = new Dictionary<string, NewtonMeter>(Auxiliaries.Count);
-				foreach (var aux in Auxiliaries) {
-					powerDemands[aux.Key] = 0.SI<NewtonMeter>();
-				}
-				if (!dryRun) {
-					CurrentState.PowerDemands = powerDemands;
-				}
-			} else {
-				if (outAngularVelocity != null && !avgAngularSpeed.IsEqual(0)) {
-					torqueLoss = ComputeTorqueLoss(absTime, dt, avgAngularSpeed, dryRun);
-				}
-			}
-
-			if (!dryRun) {
+			var alwaysConsiderPTOTransmLoss = false; //<---- debugging only //TODO: REMOVE
+			var gearEngaged = !DataBus.GearboxInfo.GearEngaged(absTime);
+			////Always consider PTO_Transm_loss
+
+			if (!DataBus.GearboxInfo.GearEngaged(absTime) && !alwaysConsiderPTOTransmLoss)
+            {
+                SetZeroPowerDemand(dryRun);
+            }
+            else
+            {
+                if (outAngularVelocity != null && !avgAngularSpeed.IsEqual(0))
+                {
+                    torqueLoss = ComputeTorqueLoss(absTime, dt, avgAngularSpeed, dryRun);
+                }
+                else
+                {
+                    SetZeroPowerDemand(dryRun);
+                }
+            }
+
+            if (!dryRun) {
 				CurrentState.OutAngularVelocity = outAngularVelocity;
 			}
 			
@@ -82,6 +88,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		#endregion
 
+		private void SetZeroPowerDemand(bool dryRun)
+		{
+			var powerDemands = new Dictionary<string, NewtonMeter>(Auxiliaries.Count);
+			foreach (var aux in Auxiliaries)
+			{
+				powerDemands[aux.Key] = 0.SI<NewtonMeter>();
+			}
+			if (!dryRun)
+			{
+				CurrentState.PowerDemands = powerDemands;
+			}
+		}
+		
 		private NewtonMeter ComputeTorqueLoss(Second absTime, Second dt, PerSecond avgAngularSpeed, bool dryRun)
 		{
 			var powerDemands = new Dictionary<string, NewtonMeter>(Auxiliaries.Count);
-- 
GitLab