95 lines
1.9 KiB
C#
95 lines
1.9 KiB
C#
using System.IO.Ports;
|
|
|
|
namespace LibreHardwareMonitor.Hardware.PowerMonitor;
|
|
|
|
internal sealed class SharedSerialPort : SerialPort
|
|
{
|
|
private bool _hasMutex;
|
|
|
|
public SharedSerialPort()
|
|
{ }
|
|
|
|
public SharedSerialPort(string portName) : base(portName)
|
|
{ }
|
|
|
|
public SharedSerialPort(string portName, int baudRate) : base(portName, baudRate)
|
|
{ }
|
|
|
|
public SharedSerialPort(string portName, int baudRate, Parity parity) : base(portName, baudRate, parity)
|
|
{ }
|
|
|
|
public SharedSerialPort(string portName, int baudRate, Parity parity, int dataBits)
|
|
: base(portName, baudRate, parity, dataBits)
|
|
{ }
|
|
|
|
public SharedSerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
|
|
: base(portName, baudRate, parity, dataBits, stopBits)
|
|
{ }
|
|
|
|
private int MutexTimeout { get; set; } = 500;
|
|
|
|
public new void Open()
|
|
{
|
|
_hasMutex = Mutexes.WaitUsbSensors(MutexTimeout);
|
|
if (_hasMutex && !IsOpen)
|
|
{
|
|
base.Open();
|
|
}
|
|
}
|
|
|
|
public new void Close()
|
|
{
|
|
if (!_hasMutex)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
if (IsOpen)
|
|
{
|
|
base.Close();
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
_hasMutex = false;
|
|
Mutexes.ReleaseUsbSensors();
|
|
}
|
|
}
|
|
|
|
public new void Write(byte[] buffer, int offset, int count)
|
|
{
|
|
if (_hasMutex)
|
|
{
|
|
base.Write(buffer, offset, count);
|
|
}
|
|
}
|
|
|
|
public new int Read(byte[] buffer, int offset, int count)
|
|
{
|
|
if (_hasMutex)
|
|
{
|
|
return base.Read(buffer, offset, count);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
public new void DiscardInBuffer()
|
|
{
|
|
if (_hasMutex)
|
|
{
|
|
base.DiscardInBuffer();
|
|
}
|
|
}
|
|
|
|
public new void DiscardOutBuffer()
|
|
{
|
|
if (_hasMutex)
|
|
{
|
|
base.DiscardOutBuffer();
|
|
}
|
|
}
|
|
}
|