using Aurora.Api;
using VisionCalibrator;
using VisionCommon;
using System.Collections.Generic;
namespace VisionSequence.Pattern {
///
/// 패턴 검출 시퀀스 파라미터
///
public class FindSeqParams : GrabFindProcSeqParams {
/// 패턴 검출을 위한 이미지
public object GrabImage { get; set; }
///
/// 생성자
///
/// 패턴 검출을 위한 이미지
/// FOV 키 정보
/// 패턴 정보
/// 메인 화면 타입
/// 매뉴얼 시퀀스 플래그
public FindSeqParams(
object grabImage,
FovInfo fovInfo,
PatternInfo patternInfo,
eDisplayType displayType = eDisplayType.Main_1,
eSeqMode seqMode = eSeqMode.Auto) : base(fovInfo, patternInfo, displayType, seqMode) {
this.GrabImage = grabImage;
}
}
///
/// 패턴 검출 시퀀스
///
public class FindSeq : SubSeqBase {
private readonly Logger LOG = new Logger(typeof(FindSeq).Name);
private ICameraDisplay _CameraDisplay;
private FindSeqParams _Params;
private FovRecipe _FovRecipe;
private PatternAgentBase _PatternAgent;
private Calibrator _Calibrator;
private CameraAgentBase _CameraAgent;
private ImageManager _ImageManager = new ImageManager();
private string _SeqName;
#region Sequence Id
private const string SEQ_ID_INIT = "INIT";
private const string SEQ_ID_HAS_FIXTURE = "HAS_FIXTURE";
private const string SEQ_ID_FIND_FIXTURE = "FIND_FIXTURE";
private const string SEQ_ID_FIND = "FIND";
private const string SEQ_ID_FIND_OK = "FIND_OK";
private const string SEQ_ID_FIND_NG = "FIND_NG";
//private const string SEQ_ID_SCORE_NG = "SCORE_NG";
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 FindSeq() {
}
private void SetActions(SequenceBuilder sb) {
sb.AddAction(SEQ_ID_INIT, Init);
sb.AddDecision(SEQ_ID_HAS_FIXTURE, HasFixture);
sb.AddAction(SEQ_ID_FIND_FIXTURE, FindFixture);
sb.AddDecision(SEQ_ID_FIND, Find);
sb.AddAction(SEQ_ID_FIND_OK, Find_OK);
sb.AddAction(SEQ_ID_FIND_NG, Find_NG);
//sb.AddAction(SEQ_ID_SCORE_NG, Score_NG);
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;
SequenceBuilder sb = new SequenceBuilder(1000);
SetActions(sb);
sb.OnStopped(OnStopped);
sb.OnForceError(OnForceError);
sb.Flows(sb.Init > sb[SEQ_ID_INIT] > sb[SEQ_ID_HAS_FIXTURE])
.Flows(sb[SEQ_ID_HAS_FIXTURE] > sb[SEQ_ID_FIND_FIXTURE] > sb[SEQ_ID_FIND])
.Flows(sb[SEQ_ID_HAS_FIXTURE] > sb[SEQ_ID_FIND]);
sb.Flows(
sb[SEQ_ID_FIND]
> sb[SEQ_ID_FIND_OK]
> sb[SEQ_ID_UPDATE_UI]
);
sb.Flows(
sb[SEQ_ID_FIND]
> sb[SEQ_ID_FIND_NG]
> sb[SEQ_ID_UPDATE_UI]
//> sb.ForceError // null로 끝내지 않고, 상위에 PatternResult를 넘겨주기로 함.
);
sb.Flows(
sb[SEQ_ID_UPDATE_UI]
> sb[SEQ_ID_SAVE_IMAGE]
> 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 FindSeqParams;
}
else {
LOG.E($"_Params is null!");
return null;
}
_FovRecipe = VisionRecipeManager.GetFovRecipe(_Params.FovInfo);
SetPatternAgent();
SetCalibrator();
SetCameraAgent();
SetDisplay();
return SequenceAction.Ok();
}
private void SetPatternAgent() {
var patternIndex = _Params.PatternInfo.GetPatternIndex();
if (patternIndex is FovPatternIndex) {
_PatternAgent = FovPatternAgentManager.GetAgent(_Params.FovInfo.ToSubSysInfo());
}
else if (patternIndex is CamPatternIndex) {
var camPatternIndex = patternIndex as CamPatternIndex;
_PatternAgent = CamPatternAgentManager.GetAgent(camPatternIndex.CamId);
}
}
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 string HasFixture(
SequenceContext context,
string id,
ICollection branches,
SequenceActionResult param) {
if (_Params.PatternInfo.FixtureSetting.Enabled) {
return SEQ_ID_FIND_FIXTURE;
}
return SEQ_ID_FIND;
}
private SequenceActionResult FindFixture(
SequenceContext context,
string id,
SequenceActionResult param) {
var fixturePatternIndex = FixtureSetting.GetFixturePatternIndex(
_Params.PatternInfo.GetPatternIndex(),
_Params.PatternInfo.FixtureSetting.Pattern1);
var fixturePatternInfo = _PatternAgent.GetPatternInfo(fixturePatternIndex);
var patternResult = _PatternAgent.Find(fixturePatternInfo, _Params.GrabImage, _CameraDisplay);
GrabFindSeqUtil.TransformCoord(_Calibrator, _CameraAgent.GetImageSize(), ref patternResult);
_PatternAgent.Draw(fixturePatternInfo, patternResult, _CameraDisplay, isFixturePattern: true);
if (patternResult.Status == eFoundStatus.FoundOK) {
LOG.I($"Fixture PatternResult : {patternResult}");
LOG.I($"FixtureResult : {patternResult.MoreInfo as FixtureResult}");
return SequenceAction.Ok(patternResult);
}
LOG.E($"Fxiture Pattern Not Found! : {fixturePatternInfo}");
return null;
}
private string Find(
SequenceContext context,
string id,
ICollection branches,
SequenceActionResult param) {
PatternResult patternResult;
if (_Params.PatternInfo.FixtureSetting.Enabled) {
if (param.Param == null || (param.Param as PatternResult) == null) {
LOG.E($"Fixture PatternResult is null");
return null;
}
var fixturePatternResult = param.Param as PatternResult;
var fixtureResult = fixturePatternResult.MoreInfo as FixtureResult;
patternResult = _PatternAgent.Find(
_Params.PatternInfo, _Params.GrabImage, _CameraDisplay, fixtureResult);
GrabFindSeqUtil.TransformCoord(_Calibrator, _CameraAgent.GetImageSize(), ref patternResult);
_PatternAgent.Draw(
_Params.PatternInfo,
patternResult,
_CameraDisplay);
//_CameraDisplay.DrawRefCross();
}
else {
patternResult = _PatternAgent.Find(
_Params.PatternInfo, _Params.GrabImage, _CameraDisplay);
GrabFindSeqUtil.TransformCoord(_Calibrator, _CameraAgent.GetImageSize(), ref patternResult);
_PatternAgent.Draw(_Params.PatternInfo, patternResult, _CameraDisplay, isFixturePattern: false);
}
patternResult.PatternName = _Params.PatternInfo.PatternName;
patternResult.PatternType = _Params.PatternInfo.PatternType;
patternResult.FovId = _Params.FovInfo.FovId;
context.PutValue(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_RESULT, _Params.FovInfo.GetKey()), patternResult);
if (patternResult.Status == eFoundStatus.FoundOK) {
LOG.I($"PatternResult : {patternResult}");
return SEQ_ID_FIND_OK;
}
else {
return SEQ_ID_FIND_NG;
}
}
private SequenceActionResult Find_OK(
SequenceContext context,
string id,
SequenceActionResult param) {
return SequenceAction.Ok();
}
private SequenceActionResult Find_NG(
SequenceContext context,
string id,
SequenceActionResult param) {
return SequenceAction.Ok();
}
//private SequenceActionResult Score_NG(
// SequenceContext context,
// string id,
// SequenceActionResult param) {
//
// var patternResult = GrabFindSeqUtil.GetMainPatternResult(_Params.FovInfo);
//
// return null;
//}
private SequenceActionResult UpdateUI(
SequenceContext context,
string id,
SequenceActionResult param) {
if (_Params.SeqMode == eSeqMode.Auto) {
var patternResult = context.GetValue(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_RESULT, _Params.FovInfo.GetKey()));
VisionEnv.AuroraEnv.EventPublisher.Publish(new EventMessage(
_Params.FovInfo.GetKey(), VisionEventId.UPDATE_PATTERN_RESULT, patternResult));
}
return SequenceAction.Ok();
}
private SequenceActionResult SaveImage(
SequenceContext context,
string id,
SequenceActionResult param) {
if (_Params.SeqMode == eSeqMode.Auto) {
var patternResult = context.GetValue(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_RESULT, _Params.FovInfo.GetKey()));
var materialInfo = context.GetValue(VisionContextKeys.CNTXT_KEY_MATERIAL_INFO);
if (patternResult.Status == eFoundStatus.FoundOK) {
if (VisionSettingManager.VisionSetting.SaveOkImage == false) {
return SequenceAction.Ok();
}
}
_ImageManager.SaveImage(_Params.FovInfo, _Params.GrabImage, patternResult.Status.ToString(), materialInfo);
}
return SequenceAction.Ok();
}
private SequenceActionResult SeqComplete(
SequenceContext context,
string id,
SequenceActionResult param) {
var patternResult = context.GetValue(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_RESULT, _Params.FovInfo.GetKey()));
return SequenceAction.Ok(patternResult); // Param : patternResult
}
void OnStopped(
SequenceContext context) {
LOG.I($"{context.SequenceId} - STOP Handler");
HandleAbnormalFinish(context);
}
void OnForceError(
SequenceContext context, string id) {
LOG.I($"{context.SequenceId} - FORCE ERROR Handler");
HandleAbnormalFinish(context);
}
void HandleAbnormalFinish(
SequenceContext context) {
}
}
}