LLEntity.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. using System;
  2. using Aitex.Core.Util;
  3. using Aitex.Core.RT.Fsm;
  4. using Aitex.Core.RT.Log;
  5. using MECF.Framework.Common.Equipment;
  6. using Venus_RT.Modules.TM;
  7. using Venus_RT.Devices;
  8. using Venus_Core;
  9. namespace Venus_RT.Modules
  10. {
  11. class LLEntity : Entity, IEntity, IModuleEntity
  12. {
  13. public enum STATE
  14. {
  15. Unknown,
  16. Init,
  17. Initializing,
  18. Idle,
  19. Error,
  20. Pumping,
  21. Venting,
  22. Purging,
  23. Leakchecking,
  24. }
  25. public enum MSG
  26. {
  27. Home,
  28. Online,
  29. Offline,
  30. Pump,
  31. Vent,
  32. Purge,
  33. CyclePurge,
  34. LeakCheck,
  35. Error,
  36. Abort,
  37. }
  38. public ModuleName Module { get; private set; }
  39. public bool Check(int msg, out string reason, params object[] args)
  40. {
  41. throw new NotImplementedException();
  42. }
  43. public bool IsIdle
  44. {
  45. get { return fsm.State == (int)STATE.Idle; }
  46. }
  47. public bool IsError
  48. {
  49. get { return fsm.State == (int)STATE.Error; }
  50. }
  51. public bool IsInit
  52. {
  53. get { return fsm.State == (int)STATE.Unknown || fsm.State == (int)STATE.Init; }
  54. }
  55. public bool IsBusy
  56. {
  57. get { return !IsInit && !IsError && !IsIdle; }
  58. }
  59. public bool IsOnline { get; internal set; }
  60. private readonly JetTM _JetTM;
  61. private readonly MFPumpRoutine _pumpingRoutine;
  62. private readonly MFVentRoutine _ventingRoutine;
  63. private readonly MFLeakCheckRoutine _leakCheckRoutine;
  64. private readonly MFPurgeRoutine _purgeRoutine;
  65. public LLEntity(ModuleName module)
  66. {
  67. Module = module;
  68. _JetTM = Singleton<JetTM>.Instance;
  69. _pumpingRoutine = new MFPumpRoutine(_JetTM, Module);
  70. _ventingRoutine = new MFVentRoutine(_JetTM, Module);
  71. _leakCheckRoutine = new MFLeakCheckRoutine(_JetTM, Module);
  72. _purgeRoutine = new MFPurgeRoutine(_JetTM, Module);
  73. InitFsmMap();
  74. }
  75. private void InitFsmMap()
  76. {
  77. fsm = new StateMachine<TMEntity>(Module.ToString(), (int)STATE.Init, 50);
  78. fsm.EnableRepeatedMsg(true);
  79. AnyStateTransition(FSM_MSG.TIMER, fnMonitor, FSM_STATE.SAME);
  80. AnyStateTransition(MSG.Error, fnError, STATE.Error);
  81. AnyStateTransition(MSG.Online, fnOnline, FSM_STATE.SAME);
  82. AnyStateTransition(MSG.Offline, fnOffline, FSM_STATE.SAME);
  83. AnyStateTransition(MSG.Home, fnHome, STATE.Initializing);
  84. // Home
  85. Transition(STATE.Initializing, FSM_MSG.TIMER, fnHoming, STATE.Idle);
  86. //vent sequence
  87. Transition(STATE.Idle, MSG.Vent, FnStartVent, STATE.Venting);
  88. Transition(STATE.Venting, FSM_MSG.TIMER, FnVentTimeout, STATE.Idle);
  89. Transition(STATE.Venting, MSG.Abort, FnAbortVent, STATE.Idle);
  90. //Pump sequence
  91. Transition(STATE.Idle, MSG.Pump, FnStartPump, STATE.Pumping);
  92. Transition(STATE.Pumping, FSM_MSG.TIMER, FnPumpTimeout, STATE.Idle);
  93. Transition(STATE.Pumping, MSG.Abort, FnAbortPump, STATE.Idle);
  94. // Purge sequence
  95. Transition(PMState.Idle, MSG.CyclePurge, FnStartPurge, PMState.Purging);
  96. Transition(PMState.Purging, FSM_MSG.TIMER, FnPurgeTimeout, PMState.Idle);
  97. Transition(PMState.Purging, MSG.Abort, FnAbortPurge, PMState.Idle);
  98. // Leak check sequence
  99. Transition(PMState.Idle, MSG.LeakCheck, FnStartLeakCheck, PMState.LeakCheck);
  100. Transition(PMState.LeakCheck, FSM_MSG.TIMER, FnLeakCheckTimeout, PMState.Idle);
  101. Transition(PMState.LeakCheck, MSG.Abort, FnAbortLeakCheck, PMState.Idle);
  102. Running = true;
  103. }
  104. public int Invoke(string function, params object[] args)
  105. {
  106. switch (function)
  107. {
  108. case "Home":
  109. CheckToPostMessage((int)MSG.Home);
  110. return (int)MSG.Home;
  111. }
  112. return (int)FSM_MSG.NONE;
  113. }
  114. public bool CheckAcked(int msg)
  115. {
  116. return fsm.CheckExecuted(msg);
  117. }
  118. public bool CheckToPostMessage(int msg, params object[] args)
  119. {
  120. if (!fsm.FindTransition(fsm.State, msg))
  121. {
  122. LOG.Write(eEvent.WARN_FSM_WARN, Module, $"{Module} is in {(STATE)fsm.State} state,can not do {(MSG)msg}");
  123. return false;
  124. }
  125. Running = true;
  126. fsm.PostMsg(msg, args);
  127. return true;
  128. }
  129. private bool fnMonitor(object[] param)
  130. {
  131. return true;
  132. }
  133. private bool fnError(object[] param)
  134. {
  135. IsOnline = false;
  136. return true;
  137. }
  138. private bool fnOnline(object[] param)
  139. {
  140. return true;
  141. }
  142. private bool fnOffline(object[] param)
  143. {
  144. IsOnline = false;
  145. return true;
  146. }
  147. private bool fnAbort(object[] param)
  148. {
  149. return true;
  150. }
  151. private bool fnHome(object[] param)
  152. {
  153. return true;
  154. }
  155. private bool fnHoming(object[] param)
  156. {
  157. return true;
  158. }
  159. private bool FnStartVent(object[] param)
  160. {
  161. return _ventingRoutine.Start() == RState.Running;
  162. }
  163. private bool FnVentTimeout(object[] param)
  164. {
  165. RState ret = _ventingRoutine.Monitor();
  166. if (ret == RState.Failed || ret == RState.Timeout)
  167. {
  168. PostMsg(MSG.Error);
  169. return false;
  170. }
  171. return ret == RState.End;
  172. }
  173. private bool FnAbortVent(object[] param)
  174. {
  175. _ventingRoutine.Abort();
  176. return true;
  177. }
  178. private bool FnStartPump(object[] param)
  179. {
  180. return _pumpingRoutine.Start() == RState.Running;
  181. }
  182. private bool FnPumpTimeout(object[] param)
  183. {
  184. RState ret = _pumpingRoutine.Monitor();
  185. if (ret == RState.Failed || ret == RState.Timeout)
  186. {
  187. PostMsg(MSG.Error);
  188. return false;
  189. }
  190. return ret == RState.End;
  191. }
  192. private bool FnAbortPump(object[] param)
  193. {
  194. _pumpingRoutine.Abort();
  195. return true;
  196. }
  197. private bool FnStartPurge(object[] param)
  198. {
  199. return _purgeRoutine.Start() == RState.Running;
  200. }
  201. private bool FnPurgeTimeout(object[] param)
  202. {
  203. RState ret = _purgeRoutine.Monitor();
  204. if (ret == RState.Failed || ret == RState.Timeout)
  205. {
  206. PostMsg(MSG.Error);
  207. return false;
  208. }
  209. return ret == RState.End;
  210. }
  211. private bool FnAbortPurge(object[] param)
  212. {
  213. _purgeRoutine.Abort();
  214. return true;
  215. }
  216. private bool FnStartLeakCheck(object[] param)
  217. {
  218. return _leakCheckRoutine.Start() == RState.Running;
  219. }
  220. private bool FnLeakCheckTimeout(object[] param)
  221. {
  222. RState ret = _leakCheckRoutine.Monitor();
  223. if (ret == RState.Failed || ret == RState.Timeout)
  224. {
  225. PostMsg(MSG.Error);
  226. return false;
  227. }
  228. return ret == RState.End;
  229. }
  230. private bool FnAbortLeakCheck(object[] param)
  231. {
  232. _leakCheckRoutine.Abort();
  233. return true;
  234. }
  235. }
  236. }