Files
HawkeyeVision/VisionBuilder.UI.IOCommander/Modules/IOCommanderModule.cs
EugeneTes 2bac7140a4 2.0.14
2026-02-17 10:11:33 +01:00

92 lines
2.7 KiB
C#

using System.Collections.Concurrent;
using Serilog;
using VisionBuilder.UI.Common;
using VisionBuilder.UI.Common.Commands;
using VisionBuilder.UI.Common.ViewModel;
using VisionBuilder.UI.IOCommander.Interfaces;
using VisionBuilder.UI.IOCommander.Settings;
namespace VisionBuilder.UI.IOCommander.Modules;
public class IOCommanderModule:IVisionBuilderModule
{
private readonly IOCommanderSettings _settings;
private readonly IIOCommanderFactory _factory;
private readonly IIOCommanderDebugViewService _debugViewService;
private IIOCommander? _ioCommander;
public IOCommanderModule(IOCommanderSettings settings, IIOCommanderFactory factory, IIOCommanderDebugViewService debugViewService)
{
_settings = settings;
_factory = factory;
_debugViewService = debugViewService;
}
public void InitializeModule()
{
if(!_settings.Enabled)return;
try
{
_ioCommander = _factory.Create();
_ioCommander.OnPinChanged += OnPinChanged;
BroadcastInitialPinStates();
}
catch (Exception e)
{
Log.Warning("IOCommander did non load: {e}",e);
_ioCommander= null;
}
if (_settings.ShowDebugView)_debugViewService.ShowDebugView();
}
private void BroadcastInitialPinStates()
{
if (_ioCommander == null) return;
Task.Run(async () =>
{
// Wait for the first poll cycle to populate PinState
for (int attempt = 0; attempt < 10 && _ioCommander?.PinState == null; attempt++)
{
await Task.Delay(200);
}
if (_ioCommander?.PinState == null) return;
for (int i = 0; i < _ioCommander.PinState.Length; i++)
{
OnPinChanged(i + 1, _ioCommander.PinState[i]);
}
});
}
ConcurrentDictionary<int, bool> _pinStates = new ConcurrentDictionary<int, bool>();
public event Action<int, bool>? OnPinChangedEvent = delegate { };
private void OnPinChanged(int arg1, bool arg2)
{
_pinStates[arg1] = arg2;
_debugViewService.SetInputPinStatus(arg1, arg2);
OnPinChangedEvent?.Invoke(arg1, arg2);
}
public void SetOutput(int pin, bool value)
{
if (_ioCommander != null)
{
_ioCommander.SetPins(pin, value);
}
_debugViewService.SetOutputPinStatus(pin,value);
}
public bool GetInput(int pin)
{
if (_ioCommander == null) return false;
var found=_pinStates.TryGetValue(pin, out var value);
if (found)
{
return value;
}
return false;
}
}