Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 5300e8cb authored by Markus QUARITSCH's avatar Markus QUARITSCH
Browse files

refactoring: pwheelcycle: use drivingcycleenumerator

parent d45b9444
No related branches found
No related tags found
No related merge requests found
......@@ -44,21 +44,24 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// <summary>
/// Driving Cycle for the PWheel driving cycle.
/// </summary>
public class PWheelCycle : PowertrainDrivingCycle, IDriverInfo
public class PWheelCycle : PowertrainDrivingCycle, IDriverInfo, IVehicleInfo
{
private VehicleData _vehicleData;
/// <summary>
/// Initializes a new instance of the <see cref="PWheelCycle"/> class.
/// </summary>
/// <param name="container">The container.</param>
/// <param name="cycle">The cycle.</param>
/// <param name="axleRatio">The axle ratio.</param>
/// <param name="vehicleData"></param>
/// <param name="gearRatios"></param>
public PWheelCycle(IVehicleContainer container, IDrivingCycleData cycle, double axleRatio,
public PWheelCycle(IVehicleContainer container, IDrivingCycleData cycle, double axleRatio, VehicleData vehicleData,
IDictionary<uint, double> gearRatios) : base(container, cycle)
{
// just to ensure that null-gear has ratio 1
gearRatios[0] = 1;
_vehicleData = vehicleData;
foreach (var entry in Data.Entries) {
entry.WheelAngularVelocity = entry.AngularVelocity / (axleRatio * gearRatios[entry.Gear]);
entry.Torque = entry.PWheel / entry.WheelAngularVelocity;
......@@ -76,36 +79,68 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public override IResponse Request(Second absTime, Second dt)
{
if (RightSample.Current == null) {
if (CycleIterator.LastEntry && CycleIterator.RightSample.Time == absTime) {
return new ResponseCycleFinished { Source = this };
}
// interval exceeded
if ((absTime + dt).IsGreater(RightSample.Current.Time)) {
if (CycleIterator.RightSample != null && (absTime + dt).IsGreater(CycleIterator.RightSample.Time)) {
return new ResponseFailTimeInterval {
AbsTime = absTime,
Source = this,
DeltaT = RightSample.Current.Time - absTime
DeltaT = CycleIterator.RightSample.Time - absTime
};
}
return DoHandleRequest(absTime, dt, LeftSample.Current.WheelAngularVelocity);
return DoHandleRequest(absTime, dt, CycleIterator.LeftSample.WheelAngularVelocity);
}
protected override void DoWriteModalResults(IModalDataContainer container)
{
container[ModalResultField.P_wheel_in] = LeftSample.Current.PWheel;
container[ModalResultField.P_wheel_in] = CycleIterator.LeftSample.PWheel;
base.DoWriteModalResults(container);
}
#region IDriverInfo
public MeterPerSecond VehicleSpeed { get; private set; }
/// <summary>
/// True if the angularVelocity at the wheels is 0.
/// </summary>
public bool VehicleStopped
{
get { return false; }
get { return CycleIterator.LeftSample.WheelAngularVelocity.IsEqual(0); }
}
public Kilogram VehicleMass
{
get { return _vehicleData.TotalCurbWeight; }
}
public Kilogram VehicleLoading
{
get { return _vehicleData.Loading; }
}
public Kilogram TotalMass
{
get { return _vehicleData.TotalVehicleWeight; }
}
public Newton AirDragResistance(MeterPerSecond previousVelocity, MeterPerSecond nextVelocity)
{
throw new System.NotImplementedException();
}
public Newton RollingResistance(Radian gradient)
{
throw new System.NotImplementedException();
}
public Newton SlopeResistance(Radian gradient)
{
throw new System.NotImplementedException();
}
/// <summary>
......
......@@ -52,8 +52,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
IDrivingCycleInfo, ISimulationOutPort, ITnInProvider, ITnInPort
{
protected readonly IDrivingCycleData Data;
protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; }
protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; }
protected internal readonly DrivingCycleEnumerator CycleIterator;
protected Second AbsTime { get; set; }
......@@ -65,12 +64,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public PowertrainDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle) : base(container)
{
Data = cycle;
LeftSample = Data.Entries.GetEnumerator();
LeftSample.MoveNext();
RightSample = Data.Entries.GetEnumerator();
RightSample.MoveNext();
RightSample.MoveNext();
CycleIterator = new DrivingCycleEnumerator(Data);
AbsTime = 0.SI<Second>();
}
......@@ -94,20 +88,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public virtual IResponse Request(Second absTime, Second dt)
{
// cycle finished (no more entries in cycle)
if (LeftSample.Current == null) {
if (CycleIterator.LastEntry) {
return new ResponseCycleFinished { Source = this };
}
// interval exceeded
if (RightSample.Current != null && (absTime + dt).IsGreater(RightSample.Current.Time)) {
if (CycleIterator.RightSample != null && (absTime + dt).IsGreater(CycleIterator.RightSample.Time)) {
return new ResponseFailTimeInterval {
AbsTime = absTime,
Source = this,
DeltaT = RightSample.Current.Time - absTime
DeltaT = CycleIterator.RightSample.Time - absTime
};
}
return DoHandleRequest(absTime, dt, LeftSample.Current.AngularVelocity);
return DoHandleRequest(absTime, dt, CycleIterator.LeftSample.AngularVelocity);
}
protected IResponse DoHandleRequest(Second absTime, Second dt, PerSecond angularVelocity)
......@@ -117,16 +111,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
IResponse response;
var responseCount = 0;
do {
response = NextComponent.Request(absTime, dt, LeftSample.Current.Torque, angularVelocity);
response = NextComponent.Request(absTime, dt, CycleIterator.LeftSample.Torque, angularVelocity);
CurrentState.InAngularVelocity = angularVelocity;
CurrentState.InTorque = LeftSample.Current.Torque;
CurrentState.InTorque = CycleIterator.LeftSample.Torque;
debug.Add(response);
response.Switch()
.Case<ResponseGearShift>(
() => response = NextComponent.Request(absTime, dt, LeftSample.Current.Torque, angularVelocity))
() => response = NextComponent.Request(absTime, dt, CycleIterator.LeftSample.Torque, angularVelocity))
.Case<ResponseUnderload>(r => {
var torqueInterval = -r.Delta / (angularVelocity.IsEqual(0) ? 10.RPMtoRad() : angularVelocity);
var torque = SearchAlgorithm.Search(LeftSample.Current.Torque, r.Delta, torqueInterval,
var torque = SearchAlgorithm.Search(CycleIterator.LeftSample.Torque, r.Delta, torqueInterval,
getYValue: result => ((ResponseDryRun)result).DeltaDragLoad,
evaluateFunction: t => NextComponent.Request(absTime, dt, t, angularVelocity, true),
criterion: y => ((ResponseDryRun)y).DeltaDragLoad.Value());
......@@ -136,9 +130,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
.Case<ResponseOverload>(r => {
angularVelocity = SearchAlgorithm.Search(angularVelocity, r.Delta, 50.RPMtoRad(),
getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
evaluateFunction: n => NextComponent.Request(absTime, dt, LeftSample.Current.Torque, n, true),
evaluateFunction: n => NextComponent.Request(absTime, dt, CycleIterator.LeftSample.Torque, n, true),
criterion: y => ((ResponseDryRun)y).DeltaFullLoad.Value());
response = NextComponent.Request(absTime, dt, LeftSample.Current.Torque, angularVelocity);
response = NextComponent.Request(absTime, dt, CycleIterator.LeftSample.Torque, angularVelocity);
CurrentState.InAngularVelocity = angularVelocity;
})
.Case<ResponseFailTimeInterval>(r => { dt = r.DeltaT; })
......@@ -171,10 +165,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected override void DoCommitSimulationStep()
{
if ((RightSample.Current == null) || AbsTime.IsGreaterOrEqual(RightSample.Current.Time)) {
RightSample.MoveNext();
LeftSample.MoveNext();
}
CycleIterator.MoveNext();
}
#endregion
......@@ -184,10 +175,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
get
{
return new CycleData {
AbsTime = LeftSample.Current.Time,
AbsTime = CycleIterator.LeftSample.Time,
AbsDistance = null,
LeftSample = LeftSample.Current,
RightSample = RightSample.Current,
LeftSample = CycleIterator.LeftSample,
RightSample = CycleIterator.RightSample,
};
}
}
......@@ -216,7 +207,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Second time)
{
throw new NotImplementedException();
var retVal = new List<DrivingCycleData.DrivingCycleEntry>();
var iterator = CycleIterator.Clone();
do {
retVal.Add(iterator.RightSample);
} while (iterator.MoveNext() && iterator.RightSample.Time < AbsTime + time);
return retVal;
}
public void FinishSimulation()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment