/// <summary> /// Receives notification that a transition has occurred /// </summary> /// <param name="s0">The source state</param> /// <param name="s1">The target state</param> protected virtual void OnTransition(S s0, S s1) { TransitionCount++; if (Tracing.TraceTransitions()) { Trace(FsmMessages.Transition(Id, s0, s1)); } }
/// <summary> /// Receives notification that a state machine has attained its endstate /// </summary> protected virtual void OnComplete(FsmStats stats, bool asPlanned) { CompletionCount++; if (Tracing.TraceCompletions()) { Trace(FsmMessages.Completed(Id, stats, asPlanned)); CompletionCount = 0; } }
/// <summary> /// Receives notification that an event has ben submitted /// </summary> /// <param name="input">The input event</param> protected virtual void OnReceipt(E input) { ++ReceiptCount; if (ReceiptCounter == ReceiptEmitRate && Tracing.TraceEvents()) { Trace(FsmMessages.Receipt(Id, input, ReceiptCount)); ReceiptCounter = 0; } ReceiptCounter++; }
/// <summary> /// Receives notification that an error has occurred /// </summary> /// <param name="e">The trapped exception</param> protected virtual void OnError(Exception e) { if (Tracing.TraceErrors()) { switch (e) { case AppException ae: Trace(ae.Message); break; default: Trace(FsmMessages.Error(Id, e)); break; } } }
bool CanProcess() { if (Finished) { RaiseWarning(FsmMessages.ReceiptAfterFinish(Id)); return(false); } if (!Started) { RaiseWarning(FsmMessages.ReceiptBeforeStart(Id)); return(false); } if (ReceiptCount > ReceiptLimit) { RaiseError(ReceiptLimitExceeded.Define(Id, ReceiptLimit)); return(false); } return(true); }