Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit a0bdaba9 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

Merge branch 'feature/VECTO-1410-multistage-tool-buses' of...

Merge branch 'feature/VECTO-1410-multistage-tool-buses' of git+ssh://129.27.107.191:2211/vecto-dev into test
parents 78c92943 49c34e7c
Branches
Tags
No related merge requests found
......@@ -127,6 +127,7 @@ namespace TUGraz.VectoCommon.Hashing
case VectoComponents.VectoCustomerInformation:
case VectoComponents.VectoOutput:
case VectoComponents.VectoPrimaryVehicleInformation:
case VectoComponents.VectoManufacturingStage:
return true;
default:
return false;
......
......@@ -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) {
......
......@@ -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>
......
......@@ -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
......@@ -305,6 +305,9 @@ namespace TUGraz.VectoHashing
if (Document.DocumentElement.LocalName.Equals("VectoOutputPrimaryVehicle")) {
return VectoComponents.VectoPrimaryVehicleInformation;
}
if (Document.DocumentElement.LocalName.Equals(XMLNames.ManufacturingStage)) {
return VectoComponents.VectoManufacturingStage;
}
throw new Exception("unknown document structure! neither input data nor output data format");
}
......
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
......@@ -15,6 +16,7 @@ using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Utils;
using TUGraz.VectoHashing;
namespace TUGraz.VectoCore.OutputData.XML
......@@ -161,20 +163,37 @@ namespace TUGraz.VectoCore.OutputData.XML
#region Generate new manfuacturing Stage
private XElement GetSignatureElement(XElement stage)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(stage);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
return new XElement(tns + XMLNames.DI_Signature,
VectoHash.Load(stream).ComputeXmlHash
(VectoHash.DefaultCanonicalizationMethod, VectoHash.DefaultDigestMethod));
}
private XElement GenerateInputManufacturingStage()
{
var multistageId = $"{VectoComponents.VectoManufacturingStage.HashIdPrefix()}{GetGUID()}";
var vehicleId = $"{VectoComponents.Vehicle.HashIdPrefix()}{GetGUID()}";
return new XElement(tns + XMLNames.ManufacturingStage,
var stage = new XElement(tns + XMLNames.ManufacturingStage,
new XAttribute("stageCount", GetStageNumber()),
new XElement(tns + XMLNames.Report_DataWrap,
new XAttribute(xsi + XMLNames.Attr_Type, "BusManufacturingStageDataType"),
new XAttribute(XMLNames.Component_ID_Attr, multistageId),
GetHashPreviousStageElement(),
GetVehicleElement(vehicleId),
GetApplicationInformation()),
GetInputdataSignature(multistageId));
GetApplicationInformation()));
var sigXElement = GetSignatureElement(stage);
stage.LastNode.Parent.Add(sigXElement);
return stage;
}
private int GetStageNumber()
......
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),
......@@ -69,7 +67,19 @@ namespace TUGraz.VectoCore.OutputData.XML
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,
GeneratePrimaryVehicle(resultSignature))
);
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"),
......@@ -77,20 +87,25 @@ namespace TUGraz.VectoCore.OutputData.XML
InputDataIntegrity,
new XElement(tns + "ManufacturerRecordSignature", resultSignature),
results,
GetApplicationInfo()),
GetInputdataSignature(vehicleId))
)
GetApplicationInfo())
);
//var stream = new MemoryStream();
//var writer = new StreamWriter(stream);
//writer.Write(retVal);
//writer.Flush();
//stream.Seek(0, SeekOrigin.Begin);
var sigXElement = GetSignatureElement(primaryVehicle);
primaryVehicle.LastNode.Parent.Add(sigXElement);
return primaryVehicle;
}
//var h = VectoHash.Load(stream);
//Report = h.AddHash();
Report = retVal;
private XElement GetSignatureElement(XElement stage)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(stage);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
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 aux = modelData.BusAuxiliaries.InputData;
var supplyHevPossible = XmlConvert.ToBoolean(
aux.XMLSource.SelectSingleNode(
$".//*[local-name()='{XMLNames.BusAux_ElectricSystem_SupplyFromHEVPossible}']")?.InnerText);
var dataElement = new XElement(tns+ XMLNames.ComponentDataWrapper,
return new XElement(tns + XMLNames.Component_Auxiliaries,
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))
);
}
XElement.Parse(busAuxXML.InnerXml).Elements());
dataElement = RemoveNamespace(dataElement);
private XElement GetSteeringPumpElement(IList<string> steeringPumps)
{
var technologies = new List<XElement>();
return new XElement(tns + XMLNames.Component_Auxiliaries,
dataElement );
for (int i = 0; i < steeringPumps.Count; i++)
{
var technology = new XElement(tns + XMLNames.BusAux_Technology,
new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, i + 1), steeringPumps[i]);
technologies.Add(technology);
}
return new XElement(tns + XMLNames.BusAux_SteeringPump,
technologies
);
}
private XElement RemoveNamespace(XElement elements)
private XElement GetElectricSystem(IElectricSupplyDeclarationData electricSupply, bool supplyHevPossible)
{
foreach (XElement e in elements.DescendantsAndSelf())
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)
{
if (e.Name.Namespace != XNamespace.None)
e.Name = e.Name.LocalName;
switch (airsuspensionControl) {
case ConsumerTechnology.Electrically:
return "electronically";
case ConsumerTechnology.Mechanically:
return "mechanically";
default:
throw new VectoException("Unknown AirsuspensionControl!");
}
}
return elements;
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())))
)
);
}
......@@ -485,36 +595,10 @@ 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);
}
}
}
......@@ -692,6 +692,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
Assert.AreEqual(1, aux.SteeringPumpTechnology.Count);
Assert.AreEqual("Variable displacement elec. controlled", aux.SteeringPumpTechnology[0]);
//ToDo SupplyFromHEVPossible to interface and reader?
Assert.AreEqual(AlternatorType.Smart, aux.ElectricSupply.AlternatorTechnology);
Assert.AreEqual(1, aux.ElectricSupply.Alternators.Count);
......@@ -713,7 +714,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
Assert.AreEqual(3.SI<Volt>(), capacitor.Voltage);
Assert.AreEqual("Large Supply 2-stage", aux.PneumaticSupply.CompressorSize);//SizeOfAirSupply
Assert.AreEqual(CompressorDrive.mechanically, aux.PneumaticSupply.CompressorDrive);
Assert.AreEqual(CompressorDrive.electrically, aux.PneumaticSupply.CompressorDrive);
Assert.AreEqual("none", aux.PneumaticSupply.Clutch);
Assert.AreEqual(1.000, aux.PneumaticSupply.Ratio);
Assert.AreEqual(false, aux.PneumaticSupply.SmartAirCompression);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment