using Aitex.Sorter.Common;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.Schedulers;
using OpenSEMI.ClientBase;
using OpenSEMI.Ctrlib.Controls;
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;
using Venus_Core;
using Venus_MainPages.Unity;
using Venus_Themes.CustomControls;
using static Venus_Themes.CustomControls.DERobot;

namespace Venus_MainPages.ViewModels
{
    public class VenusDETMViewModel : BindableBase
    {
        public enum DeTMModule
        {
            PMA, PMB, PMC, PMD, LP1, LP2, Aligner1
        }
        public enum DeTMBlade
        {
            Blade1, Blade2
        }
        #region 私有字段

        private ModuleInfo m_AlignerModuleInfo;
        private ModuleInfo m_TMModuleInfo;

        //Wafer
        private WaferInfo m_PMAWafer;
        private WaferInfo m_PMBWafer;
        private WaferInfo m_PMCWafer;
        private WaferInfo m_PMDWafer;

        public WaferInfo m_RobotUpperWafer;
        public WaferInfo m_RobotLowerWafer;
        public WaferInfo m_PAWafer;

        //Door
        private bool m_PMADoorIsOpen;
        private bool m_PMBDoorIsOpen;
        private bool m_PMCDoorIsOpen;
        private bool m_PMDDoorIsOpen;

        private bool m_VCEADoorIsOpen;
        private bool m_VCEBDoorIsOpen;
        private bool m_VCEAOutDoorIsOpen;
        private bool m_VCEBOutDoorIsOpen;
        private bool m_IsAlignerOnRight;
        //Pick、Place、Extend、Retract行下拉框内容
        private DeTMModule m_PickSelectedModule;
        private DeTMModule m_PlaceSelectedModule;
        private DeTMModule m_ExtendSelectedModule;
        private DeTMModule m_RetractSelectedModule;
        private DeTMModule m_GotoSelectedModule;
        private DeTMBlade m_PickSelectedBlade;
        private DeTMBlade m_PlaceSelectedBlade;
        private DeTMBlade m_ExtendSelectedBlade;
        private DeTMBlade m_RetractSelectedBlade;
        private DeTMBlade m_GoToSelectedBlade;


        //Pick、Place、Extend、Retract行下拉框关联
        private ObservableCollection<int> m_PickSoltItemsSource = new ObservableCollection<int>();
        private ObservableCollection<int> m_PlaceSoltItemsSource = new ObservableCollection<int>();
        private ObservableCollection<int> m_ExtendSoltItemsSource = new ObservableCollection<int>();
        private ObservableCollection<int> m_RetractSoltItemsSource = new ObservableCollection<int>();
        private int m_PickSoltSelectedIndex;
        private int m_PlaceSoltSelectedIndex;
        private int m_ExtendSoltSelectedIndex;
        private int m_RetractSoltSelectedIndex;


        //下拉框内容
        private List<DeTMModule> m_TMModules = new List<DeTMModule>();

        private bool m_PMAIsInstalled;
        private bool m_PMBIsInstalled;
        private bool m_PMCIsInstalled;
        private bool m_PMDIsInstalled;

        private bool m_VCEAIsInstalled;
        private bool m_VCEBIsInstalled;

        private bool m_AlignerIsInstalled;
        private Dictionary<string, object> m_RtDataValues = new Dictionary<string, object>();
        private List<string> m_RtDataKeys = new List<string>();

        //Robot动画
        private DERobotTAction m_DERobotTAction;
        private DERobotTAction m_Robot1TAction;
        private DERobotXAction m_Robot1XAction;
        private DERobotTAction m_Robot2TAction;
        private DERobotXAction m_Robot2XAction;
        public RobotMoveInfo m_robotMoveInfo;
        //Cycle
        private List<string> m_OriginalCycle = new List<string>();
        private List<string> m_ToCycle = new List<string>();
        private bool m_CycleEnable;

        private bool m_PMAIsCycle;
        private bool m_PMBIsCycle;
        private bool m_PMCIsCycle;
        private bool m_PMDIsCycle;

        private int m_CycleCount;

