SampleSmart 1.0.0.0
SampleSmart 사용 방법을 보여 주는 예제 프로젝트입니다.
로딩중...
검색중...
일치하는것 없음
SampleFastech16PointTransport.cs
이 파일의 문서화 페이지로 가기
1using System.Text;
2using Dreamine.IO.Abstractions.Results;
3using Dreamine.IO.Fastech.Ethernet.Transport;
4
6
15public sealed class SampleFastech16PointTransport : IFastechEthernetIoTransport
16{
25 private readonly bool[] _inputs = new bool[16];
34 private readonly bool[] _outputs = new bool[16];
43 private bool _disposed;
44
53 public bool IsConnected { get; private set; }
54
87 public void SetInput(int channel, bool value)
88 {
89 if (channel is < 0 or >= 16)
90 {
91 throw new ArgumentOutOfRangeException(nameof(channel), channel, "Channel must be between 0 and 15.");
92 }
93
94 _inputs[channel] = value;
95 }
96
105 public void ToggleInputPattern()
106 {
107 for (var i = 0; i < _inputs.Length; i++)
108 {
109 _inputs[i] = i % 2 == 0
110 ? !_inputs[i]
111 : _inputs[i];
112 }
113 }
114
139 public Task<IoResult> ConnectAsync(CancellationToken cancellationToken = default)
140 {
142 IsConnected = true;
143
144 return Task.FromResult(IoResult.Success());
145 }
146
171 public Task<IoResult> DisconnectAsync(CancellationToken cancellationToken = default)
172 {
173 IsConnected = false;
174
175 return Task.FromResult(IoResult.Success());
176 }
177
226 public Task<IoResult<byte[]>> SendAndReceiveAsync(
227 IReadOnlyList<byte> requestFrame,
228 int receiveTimeoutMs,
229 int expectedResponseLength,
230 CancellationToken cancellationToken = default)
231 {
232 ArgumentNullException.ThrowIfNull(requestFrame);
234
235 if (!IsConnected)
236 {
237 return Task.FromResult(IoResult<byte[]>.Failure("The sample Fastech transport is not connected."));
238 }
239
240 var request = Encoding.ASCII.GetString(requestFrame as byte[] ?? requestFrame.ToArray()).Trim();
241 var response = HandleRequest(request);
242
243 return Task.FromResult(IoResult<byte[]>.Success(Encoding.ASCII.GetBytes(response)));
244 }
245
262 public ValueTask DisposeAsync()
263 {
264 _disposed = true;
265 IsConnected = false;
266
267 return ValueTask.CompletedTask;
268 }
269
294 private string HandleRequest(string request)
295 {
296 if (request.StartsWith("RDI", StringComparison.OrdinalIgnoreCase))
297 {
298 return $"DI {ToBitString(_inputs)}";
299 }
300
301 if (request.StartsWith("RDO", StringComparison.OrdinalIgnoreCase))
302 {
303 return $"DO {ToBitString(_outputs)}";
304 }
305
306 if (request.StartsWith("WDO ", StringComparison.OrdinalIgnoreCase))
307 {
308 var bits = request[4..].Trim();
309 for (var i = 0; i < _outputs.Length && i < bits.Length; i++)
310 {
311 _outputs[i] = bits[i] == '1';
312 }
313
314 return "OK";
315 }
316
317 return "ERR Unknown sample request";
318 }
319
344 private static string ToBitString(IReadOnlyList<bool> values)
345 {
346 return new string(values.Select(x => x ? '1' : '0').ToArray());
347 }
348
357 private void ThrowIfDisposed()
358 {
359 ObjectDisposedException.ThrowIf(_disposed, this);
360 }
361}
Task< IoResult > DisconnectAsync(CancellationToken cancellationToken=default)
Task< IoResult< byte[]> > SendAndReceiveAsync(IReadOnlyList< byte > requestFrame, int receiveTimeoutMs, int expectedResponseLength, CancellationToken cancellationToken=default)
Task< IoResult > ConnectAsync(CancellationToken cancellationToken=default)