using Barcode.Host.Shared.KeyboardMouse.Abstract; using Microsoft.Extensions.Logging; namespace Barcode.Host.Shared.KeyboardMouse; public class AggregateInputReader : IDisposable, IAggregateInputReader { private readonly ILogger _InputReaderLogger; private Dictionary? _Readers = new(); public event InputReader.RaiseKeyPress? OnKeyPress; public AggregateInputReader(ILogger 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? 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; } }