From 94efed1e35e5ba3169b8b2bcc28558eaf5fc8496 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 2 May 2022 16:48:00 +0200
Subject: [PATCH] adding sanity check that number of steered axles matches
 number of steering pumps

---
 VECTO/Input Files/Vehicle.vb                        |  6 ++++++
 .../VectoCommon/InputData/DeclarationInputData.cs   |  4 ++++
 .../InputData/FileIO/JSON/JSONVehicleData.cs        |  2 ++
 .../DataProvider/XMLDeclarationAxleDataProvider.cs  |  4 ++++
 .../DataProvider/XMLDeclarationAxlesDataProvider.cs | 13 +++++++++++--
 .../DataObjectAdapter/DeclarationDataAdapter.cs     |  5 ++++-
 .../Impl/DeclarationModeVectoRunDataFactory.cs      |  2 +-
 .../Impl/DeclarationVTPModeVectoRunDataFactory.cs   | 13 ++++++++-----
 VectoCore/VectoCoreTest/VectoCoreTest.csproj        |  4 ++++
 9 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index 254fea169a..5af6047346 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -802,6 +802,12 @@ Public Class Vehicle
 
     Public Property EcoRollReleaseLockupClutch As Boolean
 
+    Public ReadOnly Property NumSteeredAxles As Integer? Implements IAxlesDeclarationInputData.NumSteeredAxles
+        get
+            return nothing
+        End Get
+    End Property
+
     Public ReadOnly Property IAxlesEngineeringInputData_DataSource As DataSource Implements IAxlesEngineeringInputData.DataSource
 	get
 		Return New DataSource() With {.SourceType = DataSourceType.JSONFile}
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 2421cbe206..af7bc5200e 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -201,6 +201,8 @@ namespace TUGraz.VectoCommon.InputData
 		/// cf. VECTO Input Parameters.xlsx
 		/// </summary>
 		IList<IAxleDeclarationInputData> AxlesDeclaration { get; }
+
+		int? NumSteeredAxles { get; }
 	}
 
 	public interface IAdvancedDriverAssistantSystemDeclarationInputData
@@ -370,6 +372,8 @@ namespace TUGraz.VectoCommon.InputData
 
 		ITyreDeclarationInputData Tyre { get; }
 
+		bool Steered { get; }
+
 		DataSource DataSource { get; }
 	}
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
index be3ecca251..43f1205544 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
@@ -388,6 +388,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		public virtual Watt MaxNetPower2 { get { return null; } }
 
+		public int? NumSteeredAxles => null;
+
 		IVehicleComponentsDeclaration IVehicleDeclarationInputData.Components
 		{
 			get { return this; }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxleDataProvider.cs
index a07ffe3a34..2f11975df4 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxleDataProvider.cs
@@ -52,6 +52,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		protected ITyreDeclarationInputData _tyre;
 		protected bool? _twinTyre;
 		protected AxleType? _axleType;
+		private bool? _steered;
 
 		public XMLDeclarationAxleDataProviderV10(IXMLDeclarationVehicleData vehicle, XmlNode componentNode, string sourceFile)
 			: base(componentNode, sourceFile)
@@ -80,6 +81,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return _tyre ?? (_tyre = Reader.Tyre); }
 		}
 
+		public bool Steered =>
+			_steered ?? (_steered = XmlConvert.ToBoolean(GetString(XMLNames.AxleWheels_Axles_Axle_Steered))).Value;
+
 		#endregion
 
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlesDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlesDataProvider.cs
index a0edec339c..0473b13816 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlesDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlesDataProvider.cs
@@ -30,6 +30,7 @@
 */
 
 using System.Collections.Generic;
+using System.Linq;
 using System.Xml;
 using System.Xml.Linq;
 using TUGraz.VectoCommon.Exceptions;
@@ -48,7 +49,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public const string XSD_TYPE = "AxleWheelsDataDeclarationType";
 
-		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+		public static readonly string QUALIFIED_XSD_TYPE =
+			XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
 		protected IAxleDeclarationInputData[] _axles;
 
