/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora;
using Aurora.Api;
using Aurora.Api.DataType;
using MilCommon;
using VisionCommon;
using Hermes;
using Matrox.MatroxImagingLibrary;
using System.Threading;
using System.Windows;
namespace MilCamera {
///
/// MIL 카메라 에이전트
///
public class MilCameraAgent : CameraAgentBase {
private Logger _Logger;
///
/// 생성자
///
/// FOV 정보
public MilCameraAgent(FovInfo fovInfo) : base(fovInfo) {
_Logger = new Logger(string.Format("CamAgent[{0}]", fovInfo.FovName));
}
///
/// 이미지 사이즈 가져오기
///
/// 이미지 사이즈
public override ImageSize GetImageSize() {
return _CamDev.GetImageSize();
}
///
/// 이미지 버퍼 복제
///
/// 복제 버퍼
public override object CloneImageBuffer() {
if (_CamDev != null && _CamDev.IsActivated) {
return _CamDev.CloneImageBuffer();
}
else {
return AllocDefaultImageBuffer();
}
}
private MIL_ID AllocDefaultImageBuffer() {
if (!MilEnvironment.Instance.HasValidLicense()) {
return MIL.M_NULL;
}
if (_CamConfig == null) {
_Logger.FuncE("_CamConfig is null.");
return MIL.M_NULL;
}
MIL_ID image = MIL.M_NULL;
MIL.MbufAlloc2d(
MilEnvironment.Instance.GetSystem(_CamConfig.CamConnConfig.BoardType, _CamConfig.CamConnConfig.BoardSlotPos),
_CamConfig.ImageSize.Width,
_CamConfig.ImageSize.Height,
8 + MIL.M_UNSIGNED,
MIL.M_IMAGE + MIL.M_GRAB + MIL.M_PROC + MIL.M_DISP,
ref image);
MIL.MbufClear(image, 0);
return image;
}
///
/// 버퍼로부터 이미지를 꺼내온다.
///
/// 디스플레이
/// 이미지
/// 성공 유무
public override int GetGrabImageFromBuffer(ICameraDisplay cameraDisplay, ref object image) {
var milCameraDisplay = cameraDisplay as IMilCameraDisplay;
FitAndClearImage(milCameraDisplay);
if (!_CamDev.IsActivated) {
_Logger.FuncE("Camera Not Activated.");
return E1.GENERIC;
}
if (image == null) {
_Logger.FuncE("image buffer is null.");
return E1.GENERIC;
}
return _CamDev.GetGrabImageFromBuffer(cameraDisplay, ref image);
}
///
/// 동기식 그랩
///
/// 디스플레이
/// 그랩 이미지
/// 성공 유무
public override int GrabSync(ICameraDisplay cameraDisplay, ref object image) {
if (_CamDev == null || _CamConfig == null) {
_Logger.FuncE("_CamDev or _CamConfig is null.");
return E1.GENERIC;
}
var milCameraDisplay = cameraDisplay as IMilCameraDisplay;
FitAndClearImage(milCameraDisplay);
if (!_CamDev.IsActivated) {
_Logger.FuncE("Camera Not Activated.");
return E1.GENERIC;
}
// Jin : Scout Sequence에서 GrabSync 호출 시 MilCameraAgent로 들어와서 image가 null이면 return하기 때문에 아래 부분 주석 처리
// AuroraVision 버전 업데이트할때 하기 부분은 용접기에 맞게 주석처리 해줘야 함
//if (image == null) {
// _Logger.FuncE("image buffer is null.");
// return E1.GENERIC;
//}
return _CamDev.GrabSync(milCameraDisplay, ref image);
}
private void FitAndClearImage(IMilCameraDisplay milCameraDisplay) {
if (milCameraDisplay == null) {
return;
}
Application.Current.Dispatcher.BeginInvoke(
new System.Action(() => {
milCameraDisplay.FitImage(_CamDev.GetImageSize());
milCameraDisplay.ClearMeasureGraphics();
}));
}
//public MIL_ID GetGrabImageFromQueue(eGrabTrigSrcType grabTrigSrcType) {
// return _MilCamera.GetGrabImageFromQueue(grabTrigSrcType);
//}
///
/// 라이브 시작
///
/// 디스플레이
public override void StartLive(ICameraDisplay cameraDisplay) {
if (_CamDev == null) {
_Logger.FuncE("_CamDev is null.");
return;
}
if (!_CamDev.IsActivated) {
_Logger.FuncE("Camera Not Activated.");
return;
}
var milCameraDisplay = cameraDisplay as IMilCameraDisplay;
// 현재 Fov를 사용하는 디스플레이의 라이브 버튼만 켜기
CamLiveBtnManager.SetVisibilityAsLiveStart(milCameraDisplay.GetDisplayType(), _FovInfo);
FitAndClearImage(milCameraDisplay);
_Logger.I("Start Live.");
_CamDev.StartLive(milCameraDisplay);
}
///
/// 라이브 종료
///
public override void StopLive() {
if (_CamDev == null) {
_Logger.FuncE("_CamDev is null.");
return;
}
// 같은 HwCam을 사용하는 디스플레이의 라이브 버튼만 켜기
CamLiveBtnManager.SetVisibilityAsLiveStop(_FovInfo);
_Logger.I("Stop Live.");
_CamDev?.StopLive();
}
///
/// 라이브 상태 체크
///
/// 라이브 상태
public override bool IsLiveRunning() {
return _CamDev.IsLiveOn();
}
///
/// 카메라 노출시간 읽기
///
/// 노출시간
public override double GetExposure() {
return _CamDev.GetExposure();
}
///
/// 카메라 노출시간 쓰기
///
/// 노출시간[ms]
/// 성공 유무
public override int SetExposure(double exposureTime_ms) {
return _CamDev.SetExposure(exposureTime_ms);
}
///
/// 이미지 반전 & 회전 Config 갱신
///
/// 이미지 반전 & 회전 Config
/// 성공 유무
public override int ResetFlipAndRotation(FlipAndRotation flipAndRotation) {
return _CamDev.ResetFlipAndRotation(flipAndRotation);
}
#region Activate & Deactivate
public override int Activate() {
return _CamDev.Activate();
}
public override int Deactivate() {
return _CamDev.Deactivate();
}
#endregion
#region For Flying
///
/// 플라잉 시작
///
/// FOV 정보
/// 추가 파라미터
/// 성공 유무
public override int StartFlying(FovInfo fovInfo, object param = null) {
return _CamDev.StartFlying(fovInfo);
}
///
/// 플라잉 종료
///
/// 추가 파라미터
/// 성공 유무
public override int StopFlying(object param = null) {
return _CamDev.StopFlying();
}
///
/// 플라잉 상태 체크
///
/// 성공 유무
public override bool IsFlyingRunning() {
return _CamDev.IsFlyingRunning();
}
///
/// 현재 플라잉 인덱스 가져오기
///
/// 현재 플라잉 인덱스
public override int GetCurrentFlyingIdx() {
return _CamDev.GetCurrentFlyingIdx();
}
///
/// 플라잉 이미지 가져오기
///
/// 플라잉 인덱스
/// 플라잉 이미지
public override object GetFlyingImage(int flyingIdx) {
return _CamDev.GetFlyingImage(flyingIdx);
}
///
/// 플라잉 이미지 전체 가져오기
///
/// 플라잉 이미지 전체
public override object[] GetFlyingImages() {
return _CamDev.GetFlyingImages();
}
///
/// 플라잉 합성(원장) 이미지 가져오기. *원장 : Child 이미지를 조합하여 한 장으로 만듬
///
/// 플아잉 합성(원장) 이미지
public override object GetParentImage() {
return _CamDev.GetParentImage();
}
#endregion
#region For Child Image
///
/// Child 이미지들로 Parent(원장) 이미지가 정상적으로 만들어지는지 검증
///
/// 디스플레이
/// 원장(부모) 이미지
/// 성공 유무
public override int VerifyChildImage(ICameraDisplay cameraDisplay, ref object image) {
return _CamDev.VerifyChildImage(cameraDisplay, ref image);
}
#endregion
}
}