private void EvaluateCondition(IExecutive exec, object userData) { PfcExecutionContext pfcec = (PfcExecutionContext)userData; TsmData tsmData = GetTsmData(pfcec); tsmData.NextExpressionEvaluation = 0L; if (tsmData.State == TransitionState.Active && ExecutableCondition(pfcec, this)) { PredecessorStateMachines.ForEach(delegate(StepStateMachine ssm) { if (ssm.GetState(pfcec) != StepState.Complete) { ssm.Stop(pfcec); } ssm.Reset(pfcec); }); // When the last predecessor goes to Idle, I will go to Inactive. Debug.Assert(AllPredsAreIdle(pfcec)); Debug.Assert(tsmData.State == TransitionState.Inactive); if (s_diagnostics) { Console.WriteLine("Done condition-scanning on transition " + m_myTransition.Name + " in EC " + pfcec.Name + "."); } SuccessorStateMachines.ForEach(delegate(StepStateMachine ssm) { RunSuccessor(ssm, pfcec); }); } else { // Either I'm NotBeingEvaluated, or the evaluation came out false. // NOTE: Must halt event stream when "NotBeingEvaluated". tsmData.NextExpressionEvaluation = exec.RequestEvent(new ExecEventReceiver(EvaluateCondition), exec.Now + m_scanningPeriod, 0.0, pfcec, ExecEventType.Synchronous); } }
private void HaltConditionScanning(PfcExecutionContext pfcec) { TsmData tsmData = GetTsmData(pfcec); if (tsmData.NextExpressionEvaluation != 0L) { m_myTransition.Model.Executive.UnRequestEvent(tsmData.NextExpressionEvaluation); tsmData.NextExpressionEvaluation = 0L; } }
private void StartConditionScanning(PfcExecutionContext pfcec) { if (s_diagnostics) { Console.WriteLine("Starting condition-scanning on transition " + m_myTransition.Name + " in EC " + pfcec.Name + "."); } HaltConditionScanning(pfcec); IExecutive exec = m_myTransition.Model.Executive; TsmData tsmData = GetTsmData(pfcec); tsmData.NextExpressionEvaluation = exec.RequestEvent(new ExecEventReceiver(EvaluateCondition), exec.Now + m_scanningPeriod, 0.0, pfcec, ExecEventType.Synchronous); }
private void SetState(TransitionState transitionState, PfcExecutionContext parentPfcec) { if (SuccessorStateMachines.Count == 0 && transitionState == TransitionState.Inactive) { ((ProcedureFunctionChart)m_myTransition.Parent).FirePfcCompleting(parentPfcec); } Debug.Assert(!parentPfcec.IsStepCentric); // State is stored in the parent of the trans, a PFC. TsmData tsmData = GetTsmData(parentPfcec); if (tsmData.State != transitionState) { tsmData.State = transitionState; if (TransitionStateChanged != null) { TransitionStateChanged(this, parentPfcec); } } }