SiasunAlignerHandler.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. using MECF.Framework.Common.Communications;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. using System.Linq;
  5. using System.Text;
  6. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.SiasunAligner
  7. {
  8. public abstract class SiasunAlignerHandler : HandlerBase
  9. {
  10. public SiasunAligner Device { get; }
  11. public string _command;
  12. protected string _parameter;
  13. protected SiasunAlignerHandler(SiasunAligner device, string command, string parameter = null)
  14. : base(BuildMessage(command, parameter))
  15. {
  16. Device = device;
  17. _command = command;
  18. _parameter = parameter;
  19. Name = command;
  20. }
  21. private static string BuildMessage(string command, string parameter)
  22. {
  23. string msg = string.IsNullOrEmpty(parameter) ? $"{command}" : $"{command} {parameter}";
  24. return msg + "\r";
  25. }
  26. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  27. {
  28. SiasunAlignerMessage response = msg as SiasunAlignerMessage;
  29. ResponseMessage = msg;
  30. if (response.IsError)
  31. {
  32. Device.NoteError(response.Data);
  33. }
  34. if (response.IsComplete)
  35. {
  36. SetState(EnumHandlerState.Completed);
  37. transactionComplete = true;
  38. return true;
  39. }
  40. transactionComplete = false;
  41. return false;
  42. }
  43. }
  44. public class SiasunAlignerRawCommandHandler : SiasunAlignerHandler
  45. {
  46. public SiasunAlignerRawCommandHandler(SiasunAligner device, string command, string parameter = null)
  47. : base(device, command, parameter)
  48. {
  49. }
  50. public override bool HandleMessage(MessageBase msg, out bool handled)
  51. {
  52. var result = msg as SiasunAlignerMessage;
  53. Device.NoteRawCommandInfo(_command, result.RawMessage);
  54. ResponseMessage = msg;
  55. handled = true;
  56. return true;
  57. }
  58. }
  59. public class SiasunAlignerXferHandler : SiasunAlignerHandler
  60. {
  61. public SiasunAlignerXferHandler(SiasunAligner device, string jsonParameter)
  62. : base(device, "XFER", BuildCommandParameter(jsonParameter))
  63. {
  64. }
  65. static string BuildCommandParameter(string jsonParameter)
  66. {
  67. JObject jsonObject = JObject.Parse(jsonParameter);
  68. StringBuilder paraBuilder = new StringBuilder();
  69. foreach (var item in jsonObject)
  70. {
  71. if (item.Key.Contains("Slot") || item.Key == "Arm")
  72. paraBuilder.Append(" " + item.Key.ToUpper() + " " + item.Value);
  73. else if (item.Value != null && item.Value.ToString().Length > 0)
  74. paraBuilder.Append(" " + item.Value);
  75. }
  76. return paraBuilder.Length > 0 ? paraBuilder.ToString() : null;
  77. }
  78. public override bool HandleMessage(MessageBase msg, out bool handled)
  79. {
  80. var result = msg as SiasunAlignerMessage;
  81. if (result.IsError)
  82. {
  83. Device.NoteError(result.Data);
  84. }
  85. else
  86. {
  87. Device.NoteError(null);
  88. Device.NoteActionCompleted(_command);
  89. }
  90. ResponseMessage = msg;
  91. handled = true;
  92. return true;
  93. }
  94. }
  95. public class SiasunAlignerPickHandler : SiasunAlignerHandler
  96. {
  97. public SiasunAlignerPickHandler(SiasunAligner device, string jsonParameter)
  98. : base(device, "PICK", BuildCommandParameter(jsonParameter))
  99. {
  100. }
  101. //N 2 R EX Z DOWN SLOT 1 ARM A
  102. static string BuildCommandParameter(string jsonParameter)
  103. {
  104. JObject jsonObject = JObject.Parse(jsonParameter);
  105. StringBuilder paraBuilder = new StringBuilder();
  106. foreach (var item in jsonObject)
  107. {
  108. if (paraBuilder.Length == 0)
  109. {
  110. paraBuilder.Append(item.Value);
  111. }
  112. else
  113. {
  114. if (item.Key == "Slot" || item.Key == "Arm")
  115. paraBuilder.Append(" " + item.Key.ToUpper() + " " + item.Value);
  116. else
  117. paraBuilder.Append(" " + item.Value);
  118. }
  119. }
  120. return paraBuilder.Length > 0 ? paraBuilder.ToString() : null;
  121. }
  122. public override bool HandleMessage(MessageBase msg, out bool handled)
  123. {
  124. var result = msg as SiasunAlignerMessage;
  125. if (result.IsError)
  126. {
  127. Device.NoteError(result.Data);
  128. }
  129. else
  130. {
  131. Device.NoteError(null);
  132. Device.NoteLastPickInfo(SendText);
  133. }
  134. ResponseMessage = msg;
  135. handled = true;
  136. return true;
  137. }
  138. }
  139. public class SiasunAlignerPlaceHandler : SiasunAlignerHandler
  140. {
  141. public SiasunAlignerPlaceHandler(SiasunAligner device, string jsonParameter)
  142. : base(device, "PLACE", BuildCommandParameter(jsonParameter))
  143. {
  144. }
  145. static string BuildCommandParameter(string jsonParameter)
  146. {
  147. JObject jsonObject = JObject.Parse(jsonParameter);
  148. StringBuilder paraBuilder = new StringBuilder();
  149. foreach (var item in jsonObject)
  150. {
  151. if (paraBuilder.Length == 0)
  152. {
  153. paraBuilder.Append(item.Value);
  154. }
  155. else
  156. {
  157. if (item.Key == "Slot" || item.Key == "Arm")
  158. paraBuilder.Append(" " + item.Key.ToUpper() + " " + item.Value);
  159. else
  160. paraBuilder.Append(" " + item.Value);
  161. }
  162. }
  163. return paraBuilder.Length > 0 ? paraBuilder.ToString() : null;
  164. }
  165. public override bool HandleMessage(MessageBase msg, out bool handled)
  166. {
  167. var result = msg as SiasunAlignerMessage;
  168. if (result.IsError)
  169. {
  170. Device.NoteError(result.Data);
  171. }
  172. else
  173. {
  174. Device.NoteError(null);
  175. Device.NoteLastPlaceInfo(SendText);
  176. }
  177. ResponseMessage = msg;
  178. handled = true;
  179. return true;
  180. }
  181. }
  182. public class SiasunAlignerSimpleActionHandler : SiasunAlignerHandler
  183. {
  184. public SiasunAlignerSimpleActionHandler(SiasunAligner device, string command, string parameter = null)
  185. : base(device, command, parameter)
  186. {
  187. }
  188. public override bool HandleMessage(MessageBase msg, out bool handled)
  189. {
  190. var result = msg as SiasunAlignerMessage;
  191. if (result.IsError)
  192. {
  193. Device.NoteError(result.Data);
  194. }
  195. else
  196. {
  197. Device.NoteError(null);
  198. Device.NoteActionCompleted(_command);
  199. }
  200. ResponseMessage = msg;
  201. handled = true;
  202. return true;
  203. }
  204. }
  205. public class SiasunAlignerSimpleSetHandler : SiasunAlignerHandler
  206. {
  207. public SiasunAlignerSimpleSetHandler(SiasunAligner device, string command, string parameter = null)
  208. : base(device, command, parameter)
  209. {
  210. }
  211. public override bool HandleMessage(MessageBase msg, out bool handled)
  212. {
  213. var result = msg as SiasunAlignerMessage;
  214. if (result.IsError)
  215. {
  216. Device.NoteError(result.Data);
  217. }
  218. else
  219. {
  220. Device.NoteError(null);
  221. Device.NoteSetCompleted(_command, _parameter);
  222. }
  223. ResponseMessage = msg;
  224. handled = true;
  225. return true;
  226. }
  227. }
  228. public class SiasunAlignerAlignHandler : SiasunAlignerHandler
  229. {
  230. public SiasunAlignerAlignHandler(SiasunAligner device)
  231. : base(device, "ALIGN", "")
  232. {
  233. }
  234. public override bool HandleMessage(MessageBase msg, out bool handled)
  235. {
  236. var result = msg as SiasunAlignerMessage;
  237. if (result.IsError)
  238. {
  239. Device.NoteError(result.Data);
  240. }
  241. ResponseMessage = msg;
  242. handled = true;
  243. return true;
  244. }
  245. }
  246. public class SiasunAlignerRotateHandler : SiasunAlignerHandler
  247. {
  248. public SiasunAlignerRotateHandler(SiasunAligner device, float angle)
  249. : base(device, "ROTATE", angle.ToString("f1"))
  250. {
  251. }
  252. public override bool HandleMessage(MessageBase msg, out bool handled)
  253. {
  254. var result = msg as SiasunAlignerMessage;
  255. if (result.IsError)
  256. {
  257. Device.NoteError(result.Data);
  258. }
  259. ResponseMessage = msg;
  260. handled = true;
  261. return true;
  262. }
  263. }
  264. public class SiasunAlignerSevoOnOffHandler : SiasunAlignerHandler
  265. {
  266. public SiasunAlignerSevoOnOffHandler(SiasunAligner device, bool isOn)
  267. : base(device, isOn ? "SVON" : "SVOFF")
  268. {
  269. }
  270. public override bool HandleMessage(MessageBase msg, out bool handled)
  271. {
  272. var result = msg as SiasunAlignerMessage;
  273. if (result.IsError)
  274. {
  275. Device.NoteError(result.Data);
  276. }
  277. else
  278. {
  279. Device.NoteError(null);
  280. Device.NoteSevoOnOff(_command == "SVON");
  281. }
  282. ResponseMessage = msg;
  283. handled = true;
  284. return true;
  285. }
  286. }
  287. public class SiasunAlignerQueryBiasHandler : SiasunAlignerHandler
  288. {
  289. public SiasunAlignerQueryBiasHandler(SiasunAligner device)
  290. : base(device, "RBIASRT", "")
  291. {
  292. }
  293. public override bool HandleMessage(MessageBase msg, out bool handled)
  294. {
  295. var result = msg as SiasunAlignerMessage;
  296. if (result.IsError)
  297. {
  298. Device.NoteError(result.Data);
  299. }
  300. else
  301. {
  302. var resultArray = result.Data.Split(' ');
  303. if (resultArray.Count() >= 2 && resultArray[0] == _command)
  304. {
  305. var ar1 = resultArray[1].Split(',');
  306. if (ar1.Length == 2)
  307. {
  308. Device.RadialOffset = Convert.ToSingle(ar1[0]);
  309. Device.ThetaOffset = Convert.ToSingle(ar1[1]);
  310. }
  311. }
  312. }
  313. ResponseMessage = msg;
  314. handled = true;
  315. return true;
  316. }
  317. }
  318. public class SiasunAlignerQueryErrorHandler : SiasunAlignerHandler
  319. {
  320. public SiasunAlignerQueryErrorHandler(SiasunAligner device)
  321. : base(device, "REER", "")
  322. {
  323. }
  324. public override bool HandleMessage(MessageBase msg, out bool handled)
  325. {
  326. var result = msg as SiasunAlignerMessage;
  327. if (result.IsError)
  328. {
  329. Device.NoteError(result.Data);
  330. }
  331. else
  332. {
  333. var resultArray = result.Data.Split(' ');
  334. if (resultArray.Count() >= 2 && resultArray[0] == "_ERR")
  335. {
  336. Device.NoteError(resultArray[1]);
  337. }
  338. }
  339. ResponseMessage = msg;
  340. handled = true;
  341. return true;
  342. }
  343. }
  344. public class SiasunAlignerQueryWaferPresentHandler : SiasunAlignerHandler
  345. {
  346. public SiasunAlignerQueryWaferPresentHandler(SiasunAligner device)
  347. : base(device, "RWK", "")
  348. {
  349. }
  350. public override bool HandleMessage(MessageBase msg, out bool handled)
  351. {
  352. var result = msg as SiasunAlignerMessage;
  353. if (result.IsError)
  354. {
  355. Device.NoteError(result.Data);
  356. }
  357. else
  358. {
  359. var resultArray = result.Data.Split(' ');
  360. if (resultArray.Count() >= 2 && resultArray[0] == _command)
  361. {
  362. Device.IsWaferPresence = resultArray[1].Contains("1");
  363. }
  364. }
  365. ResponseMessage = msg;
  366. handled = true;
  367. return true;
  368. }
  369. }
  370. public class SiasunAlignerQueryReadyHandler : SiasunAlignerHandler
  371. {
  372. public SiasunAlignerQueryReadyHandler(SiasunAligner device)
  373. : base(device, "RAR", "")
  374. {
  375. }
  376. public override bool HandleMessage(MessageBase msg, out bool handled)
  377. {
  378. var result = msg as SiasunAlignerMessage;
  379. if (result.IsError)
  380. {
  381. Device.NoteError(result.Data);
  382. }
  383. else
  384. {
  385. var resultArray = result.Data.Split(' ');
  386. if (resultArray.Count() >= 2 && resultArray[0] == _command)
  387. {
  388. var isReady = resultArray[0].Contains("1");
  389. }
  390. }
  391. ResponseMessage = msg;
  392. handled = true;
  393. return true;
  394. }
  395. }
  396. public class SiasunAlignerSimpleQueryHandler : SiasunAlignerHandler
  397. {
  398. public SiasunAlignerSimpleQueryHandler(SiasunAligner device, string command, string parameter = null)
  399. : base(device, command, parameter)
  400. {
  401. }
  402. public override bool HandleMessage(MessageBase msg, out bool handled)
  403. {
  404. var result = msg as SiasunAlignerMessage;
  405. if (result.IsError)
  406. {
  407. Device.NoteError(result.Data);
  408. }
  409. else
  410. {
  411. var resultArray = result.Data.Split(' ');
  412. if (resultArray.Count() >= 2 && resultArray[0] == _command)
  413. {
  414. Device.NoteError(null);
  415. Device.NoteQueryResult(_command, _parameter, string.Join(",", resultArray, 1, resultArray.Count() - 1));
  416. }
  417. else
  418. {
  419. Device.NoteError($"Invalid Response '{result.Data}' for command: {_command}");
  420. }
  421. }
  422. ResponseMessage = msg;
  423. handled = true;
  424. return true;
  425. }
  426. }
  427. }