116 lines
4.0 KiB
C#
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;
|
|
}
|
|
}
|
|
} |