2023-10-08 21:18:59 +08:00
|
|
|
|
using Aitex.Core.RT.Log;
|
|
|
|
|
using Aitex.Core.Util;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2024-01-09 17:27:33 +08:00
|
|
|
|
using System.Diagnostics;
|
2024-01-08 16:29:53 +08:00
|
|
|
|
using Aitex.Core.RT.DataCenter;
|
2023-10-08 21:18:59 +08:00
|
|
|
|
|
|
|
|
|
namespace Aitex.Core.RT.DataCollection.HighPerformance
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 数据收集器对象,用于收集在<see cref="DataManager"/>中注册的数据源的数据。
|
|
|
|
|
/// </summary>
|
2024-01-09 17:27:33 +08:00
|
|
|
|
public class DataHolder<T> : IDataHolder
|
2023-10-08 21:18:59 +08:00
|
|
|
|
{
|
|
|
|
|
#region Variables
|
|
|
|
|
|
2024-01-09 17:27:33 +08:00
|
|
|
|
private readonly Dictionary<long, string> _buffer = new ();
|
2023-10-08 21:18:59 +08:00
|
|
|
|
private readonly R_TRIG _rTrigReadFailed = new ();
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Constructors
|
|
|
|
|
|
2024-01-09 17:27:33 +08:00
|
|
|
|
public DataHolder(int index, string name, Func<object> read)
|
2023-10-08 21:18:59 +08:00
|
|
|
|
{
|
|
|
|
|
Index = index;
|
|
|
|
|
Name = name;
|
|
|
|
|
Read = read;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Properties
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回数据获取器的序号。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int Index { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回数据获取器名称。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public string Name { get; }
|
|
|
|
|
|
2024-01-09 17:27:33 +08:00
|
|
|
|
public Type ValueType => typeof(T);
|
|
|
|
|
|
2023-10-08 21:18:59 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回数据获取器。
|
|
|
|
|
/// </summary>
|
2024-01-09 17:27:33 +08:00
|
|
|
|
public Func<object> Read{ get; }
|
2023-10-08 21:18:59 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 返回缓存数据的长度。
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal int CacheCount => _buffer.Count;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Methods
|
|
|
|
|
|
2024-01-09 17:27:33 +08:00
|
|
|
|
private string ReadAndFormatValue()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var value = (T)Read.Invoke();
|
2024-01-15 09:38:57 +08:00
|
|
|
|
return DataTraceHelper.Format(value);
|
2024-01-09 17:27:33 +08:00
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Debug.Assert(false, $"Unable to cache data [{Name}], {ex.Message}");
|
|
|
|
|
return "'0'";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-08 21:18:59 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 缓存数据。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="timestamp"></param>
|
2024-01-09 17:27:33 +08:00
|
|
|
|
public void Cache(long timestamp)
|
2023-10-08 21:18:59 +08:00
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2024-01-09 17:27:33 +08:00
|
|
|
|
_buffer[timestamp] = ReadAndFormatValue();
|
2023-10-08 21:18:59 +08:00
|
|
|
|
_rTrigReadFailed.CLK = false;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
// 首次发生错误时记录日志。
|
|
|
|
|
_rTrigReadFailed.CLK = true;
|
|
|
|
|
if(_rTrigReadFailed.Q)
|
|
|
|
|
LOG.Error($"数据获取器 {Name} 在 {timestamp} 时发生错误。", ex);
|
|
|
|
|
|
2024-01-09 17:27:33 +08:00
|
|
|
|
_buffer[timestamp] = string.Empty;
|
2023-10-08 21:18:59 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取指定时间戳的数据。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="timestamp">时间戳。</param>
|
|
|
|
|
/// <returns></returns>
|
2024-01-09 17:27:33 +08:00
|
|
|
|
public string Get(long timestamp)
|
2023-10-08 21:18:59 +08:00
|
|
|
|
{
|
|
|
|
|
if (_buffer.TryGetValue(timestamp, out var value))
|
|
|
|
|
{
|
|
|
|
|
_buffer.Remove(timestamp);
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2024-01-09 17:27:33 +08:00
|
|
|
|
return default;
|
2023-10-08 21:18:59 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|