using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FiniteStateMachine.Core { public class SensorStateChangedEventArgs : EventArgs { public StateContext.SensorState NewState { get; } public SensorStateChangedEventArgs(StateContext.SensorState newState) { NewState = newState; } } public class StateContext { public enum SensorState { NotDefine = -1, IN, START, OUT, WORKING } public event EventHandler SensorStateChanged; private IState Actual; private int CurrentCounter; public SensorState CurrentSensorState { set; get; } private State1 S1;// = new State1(this); private State2 S2;// = new State2(this); private State3 S3;// = new State3(this); public StateContext(int counter) { S1 = new State1(this); S2 = new State2(this); S3 = new State3(this); Actual = S1; CurrentSensorState = SensorState.NotDefine; CurrentCounter = counter; } public void Working() { switch (CurrentSensorState) { default: break; case SensorState.IN: if (Actual == S1) { ++CurrentCounter; Actual.Do(); ChangeState(); SensorStateChanged?.Invoke(this, new SensorStateChangedEventArgs(CurrentSensorState)); } break; } //switch (CurrentSensorState) //{ // default: // break; // case SensorState.IN: // if (Actual == S1) // { // ++CurrentCounter; // Actual.Do(); // ChangeState(); // } // break; // case SensorState.START: // if (Actual == S2) // { // ++CurrentCounter; // Actual.Do(); // ChangeState(); // } // break; // case SensorState.OUT: // if (Actual == S3) // { // ++CurrentCounter; // Actual.Do(); // ChangeState(); // } // break; //} } public void ChangeState() { Actual.Exit(); if (Actual is State1) { Actual = S2; } else if (Actual is State2) //&& CurrentCounter > 20) { Actual = S3; } else if (Actual is State3) { Actual = S1; } else { } Actual.Entry(); } } }