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 }
internal void AddEmitCondition(SignalCondition <S, T, G> condition) { SignalEmitConditions.Add(condition); }