SeTMViewModel.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. using Aitex.Sorter.Common;
  2. using MECF.Framework.Common.DataCenter;
  3. using MECF.Framework.Common.Equipment;
  4. using MECF.Framework.Common.OperationCenter;
  5. using MECF.Framework.Common.Schedulers;
  6. using OpenSEMI.ClientBase;
  7. using Prism.Commands;
  8. using Prism.Mvvm;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Collections.ObjectModel;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Windows.Threading;
  16. using Venus_Core;
  17. using Venus_MainPages.Unity;
  18. using Venus_Themes.CustomControls;
  19. namespace Venus_MainPages.ViewModels
  20. {
  21. public enum SeTMModule
  22. {
  23. PMA, PMB, PMC, VCE1, Aligner
  24. }
  25. public enum SeTMBlade
  26. {
  27. Blade1, Blade2
  28. }
  29. internal class SeTMViewModel : BindableBase
  30. {
  31. #region 私有字段
  32. private ModuleInfo m_VCE1ModuleInfo;
  33. private ModuleInfo m_AlignerModuleInfo;
  34. private ModuleInfo m_TMModuleInfo;
  35. //Wafer
  36. private WaferInfo m_PMAWafer;
  37. private WaferInfo m_PMBWafer;
  38. private WaferInfo m_PMCWafer;
  39. //Door
  40. private bool m_PMADoorIsOpen;
  41. private bool m_PMBDoorIsOpen;
  42. private bool m_PMCDoorIsOpen;
  43. private bool m_VCE1DoorIsOpen;
  44. //Pick、Place、Extend、Retract行下拉框内容
  45. private SeTMModule m_PickSelectedModule;
  46. private SeTMModule m_PlaceSelectedModule;
  47. private SeTMModule m_ExtendSelectedModule;
  48. private SeTMModule m_RetractSelectedModule;
  49. private SeTMBlade m_PickSelectedBlade;
  50. private SeTMBlade m_PlaceSelectedBlade;
  51. private SeTMBlade m_ExtendSelectedBlade;
  52. private SeTMBlade m_RetractSelectedBlade;
  53. //Pick、Place、Extend、Retract行下拉框关联
  54. private ObservableCollection<int> m_PickSoltItemsSource = new ObservableCollection<int>();
  55. private ObservableCollection<int> m_PlaceSoltItemsSource = new ObservableCollection<int>();
  56. private ObservableCollection<int> m_ExtendSoltItemsSource = new ObservableCollection<int>();
  57. private ObservableCollection<int> m_RetractSoltItemsSource = new ObservableCollection<int>();
  58. private int m_PickSoltSelectedIndex;
  59. private int m_PlaceSoltSelectedIndex;
  60. private int m_ExtendSoltSelectedIndex;
  61. private int m_RetractSoltSelectedIndex;
  62. //下拉框内容
  63. private List<SeTMModule> m_TMModules = new List<SeTMModule>();
  64. private bool m_PMAIsInstalled;
  65. private bool m_PMBIsInstalled;
  66. private bool m_PMCIsInstalled;
  67. private bool m_VCE1IsInstalled;
  68. private bool m_AlignerIsInstalled;
  69. private bool m_VCEOutDoorIsOpen;
  70. private Dictionary<string, object> m_RtDataValues = new Dictionary<string, object>();
  71. private List<string> m_RtDataKeys = new List<string>();
  72. #endregion
  73. #region 属性
  74. public WaferInfo PMAWafer
  75. {
  76. get { return m_PMAWafer; }
  77. set { SetProperty(ref m_PMAWafer, value); }
  78. }
  79. public WaferInfo PMBWafer
  80. {
  81. get { return m_PMBWafer; }
  82. set { SetProperty(ref m_PMBWafer, value); }
  83. }
  84. public WaferInfo PMCWafer
  85. {
  86. get { return m_PMCWafer; }
  87. set { SetProperty(ref m_PMCWafer, value); }
  88. }
  89. public bool VCE1DoorIsOpen
  90. {
  91. get => m_VCE1DoorIsOpen;
  92. set
  93. {
  94. SetProperty(ref m_VCE1DoorIsOpen,value);
  95. }
  96. }
  97. public bool PMCDoorIsOpen
  98. {
  99. get => m_PMCDoorIsOpen;
  100. set
  101. {
  102. SetProperty(ref m_PMCDoorIsOpen, value);
  103. }
  104. }
  105. public bool PMADoorIsOpen
  106. {
  107. get { return m_PMADoorIsOpen; }
  108. set { SetProperty(ref m_PMADoorIsOpen, value); }
  109. }
  110. public bool PMBDoorIsOpen
  111. {
  112. get { return m_PMBDoorIsOpen; }
  113. set { SetProperty(ref m_PMBDoorIsOpen, value); }
  114. }
  115. public ModuleInfo VCE1ModuleInfo
  116. {
  117. get { return m_VCE1ModuleInfo; }
  118. set
  119. {
  120. SetProperty(ref m_VCE1ModuleInfo, value);
  121. }
  122. }
  123. public ModuleInfo AlignerModuleInfo
  124. {
  125. get { return m_AlignerModuleInfo; }
  126. set
  127. {
  128. SetProperty(ref m_AlignerModuleInfo, value);
  129. }
  130. }
  131. public Dictionary<string, object> RtDataValues
  132. {
  133. get { return m_RtDataValues; }
  134. set { SetProperty(ref m_RtDataValues, value); }
  135. }
  136. public bool VCEOutDoorIsOpen { get => m_VCEOutDoorIsOpen; set => SetProperty(ref m_VCEOutDoorIsOpen, value); }
  137. public bool PMAIsInstalled
  138. {
  139. get { return m_PMAIsInstalled; }
  140. set { SetProperty(ref m_PMAIsInstalled, value); }
  141. }
  142. public bool PMBIsInstalled
  143. {
  144. get { return m_PMBIsInstalled; }
  145. set { SetProperty(ref m_PMBIsInstalled, value); }
  146. }
  147. public bool PMCIsInstalled
  148. {
  149. get { return m_PMCIsInstalled; }
  150. set { SetProperty(ref m_PMCIsInstalled, value); }
  151. }
  152. public bool VCE1IsInstalled
  153. {
  154. get { return m_VCE1IsInstalled; }
  155. set { SetProperty(ref m_VCE1IsInstalled, value); }
  156. }
  157. public bool AlignerIsInstalled
  158. {
  159. get { return m_AlignerIsInstalled; }
  160. set { SetProperty(ref m_AlignerIsInstalled, value); }
  161. }
  162. public List<SeTMModule> TMModules
  163. {
  164. get { return m_TMModules; }
  165. set { SetProperty(ref m_TMModules, value); }
  166. }
  167. //Module属性
  168. public SeTMModule PickSelectedModule
  169. {
  170. get { return m_PickSelectedModule; }
  171. set { SetProperty(ref m_PickSelectedModule, value); }
  172. }
  173. public SeTMModule PlaceSelectedModule
  174. {
  175. get { return m_PlaceSelectedModule; }
  176. set { SetProperty(ref m_PlaceSelectedModule, value); }
  177. }
  178. public SeTMModule ExtendSelectedModule
  179. {
  180. get { return m_ExtendSelectedModule; }
  181. set { SetProperty(ref m_ExtendSelectedModule, value); }
  182. }
  183. public SeTMModule RetractSelectedModule
  184. {
  185. get { return m_RetractSelectedModule; }
  186. set { SetProperty(ref m_RetractSelectedModule, value); }
  187. }
  188. public ModuleInfo TMModuleInfo
  189. {
  190. get { return m_TMModuleInfo; }
  191. set
  192. {
  193. SetProperty(ref m_TMModuleInfo, value);
  194. }
  195. }
  196. //Blade属性
  197. public SeTMBlade PickSelectedBlade
  198. {
  199. get { return m_PickSelectedBlade; }
  200. set { SetProperty(ref m_PickSelectedBlade, value); }
  201. }
  202. public SeTMBlade PlaceSelectedBlade
  203. {
  204. get { return m_PlaceSelectedBlade; }
  205. set { SetProperty(ref m_PlaceSelectedBlade, value); }
  206. }
  207. public SeTMBlade ExtendSelectedBlade
  208. {
  209. get { return m_ExtendSelectedBlade; }
  210. set { SetProperty(ref m_ExtendSelectedBlade, value); }
  211. }
  212. public SeTMBlade RetractSelectedBlade
  213. {
  214. get { return m_RetractSelectedBlade; }
  215. set { SetProperty(ref m_RetractSelectedBlade, value); }
  216. }
  217. public ObservableCollection<int> PickSoltItemsSource
  218. {
  219. get { return m_PickSoltItemsSource; }
  220. set { SetProperty(ref m_PickSoltItemsSource, value); }
  221. }
  222. public ObservableCollection<int> PlaceSoltItemsSource
  223. {
  224. get { return m_PlaceSoltItemsSource; }
  225. set { SetProperty(ref m_PlaceSoltItemsSource, value); }
  226. }
  227. public ObservableCollection<int> ExtendSoltItemsSource
  228. {
  229. get { return m_ExtendSoltItemsSource; }
  230. set { SetProperty(ref m_ExtendSoltItemsSource, value); }
  231. }
  232. public ObservableCollection<int> RetractSoltItemsSource
  233. {
  234. get { return m_RetractSoltItemsSource; }
  235. set { SetProperty(ref m_RetractSoltItemsSource, value); }
  236. }
  237. public int PickSoltSelectedIndex
  238. {
  239. get { return m_PickSoltSelectedIndex; }
  240. set { SetProperty(ref m_PickSoltSelectedIndex, value); }
  241. }
  242. public int PlaceSoltSelectedIndex
  243. {
  244. get { return m_PlaceSoltSelectedIndex; }
  245. set { SetProperty(ref m_PlaceSoltSelectedIndex, value); }
  246. }
  247. public int ExtendSoltSelectedIndex
  248. {
  249. get { return m_ExtendSoltSelectedIndex; }
  250. set { SetProperty(ref m_ExtendSoltSelectedIndex, value); }
  251. }
  252. public int RetractSoltSelectedIndex
  253. {
  254. get { return m_RetractSoltSelectedIndex; }
  255. set { SetProperty(ref m_RetractSoltSelectedIndex, value); }
  256. }
  257. #endregion
  258. #region 命令
  259. //模块下拉框选择命令
  260. private DelegateCommand<object> _ModuleChangeCommand;
  261. public DelegateCommand<object> ModuleChangeCommand =>
  262. _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange));
  263. //Pick按钮命令
  264. private DelegateCommand _PickCommand;
  265. public DelegateCommand PickCommand =>
  266. _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick));
  267. //Place按钮命令
  268. private DelegateCommand _PlaceCommand;
  269. public DelegateCommand PlaceCommand =>
  270. _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace));
  271. //Extend按钮命令
  272. private DelegateCommand _ExtendCommand;
  273. public DelegateCommand ExtendCommand =>
  274. _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend));
  275. //Retract按钮命令
  276. private DelegateCommand _RetractCommand;
  277. public DelegateCommand RetractCommand =>
  278. _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract));
  279. //RobotHome按钮命令
  280. public DelegateCommand _RobotHomeCommand;
  281. public DelegateCommand RobotHomeCommand =>
  282. _RobotHomeCommand ?? (_RobotHomeCommand = new DelegateCommand(OnRobotHome));
  283. #endregion
  284. #region 构造函数
  285. public SeTMViewModel()
  286. {
  287. string allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString();
  288. PMAIsInstalled = allModules.Contains("PMA");
  289. PMBIsInstalled = allModules.Contains("PMB");
  290. PMCIsInstalled = allModules.Contains("PMC");
  291. VCE1IsInstalled = allModules.Contains("VCE1");
  292. AlignerIsInstalled = allModules.Contains("VPA");
  293. if (PMAIsInstalled == true)
  294. {
  295. TMModules.Add(SeTMModule.PMA);
  296. }
  297. if (PMBIsInstalled == true)
  298. {
  299. TMModules.Add(SeTMModule.PMB);
  300. }
  301. if (PMCIsInstalled == true)
  302. {
  303. TMModules.Add(SeTMModule.PMC);
  304. }
  305. if (VCE1IsInstalled == true)
  306. {
  307. TMModules.Add(SeTMModule.VCE1);
  308. }
  309. if (AlignerIsInstalled == true)
  310. {
  311. TMModules.Add(SeTMModule.Aligner);
  312. }
  313. PickSoltItemsSource.Add(1);
  314. PlaceSoltItemsSource.Add(1);
  315. ExtendSoltItemsSource.Add(1);
  316. RetractSoltItemsSource.Add(1);
  317. addDataKeys();
  318. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  319. VCE1DoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.VCESlitDoorClosed");
  320. PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMASlitDoorClosed");
  321. PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMBSlitDoorClosed");
  322. PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMCSlitDoorClosed");
  323. VCEOutDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "VCE1.VCEOutDoorClosed");
  324. DispatcherTimer timer = new DispatcherTimer();
  325. timer.Interval = TimeSpan.FromSeconds(0.5);
  326. timer.Tick += Timer_Tick;
  327. timer.Start();
  328. }
  329. #endregion
  330. #region 命令方法
  331. private void addDataKeys()
  332. {
  333. m_RtDataKeys.Add($"SETM.VCESlitDoorClosed");
  334. m_RtDataKeys.Add($"SETM.PMASlitDoorClosed");
  335. m_RtDataKeys.Add($"SETM.PMBSlitDoorClosed");
  336. m_RtDataKeys.Add($"SETM.PMCSlitDoorClosed");
  337. m_RtDataKeys.Add($"VCE1.VCEOutDoorClosed");
  338. }
  339. //模块选择根据obj选择下拉框内容
  340. private void OnModuleChange(object obj)
  341. {
  342. var value = obj.ToString();
  343. switch (value)
  344. {
  345. case "Pick":
  346. PickSoltItemsSource.Clear();
  347. if ((int)PickSelectedModule == 3)
  348. {
  349. for (int i = 1; i <= 25; i++)
  350. {
  351. PickSoltItemsSource.Add(i);
  352. }
  353. }
  354. else
  355. {
  356. PickSoltItemsSource.Add(1);
  357. }
  358. PickSoltSelectedIndex = 0;
  359. break;
  360. case "Place":
  361. PlaceSoltItemsSource.Clear();
  362. if ((int)PlaceSelectedModule == 3)
  363. {
  364. for (int i = 1; i <= 25; i++)
  365. {
  366. PlaceSoltItemsSource.Add(i);
  367. }
  368. }
  369. else
  370. {
  371. PlaceSoltItemsSource.Add(1);
  372. }
  373. PlaceSoltSelectedIndex = 0;
  374. break;
  375. case "Extend":
  376. ExtendSoltItemsSource.Clear();
  377. if ((int)ExtendSelectedModule == 3)
  378. {
  379. for (int i = 1; i <= 25; i++)
  380. {
  381. ExtendSoltItemsSource.Add(i);
  382. }
  383. }
  384. else
  385. {
  386. ExtendSoltItemsSource.Add(1);
  387. }
  388. ExtendSoltSelectedIndex = 0;
  389. break;
  390. case "Retract":
  391. RetractSoltItemsSource.Clear();
  392. if ((int)RetractSelectedModule == 3)
  393. {
  394. for (int i = 1; i <= 25; i++)
  395. {
  396. RetractSoltItemsSource.Add(i);
  397. }
  398. }
  399. else
  400. {
  401. RetractSoltItemsSource.Add(1);
  402. }
  403. RetractSoltSelectedIndex = 0;
  404. break;
  405. }
  406. }
  407. private void OnPick()
  408. {
  409. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  410. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
  411. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
  412. MoveItem moveItem = new MoveItem(moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, ModuleName.TMRobot, 0, selectedHand);
  413. moveItems.Enqueue(moveItem);
  414. //var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
  415. //var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
  416. if ((int)PickSelectedModule < TMModules.Count - 2)
  417. {
  418. InvokeClient.Instance.Service.DoOperation($"SETM.PMPick", moveItems);
  419. }
  420. else
  421. {
  422. InvokeClient.Instance.Service.DoOperation($"SETM.Pick", moveItems);
  423. }
  424. }
  425. private void OnPlace()
  426. {
  427. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  428. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
  429. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
  430. MoveItem moveItem = new MoveItem( ModuleName.TMRobot, 0, moduleName, PlaceSoltItemsSource[PickSoltSelectedIndex] - 1, selectedHand);
  431. moveItems.Enqueue(moveItem);
  432. if ((int)PickSelectedModule < TMModules.Count - 2)
  433. {
  434. InvokeClient.Instance.Service.DoOperation($"SETM.PMPlace", moveItems);
  435. }
  436. else
  437. {
  438. InvokeClient.Instance.Service.DoOperation($"SETM.Place", moveItems);
  439. }
  440. }
  441. private void OnExtend()
  442. {
  443. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), ExtendSelectedModule.ToString(), true);
  444. var selectedHand = (Hand)Enum.Parse(typeof(Hand), ExtendSelectedBlade.ToString(), true);
  445. InvokeClient.Instance.Service.DoOperation($"SETM.Extend", moduleName, ExtendSoltItemsSource[ExtendSoltSelectedIndex] - 1, selectedHand);
  446. }
  447. private void OnRetract()
  448. {
  449. //Queue<MoveItem> moveItems = new Queue<MoveItem>();
  450. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), RetractSelectedModule.ToString(), true);
  451. var selectedHand = (Hand)Enum.Parse(typeof(Hand), RetractSelectedBlade.ToString(), true);
  452. //MoveItem moveItem = new MoveItem(moduleName, RetractSoltItemsSource[PickSoltSelectedIndex] - 1, 0, 0, selectedHand);
  453. //moveItems.Enqueue(moveItem);
  454. InvokeClient.Instance.Service.DoOperation($"SETM.Retract", moduleName, RetractSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
  455. }
  456. //令选择的模块下发Home指令
  457. private void OnRobotHome()
  458. {
  459. InvokeClient.Instance.Service.DoOperation($"SETM.RobotHome");
  460. }
  461. #endregion
  462. #region 私有方法
  463. private void Timer_Tick(object sender, EventArgs e)
  464. {
  465. TMModuleInfo = ModuleManager.ModuleInfos["TMRobot"];
  466. if (VCE1IsInstalled)
  467. {
  468. }
  469. if (PMAIsInstalled == true)
  470. {
  471. ModuleInfo PMAModuleInfo = ModuleManager.ModuleInfos["PMA"];
  472. PMAWafer = PMAModuleInfo.WaferManager.Wafers[0];
  473. }
  474. if (PMBIsInstalled == true)
  475. {
  476. ModuleInfo PMBModuleInfo = ModuleManager.ModuleInfos["PMB"];
  477. PMBWafer = PMBModuleInfo.WaferManager.Wafers[0];
  478. }
  479. if (PMCIsInstalled == true)
  480. {
  481. ModuleInfo PMCModuleInfo = ModuleManager.ModuleInfos["PMC"];
  482. PMCWafer = PMCModuleInfo.WaferManager.Wafers[0];
  483. }
  484. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  485. VCE1DoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.VCESlitDoorClosed");
  486. PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMASlitDoorClosed");
  487. PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMBSlitDoorClosed");
  488. PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMCSlitDoorClosed");
  489. VCEOutDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "VCE1.VCEOutDoorClosed");
  490. }
  491. #endregion
  492. }
  493. }