/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora;
using Aurora.Api;
using VisionCommon;
using System;
using System.Reflection;
using System.IO;
namespace VisionLight {
///
/// 조명 생성 및 등록
///
public static class LightFactory {
private static Logger _Logger = new Logger("LightFactory");
///
/// 조명 생성 및 등록
///
/// Aurora 레지스트리
public static void Register(IDeviceRegistry registry) {
try {
VersionChecker.Print(Assembly.GetExecutingAssembly().GetName());
var callingAssembly = Assembly.GetCallingAssembly(); // 위치 바꾸면 안됨.
_Logger.I($"CallingAssembly : {callingAssembly}");
var LightCnt = VisionSettingManager.VisionSetting.LightCount;
for (int i = 0; i < LightCnt; i++) {
var LightId = ((eLightId)i).ToString();
if (!VisionEnv.AuroraEnv.DeviceManager.IsRegisteredDevice(LightId)) {
var lightBase = Create(LightId, callingAssembly);
registry.Register(
LightId,
() => lightBase,
LightConfig.GetDefaultConfig(lightBase.LightConnType), (device) => new UCLightMainView(device));
}
}
LightHub.Instance.GetLightIds();
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
private static LightBase Create(string deviceId, Assembly callingAssembly) {
eLightModel lightModel = GetLightModel((eLightId)Enum.Parse(typeof(eLightId), deviceId));
LightBase light = GetLightFromVisionLight(lightModel, deviceId);
if (light != null) {
_Logger.FuncI($"{deviceId} is created from {lightModel}.");
return light;
}
light = GetLightFromMachine(lightModel, deviceId, callingAssembly);
if (light != null) {
_Logger.FuncI($"{deviceId} is created from {lightModel}.");
return light;
}
_Logger.FuncW($"{deviceId} is created from DEFAULT(Light_TSM_I16R).");
return new Light_TSM_I16R(deviceId); // Default
}
private static eLightModel GetLightModel(eLightId lightId) {
string configPath = Path.Combine(ApplicationExt.DataPath, "_config_device", lightId + @".json");
return JsonManager.GetValue(configPath, "LightModel");
}
private static LightBase GetLightFromVisionLight(eLightModel lightModel, string deviceId) {
if (LightModelDef.LightModels.ContainsKey(lightModel)) {
Type type = LightModelDef.LightModels[lightModel];
if (type != null) {
ConstructorInfo ctor = type.GetConstructor(new[] { typeof(string) });
return (LightBase)ctor.Invoke(new object[] { deviceId });
}
}
return null;
}
private static LightBase GetLightFromMachine(eLightModel lightModel, string deviceId, Assembly callingAssembly) {
Type targetType = typeof(LightBase);
string className = lightModel.ToString();
var types = callingAssembly.GetExportedTypes();
foreach (var type in types) {
if (className == type.Name &&
targetType.IsAssignableFrom(type)) {
ConstructorInfo ctor = type.GetConstructor(new[] { typeof(string) });
return (LightBase)ctor.Invoke(new object[] { deviceId });
}
}
return null;
}
}
}