/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora.Api;
using VisionCalibrator;
using VisionCommon;
using System.Collections.Generic;
using VisionSequence.Camera;
using System.Linq;
using System;
namespace VisionSequence.Pattern {
///
/// 카메라 그랩, 픽스처와 메인 패턴 검출 시퀀스 파라미터
///
public class GrabFindWithFixtureSeqParams : GrabFindProcSeqParams {
///
/// 생성자
///
/// FOV 키 정보
/// 패턴 정보
/// 메인 화면 타입
/// 시퀀스 모드
public GrabFindWithFixtureSeqParams(
FovInfo fovInfo,
PatternInfo patternInfo,
eDisplayType displayType = eDisplayType.Main_1,
eSeqMode seqMode = eSeqMode.Auto) : base(fovInfo, patternInfo, displayType, seqMode) {
}
}
///
/// 카메라 그랩, 픽스처와 메인 패턴 검출 시퀀스
///
public class GrabFindWithFixtureSeq : SubSeqBase {
private readonly Logger _Logger;
private TactTimeChecker _TactTimeChecker;
private GrabFindWithFixtureSeqParams _Params;
private FovRecipe _FovRecipe;
private PatternAgentBase _PatternAgent;
private PatternInfo _FixturePatternInfo;
private Calibrator _Calibrator;
private CameraAgentBase _CameraAgent;
private ICameraDisplay _CameraDisplay;
private ImageManager _ImageManager = new ImageManager();
private string _SeqName;
// Get Context Key Values - Align에서 사용 할 때만 적용
private ProcParams _ProcParams;
#region Sequence Id
private const string SEQ_ID_INIT = "INIT";
private const string SEQ_ID_SET_GRAB_FIXTURE_SEQ_PARAMS = "SET_GRAB_FIXTURE_SEQ_PARAMS";
private const string SEQ_ID_GRAB_FIXTURE_SEQ = "GRAB_FIXTURE_SEQ";
private const string SEQ_ID_FIND_FIXTURE = "FIND_FIXTURE";
private const string SEQ_ID_CHECK_FIXTURE_FOUND = "CHECK_FIXTURE_FOUND";
private const string SEQ_ID_FIXTURE_FORCE_OK = "FIXTURE_FORCE_OK";
private const string SEQ_ID_CHECK_SAME_LIGHT = "CHECK_SAME_LIGHT";
private const string SEQ_ID_SET_GRAB_MAIN_SEQ_PARAMS = "SET_GRAB_MAIN_SEQ_PARAMS";
private const string SEQ_ID_GRAB_MAIN_SEQ = "GRAB_MAIN_SEQ";
private const string SEQ_ID_FIND_MAIN_WITH_FIXTURE = "FIND_MAIN_WITH_FIXTURE";
private const string SEQ_ID_CHECK_MAIN_FOUND = "CHECK_MAIN_FOUND";
private const string SEQ_ID_LIGHT_RETRY = "LIGHT_RETRY";
private const string SEQ_ID_MAIN_FORCE_OK = "MAIN_FORCE_OK";
private const string SEQ_ID_UPDATE_UI = "UPDATE_UI";
private const string SEQ_ID_SAVE_IMAGE = "SAVE_IMAGE";
private const string SEQ_ID_SEQ_COMPLETE = "SEQ_COMPLETE";
#endregion
///
/// 생성자
///
public GrabFindWithFixtureSeq() {
_Logger = new Logger($"{GetType().Name}");
}
private void SetActions(SequenceBuilder sb) {
var grabSeqBuilder_Fixture = SubSeqManager.CreateSubSeqBuilder(new GrabSeq(), "GrabSeq_Fixture");
var grabSeqBuilder_Main = SubSeqManager.CreateSubSeqBuilder(new GrabSeq(), "GrabSeq_Main");
sb.AddAction(SEQ_ID_INIT, Init);
sb.AddAction(SEQ_ID_SET_GRAB_FIXTURE_SEQ_PARAMS, SetGrabFixtureSeqParams);
sb.AddSubsequence(SEQ_ID_GRAB_FIXTURE_SEQ, grabSeqBuilder_Fixture);
sb.AddAction(SEQ_ID_FIND_FIXTURE, FindFixture);
sb.AddDecision(SEQ_ID_CHECK_FIXTURE_FOUND, CheckFixtureFound);
sb.AddAction(SEQ_ID_FIXTURE_FORCE_OK, ForceOK);
sb.AddDecision(SEQ_ID_CHECK_SAME_LIGHT, CheckSameLight);
sb.AddAction(SEQ_ID_SET_GRAB_MAIN_SEQ_PARAMS, SetGrabMainSeqParams);
sb.AddSubsequence(SEQ_ID_GRAB_MAIN_SEQ, grabSeqBuilder_Main);
sb.AddAction(SEQ_ID_FIND_MAIN_WITH_FIXTURE, FindMainWithFixture);
sb.AddDecision(SEQ_ID_CHECK_MAIN_FOUND, CheckMainFound);
sb.AddDecision(SEQ_ID_LIGHT_RETRY, LightRetry);
sb.AddAction(SEQ_ID_MAIN_FORCE_OK, ForceOK);
sb.AddAction(SEQ_ID_UPDATE_UI, UpdateUI);
sb.AddAction(SEQ_ID_SAVE_IMAGE, SaveImage);
sb.AddAction(SEQ_ID_SEQ_COMPLETE, SeqComplete);
}
public override SequenceBuilder Builder(string seqName) {
_SeqName = seqName;
_TactTimeChecker = new TactTimeChecker(_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_SET_GRAB_FIXTURE_SEQ_PARAMS]
> sb[SEQ_ID_GRAB_FIXTURE_SEQ]
> sb[SEQ_ID_FIND_FIXTURE]
> sb[SEQ_ID_CHECK_FIXTURE_FOUND]
> sb[SEQ_ID_CHECK_SAME_LIGHT]
> sb[SEQ_ID_SET_GRAB_MAIN_SEQ_PARAMS]
> sb[SEQ_ID_GRAB_MAIN_SEQ]
> sb[SEQ_ID_FIND_MAIN_WITH_FIXTURE]
> sb[SEQ_ID_CHECK_MAIN_FOUND]
> sb[SEQ_ID_UPDATE_UI]
> sb[SEQ_ID_SAVE_IMAGE]
> sb[SEQ_ID_SEQ_COMPLETE]
> sb.Final
);
sb.Flows(
sb[SEQ_ID_CHECK_FIXTURE_FOUND] // Fixture Not Found
> sb[SEQ_ID_FIXTURE_FORCE_OK]
);
sb.Flows(
sb[SEQ_ID_CHECK_SAME_LIGHT] // Same Light : Skip Grab Main
> sb[SEQ_ID_FIND_MAIN_WITH_FIXTURE]
);
sb.Flows(
sb[SEQ_ID_CHECK_MAIN_FOUND] // Light Retry
> sb[SEQ_ID_LIGHT_RETRY]
> sb[SEQ_ID_SET_GRAB_MAIN_SEQ_PARAMS]
);
sb.Flows(
sb[SEQ_ID_LIGHT_RETRY] // Light Retry 모두 실패
> sb[SEQ_ID_MAIN_FORCE_OK]
);
sb.Flows(
sb[SEQ_ID_CHECK_MAIN_FOUND] // Main Not Found
> sb[SEQ_ID_MAIN_FORCE_OK]
);
sb.Flows(
sb[SEQ_ID_FIXTURE_FORCE_OK]
> sb[SEQ_ID_UPDATE_UI]
);
sb.Flows(
sb[SEQ_ID_MAIN_FORCE_OK]
> sb[SEQ_ID_UPDATE_UI]
);
#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 GrabFindWithFixtureSeqParams;
context.TryGetValue(string.Format(VisionContextKeys.CNTXT_KEY_ALIGN_PROC_PARAMS, _Params.FovInfo.ToSubSysInfo()), out _ProcParams);
}
else {
_Logger.E($"_Params is null.");
return null;
}
_FovRecipe = VisionRecipeManager.GetFovRecipe(_Params.FovInfo);
SetLightRetry();
SetPatternAgent();
SetCalibrator();
SetCameraAgent();
SetDisplay();
return SequenceAction.Ok();
}
private void SetPatternAgent() {
var patternIndex = _Params.PatternInfo.GetPatternIndex();
_PatternAgent = PatternAgentManager.GetAgent(_Params.FovInfo);
var fixturePatternIndex = FixtureSetting.GetFixturePatternIndex(
_Params.PatternInfo.GetPatternIndex(), _Params.PatternInfo.FixtureSetting.Pattern1);
_FixturePatternInfo = _PatternAgent.GetPatternInfo(fixturePatternIndex);
}
private void SetCalibrator() {
_Calibrator = CalibratorManager.GetCalibrator(_Params.FovInfo);
}
private void SetCameraAgent() {
_CameraAgent = CameraAgentManager.GetCameraAgent(_Params.FovInfo);
}
private void SetDisplay() {
_CameraDisplay = CameraDisplayManager.GetDisplay(_Params.FovInfo, _Params.DisplayType);
}
private SequenceActionResult SetGrabFixtureSeqParams(SequenceContext context, string id, SequenceActionResult param) {
return SequenceAction.Ok(
new GrabSeqParams(_Params.FovInfo, _FixturePatternInfo, _Params.DisplayType, _Params.SeqMode));
}
private SequenceActionResult FindFixture(SequenceContext context, string id, SequenceActionResult param) {
var grabImage = context.GetValue