using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;
using FObjBase.Reflect;
using System;

namespace FLY.Thick.Base.Client
{
    /// <summary>
    /// 
    /// </summary>
    public class FilmPositionDetectServiceClient : FObjBase.Reflect.Reflect_SeviceClient, IFilmPositionDetectService
    {
        protected override Type InterfaceType => typeof(IFilmPositionDetectService);
        /// <summary>
        /// AD 曲线服务 客户端代理
        /// </summary>
        /// <param name="id"></param>
        public FilmPositionDetectServiceClient(UInt32 id) : base(id) { }

        /// <summary>
        /// AD 曲线服务 客户端代理
        /// </summary>
        /// <param name="serviceId">服务id</param>
        /// <param name="connName">连接器</param>
        public FilmPositionDetectServiceClient(UInt32 serviceId, string connName) : base(serviceId, connName) { }

        #region 状态

        /// <summary>
        /// 线速度 m/min
        /// </summary>
        public double FilmVelocity { get; set; }

        /// <summary>
        /// 膜位置, m
        /// </summary>
        public double FilmPosition { get; set; }

        /// <summary>
        /// 复位标识,从同步服务器发送过来的
        /// </summary>
        public int ResetMark { get; set; }
        #endregion

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

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

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

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


        #endregion
        /// <summary>
        /// 设置膜位置为某值
        /// </summary>
        /// <param name="filmPos">极片位置m</param>
        public void Reset(double filmPos)
        {
            Call(nameof(Reset), new { filmPos = filmPos });
        }


        /// <summary>
        /// 让同步信号输出 1->0
        /// </summary>
        public void SyncSysTime()
        {
            Call(nameof(SyncSysTime));
        }

        /// <summary>
        /// 纵向光纤传感器检测到 0到1 变化 事件 
        /// 或
        /// sysTime同步信号触发 0到1 变化 事件 
        /// </summary>
        [Push(typeof(SysTimeFilmPosEventArgs))]
        public event EventHandler SysTimeFilmPosEvent;
        public void Trigger_SysTimeFilmPosEvent(SysTimeFilmPosEventArgs e)
        {
            SysTimeFilmPosEvent?.Invoke(this, e);
        }
        /// <summary>
        /// 设置膜位置为某值; 同步服务器调用的
        /// </summary>
        /// <param name="filmPos">极片位置m</param>
        /// <param name="sysTime">AD盒sysTime</param>
        /// <param name="resetMark">复位标识</param>
        public void Reset(double filmPos, DateTime sysTime, int resetMark)
        {
            Call(nameof(Reset), new { filmPos = filmPos, sysTime = sysTime, resetMark = resetMark });
        }
    }
}