GetStatusFromForecourt.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Wayne.Lib;
  2. using Wayne.Lib.StateEngine;
  3. using Wayne.Lib.StateEngine.Generic;
  4. namespace Wayne.ForecourtControl.Fusion.ReadDeviceStatus.States
  5. {
  6. [StateDescription(StateDescriptionType.Summary,"Gets Device status information from Forecourt")]
  7. [TimeoutDescription("Forecourt took too long to answer", BasicTransitionType.Timeout)]
  8. [EnterDescription("No information to get", BasicTransitionType.Done)]
  9. [EventDescription(EventType.GetStatus,"Information returned", BasicTransitionType.Done)]
  10. [EventDescription(EventType.ReadDeviceStatus,"Do nothing", null)]
  11. abstract class GetStatusFromForecourt: TimeoutState<ReadDeviceStatusController>
  12. {
  13. private object _userToken;
  14. #region Overrides of TimeoutState<ReadDeviceStatusController>
  15. /// <summary>
  16. /// See State.Enter
  17. /// </summary>
  18. /// <param name="stateEntry"></param>
  19. /// <param name="transition"></param>
  20. protected override void Enter(StateEntry stateEntry, ref Transition transition)
  21. {
  22. base.Enter(stateEntry, ref transition);
  23. _userToken =SendStatusRequestToForecourt();
  24. }
  25. protected virtual object SendStatusRequestToForecourt()
  26. {
  27. object userToken;
  28. var eventHandler = Main.CreateEventHandler<AsyncCompletedEventArgs>(EventType.GetStatus, out userToken);
  29. Main.GetDeviceState(TargetDeviceType(),eventHandler, userToken);
  30. return userToken;
  31. }
  32. protected abstract string TargetDeviceType();
  33. #endregion
  34. #region Overrides of TimeoutState<ReadDeviceStatusController>
  35. /// <summary>
  36. /// Method that is implemented by descendant classes to receive events that were not the timeout event.
  37. /// </summary>
  38. /// <param name="stateEngineEvent"></param>
  39. /// <param name="transition"></param>
  40. protected override void HandleNonTimeoutEvent(StateEngineEvent stateEngineEvent, ref Transition transition)
  41. {
  42. if (stateEngineEvent.Type.Equals(EventType.ReadDeviceStatus))
  43. {
  44. stateEngineEvent.Handled = true;//ignore.
  45. }
  46. else if (stateEngineEvent.Type.Equals(EventType.GetStatus))
  47. {
  48. var genericEvent = stateEngineEvent as GenericEvent<AsyncCompletedEventArgs>;
  49. if (genericEvent != null)
  50. {
  51. if (genericEvent.EventArgs.UserToken.Equals(_userToken))
  52. {
  53. genericEvent.Handled = true;
  54. _userToken = null;
  55. transition = new Transition(this, BasicTransitionType.Done);
  56. }
  57. }
  58. }
  59. }
  60. /// <summary>
  61. /// Method that is used by descendant classes to set the timeout of the state.
  62. /// </summary>
  63. /// <returns></returns>
  64. protected override int TimeoutInterval
  65. {
  66. get { return 10000; }
  67. }
  68. /// <summary>
  69. /// Method that is used by descendant classes to be signaled when the timeout has fired.
  70. /// </summary>
  71. /// <param name="transition"></param>
  72. protected override void Timeout(ref Transition transition)
  73. {
  74. transition = new Transition(this, BasicTransitionType.Timeout);
  75. }
  76. #endregion
  77. #region Overrides of TimeoutState<ReadDeviceStatusController>
  78. /// <summary>
  79. /// See State.Exit
  80. /// </summary>
  81. protected override void Exit()
  82. {
  83. base.Exit();
  84. if (_userToken != null)
  85. {
  86. Main.CancelEventHandler(_userToken);
  87. _userToken = null;
  88. }
  89. }
  90. #endregion
  91. }
  92. }