115 lines
4.7 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
} |