using Aitex.Core.RT.Log; using System; using System.Collections.Generic; using System.Linq; using System.Xml.Serialization; namespace MECF.Framework.Common.Device.Bases { public class STEvents { #region Properties /// /// 返回工作模式模板。 /// [XmlArray("STPatterns")] [XmlArrayItem("STPattern")] public List PatternsSettings { get; set; } /// /// 返回预定义的事件。 /// [XmlArray("STEvents")] public List Events { get; set; } #endregion #region Methods /// /// 解析配置文件中定义的事件。 /// /// /// 返回事件字典。 /// /// 事件字典的Key为事件名称,名称为RT中注册的Bool型数据,通过DATA.Poll访问。 ///
/// 事件动作为动作列表,表示当上述事件为True时,指定的信号塔组件执行的动作。 ///
/// public void ParseEvents(out Dictionary> events) { events = new Dictionary>(); foreach (var stEvent in Events) { // 如果相同的事件已经添加,则不再重复添加 if (events.ContainsKey(stEvent.Name)) continue; // 字典中创建一个事件项目 events[stEvent.Name] = new List(); // 解析当前事件执行的动作 foreach (LightType light in Enum.GetValues(typeof(LightType))) { var strStatus = stEvent.GetType().GetProperty(light.ToString())?.GetValue(stEvent)?.ToString().ToLower(); if (!string.IsNullOrEmpty(strStatus)) { var status = TowerLightStatus.Unknown; STBlinkPattern blinkPattern = null; if (strStatus.Contains(TowerLightStatus.On.ToString().ToLower())) { status = TowerLightStatus.On; } else if (strStatus.Contains(TowerLightStatus.Off.ToString().ToLower())) { status = TowerLightStatus.Off; } else { // 使用工作模式配置中的项目 var pattSetting = PatternsSettings.FirstOrDefault(x => string.Compare(x.Name, strStatus, StringComparison.OrdinalIgnoreCase) == 0); if (pattSetting != null) blinkPattern = new STBlinkPattern(pattSetting.Pattern, pattSetting.Priority, pattSetting.Cycles); else { LOG.Warning($"Unable to find the STPatternSetting {strStatus} from STEvents config file."); blinkPattern = STBlinkPattern.GetDefaultPattern(); } status = TowerLightStatus.Customized; } events[stEvent.Name].Add(new STEventAction(stEvent.Name, light, status, blinkPattern)); } else { LOG.Warning($"Unable to find the status of light {light} from STEvents config file."); } } } } #endregion } }