116 lines
4.3 KiB
C#
116 lines
4.3 KiB
C#
/*
|
|
* 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 {
|
|
/// <summary>
|
|
/// 얼라인 에이전트 생성 및 등록
|
|
/// </summary>
|
|
public static class AlignerFactory {
|
|
private static Logger _Logger = new Logger("AlignerFactory");
|
|
private static Assembly _callingAssembly = null;
|
|
private static IDisposable _EventDisposable;
|
|
|
|
/// <summary>
|
|
/// 얼라인 에이전트 생성 및 등록
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 얼라인 레시피 갱신
|
|
/// </summary>
|
|
/// <param name="subSysInfo">서브시스템 정보</param>
|
|
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;
|
|
}
|
|
}
|
|
}
|