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

115 lines
4.7 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora;
using Aurora.Api;
using CogCommon;
using VisionCommon;
using System;
using System.Reflection;
using System.IO;
using System.Linq;
namespace CogCamera {
/// <summary>
/// 카메라 생성 및 등록
/// </summary>
public static class CameraFactory {
private static Logger _Logger = new Logger("CameraFactory");
private static IDisposable _EventDisposable;
/// <summary>
/// 카메라 생성 및 등록
/// </summary>
/// <param name="registry">Aurora 레지스트리</param>
public static void Register(IDeviceRegistry registry) {
SetObservable();
try {
VersionChecker.Print(Assembly.GetExecutingAssembly().GetName());
var visionSetting = VisionSettingManager.VisionSetting;
if (visionSetting.RecipeModelType == eRecipeModelType.AuroraModel) {
foreach (string modelName in VisionEnv.AuroraEnv.ModelManager.Models()) {
var vsModelDef = VisionEnv.AuroraEnv.ModelManager.ModelItem(modelName, VisionKeys.VisionRecipeKey) as VisionModelDef;
RegisterInternal(registry, vsModelDef);
}
}
else if (visionSetting.RecipeModelType == eRecipeModelType.AuroraIngredient) {
var vsIngredient = VisionEnv.AuroraEnv.IngredientsManager.Ingredient(VisionKeys.VisionRecipeKey);
foreach (var vsIngredientName in vsIngredient.Items()) {
var vsIngredientDef = vsIngredient.IngredientItem(vsIngredientName.name) as VisionIngredientDef;
RegisterInternal(registry, vsIngredientDef);
}
}
else {
foreach (var recipeItem in VisionEnv.AuroraEnv.RecipeManager.Recipes()) {
var vsRecipeDef = VisionEnv.AuroraEnv.RecipeManager.RecipeItem(recipeItem.Id, VisionKeys.VisionRecipeKey) as VisionRecipeDef;
RegisterInternal(registry, vsRecipeDef);
}
}
SetCameraAgentManager();
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
private static void SetObservable() {
if (_EventDisposable == null) {
var observable = VisionEventId.GetRecipeUpdateObservable();
_EventDisposable = observable.Subscribe(_ => SetCameraAgentManager());
}
}
private static void SetCameraAgentManager() {
CameraAgentManager.Clear();
foreach (var fovInfo in VisionRecipeManager.GetFovInfos()) {
if (!CameraAgentManager.ContainsKey(fovInfo)) {
var cogCameraAgent = new CogCameraAgent(fovInfo);
CameraAgentManager.SetCameraAgent(fovInfo, cogCameraAgent);
}
}
}
private static void RegisterInternal(IDeviceRegistry registry, VisionDef vsDef) {
try {
var camIdList = vsDef.GetCamIds(vsDef.GetFovRecipes(vsDef.GetFovInfos())).OrderBy(x => x);
foreach (var camId in camIdList) {
var boardType = (EquipmentInfoManager.EquipmentInfo.SimulationMode) ? eBoardType.Mock : GetBoardType(camId);
if (!VisionEnv.AuroraEnv.DeviceManager.IsRegisteredDevice(camId.ToString())) {
registry.Register(
camId.ToString(),
() => Create(boardType, camId.ToString()),
CamConfig.GetDefaultConfig());
}
}
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
/// <summary>
/// 카메라 ID로 보드 타입 가져오기
/// </summary>
/// <param name="camId">카메라 ID</param>
/// <returns>보드 타입</returns>
public static eBoardType GetBoardType(eCamId camId) {
string configPath = Path.Combine(ApplicationExt.DataPath, "_config_device", camId + @".json");
return JsonManager.GetValue<eBoardType>(configPath, string.Format($"{typeof(CamConnConfig).Name}.BoardType"));
}
private static CameraBase Create(eBoardType boardType, string hwCameName) {
if (boardType == eBoardType.Mock) {
return new CogCameraMock(hwCameName);
}
else {
return new CogCamera(hwCameName);
}
}
}
}