2026-01-26 14:51:28 +09:00

116 lines
4.0 KiB
C#

/*
* 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 {
/// <summary>
/// Cognex 그래버 매니저
/// </summary>
public class CogGrabberManager {
private static Logger _Logger = new Logger("CogGrabberManager");
private static readonly object _Lock = new object();
private List<ICogFrameGrabber> _CogFrameGrabbers = new List<ICogFrameGrabber>();
private Dictionary<string, int> _CamIdxes = new Dictionary<string, int>();
private int _CurCamIdx = 0;
private static CogGrabberManager _Instance;
/// <summary>
/// 싱글톤 객체
/// </summary>
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<string>();
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);
}
}
/// <summary>
/// 카메라 고정 IP주소로 Cognex 그래버 가져오기
/// </summary>
/// <param name="ipAddress">고정 IP</param>
/// <returns>Cognex 그래버</returns>
public ICogFrameGrabber GetCogFrameGrabberFromIpAddress(string ipAddress) {
foreach (ICogFrameGrabber cogFrameGrabber in _CogFrameGrabbers) {
if (cogFrameGrabber.OwnedGigEAccess.CurrentIPAddress == ipAddress) {
return cogFrameGrabber;
}
}
return null;
}
/// <summary>
/// 카메라 디바이스 ID로 Cognex 그래버 가져오기
/// </summary>
/// <param name="deviceId">디바이스 ID</param>
/// <returns>Cognex 그래버</returns>
public ICogFrameGrabber GetCogFrameGrabberFromDeviceId(string deviceId) {
int camIdx = GetCamIdx(deviceId);
if (camIdx < _CogFrameGrabbers.Count) {
return _CogFrameGrabbers[camIdx];
}
return null;
}
/// <summary>
/// 물리 카메라 ID(CAM1, CAM2, ..)를 인덱스(0, 1, ..)로 반환.
/// 사용 전 카메라 고정IP가 반드시 CAM 번호 순서대로 오름차순 정렬되어 있어야 함.
/// </summary>
/// <param name="deviceId">디바이스 ID</param>
/// <returns>물리 카메라 인덱스</returns>
public int GetCamIdx(string deviceId) {
if (_CamIdxes.ContainsKey(deviceId)) {
return _CamIdxes[deviceId];
}
else {
_CamIdxes.Add(deviceId, _CurCamIdx++);
return _CamIdxes[deviceId];
}
}
/// <summary>
/// 리소스 정리
/// </summary>
public void Dispose() {
_CogFrameGrabbers?.Clear();
_CamIdxes?.Clear();
_CurCamIdx = 0;
_Instance = null;
}
}
}