コード例 #1
0
 internal void NotProcess(SignalNotProcessedArgs args)
 {
     for (var i = 0; i < this.Count; i++)
     {
         this[i].NotProcess(args);
     }
 }
コード例 #2
0
        public override void Emit()
        {
            this.failedConditions.Clear();
            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;

            if (!emitConditionMet)
            {
                foreach (var signalCondition in this.EmitConditionsI)
                {
                    if (signalCondition.Validate(this))
                    {
                        emitConditionMet = true;
                    }
                    else
                    {
                        this.failedConditions.Add(signalCondition);
                    }
                }
            }

            if (!emitConditionMet)
            {
                var args = new SignalNotProcessedArgs(SignalFailure.EmitConditionsNotMet, this.failedConditions.ToArray());
                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 transitionConditionMetCount = this.TransitionConditionsI.Count != 0 ? 0 : 1;

            foreach (var kv in this.TransitionConditionsI)
            {
                if (kv.Key.Validate(this))
                {
                    kv.Value.CanTransitionI = true;
                    transitionConditionMetCount++;
                }
                else
                {
                    kv.Value.CanTransitionI = false;
                    this.failedConditions.Add(kv.Key);
                }
            }

            if (transitionConditionMetCount == 0)
            {
                var args = new SignalNotProcessedArgs(SignalFailure.TransitionConditionsNotMet, this.failedConditions.ToArray());
                this.actions.NotProcess(args);

                return;
            }

            if (transitionConditionMetCount > 1)
            {
                var args = new SignalNotProcessedArgs(SignalFailure.TransitionAmbiguity, this.failedConditions.ToArray());
                this.actions.NotProcess(args);

                return;
            }
            #endregion

            this.MachineI.ProcessSignal(this);
        }
コード例 #3
0
        internal void DoNotProcess()
        {
            var args = new SignalNotProcessedArgs(SignalFailure.NoTransitionToState);

            this.actions.NotProcess(args);
        }
コード例 #4
0
 public override void NotProcess(SignalNotProcessedArgs args)
 {
     this.action(this, args);
 }