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() { } } }