using Aurora.Api; using Aurora.Api.DataType; using Aurora.Api.Devices; using Hermes; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; namespace VisionCommon { public abstract class CameraBase : Aurora.Api.Device { protected Logger LOG { get; set; } protected CamConfig CamConfig { get; set; } protected TactTimeChecker TactTimeChecker { get; set; } #region For Realloc Image Buffer protected double OldRatioX { get; set; } = 1; // 카메라 재연결시 이미지 Crop이 발생했는지 체크하기 위함 protected double OldRatioY { get; set; } = 1; protected eImageRotation OldRotationType { get; set; } = eImageRotation.None; // 카메라 재연결시 이미지 회전이 발생했는지 체크하기 위함 #endregion protected readonly object LockThis = new object(); protected readonly object LockThis_Hook = new object(); protected readonly object LockThis_Hook_ExtTrig = new object(); protected readonly object _LiveLock = new object(); private bool _isLiveOn = false; /// /// 외부(버퍼) 트리거에 의한 그랩 완료 여부 (True : 그랩 완료 / False : 그랩 미완료) /// private bool _HookCompletedByExtTrig = false; /// /// EventCallBack에 의한 그랩 완료 여부 (True : 그랩 완료 / False : 그랩 미완료) /// private bool _HookCompleted = false; protected CameraBase(string deviceId) { Type = DeviceType.Camera; DeviceId = deviceId; CamConfig = CamConfig.GetDefaultConfig() as CamConfig; } protected void CheckImageBufferRotationChanged() { if (OldRatioX != CamConfig.ImageSizeRatioX || OldRatioY != CamConfig.ImageSizeRatioY || OldRotationType != CamConfig.FlipAndRotation.ImageRotation) { OldRatioX = CamConfig.ImageSizeRatioX; OldRatioY = CamConfig.ImageSizeRatioY; OldRotationType = CamConfig.FlipAndRotation.ImageRotation; VisionEnv.AuroraEnv.EventPublisher.Publish( new EventMessage(DeviceId, VisionEventId.CAMERA_UPDATE_GRAB_IMAGE_BUFFER)); } } /// /// 카메라 화면 중심을 기준으로 Ratio X,Y를 적용한 자를 이미지 크기 /// /// 자를 이미지 크기 public ROI GetCropRoi() { var cropRoi = new ROI(); if (IpAdapter.Instance.IpEnvironment.IsHeightLongerThanWidth(CamConfig)) { cropRoi.CenterX = CamConfig.ImageSize.Height * 0.5; cropRoi.CenterY = CamConfig.ImageSize.Width * 0.5; cropRoi.Width = CamConfig.ImageSize.Height * CamConfig.ImageSizeRatioY; cropRoi.Height = CamConfig.ImageSize.Width * CamConfig.ImageSizeRatioX; } else { cropRoi.CenterX = CamConfig.ImageSize.Width * 0.5; cropRoi.CenterY = CamConfig.ImageSize.Height * 0.5; cropRoi.Width = CamConfig.ImageSize.Width * CamConfig.ImageSizeRatioX; cropRoi.Height = CamConfig.ImageSize.Height * CamConfig.ImageSizeRatioY; } return cropRoi; } /// /// 외부(버퍼) 트리거에 의한 그랩 완료 여부 설정 /// /// 그랩 완료 여부 public void SetHookCompletedByExtTrig(bool hookCompletedByExtTrig) { lock (LockThis_Hook_ExtTrig) { _HookCompletedByExtTrig = hookCompletedByExtTrig; } } /// /// 외부(버퍼) 트리거에 의한 그랩 완료 여부 체크 (True : 그랩 완료 / False : 그랩 미완료) /// /// 그랩 완료 여부/returns> public bool IsHookCompletedByExtTrig() { lock (LockThis_Hook_ExtTrig) { return _HookCompletedByExtTrig; } } /// /// EventCallBack에 의한 그랩 완료 여부 설정 /// /// 그랩 완료 여부 public void SetHookCompleted(bool hookCompleted) { lock (LockThis_Hook) { _HookCompleted = hookCompleted; } } /// /// EventCallBack에 의한 그랩 완료 여부 체크 (True : 그랩 완료 / False : 그랩 미완료) /// /// 그랩 완료 여부 public bool IsHookCompleted() { lock (LockThis_Hook) { return _HookCompleted; } } /// /// 라이브 켜져있는지 여부 /// /// 라이브 여부 public bool IsLiveOn() { lock (_LiveLock) { return _isLiveOn; } } /// /// 카메라 라이브 시키기 /// protected void LiveOn() { lock (_LiveLock) { _isLiveOn = true; } } /// /// 카메라 라이브 끄기 /// protected void LiveOff() { lock (_LiveLock) { _isLiveOn = false; } } /// /// 연결되어있는지 여부 /// /// 연결여부 public abstract bool IsConnected(); /// /// 이미지 버퍼 복제 /// /// 복제한 이미지버퍼 public abstract object CloneImageBuffer(); /// /// 카메라 디스플레이 가져오기 /// /// 카메라 디스플레이 public abstract ICameraDisplay GetDisplay(); /// /// 디스플레이 설정하기 /// /// 카메라 디스플레이 public abstract void SetDisplay(ICameraDisplay cameraDisplay); /// /// 디스플레이로 부터 이미지 가져오기 /// /// 가져올 카메라 디스플레이 /// 이미지 객체 public abstract object GetImageFromDisplay(ICameraDisplay cameraDisplay); /// /// 게인 값 가져오기 /// /// 성공유무 public abstract int GetGain(); /// /// 게인 값 설정하기 /// /// 설정할 게인 값 /// 성공유무 public abstract int SetGain(int gain); /// /// 노출도 값 가져오기 /// /// 노출 값 public abstract int GetExposure(); /// /// 노출도 최솟값 가져오기 /// /// 노출도 최솟값 public abstract int GetMinExposure(); /// /// 노출도 최댓값 가져오기 /// /// 노출도 최댓값 public abstract int GetMaxExposure(); /// /// 노출 값 설정하기 /// /// 노출시간(ms)기준 /// 성공유무 public abstract int SetExposure(int exposureTime_ms); /// /// 이미지 반전 & 회전 Config 갱신 /// /// 이미지 반전 & 회전 Config /// 성공 유무 public abstract int ResetFlipAndRotation(FlipAndRotation flipAndRotation); /// /// 이미지 사이즈 가져오기 /// /// 이미지 사이즈 public abstract ImageSize GetImageSize(); /// /// 버퍼로 부터 그랩한 이미지 가져오기 /// /// 카메라 디스플레이 /// 가져올 이미지 (reference) /// 성공유무 public abstract int GetGrabImageFromBuffer(ICameraDisplay cameraDisplay, ref object image); /// /// 카메라 그랩(동기) /// /// 카메라 디스플레이 /// 가져올 이미지 (reference) /// 성공 유무 public abstract int GrabSync(ICameraDisplay cameraDisplay, ref object image); /// /// 라이브 시작 /// /// 카메라 디스플레이 public abstract void StartLive(ICameraDisplay cameraDisplay); /// /// 라이브 정지 /// public abstract void StopLive(); /// /// Child 이미지들로 Parent(원장) 이미지가 정상적으로 만들어지는지 검증 /// /// 디스플레이 /// 원장(부모) 이미지 /// 성공 유무 public abstract int VerifyChildImage(ICameraDisplay cameraDisplay, ref object image); #region For Flying protected object[] _ProcImages; // 플라잉 혹은 HW트리거 공정 이미지 배열 protected object _ParentImage; // Child 이미지를 조합한 부모 버퍼 (원장 이미지) protected bool _IsFlyingRunning; // 플라잉 상태 체크 protected int _FlyingIdx = 0; // 플라잉 인덱스 /// /// 플라잉 시작 /// /// FOV 정보 /// 추가 파라미터 /// 성공 유무 public abstract int StartFlying(FovInfo fovInfo, object param = null); /// /// 플라잉 종료 /// /// 추가 파라미터 /// 성공 유무 public abstract int StopFlying(object param = null); /// /// 플라잉 상태 체크 /// /// 성공 유무 public bool IsFlyingRunning() { return _IsFlyingRunning; } /// /// 현재 플라잉 인덱스 가져오기 /// /// 현재 플라잉 인덱스 public int GetCurrentFlyingIdx() { return _FlyingIdx; } /// /// 플라잉 이미지 가져오기 /// /// 플라잉 인덱스 /// 플라잉 이미지 public object GetFlyingImage(int flyingIdx) { try { if (_ProcImages.Length > flyingIdx) { return _ProcImages[flyingIdx]; } LOG.FuncE("flyingIdx exceeds _ProcImages array bounds."); } catch (Exception e) { LOG.FuncE(e.Message); } return null; } /// /// 플라잉 이미지 전체 가져오기 /// /// 플라잉 이미지 전체 public object[] GetFlyingImages() { try { var flyingImages = new object[_ProcImages.Length]; for (int i = 0; i < _ProcImages.Length; i++) { flyingImages[i] = _ProcImages[i]; } return flyingImages; } catch (Exception e) { LOG.FuncE(e.Message); return null; } } /// /// 플라잉 합성(원장) 이미지 가져오기. *원장 : Child 이미지를 조합하여 한 장으로 만듬 /// /// 플라잉 합성(원장) 이미지 public object GetParentImage() { return _ParentImage; } #endregion #region For Custumizing (장비 전용 API) public abstract int GetInitialExposure(); #endregion } }