From d244e854ae69ac4fbf161391863d37f359542f30 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 17 Apr 2020 16:41:14 +0200
Subject: [PATCH] adapting MRF and CIF of heavy lorries

---
 .../XML/AbstractXMLManufacturerReport.cs      | 122 ++++++++++--------
 .../OutputData/XML/XMLCustomerReport.cs       |  59 +++++----
 .../Resources/XSD/VectoOutputCustomer.0.8.xsd |  24 ++--
 3 files changed, 120 insertions(+), 85 deletions(-)

diff --git a/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs
index 6879eab7b2..920521811c 100644
--- a/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs
@@ -110,93 +110,105 @@ namespace TUGraz.VectoCore.OutputData.XML
 		public virtual void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
 		{
 			_allSuccess &= resultEntry.Status == VectoRun.Status.Success;
-				Results.Add(
-					new XElement(
-						tns + XMLNames.Report_Result_Result,
-						new XAttribute(
-							XMLNames.Report_Result_Status_Attr,
-							resultEntry.Status == VectoRun.Status.Success ? "success" : "error"),
-						new XElement(tns + XMLNames.Report_Result_Mission, resultEntry.Mission.ToXMLFormat()),
-						GetResults(resultEntry)));
-			
+			Results.Add(
+				resultEntry.Status == VectoRun.Status.Success ? GetSuccessResult(resultEntry) : GetErrorResult(resultEntry));
 		}
 
