common/Hardware/Common.Hardware.SIRT/SIRTPort.cs
2026-04-23 17:50:07 +02:00

179 lines
4.6 KiB
C#

namespace Common.Hardware.SIRT
{
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using System.Threading;
public class SIRTPort
{
private readonly SerialPort serialPort;
private readonly bool log_RX_TX;
public SIRTPort(string portName, bool log_RX_TX = true)
{
this.serialPort = new SerialPort(portName, 112500, Parity.None, 8, StopBits.One);
this.log_RX_TX = log_RX_TX;
}
public bool IsOpen => this.serialPort.IsOpen;
public string PortName => this.serialPort.PortName;
public void Close()
{
this.LogMessage($"Closing: {this}");
var waitEvent = new ManualResetEventSlim();
var disposed = false;
void SerialPortDisposed(object sender, EventArgs args)
{
disposed = true;
this.LogMessage($"Disposed: {this}");
waitEvent.Set();
}
this.serialPort.Disposed += SerialPortDisposed;
try
{
this.serialPort.Close();
waitEvent.Wait(5000);
}
catch (Exception e)
{
this.LogMessage(e);
}
this.serialPort.Disposed -= SerialPortDisposed;
if (disposed)
{
this.LogMessage($"Closed: {this}");
}
}
public void Open()
{
this.LogMessage($"Opening: {this}");
try
{
this.serialPort.Open();
}
catch (Exception e)
{
this.LogMessage(e);
}
if (this.IsOpen)
{
this.LogMessage($"Opened: {this}");
}
else
{
this.Close();
}
}
public IEnumerable<byte[]> GetEnumerable()
{
var manualResetEventSlim = new ManualResetEventSlim();
void DataReceived(object sender, SerialDataReceivedEventArgs args)
{
if (args.EventType == SerialData.Chars)
{
manualResetEventSlim.Set();
}
}
this.serialPort.DataReceived += DataReceived;
var bufferSize = this.serialPort.ReadBufferSize;
var buffer = new byte[bufferSize];
var length = default(int);
while (this.serialPort.IsOpen)
{
buffer = new byte[bufferSize];
length = this.serialPort.Read(buffer, 0, bufferSize);
Array.Resize(ref buffer, length);
yield return buffer;
manualResetEventSlim.Reset();
manualResetEventSlim.Wait();
}
this.serialPort.DataReceived -= DataReceived;
}
public IEnumerable<byte[]> ReadBytes()
{
var bufferSize = this.serialPort.ReadBufferSize;
var buffer = default(byte[]);
var length = default(int);
while (this.serialPort.IsOpen)
{
buffer = new byte[bufferSize];
try
{
length = this.serialPort.Read(buffer, 0, bufferSize);
}
catch (IOException e)
{
break;
}
catch (Exception e)
{
this.LogMessage(e);
continue;
}
Array.Resize(ref buffer, length);
yield return buffer;
if (this.log_RX_TX)
{
this.LogMessage($"RX|{BitConverter.ToString(buffer)}");
}
}
}
public override string ToString()
=> $"{this.serialPort.PortName}, "
+ $"{this.serialPort.BaudRate}, "
+ $"{this.serialPort.Parity}, "
+ $"{this.serialPort.DataBits}, "
+ $"{this.serialPort.StopBits}";
public void Write(byte[] bytes)
{
try
{
this.serialPort.Write(bytes, 0, bytes.Length);
if (this.log_RX_TX)
{
this.LogMessage($"TX|{BitConverter.ToString(bytes)}");
}
}
catch (Exception e)
{
this.LogMessage(e);
}
}
private void LogMessage(object message)
=> SIRTLogger.LogMessage($"{nameof(SIRTPort)}|{this.PortName}|{message}");
}
}