123 lines
3.9 KiB
C#
123 lines
3.9 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;
|
|
|
|
|
|
}
|
|
|
|
|
|
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()
|
|
{
|
|
_mainModule.OnPinChangedEvent += MainModule_OnPinChangedEvent;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
} |