-		protected virtual object[] GetResults( XMLDeclarationReport.ResultEntry resultEntry)
+		protected virtual XElement GetErrorResult( XMLDeclarationReport.ResultEntry resultEntry)
 		{
+			var content = new object[] {};
 			switch (resultEntry.Status) {
 				case VectoRun.Status.Pending:
 				case VectoRun.Status.Running:
-					return new object[] {
+					content = new object[] {
 						GetSimulationParameters(resultEntry),
 						new XElement(
 							tns + XMLNames.Report_Results_Error,
 							string.Format("Simulation not finished! Status: {0}", resultEntry.Status)),
 						new XElement(tns + XMLNames.Report_Results_ErrorDetails, ""),
 					}; // should not happen!
-				case VectoRun.Status.Success: return GetSuccessResultEntry(resultEntry);
+					break;
 				case VectoRun.Status.Canceled:
 				case VectoRun.Status.Aborted:
-					return new object[] {
+					content =  new object[] {
 						GetSimulationParameters(resultEntry),
 						new XElement(tns + XMLNames.Report_Results_Error, resultEntry.Error),
 						new XElement(tns + XMLNames.Report_Results_ErrorDetails, resultEntry.StackTrace),
 					};
+					break;
 				default: throw new ArgumentOutOfRangeException();
 			}
+
+			return new XElement(
+				tns + XMLNames.Report_Result_Result,
+				new XAttribute(
+					XMLNames.Report_Result_Status_Attr, "error"),
+				new XAttribute(xsi + "type", "ResultErrorType"),
+				new XElement(tns + XMLNames.Report_Result_Mission, resultEntry.Mission.ToXMLFormat()),
+				content);
 		}
 
-		protected virtual object[] GetSuccessResultEntry(XMLDeclarationReport.ResultEntry result)
+		protected virtual XElement GetSuccessResult(XMLDeclarationReport.ResultEntry result)
 		{
-			return new object[] {
+			return new XElement(
+				tns + XMLNames.Report_Result_Result,
+				new XAttribute(
+					XMLNames.Report_Result_Status_Attr, "success"),
+				new XAttribute(xsi + "type", "ResultSuccessType"),
+				new XElement(tns + XMLNames.Report_Result_Mission, result.Mission.ToXMLFormat()), 
 				new XElement(
 					tns + XMLNames.Report_ResultEntry_Distance, new XAttribute(XMLNames.Report_Results_Unit_Attr, XMLNames.Unit_km),
 					result.Distance.ConvertToKiloMeter().ToXMLFormat(3)),
 				GetSimulationParameters(result),
+				GetVehiclePerformance(result),
+				//FC
+				XMLDeclarationReport.GetResults(result, tns, true).Cast<object>().ToArray()
+			);
+		}
+
+		private XElement GetVehiclePerformance(XMLDeclarationReport.ResultEntry result)
+		{
+			return new XElement(
+				tns + XMLNames.Report_ResultEntry_VehiclePerformance,
 				new XElement(
-					tns + XMLNames.Report_ResultEntry_VehiclePerformance,
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_AverageSpeed,
-						XMLHelper.ValueAsUnit(result.AverageSpeed, XMLNames.Unit_kmph, 1)),
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_AvgDrivingSpeed,
-						XMLHelper.ValueAsUnit(result.AverageDrivingSpeed, XMLNames.Unit_kmph, 1)),
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_MinSpeed, XMLHelper.ValueAsUnit(result.MinSpeed, XMLNames.Unit_kmph, 1)),
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_MaxSpeed, XMLHelper.ValueAsUnit(result.MaxSpeed, XMLNames.Unit_kmph, 1)),
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_MaxDeceleration,
-						XMLHelper.ValueAsUnit(result.MaxDeceleration, XMLNames.Unit_mps2, 2)),
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_MaxAcceleration,
-						XMLHelper.ValueAsUnit(result.MaxAcceleration, XMLNames.Unit_mps2, 2)),
-					new XElement(
-						tns + XMLNames.Report_ResultEntry_FullLoadDrivingtimePercentage,
-						result.FullLoadPercentage.ToXMLFormat(2)),
-					new XElement(tns + XMLNames.Report_ResultEntry_GearshiftCount, result.GearshiftCount.ToXMLFormat(0)),
+					tns + XMLNames.Report_ResultEntry_AverageSpeed,
+					XMLHelper.ValueAsUnit(result.AverageSpeed, XMLNames.Unit_kmph, 1)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_AvgDrivingSpeed,
+					XMLHelper.ValueAsUnit(result.AverageDrivingSpeed, XMLNames.Unit_kmph, 1)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_MinSpeed, XMLHelper.ValueAsUnit(result.MinSpeed, XMLNames.Unit_kmph, 1)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_MaxSpeed, XMLHelper.ValueAsUnit(result.MaxSpeed, XMLNames.Unit_kmph, 1)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_MaxDeceleration,
+					XMLHelper.ValueAsUnit(result.MaxDeceleration, XMLNames.Unit_mps2, 2)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_MaxAcceleration,
+					XMLHelper.ValueAsUnit(result.MaxAcceleration, XMLNames.Unit_mps2, 2)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_FullLoadDrivingtimePercentage,
+					result.FullLoadPercentage.ToXMLFormat(2)),
+				new XElement(tns + XMLNames.Report_ResultEntry_GearshiftCount, result.GearshiftCount.ToXMLFormat(0)),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_EngineSpeedDriving,
 					new XElement(
-						tns + XMLNames.Report_ResultEntry_EngineSpeedDriving,
-						new XElement(
-							tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Min,
-							XMLHelper.ValueAsUnit(result.EngineSpeedDrivingMin, XMLNames.Unit_RPM, 1)),
-						new XElement(
-							tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Avg,
-							XMLHelper.ValueAsUnit(result.EngineSpeedDrivingAvg, XMLNames.Unit_RPM, 1)),
-						new XElement(
-							tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Max,
-							XMLHelper.ValueAsUnit(result.EngineSpeedDrivingMax, XMLNames.Unit_RPM, 1))
-					),
+						tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Min,
+						XMLHelper.ValueAsUnit(result.EngineSpeedDrivingMin, XMLNames.Unit_RPM, 1)),
 					new XElement(
-						tns + XMLNames.Report_Results_AverageGearboxEfficiency,
-						XMLHelper.ValueAsUnit(result.AverageGearboxEfficiency, XMLNames.UnitPercent, 2)),
+						tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Avg,
+						XMLHelper.ValueAsUnit(result.EngineSpeedDrivingAvg, XMLNames.Unit_RPM, 1)),
 					new XElement(
-						tns + XMLNames.Report_Results_AverageAxlegearEfficiency,
-						XMLHelper.ValueAsUnit(result.AverageAxlegearEfficiency, XMLNames.UnitPercent, 2))
+						tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Max,
+						XMLHelper.ValueAsUnit(result.EngineSpeedDrivingMax, XMLNames.Unit_RPM, 1))
 				),
