From 49c34e7c74a32b2576646d7e57a73f440e3adc7e Mon Sep 17 00:00:00 2001 From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at> Date: Fri, 4 Jun 2021 18:16:47 +0200 Subject: [PATCH] added hash calculation at primary vehicle report --- .../VectoCommon/Models/AlternatorType.cs | 16 ++ .../Resources/XMLNames.Designer.cs | 135 +++++++++++ .../VectoCommon/Resources/XMLNames.resx | 45 ++++ .../OutputData/XML/XMLPrimaryVehicleReport.cs | 226 ++++++++++++------ 4 files changed, 351 insertions(+), 71 deletions(-) diff --git a/VectoCommon/VectoCommon/Models/AlternatorType.cs b/VectoCommon/VectoCommon/Models/AlternatorType.cs index e216758a7c..5419938e1c 100644 --- a/VectoCommon/VectoCommon/Models/AlternatorType.cs +++ b/VectoCommon/VectoCommon/Models/AlternatorType.cs @@ -11,6 +11,22 @@ namespace TUGraz.VectoCommon.Models public static class AlternatorTypeHelper { + + public static string ToXMLFormat(this AlternatorType type) + { + switch (type) + { + case AlternatorType.Conventional: + return "conventional"; + case AlternatorType.Smart: + return "smart"; + case AlternatorType.None: + return "no alternator"; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + }; + } + public static string GetLabel(this AlternatorType type) { switch (type) { diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs index 796ce51d7b..6e87b019a0 100644 --- a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs +++ b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs @@ -1023,6 +1023,96 @@ namespace TUGraz.VectoCommon.Resources { } } + /// <summary> + /// Looks up a localized string similar to Battery. + /// </summary> + public static string BusAux_ElectricSystem_Battery { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_Battery", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to BatteryTechnology. + /// </summary> + public static string BusAux_ElectricSystem_BatteryTechnology { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_BatteryTechnology", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to Capacitor. + /// </summary> + public static string BusAux_ElectricSystem_Capacitor { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_Capacitor", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to CapacitorTechnology. + /// </summary> + public static string BusAux_ElectricSystem_CapacitorTechnology { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_CapacitorTechnology", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to NominalVoltage. + /// </summary> + public static string BusAux_ElectricSystem_NominalVoltage { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_NominalVoltage", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to RatedCapacitance. + /// </summary> + public static string BusAux_ElectricSystem_RatedCapacitance { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_RatedCapacitance", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to RatedCapacity. + /// </summary> + public static string BusAux_ElectricSystem_RatedCapacity { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_RatedCapacity", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to RatedCurrent. + /// </summary> + public static string BusAux_ElectricSystem_RatedCurrent { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_RatedCurrent", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to RatedVoltage. + /// </summary> + public static string BusAux_ElectricSystem_RatedRatedVoltage { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_RatedRatedVoltage", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to RatedVoltage. + /// </summary> + public static string BusAux_ElectricSystem_RatedVoltage { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_RatedVoltage", resourceCulture); + } + } + /// <summary> /// Looks up a localized string similar to ResultCards. /// </summary> @@ -1032,6 +1122,15 @@ namespace TUGraz.VectoCommon.Resources { } } + /// <summary> + /// Looks up a localized string similar to SmartAlternator. + /// </summary> + public static string BusAux_ElectricSystem_SmartAlternator { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_SmartAlternator", resourceCulture); + } + } + /// <summary> /// Looks up a localized string similar to SmartElectrics. /// </summary> @@ -1041,6 +1140,24 @@ namespace TUGraz.VectoCommon.Resources { } } + /// <summary> + /// Looks up a localized string similar to SupplyFromHEVPossible. + /// </summary> + public static string BusAux_ElectricSystem_SupplyFromHEVPossible { + get { + return ResourceManager.GetString("BusAux_ElectricSystem_SupplyFromHEVPossible", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to Fan. + /// </summary> + public static string BusAux_Fan { + get { + return ResourceManager.GetString("BusAux_Fan", resourceCulture); + } + } + /// <summary> /// Looks up a localized string similar to HVAC. /// </summary> @@ -1176,6 +1293,24 @@ namespace TUGraz.VectoCommon.Resources { } } + /// <summary> + /// Looks up a localized string similar to SteeringPump. + /// </summary> + public static string BusAux_SteeringPump { + get { + return ResourceManager.GetString("BusAux_SteeringPump", resourceCulture); + } + } + + /// <summary> + /// Looks up a localized string similar to Technology. + /// </summary> + public static string BusAux_Technology { + get { + return ResourceManager.GetString("BusAux_Technology", resourceCulture); + } + } + /// <summary> /// Looks up a localized string similar to AirDrag. /// </summary> diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.resx b/VectoCommon/VectoCommon/Resources/XMLNames.resx index d795c59690..a5029ad819 100644 --- a/VectoCommon/VectoCommon/Resources/XMLNames.resx +++ b/VectoCommon/VectoCommon/Resources/XMLNames.resx @@ -1527,4 +1527,49 @@ <data name="Bus_NumberPassengersStandingUpperDeck" xml:space="preserve"> <value>NumberPassengersStandingUpperDeck</value> </data> + <data name="BusAux_ElectricSystem_Battery" xml:space="preserve"> + <value>Battery</value> + </data> + <data name="BusAux_ElectricSystem_BatteryTechnology" xml:space="preserve"> + <value>BatteryTechnology</value> + </data> + <data name="BusAux_ElectricSystem_Capacitor" xml:space="preserve"> + <value>Capacitor</value> + </data> + <data name="BusAux_ElectricSystem_CapacitorTechnology" xml:space="preserve"> + <value>CapacitorTechnology</value> + </data> + <data name="BusAux_ElectricSystem_NominalVoltage" xml:space="preserve"> + <value>NominalVoltage</value> + </data> + <data name="BusAux_ElectricSystem_RatedCapacitance" xml:space="preserve"> + <value>RatedCapacitance</value> + </data> + <data name="BusAux_ElectricSystem_RatedCapacity" xml:space="preserve"> + <value>RatedCapacity</value> + </data> + <data name="BusAux_ElectricSystem_RatedCurrent" xml:space="preserve"> + <value>RatedCurrent</value> + </data> + <data name="BusAux_ElectricSystem_RatedRatedVoltage" xml:space="preserve"> + <value>RatedVoltage</value> + </data> + <data name="BusAux_ElectricSystem_RatedVoltage" xml:space="preserve"> + <value>RatedVoltage</value> + </data> + <data name="BusAux_ElectricSystem_SmartAlternator" xml:space="preserve"> + <value>SmartAlternator</value> + </data> + <data name="BusAux_ElectricSystem_SupplyFromHEVPossible" xml:space="preserve"> + <value>SupplyFromHEVPossible</value> + </data> + <data name="BusAux_Fan" xml:space="preserve"> + <value>Fan</value> + </data> + <data name="BusAux_SteeringPump" xml:space="preserve"> + <value>SteeringPump</value> + </data> + <data name="BusAux_Technology" xml:space="preserve"> + <value>Technology</value> + </data> </root> \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs index 77f77735f5..1f3a724259 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs @@ -1,15 +1,17 @@ using System; using System.Collections.Generic; -using System.Data; +using System.IO; using System.Linq; -using System.Security.Cryptography; -using System.Text; using System.Xml; using System.Xml.Linq; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Hashing; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Impl; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; @@ -17,6 +19,7 @@ using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; using TUGraz.VectoCore.Utils; +using TUGraz.VectoHashing; namespace TUGraz.VectoCore.OutputData.XML { @@ -52,11 +55,6 @@ namespace TUGraz.VectoCore.OutputData.XML public void GenerateReport(XElement resultSignature) { var retVal = new XDocument(); - var results = new XElement(Results); - results.AddFirst(new XElement(tns + XMLNames.Report_Result_Status, _allSuccess ? "success" : "error")); - - var vehicleId = $"{VectoComponents.Vehicle.HashIdPrefix()}{GetGUID()}"; - retVal.Add( new XElement(XMLNames.VectoOutputMultistage, new XAttribute("xmlns", tns), @@ -68,29 +66,46 @@ namespace TUGraz.VectoCore.OutputData.XML new XAttribute(XNamespace.Xmlns + "v2.6", v26), new XAttribute(XNamespace.Xmlns + "v2.8", v28), new XAttribute(xsi + "schemaLocation", $"{tns.NamespaceName} "+ @"V:\VectoCore\VectoCore\Resources\XSD/VectoOutputMultistage.0.1.xsd"), - - new XElement(XMLNames.Bus_PrimaryVehicle, - new XElement(tns + XMLNames.Report_DataWrap, - new XAttribute(XMLNames.Component_ID_Attr, vehicleId), - new XAttribute(xsi + "type", "PrimaryVehicleDataType"), - VehiclePart, - InputDataIntegrity, - new XElement(tns + "ManufacturerRecordSignature", resultSignature), - results, - GetApplicationInfo()), - GetInputdataSignature(vehicleId)) - ) + + GeneratePrimaryVehicle(resultSignature)) ); - //var stream = new MemoryStream(); - //var writer = new StreamWriter(stream); - //writer.Write(retVal); - //writer.Flush(); - //stream.Seek(0, SeekOrigin.Begin); + Report = retVal; + } + + private XElement GeneratePrimaryVehicle(XElement resultSignature) + { + var results = new XElement(Results); + results.AddFirst(new XElement(tns + XMLNames.Report_Result_Status, _allSuccess ? "success" : "error")); + var vehicleId = $"{VectoComponents.Vehicle.HashIdPrefix()}{GetGUID()}"; + + var primaryVehicle = new XElement( tns + XMLNames.Bus_PrimaryVehicle, + new XElement(tns + XMLNames.Report_DataWrap, + new XAttribute(XMLNames.Component_ID_Attr, vehicleId), + new XAttribute(xsi + "type", "PrimaryVehicleDataType"), + VehiclePart, + InputDataIntegrity, + new XElement(tns + "ManufacturerRecordSignature", resultSignature), + results, + GetApplicationInfo()) + ); + + var sigXElement = GetSignatureElement(primaryVehicle); + primaryVehicle.LastNode.Parent.Add(sigXElement); + return primaryVehicle; + } + + private XElement GetSignatureElement(XElement stage) + { + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(stage); + writer.Flush(); + stream.Seek(0, SeekOrigin.Begin); - //var h = VectoHash.Load(stream); - //Report = h.AddHash(); - Report = retVal; + return new XElement(tns + XMLNames.DI_Signature, + VectoHash.Load(stream).ComputeXmlHash + (VectoHash.DefaultCanonicalizationMethod, VectoHash.DefaultDigestMethod)); } private XElement GetApplicationInfo() @@ -236,31 +251,126 @@ namespace TUGraz.VectoCore.OutputData.XML private XElement GetAuxiliariesDescription(VectoRunData modelData) { - var busAuxiliaries = modelData.BusAuxiliaries; - var busAuxXML = busAuxiliaries.InputData.XMLSource; - - var dataElement = new XElement(tns+ XMLNames.ComponentDataWrapper, - new XAttribute(xsi + "type", "AuxiliaryDataPIFType"), - new XAttribute("xmlns", tns.NamespaceName), + var aux = modelData.BusAuxiliaries.InputData; + var supplyHevPossible = XmlConvert.ToBoolean( + aux.XMLSource.SelectSingleNode( + $".//*[local-name()='{XMLNames.BusAux_ElectricSystem_SupplyFromHEVPossible}']")?.InnerText); - XElement.Parse(busAuxXML.InnerXml).Elements()); - dataElement = RemoveNamespace(dataElement); - return new XElement(tns + XMLNames.Component_Auxiliaries, - dataElement ); + new XElement(tns + XMLNames.ComponentDataWrapper, + new XAttribute(xsi + "type", "AuxiliaryDataPIFType"), + new XAttribute("xmlns", tns.NamespaceName), + new XElement(tns + XMLNames.BusAux_Fan, new XElement(tns + XMLNames.BusAux_Technology, aux.FanTechnology)), + GetSteeringPumpElement(aux.SteeringPumpTechnology), + GetElectricSystem(aux.ElectricSupply, supplyHevPossible), + GetPneumaticSystem(aux.PneumaticSupply, aux.PneumaticConsumers), + GetHvac(aux.HVACAux)) + ); } - private XElement RemoveNamespace(XElement elements) + private XElement GetSteeringPumpElement(IList<string> steeringPumps) { - foreach (XElement e in elements.DescendantsAndSelf()) + var technologies = new List<XElement>(); + + for (int i = 0; i < steeringPumps.Count; i++) { - if (e.Name.Namespace != XNamespace.None) - e.Name = e.Name.LocalName; + var technology = new XElement(tns + XMLNames.BusAux_Technology, + new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, i + 1), steeringPumps[i]); + technologies.Add(technology); } - return elements; + return new XElement(tns + XMLNames.BusAux_SteeringPump, + technologies + ); + } + + private XElement GetElectricSystem(IElectricSupplyDeclarationData electricSupply, bool supplyHevPossible) + { + var alternatorTech = new XElement(tns + XMLNames.Bus_AlternatorTechnology, electricSupply.AlternatorTechnology.ToXMLFormat()); + + List<XElement> smartAlternators = null; + List<XElement> auxBattery = null; + List<XElement> auxCapacitor = null; + + if (electricSupply.Alternators?.Any() == true) { + smartAlternators = new List<XElement>(); + + foreach (var alternator in electricSupply.Alternators) { + smartAlternators.Add(new XElement(tns + XMLNames.BusAux_ElectricSystem_SmartAlternator, + new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedCurrent, alternator.RatedCurrent.Value()), + new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedRatedVoltage, alternator.RatedVoltage.Value()))); + } + } + + if (electricSupply.ElectricStorage?.Any() == true) { + auxBattery = new List<XElement>(); + auxCapacitor = new List<XElement>(); + + foreach (var electricStorage in electricSupply.ElectricStorage) { + if (electricStorage is BusAuxBatteryInputData) { + var battery = electricStorage as BusAuxBatteryInputData; + auxBattery.Add(new XElement(tns + XMLNames.BusAux_ElectricSystem_Battery, + new XElement(tns + XMLNames.BusAux_ElectricSystem_BatteryTechnology, battery.Technology), + new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedCapacity, battery.Capacity.AsAmpHour), + new XElement(tns + XMLNames.BusAux_ElectricSystem_NominalVoltage, battery.Voltage.Value()))); + } + else if (electricStorage is BusAuxCapacitorInputData) { + var capacitor = electricStorage as BusAuxCapacitorInputData; + auxCapacitor.Add(new XElement(tns + XMLNames.BusAux_ElectricSystem_Capacitor, + new XElement(tns + XMLNames.BusAux_ElectricSystem_CapacitorTechnology, capacitor.Technology), + new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedCapacitance, capacitor.Capacity.Value()), + new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedVoltage, capacitor.Voltage.Value()))); + } + } + + auxBattery = auxBattery.Any() ? auxBattery : null; + auxCapacitor = auxCapacitor.Any() ? auxCapacitor : null; + } + + return new XElement(tns + XMLNames.BusAux_ElectricSystem, + alternatorTech, + smartAlternators, + auxBattery, + auxCapacitor, + new XElement(tns + XMLNames.BusAux_ElectricSystem_SupplyFromHEVPossible, supplyHevPossible) + ); + } + + + private XElement GetPneumaticSystem(IPneumaticSupplyDeclarationData supply, IPneumaticConsumersDeclarationData consumer) + { + return new XElement(tns + XMLNames.BusAux_PneumaticSystem, + new XElement(tns + XMLNames.Bus_SizeOfAirSupply, supply.CompressorSize), + new XElement(tns + XMLNames.CompressorDrive, supply.CompressorDrive.GetLabel()), + new XElement(tns + XMLNames.Vehicle_Clutch, supply.Clutch), + new XElement(tns + XMLNames.Bus_CompressorRatio, supply.Ratio.ToMinSignificantDigits(3)), + new XElement(tns + XMLNames.Bus_SmartCompressionSystem, supply.SmartAirCompression), + new XElement(tns + XMLNames.Bus_SmartRegenerationSystem, supply.SmartRegeneration), + new XElement(tns + XMLNames.Bus_AirsuspensionControl, GetXMLAirsuspensionControl(consumer.AirsuspensionControl)), + new XElement(tns + XMLNames.BusAux_PneumaticSystem_SCRReagentDosing, consumer.AdBlueDosing == ConsumerTechnology.Pneumatically) + ); + } + + private string GetXMLAirsuspensionControl(ConsumerTechnology airsuspensionControl) + { + switch (airsuspensionControl) { + case ConsumerTechnology.Electrically: + return "electronically"; + case ConsumerTechnology.Mechanically: + return "mechanically"; + default: + throw new VectoException("Unknown AirsuspensionControl!"); + } + } + + + private XElement GetHvac(IHVACBusAuxiliariesDeclarationData hvac) + { + return new XElement(new XElement(tns + XMLNames.BusAux_HVAC, + new XElement(tns + XMLNames.Bus_AdjustableCoolantThermostat, hvac.AdjustableCoolantThermostat), + new XElement(tns + XMLNames.Bus_EngineWasteGasHeatExchanger, hvac.EngineWasteGasHeatExchanger))); } @@ -331,7 +441,7 @@ namespace TUGraz.VectoCore.OutputData.XML )), new XElement( tns + "Fuels", - mode.Fuels.Select(x => new XElement(tns + "FuelType", x.FuelType.ToXMLFormat()))) + mode.Fuels.Select(x => new XElement(tns + XMLNames.Engine_FuelType, x.FuelType.ToXMLFormat()))) ) ); } @@ -484,37 +594,11 @@ namespace TUGraz.VectoCore.OutputData.XML return retVal.Cast<object>().ToArray(); } - - - private XElement GetInputdataSignature(string multistageId) - { - return new XElement(tns + XMLNames.DI_Signature, - new XElement(di + XMLNames.DI_Signature_Reference, - new XAttribute(XMLNames.DI_Signature_Reference_URI_Attr, $"#{multistageId}"), - new XElement(di + XMLNames.DI_Signature_Reference_Transforms, - new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform, - new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "urn:vecto:xml:2017:canonicalization")), - new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform, - new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "http://www.w3.org/2001/10/xml-exc-c14n#")) - ), - new XElement(di + XMLNames.DI_Signature_Reference_DigestMethod, - new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "http://www.w3.org/2001/04/xmlenc#sha256")), - new XElement(di + XMLNames.DI_Signature_Reference_DigestValue, GetDigestValue(multistageId))) - ); - } - + private string GetGUID() { return Guid.NewGuid().ToString("n").Substring(0, 20); } - - private string GetDigestValue(string multistageId) - { - var alg = SHA256.Create(); - alg.ComputeHash(Encoding.UTF8.GetBytes(multistageId)); - return Convert.ToBase64String(alg.Hash); - } - } } -- GitLab