Exemplo n.º 1
0
        private static void BuildStateTwo(DemoModel model, MachineEditor <DemoState> builder)
        {
            var two = builder.EditState(DemoState.Two);

            // Transition from TWO to FOUR
            var twoToFour = two.TransitionTo(DemoState.Four)
                            .TriggerWithCollection(model.Observables, 5)
                            .TriggerWithEvent <DemoModel, DemoEventArgs>(model, nameof(model.TriggerEvent));
        }
        private static void BuildBusyState(ChildModel model, MachineEditor <ChildState> builder)
        {
            var busy = builder.EditState(ChildState.Busy);

            // Transition from BUSY to READY
            var busyToReady = busy.TransitionTo(ChildState.Ready)
                              .TriggerWithEvent <Timer, ElapsedEventHandler, ElapsedEventArgs>(model.RandomTimer, nameof(model.RandomTimer.Elapsed))
                              .HaveEffect("Run Timer", (di) => model.RunTimer());
        }
        public static MachineEditor <ChildState> BuildStateMachine(this ChildModel model, StateMachine <ChildState> machine)
        {
            var builder = MachineEditor <ChildState> .Edit(machine);

            machine.SetInitialState(ChildState.Ready);
            BuildReadyState(model, builder);
            BuildBusyState(model, builder);

            return(builder);
        }
Exemplo n.º 4
0
        private static void BuildStateThree(DemoModel model, MachineEditor <DemoState> builder)
        {
            var three = builder.EditState(DemoState.Three);

            // Transition from THREE to ONE
            var threeToOne = three.TransitionTo(DemoState.One)
                             .GuardWith(() => model.Children.All(c => c.StateMachine.CurrentState == ChildState.Ready), "All Children Ready")
                             .TriggerWithStateChange(model.Children.Select(c => c.StateMachine).ToList(), builder.Machine, ChildState.Ready)
                             .TriggerWithEvent <DemoModel, DemoEventArgs>(model, nameof(model.TriggerEvent));
        }
Exemplo n.º 5
0
        public static MachineEditor <DemoState> BuildStateMachine(this DemoModel model, StateMachine <DemoState> machine)
        {
            var builder = MachineEditor <DemoState> .Edit(machine);

            machine.SetInitialState(DemoState.One);
            BuildStateOne(model, builder);
            BuildStateTwo(model, builder);
            BuildStateThree(model, builder);
            BuildStateFour(model, builder);

            return(builder);
        }
Exemplo n.º 6
0
        private static void BuildStateFour(DemoModel model, MachineEditor <DemoState> builder)
        {
            var four = builder.EditState(DemoState.Four);

            // Transition from FOUR to FOUR
            var fourToFour = four.TransitionTo(DemoState.Four)
                             .GuardWith(() => model.LoopCount > 0, "Loop Count>0")
                             .TriggerWithProperty(model, nameof(model.LoopCount))
                             .TriggerWithEvent <DemoModel, DemoEventArgs>(model, nameof(model.TriggerEvent));

            // Transition from FOUR to THREE
            var fourToThree = four.TransitionTo(DemoState.Three)
                              .GuardWith(() => model.BoolFunc.Invoke() && model.LoopCount == 0, "Expression Is True")
                              .TriggerWithProperty(model, nameof(model.BoolFunc))
                              .TriggerWithEvent <DemoModel, DemoEventArgs>(model, nameof(model.TriggerEvent));
        }
Exemplo n.º 7
0
        public static void AddDoBehavior <TState>(this MachineEditor <TState> editor, TState state, Action <IUnityContainer> behavior) where TState : struct
        {
            if (!editor.Machine.Editable)
            {
                throw new InvalidOperationException($"StateMachine {editor.Machine.Name} must be in editable in order to modify a state.");
            }

            var behavioralState = editor.Machine[state] as BehavioralState;

            if (behavioralState == null)
            {
                throw new InvalidOperationException($"A Do behavior can only be added to a BehavioralState.");
            }

            behavioralState.AddDoBehavior(behavior);
        }
Exemplo n.º 8
0
        private static void BuildStateOne(DemoModel model, MachineEditor <DemoState> builder)
        {
            var one = builder.EditState(DemoState.One);

            // Transition from ONE to TWO
            one.TransitionTo(DemoState.Two)
            .GuardWith(() => model.OnOff, "On")
            .TriggerWithProperty(model, nameof(model.OnOff))
            .TriggerWithEvent <DemoModel, DemoEventArgs>(model, nameof(model.TriggerEvent));

            // Transition from ONE to THREE
            one.TransitionTo(DemoState.Three)
            .GuardWith(() => model.Number == 1 && !model.OnOff, "Number==1 && Off")
            .TriggerWithProperty(model, nameof(model.OnOff))
            .TriggerWithProperty(model, nameof(model.Number))
            .TriggerWithEvent <DemoModel, DemoEventArgs>(model, nameof(model.TriggerEvent));
        }