From c299d2a30f41a54264c5afffded54618271cb120 Mon Sep 17 00:00:00 2001
From: Harald Martini <harald.martini@student.tugraz.at>
Date: Thu, 23 Jun 2022 13:02:54 +0200
Subject: [PATCH] exempted heavy and medium lorries now work in mockup mode

---
 .../CustomerInformationFile.cs                |  1 -
 .../XML/XMLDeclarationReport_0_9.cs           |  4 ++--
 .../VectoMockup/Ninject/CIFMockupModule.cs    |  2 +-
 .../VectoMockup/Ninject/MRFMockupModule.cs    |  2 +-
 .../VectoMockup/Reports/IXMLMockupReport.cs   |  1 +
 .../Reports/MockupCustomerReport.cs           | 16 +++++++++----
 .../Reports/MockupManufacturerReport.cs       | 10 +++++++-
 .../Reports/MockupPrimaryReport.cs            |  6 +++++
 .../Reports/MockupReportFactory.cs            |  3 ++-
 .../XMLDeclarationMockupPrimaryReport.cs      | 23 ++++++++++---------
 .../Reports/XMLDeclarationMockupReport.cs     | 18 +++++++++++----
 .../Simulation/MockupExemptedRun.cs           | 20 ++++++++++++++++
 .../MockupLorryVectoRunDataFactory.cs         |  5 ++--
 .../PrimaryBusMockupRunDataFactory.cs         | 10 +++++++-
 .../MockupDeclarationSimulatorFactory.cs      | 16 ++++++++-----
 .../MockupFollowUpSimulatorFactoryCreator.cs  |  2 +-
 16 files changed, 103 insertions(+), 36 deletions(-)
 create mode 100644 VectoMockup/VectoMockup/Simulation/MockupExemptedRun.cs

diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CustomerInformationFile/CustomerInformationFile.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CustomerInformationFile/CustomerInformationFile.cs
index 27077ebcb9..4c5d7cdce4 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CustomerInformationFile/CustomerInformationFile.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CustomerInformationFile/CustomerInformationFile.cs
@@ -55,7 +55,6 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
 
 		public override void InitializeVehicleData(IDeclarationInputDataProvider inputData)
 		{
-			var vehicle = _cifFactory.GetHEV_PxLorryVehicleType();
 			Vehicle = _cifFactory.GetHEV_PxLorryVehicleType().GetElement(inputData);
 		}
 		#endregion
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport_0_9.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport_0_9.cs
index e8efa731f7..12dbf90118 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport_0_9.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport_0_9.cs
@@ -102,9 +102,9 @@ namespace TUGraz.VectoCore.OutputData.XML
 		protected override void InstantiateReports(VectoRunData modelData)
 		{
 			var vehicleData = modelData.VehicleData.InputData;
-			var iepc = vehicleData.Components.IEPC != null;
+			var iepc = vehicleData.Components?.IEPC != null;
 			var ihpc =
-				vehicleData.Components.ElectricMachines?.Entries?.Count(e => e.ElectricMachine.IHPCType != "None") > 0;
+				vehicleData.Components?.ElectricMachines?.Entries?.Count(e => e.ElectricMachine.IHPCType != "None") > 0;
 
 			ManufacturerRpt = _mrfFactory.GetManufacturerReport(vehicleData.VehicleCategory,
 				vehicleData.VehicleType,
diff --git a/VectoMockup/VectoMockup/Ninject/CIFMockupModule.cs b/VectoMockup/VectoMockup/Ninject/CIFMockupModule.cs
index d42cc8c3d8..fb512e085e 100644
--- a/VectoMockup/VectoMockup/Ninject/CIFMockupModule.cs
+++ b/VectoMockup/VectoMockup/Ninject/CIFMockupModule.cs
@@ -40,7 +40,7 @@ namespace TUGraz.VectoMockup.Ninject
         public IXMLCustomerReport GetCustomerReport(VehicleCategory vehicleType, VectoSimulationJobType jobType, ArchitectureID archId,
             bool exempted, bool iepc, bool ihpc)
         {
-            return new MockupCustomerReport(_cifFactory.GetCustomerReport(vehicleType, jobType, archId, exempted, iepc, ihpc));
+            return new MockupCustomerReport(_cifFactory.GetCustomerReport(vehicleType, jobType, archId, exempted, iepc, ihpc), exempted);
         }
 
         public IXmlTypeWriter GetConventionalLorryVehicleType()
diff --git a/VectoMockup/VectoMockup/Ninject/MRFMockupModule.cs b/VectoMockup/VectoMockup/Ninject/MRFMockupModule.cs
index 04732f6a61..747f08b7d3 100644
--- a/VectoMockup/VectoMockup/Ninject/MRFMockupModule.cs
+++ b/VectoMockup/VectoMockup/Ninject/MRFMockupModule.cs
@@ -44,7 +44,7 @@ namespace TUGraz.VectoMockup.Ninject
         public IXMLManufacturerReport GetManufacturerReport(VehicleCategory vehicleType, VectoSimulationJobType jobType,
             ArchitectureID archId, bool exempted, bool iepc, bool ihpc)
         {
-            return new MockupManufacturerReport(_manufacturerReportFactoryImplementation.GetManufacturerReport(vehicleType, jobType, archId, exempted, iepc, ihpc));
+            return new MockupManufacturerReport(_manufacturerReportFactoryImplementation.GetManufacturerReport(vehicleType, jobType, archId, exempted, iepc, ihpc), exempted);
         }
 
         public IXmlTypeWriter GetConventionalLorryVehicleType()
diff --git a/VectoMockup/VectoMockup/Reports/IXMLMockupReport.cs b/VectoMockup/VectoMockup/Reports/IXMLMockupReport.cs
index 847d4573c3..f5d43b3673 100644
--- a/VectoMockup/VectoMockup/Reports/IXMLMockupReport.cs
+++ b/VectoMockup/VectoMockup/Reports/IXMLMockupReport.cs
@@ -6,5 +6,6 @@ namespace TUGraz.VectoMockup.Reports
 	{
 		void WriteMockupResult(XMLDeclarationReport.ResultEntry resultValue);
 		void WriteMockupSummary(XMLDeclarationReport.ResultEntry resultValue);
+		void WriteExemptedResults();
 	}
 }
\ No newline at end of file
diff --git a/VectoMockup/VectoMockup/Reports/MockupCustomerReport.cs b/VectoMockup/VectoMockup/Reports/MockupCustomerReport.cs
index e365d2265f..fab9897b4d 100644
--- a/VectoMockup/VectoMockup/Reports/MockupCustomerReport.cs
+++ b/VectoMockup/VectoMockup/Reports/MockupCustomerReport.cs
@@ -14,11 +14,13 @@ namespace TUGraz.VectoMockup.Reports
 {
     public class MockupCustomerReport : IXMLCustomerReport, IXMLMockupReport
     {
-        private readonly AbstractCustomerReport _originalCustomerReport;
+		private readonly bool _exempted;
+		private readonly AbstractCustomerReport _originalCustomerReport;
         private XNamespace Cif = AbstractCustomerReport.Cif;
-        public MockupCustomerReport(IXMLCustomerReport originalReport)
+        public MockupCustomerReport(IXMLCustomerReport originalReport, bool exempted)
         {
-            _originalCustomerReport = originalReport as AbstractCustomerReport;
+			_exempted = exempted;
+			_originalCustomerReport = originalReport as AbstractCustomerReport;
             _outputDataType = _originalCustomerReport.OutputDataType;
             Results = new XElement(Cif + XMLNames.Report_Results);
         }
@@ -74,6 +76,12 @@ namespace TUGraz.VectoMockup.Reports
             Results.Add(MockupResultReader.GetCIFMockupResult(_outputDataType, resultValue, Cif + "Summary", _modelData));
         }
 
-        #endregion
+		public void WriteExemptedResults()
+		{
+			Results.Add(new XElement(Cif + "Status", "success"));
+			Results.Add(new XElement(Cif + "ExemptedVehicle"));
+        }
+
+		#endregion
     }
 }