        #endregion

        #region 属性
        public WaferInfo PMAWafer
        {
            get { return m_PMAWafer; }
            set { SetProperty(ref m_PMAWafer, value); }
        }
        public WaferInfo PMBWafer
        {
            get { return m_PMBWafer; }
            set { SetProperty(ref m_PMBWafer, value); }
        }
        public WaferInfo PMCWafer
        {
            get { return m_PMCWafer; }
            set { SetProperty(ref m_PMCWafer, value); }
        }
        public WaferInfo PMDWafer
        {
            get { return m_PMDWafer; }
            set { SetProperty(ref m_PMDWafer, value); }
        }
        public WaferInfo RobotUpperWafer
        {
            get { return m_RobotUpperWafer; }
            set { SetProperty(ref m_RobotUpperWafer, value); }
        }

        public WaferInfo RobotLowerWafer
        {
            get { return m_RobotLowerWafer; }
            set { SetProperty(ref m_RobotLowerWafer, value); }
        }
        public WaferInfo PAWafer
        {
            get { return m_PAWafer; }
            set { SetProperty(ref m_PAWafer, value); }
        }
        public bool IsAligner1OnRight { get => m_IsAlignerOnRight; set => SetProperty(ref m_IsAlignerOnRight, value); }

        public bool VCEADoorIsOpen { get => m_VCEADoorIsOpen; set => SetProperty(ref m_VCEADoorIsOpen, value); }
        public bool VCEBDoorIsOpen { get => m_VCEBDoorIsOpen; set => SetProperty(ref m_VCEBDoorIsOpen, value); }
        public bool VCEAOutDoorIsOpen { get => m_VCEAOutDoorIsOpen; set => SetProperty(ref m_VCEAOutDoorIsOpen, value); }
        public bool VCEBOutDoorIsOpen { get => m_VCEBOutDoorIsOpen; set => SetProperty(ref m_VCEBOutDoorIsOpen, value); }
        public bool PMDDoorIsOpen { get => m_PMDDoorIsOpen; set => SetProperty(ref m_PMDDoorIsOpen, value); }

        public bool PMCDoorIsOpen
        {
            get => m_PMCDoorIsOpen;
            set
            {
                SetProperty(ref m_PMCDoorIsOpen, value);
            }
        }

        public bool PMADoorIsOpen
        {
            get { return m_PMADoorIsOpen; }
            set { SetProperty(ref m_PMADoorIsOpen, value); }
        }
        public bool PMBDoorIsOpen
        {
            get { return m_PMBDoorIsOpen; }
            set { SetProperty(ref m_PMBDoorIsOpen, value); }
        }

        public ModuleInfo AlignerModuleInfo
        {
            get { return m_AlignerModuleInfo; }
            set
            {
                SetProperty(ref m_AlignerModuleInfo, value);
            }
        }
        public Dictionary<string, object> RtDataValues
        {
            get { return m_RtDataValues; }
            set { SetProperty(ref m_RtDataValues, value); }
        }

        public bool PMAIsInstalled
        {
            get { return m_PMAIsInstalled; }
            set { SetProperty(ref m_PMAIsInstalled, value); }
        }
        public bool PMBIsInstalled
        {
            get { return m_PMBIsInstalled; }
            set { SetProperty(ref m_PMBIsInstalled, value); }
        }
        public bool PMCIsInstalled
        {
            get { return m_PMCIsInstalled; }
            set { SetProperty(ref m_PMCIsInstalled, value); }
        }
        public bool PMDIsInstalled
        {
            get { return m_PMDIsInstalled; }
            set
            {
                SetProperty(ref m_PMDIsInstalled, value);
            }
        }
        public bool VCEAIsInstalled
        {
            get { return m_VCEAIsInstalled; }
            set { SetProperty(ref m_VCEAIsInstalled, value); }
        }
        public bool VCEBIsInstalled
        {
            get { return m_VCEBIsInstalled; }
            set
            {
                SetProperty(ref m_VCEBIsInstalled, value);
            }
        }
        public bool AlignerIsInstalled
        {
            get { return m_AlignerIsInstalled; }
            set { SetProperty(ref m_AlignerIsInstalled, value); }
        }