-
-				//FC
-				XMLDeclarationReport.GetResults(result, tns, true).Cast<object>().ToArray()
-			};
+				new XElement(
+					tns + XMLNames.Report_Results_AverageGearboxEfficiency,
+					XMLHelper.ValueAsUnit(result.AverageGearboxEfficiency, XMLNames.UnitPercent, 2)),
+				new XElement(
+					tns + XMLNames.Report_Results_AverageAxlegearEfficiency,
+					XMLHelper.ValueAsUnit(result.AverageAxlegearEfficiency, XMLNames.UnitPercent, 2))
+			);
 		}
 
 		protected virtual XElement GetSimulationParameters(XMLDeclarationReport.ResultEntry result)
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
index f6abd85ecd..930e034798 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
@@ -69,6 +69,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		protected KilogramPerMeter _weightedCo2 = 0.SI<KilogramPerMeter>();
 
 		protected Kilogram _weightedPayload = 0.SI<Kilogram>();
+		private double _passengerCount;
 
 
 		public XMLCustomerReport()
@@ -174,45 +175,58 @@ namespace TUGraz.VectoCore.OutputData.XML
 		public virtual void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
 		{
 			//foreach (var resultEntry in entry.ResultEntry) {
-				_allSuccess &= resultEntry.Status == VectoRun.Status.Success;
-				if (resultEntry.Status == VectoRun.Status.Success) {
-					_weightedPayload += resultEntry.Payload * resultEntry.WeightingFactor;
-					_weightedCo2 += resultEntry.CO2Total / resultEntry.Distance * resultEntry.WeightingFactor;
-				}
-				Results.Add(new XElement(tns + XMLNames.Report_Result_Result,
-					new XAttribute(XMLNames.Report_Result_Status_Attr,
-						resultEntry.Status == VectoRun.Status.Success ? "success" : "error"),
-					new XElement(tns + XMLNames.Report_Result_Mission, resultEntry.Mission.ToXMLFormat()),
-					GetResults(resultEntry)));
-			//}
+			_allSuccess &= resultEntry.Status == VectoRun.Status.Success;
+			if (resultEntry.Status == VectoRun.Status.Success) {
+				_weightedPayload += resultEntry.Payload * resultEntry.WeightingFactor;
+				_weightedCo2 += resultEntry.CO2Total / resultEntry.Distance * resultEntry.WeightingFactor;
+				_passengerCount += (resultEntry.PassengerCount ?? 0) * resultEntry.WeightingFactor;
+			}
+			Results.Add(resultEntry.Status == VectoRun.Status.Success ? GetSuccessResult(resultEntry) : GetErrorResult(resultEntry));
 		}
 
