Пример #1
0
        private FSMState(FSMachine machine, TransitionalTarget state, FSMState parent)
        {
            this.machine = machine ?? throw new ArgumentNullException(nameof(machine));
            this.state   = state ?? throw new ArgumentNullException(nameof(state));
            activeStates = new LinkedList <FSMState>();
            name         = this.state.Name;
            if (parent != null)
            {
                if (state.Name == null)
                {
                    throw new FSMException(Resource1.FSM_StateNameNull);
                }

                this.parent  = parent;
                this.context = new FSMContext(parent.context);
                execContext  = new FSMExecutionContext(machine, state, context);
            }
            else
            {
                this.context = new FSMContext(machine.GlobalContext);
                execContext  = new FSMExecutionContext(machine, state, context);
            }
            if (state is ParallelState)
            {
                stateType = StateType.ParallelState;
            }
            else if (state is TransitionalState)
            {
                stateType = StateType.TransitionalState;
            }
            else if (state is EnterableState)
            {
                stateType = StateType.EnterableState;
            }
            else
            {
                stateType = StateType.TransitionalTarget;
            }

            if (state.Parameters != null)
            {
                state.Parameters.Where((p) =>
                {
                    if (p.DefaultValueExpr != null)
                    {
                        context.AddParameter(p.Type, p.Name, () => execContext.EvalExpression(p.DefaultValueExpr));
                    }
                    else
                    {
                        context.AddParameter(p.Type, p.Name, p.DefaultValue);
                    }
                    return(false);
                }).ToArray();
            }

            var ts = state as TransitionalState;

            if (ts != null)
            {
                if (parent != null)
                {
                    transitions = ts.Transitions;
                }

                if (ts.Children.Count > 0)
                {
                    entry = new FSMState(machine, ts.EntryState ?? new EntryState(), this);
                    exit  = AddChild(ts.ExitState ?? new ExitState());

                    foreach (var child in ts.Children)
                    {
                        AddChild(child);
                    }
                    if (!string.IsNullOrEmpty(ts.Initial))
                    {
                        initial = GetChild(ts.Initial);
                    }
                }
                else
                {
                    if (ts.EntryState != null || ts.ExitState != null)
                    {
                        entry = new FSMState(machine, ts.EntryState ?? new EntryState(), this);

                        exit = AddChild(ts.ExitState ?? new ExitState());
                    }
                }
            }
            else if (state is EntryState)
            {
                transitions = ((EntryState)state).Transitions;
            }
        }
Пример #2
0
 internal FSMState(FSMachine machine, TransitionalTarget state)
     : this(machine, state, null)
 {
 }