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
}
}