        public List<DeTMModule> TMModules
        {
            get { return m_TMModules; }
            set { SetProperty(ref m_TMModules, value); }
        }

        //Module属性
        public DeTMModule PickSelectedModule
        {
            get { return m_PickSelectedModule; }
            set { SetProperty(ref m_PickSelectedModule, value); }
        }
        public DeTMModule PlaceSelectedModule
        {
            get { return m_PlaceSelectedModule; }
            set { SetProperty(ref m_PlaceSelectedModule, value); }
        }
        public DeTMModule ExtendSelectedModule
        {
            get { return m_ExtendSelectedModule; }
            set { SetProperty(ref m_ExtendSelectedModule, value); }
        }
        public DeTMModule RetractSelectedModule
        {
            get { return m_RetractSelectedModule; }
            set { SetProperty(ref m_RetractSelectedModule, value); }
        }
        public DeTMModule GotoSelectedModule
        {
            get { return m_GotoSelectedModule; }
            set { SetProperty(ref m_GotoSelectedModule, value); }
        }
        public ModuleInfo TMModuleInfo
        {
            get { return m_TMModuleInfo; }
            set
            {
                SetProperty(ref m_TMModuleInfo, value);
            }
        }
        //Blade属性
        public DeTMBlade PickSelectedBlade
        {
            get { return m_PickSelectedBlade; }
            set { SetProperty(ref m_PickSelectedBlade, value); }
        }
        public DeTMBlade PlaceSelectedBlade
        {
            get { return m_PlaceSelectedBlade; }
            set { SetProperty(ref m_PlaceSelectedBlade, value); }
        }
        public DeTMBlade ExtendSelectedBlade
        {
            get { return m_ExtendSelectedBlade; }
            set { SetProperty(ref m_ExtendSelectedBlade, value); }
        }
        public DeTMBlade RetractSelectedBlade
        {
            get { return m_RetractSelectedBlade; }
            set { SetProperty(ref m_RetractSelectedBlade, value); }
        }
        public DeTMBlade GoToSelectedBlade
        {
            get { return m_GoToSelectedBlade; }
            set { SetProperty(ref m_GoToSelectedBlade, value); }
        }

