Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        private void HaltConditionScanning(PfcExecutionContext pfcec)
        {
            TsmData tsmData = GetTsmData(pfcec);

            if (tsmData.NextExpressionEvaluation != 0L)
            {
                m_myTransition.Model.Executive.UnRequestEvent(tsmData.NextExpressionEvaluation);
                tsmData.NextExpressionEvaluation = 0L;
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
                }
            }
        }