From 0f3b7fa748ec40a585c8b9518498a0e295023547 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 25 Feb 2016 17:24:01 +0100
Subject: [PATCH] fix: start cycle somewhere in the middle

---
 .../Impl/DistanceBasedDrivingCycle.cs         | 34 +++++++++----------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs b/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
index 6635a9424a..42be542a1a 100644
--- a/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
+++ b/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
@@ -35,15 +35,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 	/// <summary>
 	///     Class representing one Distance Based Driving Cycle
 	/// </summary>
-	public class DistanceBasedDrivingCycle : VectoSimulationComponent, IDrivingCycle,
+	public class DistanceBasedDrivingCycle : StatefulVectoSimulationComponent<DistanceBasedDrivingCycle.DrivingCycleState>,
+		IDrivingCycle,
 		ISimulationOutPort, IDrivingCycleInPort, IRoadLookAhead
 	{
 		protected const double LookaheadTimeSafetyMargin = 1.5;
 		protected readonly DrivingCycleData Data;
 
-		internal DrivingCycleState PreviousState;
-		internal DrivingCycleState CurrentState = new DrivingCycleState();
-
 		internal readonly DrivingCycleEnumerator CycleIntervalIterator;
 
 		protected IDrivingCycleOutPort NextComponent;
@@ -52,6 +50,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		{
 			Data = cycle;
 			CycleIntervalIterator = new DrivingCycleEnumerator(Data);
+			CycleStartDistance = Data.Entries.Count > 0 ? Data.Entries.First().Distance : 0.SI<Meter>();
+
+			var first = Data.Entries.First();
+			PreviousState = new DrivingCycleState {
+				AbsTime = 0.SI<Second>(),
+				WaitTime = 0.SI<Second>(),
+				Distance = first.Distance,
+				Altitude = first.Altitude,
+			};
+			CurrentState = PreviousState.Clone();
 		}
 
 		#region IDrivingCycleInProvider
@@ -219,15 +227,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		IResponse ISimulationOutPort.Initialize()
 		{
-			var first = Data.Entries.First();
-			PreviousState = new DrivingCycleState {
-				AbsTime = 0.SI<Second>(),
-				WaitTime = 0.SI<Second>(),
-				Distance = first.Distance,
-				Altitude = first.Altitude,
-			};
-			CurrentState = PreviousState.Clone();
-
 			if (CycleIntervalIterator.LeftSample.VehicleTargetSpeed.IsEqual(0)) {
 				var retVal = NextComponent.Initialize(DataBus.StartSpeed,
 					CycleIntervalIterator.LeftSample.RoadGradient, DataBus.StartAcceleration);
@@ -251,10 +250,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 		}
 
-		public Meter CycleStartDistance
-		{
-			get { return Data.Entries.Count > 0 ? Data.Entries.First().Distance : 0.SI<Meter>(); }
-		}
+		public Meter CycleStartDistance { get; internal set; }
 
 		#endregion
 
@@ -344,7 +340,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		internal void SetDriveOffDistance(Meter startDistance)
 		{
 			while (CycleIntervalIterator.MoveNext() && CycleIntervalIterator.RightSample.Distance < startDistance) {}
-			CycleIntervalIterator.MoveNext();
+			//CycleIntervalIterator.MoveNext();
+			PreviousState.Distance = startDistance;
+			CycleStartDistance = startDistance;
 		}
 
 		public class DrivingCycleEnumerator : IEnumerator<DrivingCycleData.DrivingCycleEntry>
-- 
GitLab