Пример #1
0
        public bool 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.
            bool emitConditionMet = SignalEmitConditions.Count > 0 ? false : true;
            foreach (ISignalCondition signalCondition in SignalEmitConditions)
            {
                if (signalCondition.IsValid)
                {
                    emitConditionMet = true;
                }
            }
            if (!emitConditionMet)
            {
                SignalNotProcessedEventArgs eventArgs = new SignalNotProcessedEventArgs(SignalFailure.EmitConditionsNotMet, SignalEmitConditions.ToList <ISignalCondition>());
                if (OnSignalNotProcessed != null)
                {
                    OnSignalNotProcessed.Invoke(eventArgs);
                }
                return(false);
            }
            #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.
            int conditionMetCount = SignalTransitionConditions.Count != 0 ? 0 : 1;
            foreach (KeyValuePair <SignalCondition <S, T, G>, Transition <S, T, G> > pair in SignalTransitionConditions)
            {
                if (pair.Key.IsValid)
                {
                    pair.Value.CanTransition = true;
                    conditionMetCount++;
                }
                else
                {
                    pair.Value.CanTransition = false;
                }
            }
            if (conditionMetCount == 0)
            {
                SignalNotProcessedEventArgs eventArgs = new SignalNotProcessedEventArgs(SignalFailure.TransitionConditionsNotMet, SignalTransitionConditions.Keys.ToList <ISignalCondition>());
                if (OnSignalNotProcessed != null)
                {
                    OnSignalNotProcessed.Invoke(eventArgs);
                }
                return(false);
            }
            else if (conditionMetCount > 1)
            {
                SignalNotProcessedEventArgs eventArgs = new SignalNotProcessedEventArgs(SignalFailure.TransitionAmbiguity, SignalTransitionConditions.Keys.ToList <ISignalCondition>());
                if (OnSignalNotProcessed != null)
                {
                    OnSignalNotProcessed.Invoke(eventArgs);
                }
                return(false);
            }
            #endregion

            #region Process Signal
            if (!stateMachine.ProcessSignal(this))
            {
                SignalNotProcessedEventArgs eventArgs = new SignalNotProcessedEventArgs(SignalFailure.NoTransitionToState);
                if (OnSignalNotProcessed != null)
                {
                    OnSignalNotProcessed.Invoke(eventArgs);
                }
                return(false);
            }
            return(true);

            #endregion
        }
Пример #2
0
 internal void AddEmitCondition(SignalCondition <S, T, G> condition)
 {
     SignalEmitConditions.Add(condition);
 }