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 obj = stEvent.GetType().GetProperty(light.ToString())?.GetValue(stEvent); if (obj != null) { var status = TowerLightStatus.Unknown; STBlinkPattern blinkPattern = null; var str = obj.ToString().ToLower(); if (str.Contains(TowerLightStatus.On.ToString().ToLower())) { status = TowerLightStatus.On; } else if (str.Contains(TowerLightStatus.Off.ToString().ToLower())) { status = TowerLightStatus.Off; } else { // 使用工作模式配置中的项目 var pattern = PatternsSettings.FirstOrDefault(x => string.Compare(x.Name, str, StringComparison.OrdinalIgnoreCase) == 0); blinkPattern = pattern != null ? new STBlinkPattern(pattern.Pattern, pattern.Priority, pattern.Cycles) : STBlinkPattern.GetDefaultPattern(); status = TowerLightStatus.Customized; } events[stEvent.Name].Add(new STEventAction(light, status, blinkPattern)); } } } } #endregion } }