
namespace Aitex.Core.RT.IOCore;

/// <summary>
/// 互锁限制条件对象接口。
/// </summary>
public interface IInterlockLimit
{
    /// <summary>
    /// 返回互锁限制条件的唯一识别码。
    /// <remarks>
    /// 该唯一识别码用于创建字典时，作为字典的Key值使用。
    /// <br/>
    /// 该值由Name+LimitValue组成。
    /// </remarks>
    /// </summary>
    string UniqueId { get; }
    
    /// <summary>
    /// 返回当前Limit对应的IO的名称。
    /// </summary>
    string Name { get; }

    /// <summary>
    /// 返回当前Limit描述，用于输出用户信息。
    /// </summary>
    string Description { get; }

    /// <summary>
    /// 返回互锁限制条件触发原因。
    /// </summary>
    string LimitReason { get; }
    
    /// <summary>
    /// 返回守护条件满足时输出的信息。
    /// </summary>
    string DaemonReason { get; }
    
    /// <summary>
    /// 返回当前互锁条件提示信息。
    /// </summary>
    string Tip { get; }

    /// <summary>
    /// 返回该Limit是否对Action进行反转
    /// </summary>
    bool IgnoreReverse { get; }

    /*/// <summary>
    /// 判断两个互锁限制条件是否相等。
    /// </summary>
    /// <param name="interlockLimit">待比较的互锁限制条件。</param>
    /// <returns>
    ///	<para>True: 相同；False：不同。</para>
    /// </returns>
    bool IsSame(object interlockLimit);*/

    /// <summary>
    /// 返回互锁限制监测的信号当前值和期望值不相等的条件是否触发。
    /// <remarks>
    /// 捕获当前值和期望值不相等信号的上升沿，当上升沿到达时触发输出Q。
    /// </remarks>
    /// </summary>
    /// <returns></returns>
    bool IsTriggered();

    /// <summary>
    /// 根据互锁条件判断是否允许DO输出。
    /// </summary>
    /// <param name="reason">如果禁止DO输出，返回互锁原因。</param>
    /// <returns></returns>
    bool CanDo(out string reason);

    /// <summary>
    /// 获取指定互锁限制条件中限制条件的内容。
    /// </summary>
    /// <returns></returns>
    string GetLimitValue();
    
    /// <summary>
    /// 获取指定互锁限制条件中当前IO状态。
    /// </summary>
    /// <returns></returns>
    string GetCurrentValue();
}