OperationViewModel2LPAB.cs 33 KB

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