/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora.Api;
using System;
using System.Collections.Generic;
using VisionCommon;
using System.Reactive.Linq;
namespace VisionLight {
///
/// Light Hub
///
public class LightHub : IDisposable {
private Logger _VisionLog = new Logger(typeof(LightHub).Name, VisionKeys.LogKey);
private static Logger _Logger = new Logger("LightHub");
private static readonly object _Lock = new object();
private static readonly object _LightConfigLock = new object();
private Dictionary _lightConfigs = new Dictionary();
private IEventObservable _EventObservable;
private static LightHub _instance;
///
/// 싱글턴 객체 instance
///
public static LightHub Instance {
get {
lock (_Lock) {
try {
if (_instance == null)
_instance = new LightHub();
return _instance;
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
return null;
}
}
}
private LightHub() {
_EventObservable = VisionEnv.AuroraEnv.EventObservable;
SetLightConfig();
SetObservable();
}
private void SetObservable() {
Observable.Merge(
VisionEnv.AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_DEVICE_ACTIVATED))
.Subscribe(_ => SetLightConfig());
}
private void SetLightConfig() {
lock (_LightConfigLock) {
_lightConfigs.Clear();
IEnumerable _Devices = VisionEnv.AuroraEnv.DeviceManager.GetDevices();
foreach (var device in _Devices) {
if (device.Type == DeviceType.Light) {
//if (device is LightBase) {
if (!_lightConfigs.ContainsKey(device.DeviceId))
_lightConfigs.Add(device.DeviceId, VisionEnv.AuroraEnv.DeviceManager.GetDeviceConfig(device.DeviceId) as LightConfig);
}
}
}
}
///
/// Light 컨피그 정보 리스트 가져오기
///
/// 카메라 Id
/// Light Config info List
public List GetLightConfigInfo(eCamId camId) {
List lightConfigInfos = new List();
foreach (KeyValuePair kv in _lightConfigs) {
if (kv.Value == null) {
continue;
}
foreach (var channelConfig in kv.Value.ChannelConfigs) {
if (channelConfig.CamId == camId) {
LightConfigInfo lightConfigInfo = new LightConfigInfo();
lightConfigInfo.LightId = (eLightId)Enum.Parse(typeof(eLightId), kv.Key);
lightConfigInfo.DimRange = (kv.Value.DimRange.Min, kv.Value.DimRange.Max);
lightConfigInfo.ChConfig = channelConfig.Clone();
lightConfigInfos.Add(lightConfigInfo);
}
}
}
return lightConfigInfos;
}
///
/// Light 컨피그 정보 가져오기
///
/// Light ID
/// 채널
///
public LightConfigInfo GetLightConfigInfo(eLightId LightId, int Ch) {
foreach (var channelConfig in _lightConfigs[LightId.ToString()].ChannelConfigs) {
if (channelConfig.Ch == Ch) {
LightConfigInfo lightConfigInfo = new LightConfigInfo();
lightConfigInfo.LightId = LightId;
lightConfigInfo.DimRange = (_lightConfigs[LightId.ToString()].DimRange.Min, _lightConfigs[LightId.ToString()].DimRange.Max);
lightConfigInfo.ChConfig = channelConfig.Clone();
return lightConfigInfo;
}
}
return null;
}
///
/// Light Id 리스트 가져오기
///
/// Light 리스트
public List GetLightIds() {
List LightIds = new List();
foreach (KeyValuePair kv in _lightConfigs) {
LightIds.Add(kv.Key);
}
return LightIds;
}
///
/// 조명 켜기
///
/// 조명 아이디
/// 채널 번호
/// 조명 제어 결과
public eLightResult SetOn(string lightId, int channel) {
var res = eLightResult.OK;
try {
var lightDevice = VisionEnv.AuroraEnv.DeviceManager[lightId] as LightBase;
_VisionLog.FuncI(string.Format("OnOff : {0}, Channel : {1}", true, channel));
res = lightDevice.SetOn(channel);
}
catch (Exception e) {
_VisionLog.FuncE(e.Message);
}
return res;
}
///
/// 조명 끄기
///
/// 조명 아이디
/// 채널 번호
/// 조명 제어 결과
public eLightResult SetOff(string lightId, int channel) {
var res = eLightResult.OK;
try {
var lightDevice = VisionEnv.AuroraEnv.DeviceManager[lightId] as LightBase;
_VisionLog.FuncI(string.Format("OnOff : {0}, Channel : {1}", false, channel));
res = lightDevice.SetOff(channel);
}
catch (Exception e) {
_VisionLog.FuncE(e.Message);
}
return res;
}
///
/// 조명 상태 가져오기
///
/// 조명 아이디
/// 채널 번호
/// 조명 상태 (on : true, off : false)
public bool GetOnOff(string lightId, int channel) {
try {
var lightDevice = VisionEnv.AuroraEnv.DeviceManager[lightId] as LightBase;
return lightDevice.GetOnOff(channel);
}
catch (Exception e) {
_VisionLog.FuncE(e.Message);
}
return false;
}
///
/// 라이트 레벨 설정하기 (list)
///
/// 라이트 파라미터들
///
public eLightResult SetLevels(List lightParams) {
try {
foreach (var lightParam in lightParams) {
SetLevel(lightParam.LightId.ToString(), lightParam.Level, lightParam.Ch);
}
return eLightResult.OK;
}
catch {
return eLightResult.NG;
}
}
///
/// 라이트 레벨 설정하기
///
/// 라이트 Id
/// 채널 레벨
/// 채널 숫자
///
public eLightResult SetLevel(string lightId, int chLevel, int chNum) {
var lightDevice = VisionEnv.AuroraEnv.DeviceManager[lightId] as LightBase;
_VisionLog.FuncI(string.Format("Level : {0}, Channel : {1}", chLevel, chNum));
return lightDevice.SetLevel(chLevel, chNum);
}
///
/// 라이트 파라미터 리스트 가져오기
///
/// 카메라 ID
///
public List GetLightParams(eCamId camId) {
List lightParams = new List();
foreach (KeyValuePair kv in _lightConfigs) {
if (kv.Value == null) {
continue;
}
foreach (var channelConfig in kv.Value.ChannelConfigs) {
if (channelConfig.CamId == camId) {
LightParam lightParam = new LightParam();
lightParam.LightId = (eLightId)Enum.Parse(typeof(eLightId), kv.Key);
lightParam.Ch = channelConfig.Ch;
lightParam.Level = channelConfig.Level;
lightParam.OnOff = channelConfig.OnOff;
lightParams.Add(lightParam);
}
}
}
return lightParams;
}
///
/// 라이트 컨피그 정보 저장하기
///
/// 라이트 컨피그 정보들
public void SaveLightConfigInfo(List lightconfigInfos) {
foreach (var lightId in _lightConfigs.Keys) {
foreach (var lightConfigInfo in lightconfigInfos) {
if (lightId == lightConfigInfo.LightId.ToString()) {
foreach (var chConfig in _lightConfigs[lightId].ChannelConfigs) {
if (chConfig.Ch == lightConfigInfo.ChConfig.Ch) {
chConfig.Level = lightConfigInfo.ChConfig.Level;
}
}
}
}
var result = VisionEnv.AuroraEnv.DeviceManager.SaveDeviceConfig(lightId);
}
SetLightConfig();
}
///
/// 해제
///
public void Dispose() {
}
}
}