SeTMViewModel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  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 bool VCE1DoorIsOpen
  85. {
  86. get => m_VCE1DoorIsOpen;
  87. set
  88. {
  89. SetProperty(ref m_VCE1DoorIsOpen,value);
  90. }
  91. }
  92. public bool PMCDoorIsOpen
  93. {
  94. get => m_PMCDoorIsOpen;
  95. set
  96. {
  97. SetProperty(ref m_PMCDoorIsOpen, value);
  98. }
  99. }
  100. public bool PMADoorIsOpen
  101. {
  102. get { return m_PMADoorIsOpen; }
  103. set { SetProperty(ref m_PMADoorIsOpen, value); }
  104. }
  105. public bool PMBDoorIsOpen
  106. {
  107. get { return m_PMBDoorIsOpen; }
  108. set { SetProperty(ref m_PMBDoorIsOpen, value); }
  109. }
  110. public ModuleInfo VCE1ModuleInfo
  111. {
  112. get { return m_VCE1ModuleInfo; }
  113. set
  114. {
  115. SetProperty(ref m_VCE1ModuleInfo, value);
  116. }
  117. }
  118. public ModuleInfo AlignerModuleInfo
  119. {
  120. get { return m_AlignerModuleInfo; }
  121. set
  122. {
  123. SetProperty(ref m_AlignerModuleInfo, value);
  124. }
  125. }
  126. public Dictionary<string, object> RtDataValues
  127. {
  128. get { return m_RtDataValues; }
  129. set { SetProperty(ref m_RtDataValues, value); }
  130. }
  131. public bool VCEOutDoorIsOpen { get => m_VCEOutDoorIsOpen; set => SetProperty(ref m_VCEOutDoorIsOpen, value); }
  132. public bool PMAIsInstalled
  133. {
  134. get { return m_PMAIsInstalled; }
  135. set { SetProperty(ref m_PMAIsInstalled, value); }
  136. }
  137. public bool PMBIsInstalled
  138. {
  139. get { return m_PMBIsInstalled; }
  140. set { SetProperty(ref m_PMBIsInstalled, value); }
  141. }
  142. public bool PMCIsInstalled
  143. {
  144. get { return m_PMCIsInstalled; }
  145. set { SetProperty(ref m_PMCIsInstalled, value); }
  146. }
  147. public bool VCE1IsInstalled
  148. {
  149. get { return m_VCE1IsInstalled; }
  150. set { SetProperty(ref m_VCE1IsInstalled, value); }
  151. }
  152. public bool AlignerIsInstalled
  153. {
  154. get { return m_AlignerIsInstalled; }
  155. set { SetProperty(ref m_AlignerIsInstalled, value); }
  156. }
  157. public List<SeTMModule> TMModules
  158. {
  159. get { return m_TMModules; }
  160. set { SetProperty(ref m_TMModules, value); }
  161. }
  162. //Module属性
  163. public SeTMModule PickSelectedModule
  164. {
  165. get { return m_PickSelectedModule; }
  166. set { SetProperty(ref m_PickSelectedModule, value); }
  167. }
  168. public SeTMModule PlaceSelectedModule
  169. {
  170. get { return m_PlaceSelectedModule; }
  171. set { SetProperty(ref m_PlaceSelectedModule, value); }
  172. }
  173. public SeTMModule ExtendSelectedModule
  174. {
  175. get { return m_ExtendSelectedModule; }
  176. set { SetProperty(ref m_ExtendSelectedModule, value); }
  177. }
  178. public SeTMModule RetractSelectedModule
  179. {
  180. get { return m_RetractSelectedModule; }
  181. set { SetProperty(ref m_RetractSelectedModule, value); }
  182. }
  183. public ModuleInfo TMModuleInfo
  184. {
  185. get { return m_TMModuleInfo; }
  186. set
  187. {
  188. SetProperty(ref m_TMModuleInfo, value);
  189. }
  190. }
  191. //Blade属性
  192. public SeTMBlade PickSelectedBlade
  193. {
  194. get { return m_PickSelectedBlade; }
  195. set { SetProperty(ref m_PickSelectedBlade, value); }
  196. }
  197. public SeTMBlade PlaceSelectedBlade
  198. {
  199. get { return m_PlaceSelectedBlade; }
  200. set { SetProperty(ref m_PlaceSelectedBlade, value); }
  201. }
  202. public SeTMBlade ExtendSelectedBlade
  203. {
  204. get { return m_ExtendSelectedBlade; }
  205. set { SetProperty(ref m_ExtendSelectedBlade, value); }
  206. }
  207. public SeTMBlade RetractSelectedBlade
  208. {
  209. get { return m_RetractSelectedBlade; }
  210. set { SetProperty(ref m_RetractSelectedBlade, value); }
  211. }
  212. public ObservableCollection<int> PickSoltItemsSource
  213. {
  214. get { return m_PickSoltItemsSource; }
  215. set { SetProperty(ref m_PickSoltItemsSource, value); }
  216. }
  217. public ObservableCollection<int> PlaceSoltItemsSource
  218. {
  219. get { return m_PlaceSoltItemsSource; }
  220. set { SetProperty(ref m_PlaceSoltItemsSource, value); }
  221. }
  222. public ObservableCollection<int> ExtendSoltItemsSource
  223. {
  224. get { return m_ExtendSoltItemsSource; }
  225. set { SetProperty(ref m_ExtendSoltItemsSource, value); }
  226. }
  227. public ObservableCollection<int> RetractSoltItemsSource
  228. {
  229. get { return m_RetractSoltItemsSource; }
  230. set { SetProperty(ref m_RetractSoltItemsSource, value); }
  231. }
  232. public int PickSoltSelectedIndex
  233. {
  234. get { return m_PickSoltSelectedIndex; }
  235. set { SetProperty(ref m_PickSoltSelectedIndex, value); }
  236. }
  237. public int PlaceSoltSelectedIndex
  238. {
  239. get { return m_PlaceSoltSelectedIndex; }
  240. set { SetProperty(ref m_PlaceSoltSelectedIndex, value); }
  241. }
  242. public int ExtendSoltSelectedIndex
  243. {
  244. get { return m_ExtendSoltSelectedIndex; }
  245. set { SetProperty(ref m_ExtendSoltSelectedIndex, value); }
  246. }
  247. public int RetractSoltSelectedIndex
  248. {
  249. get { return m_RetractSoltSelectedIndex; }
  250. set { SetProperty(ref m_RetractSoltSelectedIndex, value); }
  251. }
  252. #endregion
  253. #region 命令
  254. //模块下拉框选择命令
  255. private DelegateCommand<object> _ModuleChangeCommand;
  256. public DelegateCommand<object> ModuleChangeCommand =>
  257. _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange));
  258. //Pick按钮命令
  259. private DelegateCommand _PickCommand;
  260. public DelegateCommand PickCommand =>
  261. _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick));
  262. //Place按钮命令
  263. private DelegateCommand _PlaceCommand;
  264. public DelegateCommand PlaceCommand =>
  265. _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace));
  266. //Extend按钮命令
  267. private DelegateCommand _ExtendCommand;
  268. public DelegateCommand ExtendCommand =>
  269. _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend));
  270. //Retract按钮命令
  271. private DelegateCommand _RetractCommand;
  272. public DelegateCommand RetractCommand =>
  273. _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract));
  274. //RobotHome按钮命令
  275. public DelegateCommand _RobotHomeCommand;
  276. public DelegateCommand RobotHomeCommand =>
  277. _RobotHomeCommand ?? (_RobotHomeCommand = new DelegateCommand(OnRobotHome));
  278. #endregion
  279. #region 构造函数
  280. public SeTMViewModel()
  281. {
  282. string allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString();
  283. PMAIsInstalled = allModules.Contains("PMA");
  284. PMBIsInstalled = allModules.Contains("PMB");
  285. PMCIsInstalled = allModules.Contains("PMC");
  286. VCE1IsInstalled = allModules.Contains("VCE1");
  287. AlignerIsInstalled = allModules.Contains("VPA");
  288. if (PMAIsInstalled == true)
  289. {
  290. TMModules.Add(SeTMModule.PMA);
  291. }
  292. if (PMBIsInstalled == true)
  293. {
  294. TMModules.Add(SeTMModule.PMB);
  295. }
  296. if (PMCIsInstalled == true)
  297. {
  298. TMModules.Add(SeTMModule.PMC);
  299. }
  300. if (VCE1IsInstalled == true)
  301. {
  302. TMModules.Add(SeTMModule.VCE1);
  303. }
  304. if (AlignerIsInstalled == true)
  305. {
  306. TMModules.Add(SeTMModule.Aligner);
  307. }
  308. PickSoltItemsSource.Add(1);
  309. PlaceSoltItemsSource.Add(1);
  310. ExtendSoltItemsSource.Add(1);
  311. RetractSoltItemsSource.Add(1);
  312. addDataKeys();
  313. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  314. VCE1DoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.VCESlitDoorClosed");
  315. PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMASlitDoorClosed");
  316. PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMBSlitDoorClosed");
  317. PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMCSlitDoorClosed");
  318. VCEOutDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "VCE1.VCEOutDoorClosed");
  319. DispatcherTimer timer = new DispatcherTimer();
  320. timer.Interval = TimeSpan.FromSeconds(0.5);
  321. timer.Tick += Timer_Tick;
  322. timer.Start();
  323. }
  324. #endregion
  325. #region 命令方法
  326. private void addDataKeys()
  327. {
  328. m_RtDataKeys.Add($"SETM.VCESlitDoorClosed");
  329. m_RtDataKeys.Add($"SETM.PMASlitDoorClosed");
  330. m_RtDataKeys.Add($"SETM.PMBSlitDoorClosed");
  331. m_RtDataKeys.Add($"SETM.PMCSlitDoorClosed");
  332. m_RtDataKeys.Add($"VCE1.VCEOutDoorClosed");
  333. }
  334. //模块选择根据obj选择下拉框内容
  335. private void OnModuleChange(object obj)
  336. {
  337. var value = obj.ToString();
  338. switch (value)
  339. {
  340. case "Pick":
  341. PickSoltItemsSource.Clear();
  342. if ((int)PickSelectedModule == 3)
  343. {
  344. for (int i = 1; i <= 25; i++)
  345. {
  346. PickSoltItemsSource.Add(i);
  347. }
  348. }
  349. else
  350. {
  351. PickSoltItemsSource.Add(1);
  352. }
  353. PickSoltSelectedIndex = 0;
  354. break;
  355. case "Place":
  356. PlaceSoltItemsSource.Clear();
  357. if ((int)PlaceSelectedModule == 3)
  358. {
  359. for (int i = 1; i <= 25; i++)
  360. {
  361. PlaceSoltItemsSource.Add(i);
  362. }
  363. }
  364. else
  365. {
  366. PlaceSoltItemsSource.Add(1);
  367. }
  368. PlaceSoltSelectedIndex = 0;
  369. break;
  370. case "Extend":
  371. ExtendSoltItemsSource.Clear();
  372. if ((int)ExtendSelectedModule == 3)
  373. {
  374. for (int i = 1; i <= 25; i++)
  375. {
  376. ExtendSoltItemsSource.Add(i);
  377. }
  378. }
  379. else
  380. {
  381. ExtendSoltItemsSource.Add(1);
  382. }
  383. ExtendSoltSelectedIndex = 0;
  384. break;
  385. case "Retract":
  386. RetractSoltItemsSource.Clear();
  387. if ((int)RetractSelectedModule == 3)
  388. {
  389. for (int i = 1; i <= 25; i++)
  390. {
  391. RetractSoltItemsSource.Add(i);
  392. }
  393. }
  394. else
  395. {
  396. RetractSoltItemsSource.Add(1);
  397. }
  398. RetractSoltSelectedIndex = 0;
  399. break;
  400. }
  401. }
  402. private void OnPick()
  403. {
  404. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  405. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
  406. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
  407. MoveItem moveItem = new MoveItem(moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, ModuleName.TMRobot, 0, selectedHand);
  408. moveItems.Enqueue(moveItem);
  409. //var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
  410. //var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
  411. if ((int)PickSelectedModule < TMModules.Count - 2)
  412. {
  413. InvokeClient.Instance.Service.DoOperation($"SETM.PMPick", moveItems);
  414. }
  415. else
  416. {
  417. InvokeClient.Instance.Service.DoOperation($"SETM.Pick", moveItems);
  418. }
  419. }
  420. private void OnPlace()
  421. {
  422. Queue<MoveItem> moveItems = new Queue<MoveItem>();
  423. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
  424. var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
  425. MoveItem moveItem = new MoveItem( ModuleName.TMRobot, 0, moduleName, PlaceSoltItemsSource[PickSoltSelectedIndex] - 1, selectedHand);
  426. moveItems.Enqueue(moveItem);
  427. if ((int)PickSelectedModule < TMModules.Count - 2)
  428. {
  429. InvokeClient.Instance.Service.DoOperation($"SETM.PMPlace", moveItems);
  430. }
  431. else
  432. {
  433. InvokeClient.Instance.Service.DoOperation($"SETM.Place", moveItems);
  434. }
  435. }
  436. private void OnExtend()
  437. {
  438. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), ExtendSelectedModule.ToString(), true);
  439. var selectedHand = (Hand)Enum.Parse(typeof(Hand), ExtendSelectedBlade.ToString(), true);
  440. InvokeClient.Instance.Service.DoOperation($"SETM.Extend", moduleName, ExtendSoltItemsSource[ExtendSoltSelectedIndex] - 1, selectedHand);
  441. }
  442. private void OnRetract()
  443. {
  444. //Queue<MoveItem> moveItems = new Queue<MoveItem>();
  445. var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), RetractSelectedModule.ToString(), true);
  446. var selectedHand = (Hand)Enum.Parse(typeof(Hand), RetractSelectedBlade.ToString(), true);
  447. //MoveItem moveItem = new MoveItem(moduleName, RetractSoltItemsSource[PickSoltSelectedIndex] - 1, 0, 0, selectedHand);
  448. //moveItems.Enqueue(moveItem);
  449. InvokeClient.Instance.Service.DoOperation($"SETM.Retract", moduleName, RetractSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
  450. }
  451. //令选择的模块下发Home指令
  452. private void OnRobotHome()
  453. {
  454. InvokeClient.Instance.Service.DoOperation($"SETM.RobotHome");
  455. }
  456. #endregion
  457. #region 私有方法
  458. private void Timer_Tick(object sender, EventArgs e)
  459. {
  460. TMModuleInfo = ModuleManager.ModuleInfos["TMRobot"];
  461. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  462. VCE1DoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.VCESlitDoorClosed");
  463. PMADoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMASlitDoorClosed");
  464. PMBDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMBSlitDoorClosed");
  465. PMCDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "SETM.PMCSlitDoorClosed");
  466. VCEOutDoorIsOpen = !CommonFunction.GetValue<bool>(RtDataValues, "VCE1.VCEOutDoorClosed");
  467. }
  468. #endregion
  469. }
  470. }