diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index d910b309c9b0057a2a7da08d03d0868fa7664d1a..e63fd342a2bc9a75c3686ff765944bb274ac233d 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs @@ -823,6 +823,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl }; break; case ResponseUnderload r: + if (DataBus.HybridControllerInfo != null) { + DrivingAction = DrivingAction.Brake; + } if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient, operatingPoint.Acceleration, response); @@ -1194,71 +1197,79 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return r != null && !actionRoll && !allowDistanceDecrease && !ds.IsEqual(r.Driver.OperatingPoint.SimulationDistance); }); return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance); - } catch (VectoSearchAbortedException) { - // search aborted, try to go ahead with the last acceleration - if (!searchEngineSpeed && !actionRoll && !coastingOrRoll) { - var nanCount1 = 0; - retVal.Acceleration = SearchAlgorithm.Search(acceleration, delta, - Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating, - getYValue: response => { - var r = (ResponseDryRun)response; - - return (r.DeltaFullLoad); - }, - evaluateFunction: - acc => { - // calculate new time interval only when vehiclespeed and acceleration are != 0 - // else: use same timeinterval as before. - var vehicleDrivesAndAccelerates = - !(acc.IsEqual(0) && DataBus.VehicleInfo.VehicleSpeed.IsEqual(0)); - if (vehicleDrivesAndAccelerates) { - var tmp = ComputeTimeInterval(acc, ds); - if (tmp.SimulationInterval.IsEqual(0.SI<Second>(), 1e-9.SI<Second>())) { - throw new VectoSearchAbortedException( - "next TimeInterval is 0. a: {0}, v: {1}, dt: {2}", acc, - DataBus.VehicleInfo.VehicleSpeed, tmp.SimulationInterval); - } - - retVal.Acceleration = tmp.Acceleration; - retVal.SimulationInterval = tmp.SimulationInterval; - retVal.SimulationDistance = tmp.SimulationDistance; - - - } else { - retVal.Acceleration = acc; - retVal.SimulationDistance = 0.SI<Meter>(); - } - - IterationStatistics.Increment(this, "SearchOperatingPoint"); - DriverAcceleration = acc; - var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, - true); - response.Driver.OperatingPoint = retVal; - return response; - - }, - criterion: response => { - var r = (ResponseDryRun)response; - - delta = (r.DeltaFullLoad); - return Math.Max(delta.Value(), 0); - }, - abortCriterion: - (response, cnt) => { - var r = (ResponseDryRun)response; - if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && - r.DeltaDragLoad.Value().IsSmallerOrEqual(-double.MaxValue / 20)) { - nanCount1++; - } - - if (nanCount1 > 10) { - return true; - } + } catch (VectoException ve) { + switch (ve) { + case VectoSearchFailedException _: + case VectoSearchAbortedException _: + + // search aborted, try to go ahead with the last acceleration + if (!searchEngineSpeed && !actionRoll && !coastingOrRoll) { + var nanCount1 = 0; + retVal.Acceleration = SearchAlgorithm.Search(acceleration, delta, + Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating, + getYValue: response => { + var r = (ResponseDryRun)response; + + return (r.DeltaFullLoad); + }, + evaluateFunction: + acc => { + // calculate new time interval only when vehiclespeed and acceleration are != 0 + // else: use same timeinterval as before. + var vehicleDrivesAndAccelerates = + !(acc.IsEqual(0) && DataBus.VehicleInfo.VehicleSpeed.IsEqual(0)); + if (vehicleDrivesAndAccelerates) { + var tmp = ComputeTimeInterval(acc, ds); + if (tmp.SimulationInterval.IsEqual(0.SI<Second>(), 1e-9.SI<Second>())) { + throw new VectoSearchAbortedException( + "next TimeInterval is 0. a: {0}, v: {1}, dt: {2}", acc, + DataBus.VehicleInfo.VehicleSpeed, tmp.SimulationInterval); + } + + retVal.Acceleration = tmp.Acceleration; + retVal.SimulationInterval = tmp.SimulationInterval; + retVal.SimulationDistance = tmp.SimulationDistance; + + + } else { + retVal.Acceleration = acc; + retVal.SimulationDistance = 0.SI<Meter>(); + } + + IterationStatistics.Increment(this, "SearchOperatingPoint"); + DriverAcceleration = acc; + var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, + true); + response.Driver.OperatingPoint = retVal; + return response; + + }, + criterion: response => { + var r = (ResponseDryRun)response; + + delta = (r.DeltaFullLoad); + return Math.Max(delta.Value(), 0); + }, + abortCriterion: + (response, cnt) => { + var r = (ResponseDryRun)response; + if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && + r.DeltaDragLoad.Value().IsSmallerOrEqual(-double.MaxValue / 20)) { + nanCount1++; + } + + if (nanCount1 > 10) { + return true; + } + + return r != null && !allowDistanceDecrease && + !ds.IsEqual(r.Driver.OperatingPoint.SimulationDistance); + }, + forceLineSearch: true); + return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance); + } + break; - return r != null && !allowDistanceDecrease && - !ds.IsEqual(r.Driver.OperatingPoint.SimulationDistance); - }); - return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance); } } catch (Exception) { Log.Error("Failed to find operating point! absTime: {0}", absTime);