PlatformViewModel.cs 12 KB

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