IDeviceHandler.cs 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using Edge.Core.Parser;
  2. using Edge.Core.Processor.Communicator;
  3. using System;
  4. using System.IO;
  5. using System.Threading.Tasks;
  6. namespace Edge.Core.Processor
  7. {
  8. public interface IDeviceHandler<TRaw, TMessage> where TMessage : MessageBase
  9. {
  10. /// <summary>
  11. /// The communicator has NOT started yet at this stage.
  12. /// </summary>
  13. /// <param name="context"></param>
  14. void Init(IContext<TRaw, TMessage> context);
  15. /// <summary>
  16. /// will be called every time that a message incoming from communicator.
  17. /// </summary>
  18. /// <param name="context"></param>
  19. Task Process(IContext<TRaw, TMessage> context);
  20. /// <summary>
  21. /// The method will be called from user for a generic test purpose, should implemented this method
  22. /// to cover most real life time logic to give user a meaningful and confidence result for how this processor would work
  23. /// when run for real.
  24. /// The method was guranteed to be called after DeviceHandler.Init, and Communicator.Start
  25. /// </summary>
  26. /// <param name="parameters"></param>
  27. /// <returns>throw exception to indicates the test failed, otherwise, return a Completed task.</returns>
  28. Task Test(params object[] parameters) { throw new NotImplementedException("暂不支持测试"); }
  29. }
  30. public abstract class TestableActivePollingDeviceHandler<TRaw, TMessage> : IDeviceHandler<TRaw, TMessage> where TMessage : MessageBase
  31. {
  32. private IContext<TRaw, TMessage> context;
  33. public virtual void Init(IContext<TRaw, TMessage> context)
  34. {
  35. this.context = context;
  36. }
  37. public Task Test(params object[] parameters)
  38. {
  39. var errorMsgReadTcs = new TaskCompletionSource<CommunicatorErrorMessageReadEventArg>();
  40. EventHandler<CommunicatorErrorMessageReadEventArg> onErrorMessageReadEvtHandler = (s, a) =>
  41. {
  42. if (errorMsgReadTcs.Task.Status == TaskStatus.RanToCompletion
  43. || errorMsgReadTcs.Task.Status == TaskStatus.Faulted
  44. || errorMsgReadTcs.Task.Status == TaskStatus.Canceled)
  45. return;
  46. errorMsgReadTcs.SetResult(a);
  47. };
  48. var dataReceivedTcs = new TaskCompletionSource<CommunicatorEventArg<TRaw, TMessage>>();
  49. EventHandler<CommunicatorEventArg<TRaw, TMessage>> onDataReceivedEvtHandler = (s, a) =>
  50. {
  51. if (dataReceivedTcs.Task.Status == TaskStatus.RanToCompletion
  52. || errorMsgReadTcs.Task.Status == TaskStatus.Faulted
  53. || errorMsgReadTcs.Task.Status == TaskStatus.Canceled)
  54. return;
  55. dataReceivedTcs.SetResult(a);
  56. };
  57. try
  58. {
  59. this.context.Communicator.OnErrorMessageRead += onErrorMessageReadEvtHandler;
  60. this.context.Communicator.OnDataReceived += onDataReceivedEvtHandler;
  61. var i = Task.WaitAny(new Task[] { Task.Delay(12000), errorMsgReadTcs.Task, dataReceivedTcs.Task });
  62. if (i == 0)
  63. throw new TimeoutException("12秒内未收到任何通讯层(从设备发入至 FCC)数据, 可能线路连接问题,或者设备问题?");
  64. if (i == 1)
  65. throw new InvalidDataException("收到了一些未识别的通讯层(从设备发入至 FCC)数据,可能线路设置问题,或者设备问题?" + Environment.NewLine + (errorMsgReadTcs.Task.Result?.Hint));
  66. if (i == 2)
  67. { }
  68. return Task.CompletedTask;
  69. }
  70. finally
  71. {
  72. this.context.Communicator.OnErrorMessageRead -= onErrorMessageReadEvtHandler;
  73. this.context.Communicator.OnDataReceived -= onDataReceivedEvtHandler;
  74. }
  75. }
  76. public virtual Task Process(IContext<TRaw, TMessage> context)
  77. {
  78. throw new NotImplementedException();
  79. }
  80. }
  81. }