diff --git a/VectoCore/Models/Simulation/Data/IModalDataWriter.cs b/VectoCore/Models/Simulation/Data/IModalDataWriter.cs index 2af509e9bb7789deef42998d625d58dbcbd80c4c..0d5ee7fc98e72dde72f5325b8e116459c888f67d 100644 --- a/VectoCore/Models/Simulation/Data/IModalDataWriter.cs +++ b/VectoCore/Models/Simulation/Data/IModalDataWriter.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Linq; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Simulation.Data @@ -29,10 +30,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Data /// </summary> void CommitSimulationStep(); + VectoRun.Status RunStatus { get; } + + /// <summary> /// Finishes the writing of the DataWriter. /// </summary> - void Finish(); + void Finish(VectoRun.Status runStatus); bool WriteModalResults { get; set; } diff --git a/VectoCore/Models/Simulation/Data/ModalDataWriter.cs b/VectoCore/Models/Simulation/Data/ModalDataWriter.cs index cfc9e766e2466c7a62a01fd91d43348e93f657cd..89cb858be6a8572875bc5e9528120af69f0265de 100644 --- a/VectoCore/Models/Simulation/Data/ModalDataWriter.cs +++ b/VectoCore/Models/Simulation/Data/ModalDataWriter.cs @@ -17,6 +17,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public bool WriteModalResults { get; set; } + public VectoRun.Status RunStatus { get; protected set; } public ModalDataWriter(string modFileName, SimulatorFactory.FactoryMode mode = SimulatorFactory.FactoryMode.EngineeringMode) : this(modFileName, _ => {}, mode) {} @@ -41,10 +42,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Data CurrentRow = Data.NewRow(); } - public void Finish() + public void Finish(VectoRun.Status runStatus) { var dataColumns = new List<ModalResultField> { ModalResultField.time }; + RunStatus = runStatus; + if (_mode != SimulatorFactory.FactoryMode.EngineOnlyMode) { dataColumns.AddRange(new[] { ModalResultField.simulationInterval, diff --git a/VectoCore/Models/Simulation/Data/SummaryFileWriter.cs b/VectoCore/Models/Simulation/Data/SummaryFileWriter.cs index c01860bdd82ff7c18a7c9c8ab4b59308ab108d78..d777f6648539365f8f49d4e1fe45de309710a581 100644 --- a/VectoCore/Models/Simulation/Data/SummaryFileWriter.cs +++ b/VectoCore/Models/Simulation/Data/SummaryFileWriter.cs @@ -14,12 +14,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Data /// <summary> /// Class for the sum file in vecto. /// </summary> - public class SummaryFileWriter + public class SummaryFileWriter : LoggingObject { // ReSharper disable InconsistentNaming private const string JOB = "Job [-]"; private const string INPUTFILE = "Input File [-]"; private const string CYCLE = "Cycle [-]"; + private const string STATUS = "Status"; private const string TIME = "time [s]"; private const string DISTANCE = "distance [km]"; private const string SPEED = "speed [km/h]"; @@ -82,6 +83,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data _table.Columns.Add(JOB, typeof(string)); _table.Columns.Add(INPUTFILE, typeof(string)); _table.Columns.Add(CYCLE, typeof(string)); + _table.Columns.Add(STATUS, typeof(string)); _table.Columns.AddRange(new[] { TIME, DISTANCE, SPEED, ALTITUDE, PPOS, PNEG, FCMAP, FCMAPKM, FCAUXC, FCAUXCKM, FCWHTCC, FCWHTCCKM, PWHEELPOS, PBRAKE, @@ -97,6 +99,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data row[JOB] = jobName; row[INPUTFILE] = jobFileName; row[CYCLE] = cycleFileName; + row[STATUS] = data.RunStatus; row[TIME] = data.GetValues<SI>(ModalResultField.time).Max(); row[PPOS] = data.GetValues<SI>(ModalResultField.Pe_eng).Where(x => x > 0).Average(); row[PNEG] = data.GetValues<SI>(ModalResultField.Pe_eng).Where(x => x < 0).Average(); @@ -149,6 +152,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data row[JOB] = jobName; row[INPUTFILE] = jobFileName; row[CYCLE] = cycleFileName; + row[STATUS] = data.RunStatus; row[TIME] = time; //data.Max(ModalResultField.time).DefaultIfNull(); row[DISTANCE] = distance.ConvertTo().Kilo.Meter; //data.Max(ModalResultField.dist).DefaultIfNull(); row[SPEED] = (distance / time).ConvertTo().Kilo.Meter.Per.Hour; @@ -283,9 +287,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data var dataColumns = new List<string>(); if (_engineOnly) { - dataColumns.AddRange(new[] { JOB, INPUTFILE, CYCLE, TIME, PPOS, PNEG, FCMAP, FCAUXC, FCWHTCC }); + dataColumns.AddRange(new[] { JOB, INPUTFILE, CYCLE, STATUS, TIME, PPOS, PNEG, FCMAP, FCAUXC, FCWHTCC }); } else { - dataColumns.AddRange(new[] { JOB, INPUTFILE, CYCLE, TIME, DISTANCE, SPEED, ALTITUDE }); + dataColumns.AddRange(new[] { JOB, INPUTFILE, CYCLE, STATUS, TIME, DISTANCE, SPEED, ALTITUDE }); dataColumns.AddRange(_auxColumns); @@ -322,6 +326,7 @@ public class SumWriterDecoratorFullPowertrain : SummaryFileWriter, ISummaryDataW public void Write(IModalDataWriter data, Kilogram vehicleMass = null, Kilogram vehicleLoading = null) { + Log.Info("Writing Summary File"); _writer.WriteFullPowertrain(data, _jobFileName, _jobName, _cycleFileName, vehicleMass, vehicleLoading); } } diff --git a/VectoCore/Models/Simulation/IVehicleContainer.cs b/VectoCore/Models/Simulation/IVehicleContainer.cs index ae3d7cf8f9c5d72d80ccf368342df2bd747d4be3..9f12971f3211bafe0e510a57fa4de4e5a6891923 100644 --- a/VectoCore/Models/Simulation/IVehicleContainer.cs +++ b/VectoCore/Models/Simulation/IVehicleContainer.cs @@ -1,5 +1,6 @@ using TUGraz.VectoCore.Models.Connector.Ports; using TUGraz.VectoCore.Models.Simulation.DataBus; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent; using TUGraz.VectoCore.Utils; @@ -28,5 +29,7 @@ namespace TUGraz.VectoCore.Models.Simulation /// Finishes the simulation. /// </summary> void FinishSimulation(); + + VectoRun.Status RunStatus { get; set; } } } \ No newline at end of file diff --git a/VectoCore/Models/Simulation/Impl/JobContainer.cs b/VectoCore/Models/Simulation/Impl/JobContainer.cs index cb123fd98a5a78cc31135374fa528b8f186ddc14..e6e7c135834f5c656e46aa04d5264e5ab001da43 100644 --- a/VectoCore/Models/Simulation/Impl/JobContainer.cs +++ b/VectoCore/Models/Simulation/Impl/JobContainer.cs @@ -82,7 +82,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } //Task.WaitAll(_runs.Select(r => Task.Factory.StartNew(r.Run)).ToArray()); - _sumWriter.Finish(); + //_sumWriter.Finish(); } public void Cancel() diff --git a/VectoCore/Models/Simulation/Impl/VectoRun.cs b/VectoCore/Models/Simulation/Impl/VectoRun.cs index 35330fb38abf528b0a86406a7496670cb2236c12..b570be7764ec04d7bd881b513ec528a305b55ea5 100644 --- a/VectoCore/Models/Simulation/Impl/VectoRun.cs +++ b/VectoCore/Models/Simulation/Impl/VectoRun.cs @@ -29,6 +29,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl protected VectoRun(IVehicleContainer container) { Container = container; + Container.RunStatus = Status.Pending; CyclePort = container.GetCycleOutPort(); } @@ -55,6 +56,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl worker.ReportProgress((int)(CyclePort.Progress * 10000)); if (worker.CancellationPending) { Log.Error("Background Task canceled!"); + Container.RunStatus = Status.Canceled; Container.FinishSimulation(); return; } @@ -63,22 +65,26 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } catch (VectoSimulationException vse) { Log.Error("SIMULATION RUN ABORTED! ========================"); Log.Error(vse); + Container.RunStatus = Status.Aborted; Container.FinishSimulation(); throw new VectoSimulationException("{6} - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}", vse, AbsTime, Container.Distance, dt, Container.VehicleSpeed, Container.Gear, vse.Message, Name); } catch (VectoException ve) { Log.Error("SIMULATION RUN ABORTED! ========================"); Log.Error(ve); + Container.RunStatus = Status.Aborted; Container.FinishSimulation(); throw new VectoSimulationException("{6} - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}", ve, AbsTime, Container.Distance, dt, Container.VehicleSpeed, Container.Gear, ve.Message, Name); } catch (Exception e) { Log.Error("SIMULATION RUN ABORTED! ========================"); Log.Error(e); + Container.RunStatus = Status.Aborted; Container.FinishSimulation(); throw new VectoSimulationException("{6} - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}", e, AbsTime, Container.Distance, dt, Container.VehicleSpeed, Container.Gear, e.Message, Name); } + Container.RunStatus = Status.Success; Container.FinishSimulation(); Log.Info("VectoJob finished."); } @@ -86,5 +92,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl protected abstract IResponse DoSimulationStep(); protected abstract IResponse Initialize(); + + public enum Status + { + Pending, + Running, + Success, + Canceled, + Aborted, + } } } \ No newline at end of file diff --git a/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 59b9a6d8724f9cc4fcfe727b02c0de9d69be5770..9d6e2400875fd9bcfc2617bd20409c4ae0f30ef6 100644 --- a/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -211,11 +211,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public void FinishSimulation() { Log.Info("VehicleContainer finishing simulation."); - DataWriter.Finish(); + DataWriter.Finish(RunStatus); SumWriter.Write(DataWriter, VehicleMass, VehicleLoading); } + public VectoRun.Status RunStatus { get; set; } + #endregion public IReadOnlyCollection<VectoSimulationComponent> SimulationComponents() diff --git a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs index 751d0df538444d9f95af24050889f3f50c47183b..7395499c42ed5e4a587650611255b2218e89b0a3 100644 --- a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs +++ b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs @@ -58,7 +58,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle dataWriter.CommitSimulationStep(); absTime += dt; } - dataWriter.Finish(); + dataWriter.Finish(VectoRun.Status.Success); ResultFileHelper.TestModFile(TestContext.DataRow["ModalResultFile"].ToString(), modFile); } diff --git a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs index aba67766a058edf29b058260e153e229ebe241f4..59fbf39518a7d71b76fd7d6adea6d33b6ed36b1f 100644 --- a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs +++ b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs @@ -85,12 +85,12 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns : Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed; if (cnt++ % 100 == 0) { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } }). Default(r => Assert.Fail("Unexpected Response: {0}", r)); } while (!(response is ResponseCycleFinished)); - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished)); } @@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns try { response = cyclePort.Request(absTime, ds); } catch (Exception) { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); throw; } Log.Info("Test Got Response: {0},", response); @@ -161,12 +161,12 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns : Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed; if (cnt++ % 100 == 0) { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } }). Default(r => Assert.Fail("Unexpected Response: {0}", r)); } - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished)); } @@ -215,7 +215,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns try { response = cyclePort.Request(absTime, ds); } catch (Exception) { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); throw; } Log.Info("Test Got Response: {0},", response); @@ -235,15 +235,15 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns : Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed; if (cnt++ % 100 == 0) { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } }). Default(r => { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); Assert.Fail("Unexpected Response: {0}", r); }); } - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished)); } diff --git a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs index e0099a5c78ab8e78affba1c648af26d2b94c60e1..71ce21f52414488a5f59d926bc674fb0bbf5ac53 100644 --- a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs +++ b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs @@ -143,7 +143,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns : (Constants.SimulationSettings.TargetTimeInterval * vehicleContainer.VehicleSpeed).Cast<Meter>(); if (cnt++ % 100 == 0) { - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } }). Default(r => Assert.Fail("Unexpected Response: {0}", r)); @@ -151,7 +151,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished)); - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } [TestMethod] @@ -208,11 +208,11 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns ? Constants.SimulationSettings.DriveOffDistance : (Constants.SimulationSettings.TargetTimeInterval * vehicleContainer.VehicleSpeed).Cast<Meter>(); - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); }); } - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } private static GearData CreateAxleGearData() diff --git a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs index 7a52652f53aeb457fe0a9006a374972a1dcbf654..c2ee3a17b21063a920bc7b90ee6d86719cbc1f00 100644 --- a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs @@ -201,7 +201,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent string.Format("Load in timestep {0}", t)); modalData.CommitSimulationStep(); } - modalData.Finish(); + modalData.Finish(VectoRun.Status.Success); } [TestMethod] diff --git a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs index b62b473de3f1351cbf1307b90ef0acd3b6d7beaf..003a61f76de5a56125c2cb0c0f6cd8024361a666 100644 --- a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs @@ -82,9 +82,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent vehicleContainer.CommitSimulationStep(absTime, response.SimulationInterval); absTime += response.SimulationInterval; - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } [TestMethod] @@ -141,9 +141,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent vehicleContainer.CommitSimulationStep(absTime, response.SimulationInterval); absTime += response.SimulationInterval; - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } - modalWriter.Finish(); + modalWriter.Finish(VectoRun.Status.Success); } diff --git a/VectoCoreTest/Utils/MockModalDataWriter.cs b/VectoCoreTest/Utils/MockModalDataWriter.cs index 19d073b91c6fdf3a9db3486eabe77674b3ae3761..aae84d3008e33be35b2b33f2311c1c9fa7fb7ea3 100644 --- a/VectoCoreTest/Utils/MockModalDataWriter.cs +++ b/VectoCoreTest/Utils/MockModalDataWriter.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Tests.Utils @@ -35,7 +36,13 @@ namespace TUGraz.VectoCore.Tests.Utils CurrentRow = Data.NewRow(); } - public void Finish() {} + public VectoRun.Status RunStatus + { + get { return VectoRun.Status.Success; } + } + + + public void Finish(VectoRun.Status runStatus) {} public bool WriteModalResults { get; set; }