using System.Collections.Generic; using Aurora.Api; using VisionCommon; using System.Threading; using VisionSequence.Pattern; using VisionCommonUI; using VisionCommonUI.Resources; using Hermes; using System.Linq; namespace VisionSequence.Setup { /// /// 제자리 반복도 측정 셋업 시퀀스 요청 파라미터 /// public class SetupSeqParams_VisionRepeat { /// FOV 키 정보 public FovInfo FovInfo { get; set; } /// 메인 화면 타입 public eDisplayType DisplayType { get; set; } /// 반복 횟수 public int RepeatCount { get; set; } /// 패턴 정보 public PatternInfo PatternInfo { get; set; } /// /// 생성자 /// /// FOV 키 정보 /// 패턴 정보 /// 반복 횟수 /// 메인 화면 타입 public SetupSeqParams_VisionRepeat(FovInfo fovInfo, PatternInfo patternInfo, int repeatCount = 0, eDisplayType displayType = eDisplayType.VisionRepeat) { this.FovInfo = fovInfo; this.DisplayType = displayType; this.RepeatCount = repeatCount; this.PatternInfo = patternInfo; } } /// /// 제자리 반복도 측정 셋업 시퀀스 결과 파라미터 /// public class SetupSeqResultParams_VisionRepeat { /// 이미지 좌표 public List ImagePoints { get; set; } /// 자재 좌표 public List StaticPoints { get; set; } /// /// 생성자 /// /// 이미지 좌표 /// 자재 좌표 public SetupSeqResultParams_VisionRepeat(List imagePoints, List staticPoints) { this.ImagePoints = imagePoints; this.StaticPoints = staticPoints; } } /// /// 제자리 반복도 측정 /// public class SetupSeq_VisionRepeat { const string KEY_PATTERN_FOUND = "KEY_PATTERN_FOUND"; const string KEY_CURRENT_STEP = "KEY_PLAN_CURRENT_STEP"; private readonly Logger LOG = new Logger("VisionRepeatSeq"); private SetupSeqParams_VisionRepeat _Params; private FovRecipe _FovRecipe; private FovInfo _FovInfo; private CsvManager _CsvManager = new CsvManager(); private ImageManager _ImageManager = new ImageManager(); private List _ImagePoints = new List(); private List _StaticPoints = new List(); #region Sequence Id private const string SEQ_ID_INIT = "INIT"; private const string SEQ_ID_CHECK_PATTERN = "CHECK_PATTERN"; private const string SEQ_ID_UNDEFINED_PATTERN_NG = "SEQ_ID_UNDEFINED_PATTERN_NG"; private const string SEQ_ID_PREPARE = "PREPARE"; private const string SEQ_ID_CLEAR = "CLEAR"; private const string SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS = "SET_GRAB_FIND_PROC_SEQ_PARAMS"; private const string SEQ_ID_GRAB_FIND_PROC_SEQ = "GRAB_FIND_PROC_SEQ"; private const string SEQ_ID_SAVE_IMAGE = "SEQ_ID_SAVE_IMAGE"; private const string SEQ_ID_APPLY_DATA = "ApplyData"; private const string SEQ_ID_SEQ_COMPLETE = "SEQ_COMPLETE"; #endregion /// /// 생성자 /// public SetupSeq_VisionRepeat() { } public SequenceBuilder Builder() { SequenceBuilder sb = new SequenceBuilder(1000); SetActions(sb); sb.OnStopped(OnStopped); sb.OnForceError(OnForceError); sb.Flows( sb.Init > sb[SEQ_ID_INIT] > sb[SEQ_ID_CHECK_PATTERN] > sb[SEQ_ID_PREPARE] > sb[SEQ_ID_CLEAR] > sb[SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS] > sb[SEQ_ID_GRAB_FIND_PROC_SEQ] > sb[SEQ_ID_SAVE_IMAGE] > sb[SEQ_ID_APPLY_DATA] ); sb.Flows( sb[SEQ_ID_CHECK_PATTERN] > sb[SEQ_ID_UNDEFINED_PATTERN_NG] > sb[SEQ_ID_SEQ_COMPLETE] ); sb.Flows( sb[SEQ_ID_APPLY_DATA] > sb[SEQ_ID_CLEAR] ); sb.Flows( sb[SEQ_ID_APPLY_DATA] > sb[SEQ_ID_SEQ_COMPLETE] > sb.Final ); #if SEQ_DRAW sb.Draw($"{GetType().Name}.pdf"); #endif return sb; } private void SetActions(SequenceBuilder sb) { SequenceBuilder grabFindProcSeqBuilder = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), "GrabFindProcSeq"); sb.AddAction(SEQ_ID_INIT, Init); sb.AddDecision(SEQ_ID_CHECK_PATTERN, CheckPattern); sb.AddAction(SEQ_ID_UNDEFINED_PATTERN_NG, UndefinedPatternNG); sb.AddAction(SEQ_ID_PREPARE, Prepare); sb.AddAction(SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS, SetGrabFindProcSeqParams); sb.AddSubsequence(SEQ_ID_GRAB_FIND_PROC_SEQ, grabFindProcSeqBuilder); sb.AddAction(SEQ_ID_SAVE_IMAGE, SaveImage); sb.AddDecision(SEQ_ID_APPLY_DATA, ApplyData); sb.AddAction(SEQ_ID_CLEAR, Clear); sb.AddAction(SEQ_ID_SEQ_COMPLETE, SeqComplete); } private SequenceActionResult Init(SequenceContext context, string id, SequenceActionResult param) { if (param.Param != null) { _Params = param.Param as SetupSeqParams_VisionRepeat; } _FovRecipe = VisionRecipeManager.GetFovRecipe(_Params.FovInfo); _FovInfo = _Params.FovInfo; context.PutValue(KEY_CURRENT_STEP, 0); _ImagePoints.Clear(); _StaticPoints.Clear(); return SequenceAction.Ok(); } private string CheckPattern(SequenceContext context, string id, ICollection branches, SequenceActionResult param) { var visionRepeatRecipe = VisionRecipeManager.GetVisionRepeatRecipe(_Params.FovInfo); if (visionRepeatRecipe.PatternId == -1) { return SEQ_ID_UNDEFINED_PATTERN_NG; } return SEQ_ID_PREPARE; } private SequenceActionResult UndefinedPatternNG( SequenceContext context, string id, SequenceActionResult param) { string errMsg = "Undefined PatternID Available"; LOG.E(errMsg); return SequenceAction.Ok(); } private SequenceActionResult Prepare(SequenceContext context, string id, SequenceActionResult param) { if (_FovRecipe != null) return SequenceAction.Ok(); else return SequenceAction.Error(); } private SequenceActionResult SetGrabFindProcSeqParams( SequenceContext context, string id, SequenceActionResult param) { var visionRepeatRecipe = VisionRecipeManager.GetVisionRepeatRecipe(_Params.FovInfo); eSeqMode seqMode = eSeqMode.Manual; // 그랩을 Skip하지 않기 위함. return SequenceAction.Ok(new GrabFindProcSeqParams(_Params.FovInfo, _Params.PatternInfo, _Params.DisplayType, seqMode)); } private SequenceActionResult SaveImage( SequenceContext context, string id, SequenceActionResult param) { if (VisionSettingManager.VisionSetting.SaveSetUpImage) { var display = CameraDisplayManager.GetDisplay(_FovInfo, _Params.DisplayType); object image = display.GetImageObject(); if (image != null) { _ImageManager.SaveImageInternal(_FovInfo, eSaveDataType.VisionRepeat, image); } } var patternResult = param.Param as PatternResult; return SequenceAction.Ok(patternResult); } private string ApplyData(SequenceContext context, string id, ICollection branches, SequenceActionResult param) { ImagePoint imagePoint = new ImagePoint(); StaticPoint staticPoint = new StaticPoint(); var patternResult = param.Param as PatternResult; if (patternResult.Status == eFoundStatus.FoundOK) //하나 이상일 경우 OK { context.PutValue(KEY_PATTERN_FOUND, true); var result = patternResult.Results.ToList()[0]; imagePoint = result.ImagePosition.Clone() as ImagePoint; staticPoint = result.MaterialPosition.Clone() as StaticPoint; _ImagePoints.Add(imagePoint); _StaticPoints.Add(staticPoint); int curr = 1 + context.GetValue(KEY_CURRENT_STEP); context.PutValue(KEY_CURRENT_STEP, curr); UpdateVisionRepeatLogs(curr, result); if (context.GetValue(KEY_CURRENT_STEP) == _Params.RepeatCount) { return SEQ_ID_SEQ_COMPLETE; } Thread.Sleep(300); return SEQ_ID_CLEAR; } else { context.PutValue(KEY_PATTERN_FOUND, false); return SEQ_ID_SEQ_COMPLETE; } } private void UpdateVisionRepeatLogs(int step, BaseResult result) { var visionRepeatRecipe = VisionRecipeManager.GetVisionRepeatRecipe(_Params.FovInfo); if (_Params.PatternInfo.PatternType == ePatternType.ShapeModelFinder) { var shapeResult = result as ShapeModelFinderResult; var imagePosition = shapeResult.ImagePosition.Clone(); var materialPosition = shapeResult.MaterialPosition.Clone(); var log = new VisionRepeatLog( step, imagePosition.X, imagePosition.Y, materialPosition.X, materialPosition.Y, shapeResult.Angle.Degree, shapeResult.Width, shapeResult.Height, shapeResult.Radius); VisionEnv.AuroraEnv.EventPublisher.Publish(new EventMessage( _Params.FovInfo.GetKey(), VisionEventId.UPDATE_VISION_REPEAT_LOG, log)); _CsvManager.SaveCsv(_FovInfo.ToSubSysInfo(), VisionRepeatResultItemManager.GetVisionRepeatLog(_FovInfo.ToSubSysInfo(), log), eSaveDataType.VisionRepeat); } else { var baseResult = result.Clone(); var log = new VisionRepeatLog( step, baseResult.ImagePosition.X, baseResult.ImagePosition.Y, baseResult.MaterialPosition.X, baseResult.MaterialPosition.Y, baseResult.Angle.Degree); VisionEnv.AuroraEnv.EventPublisher.Publish(new EventMessage( _Params.FovInfo.GetKey(), VisionEventId.UPDATE_VISION_REPEAT_LOG, log)); _CsvManager.SaveCsv(_FovInfo.ToSubSysInfo(), VisionRepeatResultItemManager.GetVisionRepeatLog(_FovInfo.ToSubSysInfo(), log), eSaveDataType.VisionRepeat); } } private SequenceActionResult Clear( SequenceContext context, string id, SequenceActionResult param) { GrabFindSeqUtil.Clear(_Params.FovInfo.ToSubSysInfo()); return SequenceAction.Ok(); } private SequenceActionResult SeqComplete( SequenceContext context, string id, SequenceActionResult param) { return SequenceAction.Ok(new SetupSeqResultParams_VisionRepeat(_ImagePoints, _StaticPoints)); } 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) { } } }