using FObjBase;
using FObjBase.Reflect;
using Misc;
using System;
using System.ComponentModel;

namespace FLY.Thick.Base.IService
{
    /// <summary>
    /// 
    /// </summary>
    public interface IBorderSearchService : INotifyPropertyChanged
    {
        #region 参数
        /// <summary>
        /// 启动与否
        /// </summary>
        bool Enable { get; set; }

        /// <summary>
        /// 单一材料，找空气与膜均值的 中间位置
        /// </summary>
        bool IsOneMaterial { get; set; }

        /// <summary>
        /// 边界拐点检测，找到的边界更加精确
        /// </summary>
        bool IsBreakDetect { get; set; }

        /// <summary>
        /// 有限范围
        /// </summary>
        RangeStruct Valid { get; set; }

        /// <summary>
        /// 手动设置温修AD值
        /// </summary>
        bool TempADBySet { set; get; }

        /// <summary>
        /// 温修AD值
        /// </summary>
        int TempAD { get; set; }

        /// <summary>
        /// AD超过了范围， 就认为开始找到边界
        /// </summary>
        int TempRange { get; set; }
        /// <summary>
        /// 温修范围是温修的百分比
        /// </summary>
        bool IsTempRangeByPercent { get; set; }

        /// <summary>
        ///  温修范围百分比
        /// </summary>
        double TempRangePercent { get; set; }
        /// <summary>
        /// 有滤波器，只有非空的连续N个pos以上，才开始算边界开始
        /// </summary>
        int N { get; set; }

        /// <summary>
        /// 探头直径，单位脉冲， 膜宽 = 边界范围 - 探头直径
        /// </summary>
        int SensorWidth { get; set; }

        /// <summary>
        /// 找到边界后，边界 + 探头半径  + N2个脉冲。 这个是数据有效的开始
        /// </summary>
        int N2 { get; set; }

        /// <summary>
        /// 记录两个边界以后扫描，以它们再外扩N3个脉冲，作为扫描范围 
        /// </summary>
        int N3 { get; set; }
        #endregion

        #region 状态
        /// <summary>
        /// 反向边界
        /// </summary>
        Range Border_Backw { get; }
        /// <summary>
        /// 正向边界
        /// </summary>
        Range Border_Forw { get; }
        /// <summary>
        /// 边界
        /// </summary>
        RangeStruct Border { get; }
        /// <summary>
        /// 当前膜宽，测量出来的，单位是 脉冲
        /// </summary>
        int Width { get; }
        /// <summary>
        /// 膜中间位置 单位 脉冲
        /// </summary>
        int Mid { get; }

        /// <summary>
        /// 数据更新时间
        /// </summary>
        DateTime UpdateTime { get; }

        /// <summary>
        /// 产品宽度，设置值 单位:脉冲
        /// 当膜超过范围（没有经过阀值），就使用它，猜边界在哪
        /// </summary>
        int ProductWidth { get; }
        #endregion


        /// <summary>
        /// 获取混合后的横向数据；没有把横向留白剔除；只把纵向留白剔除。
        /// 数据单位 mm
        /// </summary>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        [Call(typeof(BorderSearchGetViewReponse))]
        void GetView(AsyncCBHandler asyncDelegate, object asyncContext);

        /// <summary>
        /// 应该 及 保存
        /// </summary>
        void Apply();
    }
    /// <summary>
    /// 
    /// </summary>
    public class BorderSearchGetViewReponse
    {

        /// <summary>
        /// 方向
        /// </summary>
        public DIRECTION direction;
        /// <summary>
        /// 1个grid 多少个脉冲
        /// </summary>
        public int posOfGrid;
        /// <summary>
        /// 开始grid号
        /// </summary>
        public int gridBegin;
        /// <summary>
        /// 数据
        /// </summary>
        public int[] dat;
        /// <summary>
        /// 边界
        /// </summary>
        public Range border;
    }
}
