diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb index 059350a4627fbe1fe80ddc878f6fa211db3d9965..44d02dad99c6b4a408bcf2943b885e15cb61e302 100644 --- a/VECTO/Input Files/Vehicle.vb +++ b/VECTO/Input Files/Vehicle.vb @@ -360,6 +360,12 @@ Public Class Vehicle End Get End Property + Public ReadOnly Property ManufacturerAddress As String Implements IVehicleDeclarationInputData.ManufacturerAddress + Get + Return "N.A." + End Get + End Property + Public ReadOnly Property AirDragArea As SquareMeter Implements IAirdragEngineeringInputData.AirDragArea Get Return CdA0.SI(Of SquareMeter)() diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 033de94e30e113e349aae9ec7f4c2bc99e9c21d3..ad8450509d25e91d5e4a78bd38b59cc920f720b6 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -111,6 +111,8 @@ namespace TUGraz.VectoCommon.InputData /// cf. VECTO Input Parameters.xlsx /// </summary> IList<IAxleDeclarationInputData> Axles { get; } + + string ManufacturerAddress { get; } } public interface IAirdragDeclarationInputData : IComponentInputData diff --git a/VectoCommon/VectoHashing/VectoComponents.cs b/VectoCommon/VectoHashing/VectoComponents.cs index 60340b81abc82fe2c2a8924c2e247508d611a084..30fa44297dbac03ae14e1c9194292eb4d9e5ae07 100644 --- a/VectoCommon/VectoHashing/VectoComponents.cs +++ b/VectoCommon/VectoHashing/VectoComponents.cs @@ -14,7 +14,8 @@ namespace TUGraz.VectoHashing Airdrag, Tyre, Vehicle, - VectoOutput + VectoOutput, + VectoCustomerInformation } public static class VectoComponentsExtensionMethods @@ -42,6 +43,8 @@ namespace TUGraz.VectoHashing return XMLNames.Component_Vehicle; case VectoComponents.VectoOutput: return "VectoOutput"; + case VectoComponents.VectoCustomerInformation: + return "VectoCustomerInformation"; default: throw new ArgumentOutOfRangeException("VectoComponents", component, null); } @@ -68,6 +71,8 @@ namespace TUGraz.VectoHashing return "TYRE-"; case VectoComponents.VectoOutput: return "RESULT-"; + case VectoComponents.VectoCustomerInformation: + return "COC-"; default: throw new ArgumentOutOfRangeException("VectoComponents", component, null); } diff --git a/VectoCommon/VectoHashing/VectoHash.cs b/VectoCommon/VectoHashing/VectoHash.cs index 113a409a07b07ce9831a3435b8e77ef3dcfddfbe..f7ef4c6305ce0d2ac146a6ed1bfee6bf19012299 100644 --- a/VectoCommon/VectoHashing/VectoHash.cs +++ b/VectoCommon/VectoHashing/VectoHash.cs @@ -141,7 +141,9 @@ namespace TUGraz.VectoHashing } } else if (Document.DocumentElement.LocalName.Equals("VectoOutput")) { components = new List<VectoComponents>() { VectoComponents.VectoOutput }; - } else { + } else if (Document.DocumentElement.LocalName.Equals("VectoCustomerInformation")) { + components = new List<VectoComponents>() { VectoComponents.VectoCustomerInformation }; + }else { throw new Exception("unknown document structure! neither input data nor output data format"); } var query = string.Format("//*[local-name()='{0}']/*[local-name()='Data']", components[0].XMLElementName()); diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs index 0cfe43ce72b7f6d3fb5f438e016bb67968a2d03b..e5f1e4459da2e88c8e2265cfa60888c14791ec6a 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs @@ -123,6 +123,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON get { return AxleWheels().Cast<IAxleEngineeringInputData>().ToList(); } } + public string ManufacturerAddress { get { return "N.A."; } } + IList<IAxleDeclarationInputData> IVehicleDeclarationInputData.Axles { get { return AxleWheels().Cast<IAxleDeclarationInputData>().ToList(); } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs index f2f1a0dcfb54fe3372057db25557180c92245f1b..72d865717bd7db7ad6a7f4ddb668b3efe16f0ae0 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs @@ -122,6 +122,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration } } + public string ManufacturerAddress + { + get { return GetElementValue(XMLNames.Component_ManufacturerAddress); } + } + public double RetarderRatio { get { return GetDoubleElementValue(XMLNames.Vehicle_RetarderRatio); } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs index 4cb0cddace7ddc86bab1bcae53316afd315a5a08..7adc0c852e119685015d88b01fbb4503dd2f48c1 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs @@ -110,6 +110,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering get { return AxleEngineeringInput().Cast<IAxleEngineeringInputData>().ToList(); } } + public string ManufacturerAddress { get { return "N.A."; } } + IList<IAxleDeclarationInputData> IVehicleDeclarationInputData.Axles { get { return AxleEngineeringInput().Cast<IAxleDeclarationInputData>().ToList(); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index b33ae94d72a0bb51987c7f5a3208f7bcd4c24868..cd9d0d26215a470fa042a059343fc7d17bcf4ce6 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -89,6 +89,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var retVal = SetCommonVehicleData(data); retVal.VIN = data.VIN; + retVal.ManufacturerAddress = data.ManufacturerAddress; retVal.LegislativeClass = data.LegislativeClass; retVal.TrailerGrossVehicleWeight = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0); diff --git a/VectoCore/VectoCore/Models/Declaration/MissionType.cs b/VectoCore/VectoCore/Models/Declaration/MissionType.cs index 35dae7e633a17fbcbcad886d44ac50fc81f0c470..3b3c54a7286a240b7c7ade04fdd83d67d7ffeaa8 100644 --- a/VectoCore/VectoCore/Models/Declaration/MissionType.cs +++ b/VectoCore/VectoCore/Models/Declaration/MissionType.cs @@ -76,11 +76,13 @@ namespace TUGraz.VectoCore.Models.Declaration { switch (self) { case MissionType.LongHaul: - case MissionType.LongHaulEMS: return "Long Haul"; + case MissionType.LongHaulEMS: + return "Long Haul EMS"; case MissionType.RegionalDelivery: - case MissionType.RegionalDeliveryEMS: return "Regional Delivery"; + case MissionType.RegionalDeliveryEMS: + return "Regional Delivery EMS"; case MissionType.UrbanDelivery: return "Urban Delivery"; case MissionType.MunicipalUtility: diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs index ba64c342f157941f4d3e7d8b2fe8f606dd39d989..e7faef20506cb59be284fcb33f03b6dfdce0c92a 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs @@ -79,9 +79,6 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl throw new VectoException("InputDataProvider does not implement DeclarationData interface"); } var report = declarationReport ?? new XMLDeclarationReport(writer); - if (declarationReport != null) { - declarationReport.JobName = declDataProvider.JobInputData().JobName; - } DataReader = new DeclarationModeVectoRunDataFactory(declDataProvider, report); break; case ExecutionMode.Engineering: diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs index 0ce74d45a22b36fbba74625a310c32304644ff92..23baa05605b395456d844af0c7d066b709ad0232 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs @@ -68,6 +68,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public AxleConfiguration AxleConfiguration { get; internal set; } + public string ManufacturerAddress { get; internal set; } + [Required, ValidateObject] private List<Axle> _axleData; diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 59c107bfa8df78dbac70b41b0b0c3372b43a3069..b81e6b9cf896b4e24ea40935558ef2d6d37febb2 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -46,8 +46,6 @@ namespace TUGraz.VectoCore.OutputData void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData); void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData); void InitializeReport(VectoRunData modelData, Segment segment); - string Creator { get; set; } - string JobName { get; set; } } /// <summary> @@ -98,11 +96,6 @@ namespace TUGraz.VectoCore.OutputData /// </summary> public string Creator { get; set; } - /// <summary> - /// The name of the job file (report name will be the same) - /// </summary> - public string JobName { get; set; } - /// <summary> /// The result count determines how many results must be given before the report gets written. /// </summary> diff --git a/VectoCore/VectoCore/OutputData/FileIO/FileOutputWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/FileOutputWriter.cs index 87e9681b906236091f61d250b32a85f1ecee0832..f5604b2f7e09c4b64f74a1471a87777a0bf8b6dc 100644 --- a/VectoCore/VectoCore/OutputData/FileIO/FileOutputWriter.cs +++ b/VectoCore/VectoCore/OutputData/FileIO/FileOutputWriter.cs @@ -57,6 +57,11 @@ namespace TUGraz.VectoCore.OutputData.FileIO get { return Path.ChangeExtension(_jobFile, "RESULT.xml"); } } + public string XMLCoCReportName + { + get { return Path.ChangeExtension(_jobFile, "COC.xml"); } + } + public string SumFileName { @@ -101,6 +106,8 @@ namespace TUGraz.VectoCore.OutputData.FileIO return new FileStream(PDFReportName, FileMode.Create); case ReportType.DeclarationReportXMLFulll: return new FileStream(XMLFullReportName, FileMode.Create); + case ReportType.DeclarationReportXMLCOC: + return new FileStream(XMLCoCReportName, FileMode.Create); default: throw new ArgumentOutOfRangeException("type"); diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs new file mode 100644 index 0000000000000000000000000000000000000000..9b6f72e9a5b18e571b48819fa3b4366169988be6 --- /dev/null +++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Xml; +using System.Xml.Linq; +using TUGraz.IVT.VectoXML.Writer; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Resources; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoHashing; + +namespace TUGraz.VectoCore.OutputData.XML +{ + public class XMLCustomerReport + { + protected XElement VehiclePart; + + protected XElement InputDataIntegrity; + + protected XElement Results; + + protected XNamespace tns; + protected XNamespace di; + private bool allSuccess = true; + + public XMLCustomerReport() + { + di = "http://www.w3.org/2000/09/xmldsig#"; + tns = "urn:tugraz:ivt:VectoAPI:COCOutput:v0.4"; + VehiclePart = new XElement(tns + XMLNames.Component_Vehicle); + Results = new XElement(tns + "Results"); + } + + public void Initialize(VectoRunData modelData, Segment segment) + { + VehiclePart.Add( + new XElement(tns + XMLNames.Component_Model, modelData.VehicleData.ModelName), + new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer), + new XElement(tns + XMLNames.Component_ManufacturerAddress, modelData.VehicleData.ManufacturerAddress), + new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN), + new XElement(tns + XMLNames.Vehicle_VehicleCategory, modelData.VehicleData.LegislativeClass), + new XElement(tns + "VehicleGroup", segment.VehicleClass.GetClassNumber()), + new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()), + new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, modelData.VehicleData.GrossVehicleWeight.ToXMLFormat(0)), + new XElement(tns + XMLNames.Vehicle_CurbMassChassis, modelData.VehicleData.CurbWeight.ToXMLFormat(0)), + new XElement(tns + "EngineRatedPower", modelData.EngineData.RatedPowerDeclared.ToXMLFormat(0)), + new XElement(tns + "EngineDisplacement", + modelData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter.ToXMLFormat(0)), + new XElement(tns + XMLNames.Engine_FuelType, modelData.EngineData.FuelType.ToXMLFormat()), + new XElement(tns + "TransmissionMainCertificationMethod", modelData.GearboxData.CertificationMethod.ToXMLFormat()), + new XElement(tns + XMLNames.Gearbox_TransmissionType, modelData.GearboxData.Type.ToXMLFormat()), + new XElement(tns + "GearsCount", modelData.GearboxData.Gears.Count), + new XElement(tns + "Retarder", modelData.Retarder.Type.IsDedicatedComponent()), + new XElement(tns + "AxleRatio", modelData.AxleGearData.AxleGear.Ratio.ToXMLFormat(3)) + ); + InputDataIntegrity = new XElement(tns + "InputDataSignature", + modelData.InputDataHash == null ? CreateDummySig() : new XElement(modelData.InputDataHash)); + } + + private XElement CreateDummySig() + { + return new XElement(di + XMLNames.DI_Signature_Reference, + new XElement(di + XMLNames.DI_Signature_Reference_DigestMethod, + new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "null")), + new XElement(di + XMLNames.DI_Signature_Reference_DigestValue, "NOT AVAILABLE") + ); + } + + public void AddResult( + DeclarationReport<XMLDeclarationReport.ResultEntry>.ResultContainer<XMLDeclarationReport.ResultEntry> entry) + { + foreach (var resultEntry in entry.ModData) { + allSuccess &= resultEntry.Value.Status == VectoRun.Status.Success; + Results.Add(new XElement(tns + "Result", + new XAttribute("status", resultEntry.Value.Status.ToString().ToLower()), + new XElement(tns + "Mission", entry.Mission.ToXMLFormat()), + GetResults(resultEntry))); + } + } + + private object[] GetResults(KeyValuePair<LoadingType, XMLDeclarationReport.ResultEntry> resultEntry) + { + switch (resultEntry.Value.Status) { + case VectoRun.Status.Pending: + case VectoRun.Status.Running: + return null; // should not happen! + case VectoRun.Status.Success: + return GetSuccessResultEntry(resultEntry.Value); + case VectoRun.Status.Canceled: + case VectoRun.Status.Aborted: + return new object[] { + new XElement("Error", resultEntry.Value.Error) + }; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private object[] GetSuccessResultEntry(XMLDeclarationReport.ResultEntry result) + { + var fuel = FuelData.Instance().Lookup(result.FuelType); + + return new object[] { + new XElement(tns + "Payload", new XAttribute("unit", "kg"), result.Payload.ToXMLFormat(0)), + new XElement(tns + "FuelType", result.FuelType.ToXMLFormat()), + new XElement(tns + "AverageSpeed", new XAttribute("unit", "km/h"), result.AverageSpeed.AsKmph.ToXMLFormat(1)), + XMLDeclarationReport.GetResults(result, tns, false).Cast<object>().ToArray() + }; + } + + private XElement GetApplicationInfo() + { + var vectodll = AssemblyName.GetAssemblyName("VectoCore.dll"); + return new XElement(tns + "ApplicationInformation", + new XElement(tns + "SimulationToolVersion", vectodll.Version), + new XElement(tns + "Date", XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc))); + } + + public void GenerateReport(XElement resultSignature) + { + var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance"); + var retVal = new XDocument(); + var results = new XElement(Results); + results.AddFirst(new XElement(tns + "Status", allSuccess ? "success" : "error")); + var vehicle = new XElement(VehiclePart); + vehicle.Add(InputDataIntegrity); + retVal.Add(new XElement(tns + "VectoCustomerInformation", + new XAttribute("schemaVersion", "0.4"), + new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), + new XAttribute("xmlns", tns), + new XAttribute(XNamespace.Xmlns + "di", di), + new XAttribute(xsi + "schemaLocation", + string.Format("{0} {1}VectoCOC.xsd", tns, AbstractXMLWriter.SchemaLocationBaseUrl)), + new XElement(tns + "Data", + vehicle, + new XElement(tns + "ResultDataSignature", resultSignature), + results, + GetApplicationInfo()) + ) + ); + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(retVal); + writer.Flush(); + stream.Seek(0, SeekOrigin.Begin); + var h = VectoHash.Load(stream); + Report = h.AddHash(); + } + + public XDocument Report { get; private set; } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index bfa8f3092f6f7205abcc496a2d5b21a01e5a586f..f13905e10b14f272e317d0e2c5bae3d2e34b1d66 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -1,24 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; +using System.Collections.Generic; using System.Linq; -using System.Security.Cryptography; using System.Text; using System.Xml; using System.Xml.Linq; +using System.Xml.XPath; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; -using TUGraz.VectoCore.Models.SimulationComponent.Data; namespace TUGraz.VectoCore.OutputData.XML { public class XMLDeclarationReport : DeclarationReport<XMLDeclarationReport.ResultEntry> { private XMLFullReport _fullReport; + private XMLCustomerReport _customerReport; + private IOutputDataWriter Writer; public class ResultEntry @@ -88,6 +86,7 @@ namespace TUGraz.VectoCore.OutputData.XML public XMLDeclarationReport(IOutputDataWriter writer = null) { _fullReport = new XMLFullReport(); //new XDocument(new XDeclaration("1.0", "utf-8", "yes")); + _customerReport = new XMLCustomerReport(); //CustomerReport = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); Writer = writer; @@ -98,6 +97,11 @@ namespace TUGraz.VectoCore.OutputData.XML get { return _fullReport.Report; } } + public XDocument CustomerReport + { + get { return _customerReport.Report; } + } + protected override void DoAddResult(ResultEntry entry, VectoRunData runData, IModalDataContainer modData) { @@ -108,96 +112,88 @@ namespace TUGraz.VectoCore.OutputData.XML { foreach (var result in Missions.OrderBy(m => m.Key)) { _fullReport.AddResult(result.Value); + _customerReport.AddResult(result.Value); } + _fullReport.GenerateReport(); + var fullReportHash = GetSignature(_fullReport.Report); + _customerReport.GenerateReport(fullReportHash); + if (Writer != null) { - var xmlWriter = new XmlTextWriter(Writer.WriteStream(ReportType.DeclarationReportXMLFulll), Encoding.UTF8) { - Formatting = Formatting.Indented - }; - _fullReport.Report.WriteTo(xmlWriter); - xmlWriter.Flush(); - xmlWriter.Close(); + using (var xmlWriter = new XmlTextWriter(Writer.WriteStream(ReportType.DeclarationReportXMLFulll), Encoding.UTF8)) { + xmlWriter.Formatting = Formatting.Indented; + _fullReport.Report.WriteTo(xmlWriter); + xmlWriter.Flush(); + xmlWriter.Close(); + } + + using (var xmlWriter = new XmlTextWriter(Writer.WriteStream(ReportType.DeclarationReportXMLCOC), Encoding.UTF8)) { + xmlWriter.Formatting = Formatting.Indented; + _customerReport.Report.WriteTo(xmlWriter); + xmlWriter.Flush(); + xmlWriter.Close(); + } } - - //var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance"); - //var xsd = XNamespace.Get("http://www.w3.org/2001/XMLSchema"); - //XNamespace vectoNs = @"VectoOutput.XSD"; - //var vectoVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); - - //FullReport.Add(new XElement("VectoOutput", - // new XAttribute("schemaVersion", "0.1"), - // new XAttribute("type", "declaration"), - // //new XAttribute("xmlns", vectoNs.NamespaceName), - // new XAttribute(xsi + "noNamespaceSchemaLocation", vectoNs.NamespaceName), - // new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), - // new XElement("DeclarationReport", - // new XAttribute("id", GetReportID()), - // new XElement("AppVersion", vectoVersion), - // new XElement("Date", XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)), - // VehicleConfiguration, - // IntegrityStatus, - // new XElement("SimulationResults", - // Missions.OrderBy(m => m.Key).Select((m, i) => GetResult(m.Value, i)) - // ) - // ), - // new XElement("Signature") - // ) - // ); } - - //private static XElement[] GetResult(ResultContainer<ResultEntry> result, int i) - //{ - // var retVal = new List<XElement>(); - // foreach (var pair in result.ModData) { - // var data = pair.Value; - // var loading = result.Mission.Loadings[pair.Key]; - - // retVal.Add(new XElement("SimulationRun", - // new XElement("DrivingCycle", result.Mission.MissionType.ToString()), - // new XElement("Loading", - // new XAttribute("unit", "kg"), - // loading.ToOutputFormat(1)), - // GetFuelConsumptionReport(data, loading), - // GetCO2Report(data, loading), - // new XElement("AvgSpeed", - // new XAttribute("unit", "km/h"), - // data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(3) - // ) - // ) - // ); - // } - // return retVal.ToArray(); - //} - - //private static XElement GetCO2Report(ResultEntry data, Kilogram loading) - //{ - // var retVal = new XElement("CO2Results", - // new XElement("CO2", - // new XAttribute("unit", "g/km"), data.Co2GramPerKilometer.ToOutputFormat(3))); - // if (!loading.IsEqual(0)) { - // retVal.Add(new XElement("CO2", - // new XAttribute("unit", "g/t.km"), (data.Co2GramPerKilometer / loading.ConvertTo().Ton).ToOutputFormat(3))); - // } - // return retVal; - //} - - //private static XElement GetFuelConsumptionReport(ResultEntry data, Kilogram loading) - //{ - // var retVal = new XElement("FuelConsumptionResults", - // new XElement("FuelConsumption", - // new XAttribute("unit", "l/100km"), data.FcLiterPer100Km.ToOutputFormat(3))); - // if (!loading.IsEqual(0)) { - // retVal.Add(new XElement("FuelConsumption", - // new XAttribute("unit", "l/100t.km"), (data.FcLiterPer100Km / loading.ConvertTo().Ton).ToOutputFormat(3))); - // } - // return retVal; - //} + private XElement GetSignature(XDocument report) + { + return report.XPathSelectElement("/*[local-name()='VectoOutput']/*[local-name()='Signature']/*"); + } protected override void DoInitializeReport(VectoRunData modelData, Segment segment) { _fullReport.Initialize(modelData, segment); + _customerReport.Initialize(modelData, segment); + } + + + public static List<XElement> GetResults(XMLDeclarationReport.ResultEntry result, XNamespace tns, bool fullOutput) + { + var fuel = FuelData.Instance().Lookup(result.FuelType); + var retVal = new List<XElement>(); + //FC + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).ToXMLFormat(1))); + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/t-km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / + result.Payload.ConvertTo().Ton).ToXMLFormat(1))); + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) + .ToXMLFormat(1))); + if (fullOutput) { + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/km"), + (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6) + .ToXMLFormat(1))); + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/t-km"), + (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6) + .ToXMLFormat(1))); + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/m³-km"), + (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).ToXMLFormat(1))); + } + if (fuel.FuelDensity != null) { + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/100km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter * 100) + .ToXMLFormat(1))); + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/t-km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / + result.Payload.ConvertTo().Ton).ToXMLFormat(1))); + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/m³-km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / + result.CargoVolume).ToXMLFormat(1))); + } + //CO2 + retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/km"), + (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).ToXMLFormat(1))); + retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/t-km"), + (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / + result.Payload.ConvertTo().Ton).ToXMLFormat(1))); + retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"), + (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) + .ToXMLFormat(1))); + + return retVal; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs index ef36c366490896660f29591785e9ca1cb8e3141f..564470d59ea5af7b1000c4198f0db97084a030b8 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs @@ -9,7 +9,6 @@ using TUGraz.IVT.VectoXML.Writer; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; @@ -89,7 +88,9 @@ namespace TUGraz.VectoCore.OutputData.XML } } - return limits.Count == 0 ? null : new XElement(tns + XMLNames.Vehicle_TorqueLimits, limits.Cast<object>().ToArray()); + return limits.Count == 0 + ? null + : new XElement(tns + XMLNames.Vehicle_TorqueLimits, limits.Cast<object>().ToArray()); } private XElement GetEngineDescription(CombustionEngineData engineData) @@ -282,25 +283,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + "GearshiftCount", result.GearshiftCount.ToXMLFormat(0)) ), //FC - new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).ToXMLFormat(1)), - new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/t-km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / - result.Payload.ConvertTo().Ton).ToXMLFormat(1)), - new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) - .ToXMLFormat(1)), - new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/km"), - (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6).ToXMLFormat(1)), - //CO2 - new XElement(tns + "CO2", new XAttribute("unit", "g/km"), - (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).ToXMLFormat(1)), - new XElement(tns + "CO2", new XAttribute("unit", "g/t-km"), - (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / - result.Payload.ConvertTo().Ton).ToXMLFormat(1)), - new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"), - (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) - .ToXMLFormat(1)), + XMLDeclarationReport.GetResults(result, tns, true).Cast<object>().ToArray() }; } @@ -312,37 +295,36 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + "Date", XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc))); } - public XDocument Report + public void GenerateReport() { - get { - var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance"); - var retVal = new XDocument(); - var results = new XElement(Results); - results.AddFirst(new XElement(tns + "Status", allSuccess ? "success" : "error")); - var vehicle = new XElement(VehiclePart); - vehicle.Add(InputDataIntegrity); - retVal.Add(new XElement(tns + "VectoOutput", - new XAttribute("schemaVersion", "0.4"), - new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), - new XAttribute("xmlns", tns), - new XAttribute(XNamespace.Xmlns + "di", di), - new XAttribute(xsi + "schemaLocation", - string.Format("{0} {1}VectoOutput.xsd", tns, AbstractXMLWriter.SchemaLocationBaseUrl)), - new XElement(tns + "Data", - vehicle, - results, - GetApplicationInfo()) - ) - ); - var stream = new MemoryStream(); - var writer = new StreamWriter(stream); - writer.Write(retVal); - writer.Flush(); - stream.Seek(0, SeekOrigin.Begin); - var h = VectoHash.Load(stream); - return h.AddHash(); - //return retVal; - } + var xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance"); + var retVal = new XDocument(); + var results = new XElement(Results); + results.AddFirst(new XElement(tns + "Status", allSuccess ? "success" : "error")); + var vehicle = new XElement(VehiclePart); + vehicle.Add(InputDataIntegrity); + retVal.Add(new XElement(tns + "VectoOutput", + new XAttribute("schemaVersion", "0.4"), + new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), + new XAttribute("xmlns", tns), + new XAttribute(XNamespace.Xmlns + "di", di), + new XAttribute(xsi + "schemaLocation", + string.Format("{0} {1}VectoOutput.xsd", tns, AbstractXMLWriter.SchemaLocationBaseUrl)), + new XElement(tns + "Data", + vehicle, + results, + GetApplicationInfo()) + ) + ); + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(retVal); + writer.Flush(); + stream.Seek(0, SeekOrigin.Begin); + var h = VectoHash.Load(stream); + Report = h.AddHash(); } + + public XDocument Report { get; private set; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/XSD/VectoCOC.xsd b/VectoCore/VectoCore/Resources/XSD/VectoCOC.xsd index 5887df8523ce79f35424a11958263e1800cdc285..aeb336e3e43219ec874004f95210c29f7331956e 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoCOC.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoCOC.xsd @@ -177,16 +177,10 @@ </xs:restriction> </xs:simpleType> </xs:element> - <xs:element name="Retarder"> + <xs:element name="Retarder" type="xs:boolean"> <xs:annotation> <xs:documentation>P052</xs:documentation> </xs:annotation> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="yes"/> - <xs:enumeration value="no"/> - </xs:restriction> - </xs:simpleType> </xs:element> <xs:element name="AxleRatio" type="vdecdef:AxlegearRatioType"> <xs:annotation> @@ -240,7 +234,9 @@ </xs:simpleType> <xs:simpleType name="MissionTypeType"> <xs:restriction base="xs:token"> + <xs:enumeration value="Long Haul EMS"/> <xs:enumeration value="Long Haul"/> + <xs:enumeration value="Regional Delivery EMS"/> <xs:enumeration value="Regional Delivery"/> <xs:enumeration value="Urban Delivery"/> <xs:enumeration value="Municipal Utility"/> diff --git a/VectoCore/VectoCore/Resources/XSD/VectoOutput.xsd b/VectoCore/VectoCore/Resources/XSD/VectoOutput.xsd index ff024ed8cb8c2ef3c795818ea5039b28cc801005..214b10f49d4ce751414d8730cc79f394d2ca5474 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoOutput.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoOutput.xsd @@ -21,110 +21,66 @@ <xs:attribute name="schemaVersion" type="xs:decimal" use="required"/> </xs:complexType> </xs:element> - <xs:complexType name="ComponentDescriptionType"> + <xs:complexType name="AirdragType"> <xs:sequence> - <xs:element name="Model" type="vdecdef:ModelType"/> - <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType"/> - <xs:element name="DigestValue" type="xs:token"/> + <xs:element name="Model" minOccurs="0"/> + <xs:element name="CertificationMethod" type="AirdragCertificationOptionType"/> + <xs:element name="CertificationNumber" minOccurs="0"/> + <xs:element name="DigestValue" minOccurs="0"/> + <xs:element name="CdxA" type="vdecdef:AirdragCdxAType"> + <xs:annotation> + <xs:documentation>P245</xs:documentation> + </xs:annotation> + </xs:element> </xs:sequence> </xs:complexType> - <xs:complexType name="EngineType"> - <xs:complexContent> - <xs:extension base="ComponentDescriptionType"> - <xs:sequence> - <xs:element name="RatedPower" type="vdecdef:EngineRatedPower"> - <xs:annotation> - <xs:documentation>P250</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="IdlingSpeed" type="vdecdef:EngineDeclaredSpeedType"> - <xs:annotation> - <xs:documentation>P063 / P198</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="RatedSpeed" type="vdecdef:EngineDeclaredSpeedType"> - <xs:annotation> - <xs:documentation>P249</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Displacement" type="vdecdef:EngineDisplacementType"> - <xs:annotation> - <xs:documentation>P061</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="FuelType" type="vdecdef:FuelTypeType"> - <xs:annotation> - <xs:documentation>P193</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="GearboxType"> + <xs:complexType name="AngledriveType"> <xs:sequence> <xs:element name="Model" type="vdecdef:ModelType"/> - <xs:element name="CertificationMethod" type="vdecdef:GearboxCertificationOptionType"> + <xs:element name="CertificationMethod" type="vdecdef:AngledriveCertificationOptionType"> <xs:annotation> - <xs:documentation>P154</xs:documentation> + <xs:documentation>P258</xs:documentation> </xs:annotation> </xs:element> <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> <xs:element name="DigestValue" type="xs:token"/> - <xs:element name="TransmissionType" type="vdecdef:GearboxTransmissionTypeType"> + <xs:element name="Ratio" type="vdecdef:AngledriveRatioType"> <xs:annotation> - <xs:documentation>P076</xs:documentation> + <xs:documentation>P176</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="GearsCount"> + </xs:sequence> + </xs:complexType> + <xs:complexType name="AuxiliariesType"> + <xs:sequence> + <xs:element name="FanTechnology" type="vdecdef:AuxFanTechnologyType"> <xs:annotation> - <xs:documentation>P199</xs:documentation> + <xs:documentation>P181</xs:documentation> </xs:annotation> - <xs:simpleType> - <xs:restriction base="xs:int"> - <xs:minInclusive value="1"/> - </xs:restriction> - </xs:simpleType> </xs:element> - <xs:element name="TransmissionRatioFinalGear" type="vdecdef:GearboxGearRatioType"> + <xs:element name="SteeringPumpTechnology" maxOccurs="4"> <xs:annotation> - <xs:documentation>P078</xs:documentation> + <xs:documentation>P182</xs:documentation> </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="vdecdef:AuxSPTechnologyType"/> + </xs:simpleContent> + </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="RetarderType"> - <xs:sequence> - <xs:element name="RetarderType" type="vdecdef:RetarderTypeType"> + <xs:element name="ElectricSystemTechnology" type="vdecdef:AuxESTechnologyType"> <xs:annotation> - <xs:documentation>P052</xs:documentation> + <xs:documentation>P183</xs:documentation> </xs:annotation> </xs:element> - <xs:sequence minOccurs="0"> - <xs:element name="Model" type="vdecdef:ModelType"/> - <xs:element name="CertificationMethod" type="vdecdef:RetarderCertificationOptionType"> - <xs:annotation> - <xs:documentation>P255</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> - <xs:element name="DigestValue" type="xs:token"/> - </xs:sequence> - </xs:sequence> - </xs:complexType> - <xs:complexType name="AngledriveType"> - <xs:sequence> - <xs:element name="Model" type="vdecdef:ModelType"/> - <xs:element name="CertificationMethod" type="vdecdef:AngledriveCertificationOptionType"> + <xs:element name="PneumaticSystemTechnology" type="vdecdef:AuxPSTechnologyType"> <xs:annotation> - <xs:documentation>P258</xs:documentation> + <xs:documentation>P184</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> - <xs:element name="DigestValue" type="xs:token"/> - <xs:element name="Ratio" type="vdecdef:AngledriveRatioType"> + <xs:element name="HVACTechnology" type="vdecdef:AuxHVACTechnologyType"> <xs:annotation> - <xs:documentation>P176</xs:documentation> + <xs:documentation>P185</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> @@ -151,19 +107,6 @@ </xs:element> </xs:sequence> </xs:complexType> - <xs:complexType name="AirdragType"> - <xs:sequence> - <xs:element name="Model" minOccurs="0"/> - <xs:element name="CertificationMethod" type="AirdragCertificationOptionType"/> - <xs:element name="CertificationNumber" minOccurs="0"/> - <xs:element name="DigestValue" minOccurs="0"/> - <xs:element name="CdxA" type="vdecdef:AirdragCdxAType"> - <xs:annotation> - <xs:documentation>P245</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> <xs:complexType name="AxleType"> <xs:sequence> <xs:element name="TyreDimension" type="vdecdef:TyreDimensionType"> @@ -194,111 +137,143 @@ <xs:element name="Axle" type="AxleType"/> </xs:sequence> </xs:complexType> - <xs:complexType name="AuxiliariesType"> + <xs:complexType name="CO2Type"> + <xs:simpleContent> + <xs:extension base="xs:double"> + <xs:attribute name="unit" type="CO2UnitType" use="required"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="ComponentDescriptionType"> <xs:sequence> - <xs:element name="FanTechnology" type="vdecdef:AuxFanTechnologyType"> - <xs:annotation> - <xs:documentation>P181</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="SteeringPumpTechnology" maxOccurs="4"> - <xs:annotation> - <xs:documentation>P182</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="vdecdef:AuxSPTechnologyType"/> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="ElectricSystemTechnology" type="vdecdef:AuxESTechnologyType"> - <xs:annotation> - <xs:documentation>P183</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="PneumaticSystemTechnology" type="vdecdef:AuxPSTechnologyType"> - <xs:annotation> - <xs:documentation>P184</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="HVACTechnology" type="vdecdef:AuxHVACTechnologyType"> - <xs:annotation> - <xs:documentation>P185</xs:documentation> - </xs:annotation> - </xs:element> + <xs:element name="Model" type="vdecdef:ModelType"/> + <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType"/> + <xs:element name="DigestValue" type="xs:token"/> </xs:sequence> </xs:complexType> - <xs:complexType name="TorqueLimitsEntryType"> - <xs:attribute name="gear" type="vdecdef:GearboxGearNumberType" use="required"> - <xs:annotation> - <xs:documentation>P196</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="torqueLimit" type="vdecdef:TorqueLimitEntryMaxTorqueType" use="required"> - <xs:annotation> - <xs:documentation>P197 / P194</xs:documentation> - </xs:annotation> - </xs:attribute> + <xs:complexType name="EngineType"> + <xs:complexContent> + <xs:extension base="ComponentDescriptionType"> + <xs:sequence> + <xs:element name="RatedPower" type="vdecdef:EngineRatedPower"> + <xs:annotation> + <xs:documentation>P250</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="IdlingSpeed" type="vdecdef:EngineDeclaredSpeedType"> + <xs:annotation> + <xs:documentation>P063 / P198</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RatedSpeed" type="vdecdef:EngineDeclaredSpeedType"> + <xs:annotation> + <xs:documentation>P249</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Displacement" type="vdecdef:EngineDisplacementType"> + <xs:annotation> + <xs:documentation>P061</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FuelType" type="vdecdef:FuelTypeType"> + <xs:annotation> + <xs:documentation>P193</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> </xs:complexType> - <xs:complexType name="TorqueLimitsType"> - <xs:sequence> - <xs:element name="Entry" type="TorqueLimitsEntryType"/> - </xs:sequence> + <xs:complexType name="FuelConsumptionType"> + <xs:simpleContent> + <xs:extension base="xs:double"> + <xs:attribute name="unit" type="FuelConsumptionUnitType" use="required"/> + </xs:extension> + </xs:simpleContent> </xs:complexType> - <xs:complexType name="VehicleType"> + <xs:complexType name="GearboxType"> <xs:sequence> - <xs:element name="VIN"> - <xs:annotation> - <xs:documentation>P238</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="VehicleCategory" type="vdecdef:LegislativeClassDeclarationType"> - <xs:annotation> - <xs:documentation>P251</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="VehicleGroup" type="VehicleGroupType"> - <xs:annotation> - <xs:documentation>VECTO</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="AxleConfiguration" type="vdecdef:VehicleAxleConfigurationDeclarationType"> + <xs:element name="Model" type="vdecdef:ModelType"/> + <xs:element name="CertificationMethod" type="vdecdef:GearboxCertificationOptionType"> <xs:annotation> - <xs:documentation>P037</xs:documentation> + <xs:documentation>P154</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="GrossVehicleMass" type="vdecdef:VehicleGrossVehicleMassType"> + <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> + <xs:element name="DigestValue" type="xs:token"/> + <xs:element name="TransmissionType" type="vdecdef:GearboxTransmissionTypeType"> <xs:annotation> - <xs:documentation>P041</xs:documentation> + <xs:documentation>P076</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="CurbMassChassis" type="vdecdef:VehicleCurbMassChassisType"> + <xs:element name="GearsCount"> <xs:annotation> - <xs:documentation>P038</xs:documentation> + <xs:documentation>P199</xs:documentation> </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:int"> + <xs:minInclusive value="1"/> + </xs:restriction> + </xs:simpleType> </xs:element> - <xs:element name="PTO" type="xs:boolean"> + <xs:element name="TransmissionRatioFinalGear" type="vdecdef:GearboxGearRatioType"> <xs:annotation> - <xs:documentation>P247</xs:documentation> + <xs:documentation>P078</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="TorqueLimits" type="TorqueLimitsType" minOccurs="0"/> - <xs:element name="Components"> - <xs:complexType> - <xs:sequence> - <xs:element name="Engine" type="EngineType"/> - <xs:element name="Gearbox" type="GearboxType"/> - <xs:element name="Torqueconverter" type="TorqueconverterType" minOccurs="0"/> - <xs:element name="Retarder" type="RetarderType"/> - <xs:element name="Angledrive" type="AngledriveType" minOccurs="0"/> - <xs:element name="Axlegear" type="AxlegearType"/> - <xs:element name="AirDrag" type="AirdragType"/> - <xs:element name="AxleWheels" type="AxleWheelsType"/> - <xs:element name="Auxiliaries" type="AuxiliariesType"/> - </xs:sequence> - </xs:complexType> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ResultType"> + <xs:sequence> + <xs:element name="Mission" type="MissionTypeType"/> + <xs:choice> + <xs:sequence> + <xs:element name="Distance"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:double"> + <xs:attribute name="unit" type="DistanceUnitType" use="required"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="SimulationParameters" type="SimulationParametersType"/> + <xs:element name="VehiclePerformance" type="VehiclePerformanceType"/> + <xs:element name="FuelConsumption" type="FuelConsumptionType" maxOccurs="unbounded"/> + <xs:element name="CO2" type="CO2Type" maxOccurs="unbounded"/> + </xs:sequence> + <xs:sequence> + <xs:element name="Error" type="xs:string"/> + <xs:element name="ErrorDetails" type="xs:string"/> + </xs:sequence> + </xs:choice> + </xs:sequence> + <xs:attribute name="status" use="required"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="success"/> + <xs:enumeration value="error"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + <xs:complexType name="RetarderType"> + <xs:sequence> + <xs:element name="RetarderType" type="vdecdef:RetarderTypeType"> + <xs:annotation> + <xs:documentation>P052</xs:documentation> + </xs:annotation> </xs:element> - <xs:element name="InputDataSignature" type="vdecdef:SignatureType"/> + <xs:sequence minOccurs="0"> + <xs:element name="Model" type="vdecdef:ModelType"/> + <xs:element name="CertificationMethod" type="vdecdef:RetarderCertificationOptionType"> + <xs:annotation> + <xs:documentation>P255</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> + <xs:element name="DigestValue" type="xs:token"/> + </xs:sequence> </xs:sequence> </xs:complexType> <xs:complexType name="SimulationParametersType"> @@ -324,6 +299,64 @@ <xs:element name="FuelType" type="vdecdef:FuelTypeType"/> </xs:sequence> </xs:complexType> + <xs:complexType name="TorqueconverterType"> + <xs:sequence> + <xs:element name="Model" type="vdecdef:ModelType"/> + <xs:element name="CertificationMethod" type="vdecdef:TorqueConverterCertificationOptionType"> + <xs:annotation> + <xs:documentation>P257</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> + <xs:element name="DigestValue" type="xs:token"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="TorqueLimitsEntryType"> + <xs:attribute name="gear" type="vdecdef:GearboxGearNumberType" use="required"> + <xs:annotation> + <xs:documentation>P196</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="torqueLimit" type="vdecdef:TorqueLimitEntryMaxTorqueType" use="required"> + <xs:annotation> + <xs:documentation>P197 / P194</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + <xs:complexType name="TorqueLimitsType"> + <xs:sequence> + <xs:element name="Entry" type="TorqueLimitsEntryType"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="VectoOutputDataType"> + <xs:sequence> + <xs:element name="Vehicle" type="VehicleType"/> + <xs:element name="Results"> + <xs:complexType> + <xs:sequence> + <xs:element name="Status"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="success"/> + <xs:enumeration value="error"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + <xs:element name="Result" type="ResultType" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="ApplicationInformation"> + <xs:complexType> + <xs:sequence> + <xs:element name="SimulationToolVersion"/> + <xs:element name="Date"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="id" use="required"/> + </xs:complexType> <xs:complexType name="VehiclePerformanceType"> <xs:sequence> <xs:element name="AverageSpeed"> @@ -382,39 +415,65 @@ <xs:element name="GearshiftCount" type="xs:int"/> </xs:sequence> </xs:complexType> - <xs:complexType name="VectoOutputDataType"> + <xs:complexType name="VehicleType"> <xs:sequence> - <xs:element name="Vehicle" type="VehicleType"/> - <xs:element name="Results"> - <xs:complexType> - <xs:sequence> - <xs:element name="Status"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="success"/> - <xs:enumeration value="error"/> - </xs:restriction> - </xs:simpleType> - </xs:element> - <xs:element name="Result" type="ResultType" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> + <xs:element name="VIN"> + <xs:annotation> + <xs:documentation>P238</xs:documentation> + </xs:annotation> </xs:element> - <xs:element name="ApplicationInformation"> + <xs:element name="VehicleCategory" type="vdecdef:LegislativeClassDeclarationType"> + <xs:annotation> + <xs:documentation>P251</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="VehicleGroup" type="VehicleGroupType"> + <xs:annotation> + <xs:documentation>VECTO</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AxleConfiguration" type="vdecdef:VehicleAxleConfigurationDeclarationType"> + <xs:annotation> + <xs:documentation>P037</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="GrossVehicleMass" type="vdecdef:VehicleGrossVehicleMassType"> + <xs:annotation> + <xs:documentation>P041</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CurbMassChassis" type="vdecdef:VehicleCurbMassChassisType"> + <xs:annotation> + <xs:documentation>P038</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PTO" type="xs:boolean"> + <xs:annotation> + <xs:documentation>P247</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TorqueLimits" type="TorqueLimitsType" minOccurs="0"/> + <xs:element name="Components"> <xs:complexType> <xs:sequence> - <xs:element name="SimulationToolVersion"/> - <xs:element name="Date"/> + <xs:element name="Engine" type="EngineType"/> + <xs:element name="Gearbox" type="GearboxType"/> + <xs:element name="Torqueconverter" type="TorqueconverterType" minOccurs="0"/> + <xs:element name="Retarder" type="RetarderType"/> + <xs:element name="Angledrive" type="AngledriveType" minOccurs="0"/> + <xs:element name="Axlegear" type="AxlegearType"/> + <xs:element name="AirDrag" type="AirdragType"/> + <xs:element name="AxleWheels" type="AxleWheelsType"/> + <xs:element name="Auxiliaries" type="AuxiliariesType"/> </xs:sequence> </xs:complexType> </xs:element> + <xs:element name="InputDataSignature" type="vdecdef:SignatureType"/> </xs:sequence> - <xs:attribute name="id" use="required"/> </xs:complexType> - <xs:simpleType name="VehicleGroupType"> - <xs:restriction base="xs:int"> - <xs:minInclusive value="1"/> - <xs:maxInclusive value="16"/> + <xs:simpleType name="AccelerationUnitType"> + <xs:restriction base="xs:token"> + <xs:enumeration value="m/s²"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="AirdragCertificationOptionType"> @@ -423,19 +482,12 @@ <xs:enumeration value="Standard values"/> </xs:restriction> </xs:simpleType> - <xs:simpleType name="SpeedUnitType"> - <xs:restriction base="xs:token"> - <xs:enumeration value="km/h"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="AccelerationUnitType"> - <xs:restriction base="xs:token"> - <xs:enumeration value="m/s²"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="MassUnitType"> - <xs:restriction base="xs:token"> - <xs:enumeration value="kg"/> + <xs:simpleType name="CO2UnitType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="g/km"/> + <xs:enumeration value="g/t-km"/> + <xs:enumeration value="g/p-km"/> + <xs:enumeration value="g/m³-km"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="DistanceUnitType"> @@ -454,83 +506,35 @@ <xs:enumeration value="l/p-km"/> <xs:enumeration value="l/m³-km"/> <xs:enumeration value="MJ/km"/> + <xs:enumeration value="MJ/t-km"/> + <xs:enumeration value="MJ/m³-km"/> </xs:restriction> </xs:simpleType> - <xs:simpleType name="CO2UnitType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="g/km"/> - <xs:enumeration value="g/t-km"/> - <xs:enumeration value="g/p-km"/> - <xs:enumeration value="g/m³-km"/> + <xs:simpleType name="MassUnitType"> + <xs:restriction base="xs:token"> + <xs:enumeration value="kg"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="MissionTypeType"> <xs:restriction base="xs:token"> + <xs:enumeration value="Long Haul EMS"/> <xs:enumeration value="Long Haul"/> + <xs:enumeration value="Regional Delivery EMS"/> <xs:enumeration value="Regional Delivery"/> <xs:enumeration value="Urban Delivery"/> <xs:enumeration value="Municipal Utility"/> <xs:enumeration value="Construction"/> </xs:restriction> </xs:simpleType> - <xs:complexType name="FuelConsumptionType"> - <xs:simpleContent> - <xs:extension base="xs:double"> - <xs:attribute name="unit" type="FuelConsumptionUnitType" use="required"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:complexType name="CO2Type"> - <xs:simpleContent> - <xs:extension base="xs:double"> - <xs:attribute name="unit" type="CO2UnitType" use="required"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:complexType name="ResultType"> - <xs:sequence> - <xs:element name="Mission" type="MissionTypeType"/> - <xs:choice> - <xs:sequence> - <xs:element name="Distance"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:double"> - <xs:attribute name="unit" type="DistanceUnitType" use="required"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - <xs:element name="SimulationParameters" type="SimulationParametersType"/> - <xs:element name="VehiclePerformance" type="VehiclePerformanceType"/> - <xs:element name="FuelConsumption" type="FuelConsumptionType" maxOccurs="unbounded"/> - <xs:element name="CO2" type="CO2Type" maxOccurs="unbounded"/> - </xs:sequence> - <xs:sequence> - <xs:element name="Error" type="xs:string"/> - <xs:element name="ErrorDetails" type="xs:string"/> - </xs:sequence> - </xs:choice> - </xs:sequence> - <xs:attribute name="status" use="required"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value="success"/> - <xs:enumeration value="error"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - <xs:complexType name="TorqueconverterType"> - <xs:sequence> - <xs:element name="Model" type="vdecdef:ModelType"/> - <xs:element name="CertificationMethod" type="vdecdef:TorqueConverterCertificationOptionType"> - <xs:annotation> - <xs:documentation>P257</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="CertificationNumber" type="vdecdef:CertificationNumberType" minOccurs="0"/> - <xs:element name="DigestValue" type="xs:token"/> - </xs:sequence> - </xs:complexType> + <xs:simpleType name="SpeedUnitType"> + <xs:restriction base="xs:token"> + <xs:enumeration value="km/h"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="VehicleGroupType"> + <xs:restriction base="xs:int"> + <xs:minInclusive value="1"/> + <xs:maxInclusive value="16"/> + </xs:restriction> + </xs:simpleType> </xs:schema> diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 8588ecb4ffbbc9e44e618c341976567e34ceee58..928a841986916296e413443cbd5d7c4f950eb64e 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -190,6 +190,7 @@ <Compile Include="OutputData\ModFilter\ModalData1HzFilter.cs" /> <Compile Include="OutputData\XML\AbstractXMLWriter.cs" /> <Compile Include="OutputData\XML\AttributeMappings.cs" /> + <Compile Include="OutputData\XML\XMLCustomerReport.cs" /> <Compile Include="OutputData\XML\XMLDeclarationReport.cs" /> <Compile Include="OutputData\XML\XMLDeclarationWriter.cs" /> <Compile Include="OutputData\XML\XMLEngineeringWriter.cs" />