using Aurora.Api; using VisionCommon; using VisionSequence.Pattern; using Hermes; using System.Collections.Generic; using VisionCommonUI; using VisionCommonUI.Resources; using VisionSequence.Aligner; using VisionInspector; using System; namespace VisionSequence.Inspector { /// /// 선폭 검사 시퀀스 파라미터 /// public class InspSeqParams_LineWidth { /// FOV 키 정보 public FovInfo FovInfo { get; set; } /// 메인 화면 타입 public eDisplayType DisplayType { get; set; } /// /// 생성자 /// /// FOV 키 정보 /// 메인 화면 타입 public InspSeqParams_LineWidth( FovInfo fovInfo, eDisplayType displayType = eDisplayType.Main_1) { this.FovInfo = fovInfo; this.DisplayType = displayType; } } /// /// 수평, 수직 각각에서 두 라인 간에 선폭 검사 (서브시퀀스로 호출해서 사용) /// public class InspSeq_LineWidth : SubSeqBase { private readonly Logger LOG = new Logger(typeof(InspSeq_LineWidth).Name); private InspSeqParams_LineWidth _Params; private CsvManager _CsvManager = new CsvManager(); //private ImageManager _ImageManager = new ImageManager(); private PatternAgentBase _PatternAgent; private AttachInspector _AttachInspector; private SubSysInfo _SubSysInfo; private FovRecipe _FovRecipe; private CaliperResult _CaliperResult_H; // 수평라인 선폭 측정 결과 private CaliperResult _CaliperResult_W; // 수직라인 선폭 측정 결과 private AttachInspResult _AttachInspResult; private string _SeqName; #region Sequence Id private const string SEQ_ID_INIT = "INIT"; private const string SEQ_ID_CLEAR = "CLEAR"; private const string SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_H = "SET_GRAB_FIND_PROC_SEQ_PARAMS_H"; private const string SEQ_ID_GRAB_FIND_PROC_SEQ_H = "GRAB_FIND_PROC_SEQ_H"; private const string SEQ_ID_CHECK_MEASURE_FOUND_H = "CHECK_MEASURE_FOUND_H"; private const string SEQ_ID_SET_MEASURE_H = "SET_MEASURE_H"; private const string SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_W = "SET_GRAB_FIND_PROC_SEQ_PARAMS_W"; private const string SEQ_ID_GRAB_FIND_PROC_SEQ_W = "GRAB_FIND_PROC_SEQ_W"; private const string SEQ_ID_CHECK_MEASURE_FOUND_W = "CHECK_MEASURE_FOUND_W"; private const string SEQ_ID_SET_MEASURE_W = "SET_MEASURE_W"; private const string SEQ_ID_NOT_FOUND_NG = "NOT_FOUND_NG"; private const string SEQ_ID_CHECK_STATUS = "CHECK_STATUS"; private const string SEQ_ID_SPEC_OVER_NG = "SPEC_OVER_NG"; private const string SEQ_ID_UPDATE_UI = "UPDATE_UI"; private const string SEQ_ID_SAVE_CSV = "SAVE_CSV"; //private const string SEQ_ID_SAVE_SCREENSHOT = "SAVE_SCREENSHOT"; private const string SEQ_ID_SEQ_COMPLETE = "SEQ_COMPLETE"; #endregion /// /// 생성자 /// public InspSeq_LineWidth() { } private void SetActions(SequenceBuilder sb) { SequenceBuilder grabFindProcSeqBuilder_Fixture = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), typeof(GrabFindProcSeq).Name); SequenceBuilder grabFindProcSeqBuilder_H = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), typeof(GrabFindProcSeq).Name); SequenceBuilder grabFindProcSeqBuilder_W = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), typeof(GrabFindProcSeq).Name); sb.AddAction(SEQ_ID_INIT, Init); sb.AddAction(SEQ_ID_CLEAR, Clear); sb.AddAction(SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_H, SetGrabFindProcSeqParams); sb.AddSubsequence(SEQ_ID_GRAB_FIND_PROC_SEQ_H, grabFindProcSeqBuilder_H); sb.AddDecision(SEQ_ID_CHECK_MEASURE_FOUND_H, CheckFound); sb.AddAction(SEQ_ID_SET_MEASURE_H, SetMeasure); sb.AddAction(SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_W, SetGrabFindProcSeqParams); sb.AddSubsequence(SEQ_ID_GRAB_FIND_PROC_SEQ_W, grabFindProcSeqBuilder_W); sb.AddDecision(SEQ_ID_CHECK_MEASURE_FOUND_W, CheckFound); sb.AddAction(SEQ_ID_SET_MEASURE_W, SetMeasure); sb.AddAction(SEQ_ID_NOT_FOUND_NG, NotFoundNG); sb.AddDecision(SEQ_ID_CHECK_STATUS, CheckStatus); sb.AddAction(SEQ_ID_SPEC_OVER_NG, SpecOverNG); sb.AddAction(SEQ_ID_UPDATE_UI, UpdateUI); sb.AddAction(SEQ_ID_SAVE_CSV, SaveCsv); //sb.AddAction(SEQ_ID_SAVE_SCREENSHOT, SaveScreenShot); 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_GRAB_FIND_PROC_SEQ_PARAMS_H] > sb[SEQ_ID_GRAB_FIND_PROC_SEQ_H] > sb[SEQ_ID_CHECK_MEASURE_FOUND_H] > sb[SEQ_ID_SET_MEASURE_H] > sb[SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_W] > sb[SEQ_ID_GRAB_FIND_PROC_SEQ_W] > sb[SEQ_ID_CHECK_MEASURE_FOUND_W] > sb[SEQ_ID_SET_MEASURE_W] > sb[SEQ_ID_CHECK_STATUS] > sb[SEQ_ID_UPDATE_UI] > sb[SEQ_ID_SAVE_CSV] //> sb[SEQ_ID_SAVE_SCREENSHOT] > sb[SEQ_ID_SEQ_COMPLETE] ); sb.Flows( sb[SEQ_ID_CHECK_MEASURE_FOUND_H] > sb[SEQ_ID_NOT_FOUND_NG] ); sb.Flows( sb[SEQ_ID_CHECK_MEASURE_FOUND_W] > sb[SEQ_ID_NOT_FOUND_NG] ); sb.Flows( sb[SEQ_ID_NOT_FOUND_NG] > sb[SEQ_ID_UPDATE_UI] > sb[SEQ_ID_SAVE_CSV] > sb[SEQ_ID_SEQ_COMPLETE] ); sb.Flows( sb[SEQ_ID_CHECK_STATUS] > sb[SEQ_ID_SPEC_OVER_NG] ); sb.Flows( sb[SEQ_ID_SPEC_OVER_NG] > sb[SEQ_ID_UPDATE_UI] > sb[SEQ_ID_SAVE_CSV] > 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 InspSeqParams_LineWidth; } else { MessageBoxUtil.ShowMessageBoxError( string.Format(StrTokens.MSG_E_ParamIsNull)); return SequenceAction.Error(E1.ARGUMENT); } _SubSysInfo = _Params.FovInfo.ToSubSysInfo(); _FovRecipe = VisionRecipeManager.GetFovRecipe(_Params.FovInfo); _PatternAgent = FovPatternAgentManager.GetAgent(_SubSysInfo); _AttachInspector = new AttachInspector(_SubSysInfo); return SequenceAction.Ok(); } private SequenceActionResult Clear( SequenceContext context, string id, SequenceActionResult param) { var cameraDisplay = CameraDisplayManager.GetDisplay(_Params.FovInfo, _Params.DisplayType); cameraDisplay.ClearAllGraphics(); GrabFindSeqUtil.Clear(_Params.FovInfo); _CaliperResult_H = null; _CaliperResult_W = null; _AttachInspResult = null; return SequenceAction.Ok(); } private SequenceActionResult SetGrabFindProcSeqParams( SequenceContext context, string id, SequenceActionResult param) { ProcPatternInfo procPatternInfo = null; switch (id) { case SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_H: procPatternInfo = VisionRecipeManager.GetProcPatternInfo(_Params.FovInfo, "Inspect", eProcPatternId.ProcPattern1); break; case SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS_W: procPatternInfo = VisionRecipeManager.GetProcPatternInfo(_Params.FovInfo, "Inspect", eProcPatternId.ProcPattern2); break; } var patternInfo = _PatternAgent.GetPatternInfo(_Params.FovInfo, procPatternInfo.PatternId); patternInfo.PatternName = procPatternInfo.PatternName; return SequenceAction.Ok(new GrabFindProcSeqParams(_Params.FovInfo, patternInfo, _Params.DisplayType)); } private string CheckFound( SequenceContext context, string id, ICollection branches, SequenceActionResult param) { var patternResult = param.Param as PatternResult; switch (id) { case SEQ_ID_CHECK_MEASURE_FOUND_H: if (patternResult.Status == eFoundStatus.FoundOK) { return SEQ_ID_SET_MEASURE_H; } break; case SEQ_ID_CHECK_MEASURE_FOUND_W: if (patternResult.Status == eFoundStatus.FoundOK) { return SEQ_ID_SET_MEASURE_W; } break; } return SEQ_ID_NOT_FOUND_NG; } private SequenceActionResult NotFoundNG( SequenceContext context, string id, SequenceActionResult param) { LOG.E("Not Found NG!!"); var attachInspRecipe = VisionRecipeManager.GetAttachInspRecipe(_SubSysInfo); var attachInspParam = attachInspRecipe.AttachInspParams[(int)_Params.FovInfo.FovId]; var measureW = (_CaliperResult_W != null) ? _CaliperResult_W.WidthMm : 0; var measureH = (_CaliperResult_H != null) ? _CaliperResult_H.WidthMm : 0; // NG - Attach Insp Result _AttachInspResult = new AttachInspResult( _Params.DisplayType, _Params.FovInfo.FovId, measureW, attachInspParam.SpecW, measureH, attachInspParam.SpecH, InspStatus.NG); return SequenceAction.Ok(); } private SequenceActionResult SetMeasure( SequenceContext context, string id, SequenceActionResult param) { // Param : PatternResult var patternResult = param.Param as PatternResult; switch (id) { case SEQ_ID_SET_MEASURE_H: foreach (var result in patternResult.Results) { _CaliperResult_H = (result as CaliperResult)?.Clone(); break; } break; case SEQ_ID_SET_MEASURE_W: foreach (var result in patternResult.Results) { _CaliperResult_W = (result as CaliperResult)?.Clone(); break; } break; } return SequenceAction.Ok(); } private string CheckStatus( SequenceContext context, string id, ICollection branches, SequenceActionResult param) { _AttachInspResult = _AttachInspector.InspectDistances( _Params.FovInfo, _Params.DisplayType, _CaliperResult_H, _CaliperResult_W); if (_AttachInspResult.InspStatus == InspStatus.OK) { return SEQ_ID_UPDATE_UI; } else { return SEQ_ID_SPEC_OVER_NG; } } private SequenceActionResult SpecOverNG( SequenceContext context, string id, SequenceActionResult param) { LOG.E("Spec Over NG!!"); return SequenceAction.Ok(); } private SequenceActionResult UpdateUI( SequenceContext context, string id, SequenceActionResult param) { VisionEnv.AuroraEnv.EventPublisher.Publish( new EventMessage(_SubSysInfo.GetKey(), VisionEventId.UPDATE_ATTACH_INSP_RESULT, _AttachInspResult)); return SequenceAction.Ok(); } private SequenceActionResult SaveCsv( SequenceContext context, string id, SequenceActionResult param) { _CsvManager.SaveCsv(_SubSysInfo, AttachInspResultItemManager.GetAttachInspResultItem(_SubSysInfo, _AttachInspResult), eSaveDataType.AttachInsp); return SequenceAction.Ok(); } //private SequenceActionResult SaveScreenShot( // SequenceContext context, // string id, // SequenceActionResult param) { // if (EquipAdapter.Instance.EquipMode.IsNotDryrunAndTransferMode()) { // var patternResult = context.GetValue(string.Format(VisionContextKeys.CNTXT_KEY_LINE_WIDTH_RESULT, _Params.FovInfo.GetKey(), _Params.ProcPatternInfo.PatternId)); // var materialInfo = context.GetValue(VisionContextKeys.CNTXT_KEY_MATERIAL_INFO); // if (IsFoundStatusNG(patternResult.Status) || VisionSettingManager.VisionSetting.SaveOkSceenShotImage) { // _ImageManager.SaveScreenShot( // _Params.FovInfo, patternResult.Status.ToString(), materialInfo, _Params.DisplayType, // AttachInspResultItemManager.GetTimeStamp(_SubSysInfo, patternResult)); // } // } // return SequenceAction.Ok(); //} //private bool IsFoundStatusNG(InspStatus status) { // switch (status) { // case InspStatus.NONE: // case InspStatus.NG: // return true; // default: // return false; // } //} private SequenceActionResult SeqComplete( SequenceContext context, string id, SequenceActionResult param) { context.PutValue(string.Format(VisionContextKeys.CNTXT_KEY_ATTACH_INSP_RESULT, _Params.FovInfo.GetKey()), _AttachInspResult); return SequenceAction.Ok(_AttachInspResult); } private void OnStopped(SequenceContext context) { LOG.I($"{context.SequenceId} - STOP Handler"); HandleAbnormalFinish(context); } private void OnForceError(SequenceContext context, string id) { LOG.E($"{context.SequenceId} - FORCE ERROR Handler"); HandleAbnormalFinish(context); } void HandleAbnormalFinish(SequenceContext context) { } } }