/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using Cognex.VisionPro; using Cognex.VisionPro.FGGigE; using System; using System.Collections.Generic; using VisionCommon; namespace CogCamera { /// /// Cognex 그래버 매니저 /// public class CogGrabberManager { private static Logger _Logger = new Logger("CogGrabberManager"); private static readonly object _Lock = new object(); private List _CogFrameGrabbers = new List(); private Dictionary _CamIdxes = new Dictionary(); private int _CurCamIdx = 0; private static CogGrabberManager _Instance; /// /// 싱글톤 객체 /// public static CogGrabberManager Instance { get { lock (_Lock) { if (_Instance == null) { _Instance = new CogGrabberManager(); } } return _Instance; } } private CogGrabberManager() { try { var cogFrameGrabberGigEs = new CogFrameGrabberGigEs(); var ipAddressList = new List(); for (int i = 0; i < cogFrameGrabberGigEs.Count; i++) { ipAddressList.Add(cogFrameGrabberGigEs[i].OwnedGigEAccess.PersistentIPAddress); } ipAddressList.Sort(); // IP 순서대로 오름차순 정렬 foreach (string ipAddress in ipAddressList) { foreach (ICogFrameGrabber cogFrameGrabber in cogFrameGrabberGigEs) { if (cogFrameGrabber.OwnedGigEAccess.PersistentIPAddress == ipAddress) { _CogFrameGrabbers.Add(cogFrameGrabber); } } } } catch (Exception e) { _Logger.FuncE(e.Message); } } /// /// 카메라 고정 IP주소로 Cognex 그래버 가져오기 /// /// 고정 IP /// Cognex 그래버 public ICogFrameGrabber GetCogFrameGrabberFromIpAddress(string ipAddress) { foreach (ICogFrameGrabber cogFrameGrabber in _CogFrameGrabbers) { if (cogFrameGrabber.OwnedGigEAccess.CurrentIPAddress == ipAddress) { return cogFrameGrabber; } } return null; } /// /// 카메라 디바이스 ID로 Cognex 그래버 가져오기 /// /// 디바이스 ID /// Cognex 그래버 public ICogFrameGrabber GetCogFrameGrabberFromDeviceId(string deviceId) { int camIdx = GetCamIdx(deviceId); if (camIdx < _CogFrameGrabbers.Count) { return _CogFrameGrabbers[camIdx]; } return null; } /// /// 물리 카메라 ID(CAM1, CAM2, ..)를 인덱스(0, 1, ..)로 반환. /// 사용 전 카메라 고정IP가 반드시 CAM 번호 순서대로 오름차순 정렬되어 있어야 함. /// /// 디바이스 ID /// 물리 카메라 인덱스 public int GetCamIdx(string deviceId) { if (_CamIdxes.ContainsKey(deviceId)) { return _CamIdxes[deviceId]; } else { _CamIdxes.Add(deviceId, _CurCamIdx++); return _CamIdxes[deviceId]; } } /// /// 리소스 정리 /// public void Dispose() { _CogFrameGrabbers?.Clear(); _CamIdxes?.Clear(); _CurCamIdx = 0; _Instance = null; } } }