/* * 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 { /// /// 카메라 생성 및 등록 /// public static class CameraFactory { private static Logger _Logger = new Logger("CameraFactory"); private static IDisposable _EventDisposable; /// /// 카메라 생성 및 등록 /// /// Aurora 레지스트리 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); } } /// /// 카메라 ID로 보드 타입 가져오기 /// /// 카메라 ID /// 보드 타입 public static eBoardType GetBoardType(eCamId camId) { string configPath = Path.Combine(ApplicationExt.DataPath, "_config_device", camId + @".json"); return JsonManager.GetValue(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); } } } }