        public ObservableCollection<int> PickSoltItemsSource
        {
            get { return m_PickSoltItemsSource; }
            set { SetProperty(ref m_PickSoltItemsSource, value); }
        }
        public ObservableCollection<int> PlaceSoltItemsSource
        {
            get { return m_PlaceSoltItemsSource; }
            set { SetProperty(ref m_PlaceSoltItemsSource, value); }
        }
        public ObservableCollection<int> ExtendSoltItemsSource
        {
            get { return m_ExtendSoltItemsSource; }
            set { SetProperty(ref m_ExtendSoltItemsSource, value); }
        }
        public ObservableCollection<int> RetractSoltItemsSource
        {
            get { return m_RetractSoltItemsSource; }
            set { SetProperty(ref m_RetractSoltItemsSource, value); }
        }
        public int PickSoltSelectedIndex
        {
            get { return m_PickSoltSelectedIndex; }
            set { SetProperty(ref m_PickSoltSelectedIndex, value); }
        }
        public int PlaceSoltSelectedIndex
        {
            get { return m_PlaceSoltSelectedIndex; }
            set { SetProperty(ref m_PlaceSoltSelectedIndex, value); }
        }
        public int ExtendSoltSelectedIndex
        {
            get { return m_ExtendSoltSelectedIndex; }
            set { SetProperty(ref m_ExtendSoltSelectedIndex, value); }
        }
        public int RetractSoltSelectedIndex
        {
            get { return m_RetractSoltSelectedIndex; }
            set { SetProperty(ref m_RetractSoltSelectedIndex, value); }
        }
        //Robot动作
        public DERobotTAction DERobotTAction
        {
            get { return m_DERobotTAction; }
            set { SetProperty(ref m_DERobotTAction, value); }
        }
        public DERobotTAction Robot1TAction
        {
            get { return m_Robot1TAction; }
            set { SetProperty(ref m_Robot1TAction, value); }
        }
        public DERobotXAction Robot1XAction
        {
            get { return m_Robot1XAction; }
            set { SetProperty(ref m_Robot1XAction, value); }
        }
        public DERobotTAction Robot2TAction
        {
            get { return m_Robot2TAction; }
            set { SetProperty(ref m_Robot2TAction, value); }
        }
        public DERobotXAction Robot2XAction
        {
            get { return m_Robot2XAction; }
            set { SetProperty(ref m_Robot2XAction, value); }
        }
        public RobotMoveInfo RobotMoveInfo
        {
            get { return m_robotMoveInfo; }
            set
            {
                RobotMoveInfoChanged(m_robotMoveInfo, value);
                SetProperty(ref m_robotMoveInfo, value);
            }
        }
        //Cycle
        public List<string> OriginalCycle
        {
            get { return m_OriginalCycle; }
            set { SetProperty(ref m_OriginalCycle, value); }
        }
        public List<string> ToCycle
        {
            get { return m_ToCycle; }
            set { SetProperty(ref m_ToCycle, value); }
        }
        public bool CycleEnable
        {
            get { return m_CycleEnable; }
            set { SetProperty(ref m_CycleEnable, value); }
        }
        public bool PMAIsCycle
        {
            get { return m_PMAIsCycle; }
            set { SetProperty(ref m_PMAIsCycle, value); }
        }
        public bool PMBIsCycle
        {
            get { return m_PMBIsCycle; }
            set { SetProperty(ref m_PMBIsCycle, value); }
        }
        public bool PMCIsCycle
        {
            get { return m_PMCIsCycle; }
            set { SetProperty(ref m_PMCIsCycle, value); }
        }
        public bool PMDIsCycle
        {
            get { return m_PMDIsCycle; }
            set { SetProperty(ref m_PMDIsCycle, value); }
        }
        public int CycleCount
        {
            get { return m_CycleCount; }
            set { SetProperty(ref m_CycleCount, value); }
        }


        #endregion

