using Misc;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace FlyADBase
{


    /// <summary>
    /// 客户端AD盒附加的功能
    /// </summary>
    public interface IFlyADClientAdv : IFlyADClient
    {
        /// <summary>
        /// 机架修正
        /// </summary>
        CorrectADsHandler CorrectADs { get; set; }

        /// <summary>
        /// grid 滤波
        /// </summary>
        int GridSmooth { get; set; }

        /// <summary>
        /// PosLen / PosOfGrid;
        /// </summary>
        int GridLen { get; }

        /// <summary>
        /// 脉冲比例 Ratio02(编码器脉冲) / Ratio01(电机脉冲)
        /// </summary>
        double Speed1Scale { get; }

        /// <summary>
        /// 机架总长
        /// </summary>
        int PosLen { get; set; }

        /// <summary>
        /// 使用独立的脉冲最大最小值
        /// </summary>
        bool HasPosMaxMin { get; set; }
        /// <summary>
        /// 最小脉冲,默认是0
        /// </summary>
        int PosMin { get; set; }

        /// <summary>
        /// 最大脉冲,默认于PosLen 一样
        /// </summary>
        int PosMax { get; set; }
        /// <summary>
        /// Runto(0), 不同于 Backward
        /// </summary>
        void RuntoMin();
        /// <summary>
        /// Runto(PosLen), 不同于 Forward
        /// </summary>
        void RuntoMax();



        /// <summary>
        /// 设置输出
        /// </summary>
        /// <param name="index"></param>
        /// <param name="is1"></param>
        void SetOutputBit(int index, bool is1);

        /// <summary>
        /// 从正反缓存区, 获取grid数据
        /// </summary>
        /// <param name="direction">方向, 只有 正,反</param>
        /// <param name="grid_start">grid 开始位置</param>
        /// <param name="grid_len">grid 长度</param>
        /// <param name="dat">grid 数据</param>
        void GetGrid(DIRECTION direction, int grid_start, int grid_len, out int[] dat);

        /// <summary>
        /// 从正反缓存区, 获取全部grid数据
        /// </summary>
        /// <param name="direction">方向, 只有 正,反</param>
        /// <param name="dat">grid 数据</param>
        void GetGrid(DIRECTION direction, out int[] dat);


        /// <summary>
        /// 动作完成
        /// </summary>
        bool IsFinish { get; }


        /// <summary>
        /// ad滞后修正  单位ms
        /// </summary>
        int ADLag { get; set; }


        //一共有1.AD数据池(由timegrid提供) 1min
        //2.pos数据池(pos推送提供) 1min
        //4.当接收的grid事件数据。它有 (direction, grid_start,grid_len, systick )
        //systick 就是结束的时间点。 当AD数据池出现了这个时间点

        //pos数据池向前找。 pos 在 grid_start*posOfGrid 范围的数据。 
        //找到开始的systick 后,整合3个数据池的数据。
        //5.最后代替 grid 推送出去。
        TimeGridAdvHelper mTimeGridAdvHelper { get; }

        /// <summary>
        /// 动作指令完成,准备推送 timegridadv 事件
        /// </summary>
        bool IsTimeToPushTimeGridAdv { get; }

        /// <summary>
        /// 以timegrid 为单位,推送数据
        /// </summary>
        event TimeGridAdv2EventHandler TimeGridAdv2Event;

        TimeGridAdv2EventArgs GetTimeGridAdv2Event(DateTime beginTime);

        void Save();
        bool Load();
    }

    /// <summary>
    /// 机架修正
    /// </summary>
    /// <param name="direction"></param>
    /// <param name="start_grid"></param>
    /// <param name="dat"></param>
    public delegate void CorrectADsHandler(Misc.DIRECTION direction, int start_grid, int[] dat);
}