@@ -145,6 +145,7 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
145145 public float ParkingBrakeEngageSpeedMpS = 0 ;
146146 public float ParkingBrakePercent = 0 ;
147147 public bool DisableZeroForceStep = false ;
148+ public bool DisableZeroSelectedSpeedStep = false ;
148149 public bool DynamicBrakeIsSelectedForceDependant = false ;
149150 public bool UseThrottleAsSpeedSelector = false ;
150151 public bool UseThrottleAsForceSelector = false ;
@@ -212,10 +213,8 @@ public enum SpeedSelectorMode { Parking, Neutral, On, Start }
212213 public MSTSNotchController MaxForceSelectorController ;
213214 public MSTSNotchController SpeedSelectorController ;
214215
215- public bool SelectedSpeedPressed = false ;
216216 public bool EngineBrakePriority = false ;
217217 public int AccelerationBits = 0 ;
218- public bool Speed0Pressed , SpeedDeltaPressed ;
219218
220219 public CruiseControl ( MSTSLocomotive locomotive )
221220 {
@@ -269,6 +268,7 @@ public CruiseControl(CruiseControl other, MSTSLocomotive locomotive)
269268 ParkingBrakeEngageSpeedMpS = other . ParkingBrakeEngageSpeedMpS ;
270269 ParkingBrakePercent = other . ParkingBrakePercent ;
271270 DisableZeroForceStep = other . DisableZeroForceStep ;
271+ DisableZeroSelectedSpeedStep = other . DisableZeroSelectedSpeedStep ;
272272 DynamicBrakeIsSelectedForceDependant = other . DynamicBrakeIsSelectedForceDependant ;
273273 UseThrottleAsSpeedSelector = other . UseThrottleAsSpeedSelector ;
274274 UseThrottleAsForceSelector = other . UseThrottleAsForceSelector ;
@@ -362,6 +362,7 @@ public void Parse(STFReader stf)
362362 case "powerreductiondelaycargotrain" : PowerReductionDelayCargoTrain = stf . ReadFloatBlock ( STFReader . UNITS . Any , 0.0f ) ; break ;
363363 case "powerreductionvalue" : PowerReductionValue = stf . ReadFloatBlock ( STFReader . UNITS . Any , 100.0f ) ; break ;
364364 case "disablezeroforcestep" : DisableZeroForceStep = stf . ReadBoolBlock ( false ) ; break ;
365+ case "disablezeroselectedspeedstep" : DisableZeroSelectedSpeedStep = stf . ReadBoolBlock ( false ) ; break ;
365366 case "dynamicbrakeisselectedforcedependant" : DynamicBrakeIsSelectedForceDependant = stf . ReadBoolBlock ( false ) ; break ;
366367 case "defaultforcestep" : defaultMaxAccelerationStep = stf . ReadFloatBlock ( STFReader . UNITS . Any , 1.0f ) ; break ;
367368 case "startreducingspeeddelta" : StartReducingSpeedDelta = ( stf . ReadFloatBlock ( STFReader . UNITS . Any , 1.0f ) / 10 ) ; break ;
@@ -525,8 +526,10 @@ public void Initialize()
525526 var notches = new List < MSTSNotch > ( ) ;
526527 if ( SpeedSelectorIsDiscrete )
527528 {
528- float numNotches = ( float ) Math . Round ( Locomotive . MaxSpeedMpS / SpeedRegulatorNominalSpeedStepMpS ) ;
529- for ( int i = 0 ; i <= numNotches ; i ++ )
529+ if ( ! DisableZeroSelectedSpeedStep ) notches . Add ( new MSTSNotch ( 0 , false , 0 ) ) ;
530+ if ( MinimumSpeedForCCEffectMpS > 0 ) notches . Add ( new MSTSNotch ( float . Epsilon , false , 0 ) ) ;
531+ float numNotches = ( float ) Math . Round ( ( Locomotive . MaxSpeedMpS - MinimumSpeedForCCEffectMpS ) / SpeedRegulatorNominalSpeedStepMpS ) ;
532+ for ( int i = 1 ; i <= numNotches ; i ++ )
530533 {
531534 notches . Add ( new MSTSNotch ( i / numNotches , false , 0 ) ) ;
532535 }
@@ -804,6 +807,8 @@ public void UpdateSpeedRegulatorModeChanges()
804807 var prevMode = SpeedRegMode ;
805808 float throttle = Locomotive . ThrottleController . CurrentValue ;
806809 float dynamic = ( Locomotive . DynamicBrakeController ? . CurrentValue ?? 0 ) ;
810+ bool zeroForce = MaxForceSelectorController . CurrentValue == 0 && MaxForceSelectorController . SavedValue == 0 ;
811+ bool zeroSelectedSpeed = SpeedSelectorController . CurrentValue == 0 && SpeedSelectorController . SavedValue == 0 ;
807812 if ( DisableCruiseControlOnThrottleAndZeroSpeed )
808813 {
809814 if ( throttle > 0 && Locomotive . AbsSpeedMpS == 0 )
@@ -813,33 +818,33 @@ public void UpdateSpeedRegulatorModeChanges()
813818 }
814819 if ( DisableCruiseControlOnThrottleAndZeroForce )
815820 {
816- if ( ( throttle > 0 || UseThrottleAsForceSelector ) && SelectedMaxAccelerationPercent == 0 )
821+ if ( ( throttle > 0 || UseThrottleAsForceSelector ) && zeroForce )
817822 {
818823 SpeedRegMode = SpeedRegulatorMode . Manual ;
819824 }
820825 }
821826 if ( DisableCruiseControlOnThrottleAndZeroForceAndZeroSpeed )
822827 {
823- if ( ( throttle > 0 || UseThrottleAsForceSelector ) && SelectedMaxAccelerationPercent == 0 && SelectedSpeedMpS == 0 )
828+ if ( ( throttle > 0 || UseThrottleAsForceSelector ) && zeroForce && zeroSelectedSpeed )
824829 {
825830 SpeedRegMode = SpeedRegulatorMode . Manual ;
826831 }
827832 }
828833 if ( ForceRegulatorAutoWhenNonZeroSpeedSelected )
829834 {
830- if ( SelectedSpeedMpS == 0 && ( ! ASCSpeedTakesPriorityOverSpeedSelector || ! ASCSetSpeedMpS . HasValue ) )
835+ if ( zeroSelectedSpeed && ( ! ASCSpeedTakesPriorityOverSpeedSelector || ! ASCSetSpeedMpS . HasValue ) )
831836 {
832837 SpeedRegMode = SpeedRegulatorMode . Manual ;
833838 }
834- else
839+ else if ( SelectedSpeedMpS > 0 )
835840 {
836841 SpeedRegMode = SpeedRegulatorMode . Auto ;
837842 }
838843 }
839844 if ( ForceRegulatorAutoWhenNonZeroSpeedSelectedAndThrottleAtZero )
840845 {
841846 if ( SelectedSpeedMpS > 0 && throttle == 0 && dynamic == 0 &&
842- SelectedMaxAccelerationPercent == 0 && DisableCruiseControlOnThrottleAndZeroForceAndZeroSpeed )
847+ zeroForce && DisableCruiseControlOnThrottleAndZeroForceAndZeroSpeed )
843848 {
844849 SpeedRegMode = SpeedRegulatorMode . Auto ;
845850 }
@@ -1173,8 +1178,8 @@ public void SpeedSelectorIncreaseStep()
11731178
11741179 if ( SpeedSelectorController . CurrentValue > 0 || MinimumSpeedForCCEffectMpS == 0 )
11751180 {
1176- float speed = ( SpeedSelectorController . CurrentValue * ( Locomotive . MaxSpeedMpS - MinimumSpeedForCCEffectMpS ) + MinimumSpeedForCCEffectMpS ) + SpeedRegulatorNominalSpeedStepMpS ;
1177- SelectedSpeedMpS = Math . Min ( ( float ) Math . Round ( speed / SpeedRegulatorNominalSpeedStepMpS ) * SpeedRegulatorNominalSpeedStepMpS , Locomotive . MaxSpeedMpS ) ;
1181+ float speed = ControllerValueToSelectedSpeedMpS ( SpeedSelectorController . CurrentValue ) + SpeedRegulatorNominalSpeedStepMpS ;
1182+ SelectedSpeedMpS = Math . Min ( speed , Locomotive . MaxSpeedMpS ) ;
11781183 }
11791184 else
11801185 {
@@ -1189,26 +1194,20 @@ public void SpeedSelectorDecreaseStep()
11891194 if ( time >= selectedSpeedLeverHoldTime && time < selectedSpeedLeverHoldTime + SpeedSelectorStepTimeSeconds ) return ;
11901195 selectedSpeedLeverHoldTime = time ;
11911196
1192- float speed = SpeedSelectorController . CurrentValue * ( Locomotive . MaxSpeedMpS - MinimumSpeedForCCEffectMpS ) + MinimumSpeedForCCEffectMpS - SpeedRegulatorNominalSpeedStepMpS ;
1197+ float speed = ControllerValueToSelectedSpeedMpS ( SpeedSelectorController . CurrentValue ) - SpeedRegulatorNominalSpeedStepMpS ;
11931198 if ( speed < MinimumSpeedForCCEffectMpS )
11941199 {
11951200 SelectedSpeedMpS = 0 ;
11961201 }
11971202 else
11981203 {
1199- SelectedSpeedMpS = Math . Max ( ( float ) Math . Round ( speed / SpeedRegulatorNominalSpeedStepMpS ) * SpeedRegulatorNominalSpeedStepMpS , MinimumSpeedForCCEffectMpS ) ;
1204+ SelectedSpeedMpS = speed ;
12001205 }
12011206 ConfirmSelectedSpeed ( ) ;
12021207 }
12031208 public void ConfirmSelectedSpeed ( )
12041209 {
1205- float val = SpeedSelectorController . CurrentValue ;
1206- if ( val > 0 )
1207- {
1208- float min = MinimumSpeedForCCEffectMpS ;
1209- float max = Locomotive . MaxSpeedMpS ;
1210- val = val * ( max - min ) + min ;
1211- }
1210+ float val = ControllerValueToSelectedSpeedMpS ( SpeedSelectorController . CurrentValue ) ;
12121211 if ( SpeedIsMph )
12131212 Simulator . Confirmer . Message ( ConfirmLevel . Information , Simulator . Catalog . GetStringFmt ( "Selected speed changed to {0} mph" , Math . Round ( MpS . FromMpS ( val , false ) , 0 , MidpointRounding . AwayFromZero ) . ToString ( ) ) ) ;
12141213 else
@@ -1501,19 +1500,6 @@ public float GetDataOf(CabViewControl cvc)
15011500 data = AccelerationBits ;
15021501 break ;
15031502 }
1504- case CABViewControlTypes . ORTS_CC_SELECTED_SPEED :
1505- data = SelectedSpeedPressed ? 1 : 0 ;
1506- break ;
1507- case CABViewControlTypes . ORTS_CC_SPEED_0 :
1508- {
1509- data = Speed0Pressed ? 1 : 0 ;
1510- break ;
1511- }
1512- case CABViewControlTypes . ORTS_CC_SPEED_DELTA :
1513- {
1514- data = SpeedDeltaPressed ? 1 : 0 ;
1515- break ;
1516- }
15171503 default :
15181504 data = 0 ;
15191505 break ;
0 commit comments