@@ -109,14 +109,22 @@ public void Initialize()
109109 {
110110 if ( ScriptName != null )
111111 {
112- switch ( ScriptName )
112+ switch ( ScriptName . ToLowerInvariant ( ) )
113113 {
114- case "Automatic " :
115- Script = new AutomaticCircuitBreaker ( ) as CircuitBreaker ;
114+ case "automatic " :
115+ Script = new AutomaticCircuitBreaker ( ) ;
116116 break ;
117117
118- case "Manual" :
119- Script = new ManualCircuitBreaker ( ) as CircuitBreaker ;
118+ case "manual" :
119+ Script = new ManualCircuitBreaker ( ) ;
120+ break ;
121+
122+ case "pushbuttons" :
123+ Script = new PushButtonsCircuitBreaker ( ) ;
124+ break ;
125+
126+ case "twostage" :
127+ Script = new TwoStageCircuitBreaker ( ) ;
120128 break ;
121129
122130 default :
@@ -128,7 +136,7 @@ public void Initialize()
128136 // Fallback to automatic circuit breaker if the above failed.
129137 if ( Script == null )
130138 {
131- Script = new AutomaticCircuitBreaker ( ) as CircuitBreaker ;
139+ Script = new AutomaticCircuitBreaker ( ) ;
132140 }
133141
134142 Script . AttachToHost ( this ) ;
@@ -371,6 +379,7 @@ public override void HandleEvent(PowerSupplyEvent evt)
371379 {
372380 switch ( evt )
373381 {
382+ case PowerSupplyEvent . QuickPowerOn :
374383 case PowerSupplyEvent . CloseCircuitBreaker :
375384 SetDriverClosingOrder ( true ) ;
376385 SetDriverOpeningOrder ( false ) ;
@@ -383,6 +392,7 @@ public override void HandleEvent(PowerSupplyEvent evt)
383392 }
384393 break ;
385394
395+ case PowerSupplyEvent . QuickPowerOff :
386396 case PowerSupplyEvent . OpenCircuitBreaker :
387397 SetDriverClosingOrder ( false ) ;
388398 SetDriverOpeningOrder ( true ) ;
@@ -393,4 +403,245 @@ public override void HandleEvent(PowerSupplyEvent evt)
393403 }
394404 }
395405 }
406+
407+ public class PushButtonsCircuitBreaker : CircuitBreaker
408+ {
409+ private Timer ClosingTimer ;
410+ private CircuitBreakerState PreviousState ;
411+ private bool QuickPowerOn ;
412+
413+ public override void Initialize ( )
414+ {
415+ ClosingTimer = new Timer ( this ) ;
416+ ClosingTimer . Setup ( ClosingDelayS ( ) ) ;
417+
418+ SetDriverClosingAuthorization ( true ) ;
419+ }
420+
421+ public override void Update ( float elapsedSeconds )
422+ {
423+ SetClosingAuthorization ( TCSClosingAuthorization ( ) && CurrentPantographState ( ) == PantographState . Up ) ;
424+
425+ switch ( CurrentState ( ) )
426+ {
427+ case CircuitBreakerState . Closed :
428+ if ( ! ClosingAuthorization ( ) || DriverOpeningOrder ( ) || TCSOpeningOrder ( ) )
429+ {
430+ SetCurrentState ( CircuitBreakerState . Open ) ;
431+ }
432+ break ;
433+
434+ case CircuitBreakerState . Closing :
435+ if ( ClosingAuthorization ( ) && ( DriverClosingOrder ( ) || TCSClosingOrder ( ) || QuickPowerOn ) )
436+ {
437+ if ( ! ClosingTimer . Started )
438+ {
439+ ClosingTimer . Start ( ) ;
440+ }
441+
442+ if ( ClosingTimer . Triggered )
443+ {
444+ QuickPowerOn = false ;
445+ ClosingTimer . Stop ( ) ;
446+ SetCurrentState ( CircuitBreakerState . Closed ) ;
447+ }
448+ }
449+ else
450+ {
451+ QuickPowerOn = false ;
452+ ClosingTimer . Stop ( ) ;
453+ SetCurrentState ( CircuitBreakerState . Open ) ;
454+ }
455+ break ;
456+
457+ case CircuitBreakerState . Open :
458+ if ( ClosingAuthorization ( ) && ( DriverClosingOrder ( ) || TCSClosingOrder ( ) || QuickPowerOn ) )
459+ {
460+ SetCurrentState ( CircuitBreakerState . Closing ) ;
461+ }
462+ break ;
463+ }
464+
465+ if ( PreviousState != CurrentState ( ) )
466+ {
467+ switch ( CurrentState ( ) )
468+ {
469+ case CircuitBreakerState . Open :
470+ SignalEvent ( Event . CircuitBreakerOpen ) ;
471+ break ;
472+
473+ case CircuitBreakerState . Closing :
474+ SignalEvent ( Event . CircuitBreakerClosing ) ;
475+ break ;
476+
477+ case CircuitBreakerState . Closed :
478+ SignalEvent ( Event . CircuitBreakerClosed ) ;
479+ break ;
480+ }
481+ }
482+
483+ PreviousState = CurrentState ( ) ;
484+ }
485+
486+ public override void HandleEvent ( PowerSupplyEvent evt )
487+ {
488+ switch ( evt )
489+ {
490+ case PowerSupplyEvent . CloseCircuitBreakerButtonPressed :
491+ SetDriverOpeningOrder ( false ) ;
492+ SetDriverClosingOrder ( true ) ;
493+ SignalEvent ( Event . CircuitBreakerClosingOrderOn ) ;
494+ Confirm ( CabControl . CircuitBreakerClosingOrder , CabSetting . On ) ;
495+ if ( ! ClosingAuthorization ( ) )
496+ {
497+ Message ( ConfirmLevel . Warning , Simulator . Catalog . GetString ( "Circuit breaker closing not authorized" ) ) ;
498+ }
499+ break ;
500+ case PowerSupplyEvent . CloseCircuitBreakerButtonReleased :
501+ SetDriverClosingOrder ( false ) ;
502+ break ;
503+ case PowerSupplyEvent . OpenCircuitBreakerButtonPressed :
504+ SetDriverClosingOrder ( false ) ;
505+ SetDriverOpeningOrder ( true ) ;
506+ SignalEvent ( Event . CircuitBreakerClosingOrderOff ) ;
507+ Confirm ( CabControl . CircuitBreakerClosingOrder , CabSetting . Off ) ;
508+ break ;
509+ case PowerSupplyEvent . OpenCircuitBreakerButtonReleased :
510+ SetDriverOpeningOrder ( false ) ;
511+ break ;
512+ case PowerSupplyEvent . QuickPowerOn :
513+ QuickPowerOn = true ;
514+ break ;
515+ case PowerSupplyEvent . QuickPowerOff :
516+ QuickPowerOn = false ;
517+ SetCurrentState ( CircuitBreakerState . Open ) ;
518+ break ;
519+ }
520+ }
521+ }
522+
523+ public class TwoStageCircuitBreaker : CircuitBreaker
524+ {
525+ private Timer ClosingTimer ;
526+ private CircuitBreakerState PreviousState ;
527+
528+ private Timer InitTimer ;
529+ private bool QuickPowerOn ;
530+
531+ public override void Initialize ( )
532+ {
533+ ClosingTimer = new Timer ( this ) ;
534+ ClosingTimer . Setup ( ClosingDelayS ( ) ) ;
535+ }
536+
537+ public override void Update ( float elapsedSeconds )
538+ {
539+
540+ SetClosingAuthorization ( TCSClosingAuthorization ( ) && DriverClosingAuthorization ( ) && CurrentPantographState ( ) == PantographState . Up ) ;
541+
542+ switch ( CurrentState ( ) )
543+ {
544+ case CircuitBreakerState . Closed :
545+ if ( ! ClosingAuthorization ( ) || TCSOpeningOrder ( ) )
546+ {
547+ SetCurrentState ( CircuitBreakerState . Open ) ;
548+ }
549+ break ;
550+
551+ case CircuitBreakerState . Closing :
552+ if ( ClosingAuthorization ( ) && ( DriverClosingOrder ( ) || TCSClosingOrder ( ) || QuickPowerOn ) )
553+ {
554+ if ( ! ClosingTimer . Started )
555+ {
556+ ClosingTimer . Start ( ) ;
557+ }
558+
559+ if ( ClosingTimer . Triggered )
560+ {
561+ QuickPowerOn = false ;
562+ ClosingTimer . Stop ( ) ;
563+ SetCurrentState ( CircuitBreakerState . Closed ) ;
564+ }
565+ }
566+ else
567+ {
568+ QuickPowerOn = false ;
569+ ClosingTimer . Stop ( ) ;
570+ SetCurrentState ( CircuitBreakerState . Open ) ;
571+ }
572+ break ;
573+
574+ case CircuitBreakerState . Open :
575+ if ( ClosingAuthorization ( ) && ( DriverClosingOrder ( ) || TCSClosingOrder ( ) || QuickPowerOn ) )
576+ {
577+ SetCurrentState ( CircuitBreakerState . Closing ) ;
578+ }
579+ break ;
580+ }
581+
582+ if ( PreviousState != CurrentState ( ) )
583+ {
584+ switch ( CurrentState ( ) )
585+ {
586+ case CircuitBreakerState . Open :
587+ SignalEvent ( Event . CircuitBreakerOpen ) ;
588+ break ;
589+
590+ case CircuitBreakerState . Closing :
591+ SignalEvent ( Event . CircuitBreakerClosing ) ;
592+ break ;
593+
594+ case CircuitBreakerState . Closed :
595+ SignalEvent ( Event . CircuitBreakerClosed ) ;
596+ break ;
597+ }
598+ }
599+
600+ PreviousState = CurrentState ( ) ;
601+ }
602+
603+ public override void HandleEvent ( PowerSupplyEvent evt )
604+ {
605+ switch ( evt )
606+ {
607+ case PowerSupplyEvent . CloseCircuitBreakerButtonPressed :
608+ SetDriverClosingOrder ( true ) ;
609+ SignalEvent ( Event . CircuitBreakerClosingOrderOn ) ;
610+ Confirm ( CabControl . CircuitBreakerClosingOrder , CabSetting . On ) ;
611+ if ( ! ClosingAuthorization ( ) )
612+ {
613+ Message ( ConfirmLevel . Warning , Simulator . Catalog . GetString ( "Circuit breaker closing not authorized" ) ) ;
614+ }
615+ break ;
616+
617+ case PowerSupplyEvent . CloseCircuitBreakerButtonReleased :
618+ SetDriverClosingOrder ( false ) ;
619+ SignalEvent ( Event . CircuitBreakerClosingOrderOff ) ;
620+ break ;
621+
622+ case PowerSupplyEvent . GiveCircuitBreakerClosingAuthorization :
623+ SetDriverClosingAuthorization ( true ) ;
624+ SignalEvent ( Event . CircuitBreakerClosingAuthorizationOn ) ;
625+ Confirm ( CabControl . CircuitBreakerClosingAuthorization , CabSetting . On ) ;
626+ break ;
627+
628+ case PowerSupplyEvent . RemoveCircuitBreakerClosingAuthorization :
629+ SetDriverClosingAuthorization ( false ) ;
630+ SignalEvent ( Event . CircuitBreakerClosingAuthorizationOff ) ;
631+ Confirm ( CabControl . CircuitBreakerClosingAuthorization , CabSetting . Off ) ;
632+ break ;
633+
634+ case PowerSupplyEvent . QuickPowerOn :
635+ QuickPowerOn = true ;
636+ SetDriverClosingAuthorization ( true ) ;
637+ break ;
638+
639+ case PowerSupplyEvent . QuickPowerOff :
640+ QuickPowerOn = false ;
641+ SetDriverClosingAuthorization ( false ) ;
642+ SetCurrentState ( CircuitBreakerState . Open ) ;
643+ break ;
644+ }
645+ }
646+ }
396647}
0 commit comments