public void ReadTransitionalTarget(TransitionalTarget state) { //if (CurrentNode.Name == RootNodeName) state.Name = ReadAttributeValue <string>("name", null); //else // state.Name = ReadAttributeValue<string>("name"); foreach (XmlNode child in FilterChildNodeType(FSMNamespace)) { ReadStartNode(child); switch (child.LocalName) { case "params": foreach (var p in ReadParameters()) { state.AddParamerter(p); context.AddParameter(p.Type, p.Name); } break; case "onEntry": state.AddOnEntry(ReadStateOnEntry()); break; case "onExit": state.AddOnExit(ReadStateOnExit()); break; } ReadEndNode(); } foreach (var action in ReadActions(FilterChildNodeType().Where(o => IsAction(o)))) { state.AddAction(action); } }
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; } }
internal ExitEventArgs(TransitionalTarget exitState, string @event) { this.ExitState = exitState; }
internal FSMState(FSMachine machine, TransitionalTarget state) : this(machine, state, null) { }
internal EntryEventArgs(TransitionalTarget entryState, string @event) { this.EntryState = entryState; }