using FLY.Thick.Base.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FLY.Thick.Base.IService
{
    /// <summary>
    /// 膜位置检测;
    /// 通过辊接近开关，或者编码器2;
    /// 支持同步;
    /// </summary>
    public interface IFilmPositionDetectService : INotifyPropertyChanged
    {
        #region 状态
        /// <summary>
        /// 线速度 m/min
        /// </summary>
        double FilmVelocity { get; }
        /// <summary>
        /// 膜位置， m
        /// </summary>
        double FilmPosition { get; }

        /// <summary>
        /// 工作中
        /// </summary>
        bool IsRunning { get; }

        /// <summary>
        /// 当前正在使用的 与机头测厚仪偏移，单位m
        /// </summary>
        double VDistanceWithHeaderInUsed { get; }

        /// <summary>
        /// 当前正在使用的 激光探头与 X光的偏移，单位m
        /// </summary>
        double VSensorOffsetInUsed { get; }

        /// <summary>
        /// 已经重新开始测量
        /// </summary>
        bool HasReset { get; }
        #endregion

        #region 参数
        /// <summary>
        /// 线速度阀值，低于阀值，速度直接变为0
        /// </summary>
        double FilmVThreshold { get; set; }

        /// <summary>
        /// 线速度来源
        /// </summary>
        FilmVSRC FilmVSrc { get; set; }

        /// <summary>
        /// 线速度:编码器2 mm/pulse
        /// </summary>
        double Encoder2_mmpp { get; set; }

        /// <summary>
        /// 线速度:1圈多少mm
        /// </summary>
        double MmOfR { get; set; }

        /// <summary>
        /// 本测厚仪探头与机头测厚仪探头距离单位m
        /// </summary>
        double VDistanceWithHeader { get; set; }

        /// <summary>
        /// 纵向光纤传感器与本测厚仪探头距离 单位m;
        /// 修改此值，会改变纵向偏移
        /// </summary>
        double VSensorOffset { get; set; }

        #endregion

        /// <summary>
        /// 主轴激光传感器检测到 1->0 变化 事件
        /// </summary>
        event FilmPosAt01EventHandler FilmPosAt01Event;

        /// <summary>
        /// 设置膜位置为某值
        /// </summary>
        /// <param name="filmPos">极片位置m</param>
        void Reset(double filmPos);

        /// <summary>
        /// 把膜位置设置为 -VDistanceWithHeader
        /// </summary>
        void Reset();

        /// <summary>
        /// 清除 hasReset标志位
        /// </summary>
        void ClearResetState();

        /// <summary>
        /// 服务器 从 机头得到的 0->1 事件，给机尾
        /// </summary>
        /// <param name="filmPos">极片位置m</param>
        void SetFilmPosAt01(double filmPos);

        /// <summary>
        /// 停止测量
        /// </summary>
        void Stop();

        /// <summary>
        /// 启动测量
        /// </summary>
        void Start();
    }

    /// <summary>
    /// 0-&gt;1 时极片位置事件
    /// </summary>
    public class FilmPosAt01EventArgs : EventArgs
    {
        /// <summary>
        /// 极片位置单位m
        /// </summary>
        public double filmPos;
    }
    
    /// <summary>
    /// 
    /// </summary>
    /// <param name="s"></param>
    /// <param name="e"></param>
    public delegate void FilmPosAt01EventHandler(object s, FilmPosAt01EventArgs e);


}
