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;
}
}
}