using Serilog; using VisionBuilder.UI.Common; using VisionBuilder.UI.Statistics; namespace B24SiemensPlugin; public class SiemensCameraModule: IVisionBuilderModule { private readonly SingleCameraVM _singleCameraVm; private readonly B24SiemensSettings _settings; private readonly VisionBuilderStatistics _statistics; private SiemensServer _server; public SiemensCameraModule(SingleCameraVM singleCameraVm,B24SiemensSettings settings, VisionBuilderStatistics statistics) { _singleCameraVm = singleCameraVm; _settings = settings; _statistics = statistics; } public void InitializeModule() { _server = new SiemensServer(); _server.OnPLCPacket += _server_OnPLCPacket; _server.Start(); } string? GetMapping(int material) { var mapping = _settings.RecipeMappings.FirstOrDefault(x => x.MaterialNumber == material); if (mapping == null) { return null; } return mapping.RecipeName; } private PLCPacket _server_OnPLCPacket(PLCPacket packet) { if (_singleCameraVm.SynchronizationContext == null) { Log.Warning("Synchronization context is null, cannot update UI from PLC packet."); return packet; } packet.KameraStart= _singleCameraVm.IsRunning; var recipe = GetMapping(packet.Materialnummer); var selectedRecipe = _singleCameraVm.SelectedRecipe; if (recipe != null && recipe != selectedRecipe?.RecipeName) { var vm = _singleCameraVm.GetRecipeSelectionVm(); vm.SelectedRecipe = vm.Recipes.FirstOrDefault(r => r.RecipeName == recipe); if (vm.SelectedRecipe != null) { _singleCameraVm.SynchronizationContext!.Post((_) => { _singleCameraVm.ProcessRecipeSelectionVm(vm); }, null); _statistics.Metadata = packet.Materialnummer.ToString(); } } return packet; } }