diff --git a/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs b/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs index 604c64ba009dfd6312f80a8caf3f0bdae9e7b957..f21d1ac3babbb615da9a140c38a83b281c568a02 100644 --- a/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs +++ b/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs @@ -1,15 +1,76 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using Newtonsoft.Json; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; namespace TUGraz.VectoCore.Models.SimulationComponent.Data { + /// <summary> + /// Represents the CombustionEngineData. Fileformat: .veng + /// </summary> + /// <code> + /// { + /// "Header": { + /// "CreatedBy": " ()", + /// "Date": "3/4/2015 12:26:24 PM", + /// "AppVersion": "2.0.4-beta3", + /// "FileVersion": 2 + /// }, + /// "Body": { + /// "SavedInDeclMode": false, + /// "ModelName": "Generic 24t Coach", + /// "Displacement": 12730.0, + /// "IdlingSpeed": 560.0, + /// "Inertia": 3.8, + /// "FullLoadCurves": [ + /// { + /// "Path": "24t Coach.vfld", + /// "Gears": "0 - 99" + /// } + /// ], + /// "FuelMap": "24t Coach.vmap", + /// "WHTC-Urban": 0.0, + /// "WHTC-Rural": 0.0, + /// "WHTC-Motorway": 0.0 + /// } + /// } + /// </code> public class CombustionEngineData : SimulationComponentData { + private readonly Dictionary<uint, FullLoadCurve> _fullLoadCurves = new Dictionary<uint, FullLoadCurve>(); + + public CombustionEngineData(string fileName) + { + //todo: file exception handling: file not readable, wrong file format + using (StreamReader r = new StreamReader(fileName)) + { + var json = r.ReadToEnd(); + var results = JsonConvert.DeserializeObject<dynamic>(json); + var body = results.Body; + + ModelName = body.ModelName; + Displacement = body.Displacement; + IdleSpeed = body.IdlingSpeed; + Inertia = body.Inertia; + + foreach (dynamic loadCurve in body.FullLoadCurves) + { + string[] gears = loadCurve.Gears.ToString().Split('-'); + var firstGear = uint.Parse(gears.First().Trim()); + var lastGear = uint.Parse(gears.Last().Trim()); + + for (var i = firstGear; i <= lastGear; i++) + { + _fullLoadCurves[i] = new FullLoadCurve(loadCurve.Path.ToString()); + } + } + + ConsumptionMap = new FuelConsumptionMap(body.FuelMap.ToString()); + } + } + /// <summary> /// Engine description (e.g., mode, type, etc. /// </summary> @@ -32,7 +93,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public FullLoadCurve FullLoadCurve(uint gear) { - throw new NotImplementedException("get FullLoadCurve for gear"); + return _fullLoadCurves[gear]; } } } diff --git a/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs b/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs index f74e8ce777e4bf507582a9447ddc5fac7f0e3480..fff72f98fb49021f4077827ea15d7d8d762371d9 100644 --- a/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs +++ b/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs @@ -8,5 +8,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine { public class FuelConsumptionMap { + public FuelConsumptionMap(string fileName) + { + + } } } diff --git a/VectoCore/Models/SimulationComponent/Data/Engine/FullLoadCurve.cs b/VectoCore/Models/SimulationComponent/Data/Engine/FullLoadCurve.cs index 42e96b8bc04e17088b27c0a0deefe56b33789773..69a2aca09a3637a620399c1df4adea845ca6b296 100644 --- a/VectoCore/Models/SimulationComponent/Data/Engine/FullLoadCurve.cs +++ b/VectoCore/Models/SimulationComponent/Data/Engine/FullLoadCurve.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,5 +9,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine { public class FullLoadCurve { + private DataTable data; + + public FullLoadCurve(string fileName) + { + + } + + + } } diff --git a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs index 1683738636a040aca32ee8b4b3efb1e46c86a909..f76e93315846030ad867907ad0dc4f27a0c0b9a6 100644 --- a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs @@ -7,22 +7,22 @@ using TUGraz.VectoCore.Tests.Utils; namespace TUGraz.VectoCore.Tests.Models.SimulationComponent { - [TestClass] - public class CombustionEngineTest - { - [TestMethod] - public void EngineHasOutPort() - { - var engineData = new CombustionEngineData(); - var engine = new CombustionEngine(engineData); - - var port = engine.OutPort(); - Assert.IsNotNull(port); - } - - [TestMethod] - public void OutPortRequestNotFailing() - { + [TestClass] + public class CombustionEngineTest + { + [TestMethod] + public void EngineHasOutPort() + { + var engineData = new CombustionEngineData(); + var engine = new CombustionEngine(engineData); + + var port = engine.OutPort(); + Assert.IsNotNull(port); + } + + [TestMethod] + public void OutPortRequestNotFailing() + { var engineData = new CombustionEngineData(); var engine = new CombustionEngine(engineData); @@ -30,21 +30,58 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent TimeSpan absTime = new TimeSpan(seconds: 0, minutes: 0, hours: 0); TimeSpan dt = new TimeSpan(seconds: 1, minutes: 0, hours: 0); - const int torque = 400; - const int engineSpeed = 1500; + const int torque = 400; + const int engineSpeed = 1500; port.Request(absTime, dt, torque, engineSpeed); - } + } [TestMethod] public void SimpleModalData() { + //todo: choose correct combustion engine data var engineData = new CombustionEngineData(); var engine = new CombustionEngine(engineData); var port = (ITnOutPort)engine.OutPort(); TimeSpan absTime = new TimeSpan(seconds: 0, minutes: 0, hours: 0); - TimeSpan dt = new TimeSpan(seconds:1, minutes:0, hours:0); + TimeSpan dt = new TimeSpan(seconds: 1, minutes: 0, hours: 0); + + //todo: set correct input values to test + const int torque = 400; + const int engineSpeed = 1500; + port.Request(absTime, dt, torque, engineSpeed); + + + TestDataWriter dataWriter = new TestDataWriter(); + engine.CommitSimulationStep(dataWriter); + + //todo: test with correct output values, add other fields to test + Assert.Equals(dataWriter[ModalResultFields.FC], 13000); + Assert.Equals(dataWriter[ModalResultFields.FC_AUXc], 14000); + Assert.Equals(dataWriter[ModalResultFields.FC_WHTCc], 15000); + } + + [TestMethod] + public void EngineOnlyDrivingCycle() + { + //todo: choose correct combustion engine data + var engineData = new CombustionEngineData("24t Coach.veng"); + + + + + + var engine = new CombustionEngine(engineData); + var port = (ITnOutPort)engine.OutPort(); + + //todo: read engine only input file + + + //todo: loop over all cycles + + TimeSpan absTime = new TimeSpan(seconds: 0, minutes: 0, hours: 0); + TimeSpan dt = new TimeSpan(seconds: 1, minutes: 0, hours: 0); const int torque = 400; const int engineSpeed = 1500; port.Request(absTime, dt, torque, engineSpeed); @@ -53,9 +90,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent TestDataWriter dataWriter = new TestDataWriter(); engine.CommitSimulationStep(dataWriter); + //todo: test with correct output values, add other fields to test Assert.Equals(dataWriter[ModalResultFields.FC], 13000); Assert.Equals(dataWriter[ModalResultFields.FC_AUXc], 14000); Assert.Equals(dataWriter[ModalResultFields.FC_WHTCc], 15000); } - } + } }