非標框架(9)-有限狀態機2-狀態機主體類

using System;
using LaserWelder.Machine;
using LaserWelder.Util;


namespace LaserWelder.StateMachine
{
    public class FSM : TaskLoop
    {
        private static FSM instance = new FSM();
        public static FSM Instance => instance;
        /// <summary>
        /// 狀態改變的事件  舊狀態/新狀態
        /// </summary>
        public event Action<StateType, StateType> RunStateChanged;
        /// <summary>
        /// 狀態機當前的狀態
        /// </summary>
        public StateBase CurrState { get; private set; }
        /// <summary>
        /// 狀態機上一個狀態
        /// </summary>
        public StateBase PreState { get; private set; }
        /// <summary>
        /// 焊接工作當前的狀態
        /// </summary>
        public WeldWorkType CurrWelderState { get; set; }
        public bool CanRequestPallet { get; set; }
        public bool IsWorkEnd { get; set; }
        public bool IsAutoRun => LaserWorkPrm.Instance.IsAutoRun;
        public bool IsStop { get; private set; }
        public bool IsPause { get; private set; }

        private FSM()
        {
        }
        /// <summary>
        /// 已經Start後,點擊此按鈕無效
        /// </summary>
        public new void Start()
        {
            if (CurrState == null)
            {
                IsStop = false;
                IsPause = false;
                Delay = 1;
                ChangeState(IdleState.Instance);
                CanRequestPallet = true;
                base.Start();//開啓FSM update函數
            }
        }
        public new void Stop()
        {
            base.Stop();
            ChangeState(null);
            CanRequestPallet = true;
            IsStop = true;
            //InnerAgency.Instance.Stop();
        }
        public void Pause()
        {
            IsPause = true;
        }
        public void Continue()
        {
            IsPause = false;
        }
        internal bool ChangeState(StateBase newState)
        {
            WorkEnd();
            if (newState != null)
            {
                DebugMsg.SendMsg("ChangeState To " + newState.Type.ToString());
            }
            if (CurrState != null)
            {
                if (newState == null)
                {
                    CurrState.Exit(StateType.Null);
                    RunStateChanged?.Invoke(CurrState.Type, StateType.Null);
                }
                else
                {
                    CurrState.Exit(newState.Type);
                    RunStateChanged?.Invoke(CurrState.Type, newState.Type);
                }
                newState?.Enter(CurrState.Type);
            }
            else if (newState != null)
            {
                newState?.Enter(newState.Type);
                RunStateChanged?.Invoke(StateType.Null, newState.Type);
            }
            PreState = CurrState;
            CurrState = newState;
            return true;
        }
        /// <summary>
        /// 一片工作結束
        /// </summary>
        public void WorkEnd()
        {
            if (CurrState != null && CurrState == PalletOutState.Instance)
            {
                CurrState.WorkEnd();
            }
        }
        protected override void Loop()
        {
            CurrState?.Update();
        }
    }
    /// <summary>
    /// 整機狀態
    /// </summary>
    public enum StateType
    {
        Null,
        Idle,
        PalletIn,
        PalletOut,
        PalletUp,
        PalletDown,
        RequestPallet,
        ReleasePallet,
        Work,
        Worked,

        ShotMark,
        Welding,
        Running,
        Pause,

        Warning,
        Alarming,
        Stop
    }
    public static class StateTypeExt
    {
        public static string Msg(this StateType a)
        {
            return a.ToString();
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章