@@ -67,7 +69,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public virtual IList<IAxleDeclarationInputData> AxlesDeclaration
 		{
-			get {
+			get
+			{
 				if (_axles != null) {
 					return _axles;
 				}
@@ -83,6 +86,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 					if (axleNumber < 1 || axleNumber > _axles.Length) {
 						throw new VectoException("Axle #{0} exceeds axle count", axleNumber);
 					}
+
 					if (_axles[axleNumber - 1] != null) {
 						throw new VectoException("Axle #{0} defined multiple times!", axleNumber);
 					}
@@ -94,6 +98,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			}
 		}
 
+		public int? NumSteeredAxles
+		{
+			get { return AxlesDeclaration.Count(x => x.Steered); }
+		}
+
 		#endregion
 
 		#region Implementation of IXMLResource
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index d1385740a1..4e7e1eaa94 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -422,7 +422,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 
 		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData,
-			MissionType mission, VehicleClass hvdClass)
+			MissionType mission, VehicleClass hvdClass, int? numSteeredAxles)
 		{
 			if (!auxInputData.SavedInDeclarationMode) {
 				WarnDeclarationMode("AuxiliariesData");
@@ -453,6 +453,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						aux.ID = Constants.Auxiliaries.IDs.Fan;
 						break;
 					case AuxiliaryType.SteeringPump:
+						if (numSteeredAxles.HasValue && auxData.Technology.Count != numSteeredAxles.Value) {
+							throw new VectoException($"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {auxData.Technology.Count})");
+						}
 						aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology);
 						aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
 						break;
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index c24aefdf5b..9a9222af85 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -253,7 +253,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				AxleGearData = _axlegearData,
 				AngledriveData = _angledriveData,
 				Aux = _dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData, mission.MissionType,
-					_segment.VehicleClass),
+					_segment.VehicleClass, vehicle.Components.AxleWheels.NumSteeredAxles),
 				Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
 				Retarder = _retarderData,
 				DriverData = _driverdata,
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs
index 644710f86c..95b9a88f4d 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs
@@ -100,7 +100,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 					Dao.CreateAuxiliaryData(
 						JobInputData.Vehicle.Components.AuxiliaryInputData,
 						Segment.Missions.First().MissionType,
-						Segment.VehicleClass),
+						Segment.VehicleClass, 
+						JobInputData.Vehicle.Components.AxleWheels.NumSteeredAxles),
 			};
 			powertrainConfig.VehicleData.VehicleClass = Segment.VehicleClass;
 			Report.InputDataHash = JobInputData.VectoJobHash;
@@ -181,7 +182,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			runData.Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString());
 			runData.DriverData = Driverdata;
 			runData.Aux = Dao.CreateAuxiliaryData(
-				JobInputData.Vehicle.Components.AuxiliaryInputData, mission.MissionType, Segment.VehicleClass);
+				JobInputData.Vehicle.Components.AuxiliaryInputData, mission.MissionType, Segment.VehicleClass,
+				JobInputData.Vehicle.Components.AxleWheels.NumSteeredAxles);
 			runData.ExecutionMode = ExecutionMode.Declaration;
 			runData.SimulationType = SimulationType.DistanceCycle;
 			runData.Mission = mission;
@@ -258,22 +260,23 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 		protected virtual List<VectoRunData.AuxData> CreateVTPAuxData(IVehicleDeclarationInputData vehicle)
 		{
+			var numSteered = vehicle.Components.AxleWheels.NumSteeredAxles;
 			var auxRD = Dao.CreateAuxiliaryData(
-								vehicle.Components.AuxiliaryInputData, MissionType.RegionalDelivery, Segment.VehicleClass)
+								vehicle.Components.AuxiliaryInputData, MissionType.RegionalDelivery, Segment.VehicleClass, numSteered)
 							.ToList();
 			foreach (var entry in auxRD) {
 				entry.MissionType = MissionType.RegionalDelivery;
 			}
 
 			var auxLH = Dao.CreateAuxiliaryData(
-								vehicle.Components.AuxiliaryInputData, MissionType.LongHaul, Segment.VehicleClass)
+								vehicle.Components.AuxiliaryInputData, MissionType.LongHaul, Segment.VehicleClass, numSteered)
 							.ToList();
 			foreach (var entry in auxLH) {
 				entry.MissionType = MissionType.LongHaul;
 			}
 
 			var auxUD = Dao.CreateAuxiliaryData(
-								vehicle.Components.AuxiliaryInputData, MissionType.UrbanDelivery, Segment.VehicleClass)
+								vehicle.Components.AuxiliaryInputData, MissionType.UrbanDelivery, Segment.VehicleClass, numSteered)
 							.ToList();
 			foreach (var entry in auxUD) {
 				entry.MissionType = MissionType.UrbanDelivery;
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index 68bc2d2fd9..a99b093025 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -127,6 +127,7 @@
     <Compile Include="Models\Declaration\DataAdapter\DeclarationDataAdapterTest_Class5.cs" />
     <Compile Include="Models\Declaration\DataAdapter\DeclarationDataAdapterTest_Class2.cs" />
     <Compile Include="Models\Declaration\DataAdapter\DeclarationDataAdapterTest_Class9.cs" />
+    <Compile Include="Models\Declaration\InputDataSanityChecks.cs" />
     <Compile Include="Models\Declaration\ShiftPolygonTest.cs" />
     <Compile Include="Models\SimulationComponentData\TorqueConverterDataTest.cs" />
     <Compile Include="Models\SimulationComponentData\ValidationTest.cs" />
@@ -3670,6 +3671,9 @@
     <Content Include="TestData\Integration\DeclarationMode\ExemptedVehicle\vecto_vehicle-sample_exempted.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="TestData\Integration\DeclarationMode\SteeringPumpCount\Group5_EngineStopStart.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="TestData\Integration\ShiftStrategyV2\SampleVehicles\Rigid Truck_4x2_vehicle-class-1_EURO6_2018.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-- 
GitLab