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));
}
}
}
}
#endregion
}
}