using FLY.Thick.Blowing360.IService;
using FObjBase;
using FObjBase.Reflect;
using Misc;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace FLY.Thick.Blowing360.Client
{
    /// <summary>
    /// 旋转架及膜位置检测模拟
    /// </summary>
    public class BlowingDetect360EncoderServiceClient : FObjBase.Reflect.Reflect_SeviceClient, IBlowingDetect360EncoderService
    {
        protected override Type InterfaceType => typeof(IBlowingDetect360EncoderService);

        #region IBlowingDetect 成员
        #region 参数

        /// <summary>
        /// 人字架 旋转1周总脉冲数
        /// </summary>
        public int PosOfR { get; set; }
        /// <summary>
        /// 复位信号 脉冲数
        /// </summary>
        public int PosOfOrgSign { get; set; }

        /// <summary>
        /// 人字架到测厚仪膜长 单位m
        /// </summary>
        public double FilmLength { get; set; }

        /// <summary>
        /// 辊周长,单位mm
        /// </summary>
        public double RollPerimeter { get; set; }

        #endregion

        #region 状态

        /// <summary>
        /// 当前旋转架旋转角度
        /// </summary>
        public double Angle { get; set; }

        /// <summary>
        /// 当前方向
        /// </summary>
        public DIRECTION Direction { get; set; }

        /// <summary>
        /// 累计旋转次数
        /// </summary>
        public int RotationCnt { get; set; }

        /// <summary>
        /// 最后一个限位信号 到当前已经消耗的时间
        /// </summary>
        public TimeSpan PastTime { get; set; }

        /// <summary>
        /// 当前线速度,单位 m/min
        /// </summary>
        public double FilmVelocity { get; set; }

        /// <summary>
        /// 离开限位 到 撞下一个限位  的 旋转架转动时间, 需要初始值,以后测量出来的
        /// </summary>
        public TimeSpan RenZiJiaPeriod { get; set; }

        /// <summary>
        /// 缓冲区拥有数据的时间长度,1s更新一次
        /// </summary>
        public TimeSpan BufTotalTime { get; set; }
        /// <summary>
        /// 缓冲区最新数据时间
        /// </summary>
        public DateTime BufLastTime { get; set; }
        /// <summary>
        /// 复位信号列表更新时间
        /// </summary>
        public DateTime OrgSignListUpdateTime { get; set; }


        /// <summary>
        ///旋转架脉冲
        /// </summary>
        public int GlobalPos { get; set; }
        /// <summary>
        /// 旋转架脉冲速度
        /// </summary>
        public int Speed { get; set; }
        #endregion

        #endregion

        /// <summary>
        /// 
        /// </summary>
        public BlowingDetect360EncoderServiceClient(UInt32 serviceId) : base(serviceId) { }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceId"></param>
        /// <param name="connName"></param>
        public BlowingDetect360EncoderServiceClient(UInt32 serviceId, string connName) : base(serviceId, connName) { }

        
        #region 功能

        /// <summary>
        /// 应用
        /// </summary>
        
        public void Apply()
        {
            Call(nameof(Apply));
        }
        /// <summary>
        /// 获取 旋转位置列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        public void GetRPosList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) 
        {
            Call(nameof(GetRPosList), new { begin }, asyncDelegate, asyncContext);
        }

        /// <summary>
        /// 获取 旋转信号列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        [Call(typeof(List<OrgSignData>))]
        public void GetOrgSignList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) {
            Call(nameof(GetOrgSignList), new { begin }, asyncDelegate, asyncContext);
        }


        /// <summary>
        /// 获取 线速度列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        [Call(typeof(List<FilmVelocityData>))]
        public void GetFilmVelocityList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) {
            Call(nameof(GetFilmVelocityList), new { begin }, asyncDelegate, asyncContext);
        }


        /// <summary>
        /// 获取 旋转信号列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        [Call(typeof(List<RotationData>))]
        public void GetRotationList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) {
            Call(nameof(GetRotationList), new { begin }, asyncDelegate, asyncContext);
        }

        #endregion

    }
}