示例#1
0
 internal void NotProcess(SignalNotProcessedArgs args)
 {
     for (var i = 0; i < this.Count; i++)
     {
         this[i].NotProcess(args);
     }
 }
 protected override void OnNotProcess(SignalNotProcessedArgs args)
 {
 }
示例#3
0
        public override void Emit()
        {
            this.actions.Emit();

            #region Emit Conditions Check
            // check emit conditions, it is enough to pass if one of the conditions is met.
            // This allows to make OR logical comparisons between SignalEmitConditions.
            var emitConditionMet = this.EmitConditionsI.Count > 0 ? false : true;

            foreach (var signalCondition in this.EmitConditionsI)
            {
                if (signalCondition.IsValid)
                {
                    emitConditionMet = true;
                }
            }

            if (!emitConditionMet)
            {
                var failedConditions = this.EmitConditionsI.ToList <ISignalCondition>();
                var args             = new SignalNotProcessedArgs(SignalFailure.EmitConditionsNotMet, failedConditions);
                this.actions.NotProcess(args);

                return;
            }
            #endregion

            #region Transition Conditions Check
            // check transition conditions, there must be only one valid transition.
            // If more than one, stop emitting the signal, otherwise this might cause undefined behaviour.
            var conditionMetCount = this.TransitionConditionsI.Count != 0 ? 0 : 1;

            foreach (var kv in this.TransitionConditionsI)
            {
                if (kv.Key.IsValid)
                {
                    kv.Value.CanTransitionI = true;
                    conditionMetCount++;
                }
                else
                {
                    kv.Value.CanTransitionI = false;
                }
            }

            if (conditionMetCount == 0)
            {
                var failedConditions = this.TransitionConditionsI.Keys.ToList <ISignalCondition>();
                var args             = new SignalNotProcessedArgs(SignalFailure.TransitionConditionsNotMet, failedConditions);
                this.actions.NotProcess(args);

                return;
            }

            if (conditionMetCount > 1)
            {
                var failedConditions = this.TransitionConditionsI.Keys.ToList <ISignalCondition>();
                var args             = new SignalNotProcessedArgs(SignalFailure.TransitionAmbiguity, failedConditions);
                this.actions.NotProcess(args);

                return;
            }
            #endregion

            this.MachineI.ProcessSignal(this);
        }
示例#4
0
        internal void DoNotProcess()
        {
            var args = new SignalNotProcessedArgs(SignalFailure.NoTransitionToState);

            this.actions.NotProcess(args);
        }
 protected override void OnNotProcess(SignalNotProcessedArgs args)
 {
     this.action(this, args);
 }