\ No newline at end of file
diff --git a/VectoMockup/VectoMockup/Reports/MockupManufacturerReport.cs b/VectoMockup/VectoMockup/Reports/MockupManufacturerReport.cs
index f75d7e22e1..46309a0535 100644
--- a/VectoMockup/VectoMockup/Reports/MockupManufacturerReport.cs
+++ b/VectoMockup/VectoMockup/Reports/MockupManufacturerReport.cs
@@ -14,14 +14,16 @@ namespace TUGraz.VectoMockup.Reports
 {
 	public class MockupManufacturerReport : IXMLManufacturerReport, IXMLMockupReport
 	{
+		private readonly bool _exempted;
 		private AbstractManufacturerReport _ixmlManufacturerReportImplementation;
 		private VectoRunData _modelData;
 
 		private XNamespace Mrf = AbstractManufacturerReport.Mrf;
 		private readonly string _outputData;
 		private XElement Results { get; set; }
-		public MockupManufacturerReport(IXMLManufacturerReport originalManufacturerReport)
+		public MockupManufacturerReport(IXMLManufacturerReport originalManufacturerReport, bool exempted)
 		{
+			_exempted = exempted;
 			_ixmlManufacturerReportImplementation = originalManufacturerReport as AbstractManufacturerReport;
 			_outputData = _ixmlManufacturerReportImplementation.OutputDataType;
 
@@ -44,6 +46,12 @@ namespace TUGraz.VectoMockup.Reports
 			//Results.Add(MockupResultReader.GetMRFMockupResult(OutputDataType, resultValue, Mrf + "Summary", _ovc));
 		}
 
+		public void WriteExemptedResults()
+		{
+			Results.Add(new XElement(Mrf + "Status", "success"));
+			Results.Add(new XElement(Mrf + "ExemptedVehicle"));
+		}
+
 
 		#region Implementation of IXMLManufacturerReport
 
diff --git a/VectoMockup/VectoMockup/Reports/MockupPrimaryReport.cs b/VectoMockup/VectoMockup/Reports/MockupPrimaryReport.cs
index 7bd7c44d85..508f3a13e3 100644
--- a/VectoMockup/VectoMockup/Reports/MockupPrimaryReport.cs
+++ b/VectoMockup/VectoMockup/Reports/MockupPrimaryReport.cs
@@ -60,6 +60,12 @@ namespace TUGraz.VectoMockup.Reports
 			Results.AddFirst(new XComment("Always prints success at the moment"));
 		}
 
+		public void WriteExemptedResults()
+		{
+			Results.Add(new XElement(Tns + "Status", "success"));
+			Results.Add(new XElement(Tns + "ExemptedVehicle"));
+		}
+
 
 		public void GenerateReport(XElement fullReportHash)
 		{ 
diff --git a/VectoMockup/VectoMockup/Reports/MockupReportFactory.cs b/VectoMockup/VectoMockup/Reports/MockupReportFactory.cs
index 58884b2090..28e605c867 100644
--- a/VectoMockup/VectoMockup/Reports/MockupReportFactory.cs
+++ b/VectoMockup/VectoMockup/Reports/MockupReportFactory.cs
@@ -88,7 +88,7 @@ namespace TUGraz.VectoMockup.Reports
             var vehicleCategory = declarationInputDataProvider.JobInputData.Vehicle.VehicleCategory;
             if (vehicleCategory.IsLorry())
             {
-                return new XMLDeclarationMockupReport(outputDataWriter, _mrfFactory, _cifFactory);
+                return new XMLDeclarationMockupReport(outputDataWriter, _mrfFactory, _cifFactory, declarationInputDataProvider.JobInputData.Vehicle.ExemptedVehicle);
             }
 
             if (vehicleCategory.IsBus())
@@ -105,6 +105,7 @@ namespace TUGraz.VectoMockup.Reports
                         };
                     case VehicleCategory.HeavyBusPrimaryVehicle:
                         return new XMLDeclarationMockupPrimaryReport(outputDataWriter, _mrfFactory, _cifFactory,
+							declarationInputDataProvider.JobInputData.Vehicle.ExemptedVehicle,
                             declarationInputDataProvider.JobInputData.Vehicle.VehicleCategory ==
                             VehicleCategory.HeavyBusPrimaryVehicle);
 
diff --git a/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupPrimaryReport.cs b/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupPrimaryReport.cs
index d3fd01c0c5..8bfa286065 100644
--- a/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupPrimaryReport.cs
+++ b/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupPrimaryReport.cs
@@ -12,22 +12,17 @@ namespace TUGraz.VectoMockup.Reports
 {
 	public class XMLDeclarationMockupPrimaryReport : XMLDeclarationReportPrimaryVehicle_09
 	{
+		private readonly bool _exempted;
+
 		public XMLDeclarationMockupPrimaryReport(IReportWriter writer,
 			IManufacturerReportFactory mrfFactory,
-			ICustomerInformationFileFactory cifFactory,
+			ICustomerInformationFileFactory cifFactory, bool exempted,
 			bool writePIF = false) : base(writer,
 			mrfFactory,
 			cifFactory,
 			writePIF)
 		{
-
-
-
-
-
-
-
-
+			_exempted = exempted;
 		}
 
 		protected override void InstantiateReports(VectoRunData modelData)
@@ -55,8 +50,14 @@ namespace TUGraz.VectoMockup.Reports
 
 		protected override void GenerateReports()
 		{
-			(ManufacturerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
-			(PrimaryReport as IXMLMockupReport).WriteMockupSummary(Results.First());
+			if (!_exempted) {
+				(ManufacturerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
+				(PrimaryReport as IXMLMockupReport).WriteMockupSummary(Results.First());
+			} else {
+				(ManufacturerRpt as IXMLMockupReport).WriteExemptedResults();
+				(PrimaryReport as IXMLMockupReport).WriteExemptedResults();
+			}
+
 			ManufacturerRpt.GenerateReport();
 			var fullReportHash = CreateDummySig();
 			//CustomerRpt.GenerateReport(fullReportHash);
diff --git a/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReport.cs b/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReport.cs
index d34b57ebb6..c8bc7ce6c9 100644
--- a/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReport.cs
+++ b/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReport.cs
@@ -14,11 +14,13 @@ namespace TUGraz.VectoMockup.Reports
 {
     internal class XMLDeclarationMockupReport : XMLDeclarationReport09
     {
+		private readonly bool _exempted;
+
 		public XMLDeclarationMockupReport(IReportWriter writer, IManufacturerReportFactory mrfFactory,
-			ICustomerInformationFileFactory cifFactory) :
+			ICustomerInformationFileFactory cifFactory, bool exempted) :
 			base(writer, mrfFactory, cifFactory)
 		{
-
+			_exempted = exempted;
 		}
 
 		#region Overrides of XMLDeclarationReport09
@@ -36,8 +38,16 @@ namespace TUGraz.VectoMockup.Reports
 
 		protected override void GenerateReports()
 		{
-			(ManufacturerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
-			(CustomerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
+			if (!_exempted) {
+				(ManufacturerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
+				(CustomerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
+			} else {
+				(ManufacturerRpt as IXMLMockupReport).WriteExemptedResults();
+				(CustomerRpt as IXMLMockupReport).WriteExemptedResults();
+			}
+		
+			
+			
 			base.GenerateReports();
 		}
 
diff --git a/VectoMockup/VectoMockup/Simulation/MockupExemptedRun.cs b/VectoMockup/VectoMockup/Simulation/MockupExemptedRun.cs
new file mode 100644
index 0000000000..d6bc297a36
--- /dev/null
+++ b/VectoMockup/VectoMockup/Simulation/MockupExemptedRun.cs
@@ -0,0 +1,20 @@
+using System;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.OutputData;
+
+namespace TUGraz.VectoMockup.Simulation
+{
+	internal class MockupExemptedRun : ExemptedRun
+	{
+		public MockupExemptedRun(VehicleContainer data, Action<ModalDataContainer> writeSumData) : base(data, writeSumData) { }
+
+		#region Overrides of ExemptedRun
+
+		protected override void CheckValidInput()
+		{
+			return;
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoMockup/VectoMockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs b/VectoMockup/VectoMockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs
index e67ae4c20e..92205fc234 100644
--- a/VectoMockup/VectoMockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs
+++ b/VectoMockup/VectoMockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs
@@ -69,14 +69,15 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories
             if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle)
             {
                 runData = new VectoRunData
-                {
+                { 
                     Exempted = true,
                     Report = Report,
                     Mission = new Mission() { MissionType = MissionType.ExemptedMission },
                     VehicleData = CreateMockupVehicleData(vehicle),
                     InputDataHash = InputDataProvider.XMLHash
                 };
-            }
+				runData.VehicleData.InputData = vehicle;
+			}
             else
             {
 
diff --git a/VectoMockup/VectoMockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs b/VectoMockup/VectoMockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs
index c506b333c7..a67489d8ef 100644
--- a/VectoMockup/VectoMockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs
+++ b/VectoMockup/VectoMockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs
@@ -72,7 +72,15 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories
             VectoRunData runData;
             if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle)
             {
-                throw new NotImplementedException();
+				runData = new VectoRunData
+				{
+					Exempted = true,
+					Report = Report,
+					Mission = new Mission() { MissionType = MissionType.ExemptedMission },
+					VehicleData = CreateMockupVehicleData(vehicle, _segment, loading),
+					InputDataHash = InputDataProvider.XMLHash
+				};
+				runData.VehicleData.InputData = vehicle;
             }
             else
             {
diff --git a/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs b/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs
index 4f4997bdbc..3ec5dd44da 100644
--- a/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs
+++ b/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs
@@ -38,12 +38,16 @@ namespace TUGraz.VectoMockup.Simulation.SimulatorFactory
 		protected override IVectoRun GetExemptedRun(VectoRunData data)
 		{
 
-			//var addReportResult = PrepareReport(data);
-			//return new MockupRun(new VehicleContainer(ExecutionMode.Declaration,
-			//		new ModalDataContainer(data, ReportWriter, addReportResult))
-			//	{ RunData = data });
-
-			return base.GetExemptedRun(data);
+			if (data.Report != null)
+			{
+				data.Report.PrepareResult(data.Loading, data.Mission, data.EngineData?.FuelMode ?? 0, data);
+			}
+			return new MockupExemptedRun(new ExemptedRunContainer(data.ExecutionMode) { RunData = data }, modData => {
+				if (data.Report != null)
+				{
+					data.Report.AddResult(data.Loading, data.Mission, data.EngineData?.FuelMode ?? 0, data, modData);
+				}
+			});
 		}
 
 		protected override IVectoRun GetNonExemptedRun(VectoRunData data, int current, VectoRunData d, ref bool warning1Hz)
diff --git a/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupFollowUpSimulatorFactoryCreator.cs b/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupFollowUpSimulatorFactoryCreator.cs
index 3cc29b8bf3..40f5aeccd5 100644
--- a/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupFollowUpSimulatorFactoryCreator.cs
+++ b/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupFollowUpSimulatorFactoryCreator.cs
@@ -23,7 +23,7 @@ namespace TUGraz.VectoMockup.Simulation.SimulatorFactory
 				inputDataReader, validate)
 		{
 			_currentStageDeclarationReport =
-				new XMLDeclarationMockupPrimaryReport(_currentStageOutputDataWriter, mrfFactory, cifFactory, true);
+				new XMLDeclarationMockupPrimaryReport(_currentStageOutputDataWriter, mrfFactory, cifFactory, originalStageInputData.StageInputData.ExemptedVehicle,true);
 		}
 
 		#region Overrides of InterimAfterPrimaryFactoryCreator
-- 
GitLab