        #region 命令
        //模块下拉框选择命令
        private DelegateCommand<object> _ModuleChangeCommand;
        public DelegateCommand<object> ModuleChangeCommand =>
            _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange));
        //Pick按钮命令
        private DelegateCommand _PickCommand;
        public DelegateCommand PickCommand =>
            _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick));
        //Place按钮命令
        private DelegateCommand _PlaceCommand;
        public DelegateCommand PlaceCommand =>
            _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace));
        //Extend按钮命令
        private DelegateCommand _ExtendCommand;
        public DelegateCommand ExtendCommand =>
            _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend));
        //Retract按钮命令
        private DelegateCommand _RetractCommand;
        public DelegateCommand RetractCommand =>
            _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract));
        //RobotHome按钮命令
        public DelegateCommand _RobotHomeCommand;
        public DelegateCommand RobotHomeCommand =>
            _RobotHomeCommand ?? (_RobotHomeCommand = new DelegateCommand(OnRobotHome));
        private DelegateCommand _HomeCommand;
        public DelegateCommand HomeCommand =>
            _HomeCommand ?? (_HomeCommand = new DelegateCommand(OnHome));
        private DelegateCommand _GotoCommand;
        public DelegateCommand GotoCommand =>
            _GotoCommand ?? (_GotoCommand = new DelegateCommand(OnGoto));
        #endregion
        //Cycle
        private DelegateCommand _StartCycleCommand;
        public DelegateCommand StartCycleCommand =>
            _StartCycleCommand ?? (_StartCycleCommand = new DelegateCommand(OnStartCycle));

        private DelegateCommand _StopCycleCommand;

        public DelegateCommand StopCycleCommand =>
            _StopCycleCommand ?? (_StopCycleCommand = new DelegateCommand(OnStopCycle));


        #region 构造函数
        public VenusDETMViewModel()
        {
            string allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString();
            PMAIsInstalled = allModules.Contains("PMA");
            PMBIsInstalled = allModules.Contains("PMB");
            PMCIsInstalled = allModules.Contains("PMC");
            PMDIsInstalled = allModules.Contains("PMD");
            VCEAIsInstalled = allModules.Contains("VCEA");
            VCEBIsInstalled = allModules.Contains("VCEB");
            AlignerIsInstalled = allModules.Contains("Aligner");
            IsAligner1OnRight = true;
            if (PMAIsInstalled == true)
            {
                TMModules.Add(DeTMModule.PMA);
            }
            if (PMBIsInstalled == true)
            {
                TMModules.Add(DeTMModule.PMB);
            }
            if (PMCIsInstalled == true)
            {
                TMModules.Add(DeTMModule.PMC);
            }
            if (PMDIsInstalled == true)
            {
                TMModules.Add(DeTMModule.PMD);
                IsAligner1OnRight = false;
            }
            if (VCEAIsInstalled == true)
            {
                TMModules.Add(DeTMModule.LP1);
            }
            if (VCEBIsInstalled == true)
            {
                TMModules.Add(DeTMModule.LP2);
            }
            if (AlignerIsInstalled == true)
            {
                TMModules.Add(DeTMModule.Aligner1);
            }
            PickSoltItemsSource.Add(1);
            PlaceSoltItemsSource.Add(1);
            ExtendSoltItemsSource.Add(1);
            RetractSoltItemsSource.Add(1);


            addDataKeys();
            RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);

            PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMASlitDoorClosed");
            PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMBSlitDoorClosed");
            PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMCSlitDoorClosed");
            PMDDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMDSlitDoorClosed");
            VCEADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.VCEASlitDoorClosed");
            VCEBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.VCEBSlitDoorClosed");
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(0.5);
            timer.Tick += Timer_Tick;
            timer.Start();

        }
        #endregion

        #region 命令方法
        private void addDataKeys()
        {
            m_RtDataKeys.Add($"TM.VCEASlitDoorClosed");
            m_RtDataKeys.Add($"TM.VCEBSlitDoorClosed");
            m_RtDataKeys.Add($"TM.PMASlitDoorClosed");
            m_RtDataKeys.Add($"TM.PMBSlitDoorClosed");
            m_RtDataKeys.Add($"TM.PMCSlitDoorClosed");
            m_RtDataKeys.Add($"TM.PMDSlitDoorClosed");
            m_RtDataKeys.Add($"LP1.CassettePlaced");
            m_RtDataKeys.Add($"LP2.CassettePlaced");
            m_RtDataKeys.Add($"PMA.ChamberPressure");
            m_RtDataKeys.Add($"PMB.ChamberPressure");
            m_RtDataKeys.Add($"PMC.ChamberPressure");
            m_RtDataKeys.Add($"PMD.ChamberPressure");
            m_RtDataKeys.Add($"TM.VCEPressure.Value");
            m_RtDataKeys.Add($"TMCycle.CycleIndex");
        }
        //模块选择根据obj选择下拉框内容
        private void OnModuleChange(object obj)
        {
            var value = obj.ToString();
            switch (value)
            {
                case "Pick":
                    PickSoltItemsSource.Clear();
                    if ((int)PickSelectedModule == 4|| (int)PickSelectedModule == 5)
                    {
                        for (int i = 1; i <= 25; i++)
                        {
                            PickSoltItemsSource.Add(i);
                        }
                    }
                    else
                    {
                        PickSoltItemsSource.Add(1);

                    }
                    PickSoltSelectedIndex = 0;
                    break;
                case "Place":
                    PlaceSoltItemsSource.Clear();
                    if ((int)PlaceSelectedModule == 4|| (int)PlaceSelectedModule == 5)
                    {
                        for (int i = 1; i <= 25; i++)
                        {
                            PlaceSoltItemsSource.Add(i);
                        }
                    }
                    else
                    {
                        PlaceSoltItemsSource.Add(1);

                    }
                    PlaceSoltSelectedIndex = 0;
                    break;
                case "Extend":
                    ExtendSoltItemsSource.Clear();
                    if ((int)ExtendSelectedModule == 4|| (int)ExtendSelectedModule == 5)
                    {
                        for (int i = 1; i <= 25; i++)
                        {
                            ExtendSoltItemsSource.Add(i);
                        }
                    }
                    else
                    {
                        ExtendSoltItemsSource.Add(1);

                    }
                    ExtendSoltSelectedIndex = 0;
                    break;
                case "Retract":
                    RetractSoltItemsSource.Clear();
                    if ((int)RetractSelectedModule == 4|| (int)RetractSelectedModule == 5)
                    {
                        for (int i = 1; i <= 25; i++)
                        {
                            RetractSoltItemsSource.Add(i);
                        }
                    }
                    else
                    {
                        RetractSoltItemsSource.Add(1);

                    }
                    RetractSoltSelectedIndex = 0;
                    break;

            }

        }
        private void OnPick()
        {
            Queue<MoveItem> moveItems = new Queue<MoveItem>();
            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
            var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
            MoveItem moveItem = new MoveItem(moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, ModuleName.TMRobot, 0, selectedHand);
            moveItems.Enqueue(moveItem);
            if ((int)PickSelectedModule < TMModules.Count - 3)
            {
                InvokeClient.Instance.Service.DoOperation($"TM.PMPick", moveItems);
            }
            else
            {
                InvokeClient.Instance.Service.DoOperation($"TM.Pick", moveItems);
            }

        }
        private void OnPlace()
        {
            Queue<MoveItem> moveItems = new Queue<MoveItem>();
            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
            var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
            MoveItem moveItem = new MoveItem(ModuleName.TMRobot, 0, moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
            moveItems.Enqueue(moveItem);
            if ((int)PlaceSelectedModule < TMModules.Count - 3)
            {
                InvokeClient.Instance.Service.DoOperation($"TM.PMPlace", moveItems);
            }
            //VCE、Aligner1
            else
            {
                InvokeClient.Instance.Service.DoOperation($"TM.Place", moveItems);
            }
        }
        private void OnExtend()
        {
            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), ExtendSelectedModule.ToString(), true);
            var selectedHand = (Hand)Enum.Parse(typeof(Hand), ExtendSelectedBlade.ToString(), true);
            InvokeClient.Instance.Service.DoOperation($"TM.Extend", moduleName, ExtendSoltItemsSource[ExtendSoltSelectedIndex] - 1, selectedHand);
        }
        private void OnRetract()
        {
            //Queue<MoveItem> moveItems = new Queue<MoveItem>();
            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), RetractSelectedModule.ToString(), true);
            var selectedHand = (Hand)Enum.Parse(typeof(Hand), RetractSelectedBlade.ToString(), true);
            //MoveItem moveItem = new MoveItem(moduleName, RetractSoltItemsSource[PickSoltSelectedIndex] - 1, 0, 0, selectedHand);
            //moveItems.Enqueue(moveItem);
            InvokeClient.Instance.Service.DoOperation($"TM.Retract", moduleName, RetractSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
        }
        //令选择的模块下发Home指令
        private void OnRobotHome()
        {
            InvokeClient.Instance.Service.DoOperation($"TM.Home", "TMRobot");
            InvokeClient.Instance.Service.DoOperation($"TM.Retract");

        }
        private void OnHome()
        {
            InvokeClient.Instance.Service.DoOperation($"TM.Home");
        }
        private void OnGoto()
        {
            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), GotoSelectedModule.ToString(), true);
            var selectedHand = (Hand)Enum.Parse(typeof(Hand), GoToSelectedBlade.ToString(), true);
            InvokeClient.Instance.Service.DoOperation($"TM.Goto", moduleName, 0, selectedHand);
        }
        //Cycle
        private void OnStartCycle()
        {
            if (CycleEnable == false)
            {
                return;
            }
            List<string> stations = new List<string>();
            stations.Add("VCEA");
            stations.Add("Aligner1");
            if (PMAIsCycle == true)
            {
                stations.Add("PMA");
            }
            if (PMBIsCycle == true)
            {
                stations.Add("PMB");
            }
            if (PMCIsCycle == true)
            {
                stations.Add("PMC");
            }
            if (PMDIsCycle == true)
            {
                stations.Add("PMD");
            }
            stations.Add("VCEA");
            InvokeClient.Instance.Service.DoOperation("System.SETMCycle", stations.ToArray(), CycleCount);

        }

        private void OnStopCycle()
        {

            InvokeClient.Instance.Service.DoOperation("System.SEAbort");

        }
        #endregion

        #region 私有方法
        private void Timer_Tick(object sender, EventArgs e)
        {
            TMModuleInfo = ModuleManager.ModuleInfos["TMRobot"];
            if (PMAIsInstalled == true)
            {
                ModuleInfo PMAModuleInfo = ModuleManager.ModuleInfos["PMA"];
                PMAWafer = PMAModuleInfo.WaferManager.Wafers[0];
            }
            if (PMBIsInstalled == true)
            {
                ModuleInfo PMBModuleInfo = ModuleManager.ModuleInfos["PMB"];
                PMBWafer = PMBModuleInfo.WaferManager.Wafers[0];
            }
            if (PMCIsInstalled == true)
            {
                ModuleInfo PMCModuleInfo = ModuleManager.ModuleInfos["PMC"];
                PMCWafer = PMCModuleInfo.WaferManager.Wafers[0];
            }
            if (PMDIsInstalled == true)
            {
                ModuleInfo PMDModuleInfo = ModuleManager.ModuleInfos["PMC"];
                PMDWafer = PMDModuleInfo.WaferManager.Wafers[0];
            }
            RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
            PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMASlitDoorClosed");
            PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMBSlitDoorClosed");
            PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMCSlitDoorClosed");
            PMDDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.PMDSlitDoorClosed");
            VCEADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.VCEASlitDoorClosed");
            VCEBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "TM.VCEBSlitDoorClosed");
            RobotMoveInfo = (RobotMoveInfo)QueryDataClient.Instance.Service.GetData("TM.RobotMoveAction");
            PAWafer = ModuleManager.ModuleInfos["Aligner1"].WaferManager.Wafers[0];
            RobotUpperWafer = TMModuleInfo.WaferManager.Wafers[0];
            RobotLowerWafer = TMModuleInfo.WaferManager.Wafers[1];

        }
        private async void RobotMoveInfoChanged(RobotMoveInfo oldValue, RobotMoveInfo newValue)
        {
            string RobotTarget;
            if (oldValue == null || newValue == null)
            {
                return;
            }

            #region Rotating
            if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Rotating))
            {
                var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
                if (TMRobotMoveActionBladeTarget != null)
                {
                    RobotTarget = TMRobotMoveActionBladeTarget.ToString();
                }
                else
                {
                    return;
                }
                var values = RobotTarget.Split('.');
                var arm = values[0];
                var module = values[1];
                var DERobotTAction = (DERobotTAction)Enum.Parse(typeof(DERobotTAction), module, true);
                if (DERobotTAction != Robot1TAction || DERobotTAction != Robot2TAction)
                {
                    Robot1TAction = DERobotTAction;
                    Robot2TAction = DERobotTAction;
                }
            }
            #endregion

            #region Aligner1、VCE Pick、Place
            else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && (newValue.Action == RobotAction.Placing || newValue.Action == RobotAction.Picking))
            {
                var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
                if (TMRobotMoveActionBladeTarget != null)
                {
                    RobotTarget = TMRobotMoveActionBladeTarget.ToString();
                }
                else
                {
                    return;
                }
                var values = RobotTarget.Split('.');
                var arm = values[0];
                var module = values[1];
                if (module == "Aligner1")
                {
                    module = IsAligner1OnRight ? "PMD" : "Aligner1";
                }
                var DERobotTAction = (DERobotTAction)Enum.Parse(typeof(DERobotTAction), module, true);
                if (DERobotTAction != Robot1TAction || DERobotTAction != Robot2TAction)
                {
                    Robot1TAction = DERobotTAction;
                    Robot2TAction = DERobotTAction;
                }
                if (arm == "ArmA")
                {
                    await Task.Delay(600);
                    if (module == "VCEA" || module == "VCEB")
                    {
                        Robot1XAction = DERobotXAction.ToVCE;
                        while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus == 0))
                        {
                            await Task.Delay(100);
                        }
                        Robot1XAction = DERobotXAction.FromVCE;
                    }
                    else
                    {
                        Robot1XAction = DERobotXAction.Extend;
                        while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[0].WaferStatus == 0))
                        {
                            await Task.Delay(100);
                        }
                        Robot1XAction = DERobotXAction.Retract;
                    }

                }
                else if (arm == "ArmB")
                {
                    await Task.Delay(600);
                    if (module == "VCEA" || module == "VCEB")
                    {
                        Robot2XAction = DERobotXAction.ToVCE2;
                        while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus == 0))
                        {
                            await Task.Delay(100);
                        }
                        Robot2XAction = DERobotXAction.FromVCE2;
                    }
                    else
                    {
                        Robot2XAction = DERobotXAction.Extend2;
                        while ((newValue.Action == RobotAction.Placing && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus != 0) || (newValue.Action == RobotAction.Picking && ModuleManager.ModuleInfos["TMRobot"].WaferManager.Wafers[1].WaferStatus == 0))
                        {
                            await Task.Delay(100);
                        }
                        Robot2XAction = DERobotXAction.Retract2;
                    }

                }
            }
            #endregion

            #region PM pick、PM place
            else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && newValue.Action == RobotAction.Extending)
            {
                var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
                if (TMRobotMoveActionBladeTarget != null)
                {
                    RobotTarget = TMRobotMoveActionBladeTarget.ToString();
                }
                else
                {
                    return;
                }
                var values = RobotTarget.Split('.');
                var arm = values[0];
                var module = values[1];
                var DERobotTAction = (DERobotTAction)Enum.Parse(typeof(DERobotTAction), module, true);
                if (DERobotTAction != Robot1TAction || DERobotTAction != Robot2TAction)
                {
                    Robot1TAction = DERobotTAction;
                    Robot2TAction = DERobotTAction;
                }
                if (arm == "ArmA")
                {
                    await Task.Delay(600);
                    Robot1XAction = DERobotXAction.Extend;
                }
                else if (arm == "ArmB")
                {
                    await Task.Delay(600);
                    Robot2XAction = DERobotXAction.Extend2;
                }
            }

            else if ((oldValue.Action == RobotAction.None || oldValue.ArmTarget != newValue.ArmTarget) && newValue.Action == RobotAction.Retracting)
            {
                var TMRobotMoveActionBladeTarget = newValue.BladeTarget;
                if (TMRobotMoveActionBladeTarget != null)
                {
                    RobotTarget = TMRobotMoveActionBladeTarget.ToString();
                }
                else
                {
                    return;
                }
                var values = RobotTarget.Split('.');
                var arm = values[0];
                var module = values[1];

                if (arm == "ArmA")
                {
                    await Task.Delay(100);
                    Robot1XAction = DERobotXAction.Retract;
                }
                else if (arm == "ArmB")
                {
                    await Task.Delay(100);
                    Robot2XAction = DERobotXAction.Retract2;
                }
            }
            #endregion
            #region Home
            else if (oldValue.Action == RobotAction.None && newValue.Action == RobotAction.Homing)
            {
                if (Robot1XAction == DERobotXAction.Extend)
                {
                    Robot1XAction = DERobotXAction.Retract;
                }
                if (Robot2XAction == DERobotXAction.Extend2)
                {
                    Robot2XAction = DERobotXAction.Retract2;
                }
                await Task.Delay(2000);
                if (Robot1TAction != DERobotTAction.T_Origin)
                {
                    Robot1TAction = DERobotTAction.T_Origin;
                }
                if (Robot2TAction != DERobotTAction.T_Origin)
                {
                    Robot2TAction = DERobotTAction.T_Origin;
                }
            }

            #endregion

        }


        #endregion
    }

}