From 692c36083137a998f79497b2a04c88d79866d1ab Mon Sep 17 00:00:00 2001
From: Harald Martini <harald.martini@student.tugraz.at>
Date: Thu, 2 Jun 2022 16:01:10 +0200
Subject: [PATCH] implemented conventional completed bus mockup functionality

---
 .../Models/Simulation/Impl/JobContainer.cs    |  2 +-
 .../Impl/SimulatorFactory/SimulatorFactory.cs |  1 +
 .../OutputData/ModalDataContainer.cs          |  5 +-
 .../XMLDeclarationReportCompletedVehicle.cs   | 14 +++++
 .../Multistage/MultistageMultipleRunsTest.cs  | 12 ++---
 .../VectoMockup/MockupModalDataContainer.cs   | 11 +++-
 VectoMockup/VectoMockup/MockupResultReader.cs | 14 ++++-
 ...DeclarationMockupReportCompletedVehicle.cs | 30 ++++++++---
 .../CompletedBusRunDataFactory.cs             | 53 +++++++++++--------
 .../MockupDeclarationSimulatorFactory.cs      | 22 +++++++-
 10 files changed, 123 insertions(+), 41 deletions(-)

diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs
index ad2dc8c984..a4c1640859 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs
@@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 					return _simulatorFactory.FollowUpSimulatorFactory;
 				} catch (Exception e){
 					LogManager.GetLogger(typeof(JobContainer).FullName).Error(e);
-					throw e;
+					throw;
 				}finally {
 
 				}
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs
index 19481c6d04..5078ec8586 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs
@@ -293,6 +293,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory
 					data.Report.AddResult(data.Loading, data.Mission, data.EngineData?.FuelMode ?? 0, data, modData);
 				}
 			};
+			
 			return addReportResult;
 		}
 	}
diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
index 7690c5d72e..07d483372e 100644
--- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
@@ -647,7 +647,10 @@ namespace TUGraz.VectoCore.OutputData
 				}
 			}
 
