OperationViewModel2LPAB.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. using Aitex.Core.Common;
  2. using Aitex.Core.UI.MVVM;
  3. using Aitex.Core.Util;
  4. using Aitex.Core.Utilities;
  5. using Aitex.Sorter.Common;
  6. using Aitex.Sorter.UI.Controls;
  7. using Aitex.Sorter.UI.Controls.Common;
  8. using EfemUI.Views.CarrierList;
  9. using MECF.Framework.Common.DataCenter;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.OperationCenter;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Collections.ObjectModel;
  15. using System.Linq;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. using System.Windows.Input;
  19. namespace Aitex.Sorter.UI.ViewModel
  20. {
  21. class OperationViewModel2LPAB : OperationMultiLPViewModel
  22. {
  23. #region CMD
  24. public ICommand StartCycleCommand { get; set; }
  25. public ICommand SetWaferSize3 { get; set; }
  26. public ICommand SetWaferSize4 { get; set; }
  27. public ICommand SetWaferSize6 { get; set; }
  28. public ICommand SetWaferSize8 { get; set; }
  29. public ICommand SetWaferThick { get; set; }
  30. public ICommand SetWaferThin { get; set; }
  31. public ICommand SetLPSlot13 { get; set; }
  32. public ICommand SetLPSlot25 { get; set; }
  33. public ICommand SetFFUCommand { get; set; }
  34. public ICommand SetTransCarrierTypeCommand { get; set; }
  35. public ICommand MapCommand { get; set; }
  36. public ICommand LoadCommand { get; set; }
  37. public ICommand UnloadCommand { get; set; }
  38. public ICommand ReadLPIDCommand { get; set; }
  39. public ICommand FlipperHomeCommand { get; set; }
  40. public ICommand FlipperResetCommand { get; set; }
  41. public ICommand FlipperAbortCommand { get; set; }
  42. public ICommand FlipperTurnOverCommand { get; set; }
  43. public ICommand FlipperGripCommand { get; set; }
  44. public ICommand FlipperUnGripCommand { get; set; }
  45. public ICommand FlipperTurnOverJogPCommand { get; set; }
  46. public ICommand FlipperTurnOverJogPStopCommand { get; set; }
  47. public ICommand FlipperTurnOverJogNCommand { get; set; }
  48. public ICommand FlipperTurnOverJogNStopCommand { get; set; }
  49. #endregion
  50. public ObservableCollection<FoupListItem> BufferList { get; set; }
  51. public bool EnablePageControl
  52. {
  53. get { return !IsOnlineMode; }
  54. }
  55. [Subscription("System.Robot.CurrentReadSpeedData")]
  56. public int CurrentReadSpeedData { get; set; }
  57. [Subscription("FFU.FFU1Speed")]
  58. public int FFU1Speed { get; set; }
  59. [Subscription("System.IsOnlineMode")]
  60. public bool IsOnlineMode
  61. {
  62. get;
  63. set;
  64. }
  65. [Subscription("LP1.WaferSizeInfo")]
  66. public string WaferSize1 { get; set; }
  67. [Subscription("LP2.WaferSizeInfo")]
  68. public string WaferSize2 { get; set; }
  69. [Subscription("Aligner1.Aligner1.WaferSizeByWafer")]
  70. public string WaferSizeAligner1 { get; set; }
  71. [Subscription("Aligner2.Aligner2.WaferSizeByWafer")]
  72. public string WaferSizeAligner2 { get; set; }
  73. [Subscription("CoolingBuffer1.CoolingBuffer1.WaferSizeByWafer")]
  74. public string WaferSizeCoolingBuffer1 { get; set; }
  75. [Subscription("CoolingBuffer2.CoolingBuffer2.WaferSizeByWafer")]
  76. public string WaferSizeCoolingBuffer2 { get; set; }
  77. [Subscription("Buffer1.WaferSizeByWafer")]
  78. public string WaferSizeBuffer1 { get; set; }
  79. [Subscription("Buffer2.WaferSizeByWafer")]
  80. public string WaferSizeBuffer2 { get; set; }
  81. [Subscription("LL1.WaferSize")]
  82. public string WaferSizeLL1 { get; set; }
  83. [Subscription("LL2.WaferSize")]
  84. public string WaferSizeLL2 { get; set; }
  85. //[Subscription("Buffer1.WaferSize")]
  86. //public string WaferSizeBuffer1 { get; set; }
  87. //[Subscription("Buffer2.WaferSize")]
  88. //public string WaferSizeBuffer2 { get; set; }
  89. [Subscription("Robot.Blade1WaferSize")]
  90. public string WaferSizeRobot1 { get; set; }
  91. [Subscription("Robot.Blade2WaferSize")]
  92. public string WaferSizeRobot2 { get; set; }
  93. [Subscription("Robot.WaferSize")]
  94. public string WaferSizeRobot { get; set; }
  95. [Subscription("LP1.WaferThickness")]
  96. public string LP1WaferThickness { get; set; }
  97. [Subscription("LP2.WaferThickness")]
  98. public string LP2WaferThickness { get; set; }
  99. [Subscription("Cooling1.WaferThickness")]
  100. public string Cooling1WaferThickness { get; set; }
  101. [Subscription("Cooling2.WaferThickness")]
  102. public string Cooling2WaferThickness { get; set; }
  103. [Subscription("LL1.WaferThickness")]
  104. public string PMAWaferThickness { get; set; }
  105. [Subscription("LL2.WaferThickness")]
  106. public string PMBWaferThickness { get; set; }
  107. [Subscription("Buffer1.WaferThickness")]
  108. public string Buffer1WaferThickness { get; set; }
  109. [Subscription("Buffer2.WaferThickness")]
  110. public string Buffer2WaferThickness { get; set; }
  111. [Subscription("Aligner1.WaferThickness")]
  112. public string Aligner1WaferThickness { get; set; }
  113. [Subscription("Aligner2.WaferThickness")]
  114. public string Aligner2WaferThickness { get; set; }
  115. [Subscription("Upper.WaferThickness")]
  116. public string UpperWaferThickness { get; set; }
  117. [Subscription("Lower.WaferThickness")]
  118. public string LowerWaferThickness { get; set; }
  119. [Subscription("LP1.ValidSlotsNumber")]
  120. public int LP1ValidSlotsNumber { get; set; }
  121. [Subscription("LP2.ValidSlotsNumber")]
  122. public int LP2ValidSlotsNumber { get; set; }
  123. [Subscription("System.IsEnableBufferMap")]
  124. public bool IsBufferMapEnable { get; set; }
  125. [Subscription("System.IsEnableIdentifyThickness")]
  126. public bool IsEnableIdentifyThickness { get; set; }
  127. [Subscription("System.IsEnableMultiWaferSize")]
  128. public bool IsEnableMultiWaferSize { get; set; }
  129. [Subscription("System.IsEnableMultiWaferSizeShow")]
  130. public bool IsEnableMultiWaferSizeShow { get; set; }
  131. [Subscription("System.IsSlotShowOpposite")]
  132. public bool IsSlotShowOpposite { get; set; }
  133. public Visibility SlotShow2 => IsSlotShowOpposite ? Visibility.Hidden : Visibility.Visible;
  134. public Visibility SlotShow1 => !IsSlotShowOpposite ? Visibility.Hidden : Visibility.Visible;
  135. public Visibility EnableIdentifyThickness
  136. {
  137. get
  138. {
  139. if (IsEnableIdentifyThickness)
  140. return Visibility.Visible;
  141. return Visibility.Hidden;
  142. }
  143. }
  144. public Visibility EnableMultiWaferSize
  145. {
  146. get
  147. {
  148. if (IsEnableMultiWaferSize && IsEnableMultiWaferSizeShow)
  149. return Visibility.Visible;
  150. return Visibility.Hidden;
  151. }
  152. }
  153. [Subscription(ParamName.ModuleWaferList, DeviceName.CoolingBuffer1)]
  154. public WaferInfo[] CoolingBuffer1Wafers
  155. {
  156. get;
  157. set;
  158. }
  159. public WaferInfo CoolingBuffer1Wafer
  160. {
  161. get => CoolingBuffer1Wafers != null ? CoolingBuffer1Wafers[0] : null;
  162. }
  163. [Subscription(ParamName.ModuleWaferList, DeviceName.CoolingBuffer2)]
  164. public WaferInfo[] CoolingBuffer2Wafers
  165. {
  166. get;
  167. set;
  168. }
  169. public WaferInfo CoolingBuffer2Wafer
  170. {
  171. get => CoolingBuffer2Wafers != null ? CoolingBuffer2Wafers[0] : null;
  172. }
  173. [Subscription(ParamName.ModuleWaferList, DeviceName.Aligner1)]
  174. public WaferInfo[] Aligner1Wafers
  175. {
  176. get;
  177. set;
  178. }
  179. public WaferInfo Aligner1Wafer
  180. {
  181. get => Aligner1Wafers != null ? Aligner1Wafers[0] : null;
  182. }
  183. [Subscription(ParamName.ModuleWaferList, DeviceName.Aligner2)]
  184. public WaferInfo[] Aligner2Wafers
  185. {
  186. get;
  187. set;
  188. }
  189. public WaferInfo Aligner2Wafer
  190. {
  191. get => Aligner2Wafers != null ? Aligner2Wafers[0] : null;
  192. }
  193. [Subscription(ParamName.ModuleWaferList, DeviceName.Buffer)]
  194. public WaferInfo[] LlbWaferInfo
  195. {
  196. get
  197. {
  198. return BufferList.Count >= 1 ? BufferList[0].WaferInfos : null;
  199. }
  200. set => UpdateBufferWafers(value, 0);
  201. }
  202. [Subscription(ParamName.ModuleWaferList, DeviceName.Buffer1)]
  203. public WaferInfo[] LlbWaferInfo1
  204. {
  205. get
  206. {
  207. return BufferList.Count >= 2 ? BufferList[1].WaferInfos : null;
  208. }
  209. set => UpdateBufferWafers(value, 1);
  210. }
  211. [Subscription(ParamName.ModuleWaferList, DeviceName.Buffer2)]
  212. public WaferInfo[] LlbWaferInfo2
  213. {
  214. get
  215. {
  216. return BufferList.Count >= 3 ? BufferList[2].WaferInfos : null;
  217. }
  218. set => UpdateBufferWafers(value, 2);
  219. }
  220. [Subscription(ParamName.ModuleWaferList, DeviceName.Flipper)]
  221. public WaferInfo[] FlipperWafers
  222. {
  223. get;
  224. set;
  225. }
  226. public WaferInfo FlipperWafer
  227. {
  228. get => FlipperWafers != null ? FlipperWafers[0] : null;
  229. }
  230. [Subscription("ValidSlotsNumber", DeviceName.Buffer)]
  231. public int ValidSlotsNum
  232. {
  233. get
  234. {
  235. return BufferList.Count >= 1 ? BufferList[0].SlotCount : 0;
  236. }
  237. set
  238. {
  239. if (BufferList.Count >= 1) BufferList[0].SlotCount = value;
  240. }
  241. }
  242. [Subscription("ValidSlotsNumber", DeviceName.Buffer1)]
  243. public int ValidSlotsNum1
  244. {
  245. get
  246. {
  247. return BufferList.Count >= 2 ? BufferList[1].SlotCount : 0;
  248. }
  249. set
  250. {
  251. if (BufferList.Count >= 2) BufferList[1].SlotCount = value;
  252. }
  253. }
  254. [Subscription("ValidSlotsNumber", DeviceName.Buffer2)]
  255. public int ValidSlotsNum2
  256. {
  257. get
  258. {
  259. return BufferList.Count >= 3 ? BufferList[2].SlotCount : 0;
  260. }
  261. set
  262. {
  263. if (BufferList.Count >= 3) BufferList[2].SlotCount = value;
  264. }
  265. }
  266. /// <summary>
  267. /// Update Buffer WaferInfos
  268. /// </summary>
  269. /// <param name="sourceWaferInfos"></param>
  270. /// <param name="index"></param>
  271. private void UpdateBufferWafers(WaferInfo[] sourceWaferInfos, int index)
  272. {
  273. WaferInfo[] wafers;
  274. if (IsSlotShowOpposite)
  275. {
  276. wafers = UpdateWaferInfo(sourceWaferInfos.ToArray());
  277. }
  278. else
  279. {
  280. wafers = UpdateWaferInfo(sourceWaferInfos.Reverse().ToArray());
  281. }
  282. if (BufferList.Count < index + 1) return;
  283. if (index == 0)
  284. {
  285. BufferList[index].IsShow = BufferEnable;
  286. }
  287. else if (index == 1)
  288. {
  289. BufferList[index].IsShow = Buffer1Enable;
  290. }
  291. else if (index == 2)
  292. {
  293. BufferList[index].IsShow = Buffer2Enable;
  294. }
  295. if (BufferList[index].WaferInfos == null)
  296. {
  297. BufferList[index].WaferInfos = wafers;
  298. }
  299. else
  300. {
  301. for (int i = 0; i < BufferList[index].WaferInfos.Length; i++)
  302. {
  303. BufferList[index].WaferInfos[i].Update(wafers[i]);
  304. }
  305. }
  306. }
  307. #region Cycle
  308. private string _cycleFrom;
  309. public string CycleFrom
  310. {
  311. get { return _cycleFrom; }
  312. set { _cycleFrom = value; }
  313. }
  314. private string _cycleTo;
  315. public string CycleTo
  316. {
  317. get { return _cycleTo; }
  318. set { _cycleTo = value; }
  319. }
  320. [IgnorePropertyChange]
  321. public bool Ll1IsChecked { get; set; }
  322. [IgnorePropertyChange]
  323. public bool Ll2IsChecked { get; set; }
  324. [IgnorePropertyChange]
  325. public bool Ll3IsChecked { get; set; }
  326. [IgnorePropertyChange]
  327. public bool Ll4IsChecked { get; set; }
  328. [IgnorePropertyChange]
  329. public bool Ll5IsChecked { get; set; }
  330. [IgnorePropertyChange]
  331. public bool Ll6IsChecked { get; set; }
  332. [IgnorePropertyChange]
  333. public bool Ll7IsChecked { get; set; }
  334. [IgnorePropertyChange]
  335. public bool Ll8IsChecked { get; set; }
  336. [IgnorePropertyChange]
  337. public bool CoolingBuffer1IsChecked { get; set; }
  338. [IgnorePropertyChange]
  339. public bool CoolingBuffer2IsChecked { get; set; }
  340. [IgnorePropertyChange]
  341. public bool Aligner1IsChecked { get; set; }
  342. [IgnorePropertyChange]
  343. public bool Aligner2IsChecked { get; set; }
  344. [IgnorePropertyChange]
  345. public bool BufferIsChecked { get; set; }
  346. [IgnorePropertyChange]
  347. public bool Buffer1IsChecked { get; set; }
  348. [IgnorePropertyChange]
  349. public bool Buffer2IsChecked { get; set; }
  350. [IgnorePropertyChange]
  351. public bool FlipperIsChecked { get; set; }
  352. #endregion
  353. #region Moudle Enable Flag
  354. [Subscription("LP1.IsEnable")]
  355. public bool LP1Enable { get; set; }
  356. [Subscription("LP2.IsEnable")]
  357. public bool LP2Enable { get; set; }
  358. [Subscription("Aligner1.IsEnable")]
  359. public bool Aligner1Enable { get; set; }
  360. [Subscription("Aligner2.IsEnable")]
  361. public bool Aligner2Enable { get; set; }
  362. [Subscription("Buffer.IsEnable")]
  363. public bool BufferEnable { get; set; }
  364. [Subscription("Buffer1.IsEnable")]
  365. public bool Buffer1Enable { get; set; }
  366. [Subscription("Buffer2.IsEnable")]
  367. public bool Buffer2Enable { get; set; }
  368. [Subscription("PMA.IsEnable")]
  369. public bool PMAEnable { get; set; }
  370. [Subscription("PMB.IsEnable")]
  371. public bool PMBEnable { get; set; }
  372. [Subscription("CoolingBuffer1.IsEnable")]
  373. public bool CoolingBuffer1Enable { get; set; }
  374. [Subscription("CoolingBuffer2.IsEnable")]
  375. public bool CoolingBuffer2Enable { get; set; }
  376. [Subscription("Flipper.IsEnable")]
  377. public bool FlipperEnable { get; set; }
  378. #endregion
  379. public Visibility ServerVisibility { get; set; }
  380. [Subscription("System.Robot.IsLeftArmPressureSensorON")]
  381. public bool IsLeftArmPressureSensorON
  382. {
  383. get; set;
  384. }
  385. [Subscription("System.Robot.IsRightArmPressureSensorON")]
  386. public bool IsRightArmPressureSensorON
  387. {
  388. get; set;
  389. }
  390. [Subscription("LP1.InfoPadCarrierTypeInformation")]
  391. public string LP1CarrierType
  392. {
  393. get => _lp1CarrierType;
  394. set => _lp1CarrierType = value;
  395. }
  396. private string _lp1CarrierType;
  397. [Subscription("LP2.InfoPadCarrierTypeInformation")]
  398. public string LP2CarrierType
  399. {
  400. get => _lp2CarrierType;
  401. set => _lp2CarrierType = value;
  402. }
  403. private string _lp2CarrierType;
  404. [Subscription("LP3.InfoPadCarrierTypeInformation")]
  405. public string LP3CarrierType
  406. {
  407. get => _lp3CarrierType;
  408. set => _lp3CarrierType = value;
  409. }
  410. private string _lp3CarrierType;
  411. [Subscription("LP1.IsAutoDetectCarrierType")]
  412. public bool LP1IsAutoDetectCarrierType { get; set; }
  413. [Subscription("LP2.IsAutoDetectCarrierType")]
  414. public bool LP2IsAutoDetectCarrierType { get; set; }
  415. [Subscription("LP3.IsAutoDetectCarrierType")]
  416. public bool LP3IsAutoDetectCarrierType { get; set; }
  417. [Subscription("LP1.ValidCarrierTypeList")]
  418. public Tuple<int, string>[] LP1ValidCarrierTypeList { get; set; }
  419. [Subscription("LP2.ValidCarrierTypeList")]
  420. public Tuple<int, string>[] LP2ValidCarrierTypeList { get; set; }
  421. [Subscription("LP3.ValidCarrierTypeList")]
  422. public Tuple<int, string>[] LP3ValidCarrierTypeList { get; set; }
  423. [Subscription("System.IsNoRunning")]
  424. public bool IsNoRunning { get; set; }
  425. [Subscription("Flipper.IsFlipperOrigin")]
  426. public bool IsOver0Degree { get; set; }
  427. [Subscription("Flipper.IsFlipperHorizontal")]
  428. public bool IsOver180Degree { get; set; }
  429. [Subscription("Flipper.ClampOpen")]
  430. public bool ClampOpen { get; set; }
  431. [Subscription("Flipper.ClampClose")]
  432. public bool ClampClose { get; set; }
  433. public bool IsShowLP1CarrierType
  434. {
  435. get
  436. { return !LP1IsAutoDetectCarrierType; }
  437. }
  438. public bool IsShowLP2CarrierType
  439. {
  440. get
  441. { return !LP2IsAutoDetectCarrierType; }
  442. }
  443. public bool IsShowLP3CarrierType
  444. {
  445. get
  446. { return !LP3IsAutoDetectCarrierType; }
  447. }
  448. public Thickness _PMThickness = new Thickness(0, 0, 0, 0);
  449. public Thickness PMThickness
  450. {
  451. get
  452. {
  453. if (!IsEnableIdentifyThickness && !IsEnableMultiWaferSize)
  454. {
  455. _PMThickness.Left = 0;
  456. _PMThickness.Top = -100;
  457. _PMThickness.Right = 0;
  458. _PMThickness.Bottom = 0;
  459. }
  460. else if (!IsEnableIdentifyThickness && IsEnableMultiWaferSize && !IsEnableMultiWaferSizeShow)
  461. {
  462. _PMThickness.Left = 0;
  463. _PMThickness.Top = -100;
  464. _PMThickness.Right = 0;
  465. _PMThickness.Bottom = 0;
  466. }
  467. else
  468. {
  469. _PMThickness.Left = 680;
  470. _PMThickness.Top = 645;
  471. _PMThickness.Right = 0;
  472. _PMThickness.Bottom = 50;
  473. }
  474. return _PMThickness;
  475. }
  476. }
  477. public Thickness _RobotThickness = new Thickness(0, 0, 0, 0);
  478. public Thickness RobotThickness
  479. {
  480. get
  481. {
  482. if (!IsEnableIdentifyThickness && !IsEnableMultiWaferSize)
  483. {
  484. _RobotThickness.Left = 0;
  485. _RobotThickness.Top = 300;
  486. _RobotThickness.Right = 0;
  487. _RobotThickness.Bottom = 0;
  488. }
  489. else if (!IsEnableIdentifyThickness && IsEnableMultiWaferSize && !IsEnableMultiWaferSizeShow)
  490. {
  491. _RobotThickness.Left = 0;
  492. _RobotThickness.Top = 300;
  493. _RobotThickness.Right = 0;
  494. _RobotThickness.Bottom = 0;
  495. }
  496. else
  497. {
  498. _RobotThickness.Left = 10;
  499. _RobotThickness.Top = 633;
  500. _RobotThickness.Right = 0;
  501. _RobotThickness.Bottom = 10;
  502. }
  503. return _RobotThickness;
  504. }
  505. }
  506. /// <summary>
  507. /// Update LoadPort WaferInfo
  508. /// </summary>
  509. /// <param name="sourceWaferInfos"></param>
  510. /// <param name="index"></param>
  511. public override void UpdateWafers(WaferInfo[] sourceWaferInfos, int index)
  512. {
  513. if (IsSlotShowOpposite)
  514. {
  515. var wafers = UpdateWaferInfo(sourceWaferInfos);
  516. if (sourceWaferInfos == null) return;
  517. if (index == 0 && FoupList[index] != null)
  518. {
  519. FoupList[index].IsShow = LP1Enable;
  520. }
  521. if (FoupList[index].WaferInfos == null)
  522. {
  523. FoupList[index].WaferInfos = wafers;
  524. }
  525. else
  526. {
  527. for (int i = 0; i < FoupList[index].WaferInfos.Length; i++)
  528. {
  529. FoupList[index].WaferInfos[i].Update(wafers[i]);
  530. }
  531. }
  532. }
  533. else
  534. {
  535. var wafers = UpdateWaferInfo(sourceWaferInfos.Reverse().ToArray());
  536. if (sourceWaferInfos == null) return;
  537. if (index == 0 && FoupList[index] != null)
  538. {
  539. FoupList[index].IsShow = LP1Enable;
  540. }
  541. if (FoupList[index].WaferInfos == null)
  542. {
  543. FoupList[index].WaferInfos = wafers;
  544. }
  545. else
  546. {
  547. for (int i = 0; i < FoupList[index].WaferInfos.Length; i++)
  548. {
  549. FoupList[index].WaferInfos[i].Update(wafers[i]);
  550. }
  551. }
  552. }
  553. }
  554. private ObservableCollection<string> _cycleItemsSource = new ObservableCollection<string>();
  555. /// <summary>
  556. /// Cycle Items Source
  557. /// </summary>
  558. public ObservableCollection<string> CycleItemsSource
  559. {
  560. get { return _cycleItemsSource; }
  561. set { _cycleItemsSource = value; }
  562. }
  563. public OperationViewModel2LPAB(int lpNum) : base(lpNum)
  564. {
  565. WaferTransferOptionCommand = new DelegateCommand<WaferTransferOption>(BeforeTransfer);
  566. SetWaferSize3 = new DelegateCommand<string>(PerformSetWaferSize3);
  567. SetWaferSize4 = new DelegateCommand<string>(PerformSetWaferSize4);
  568. SetWaferSize6 = new DelegateCommand<string>(PerformSetWaferSize6);
  569. SetWaferSize8 = new DelegateCommand<string>(PerformSetWaferSize8);
  570. SetWaferThick = new DelegateCommand<string>(PerformSetWaferThick);
  571. SetWaferThin = new DelegateCommand<string>(PerformSetWaferThin);
  572. SetLPSlot13 = new DelegateCommand<string>(PerformSetSlot13);
  573. SetLPSlot25 = new DelegateCommand<string>(PerformSetSlot25);
  574. StartCycleCommand = new DelegateCommand<object>(StartCycle);
  575. SetFFUCommand = new DelegateCommand<string>(SetFFUSpeed);
  576. MapCommand = new DelegateCommand<DependencyObject>(DoMap);
  577. LoadCommand = new DelegateCommand<DependencyObject>(DoLoad);
  578. UnloadCommand = new DelegateCommand<DependencyObject>(DoUnload);
  579. SetTransCarrierTypeCommand = new DelegateCommand<string>(SetTransCarrierType);
  580. FlipperHomeCommand = new DelegateCommand<object>(FlipperHome);
  581. FlipperResetCommand = new DelegateCommand<object>(FlipperReset);
  582. FlipperAbortCommand = new DelegateCommand<object>(FlipperAbort);
  583. FlipperTurnOverCommand = new DelegateCommand<object>(FlipperTurnOver);
  584. FlipperGripCommand = new DelegateCommand<object>(FlipperGrip);
  585. FlipperUnGripCommand = new DelegateCommand<object>(FlipperUnGrip);
  586. FlipperTurnOverJogNCommand = new DelegateCommand<object>(FlipperTurnOverJogN);
  587. FlipperTurnOverJogPCommand = new DelegateCommand<object>(FlipperTurnOverJogP);
  588. FlipperTurnOverJogPStopCommand = new DelegateCommand<object>(FlipperTurnOverJogPStop);
  589. FlipperTurnOverJogNStopCommand = new DelegateCommand<object>(FlipperTurnOverJogNStop);
  590. }
  591. protected void DoMap(DependencyObject sender)
  592. {
  593. var command = CommandHelper.GetCommandItem(sender);
  594. InvokeClient.Instance.Service.DoOperation(command.CommandName, command.Target);
  595. }
  596. protected void DoLoad(DependencyObject sender)
  597. {
  598. var command = CommandHelper.GetCommandItem(sender);
  599. InvokeClient.Instance.Service.DoOperation(command.CommandName, command.Target);
  600. }
  601. protected void DoUnload(DependencyObject sender)
  602. {
  603. var command = CommandHelper.GetCommandItem(sender);
  604. InvokeClient.Instance.Service.DoOperation(command.CommandName, command.Target);
  605. }
  606. private void SetTransCarrierType(string obj)
  607. {
  608. var LPName = obj;
  609. Tuple<int, string>[] input = null;
  610. switch (LPName)
  611. {
  612. case "LP1":
  613. input = LP1ValidCarrierTypeList;
  614. break;
  615. case "LP2":
  616. input = LP2ValidCarrierTypeList;
  617. break;
  618. case "LP3":
  619. input = LP3ValidCarrierTypeList;
  620. break;
  621. default:
  622. break;
  623. }
  624. // Tuple<int, string>[] tempTuple = new Tuple<int, string>[] { Tuple.Create(0, "CarrierType0"), Tuple.Create(1, "CarrierType1") };
  625. if (input == null)
  626. {
  627. MessageBox.Show($"{LPName}ValidCarrierTypeList is null", "Value Null");
  628. }
  629. else
  630. {
  631. var SelectCarrierTypeDialog = new SelectCarrierTypeDialog(input);
  632. if ((bool)SelectCarrierTypeDialog.ShowDialog())
  633. {
  634. InvokeClient.Instance.Service.DoOperation($"{LPName}.SetInfoPadIndex", SelectCarrierTypeDialog.SelectIndex);
  635. }
  636. }
  637. }
  638. private void SetFFUSpeed(string obj)
  639. {
  640. InvokeClient.Instance.Service.DoOperation($"FFU.SetSpeed", new object[] { obj });
  641. }
  642. private void PerformSetSlot13(string obj)
  643. {
  644. InvokeClient.Instance.Service.DoOperation("System.SetSlot13", obj);
  645. }
  646. private void PerformSetSlot25(string obj)
  647. {
  648. InvokeClient.Instance.Service.DoOperation("System.SetSlot25", obj);
  649. }
  650. private void PerformSetWaferSize8(string obj)
  651. {
  652. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize8", obj);
  653. }
  654. private void PerformSetWaferSize6(string obj)
  655. {
  656. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize6", obj);
  657. }
  658. private void PerformSetWaferSize4(string obj)
  659. {
  660. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize4", obj);
  661. }
  662. private void PerformSetWaferSize3(string obj)
  663. {
  664. InvokeClient.Instance.Service.DoOperation("System.SetWaferSize3", obj);
  665. }
  666. private void PerformSetWaferThick(string obj)
  667. {
  668. InvokeClient.Instance.Service.DoOperation("System.SetWaferThick", obj);
  669. }
  670. private void PerformSetWaferThin(string obj)
  671. {
  672. InvokeClient.Instance.Service.DoOperation("System.SetWaferThin", obj);
  673. }
  674. private void StartCycle(object obj)
  675. {
  676. if (CycleFrom == null || CycleTo == null)
  677. return;
  678. List<string> _lstPassThrough = new List<string>()
  679. {
  680. };
  681. if (Aligner1IsChecked)
  682. _lstPassThrough.Add("Aligner1");
  683. if (Aligner2IsChecked)
  684. _lstPassThrough.Add("Aligner2");
  685. if (Ll1IsChecked)
  686. _lstPassThrough.Add("LL1");
  687. if (Ll2IsChecked)
  688. _lstPassThrough.Add("LL2");
  689. if (BufferIsChecked)
  690. _lstPassThrough.Add("Buffer");
  691. if (Buffer1IsChecked)
  692. _lstPassThrough.Add("Buffer1");
  693. if (Buffer2IsChecked)
  694. _lstPassThrough.Add("Buffer2");
  695. if (CoolingBuffer1IsChecked)
  696. _lstPassThrough.Add("CoolingBuffer1");
  697. if (CoolingBuffer2IsChecked)
  698. _lstPassThrough.Add("CoolingBuffer2");
  699. if (FlipperIsChecked)
  700. _lstPassThrough.Add("Flipper");
  701. if (obj.ToString() == "Cycle")
  702. {
  703. InvokeClient.Instance.Service.DoOperation("System.StartCycle", new object[] {(string)CycleFrom,
  704. (string)CycleTo, _lstPassThrough.ToArray()
  705. });
  706. }
  707. //else if (obj.ToString() == "Benchmark")
  708. //{
  709. // InvokeClient.Instance.Service.DoOperation("Benchmark", paramsArgs);
  710. //}
  711. }
  712. public ICommand WaferTransferOptionCommand
  713. {
  714. get; set;
  715. }
  716. protected virtual void BeforeTransfer(WaferTransferOption option)
  717. {
  718. option.Setting.ShowAlign = false;
  719. option.Setting.ShowLaserMarker = false;
  720. option.Setting.ShowT7Code = false;
  721. //option.Setting.ShowBlade = false;
  722. }
  723. protected override void InitFoupList()
  724. {
  725. base.InitFoupList();
  726. if(FoupList.Count >= 1) FoupList[0].FoupType = Controls.FoupType.Loadport;
  727. if(FoupList.Count >= 2) FoupList[1].FoupType = Controls.FoupType.Loadport;
  728. InitBufferList(1);
  729. BufferList[0].FoupType = Controls.FoupType.NoButton;
  730. }
  731. protected readonly ModuleName[] bufferSet = new ModuleName[]
  732. {
  733. ModuleName.Buffer,
  734. ModuleName.Buffer1,
  735. ModuleName.Buffer2,
  736. };
  737. public void InitBufferList(int bufferCount)
  738. {
  739. BufferList = new ObservableCollection<FoupListItem>();
  740. for (var i = 0; i < bufferCount; i++)
  741. {
  742. var foupListItem = new FoupListItem
  743. {
  744. DeviceName = bufferSet[i].ToString(),
  745. CarrierName = bufferSet[i].ToString(),
  746. CarrierMode = LoadPortCarrierMode.Loader,
  747. Station = bufferSet[i],
  748. IsShow = true
  749. };
  750. BufferList.Add(foupListItem);
  751. }
  752. }
  753. protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)
  754. {
  755. //ServerVisibility = ((bool)QueryDataClient.Instance.Service.GetConfig("System.EfemServerEnable")) ? Visibility.Visible : Visibility.Hidden;
  756. //data[UIKey(UnitName.LoadportA.ToString(), ParamName.FoupDoorState)] = FoupDoorState.Close;
  757. base.InvokeBeforeUpdateProperty(data);
  758. }
  759. public void UpdateOnLoaded()
  760. {
  761. CycleItemsSource.Clear();
  762. if (!(bool)QueryDataClient.Instance.Service.GetConfig("LoadPort.LP1.Disable")) CycleItemsSource.Add("LP1");
  763. if (!(bool)QueryDataClient.Instance.Service.GetConfig("LoadPort.LP2.Disable")) CycleItemsSource.Add("LP2");
  764. }
  765. #region Flipper Operaion
  766. /// <summary>
  767. /// Flipper Home
  768. /// </summary>
  769. private void FlipperHome(object obj)
  770. {
  771. InvokeClient.Instance.Service.DoOperation("Flipper.Home");
  772. }
  773. /// <summary>
  774. /// Flipper Reset
  775. /// </summary>
  776. private void FlipperReset(object obj)
  777. {
  778. InvokeClient.Instance.Service.DoOperation("Flipper.Reset");
  779. }
  780. /// <summary>
  781. /// Flipper Abort
  782. /// </summary>
  783. private void FlipperAbort(object obj)
  784. {
  785. InvokeClient.Instance.Service.DoOperation("Flipper.Abort");
  786. }
  787. /// <summary>
  788. /// Flipper TurnOver
  789. /// </summary>
  790. private void FlipperTurnOver(object obj)
  791. {
  792. InvokeClient.Instance.Service.DoOperation("Flipper.TurnOver");
  793. }
  794. /// <summary>
  795. /// Flipper Clamp
  796. /// </summary>
  797. private void FlipperGrip(object obj)
  798. {
  799. InvokeClient.Instance.Service.DoOperation("Flipper.Clamp");
  800. }
  801. /// <summary>
  802. /// Flipper UnClamp
  803. /// </summary>
  804. private void FlipperUnGrip(object obj)
  805. {
  806. InvokeClient.Instance.Service.DoOperation("Flipper.UnClamp");
  807. }
  808. /// <summary>
  809. /// Flipper TurnOverJog+
  810. /// </summary>
  811. private void FlipperTurnOverJogP(object obj)
  812. {
  813. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurn", "P");
  814. }
  815. /// <summary>
  816. /// Flipper TurnOverJog+ Stop
  817. /// </summary>
  818. private void FlipperTurnOverJogPStop(object obj)
  819. {
  820. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurnStop", "P");
  821. }
  822. /// <summary>
  823. /// Flipper TurnOverJog-
  824. /// </summary>
  825. private void FlipperTurnOverJogN(object obj)
  826. {
  827. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurn", "N");
  828. }
  829. /// <summary>
  830. /// Flipper TurnOverJog- Stop
  831. /// </summary>
  832. private void FlipperTurnOverJogNStop(object obj)
  833. {
  834. InvokeClient.Instance.Service.DoOperation("Flipper.manualTurnStop", "N");
  835. }
  836. #endregion
  837. }
  838. }