Files
HawkeyeVision/VisionBuilder.UI.IOCommander/Modules/IOCommanderCameraModule.cs
2025-07-21 12:07:33 +02:00

123 lines
3.8 KiB
C#

using System.Runtime;
using VisionBuilder.UI.Common;
using VisionBuilder.UI.Common.Commands;
using VisionBuilder.UI.Common.RecipeProcessing;
using VisionBuilder.UI.Common.ViewModel;
using VisionBuilder.UI.IOCommander.Settings;
namespace VisionBuilder.UI.IOCommander.Modules;
public class IOCommanderCameraModule: IVisionBuilderModule
{
private readonly IOCommanderModule _mainModule;
private readonly IOCommanderSettings _settings;
private readonly IOCommanderCameraSettings _cameraSettings;
private readonly IRecognitionControl _recognitionControl;
private readonly MainWindowVM _mainWindowVm;
private readonly SingleCameraVM _cameraVm;
public IOCommanderCameraModule(IOCommanderModule mainModule, IOCommanderSettings settings, IOCommanderCameraSettings cameraSettings, IRecognitionControl recognitionControl, MainWindowVM mainWindowVm, SingleCameraVM cameraVm)
{
_mainModule = mainModule;
_settings = settings;
_cameraSettings = cameraSettings;
_recognitionControl = recognitionControl;
_mainWindowVm = mainWindowVm;
_cameraVm = cameraVm;
_recognitionControl.ImageProcessed += _recognitionControl_ImageProcessed;
_recognitionControl.SessionStarted += _recognitionControl_SessionStarted;
_recognitionControl.SessionEnded += _recognitionControl_SessionEnded;
mainModule.OnPinChangedEvent += MainModule_OnPinChangedEvent;
}
private void ProcessCommand(EGPIOCommand command)
{
switch (command)
{
case EGPIOCommand.Start:
if(_cameraVm.StartCommand.CanExecute(null))
{
_cameraVm.StartCommand.Execute(null);
}
break;
case EGPIOCommand.Stop:
if(_cameraVm.StopCommand.CanExecute(null))
{
_cameraVm.StopCommand.Execute(null);
}
break;
default:
throw new ArgumentOutOfRangeException(nameof(command), command, null);
}
}
private void MainModule_OnPinChangedEvent(int arg1, bool arg2)
{
var @event = _cameraSettings.GPIOCommands.FirstOrDefault(x => x.Pin == arg1 && x.OnHigh == arg2);
if (@event != null)
{
ProcessCommand(@event.Command);
}
}
private void EmitEvent(EProcessingEvent @event)
{
var @eventActions = _cameraSettings.ProcessingEvents.First(x => x.Event == @event);
var actions = @eventActions.Actions;
if (_mainWindowVm.TestMode)
{
var testModeActions = _cameraSettings.TestModeOverride;
var testModePins = testModeActions.Select(x => x.Pin).ToList();
actions = actions.Where(x => !testModePins.Contains(x.Pin)).ToList();
actions.AddRange(testModeActions);
}
foreach (var action in actions)
{
_mainModule.SetOutput(action.Pin, !action.Low);
if (action.Pulse)
{
Task.Run(async () =>
{
await Task.Delay(_settings.PulseLength);
_mainModule.SetOutput(action.Pin, action.Low);
});
}
}
}
public void InitializeModule()
{
}
private void _recognitionControl_SessionEnded(SessionEndedEvent obj)
{
EmitEvent(EProcessingEvent.SessionEnded);
}
private void _recognitionControl_SessionStarted(SessionStartedEvent obj)
{
EmitEvent(EProcessingEvent.SessionStarted);
}
private void _recognitionControl_ImageProcessed(Common.Commands.ImageProcessedEvent obj)
{
if (obj.HasError)
{
EmitEvent(EProcessingEvent.ErrorOccurred);
}
else
{
EmitEvent(EProcessingEvent.GoodOccured);
}
}
}