-			_addReportResult(this);
+			if (_addReportResult != null) {
+				_addReportResult(this);
+			}
+			
 		}
 
 		private IList<string> GetOutputColumns()
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
index 18d8a1e85e..f2539057dd 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
@@ -19,6 +19,11 @@ namespace TUGraz.VectoCore.OutputData.XML {
 
 		#region Overrides of XMLDeclarationReport
 
+		protected override void DoStoreResult(ResultEntry entry, VectoRunData runData, IModalDataContainer modData)
+		{
+			//base.DoStoreResult(entry, runData, modData);
+		}
+
 		protected override void InstantiateReports(VectoRunData modelData)
 		{
 			ManufacturerRpt = modelData.Exempted
@@ -101,5 +106,14 @@ namespace TUGraz.VectoCore.OutputData.XML {
 				OutputReports();
 			}
 		}
+
+		#region Overrides of XMLDeclarationReport
+
+		protected override void WriteResult(ResultEntry result)
+		{
+			base.WriteResult(result);
+		}
+
+		#endregion
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/Multistage/MultistageMultipleRunsTest.cs b/VectoCore/VectoCoreTest/Integration/Multistage/MultistageMultipleRunsTest.cs
index 62a554a0c8..88e1d37ba5 100644
--- a/VectoCore/VectoCoreTest/Integration/Multistage/MultistageMultipleRunsTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/Multistage/MultistageMultipleRunsTest.cs
@@ -129,9 +129,10 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
 
 		//SpecialCase II
 		[Test, Timeout(1000 * 20 * 60)]
+        [NonParallelizable]
 		public void PrimaryAndCompletedTest()
 		{
-			StartSimulation(CompletedDiesel);
+			StartSimulation(CompletedDiesel, false);
 
 			var writtenFiles = GetWrittenFiles();
 			ShowWrittenFiles(writtenFiles);
@@ -160,7 +161,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
 		}
 
 		//SpecialCase I
-		[Test, Timeout(1000 * 10 * 60)]
+		[Test]//, Timeout(1000 * 10 * 60)]
 		public void PrimaryAndInterimTest()
 		{
 			StartSimulation(InterimDiesel);
@@ -168,14 +169,13 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
 
 			var writtenFiles = GetWrittenFiles();
 			ShowWrittenFiles(writtenFiles);
-
 			Assert.IsTrue(writtenFiles.Contains(_tempFileOutputWriter.XMLFullReportName));
 			Assert.IsFalse(writtenFiles.Contains(_fileoutputWriter.XMLFullReportName));
 			Assert.IsFalse(writtenFiles.Contains(_fileoutputWriter.XMLCustomerReportName));
 			Assert.IsTrue(writtenFiles.Contains(_fileoutputWriter.XMLMultistageReportFileName));
 		}
 
-		private void StartSimulation(string path)
+		private void StartSimulation(string path, bool multithreaded = true)
 		{
 			var inputFile = Path.GetFullPath(path);
 			var input = JSONInputDataFactory.ReadJsonJob(inputFile);
@@ -187,7 +187,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
 		}
 
 
-		private void StartSimulation(IInputDataProvider input)
+		private void StartSimulation(IInputDataProvider input, bool multithreaded = true)
 		{
 			_fileoutputWriter = new FileOutputWriter(_outputDirectory);
 			_tempFileOutputWriter = new TempFileOutputWriter(_fileoutputWriter);
@@ -202,7 +202,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Multistage
 
 
 			_jobContainer.AddRuns(runsFactory);
-			_jobContainer.Execute();
+			_jobContainer.Execute(multithreaded);
 		}
 
 		private void ShowWrittenFiles(IList<string> writtenFiles)
diff --git a/VectoMockup/VectoMockup/MockupModalDataContainer.cs b/VectoMockup/VectoMockup/MockupModalDataContainer.cs
index 1cebce4a3d..859eed4b48 100644
--- a/VectoMockup/VectoMockup/MockupModalDataContainer.cs
+++ b/VectoMockup/VectoMockup/MockupModalDataContainer.cs
@@ -42,11 +42,14 @@ namespace TUGraz.VectoMockup
 	internal class MockupModalDataContainer : IModalDataContainer
     {
 		private IModalDataContainer _modalDataContainerImplementation;
+		private readonly Action<IModalDataContainer> _addReportResult;
 
-		public MockupModalDataContainer(IModalDataContainer modalDataContainer)
+		public MockupModalDataContainer(IModalDataContainer modalDataContainer,
+			Action<IModalDataContainer> addReportResult)
 		{
 			_modalDataContainerImplementation = modalDataContainer;
-			
+			_addReportResult = addReportResult;
+
 		}
 
 		#region MockupImplementation
@@ -143,6 +146,10 @@ namespace TUGraz.VectoMockup
 		public void Finish(VectoRun.Status runStatus, Exception exception = null)
 		{
 			_modalDataContainerImplementation.Finish(runStatus, exception);
+			if (_addReportResult != null) {
+				_addReportResult(this);
+			}
+
 		}
 
 		public void FinishSimulation()
diff --git a/VectoMockup/VectoMockup/MockupResultReader.cs b/VectoMockup/VectoMockup/MockupResultReader.cs
index 654c6302f5..344fe5ea0a 100644
--- a/VectoMockup/VectoMockup/MockupResultReader.cs
+++ b/VectoMockup/VectoMockup/MockupResultReader.cs
@@ -11,6 +11,7 @@ using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.OutputData.XML;
@@ -106,8 +107,17 @@ namespace TUGraz.VectoMockup
 
 			private static string GetArch(string xmlName, VectoRunData runData)
 			{
-				var ovc = runData.InputData.JobInputData.Vehicle.OvcHev;
-				var jobType = runData.InputData.JobInputData.JobType;
+
+				bool ovc = false;
+				var jobType = VectoSimulationJobType.ConventionalVehicle;
+				if (runData.InputData is IXMLMultistageInputDataProvider) {
+					ovc = false; //TODO implement
+				} else {
+					ovc = runData.InputData.JobInputData.Vehicle.OvcHev;
+					jobType = runData.InputData.JobInputData.JobType;
+				}
+
+				
 				if (jobType == VectoSimulationJobType.ConventionalVehicle) {
 					return "Conv";
 				}
diff --git a/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReportCompletedVehicle.cs b/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReportCompletedVehicle.cs
index 42cacdedc8..c04214e043 100644
--- a/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReportCompletedVehicle.cs
+++ b/VectoMockup/VectoMockup/Reports/XMLDeclarationMockupReportCompletedVehicle.cs
@@ -14,7 +14,7 @@ using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.Manu
 
 namespace TUGraz.VectoMockup.Reports
 {
-    internal class XMLDeclarationMockupReportCompletedVehicle : XMLDeclarationReportCompletedVehicle
+    public class XMLDeclarationMockupReportCompletedVehicle : XMLDeclarationReportCompletedVehicle
 	{
 		private readonly IManufacturerReportFactory _mrfFactory;
 		private readonly ICustomerInformationFileFactory _cifFactory;
@@ -57,15 +57,25 @@ namespace TUGraz.VectoMockup.Reports
 			base.InitializeReport(modelData, fuelModes);
 		}
 
+		#endregion
+
+		#region Overrides of XMLDeclarationReport
+
+		#region Overrides of XMLDeclarationReportCompletedVehicle
+
 		protected internal override void DoWriteReport()
 		{
-			base.DoWriteReport();
+			(ManufacturerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
+            (CustomerRpt as IXMLMockupReport).WriteMockupSummary(Results.First());
+			GenerateReports();
+			if (Writer != null)
+			{
+				OutputReports();
+			}
 		}
 
 		#endregion
 
-		#region Overrides of XMLDeclarationReport
-
 		protected override void DoStoreResult(ResultEntry entry, VectoRunData runData, IModalDataContainer modData)
 		{
 			base.DoStoreResult(entry, runData, modData);
@@ -73,14 +83,22 @@ namespace TUGraz.VectoMockup.Reports
 
 		protected override void WriteResult(ResultEntry result)
 		{
-			base.WriteResult(result);
+			(ManufacturerRpt as IXMLMockupReport).WriteMockupResult(result);
+			(CustomerRpt as IXMLMockupReport).WriteMockupResult(result);
 		}
 
 		protected override void GenerateReports()
 		{
-			base.GenerateReports();
+			base.GenerateReports();	
+		}
+
+		protected override void OutputReports()
+		{
+			base.OutputReports();
 		}
 
+
+
 		#endregion
 	}
 }
diff --git a/VectoMockup/VectoMockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs b/VectoMockup/VectoMockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs
index 4038435aef..d09f52d067 100644
--- a/VectoMockup/VectoMockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs
+++ b/VectoMockup/VectoMockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs
@@ -23,6 +23,7 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories
 
 		}
 
+
 		#region Overrides of DeclarationModeCompletedMultistageBusVectoRunDataFactory
 
 		protected override void Initialize()
@@ -58,30 +59,34 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories
 				Mission = mission,
 				GearboxData = PrimaryBusMockupRunDataFactory.CreateMockupGearboxData(PrimaryVehicle),
 				InputData = InputDataProvider,
+				SimulationType = SimulationType.DistanceCycle,
+				ExecutionMode = ExecutionMode.Declaration,
+				JobName = InputDataProvider.JobInputData.ManufacturingStages.Last().Vehicle.Identifier,
+				Report = Report,
 				//Aux = PrimaryBusMockupRunDataFactory.CreateMockupBusAux(CompletedVehicle),
 
-    //            //AirdragData = DataAdapterSpecific.CreateAirdragData(CompletedVehicle, mission),
-    //            //EngineData = DataAdapterSpecific.CreateEngineData(PrimaryVehicle, modeIdx, mission),
-    //            //ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(),
-    //            //GearboxData = _gearboxData,
-    //            //AxleGearData = _axlegearData,
-    //            //AngledriveData = _angledriveData,
-    //            Aux = DataAdapterSpecific.CreateAuxiliaryData(PrimaryVehicle.Components.AuxiliaryInputData,
-    //                PrimaryVehicle.Components.BusAuxiliaries, mission.MissionType, _segmentCompletedBus.VehicleClass, CompletedVehicle.Length,
-    //                PrimaryVehicle.Components.AxleWheels.NumSteeredAxles),
-                //Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
-                //Retarder = _retarderData,
-                ////DriverData = _driverData,
-                //ExecutionMode = ExecutionMode.Declaration,
-                //JobName = InputDataProvider.JobInputData.ManufacturingStages.Last().Vehicle.Identifier,//?!? Jobname
-                //ModFileSuffix = $"_{_segmentCompletedBus.VehicleClass.GetClassNumber()}-Specific_{loading.Key}",
-                //Report = Report,
-                //Mission = mission,
-                //InputDataHash = InputDataProvider.XMLHash,// right hash?!?
-                //SimulationType = SimulationType.DistanceCycle,
-                //VehicleDesignSpeed = _segmentCompletedBus.DesignSpeed,
-                //GearshiftParameters = _gearshiftData,
-            };
+				//            //AirdragData = DataAdapterSpecific.CreateAirdragData(CompletedVehicle, mission),
+				//            //EngineData = DataAdapterSpecific.CreateEngineData(PrimaryVehicle, modeIdx, mission),
+				//            //ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(),
+				//            //GearboxData = _gearboxData,
+				//            //AxleGearData = _axlegearData,
+				//            //AngledriveData = _angledriveData,
+				//            Aux = DataAdapterSpecific.CreateAuxiliaryData(PrimaryVehicle.Components.AuxiliaryInputData,
+				//                PrimaryVehicle.Components.BusAuxiliaries, mission.MissionType, _segmentCompletedBus.VehicleClass, CompletedVehicle.Length,
+				//                PrimaryVehicle.Components.AxleWheels.NumSteeredAxles),
+				//Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
+				//Retarder = _retarderData,
+				////DriverData = _driverData,
+				//ExecutionMode = ExecutionMode.Declaration,
+				//JobName = InputDataProvider.JobInputData.ManufacturingStages.Last().Vehicle.Identifier,//?!? Jobname
+				//ModFileSuffix = $"_{_segmentCompletedBus.VehicleClass.GetClassNumber()}-Specific_{loading.Key}",
+				//Report = Report,
+				//Mission = mission,
+				//InputDataHash = InputDataProvider.XMLHash,// right hash?!?
+				//SimulationType = SimulationType.DistanceCycle,
+				//VehicleDesignSpeed = _segmentCompletedBus.DesignSpeed,
+				//GearshiftParameters = _gearshiftData,
+			};
 			simulationRunData.EngineData.FuelMode = 0;
 			simulationRunData.VehicleData.VehicleClass = _segmentCompletedBus.VehicleClass;
 			simulationRunData.BusAuxiliaries = DataAdapterSpecific.CreateBusAuxiliariesData(mission, PrimaryVehicle, CompletedVehicle, simulationRunData);
@@ -100,7 +105,11 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories
 					Loading = loading.Value.Item1,
 					
 				},
