93 lines
3.1 KiB
C#
93 lines
3.1 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Xml.Serialization;
|
||
|
||
namespace MECF.Framework.Common.Device.Bases
|
||
{
|
||
public class STEvents
|
||
{
|
||
#region Properties
|
||
|
||
/// <summary>
|
||
/// 返回工作模式模板。
|
||
/// </summary>
|
||
[XmlArray("STPatterns")]
|
||
[XmlArrayItem("STPattern")]
|
||
public List<STPatternSetting> PatternsSettings { get; set; }
|
||
|
||
/// <summary>
|
||
/// 返回预定义的事件。
|
||
/// </summary>
|
||
[XmlArray("STEvents")]
|
||
public List<STEvent> Events { get; set; }
|
||
|
||
|
||
#endregion
|
||
|
||
#region Methods
|
||
|
||
/// <summary>
|
||
/// 解析配置文件中定义的事件。
|
||
/// </summary>
|
||
/// <param name="events">
|
||
/// 返回事件字典。
|
||
/// <remarks>
|
||
/// 事件字典的Key为事件名称,名称为RT中注册的Bool型数据,通过DATA.Poll访问。
|
||
/// <br/>
|
||
/// 事件动作为<see cref="STEventAction"/>动作列表,表示当上述事件为True时,指定的信号塔组件执行的动作。
|
||
/// </remarks>
|
||
/// </param>
|
||
public void ParseEvents(out Dictionary<string, List<STEventAction>> events)
|
||
{
|
||
events = new Dictionary<string, List<STEventAction>>();
|
||
|
||
foreach (var stEvent in Events)
|
||
{
|
||
// 如果相同的事件已经添加,则不再重复添加
|
||
if (events.ContainsKey(stEvent.Name))
|
||
continue;
|
||
|
||
// 字典中创建一个事件项目
|
||
events[stEvent.Name] = new List<STEventAction>();
|
||
|
||
// 解析当前事件执行的动作
|
||
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
|
||
}
|
||
}
|