72 lines
1.8 KiB
C#
72 lines
1.8 KiB
C#
using Barcode.Host.Shared.KeyboardMouse.Abstract;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace Barcode.Host.Shared.KeyboardMouse;
|
|
|
|
public class AggregateInputReader : IDisposable, IAggregateInputReader
|
|
{
|
|
private readonly ILogger<InputReader> _InputReaderLogger;
|
|
|
|
private Dictionary<string, InputReader>? _Readers = new();
|
|
|
|
public event InputReader.RaiseKeyPress? OnKeyPress;
|
|
|
|
public AggregateInputReader(ILogger<InputReader> inputReaderLogger)
|
|
{
|
|
_InputReaderLogger = inputReaderLogger;
|
|
|
|
System.Timers.Timer timer = new()
|
|
{
|
|
Interval = 10 * 1000,
|
|
Enabled = true
|
|
};
|
|
timer.Elapsed += (_, _) => Scan();
|
|
timer.Start();
|
|
}
|
|
|
|
private void ReaderOnOnKeyPress(KeyPressEvent e) => OnKeyPress?.Invoke(e);
|
|
|
|
private void Scan()
|
|
{
|
|
string[] files = Directory.GetFiles("/dev/input/", "event*");
|
|
|
|
foreach (string file in files)
|
|
{
|
|
if (_Readers is not null && _Readers.ContainsKey(file))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
InputReader reader = new(file, _InputReaderLogger);
|
|
|
|
reader.OnKeyPress += ReaderOnOnKeyPress;
|
|
|
|
_Readers?.Add(file, reader);
|
|
}
|
|
|
|
IEnumerable<InputReader>? deadReaders = _Readers?.Values.Where(r => r.Faulted);
|
|
if (deadReaders is not null)
|
|
{
|
|
foreach (InputReader? dr in deadReaders)
|
|
{
|
|
_ = _Readers?.Remove(dr.Path);
|
|
dr.OnKeyPress -= ReaderOnOnKeyPress;
|
|
dr.Dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (_Readers is not null)
|
|
{
|
|
foreach (InputReader d in _Readers.Values)
|
|
{
|
|
d.OnKeyPress -= ReaderOnOnKeyPress;
|
|
d.Dispose();
|
|
}
|
|
}
|
|
|
|
_Readers = null;
|
|
}
|
|
} |