/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora; using Aurora.Api; using VisionCommon; using System; using System.Linq; using System.Reflection; namespace VisionAligner { /// /// 얼라인 에이전트 생성 및 등록 /// public static class AlignerFactory { private static Logger _Logger = new Logger("AlignerFactory"); private static Assembly _callingAssembly = null; private static IDisposable _EventDisposable; /// /// 얼라인 에이전트 생성 및 등록 /// public static void Register() { try { VersionChecker.Print(Assembly.GetExecutingAssembly().GetName()); _callingAssembly = Assembly.GetCallingAssembly(); SetObservable(); SetAlignAgentManager(); } catch (Exception e) { _Logger.FuncE(e.Message); } } private static void SetObservable() { if (_EventDisposable == null) { var observable = VisionEventId.GetRecipeUpdateObservable(); _EventDisposable = observable.Subscribe(_ => UpdateAlignAgentManager()); } } private static void SetAlignAgentManager() { AlignAgentManager.Clear(); foreach (var alignInfo in VisionRecipeManager.GetAlignInfos()) { CreateAlignAgent(alignInfo); } } private static void UpdateAlignAgentManager() { var newAlignInfos = VisionRecipeManager.GetAlignInfos(); // 삭제된 에이전트 제거 AlignAgentManager.DeleteUnusedAgent(newAlignInfos); foreach (var alignInfo in newAlignInfos) { // 새로 생성된 에이전트 추가 if (AlignAgentManager.IsNewAlignInfo(alignInfo)) { CreateAlignAgent(alignInfo); } } } private static void CreateAlignAgent(AlignInfo alignInfo) { var alignRecipe = VisionRecipeManager.GetAlignRecipe(alignInfo); var alignMode = CreateAlignMode(alignInfo, alignRecipe.ProcParams.AlignMode); var alignAgent = new AlignAgent(alignInfo, alignMode); AlignAgentManager.SetAlignAgent(alignInfo, alignAgent); } /// /// 얼라인 레시피 갱신 /// /// 서브시스템 정보 public static void Update(SubSysInfo subSysInfo) { foreach (AlignInfo alignInfo in VisionRecipeManager.GetAlignInfos(subSysInfo)) { var alignAgnet = AlignAgentManager.GetAlignAgent(alignInfo); var alignRecipe = VisionRecipeManager.GetAlignRecipe(alignInfo); var alignMode = CreateAlignMode(alignInfo, alignRecipe.ProcParams.AlignMode); alignAgnet?.UpdateRecipe(alignMode); } } private static AlignMode CreateAlignMode(AlignInfo alignInfo, eAlignMode alignMode) { switch (alignMode) { case eAlignMode.Stage: return new AlignModeStage(alignInfo); case eAlignMode.Head: return new AlignModeHead(alignInfo); case eAlignMode.MachineAlign_A: case eAlignMode.MachineAlign_B: return CreateAlignModeFromMachine(alignInfo, alignMode); } return null; } private static AlignMode CreateAlignModeFromMachine(AlignInfo alignInfo, eAlignMode alignMode) { Type targetType = typeof(AlignMode); string className = alignMode.ToString(); // ex) MachineAlign_A or MachineAlign_B var types = _callingAssembly.GetExportedTypes(); foreach (var type in types) { if (className == type.Name && targetType.IsAssignableFrom(type)) { ConstructorInfo ctor = type.GetConstructor(new[] { typeof(AlignInfo) }); return (AlignMode)ctor.Invoke(new object[] { alignInfo }); } } _Logger.FuncE($"Fail to create AlignMode : {alignMode}"); return null; } } }