2023-04-24 18:03:19 +08:00
|
|
|
|
using System;
|
2023-04-25 14:29:29 +08:00
|
|
|
|
using System.Collections.Generic;
|
2023-04-25 10:01:43 +08:00
|
|
|
|
using System.Diagnostics;
|
2023-04-24 18:03:19 +08:00
|
|
|
|
using System.Runtime.Serialization;
|
2023-04-25 14:29:29 +08:00
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using Aitex.Core.RT.Log;
|
2023-04-28 09:17:28 +08:00
|
|
|
|
using BlinkDataType = System.Collections.Generic.KeyValuePair<MECF.Framework.Common.Device.Bases.TowerLightStatus, uint>;
|
2023-04-24 18:03:19 +08:00
|
|
|
|
|
|
|
|
|
namespace MECF.Framework.Common.Device.Bases;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 信号灯塔元件闪烁模式。
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Serializable]
|
|
|
|
|
[DataContract]
|
|
|
|
|
public class STBlinkPattern
|
|
|
|
|
{
|
2023-04-28 09:17:28 +08:00
|
|
|
|
#region Variables
|
|
|
|
|
|
2023-05-01 18:58:42 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 以-或.配置闪烁模式的字串正则表达式。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public const string REG_PATT_BLINK_PATTER = @"([^\-\.])+";
|
|
|
|
|
|
2023-04-28 09:17:28 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 模式字符串中每个字符对应的延时时长,单位毫秒。
|
|
|
|
|
/// </summary>
|
|
|
|
|
private const uint DELAY_MS_PER_CHAR = 100;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2023-04-24 18:03:19 +08:00
|
|
|
|
#region Constructors
|
|
|
|
|
|
2023-04-25 10:01:43 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 构造信号灯元件闪烁模式。
|
2023-04-25 14:29:29 +08:00
|
|
|
|
/// <para>如果未指定闪烁模式,则默认开一秒,关一秒,无限循环。</para>
|
2023-04-25 10:01:43 +08:00
|
|
|
|
/// </summary>
|
2023-04-24 18:03:19 +08:00
|
|
|
|
public STBlinkPattern()
|
|
|
|
|
{
|
2023-04-25 10:01:43 +08:00
|
|
|
|
TotalCycles = 0;
|
2023-04-25 14:29:29 +08:00
|
|
|
|
Pattern = "----------..........";
|
2023-04-24 18:03:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建信号灯塔元件闪烁模式对象的实例。
|
|
|
|
|
/// </summary>
|
2023-05-01 18:58:42 +08:00
|
|
|
|
/// <param name="cycle">总循环次数,0或负值表示无限循环。</param>
|
2023-04-25 14:29:29 +08:00
|
|
|
|
/// <param name="pattern">
|
|
|
|
|
/// 闪烁模式。
|
|
|
|
|
/// 请参考属性<see cref="Pattern"/>以或许模式的设置方法。
|
|
|
|
|
/// </param>
|
2023-05-01 18:58:42 +08:00
|
|
|
|
public STBlinkPattern(string pattern, uint cycle = uint.MaxValue)
|
2023-04-24 18:03:19 +08:00
|
|
|
|
{
|
2023-04-25 14:29:29 +08:00
|
|
|
|
Debug.Assert(!string.IsNullOrEmpty(pattern), "pattern can not be null");
|
2023-04-25 10:01:43 +08:00
|
|
|
|
|
2023-05-01 18:58:42 +08:00
|
|
|
|
TotalCycles = cycle;
|
2023-04-25 14:29:29 +08:00
|
|
|
|
Pattern = pattern;
|
2023-05-01 18:58:42 +08:00
|
|
|
|
IsPlcMode = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建信号灯塔元件闪烁模式对象的实例。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="cycle">总循环次数,0或负值表示无限循环。</param>
|
|
|
|
|
/// <param name="frequencyHz">
|
|
|
|
|
/// PLC控制模式下的闪烁频率。
|
|
|
|
|
/// </param>
|
|
|
|
|
/// <param name="fallbackPattern">
|
|
|
|
|
/// 如果PLC不支持设置闪烁频率,则回落到此模式。
|
|
|
|
|
/// </param>
|
|
|
|
|
public STBlinkPattern(float frequencyHz, uint cycle = uint.MaxValue, string fallbackPattern = "-----.....")
|
|
|
|
|
{
|
|
|
|
|
TotalCycles = cycle;
|
|
|
|
|
Pattern = fallbackPattern;
|
|
|
|
|
FrequencyHz = frequencyHz;
|
|
|
|
|
IsPlcMode = true;
|
2023-04-24 18:03:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-01 18:58:42 +08:00
|
|
|
|
|
2023-04-24 18:03:19 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Properties
|
2023-05-01 18:58:42 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回是否为PLC控制模式。
|
|
|
|
|
/// <br/>
|
|
|
|
|
/// <remarks>PLC模式指闪烁效果有PLC控制,以提供更精确的控制效果。</remarks>
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsPlcMode { get; }
|
|
|
|
|
|
2023-04-24 18:03:19 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设置或返回总循环次数。
|
|
|
|
|
/// </summary>
|
|
|
|
|
[DataMember]
|
2023-04-25 10:01:43 +08:00
|
|
|
|
public uint TotalCycles { get; set; }
|
2023-04-24 18:03:19 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-04-25 14:29:29 +08:00
|
|
|
|
/// 设置或返回闪烁模式。
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// 闪烁模式以字符串形式表达,表达式中仅允许包含字符’-‘(英文减号)和’.‘(英文句号)。
|
|
|
|
|
/// 其中<value>-</value>表示开100ms,<value>.</value>表示关100ms。
|
|
|
|
|
/// <br/>
|
|
|
|
|
/// 通过'-'和‘.‘的组合,可描述不同的闪烁模式。
|
|
|
|
|
/// </remarks>
|
2023-04-24 18:03:19 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
[DataMember]
|
2023-04-25 14:29:29 +08:00
|
|
|
|
public string Pattern { get; set; }
|
2023-04-24 18:03:19 +08:00
|
|
|
|
|
2023-05-01 18:58:42 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 闪烁频率。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public float FrequencyHz { get; set; }
|
|
|
|
|
|
2023-04-25 14:29:29 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Static Methods
|
|
|
|
|
|
2023-05-01 18:58:42 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 解析闪烁模式字串,生成闪烁数据供M<see cref="SignalTowerPartBase"/>产生闪烁效果。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="blinkData">闪烁效果数据。</param>
|
|
|
|
|
/// <param name="reason">解析失败原因。</param>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// <value>True: 解析成功</value>
|
|
|
|
|
/// <value>False: 解析失败</value>
|
|
|
|
|
/// </returns>
|
2023-04-28 09:17:28 +08:00
|
|
|
|
public bool Parse(out List<BlinkDataType> blinkData, out string reason)
|
2023-04-25 14:29:29 +08:00
|
|
|
|
{
|
|
|
|
|
// var regex = new Regex(@"(([-\.])(\2*))");
|
|
|
|
|
|
|
|
|
|
reason = "";
|
2023-04-28 09:17:28 +08:00
|
|
|
|
blinkData = new List<BlinkDataType>();
|
2023-04-25 14:29:29 +08:00
|
|
|
|
|
|
|
|
|
// 校验Pattern字串的正则,Pattern仅允许有字符’-‘和’.’组成。
|
2023-05-01 18:58:42 +08:00
|
|
|
|
var regPatternFormat = new Regex(REG_PATT_BLINK_PATTER);
|
2023-04-25 14:29:29 +08:00
|
|
|
|
|
|
|
|
|
// Pattern分组正则
|
|
|
|
|
var regGroup = new Regex(@"([\-\.])\1*");
|
|
|
|
|
|
|
|
|
|
if (regPatternFormat.IsMatch(Pattern))
|
|
|
|
|
{
|
|
|
|
|
// 如果存在除-和.以外的字符,则为非法Pattern字串。
|
|
|
|
|
reason = "pattern contains illegal characters";
|
|
|
|
|
LOG.Error(reason);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-28 09:17:28 +08:00
|
|
|
|
var matches = regGroup.Matches(Pattern);
|
|
|
|
|
|
|
|
|
|
foreach (Match match in matches)
|
|
|
|
|
{
|
|
|
|
|
if (match.Success && match.Groups.Count == 2)
|
|
|
|
|
{
|
|
|
|
|
var leadChar = match.Groups[1].Value; // 编组字符
|
|
|
|
|
var length = (uint)match.Length;
|
|
|
|
|
|
|
|
|
|
// 根据每组的字符判断动作。
|
|
|
|
|
TowerLightStatus action;
|
|
|
|
|
switch (leadChar)
|
|
|
|
|
{
|
|
|
|
|
case "-":
|
|
|
|
|
action = TowerLightStatus.On;
|
|
|
|
|
break;
|
|
|
|
|
case ".":
|
|
|
|
|
action = TowerLightStatus.Off;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
LOG.Error($"Undefined character {leadChar} in pattern");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
blinkData.Add(new(action, DELAY_MS_PER_CHAR * length));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2023-04-25 14:29:29 +08:00
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-24 18:03:19 +08:00
|
|
|
|
/// <summary>
|
2023-04-25 14:29:29 +08:00
|
|
|
|
/// 获取预设的快速闪烁模式。
|
2023-04-24 18:03:19 +08:00
|
|
|
|
/// </summary>
|
2023-04-25 14:29:29 +08:00
|
|
|
|
/// <remarks>
|
|
|
|
|
/// 开200ms,关200ms,无限循环。
|
|
|
|
|
/// </remarks>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static STBlinkPattern GetFastBlinkPattern()
|
|
|
|
|
{
|
2023-05-01 18:58:42 +08:00
|
|
|
|
return new STBlinkPattern(0.5f, int.MaxValue, "--..");
|
2023-04-25 14:29:29 +08:00
|
|
|
|
}
|
2023-04-24 18:03:19 +08:00
|
|
|
|
|
2023-04-25 14:29:29 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取预设的慢速闪烁模式。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// 开1s,关1s,无限循环。
|
|
|
|
|
/// </remarks>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static STBlinkPattern GetSlowBlinkPattern()
|
|
|
|
|
{
|
2023-05-01 18:58:42 +08:00
|
|
|
|
return new STBlinkPattern(1f, int.MaxValue, "----------.........." );
|
2023-04-25 14:29:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取预设的工艺完成闪烁模式。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// 以开200ms、关200ms方式连续闪烁3次,然后关1s,循环5次。
|
|
|
|
|
/// </remarks>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static STBlinkPattern GetProcessDoneBlinkPattern()
|
|
|
|
|
{
|
2023-05-01 18:58:42 +08:00
|
|
|
|
return new STBlinkPattern(1f, 5, "--..--..--..........");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static STBlinkPattern ParseSTEvent(string pattern, uint cycle = int.MaxValue)
|
|
|
|
|
{
|
|
|
|
|
if (Regex.IsMatch(pattern, REG_PATT_BLINK_PATTER))
|
|
|
|
|
return new STBlinkPattern(pattern, cycle);
|
|
|
|
|
|
|
|
|
|
if(float.TryParse(pattern, out var freq))
|
|
|
|
|
return new STBlinkPattern(freq, cycle);
|
|
|
|
|
|
|
|
|
|
return GetFastBlinkPattern();
|
2023-04-25 14:29:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-24 18:03:19 +08:00
|
|
|
|
#endregion
|
|
|
|
|
}
|