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(Dictionary dicLights, 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; } if(dicLights.TryGetValue(light, out var part)) events[stEvent.Name].Add(new STEventAction(stEvent.Name, part, status, blinkPattern)); else LOG.Error($"Unable to find signal tower part {light} from STEvent config file."); } } } } #endregion } }