SchedulerFlipper.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using MECF.Framework.Common.Equipment;
  7. using VirgoRT.Scheduler;
  8. using Aitex.Core.Util;
  9. using Aitex.Core.RT.Fsm;
  10. using Aitex.Sorter.Common;
  11. namespace VirgoRT.Modules.Schedulers
  12. {
  13. public class SchedulerFlipper : SchedulerModule
  14. {
  15. private EfemEntity _entity = null;
  16. private int _entityTaskToken = (int)FSM_MSG.NONE;
  17. public override bool IsAvailable
  18. {
  19. get
  20. {
  21. return _entity.IsIdle && /*_entity.IsOnline && */CheckTaskDone();
  22. }
  23. }
  24. public SchedulerFlipper(ModuleName flipper) : base(flipper.ToString())
  25. {
  26. _task = TaskType.None;
  27. _entity = Singleton<RouteManager>.Instance.EFEM;
  28. EventWaferArrived += WaferArrived;
  29. }
  30. private void WaferArrived(object sender, EventArgs e)
  31. {
  32. var eArgs = e as WaferMoveArgs;
  33. WaferArriveTicks[eArgs.DstSlot] = DateTime.Now.Ticks;
  34. Flip("AlwaysReverse");
  35. }
  36. public void Flip(string orient)
  37. {
  38. _entityTaskToken = _entity.InvokeFlip(orient);
  39. if (_entityTaskToken != (int)FSM_MSG.NONE)
  40. _task = TaskType.Flip;
  41. }
  42. private bool CheckTaskDone()
  43. {
  44. bool ret = false;
  45. switch (_task)
  46. {
  47. case TaskType.Flip:
  48. ret = _entity.CheckAcked(_entityTaskToken) && _entity.IsIdle;
  49. break;
  50. case TaskType.None:
  51. ret = true;
  52. break;
  53. }
  54. if (ret && _task != TaskType.None) _task = TaskType.None;
  55. return ret;
  56. }
  57. }
  58. }