PlatformViewModel.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. using Aitex.Core.Common;
  2. using Aitex.Core.Common.DeviceData;
  3. using MECF.Framework.Common.DataCenter;
  4. using MECF.Framework.Common.OperationCenter;
  5. using Prism.Commands;
  6. using Prism.Mvvm;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows;
  13. using System.Windows.Threading;
  14. using Venus_Core;
  15. using WPF.Themes.UserControls;
  16. namespace Venus_MainPages.ViewModels
  17. {
  18. public class PlatformViewModel : BindableBase
  19. {
  20. #region 私有字段
  21. private bool m_LoadLockDoorIsOpen;
  22. private bool m_LoadLockPumpValveIsOpen;
  23. private bool m_LoadLockVentValveIsOpen;
  24. private bool m_IsATM;
  25. private string ModuleName="PMA";
  26. private List<string> m_RtDataKeys=new List<string> ();
  27. private Dictionary<string, object> m_RtDataValues=new Dictionary<string, object> ();
  28. private bool m_PumpIsOpen;
  29. private int m_PurgeCounter;
  30. private Visibility m_PMAWaferIsVisibility;
  31. private Visibility m_LLAWaferIsVisibility;
  32. private PMState m_PMCurrentState;
  33. private WaferInfo m_LoadLockWafer;
  34. private WaferInfo m_PMWafer;
  35. private AITSensorData m_WaferInPosSensor;
  36. #endregion
  37. #region 属性
  38. public AITSensorData WaferInPosSensor
  39. {
  40. get { return m_WaferInPosSensor; }
  41. set
  42. {
  43. if (m_WaferInPosSensor?.Value != value.Value)
  44. {
  45. if (value.Value == true && LLAWaferIsVisibility==Visibility.Collapsed)
  46. {
  47. InvokeClient.Instance.Service.DoOperation("CreateWafer", "LLA", 0);
  48. }
  49. else if(value.Value == false && LLAWaferIsVisibility == Visibility.Visible)
  50. {
  51. InvokeClient.Instance.Service.DoOperation("DeleteWafer", "LLA", 0);
  52. }
  53. }
  54. SetProperty(ref m_WaferInPosSensor, value);
  55. }
  56. }
  57. public WaferInfo LoadLockWafer
  58. {
  59. get { return m_LoadLockWafer; }
  60. set { SetProperty(ref m_LoadLockWafer, value); }
  61. }
  62. public WaferInfo PMWafer
  63. {
  64. get { return m_PMWafer; }
  65. set { SetProperty(ref m_PMWafer, value); }
  66. }
  67. public bool LoadLockDoorIsOpen
  68. {
  69. get { return m_LoadLockDoorIsOpen; }
  70. set { SetProperty(ref m_LoadLockDoorIsOpen, value); }
  71. }
  72. public bool LoadLockPumpValveIsOpen
  73. {
  74. get { return m_LoadLockPumpValveIsOpen; }
  75. set { SetProperty(ref m_LoadLockPumpValveIsOpen, value); }
  76. }
  77. public bool LoadLockVentValveIsOpen
  78. {
  79. get { return m_LoadLockVentValveIsOpen; }
  80. set { SetProperty(ref m_LoadLockVentValveIsOpen, value); }
  81. }
  82. public bool IsATM
  83. {
  84. get { return m_IsATM; }
  85. set { SetProperty(ref m_IsATM, value); }
  86. }
  87. public Dictionary<string, object> RtDataValues
  88. {
  89. get { return m_RtDataValues; }
  90. set { SetProperty(ref m_RtDataValues, value); }
  91. }
  92. public bool PumpIsOpen
  93. {
  94. get { return m_PumpIsOpen; }
  95. set { SetProperty(ref m_PumpIsOpen, value); }
  96. }
  97. public int PurgeCounter
  98. {
  99. get { return m_PurgeCounter; }
  100. set { SetProperty(ref m_PurgeCounter, value); }
  101. }
  102. public Visibility PMAWaferIsVisibility
  103. {
  104. get { return m_PMAWaferIsVisibility; }
  105. set { SetProperty(ref m_PMAWaferIsVisibility, value); }
  106. }
  107. public Visibility LLAWaferIsVisibility
  108. {
  109. get { return m_LLAWaferIsVisibility; }
  110. set { SetProperty(ref m_LLAWaferIsVisibility, value); }
  111. }
  112. public PMState PMCurrentState
  113. {
  114. get { return m_PMCurrentState; }
  115. set { SetProperty(ref m_PMCurrentState, value); }
  116. }
  117. #endregion
  118. #region 命令
  119. private DelegateCommand _PurgeCommand;
  120. public DelegateCommand PurgeCommand =>
  121. _PurgeCommand ?? (_PurgeCommand = new DelegateCommand(OnPurge));
  122. private DelegateCommand _VentCommand;
  123. public DelegateCommand VentCommand =>
  124. _VentCommand ?? (_VentCommand = new DelegateCommand(OnVent));
  125. private DelegateCommand _PumpCommand;
  126. public DelegateCommand PumpCommand =>
  127. _PumpCommand ?? (_PumpCommand = new DelegateCommand(OnPump));
  128. private DelegateCommand _OpenPumpCommand;
  129. public DelegateCommand OpenPumpCommand =>
  130. _OpenPumpCommand ?? (_OpenPumpCommand = new DelegateCommand(OnOpenPump));
  131. private DelegateCommand _ClosePumpCommand;
  132. public DelegateCommand ClosePumpCommand =>
  133. _ClosePumpCommand ?? (_ClosePumpCommand = new DelegateCommand(OnClosePump));
  134. private DelegateCommand _OpenDoorCommand;
  135. public DelegateCommand OpenDoorCommand =>
  136. _OpenDoorCommand ?? (_OpenDoorCommand = new DelegateCommand(OnOpenDoor));
  137. private DelegateCommand _CloseDoorCommand;
  138. public DelegateCommand CloseDoorCommand =>
  139. _CloseDoorCommand ?? (_CloseDoorCommand = new DelegateCommand(OnCloseDoor));
  140. private DelegateCommand _NewWaferCommand;
  141. public DelegateCommand NewWaferCommand =>
  142. _NewWaferCommand ?? (_NewWaferCommand = new DelegateCommand(OnNewWafer));
  143. private DelegateCommand _DeleteWaferCommand;
  144. public DelegateCommand DeleteWaferCommand =>
  145. _DeleteWaferCommand ?? (_DeleteWaferCommand = new DelegateCommand(OnDeleteWafer));
  146. private DelegateCommand _PlaceWaferCommand;
  147. public DelegateCommand PlaceWaferCommand =>
  148. _PlaceWaferCommand ?? (_PlaceWaferCommand = new DelegateCommand(OnPlaceWafer));
  149. private DelegateCommand _MoveWaferCommand;
  150. public DelegateCommand MoveWaferCommand =>
  151. _MoveWaferCommand ?? (_MoveWaferCommand = new DelegateCommand(OnMoveWafer));
  152. #endregion
  153. #region 构造函数
  154. public PlatformViewModel()
  155. {
  156. //m_PMAWaferIsVisibility = Visibility.Collapsed;
  157. //m_IsATM = true;
  158. //var test = RTData.GetRTData().RtDataValues;
  159. addDataKeys();
  160. DispatcherTimer timer = new DispatcherTimer();
  161. timer.Interval = TimeSpan.FromSeconds(0.5);
  162. timer.Tick += timer_Tick;
  163. timer.Start();
  164. }
  165. #endregion
  166. #region 命令方法
  167. private void OnPump()
  168. {
  169. if (PMCurrentState == PMState.PumpingLoadLock)
  170. {
  171. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  172. }
  173. else
  174. {
  175. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.PumpLoadLock");
  176. }
  177. }
  178. private void OnPurge()
  179. {
  180. if (PMCurrentState == PMState.PurgingLoadLock)
  181. {
  182. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  183. }
  184. else
  185. {
  186. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.PurgeLoadLock");
  187. }
  188. }
  189. private void OnVent()
  190. {
  191. if (PMCurrentState == PMState.VentingLoadLock)
  192. {
  193. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  194. }
  195. else
  196. {
  197. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.VentLoadLock");
  198. }
  199. }
  200. private void OnOpenPump()
  201. {
  202. if (RtDataValues[$"{ModuleName}.FsmState"].ToString() == "LaunchingPump")
  203. {
  204. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  205. return;
  206. }
  207. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.StartPump");
  208. }
  209. private void OnClosePump()
  210. {
  211. //InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  212. }
  213. private void OnOpenDoor()
  214. {
  215. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetSlitDoor",true);
  216. }
  217. private void OnCloseDoor()
  218. {
  219. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetSlitDoor",false);
  220. }
  221. private void OnNewWafer()
  222. {
  223. //if (WaferIsVisibility != Visibility.Visible)
  224. //{
  225. // WaferIsVisibility = Visibility.Visible;
  226. //}
  227. //else
  228. //{
  229. // WPFMessageBox.ShowInformation("晶圆已创建");
  230. //}
  231. InvokeClient.Instance.Service.DoOperation("CreateWafer", "PMA", 0);
  232. }
  233. private void OnDeleteWafer()
  234. {
  235. //WaferIsVisibility = Visibility.Collapsed;
  236. InvokeClient.Instance.Service.DoOperation("DeleteWafer", "PMA", 0);
  237. }
  238. private void OnPlaceWafer()
  239. {
  240. if (PMCurrentState == PMState.LLPlacing)
  241. {
  242. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  243. return;
  244. }
  245. else
  246. {
  247. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.LLPlace}");
  248. }
  249. }
  250. private void OnMoveWafer()
  251. {
  252. if (PMCurrentState == PMState.LLPicking)
  253. {
  254. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.Abort}");
  255. return;
  256. }
  257. else
  258. {
  259. InvokeClient.Instance.Service.DoOperation($"{ModuleName}.{RtOperation.LLPick}");
  260. }
  261. }
  262. #endregion
  263. #region 私有方法
  264. void timer_Tick(object sender, EventArgs e)
  265. {
  266. RtDataValues = QueryDataClient.Instance.Service.PollData(m_RtDataKeys);
  267. LoadLockPumpValveIsOpen = (bool)RtDataValues[$"{ModuleName}.ValveLoadlockPumping.IsOpen"];
  268. LoadLockVentValveIsOpen = (bool)RtDataValues[$"{ModuleName}.ValveLoadlockVent.IsOpen"];
  269. PumpIsOpen = (bool)RtDataValues[$"{ModuleName}.PumpIsRunning"];
  270. PurgeCounter=(int)RtDataValues[$"{ModuleName}.LoadLockPurge.PurgeCounter"];
  271. //var PMAwaferInfo = (WaferInfo[])RtDataValues[$"PMA.ModuleWaferList"];
  272. //var LLAwaferInfo = (WaferInfo[])RtDataValues[$"LLA.ModuleWaferList"];
  273. LoadLockWafer= ((WaferInfo[])RtDataValues[$"LLA.ModuleWaferList"])[0];
  274. PMWafer= ((WaferInfo[])RtDataValues[$"PMA.ModuleWaferList"])[0];
  275. PMAWaferIsVisibility = (bool)RtDataValues[$"PMA.HasWafer"] ==true ? Visibility.Visible : Visibility.Collapsed;
  276. LLAWaferIsVisibility = (bool)RtDataValues[$"LLA.HasWafer"] == true ? Visibility.Visible : Visibility.Collapsed;
  277. PMCurrentState= (PMState)Enum.Parse(typeof(PMState), RtDataValues[$"{ModuleName}.FsmState"].ToString());
  278. WaferInPosSensor = (AITSensorData)RtDataValues[$"{ModuleName}.SensorSmallWaferInPos"];
  279. }
  280. private void addConfigKeys()
  281. {
  282. }
  283. private void addDataKeys()
  284. {
  285. m_RtDataKeys.Add($"{ModuleName}.FsmState");
  286. m_RtDataKeys.Add($"{ModuleName}.ValveLoadlockPumping.IsOpen");
  287. m_RtDataKeys.Add($"{ModuleName}.ValveLoadlockVent.IsOpen");
  288. m_RtDataKeys.Add($"{ModuleName}.PumpIsRunning");
  289. m_RtDataKeys.Add($"{ModuleName}.LoadLockPurge.PurgeCounter");
  290. m_RtDataKeys.Add($"{ModuleName}.IsSlitDoorClosed");
  291. m_RtDataKeys.Add($"{ModuleName}.LoadlockPressure");
  292. m_RtDataKeys.Add($"{ModuleName}.IsATMLoadlock");
  293. m_RtDataKeys.Add($"{ModuleName}.IsVACLoadlock");
  294. m_RtDataKeys.Add($"PMA.HasWafer");
  295. m_RtDataKeys.Add($"PMA.ModuleWaferList");
  296. m_RtDataKeys.Add($"LLA.HasWafer");
  297. m_RtDataKeys.Add($"LLA.ModuleWaferList");
  298. m_RtDataKeys.Add($"{ModuleName}.SensorSmallWaferInPos");
  299. }
  300. #endregion
  301. }
  302. }