/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using VisionCommon; using VisionAligner; using VisionCalibrator; using VisionSequence.Pattern; using System.Collections.Generic; using System.Linq; using VisionCommonUI; using VisionCommonUI.Resources; namespace VisionSequence.Aligner { /// /// C1_F1_M2R 얼라인 시퀀스 파라미터 /// public class AlignSeqParams_C1_F1_M2R : SeqParamsBase { /// 얼라인 키 정보 public AlignInfo AlignInfo { get; set; } /// 메인 화면 타입 public eDisplayType DisplayType { get; set; } /// /// C1_F1_M2R 얼라인 시퀀스 파라미터를 얻어온다. /// /// 얼라인 키 정보 /// 메인 화면 타입 /// 시퀀스 모드 public AlignSeqParams_C1_F1_M2R( AlignInfo alignInfo, eDisplayType displayType = eDisplayType.Main_1, eSeqMode seqMode = eSeqMode.Auto) : base(seqMode) { this.AlignInfo = alignInfo; this.DisplayType = displayType; } } /// /// CAM 1대 / FOV 1개 / 포지션 이동 (X) / 1 Point Align / MeasurePattern to ReferencePattern /// public class AlignSeq_C1_F1_M2R : SubSeqBase { private readonly Logger LOG = new Logger(typeof(AlignSeq_C1_F1_M2R).Name); private AlignSeqParams_C1_F1_M2R _Params; private FovInfo _FovInfo; private AlignRecipe _AlignRecipe; private SubSysInfo _SubSysInfo; private PatternAgentBase _PatternAgent; private VisionAligner.Aligner _Aligner; private Calibrator _Calibrator; private BaseResult _MeasureResult; private BaseResult _ReferenceResult; private string _SeqName; private bool _IsForceOk = false; #region Sequence Id private const string SEQ_ID_INIT = "INIT"; private const string SEQ_ID_CLEAR = "CLEAR"; private const string SEQ_ID_SET_FIND_MEASURE_SEQ_PARAMS = "FIND_MEASURE_SEQ_PARAMS"; private const string SEQ_ID_FIND_MEASURE_SEQ = "FIND_MEASURE_SEQ"; private const string SEQ_ID_CHECK_MEASURE_FOUND = "CHECK_MEASURE_FOUND"; private const string SEQ_ID_SET_MEASURE = "SET_MEASURE"; private const string SEQ_ID_SET_FIND_REFERENCE_SEQ_PARAMS = "FIND_REFERENCE_SEQ_PARAMS"; private const string SEQ_ID_FIND_REFERENCE_SEQ = "FIND_REFERENCE_SEQ"; private const string SEQ_ID_CHECK_REFERENCE_FOUND = "CHECK_REFERENCE_FOUND"; private const string SEQ_ID_SET_REFERENCE = "SET_REFERENCE"; private const string SEQ_ID_ALIGN = "ALIGN"; private const string SEQ_ID_SEQ_COMPLETE = "SEQ_COMPLETE"; #endregion /// /// 생성자 /// public AlignSeq_C1_F1_M2R() { } private void SetActions(SequenceBuilder sb) { SequenceBuilder grabFindProcSeqBuilder_Mea = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), "GrabFindProcSeq_Mea"); SequenceBuilder grabFindProcSeqBuilder_Ref = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), "GrabFindProcSeq_Ref"); sb.AddAction(SEQ_ID_INIT, Init); sb.AddAction(SEQ_ID_CLEAR, Clear); sb.AddAction(SEQ_ID_SET_FIND_MEASURE_SEQ_PARAMS, SetFindMeasureSeqParams); sb.AddSubsequence(SEQ_ID_FIND_MEASURE_SEQ, grabFindProcSeqBuilder_Mea); sb.AddDecision(SEQ_ID_CHECK_MEASURE_FOUND, CheckFound); sb.AddAction(SEQ_ID_SET_MEASURE, SetMeasure); sb.AddAction(SEQ_ID_SET_FIND_REFERENCE_SEQ_PARAMS, SetFindReferenceSeqParams); sb.AddSubsequence(SEQ_ID_FIND_REFERENCE_SEQ, grabFindProcSeqBuilder_Ref); sb.AddDecision(SEQ_ID_CHECK_REFERENCE_FOUND, CheckFound); sb.AddAction(SEQ_ID_SET_REFERENCE, SetReference); sb.AddAction(SEQ_ID_ALIGN, Align); sb.AddAction(SEQ_ID_SEQ_COMPLETE, SeqComplete); } public override SequenceBuilder Builder(string seqName) { _SeqName = seqName; SequenceBuilder sb = new SequenceBuilder(1000); SetActions(sb); sb.OnStopped(OnStopped); sb.OnForceError(OnForceError); sb.Flows( sb.Init > sb[SEQ_ID_INIT] > sb[SEQ_ID_CLEAR] > sb[SEQ_ID_SET_FIND_MEASURE_SEQ_PARAMS] > sb[SEQ_ID_FIND_MEASURE_SEQ] > sb[SEQ_ID_CHECK_MEASURE_FOUND] > sb[SEQ_ID_SET_MEASURE] > sb[SEQ_ID_SET_FIND_REFERENCE_SEQ_PARAMS] > sb[SEQ_ID_FIND_REFERENCE_SEQ] > sb[SEQ_ID_CHECK_REFERENCE_FOUND] > sb[SEQ_ID_SET_REFERENCE] > sb[SEQ_ID_ALIGN] > sb[SEQ_ID_SEQ_COMPLETE] ); sb.Flows( sb[SEQ_ID_CHECK_MEASURE_FOUND] // Measure Mark NG > sb[SEQ_ID_SEQ_COMPLETE] ); sb.Flows( sb[SEQ_ID_CHECK_REFERENCE_FOUND] // Reference Mark NG > sb[SEQ_ID_SEQ_COMPLETE] ); sb.Flows( sb[SEQ_ID_SEQ_COMPLETE] > sb.Final ); #if SEQ_DRAW sb.Draw($"{GetType().Name}.pdf"); #endif return sb; } private SequenceActionResult Init( SequenceContext context, string id, SequenceActionResult param) { if (param.Param != null) { _Params = param.Param as AlignSeqParams_C1_F1_M2R; } else { LOG.E($"Param is null."); return null; } _IsForceOk = false; _AlignRecipe = VisionRecipeManager.GetAlignRecipe(_Params.AlignInfo); _SubSysInfo = VisionRecipeManager.GetSubSysInfo(_Params.AlignInfo.UnitId, _Params.AlignInfo.SubSysId); _FovInfo = VisionRecipeManager.GetFovInfo(_SubSysInfo, eFovId.Fov1); _PatternAgent = PatternAgentManager.GetAgent(_FovInfo); _Aligner = AlignAgentManager.GetAlignAgent(_Params.AlignInfo); _Calibrator = CalibratorManager.GetCalibrator(_FovInfo); return SequenceAction.Ok(); } private SequenceActionResult Clear( SequenceContext context, string id, SequenceActionResult param) { _MeasureResult = null; _ReferenceResult = null; return SequenceAction.Ok(); } private SequenceActionResult SetFindMeasureSeqParams( SequenceContext context, string id, SequenceActionResult param) { var procPatternInfo = VisionRecipeManager.GetProcPatternInfo(_FovInfo, _AlignRecipe.AlignId.ToString(), eProcPatternId.ProcPattern1); var fovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo); var patternIndex = new PatternIndex(_FovInfo, fovRecipe.FovName, procPatternInfo.PatternId); PatternInfo patternInfo = _PatternAgent.GetPatternInfo(patternIndex); patternInfo.PatternName = procPatternInfo.PatternName; return SequenceAction.Ok(new GrabFindProcSeqParams(_FovInfo, patternInfo, _Params.DisplayType, _Params.SeqMode)); } private SequenceActionResult SetMeasure( SequenceContext context, string id, SequenceActionResult param) { // Param : PatternResult var patternResult = param.Param as PatternResult; var baseResults = patternResult.Results.ToList(); _MeasureResult = baseResults[0]; return SequenceAction.Ok(); } private SequenceActionResult SetFindReferenceSeqParams( SequenceContext context, string id, SequenceActionResult param) { var procPatternInfo = VisionRecipeManager.GetProcPatternInfo(_FovInfo, _AlignRecipe.AlignId.ToString(), eProcPatternId.ProcPattern2); var patternInfo = _PatternAgent.GetPatternInfo(_FovInfo, procPatternInfo.PatternId); patternInfo.PatternName = procPatternInfo.PatternName; return SequenceAction.Ok(new GrabFindProcSeqParams(_FovInfo, patternInfo, _Params.DisplayType)); } private SequenceActionResult SetReference( SequenceContext context, string id, SequenceActionResult param) { var patternResult = param.Param as PatternResult; var baseResults = patternResult.Results.ToList(); _ReferenceResult = baseResults[0]; return SequenceAction.Ok(); } private string CheckFound( SequenceContext context, string id, ICollection branches, SequenceActionResult param) { var patternResult = param.Param as PatternResult; if (patternResult.Status != eFoundStatus.NotFound) { if (patternResult.Status == eFoundStatus.ForceOK) { _IsForceOk = true; } if (id == SEQ_ID_CHECK_MEASURE_FOUND) { return SEQ_ID_SET_MEASURE; } else { return SEQ_ID_SET_REFERENCE; } } context.PutValue( string.Format(VisionContextKeys.CNTXT_KEY_ALIGN_RESULT, _Params.AlignInfo.GetKey()), new AlignResult() { AlignName = patternResult.PatternName, Status = AlignStatus.NOT_FOUND, AlignAlgorithm = _AlignRecipe.ProcParams.AlignAlgorithm, }); return SEQ_ID_SEQ_COMPLETE; } private SequenceActionResult Align( SequenceContext context, string id, SequenceActionResult param) { var meaAngle = _MeasureResult.Angle; var meaPoint = _MeasureResult.MaterialPosition; var refPoint = _ReferenceResult.MaterialPosition; var flipY = (int)_Calibrator.GetFlipY(); var alignResult = _Aligner.Align(meaPoint, refPoint, meaAngle, flipY); if (alignResult == null) { return SequenceAction.Error(); } else { context.PutValue(string.Format(VisionContextKeys.CNTXT_KEY_ALIGN_RESULT, _Params.AlignInfo.GetKey()), alignResult); } return SequenceAction.Ok(alignResult); } private SequenceActionResult SeqComplete( SequenceContext context, string id, SequenceActionResult param) { AlignResult alignResult = context.GetValue(string.Format(VisionContextKeys.CNTXT_KEY_ALIGN_RESULT, _Params.AlignInfo.GetKey())); if (alignResult == null) { return SequenceAction.Error(); } alignResult.AlignName = _AlignRecipe.AlignName; if (_IsForceOk && alignResult.Status == AlignStatus.OK) { alignResult.Status = AlignStatus.F_OK; } context.PutValue(string.Format(VisionContextKeys.CNTXT_KEY_LAST_MEASURE_FOV_ID, _Params.AlignInfo.GetKey()), _FovInfo.FovId); return SequenceAction.Ok(alignResult); } void OnStopped( SequenceContext context) { LOG.I($"{context.SequenceId} - STOP Handler"); HandleAbnormalFinish(context); } void OnForceError( SequenceContext context, string id) { LOG.E($"{context.SequenceId} - FORCE ERROR Handler"); HandleAbnormalFinish(context); } void HandleAbnormalFinish( SequenceContext context) { } } }