From cfb2418dbef53dbe1fea81d42ce1b675c56f3052 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Tue, 5 Jul 2022 18:37:06 +0200
Subject: [PATCH] added electric machine system measured xml type

---
 .../VIFElectricMachineSystemMeasuredType.cs   | 170 ++++++++++++++++++
 .../IVIFReportFactory.cs                      |   2 +
 .../VIFNinjectModule.cs                       |   3 +
 3 files changed, 175 insertions(+)
 create mode 100644 VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/Components/VIFElectricMachineSystemMeasuredType.cs

diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/Components/VIFElectricMachineSystemMeasuredType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/Components/VIFElectricMachineSystemMeasuredType.cs
new file mode 100644
index 0000000000..66afcb4734
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/Components/VIFElectricMachineSystemMeasuredType.cs
@@ -0,0 +1,170 @@
+using System.Collections.Generic;
+using System.Data;
+using System.Xml;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+
+
+namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.Components
+{
+	public interface IXmlElectricMachineSystemType
+	{
+		XElement GetElement(IElectricMotorDeclarationInputData em);
+	}
+
+
+	public class XmlElectricMachineSystemMeasuredType : AbstractVIFXmlType, IXmlElectricMachineSystemType
+	{
+		public XmlElectricMachineSystemMeasuredType(IVIFReportFactory vifFactory) : base(vifFactory) { }
+
+		#region Implementation of IVIFElectricMachineSystemType
+
+		public XElement GetElement(IElectricMotorDeclarationInputData em)
+		{
+			return new XElement(_vif + XMLNames.ElectricMachineSystem,
+				new XElement(_vif + XMLNames.ComponentDataWrapper,
+					new XAttribute(_xsi + "type", "vif:ElectricMachineSystemMeasuredDataDeclarationType"),
+					new XAttribute("id", em.DigestValue.Reference),
+					new XElement(_vif + XMLNames.Component_Manufacturer, em.Manufacturer),
+					new XElement(_vif + XMLNames.Component_Model, em.Model),
+					new XElement(_vif + XMLNames.Component_CertificationNumber, em.CertificationNumber),
+					new XElement(_vif + XMLNames.Component_Date, XmlConvert.ToString(em.Date, XmlDateTimeSerializationMode.Utc)),
+					new XElement(_vif + XMLNames.Component_AppVersion, em.AppVersion),
+					new XElement(_vif + XMLNames.ElectricMachine_ElectricMachineType, em.ElectricMachineType.ToString()),
+					new XElement(_vif + XMLNames.Component_CertificationMethod, em.CertificationMethod.ToXMLFormat()),
+					new XElement(_vif + XMLNames.ElectricMachine_R85RatedPower, em.R85RatedPower.ToXMLFormat()),
+					new XElement(_vif + XMLNames.ElectricMachine_RotationalInertia, em.Inertia.ToXMLFormat(2)),
+					new XElement(_vif + XMLNames.ElectricMachine_DcDcConverterIncluded, em.DcDcConverterIncluded),
+					new XElement(_vif + XMLNames.ElectricMachine_IHPCType, em.IHPCType),
+					GetVoltageLevels(em.VoltageLevels),
+					GetDragCurve(em.DragCurve),
+					GetConditioning(em.Conditioning)
+				),
+				GetSignature(em.DigestValue)
+				);
+		}
+		
+		#endregion
+
+		
+		protected virtual List<XElement> GetVoltageLevels(IList<IElectricMotorVoltageLevel> voltageLevels)
+		{
+			var result = new List<XElement>();
+
+			foreach (var voltageLevel in voltageLevels) {
+
+				var entry = new XElement(_vif + XMLNames.ElectricMachine_VoltageLevel,
+					new XElement(_vif + XMLNames.VoltageLevel_Voltage, voltageLevel.VoltageLevel.ToXMLFormat()),
+					new XElement(_vif + XMLNames.ElectricMachine_ContinuousTorque, voltageLevel.ContinuousTorque.ToXMLFormat(2)),
+					new XElement(_vif + XMLNames.ElectricMachine_TestSpeedContinuousTorque, voltageLevel.ContinuousTorqueSpeed.ToXMLFormat(2)),
+					new XElement(_vif + XMLNames.ElectricMachine_OverloadTorque, voltageLevel.OverloadTorque.ToXMLFormat(2)),
+					new XElement(_vif + XMLNames.ElectricMachine_TestSpeedOverloadTorque, voltageLevel.OverloadTestSpeed.ToXMLFormat(2)),
+					new XElement(_vif + XMLNames.ElectricMachine_OverloadDuration, voltageLevel.OverloadTime.ToXMLFormat(2)),
+					GetMaxTorqueCurve(voltageLevel.FullLoadCurve),
+					GetPowerMap(voltageLevel.PowerMap)
+
+				);
+				result.Add(entry);
+			}
+			
+			return result;
+		}
+
+
+		protected virtual XElement GetMaxTorqueCurve(DataTable maxTorqueData)
+		{
+			var maxTorqueCurveEntries = new List<XElement>();
+
+			for (int r = 0; r < maxTorqueData.Rows.Count; r++)
+			{
+				var row = maxTorqueData.Rows[r];
+				var outShaftSpeed = row[XMLNames.MaxTorqueCurve_OutShaftSpeed];
+				var maxTorque = row[XMLNames.MaxTorqueCurve_MaxTorque];
+				var minTorque = row[XMLNames.MaxTorqueCurve_MinTorque];
+
+				var element = new XElement(_vif + XMLNames.MaxTorqueCurve_Entry,
+					new XAttribute(XMLNames.MaxTorqueCurve_OutShaftSpeed, outShaftSpeed),
+					new XAttribute(XMLNames.MaxTorqueCurve_MaxTorque, maxTorque),
+					new XAttribute(XMLNames.MaxTorqueCurve_MinTorque, minTorque)
+				);
+
+				maxTorqueCurveEntries.Add(element);
+			}
+
+			return new XElement(XMLNames.MaxTorqueCurve, maxTorqueCurveEntries);
+		}
+
+		protected virtual List<XElement> GetPowerMap(IList<IElectricMotorPowerMap> powerMapData)
+		{
+			var powerMaps = new List<XElement>();
+
+			foreach (var powerMapEntry in powerMapData)
+			{
+
+				var entries = new List<XElement>();
+				for (int r = 0; r < powerMapEntry.PowerMap.Rows.Count; r++)
+				{
+					var outShaftSpeed = powerMapEntry.PowerMap.Rows[r][XMLNames.PowerMap_OutShaftSpeed].ToString().ToDouble();
+					var torque = powerMapEntry.PowerMap.Rows[r][XMLNames.PowerMap_Torque].ToString().ToDouble();
+					var electricPower = powerMapEntry.PowerMap.Rows[r][XMLNames.PowerMap_ElectricPower].ToString().ToDouble();
+
+					var entry = new XElement(_vif + XMLNames.PowerMap_Entry,
+						new XAttribute(XMLNames.PowerMap_OutShaftSpeed, outShaftSpeed.ToXMLFormat(2)),
+						new XAttribute(XMLNames.PowerMap_Torque, torque.ToXMLFormat(2)),
+						new XAttribute(XMLNames.PowerMap_ElectricPower, electricPower.ToXMLFormat(2)));
+					entries.Add(entry);
+				}
+
+				var powerEntry = new XElement(_vif + XMLNames.PowerMap,
+					new XAttribute(XMLNames.Gear_GearNumber_Attr, powerMapEntry.Gear),
+					entries);
+
+				powerMaps.Add(powerEntry);
+			}
+
+			return powerMaps;
+		}
+
+		protected virtual XElement GetDragCurve(TableData dragCurve)
+		{
+			var entries = new List<XElement>();
+			foreach (DataRow rowEntry in dragCurve.Rows) 
+			{
+				var outShaftSpeed = rowEntry[XMLNames.DragCurve_OutShaftSpeed].ToString().ToDouble();
+				var dragTorque = rowEntry[XMLNames.DragCurve_DragTorque].ToString().ToDouble();
+
+				var entry = new XElement(_vif + XMLNames.DragCurve_Entry,
+					new XAttribute(XMLNames.DragCurve_OutShaftSpeed, outShaftSpeed.ToXMLFormat(2)),
+					new XAttribute(XMLNames.DragCurve_DragTorque, dragTorque));
+
+				entries.Add(entry);
+			}
+
+			return new XElement(_vif + XMLNames.DragCurve, entries);
+		}
+
+
+		protected virtual XElement GetConditioning(DataTable iepcData)
+		{
+			if (iepcData == null)
+				return null;
+
+			var entries = new List<XElement>();
+			for (int r = 0; r < iepcData.Rows.Count; r++)
+			{
+
+				var coolantTempInLet = iepcData.Rows[r][XMLNames.Conditioning_CoolantTempInlet];
+				var coolingPower = iepcData.Rows[r][XMLNames.Conditioning_CoolingPower];
+
+				entries.Add(new XElement(_vif + XMLNames.Conditioning_Entry,
+					new XAttribute(XMLNames.Conditioning_CoolantTempInlet, coolantTempInLet),
+					new XAttribute(XMLNames.Conditioning_CoolingPower, coolingPower)));
+			}
+
+			return new XElement(_vif + XMLNames.Conditioning, entries);
+		}
+	}
+}
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/IVIFReportFactory.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/IVIFReportFactory.cs
index d1f2dadf3e..a21a649811 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/IVIFReportFactory.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/IVIFReportFactory.cs
@@ -2,6 +2,7 @@
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReportGroupWriter;
 using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReportXMLTypeWriter;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.Components;
 
 namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1
 {
@@ -40,6 +41,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF
 		IXmlTypeWriter GetBoostingLimitationsType();
 		IXmlTypeWriter GetElectricEnergyStorageType();
 		IXmlTypeWriter GetElectricMachineGENType();
+		IVIFElectricMachineSystemType GetElectricMachineSystemMeasuredType();
 		IXmlTypeWriter GetElectricMotorTorqueLimitsType();
 		IXmlTypeWriter GetEngineType();
 		IXmlTypeWriter GetTorqueConvertType();
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFNinjectModule.cs
index 8aa5affb21..0d3e4ada44 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFNinjectModule.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFNinjectModule.cs
@@ -103,6 +103,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF
 			Bind<IXmlTypeWriter>().To<VIFElectricMachineGENType>().When(AccessedViaVIFFactory)
 				.NamedLikeFactoryMethod((IVIFReportFactory f) => f.GetElectricMachineGENType());
 
+			Bind<IXmlElectricMachineSystemType>().To<XmlElectricMachineSystemMeasuredType>().When(AccessedViaVIFFactory)
+				.NamedLikeFactoryMethod((IVIFReportFactory f) => f.GetElectricMachineSystemMeasuredType());
+
 			Bind<IXmlTypeWriter>().To<VIFElectricMotorTorqueLimitsType>().When(AccessedViaVIFFactory)
 				.NamedLikeFactoryMethod((IVIFReportFactory f) => f.GetElectricMotorTorqueLimitsType());
 
-- 
GitLab