RorzeEfemHandler.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Sorter.Common;
  4. using MECF.Framework.Common.Communications;
  5. using MECF.Framework.Common.Device.Bases;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using Aitex.Core.RT.Device;
  11. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Efems.Rorzes
  12. {
  13. public abstract class RorzeEfemHandler : HandlerBase
  14. {
  15. public static Dictionary<string, ModuleName> ParameterModuleMap = new Dictionary<string, ModuleName>()
  16. {
  17. {"SYSTEM", ModuleName.System},
  18. {"ROB", ModuleName.EfemRobot},
  19. {"P1", ModuleName.LP1},
  20. {"P2", ModuleName.LP2},
  21. {"P3", ModuleName.LP3},
  22. {"P4", ModuleName.LP4},
  23. {"LLA", ModuleName.LL1},
  24. {"LLB", ModuleName.LL2},
  25. {"BF1", ModuleName.Buffer},
  26. };
  27. public RorzeEfem Device { get; }
  28. public ModuleName Module
  29. {
  30. get { return _module; }
  31. }
  32. private ModuleName _module;
  33. private RorzeEfemMessageType _type;
  34. private RorzeEfemBasicMessage _basicMessage;
  35. private string _parameter;
  36. private bool _waitInfo;
  37. protected RorzeEfemHandler(RorzeEfem device, ModuleName module,
  38. RorzeEfemMessageType type, RorzeEfemBasicMessage basicMessage, string parameter, bool waitInfo)
  39. : base(BuildMessage(type, basicMessage, parameter))
  40. {
  41. Device = device;
  42. _module = module;
  43. _waitInfo = waitInfo;
  44. _basicMessage = basicMessage;
  45. _parameter = parameter;
  46. _type = type;
  47. }
  48. public static string BuildMessage(RorzeEfemMessageType type, RorzeEfemBasicMessage basicMessage, string parameter)
  49. {
  50. return string.IsNullOrEmpty(parameter) ? $"{type}:{basicMessage};\r" : $"{type}:{basicMessage}/{parameter};\r";
  51. }
  52. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  53. {
  54. transactionComplete = false;
  55. RorzeEfemMessage message = baseMessage as RorzeEfemMessage;
  56. if (!MatchMessage(message))
  57. return false;
  58. if (message.MessageType == RorzeEfemMessageType.ACK)
  59. {
  60. OnAcked();
  61. if (!_waitInfo)
  62. {
  63. OnComplete();
  64. transactionComplete = true;
  65. }
  66. return true;
  67. }
  68. if (message.MessageType == RorzeEfemMessageType.INF)
  69. {
  70. transactionComplete = true;
  71. ProceedInfo(message);
  72. OnComplete();
  73. }
  74. if (message.MessageType == RorzeEfemMessageType.ABS)
  75. {
  76. transactionComplete = true;
  77. ProceedAbs(message);
  78. OnComplete();
  79. }
  80. if (message.MessageType == RorzeEfemMessageType.NAK)
  81. {
  82. transactionComplete = true;
  83. ProceedNak(message);
  84. OnComplete();
  85. }
  86. if (message.MessageType == RorzeEfemMessageType.CAN)
  87. {
  88. transactionComplete = true;
  89. ProceedCancel(message);
  90. OnComplete();
  91. }
  92. if(message.MessageType == RorzeEfemMessageType.EVT)
  93. {
  94. transactionComplete = true;
  95. ProceedEvent(message);
  96. }
  97. return true;
  98. }
  99. protected virtual void ProceedNak(RorzeEfemMessage message)
  100. {
  101. Device.NoteCancel(Module, $"Can not {Name}, " + RorzeEfemAbsError.GetError(message.NakFactor));
  102. }
  103. protected virtual void ProceedCancel(RorzeEfemMessage message)
  104. {
  105. Device.NoteCancel(Module, $"Can not {Name}, " + RorzeEfemAbsError.GetError(message.CanError));
  106. }
  107. protected virtual void ProceedAbs(RorzeEfemMessage message)
  108. {
  109. Device.NoteFailed(Module, $"Failed {Name}, " + RorzeEfemAbsError.GetError(message.AbsError));
  110. }
  111. protected virtual bool ProceedInfo(RorzeEfemMessage msg)
  112. {
  113. Device.NoteComplete(Module);
  114. return true;
  115. }
  116. protected virtual bool ProceedEvent(RorzeEfemMessage msg)
  117. {
  118. if (msg.IsEvent && ConvertParameterToModule(msg.MessagePart[2], out ModuleName target))
  119. {
  120. if(msg.MessagePart[1] == "MAPDT")
  121. Device.NoteWaferMapResult(target, msg.MessagePart[3]);
  122. else
  123. Device.NoteStateEvent(target, msg.MessagePart[3], msg.MessagePart[4]);
  124. }
  125. return true;
  126. }
  127. protected bool MatchMessage(RorzeEfemMessage msg)
  128. {
  129. if (msg.BasicMessage != _basicMessage || !msg.Parameter.Contains(_parameter))
  130. return false;
  131. return true;
  132. }
  133. public static string ConvertModuleToParameter(ModuleName module)
  134. {
  135. if (ParameterModuleMap.Values.Contains(module))
  136. {
  137. foreach (var moduleName in ParameterModuleMap)
  138. {
  139. if (moduleName.Value == module)
  140. return moduleName.Key;
  141. }
  142. }
  143. return "";
  144. }
  145. public static bool ConvertParameterToModule(string parameter, out ModuleName module)
  146. {
  147. if (ParameterModuleMap.ContainsKey(parameter))
  148. {
  149. module = ParameterModuleMap[parameter];
  150. return true;
  151. }
  152. module = ModuleName.System;
  153. return false;
  154. }
  155. }
  156. //READY
  157. public class RorzeEfemHandlerReady : RorzeEfemHandler
  158. {
  159. public RorzeEfemHandlerReady(RorzeEfem device, ModuleName module)
  160. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.READY, ConvertModuleToParameter(module), true)
  161. {
  162. Name = $"Ready {module}";
  163. MutexId = -1;
  164. }
  165. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  166. {
  167. Device.NoteCommunicationReady();
  168. transactionComplete = true;
  169. return true;
  170. }
  171. }
  172. //INIT
  173. public class RorzeEfemHandlerInit : RorzeEfemHandler
  174. {
  175. public RorzeEfemHandlerInit(RorzeEfem device, ModuleName module)
  176. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.INIT, ConvertModuleToParameter(module), true)
  177. {
  178. Name = $"Initialize {module}";
  179. MutexId = (int)module;
  180. }
  181. protected override bool ProceedInfo(RorzeEfemMessage msg)
  182. {
  183. if (Module == ModuleName.System)
  184. Device.NoteInitialized();
  185. Device.NoteComplete(Module);
  186. return true;
  187. }
  188. }
  189. //ORGSH
  190. public class RorzeEfemHandlerOrgsh : RorzeEfemHandler
  191. {
  192. public RorzeEfemHandlerOrgsh(RorzeEfem device, ModuleName module)
  193. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.ORGSH, ConvertModuleToParameter(module), true)
  194. {
  195. Name = $"Home {module}";
  196. MutexId = (int)module;
  197. }
  198. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  199. {
  200. return base.HandleMessage(baseMessage, out transactionComplete);
  201. }
  202. }
  203. //LOCK
  204. public class RorzeEfemHandlerLock : RorzeEfemHandler
  205. {
  206. public RorzeEfemHandlerLock(RorzeEfem device, ModuleName module)
  207. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.LOCK, ConvertModuleToParameter(module), true)
  208. {
  209. Name = RorzeEfemBasicMessage.LOCK.ToString();
  210. MutexId = (int)module;
  211. }
  212. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  213. {
  214. return base.HandleMessage(baseMessage, out transactionComplete);
  215. }
  216. }
  217. //UNLOCK
  218. public class RorzeEfemHandlerUnlock : RorzeEfemHandler
  219. {
  220. public RorzeEfemHandlerUnlock(RorzeEfem device, ModuleName module)
  221. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.UNLOCK, ConvertModuleToParameter(module), true)
  222. {
  223. Name = RorzeEfemBasicMessage.UNLOCK.ToString();
  224. MutexId = (int)module;
  225. }
  226. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  227. {
  228. return base.HandleMessage(baseMessage, out transactionComplete);
  229. }
  230. }
  231. //DOCK
  232. public class RorzeEfemHandlerDock : RorzeEfemHandler
  233. {
  234. public RorzeEfemHandlerDock(RorzeEfem device, ModuleName module)
  235. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.DOCK, ConvertModuleToParameter(module), true)
  236. {
  237. Name = RorzeEfemBasicMessage.DOCK.ToString();
  238. MutexId = (int)module;
  239. }
  240. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  241. {
  242. return base.HandleMessage(baseMessage, out transactionComplete);
  243. }
  244. }
  245. //UNDOCK
  246. public class RorzeEfemHandlerUndock : RorzeEfemHandler
  247. {
  248. public RorzeEfemHandlerUndock(RorzeEfem device, ModuleName module)
  249. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.UNDOCK, ConvertModuleToParameter(module), true)
  250. {
  251. Name = RorzeEfemBasicMessage.UNDOCK.ToString();
  252. MutexId = (int)module;
  253. }
  254. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  255. {
  256. return base.HandleMessage(baseMessage, out transactionComplete);
  257. }
  258. }
  259. //OPEN
  260. public class RorzeEfemHandlerOpen : RorzeEfemHandler
  261. {
  262. public RorzeEfemHandlerOpen(RorzeEfem device, ModuleName module)
  263. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.OPEN, ConvertModuleToParameter(module), true)
  264. {
  265. Name = RorzeEfemBasicMessage.OPEN.ToString();
  266. MutexId = (int)module;
  267. }
  268. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  269. {
  270. return base.HandleMessage(baseMessage, out transactionComplete);
  271. }
  272. }
  273. //CLOSE
  274. public class RorzeEfemHandlerClose : RorzeEfemHandler
  275. {
  276. public RorzeEfemHandlerClose(RorzeEfem device, ModuleName module)
  277. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.CLOSE, ConvertModuleToParameter(module), true)
  278. {
  279. Name = RorzeEfemBasicMessage.CLOSE.ToString();
  280. MutexId = (int)module;
  281. }
  282. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  283. {
  284. return base.HandleMessage(baseMessage, out transactionComplete);
  285. }
  286. }
  287. //WAFSH
  288. public class RorzeEfemHandlerWafsh : RorzeEfemHandler
  289. {
  290. public RorzeEfemHandlerWafsh(RorzeEfem device, ModuleName target, bool mapByRobot)
  291. : base(device, mapByRobot ? ModuleName.EfemRobot : target, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.WAFSH, ConvertModuleToParameter(target), true)
  292. {
  293. Name = $"Map wafer of {target}";
  294. MutexId = mapByRobot ? (int)ModuleName.EfemRobot : (int)target;
  295. }
  296. public RorzeEfemHandlerWafsh(RorzeEfem device, ModuleName target, bool mapByRobot, int thicknessIndex)
  297. : base(device, mapByRobot ? ModuleName.EfemRobot : target, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.WAFSH, BuildParameter(target, thicknessIndex), true)
  298. {
  299. Name = $"Map wafer of {target}";
  300. MutexId = mapByRobot ? (int)ModuleName.EfemRobot : (int)target;
  301. }
  302. public static string BuildParameter(ModuleName target, int thicknessIndex)
  303. {
  304. string para1 = ConvertModuleToParameter(target);
  305. return $"{para1}/{thicknessIndex}";
  306. }
  307. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  308. {
  309. return base.HandleMessage(baseMessage, out transactionComplete);
  310. }
  311. }
  312. //MAPDT
  313. public class RorzeEfemHandlerMapdt : RorzeEfemHandler
  314. {
  315. private ModuleName _target;
  316. public RorzeEfemHandlerMapdt(RorzeEfem device, ModuleName target, bool mapByRobot)
  317. : base(device, mapByRobot ? ModuleName.EfemRobot : target, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.MAPDT, ConvertModuleToParameter(target), true)
  318. {
  319. Name = $"Get wafer map result of {target}";
  320. _target = target;
  321. MutexId = mapByRobot ? (int)ModuleName.EfemRobot : (int)target;
  322. }
  323. protected override bool ProceedInfo(RorzeEfemMessage msg)
  324. {
  325. if (ConvertParameterToModule(msg.MessagePart[2], out ModuleName target))
  326. {
  327. Device.NoteWaferMapResult(target, msg.MessagePart[3]);
  328. }
  329. if (!msg.IsEvent)
  330. {
  331. Device.NoteComplete(Module);
  332. }
  333. return true;
  334. }
  335. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  336. {
  337. return base.HandleMessage(baseMessage, out transactionComplete);
  338. }
  339. }
  340. //GOTO
  341. public class RorzeEfemHandlerGoto : RorzeEfemHandler
  342. {
  343. public RorzeEfemHandlerGoto(RorzeEfem device, ModuleName target, int slot, Hand blade, bool isPick)
  344. : base(device, ModuleName.EfemRobot, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.GOTO, BuildParameter(target, slot, blade, isPick), true)
  345. {
  346. Name = $"Goto from {target} slot {slot + 1}";
  347. MutexId = (int)ModuleName.EfemRobot;
  348. }
  349. public static string BuildParameter(ModuleName target, int slot, Hand blade, bool isPick)
  350. {
  351. string para1 = ConvertModuleToParameter(target);
  352. string para2 = blade == Hand.Blade1 ? "ARM2" : (blade == Hand.Blade2 ? "ARM1" : "ARM3");
  353. string para3 = isPick ? "DOWN":"UP";
  354. return $"{para1}{slot + 1:D2}/{para2}/{para3}";
  355. }
  356. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  357. {
  358. return base.HandleMessage(baseMessage, out transactionComplete);
  359. }
  360. }
  361. //LOAD
  362. public class RorzeEfemHandlerLoad : RorzeEfemHandler
  363. {
  364. public RorzeEfemHandlerLoad(RorzeEfem device, ModuleName target, int slot, Hand blade, WaferSize waferSize)
  365. : base(device, ModuleName.EfemRobot, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.LOAD, BuildParameter(target, slot, blade, waferSize), true)
  366. {
  367. Name = $"Pick from {target} slot {slot + 1}";
  368. MutexId = (int)ModuleName.EfemRobot;
  369. }
  370. public static string BuildParameter(ModuleName target, int slot, Hand blade, WaferSize waferSize)
  371. {
  372. string para1 = ConvertModuleToParameter(target);
  373. string para2 = blade == Hand.Blade1 ? "ARM2" : (blade == Hand.Blade2 ? "ARM1" : "ARM3");
  374. string para3 = waferSize.ToString();
  375. return $"{para1}{slot + 1:D2}/{para2}/{para3}";
  376. }
  377. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  378. {
  379. return base.HandleMessage(baseMessage, out transactionComplete);
  380. }
  381. }
  382. //UNLOAD
  383. public class RorzeEfemHandlerUnload : RorzeEfemHandler
  384. {
  385. public RorzeEfemHandlerUnload(RorzeEfem device, ModuleName target, int slot, Hand blade, WaferSize waferSize)
  386. : base(device, ModuleName.EfemRobot, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.UNLOAD, BuildParameter(target, slot, blade, waferSize), true)
  387. {
  388. Name = $"Place to {target} slot {slot + 1}";
  389. MutexId = (int)ModuleName.EfemRobot;
  390. }
  391. public static string BuildParameter(ModuleName target, int slot, Hand blade, WaferSize waferSize)
  392. {
  393. string para1 = ConvertModuleToParameter(target);
  394. string para2 = blade == Hand.Blade1 ? "ARM2" : (blade == Hand.Blade2 ? "ARM1" : "ARM3");
  395. string para3 = waferSize.ToString();
  396. return $"{para1}{slot + 1:D2}/{para2}/{para3}";
  397. }
  398. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  399. {
  400. return base.HandleMessage(baseMessage, out transactionComplete);
  401. }
  402. }
  403. //TRANS
  404. public class RorzeEfemHandlerTrans : RorzeEfemHandler
  405. {
  406. public RorzeEfemHandlerTrans(RorzeEfem device, ModuleName module)
  407. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.TRANS, ConvertModuleToParameter(module), true)
  408. {
  409. Name = RorzeEfemBasicMessage.TRANS.ToString();
  410. MutexId = (int)ModuleName.EfemRobot;
  411. }
  412. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  413. {
  414. return base.HandleMessage(baseMessage, out transactionComplete);
  415. }
  416. }
  417. //CHANGE
  418. public class RorzeEfemHandlerChange : RorzeEfemHandler
  419. {
  420. public RorzeEfemHandlerChange(RorzeEfem device, ModuleName module)
  421. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.CHANGE, ConvertModuleToParameter(module), true)
  422. {
  423. Name = RorzeEfemBasicMessage.CHANGE.ToString();
  424. MutexId = (int)ModuleName.EfemRobot;
  425. }
  426. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  427. {
  428. return base.HandleMessage(baseMessage, out transactionComplete);
  429. }
  430. }
  431. //ALIGN
  432. public class RorzeEfemHandlerAlign : RorzeEfemHandler
  433. {
  434. public RorzeEfemHandlerAlign(RorzeEfem device, ModuleName module, bool isMov)
  435. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.ALIGN, ConvertModuleToParameter(module), true)
  436. {
  437. Name = RorzeEfemBasicMessage.ALIGN.ToString();
  438. MutexId = (int)ModuleName.Aligner;
  439. }
  440. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  441. {
  442. return base.HandleMessage(baseMessage, out transactionComplete);
  443. }
  444. }
  445. //HOME
  446. public class RorzeEfemHandlerHome : RorzeEfemHandler
  447. {
  448. public RorzeEfemHandlerHome(RorzeEfem device, ModuleName module)
  449. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.HOME, ConvertModuleToParameter(module), true)
  450. {
  451. Name = RorzeEfemBasicMessage.HOME.ToString();
  452. MutexId = (int)module;
  453. }
  454. }
  455. //HOLD
  456. public class RorzeEfemHandlerHold : RorzeEfemHandler
  457. {
  458. public RorzeEfemHandlerHold(RorzeEfem device, ModuleName module)
  459. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.HOLD, ConvertModuleToParameter(module), true)
  460. {
  461. Name = RorzeEfemBasicMessage.HOLD.ToString();
  462. MutexId = (int)module;
  463. }
  464. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  465. {
  466. return base.HandleMessage(baseMessage, out transactionComplete);
  467. }
  468. }
  469. //RESTR
  470. public class RorzeEfemHandlerRestr : RorzeEfemHandler
  471. {
  472. public RorzeEfemHandlerRestr(RorzeEfem device, ModuleName module)
  473. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.RESTR, ConvertModuleToParameter(module), false)
  474. {
  475. Name = RorzeEfemBasicMessage.RESTR.ToString();
  476. }
  477. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  478. {
  479. return base.HandleMessage(baseMessage, out transactionComplete);
  480. }
  481. }
  482. //ABORT
  483. public class RorzeEfemHandlerAbort : RorzeEfemHandler
  484. {
  485. public RorzeEfemHandlerAbort(RorzeEfem device, ModuleName module)
  486. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.ABORT, ConvertModuleToParameter(module), true)
  487. {
  488. Name = RorzeEfemBasicMessage.ABORT.ToString();
  489. MutexId = (int)module;
  490. }
  491. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  492. {
  493. return base.HandleMessage(baseMessage, out transactionComplete);
  494. }
  495. }
  496. //EMS
  497. public class RorzeEfemHandlerEms : RorzeEfemHandler
  498. {
  499. public RorzeEfemHandlerEms(RorzeEfem device, ModuleName module)
  500. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.EMS, ConvertModuleToParameter(module), true)
  501. {
  502. Name = RorzeEfemBasicMessage.EMS.ToString();
  503. MutexId = (int)module;
  504. }
  505. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  506. {
  507. return base.HandleMessage(baseMessage, out transactionComplete);
  508. }
  509. }
  510. //ERROR
  511. public class RorzeEfemHandlerError : RorzeEfemHandler
  512. {
  513. public RorzeEfemHandlerError(RorzeEfem device, bool isQuery)
  514. : base(device, ModuleName.System, isQuery ? RorzeEfemMessageType.GET : RorzeEfemMessageType.SET, RorzeEfemBasicMessage.ERROR, isQuery ? "" : "CLEAR", isQuery)
  515. {
  516. Name = RorzeEfemBasicMessage.ERROR.ToString();
  517. }
  518. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  519. {
  520. return base.HandleMessage(baseMessage, out transactionComplete);
  521. }
  522. }
  523. //CLAMP
  524. public class RorzeEfemHandlerClamp : RorzeEfemHandler
  525. {
  526. public RorzeEfemHandlerClamp(RorzeEfem device, ModuleName module)
  527. : base(device, module, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.CLAMP, ConvertModuleToParameter(module), true)
  528. {
  529. Name = RorzeEfemBasicMessage.CLAMP.ToString();
  530. MutexId = (int)module;
  531. }
  532. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  533. {
  534. return base.HandleMessage(baseMessage, out transactionComplete);
  535. }
  536. }
  537. //STATE
  538. public class RorzeEfemHandlerState : RorzeEfemHandler
  539. {
  540. private RorzeEfemStateType _state;
  541. public RorzeEfemHandlerState(RorzeEfem device, RorzeEfemStateType state)
  542. : base(device, ModuleName.System, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.STATE, state.ToString(), true)
  543. {
  544. Name = "Query State";
  545. _state = state;
  546. MutexId = (int)ModuleName.System;
  547. }
  548. protected override bool ProceedInfo(RorzeEfemMessage msg)
  549. {
  550. if (_state == RorzeEfemStateType.TRACK)
  551. {
  552. Device.NoteWaferTrack(msg.MessagePart[3]);
  553. }
  554. //Device.NoteComplete(Module);
  555. return true;
  556. }
  557. }
  558. //LED
  559. public class RorzeEfemHandlerLed : RorzeEfemHandler
  560. {
  561. public RorzeEfemHandlerLed(RorzeEfem device, ModuleName module)
  562. : base(device, module, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.LED, ConvertModuleToParameter(module), true)
  563. {
  564. Name = RorzeEfemBasicMessage.LED.ToString();
  565. }
  566. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  567. {
  568. return base.HandleMessage(baseMessage, out transactionComplete);
  569. }
  570. }
  571. //WORKCHK
  572. public class RorzeEfemHandlerWorkChk : RorzeEfemHandler
  573. {
  574. public RorzeEfemHandlerWorkChk(RorzeEfem device, ModuleName module)
  575. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.WORKCHK, ConvertModuleToParameter(module), true)
  576. {
  577. Name = RorzeEfemBasicMessage.WORKCHK.ToString();
  578. }
  579. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  580. {
  581. return base.HandleMessage(baseMessage, out transactionComplete);
  582. }
  583. }
  584. //FFU
  585. public class RorzeEfemHandlerFfu : RorzeEfemHandler
  586. {
  587. public RorzeEfemHandlerFfu(RorzeEfem device, ModuleName module)
  588. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.FFU, ConvertModuleToParameter(module), true)
  589. {
  590. Name = RorzeEfemBasicMessage.FFU.ToString();
  591. MutexId = (int)module;
  592. }
  593. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  594. {
  595. return base.HandleMessage(baseMessage, out transactionComplete);
  596. }
  597. }
  598. //WTYPE
  599. public class RorzeEfemHandlerWType : RorzeEfemHandler
  600. {
  601. public RorzeEfemHandlerWType(RorzeEfem device, ModuleName module)
  602. : base(device, module, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.WTYPE, ConvertModuleToParameter(module), true)
  603. {
  604. Name = RorzeEfemBasicMessage.WTYPE.ToString();
  605. }
  606. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  607. {
  608. return base.HandleMessage(baseMessage, out transactionComplete);
  609. }
  610. }
  611. //PURGE
  612. public class RorzeEfemHandlerPurge : RorzeEfemHandler
  613. {
  614. public RorzeEfemHandlerPurge(RorzeEfem device, ModuleName module)
  615. : base(device, module, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.PURGE, ConvertModuleToParameter(module), true)
  616. {
  617. Name = RorzeEfemBasicMessage.PURGE.ToString();
  618. }
  619. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  620. {
  621. return base.HandleMessage(baseMessage, out transactionComplete);
  622. }
  623. }
  624. //ADPLOCK
  625. public class RorzeEfemHandlerAdpLock : RorzeEfemHandler
  626. {
  627. public RorzeEfemHandlerAdpLock(RorzeEfem device, ModuleName module)
  628. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.ADPLOCK, ConvertModuleToParameter(module), true)
  629. {
  630. Name = RorzeEfemBasicMessage.ADPLOCK.ToString();
  631. }
  632. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  633. {
  634. return base.HandleMessage(baseMessage, out transactionComplete);
  635. }
  636. }
  637. //ADPUNLOCK
  638. public class RorzeEfemHandlerAdpUnlock : RorzeEfemHandler
  639. {
  640. public RorzeEfemHandlerAdpUnlock(RorzeEfem device, ModuleName module)
  641. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.ADPUNLOCK, ConvertModuleToParameter(module), true)
  642. {
  643. Name = RorzeEfemBasicMessage.ADPUNLOCK.ToString();
  644. }
  645. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  646. {
  647. return base.HandleMessage(baseMessage, out transactionComplete);
  648. }
  649. }
  650. //MODE
  651. public class RorzeEfemHandlerMode : RorzeEfemHandler
  652. {
  653. public RorzeEfemHandlerMode(RorzeEfem device, ModuleName module)
  654. : base(device, module, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.MODE, ConvertModuleToParameter(module), true)
  655. {
  656. Name = RorzeEfemBasicMessage.MODE.ToString();
  657. MutexId = (int)module;
  658. }
  659. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  660. {
  661. return base.HandleMessage(baseMessage, out transactionComplete);
  662. }
  663. }
  664. //TRANSREQ
  665. public class RorzeEfemHandlerTransReq : RorzeEfemHandler
  666. {
  667. public RorzeEfemHandlerTransReq(RorzeEfem device, ModuleName module)
  668. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.TRANSREQ, ConvertModuleToParameter(module), true)
  669. {
  670. Name = RorzeEfemBasicMessage.TRANSREQ.ToString();
  671. MutexId = (int)module;
  672. }
  673. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  674. {
  675. return base.HandleMessage(baseMessage, out transactionComplete);
  676. }
  677. }
  678. //SIGOUT
  679. public class RorzeEfemHandlerSigout : RorzeEfemHandler
  680. {
  681. public RorzeEfemHandlerSigout(RorzeEfem device, ModuleName module, IndicatorType type, IndicatorState state)
  682. : base(device, module, RorzeEfemMessageType.SET, RorzeEfemBasicMessage.SIGOUT, BuildParameter(module, type, state), false)
  683. {
  684. Name = $"Set Signal Tower";
  685. MutexId = -1;
  686. }
  687. public RorzeEfemHandlerSigout(RorzeEfem device, ModuleName module, LightType type, TowerLightStatus state)
  688. : base(device, module, RorzeEfemMessageType.SET, RorzeEfemBasicMessage.SIGOUT, BuildParameter(module, type, state), false)
  689. {
  690. Name = $"Set Signal Tower";
  691. MutexId = -1;
  692. }
  693. public static string BuildParameter(ModuleName target, IndicatorType type, IndicatorState state)
  694. {
  695. Dictionary<IndicatorType, string> mapLightType = new Dictionary<IndicatorType, string>()
  696. {
  697. {IndicatorType.AccessAuto, "AUTO MODE"},
  698. {IndicatorType.AccessManual, "MANUAL MODE"},
  699. {IndicatorType.Load, "LOAD"},
  700. {IndicatorType.Unload, "UNLOAD"},
  701. {IndicatorType.Presence, "PRESENCE"},
  702. {IndicatorType.Placement, "PLACEMENT"},
  703. {IndicatorType.Error, "ERROR"},
  704. {IndicatorType.Busy, "BUSY"},
  705. {IndicatorType.Complete, "COMPLETE"},
  706. };
  707. Dictionary<IndicatorState, string> mapLightState = new Dictionary<IndicatorState, string>()
  708. {
  709. {IndicatorState.ON, "ON"},
  710. {IndicatorState.OFF, "OFF"},
  711. {IndicatorState.BLINK, "BLINK"},
  712. };
  713. string par1 = ConvertModuleToParameter(target);
  714. string par2 = mapLightType[type];
  715. string par3 = mapLightState[state];
  716. return $"{par1}/{par2}/{par3}";
  717. }
  718. public static string BuildParameter(ModuleName target, LightType type, TowerLightStatus state)
  719. {
  720. if (type == LightType.Buzzer)
  721. {
  722. type = state == TowerLightStatus.Blinking ? LightType.Buzzer2 : LightType.Buzzer1;
  723. state = state == TowerLightStatus.Off ? TowerLightStatus.Off : TowerLightStatus.On;
  724. }
  725. Dictionary<LightType, string> mapLightType = new Dictionary<LightType, string>()
  726. {
  727. {LightType.Red, "RED"},
  728. {LightType.Yellow, "YELLOW"},
  729. {LightType.Green, "GREEN"},
  730. {LightType.Blue, "BLUE"},
  731. {LightType.White, "WHITE"},
  732. {LightType.Buzzer1, "BUZZER1"},
  733. {LightType.Buzzer2, "BUZZER2"},
  734. };
  735. Dictionary<TowerLightStatus, string> mapLightState = new Dictionary<TowerLightStatus, string>()
  736. {
  737. {TowerLightStatus.On, "ON"},
  738. {TowerLightStatus.Off, "OFF"},
  739. {TowerLightStatus.Blinking, "BLINK"},
  740. };
  741. string par1 = "STOWER";
  742. string par2 = mapLightType[type];
  743. string par3 = mapLightState[state];
  744. return $"{par1}/{par2}/{par3}";
  745. }
  746. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  747. {
  748. return base.HandleMessage(baseMessage, out transactionComplete);
  749. }
  750. protected override bool ProceedInfo(RorzeEfemMessage msg)
  751. {
  752. return true;
  753. }
  754. }
  755. /// <summary>
  756. /// SIGSTAT
  757. /// EVT:/SIGSTAT/PARAMETER/DATA1/DATA2
  758. /// </summary>
  759. public class RorzeEfemHandlerSigStat : RorzeEfemHandler
  760. {
  761. public RorzeEfemHandlerSigStat(RorzeEfem device, ModuleName module)
  762. : base(device, module, RorzeEfemMessageType.GET, RorzeEfemBasicMessage.SIGSTAT, ConvertModuleToParameter(module), true)
  763. {
  764. Name = RorzeEfemBasicMessage.SIGSTAT.ToString();
  765. MutexId = (int)module;
  766. }
  767. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  768. {
  769. if (baseMessage.IsEvent)
  770. {
  771. var msg = baseMessage as RorzeEfemMessage;
  772. if (!ConvertParameterToModule(msg.MessagePart[2], out ModuleName module))
  773. {
  774. EV.PostWarningLog(Device.Module, $"Parameter unrecognized, {msg.RawMessage}");
  775. }
  776. else
  777. {
  778. Device.NoteStateEvent(module, msg.MessagePart[3], msg.MessagePart[4]);
  779. }
  780. transactionComplete = true;
  781. return true;
  782. }
  783. return base.HandleMessage(baseMessage, out transactionComplete);
  784. }
  785. protected override bool ProceedInfo(RorzeEfemMessage msg)
  786. {
  787. if (ConvertParameterToModule(msg.MessagePart[2], out ModuleName target))
  788. {
  789. Device.NoteStateEvent(target, msg.MessagePart[3], msg.MessagePart[4]);
  790. }
  791. if (!msg.IsEvent && ModuleHelper.IsLoadPort(Module))
  792. {
  793. Device.NoteComplete(Module);
  794. }
  795. return true;
  796. }
  797. }
  798. //CSTID
  799. public class RorzeEfemHandlerCstid : RorzeEfemHandler
  800. {
  801. public RorzeEfemHandlerCstid(RorzeEfem device, ModuleName module)
  802. : base(device, module, RorzeEfemMessageType.MOV, RorzeEfemBasicMessage.CSTID, ConvertModuleToParameter(module), true)
  803. {
  804. Name = RorzeEfemBasicMessage.CSTID.ToString();
  805. MutexId = (int)module;
  806. }
  807. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  808. {
  809. return base.HandleMessage(baseMessage, out transactionComplete);
  810. }
  811. protected override bool ProceedInfo(RorzeEfemMessage msg)
  812. {
  813. if (ConvertParameterToModule(msg.MessagePart[2], out ModuleName target))
  814. {
  815. Device.NoteCarrierIDReadResult(target, msg.MessagePart[3]);
  816. }
  817. if (!msg.IsEvent)
  818. {
  819. Device.NoteComplete(Module);
  820. }
  821. return true;
  822. }
  823. }
  824. //EVENT
  825. public class RorzeEfemHandlerEvent : RorzeEfemHandler
  826. {
  827. public RorzeEfemHandlerEvent(RorzeEfem device, ModuleName module, bool isSet = true)
  828. : base(device, module, isSet ? RorzeEfemMessageType.SET : RorzeEfemMessageType.GET, RorzeEfemBasicMessage.EVENT, ConvertModuleToParameter(module), true)
  829. {
  830. Name = RorzeEfemBasicMessage.EVENT.ToString();
  831. MutexId = (int)module;
  832. }
  833. public override bool HandleMessage(MessageBase baseMessage, out bool transactionComplete)
  834. {
  835. return base.HandleMessage(baseMessage, out transactionComplete);
  836. }
  837. }
  838. }