-		private object[] GetResults(XMLDeclarationReport.ResultEntry resultEntry)
+		private XElement GetErrorResult(XMLDeclarationReport.ResultEntry resultEntry)
 		{
+			var content = new object[] { };
 			switch (resultEntry.Status) {
 				case VectoRun.Status.Pending:
 				case VectoRun.Status.Running:
-					return null; // should not happen!
-				case VectoRun.Status.Success:
-					return GetSuccessResultEntry(resultEntry);
+					content = null; // should not happen!
+					break;
 				case VectoRun.Status.Canceled:
 				case VectoRun.Status.Aborted:
-					return new object[] {
+					content =  new object[] {
 						new XElement(tns + "Error", resultEntry.Error)
 					};
+					break;
 				default:
 					throw new ArgumentOutOfRangeException();
 			}
+
+			return new XElement(tns + XMLNames.Report_Result_Result,
+				new XAttribute(XMLNames.Report_Result_Status_Attr, "error"),
+				new XAttribute(xsi + "type", "ResultErrorType"),
+				new XElement(tns + XMLNames.Report_Result_Mission, resultEntry.Mission.ToXMLFormat()),
+				content);
 		}
 
-		private object[] GetSuccessResultEntry(XMLDeclarationReport.ResultEntry result)
+		private XElement GetSuccessResult(XMLDeclarationReport.ResultEntry result)
 		{
-			return new object[] {
-				new XElement(tns + XMLNames.Report_Result_Payload, XMLHelper.ValueAsUnit(result.Payload, XMLNames.Unit_kg, 0)),
-				new XElement(tns + XMLNames.Report_Result_FuelMode, result.FuelData.Count > 1 ? XMLNames.Report_Result_FuelMode_Val_Dual : XMLNames.Report_Result_FuelMode_Val_Single),
+			return new XElement(
+				tns + XMLNames.Report_Result_Result,
+				new XAttribute(XMLNames.Report_Result_Status_Attr, "success"),
+				new XAttribute(xsi + "type", "ResultSuccessType"),
+				new XElement(tns + XMLNames.Report_Result_Mission, result.Mission.ToXMLFormat()),
+				new XElement(tns + XMLNames.Report_ResultEntry_TotalVehicleMass,
+					XMLHelper.ValueAsUnit(result.TotalVehicleMass, XMLNames.Unit_kg)),
+				new XElement(tns + XMLNames.Report_ResultEntry_Payload, XMLHelper.ValueAsUnit(result.Payload, XMLNames.Unit_kg)),
+				result.PassengerCount.HasValue && result.PassengerCount.Value > 0
+					? new XElement(tns + "PassengerCount", result.PassengerCount.Value.ToMinSignificantDigits(3, 1))
+					: null,
+				new XElement(tns + XMLNames.Report_Result_FuelMode,
+					result.FuelData.Count > 1 ? XMLNames.Report_Result_FuelMode_Val_Dual : XMLNames.Report_Result_FuelMode_Val_Single),
 				new XElement(tns + XMLNames.Report_Results_AverageSpeed, XMLHelper.ValueAsUnit(result.AverageSpeed, XMLNames.Unit_kmph, 1)),
 				XMLDeclarationReport.GetResults(result, tns, false).Cast<object>().ToArray()
-			};
+			);
 		}
 
 		private XElement GetApplicationInfo()
@@ -244,7 +258,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 					new XElement(tns + XMLNames.Report_AveragePayload,
 						new XAttribute(XMLNames.Report_Results_Unit_Attr, XMLNames.Unit_t),
 						_weightedPayload.ConvertToTon().ToXMLFormat(3)
-					)
+					),
+					_passengerCount > 0 ? new XElement(tns + "AveragePAssengerCount", _passengerCount.ToMinSignificantDigits(2)) : null
 				)
 				: null;
 			results.Add(summary);
diff --git a/VectoCore/VectoCore/Resources/XSD/VectoOutputCustomer.0.8.xsd b/VectoCore/VectoCore/Resources/XSD/VectoOutputCustomer.0.8.xsd
index 2910ced337..105dbe8412 100644
--- a/VectoCore/VectoCore/Resources/XSD/VectoOutputCustomer.0.8.xsd
+++ b/VectoCore/VectoCore/Resources/XSD/VectoOutputCustomer.0.8.xsd
@@ -320,7 +320,7 @@
 															</xs:simpleContent>
 														</xs:complexType>
 													</xs:element>
-													<xs:element name="AveragePassengerCount" type="xs:double"/>
+													<xs:element name="AveragePassengerCount" type="xs:double" minOccurs="0"/>
 												</xs:sequence>
 											</xs:complexType>
 										</xs:element>
@@ -520,16 +520,24 @@
 							<xs:documentation>P046 / II.1.2.9  // arithmetic average of RRC over all truck tires</xs:documentation>
 						</xs:annotation>
 					</xs:element>
-					<xs:element name="AverageFuelEfficiencyLabelMotorVehicleTyres">
+					<xs:element name="FuelEfficiencyLabelMotorVehicleTyre" maxOccurs="4">
 						<xs:annotation>
 							<xs:documentation>II.1.2.10  // classification of AverageRRCMotorVehicleTyres according to 1222/2009 C3 tyres </xs:documentation>
 						</xs:annotation>
-						<xs:simpleType>
-							<xs:restriction base="xs:string">
-								<xs:minLength value="1"/>
-								<xs:maxLength value="1"/>
-							</xs:restriction>
-						</xs:simpleType>
+						<xs:complexType>
+							<xs:simpleContent>
+								<xs:extension base="xs:string">
+									<xs:attribute name="axleNbr" use="required">
+										<xs:simpleType>
+											<xs:restriction base="xs:int">
+												<xs:minInclusive value="1"/>
+												<xs:maxInclusive value="4"/>
+											</xs:restriction>
+										</xs:simpleType>
+									</xs:attribute>
+								</xs:extension>
+							</xs:simpleContent>
+						</xs:complexType>
 					</xs:element>
 					<xs:element name="InputDataSignature" type="vdecdef:SignatureType"/>
 				</xs:sequence>
-- 
GitLab