using Aitex.Sorter.Common; using ExcelLibrary.BinaryFileFormat; 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 Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows.Threading; using Venus_Core; using Venus_MainPages.Unity; namespace Venus_MainPages.ViewModels { public enum EFEMModule { LLA, LLB,LP1,LP2,LP3,Aligner1 } public enum EFEMBlade { Blade1, Blade2 } internal class EfemViewModel:BindableBase { #region 私有字段 private bool m_LLAIsInstalled; private bool m_LLBIsInstalled; private ModuleInfo m_LLAModuleInfo; private ModuleInfo m_LLBModuleInfo; private ModuleInfo m_LP1ModuleInfo; private ModuleInfo m_LP2ModuleInfo; private ModuleInfo m_LP3ModuleInfo; private List m_EFEMModules = new List(); private EFEMBlade m_PickSelectedBlade; private EFEMBlade m_PlaceSelectedBlade; private EFEMBlade m_ExtendSelectedBlade; private EFEMBlade m_RetractSelectedBlade; private ObservableCollection m_PlaceSoltItemsSource = new ObservableCollection(); private ObservableCollection m_PickSoltItemsSource = new ObservableCollection(); private ObservableCollection m_ExtendSoltItemsSource = new ObservableCollection(); private ObservableCollection m_RetractSoltItemsSource = new ObservableCollection(); private int m_PickSoltSelectedIndex; private int m_PlaceSoltSelectedIndex; private int m_ExtendSoltSelectedIndex; private int m_RetractSoltSelectedIndex; private EFEMModule m_PickSelectedModule; private EFEMModule m_PlaceSelectedModule; private EFEMModule m_ExtendSelectedModule; private EFEMModule m_RetractSelectedModule; private WaferInfo m_BladeAWafer; private WaferInfo m_BladeBWafer; private WaferInfo m_LLAWafer; private WaferInfo m_LLBWafer; private WaferInfo m_Aligner1Wafer; #endregion #region 属性 public bool LLAIsInstalled { get { return m_LLAIsInstalled; } set { SetProperty(ref m_LLAIsInstalled, value); } } public bool LLBIsInstalled { get { return m_LLBIsInstalled; } set { SetProperty(ref m_LLBIsInstalled, value); } } public ModuleInfo LLAModuleInfo { get { return m_LLAModuleInfo; } set { SetProperty(ref m_LLAModuleInfo, value); } } public ModuleInfo LLBModuleInfo { get { return m_LLBModuleInfo; } set { SetProperty(ref m_LLBModuleInfo, value); } } public ModuleInfo LP1ModuleInfo { get { return m_LP1ModuleInfo; } set { SetProperty(ref m_LP1ModuleInfo, value); } } public ModuleInfo LP2ModuleInfo { get { return m_LP2ModuleInfo; } set { SetProperty(ref m_LP2ModuleInfo, value); } } public ModuleInfo LP3ModuleInfo { get { return m_LP3ModuleInfo; } set { SetProperty(ref m_LP3ModuleInfo, value); } } public List EFEMModules { get { return m_EFEMModules; } set { SetProperty(ref m_EFEMModules, value); } } public EFEMBlade PickSelectedBlade { get { return m_PickSelectedBlade; } set { SetProperty(ref m_PickSelectedBlade, value); } } public EFEMBlade PlaceSelectedBlade { get { return m_PlaceSelectedBlade; } set { SetProperty(ref m_PlaceSelectedBlade, value); } } public EFEMBlade ExtendSelectedBlade { get { return m_ExtendSelectedBlade; } set { SetProperty(ref m_ExtendSelectedBlade, value); } } public EFEMBlade RetractSelectedBlade { get { return m_RetractSelectedBlade; } set { SetProperty(ref m_RetractSelectedBlade, value); } } public ObservableCollection PickSoltItemsSource { get { return m_PickSoltItemsSource; } set { SetProperty(ref m_PickSoltItemsSource, value); } } public ObservableCollection PlaceSoltItemsSource { get { return m_PlaceSoltItemsSource; } set { SetProperty(ref m_PlaceSoltItemsSource, value); } } public ObservableCollection ExtendSoltItemsSource { get { return m_ExtendSoltItemsSource; } set { SetProperty(ref m_ExtendSoltItemsSource, value); } } public ObservableCollection 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); } } public EFEMModule PickSelectedModule { get { return m_PickSelectedModule; } set { SetProperty(ref m_PickSelectedModule, value); } } public EFEMModule PlaceSelectedModule { get { return m_PlaceSelectedModule; } set { SetProperty(ref m_PlaceSelectedModule, value); } } public EFEMModule ExtendSelectedModule { get { return m_ExtendSelectedModule; } set { SetProperty(ref m_ExtendSelectedModule, value); } } public EFEMModule RetractSelectedModule { get { return m_RetractSelectedModule; } set { SetProperty(ref m_RetractSelectedModule, value); } } public WaferInfo BladeAWafer { get { return m_BladeAWafer; } set { SetProperty(ref m_BladeAWafer, value); } } public WaferInfo BladeBWafer { get { return m_BladeBWafer; } set { SetProperty(ref m_BladeBWafer, value); } } public WaferInfo Aligner1Wafer { get { return m_Aligner1Wafer; } set { SetProperty(ref m_Aligner1Wafer, value); } } public WaferInfo LLAWafer { get { return m_LLAWafer; } set { SetProperty(ref m_LLAWafer, value); } } public WaferInfo LLBWafer { get { return m_LLBWafer; } set { SetProperty(ref m_LLBWafer, value); } } #endregion #region 命令 private DelegateCommand _ExtendCommand; public DelegateCommand ExtendCommand => _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend)); private DelegateCommand _RetractCommand; public DelegateCommand RetractCommand => _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract)); private DelegateCommand _ModuleChangeCommand; public DelegateCommand ModuleChangeCommand => _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand(OnModuleChange)); private DelegateCommand _PickCommand; public DelegateCommand PickCommand => _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick)); private DelegateCommand _PlaceCommand; public DelegateCommand PlaceCommand => _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace)); private DelegateCommand _HomeAllCommand; public DelegateCommand HomeAllCommand => _HomeAllCommand ?? (_HomeAllCommand = new DelegateCommand(OnHomeAll)); private DelegateCommand _ClearErrorCommand; public DelegateCommand ClearErrorCommand => _ClearErrorCommand ?? (_ClearErrorCommand = new DelegateCommand(OnClearError)); private DelegateCommand _AbortCommand; public DelegateCommand AbortCommand => _AbortCommand ?? (_AbortCommand = new DelegateCommand(OnAbort)); private DelegateCommand _Align1HomeCommand; public DelegateCommand Align1HomeCommand => _Align1HomeCommand ?? (_Align1HomeCommand = new DelegateCommand(OnAlign1Home)); private DelegateCommand _Align1UpCommand; public DelegateCommand Align1UpCommand => _Align1UpCommand ?? (_Align1UpCommand = new DelegateCommand(OnAlign1Up)); private DelegateCommand _Align1DownCommand; public DelegateCommand Align1DownCommand => _Align1DownCommand ?? (_Align1DownCommand = new DelegateCommand(OnAlign1Down)); private DelegateCommand _Align1AlignCommand; public DelegateCommand Align1AlignCommand => _Align1AlignCommand ?? (_Align1AlignCommand = new DelegateCommand(OnAlign1Align)); private DelegateCommand _RobotHomeCommand; public DelegateCommand RobotHomeCommand => _RobotHomeCommand ?? (_RobotHomeCommand = new DelegateCommand(OnRobotHome)); #endregion #region 构造函数 public EfemViewModel() { string[] allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(','); LLAIsInstalled = allModules.Contains("LLA"); LLBIsInstalled = allModules.Contains("LLB"); DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(0.1); timer.Tick += Timer_Tick; timer.Start(); EFEMModules.Add(EFEMModule.LLA); EFEMModules.Add(EFEMModule.LLB); EFEMModules.Add(EFEMModule.LP1); EFEMModules.Add(EFEMModule.LP2); EFEMModules.Add(EFEMModule.Aligner1); OnModuleChange("Pick"); OnModuleChange("Place"); //OnModuleChange("Extend"); //OnModuleChange("Retract"); } #endregion #region 命令方法 private void OnModuleChange(object obj) { var value = obj.ToString(); switch (value) { case "Pick": PickSoltItemsSource.Clear(); switch (PickSelectedModule) { case EFEMModule.LLA: case EFEMModule.LLB: PickSoltItemsSource.Add(1); PickSoltItemsSource.Add(2); break; case EFEMModule.LP1: case EFEMModule.LP2: case EFEMModule.LP3: for (int i = 1; i < 26; i++) { PickSoltItemsSource.Add(i); } break; default: PickSoltItemsSource.Add(1); break; } PickSoltSelectedIndex = 0; break; case "Place": PlaceSoltItemsSource.Clear(); switch (PlaceSelectedModule) { case EFEMModule.LLA: case EFEMModule.LLB: PlaceSoltItemsSource.Add(1); PlaceSoltItemsSource.Add(2); break; case EFEMModule.LP1: case EFEMModule.LP2: case EFEMModule.LP3: for (int i = 1; i < 26; i++) { PlaceSoltItemsSource.Add(i); } break; default: PlaceSoltItemsSource.Add(1); break; } PlaceSoltSelectedIndex = 0; break; //case "Extend": // ExtendSoltItemsSource.Clear(); // switch (ExtendSelectedModule) // { // case EFEMModule.LLA: // case EFEMModule.LLB: // ExtendSoltItemsSource.Add(1); // ExtendSoltItemsSource.Add(2); // break; // case EFEMModule.LP1: // case EFEMModule.LP2: // case EFEMModule.LP3: // for (int i = 1; i < 26; i++) // { // ExtendSoltItemsSource.Add(i); // } // break; // default: // ExtendSoltItemsSource.Add(1); // break; // } // ExtendSoltSelectedIndex = 0; // break; //case "Retract": // RetractSoltItemsSource.Clear(); // switch (RetractSelectedModule) // { // case EFEMModule.LLA: // case EFEMModule.LLB: // RetractSoltItemsSource.Add(1); // RetractSoltItemsSource.Add(2); // break; // case EFEMModule.LP1: // case EFEMModule.LP2: // case EFEMModule.LP3: // for (int i = 1; i < 26; i++) // { // RetractSoltItemsSource.Add(i); // } // break; // default: // RetractSoltItemsSource.Add(1); // break; // } // RetractSoltSelectedIndex = 0; // break; } } private void OnExtend() { var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true); var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true); InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.Extend}", moduleName, 0, selectedHand); } private void OnRetract() { var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true); var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true); InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.Retract}", moduleName, 0, selectedHand); } private void OnPick() { Queue moveItems = new Queue(); 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.EfemRobot, 0, selectedHand); moveItems.Enqueue(moveItem); if (PickSelectedModule == EFEMModule.LLA || PickSelectedModule == EFEMModule.LLB) { InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Swap}", moveItems); } else { InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Pick}", moveItems); } //if ((int)PickSelectedModule > 3) //{ // InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.LLPick}", moveItems); //} //else //{ // InvokeClient.Instance.Service.DoOperation($"EFEM.{RtOperation.PMPick}", moveItems); //} } private void OnPlace() { Queue moveItems = new Queue(); 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.EfemRobot, 0, moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex]-1, selectedHand); moveItems.Enqueue(moveItem); //if ((int)PlaceSelectedModule > 3) //{ // InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.LLPlace}", moveItems); //} //else //{ // InvokeClient.Instance.Service.DoOperation($"TM.{RtOperation.PMPlace}", moveItems); //} if (PlaceSelectedModule == EFEMModule.LLA || PlaceSelectedModule == EFEMModule.LLB) { InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Swap}", moveItems); } else { InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Place}", moveItems); } } private void OnHomeAll() { InvokeClient.Instance.Service.DoOperation($"EFEM.{EfemOperation.Home}"); } private void OnClearError() { InvokeClient.Instance.Service.DoOperation($"EFEM.{EfemOperation.ClearError}"); } private void OnAbort() { InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Abort}"); } private void OnAlign1Home() { InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Home}"); } private void OnAlign1Up() { InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Lift}", true); } private void OnAlign1Down() { InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Lift}", false); } private void OnAlign1Align() { InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Align}"); } private void OnRobotHome() { InvokeClient.Instance.Service.DoOperation($"{ModuleName.EfemRobot}.{EfemOperation.Home}"); } #endregion #region 私有方法 private void Timer_Tick(object sender, EventArgs e) { if (LLAIsInstalled == true) { LLAWafer = ModuleManager.ModuleInfos["LLA"].WaferManager.Wafers.FirstOrDefault(x => x.WaferStatus != 0); LLAModuleInfo = ModuleManager.ModuleInfos["LLA"]; } if (LLBIsInstalled == true) { LLBWafer = ModuleManager.ModuleInfos["LLB"].WaferManager.Wafers.FirstOrDefault(x => x.WaferStatus != 0); LLBModuleInfo = ModuleManager.ModuleInfos["LLB"]; } LP1ModuleInfo = ModuleManager.ModuleInfos["LP1"]; LP2ModuleInfo = ModuleManager.ModuleInfos["LP2"]; LP3ModuleInfo = ModuleManager.ModuleInfos["LP3"]; BladeAWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[0]; BladeBWafer = ModuleManager.ModuleInfos["EfemRobot"].WaferManager.Wafers[1]; Aligner1Wafer= ModuleManager.ModuleInfos["Aligner1"].WaferManager.Wafers[0]; } #endregion } }