1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using Edge.Core.Parser;
- using Edge.Core.Processor.Communicator;
- using System;
- using System.IO;
- using System.Threading.Tasks;
- namespace Edge.Core.Processor
- {
- public interface IDeviceHandler<TRaw, TMessage> where TMessage : MessageBase
- {
-
-
-
-
- void Init(IContext<TRaw, TMessage> context);
-
-
-
-
- Task Process(IContext<TRaw, TMessage> context);
-
-
-
-
-
-
-
-
- Task Test(params object[] parameters) { throw new NotImplementedException("暂不支持测试"); }
- }
- public abstract class TestableActivePollingDeviceHandler<TRaw, TMessage> : IDeviceHandler<TRaw, TMessage> where TMessage : MessageBase
- {
- private IContext<TRaw, TMessage> context;
- public virtual void Init(IContext<TRaw, TMessage> context)
- {
- this.context = context;
- }
- public Task Test(params object[] parameters)
- {
- var errorMsgReadTcs = new TaskCompletionSource<CommunicatorErrorMessageReadEventArg>();
- EventHandler<CommunicatorErrorMessageReadEventArg> onErrorMessageReadEvtHandler = (s, a) =>
- {
- if (errorMsgReadTcs.Task.Status == TaskStatus.RanToCompletion
- || errorMsgReadTcs.Task.Status == TaskStatus.Faulted
- || errorMsgReadTcs.Task.Status == TaskStatus.Canceled)
- return;
- errorMsgReadTcs.SetResult(a);
- };
- var dataReceivedTcs = new TaskCompletionSource<CommunicatorEventArg<TRaw, TMessage>>();
- EventHandler<CommunicatorEventArg<TRaw, TMessage>> onDataReceivedEvtHandler = (s, a) =>
- {
- if (dataReceivedTcs.Task.Status == TaskStatus.RanToCompletion
- || errorMsgReadTcs.Task.Status == TaskStatus.Faulted
- || errorMsgReadTcs.Task.Status == TaskStatus.Canceled)
- return;
- dataReceivedTcs.SetResult(a);
- };
- try
- {
- this.context.Communicator.OnErrorMessageRead += onErrorMessageReadEvtHandler;
- this.context.Communicator.OnDataReceived += onDataReceivedEvtHandler;
- var i = Task.WaitAny(new Task[] { Task.Delay(12000), errorMsgReadTcs.Task, dataReceivedTcs.Task });
- if (i == 0)
- throw new TimeoutException("12秒内未收到任何通讯层(从设备发入至 FCC)数据, 可能线路连接问题,或者设备问题?");
- if (i == 1)
- throw new InvalidDataException("收到了一些未识别的通讯层(从设备发入至 FCC)数据,可能线路设置问题,或者设备问题?" + Environment.NewLine + (errorMsgReadTcs.Task.Result?.Hint));
- if (i == 2)
- { }
- return Task.CompletedTask;
- }
- finally
- {
- this.context.Communicator.OnErrorMessageRead -= onErrorMessageReadEvtHandler;
- this.context.Communicator.OnDataReceived -= onDataReceivedEvtHandler;
- }
- }
- public virtual Task Process(IContext<TRaw, TMessage> context)
- {
- throw new NotImplementedException();
- }
- }
- }
|