+				JobName = InputDataProvider.JobInputData.ManufacturingStages.Last().Vehicle.Identifier,
+				ExecutionMode = ExecutionMode.Declaration,
+				SimulationType = SimulationType.DistanceCycle,
 				Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
+				Report = Report,
 			};
 			return base.CreateVectoRunDataGeneric(mission, loading, primarySegment, modeIdx);
 		}
diff --git a/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs b/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs
index ff38379ff0..4f4997bdbc 100644
--- a/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs
+++ b/VectoMockup/VectoMockup/Simulation/SimulatorFactory/MockupDeclarationSimulatorFactory.cs
@@ -50,10 +50,30 @@ namespace TUGraz.VectoMockup.Simulation.SimulatorFactory
 		{
 			var addReportResult = PrepareReport(data);
 			return new MockupRun(new VehicleContainer(ExecutionMode.Declaration,
-					new ModalDataContainer(data, ReportWriter, addReportResult))
+					new MockupModalDataContainer(new ModalDataContainer(data, ReportWriter, null), addReportResult))
 				{ RunData = data });
 			
 		}
+		protected new static Action<IModalDataContainer> PrepareReport(VectoRunData data)
+		{
+			if (data.Report != null)
+			{
+				data.Report.PrepareResult(data.Loading, data.Mission, data.EngineData?.FuelMode ?? 0, data);
+			}
+			Action<IModalDataContainer> addReportResult = modData => {
+				if (modData is MockupModalDataContainer && data.Report != null) {
+					data.Report.AddResult(data.Loading, data.Mission, data.EngineData?.FuelMode ?? 0, data, modData);
+				}
+
+				return;
+				//if (data.Report != null)
+				//{
+				//	data.Report.AddResult(data.Loading, data.Mission, data.EngineData?.FuelMode ?? 0, data, modData);
+				//}
+			};
+
+			return addReportResult;
+		}
 
 		#region Overrides of SimulatorFactoryDeclaration
 
-- 
GitLab