using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ComponentModel;
using FLY.Thick.Base.Server;

namespace FLY.Simulation.HeaderAndTailer
{
    public class GageAD : ISimulationGageAD, INotifyPropertyChanged
    {
        CurveCollection curve;
        List<int> datas_vertical = new List<int>();//纵向AD数据,1.28ms 一个数据

        /// <summary>
        /// 编码器2 1脉冲 = ? mm    辊直径120mm，编码器 转1圈800脉冲
        /// </summary>
        const double Mmpp2 = 0.25;
        const double RLen = 120 * 3.14;

        /// <summary>
        /// 1脉冲 = ? mm
        /// </summary>
        public double Mmpp { get; set; } = 0.2;


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


        /// <summary>
        /// 膜长 m
        /// </summary>
        public double FilmLength { get; set; }


        /// <summary>
        /// 运转中
        /// </summary>
        public bool IsRunning { get; set; } = true;


        public int TotalLength { get; set; } = 940;

        public GageAD()
        {
            curve = new CurveCollection();
            Load();
        }

        public int GetAD(int position)
        {
            int idx = (int)datas_vertical_index;
            if (idx < 0)
                idx = 0;
            else if (idx >= datas_vertical.Count())
                idx = datas_vertical.Count() - 1;
            int ad = datas_vertical[idx];


            //Random r = new Random();
            //int data = r.Next(50) - 25;

            //thick += data;

            return ad;// curve.Value2AD(thick, CurveCollection.AD2ValueFlag.NoRevised);
        }


        DateTime dtlast = DateTime.MinValue;
        double datas_vertical_index = 0;
        public void OnPoll(DateTime now)
        {
            if (dtlast == DateTime.MinValue) 
            {
                dtlast = now;
                return;
            }


            if (IsRunning) 
            {
                double min = (now - dtlast).TotalMinutes;
                FilmLength += min * FilmVelocity;

                double ms = (double)((now - dtlast).Ticks) / TimeSpan.TicksPerMillisecond;
                datas_vertical_index += ms/1.28;

                if (datas_vertical_index >= datas_vertical.Count()) 
                {
                    datas_vertical_index -= datas_vertical.Count();
                }
            }

            
            dtlast = now;
        }

        public UInt16 GetInput()
        {
            UInt16 istatus = 0x0fff;

            double p = FilmLength * 1000 % RLen;
            if(p<RLen/10)
                Misc.MyBase.CLEARBIT(ref istatus, 10);

            return istatus;
        }

        void LoadVertical()
        {
            datas_vertical.Clear();
            using (StreamReader sr = new StreamReader(@"headerAndTailer\datas_fix_1.28.csv"))
            {
                string header = sr.ReadLine();//时间(ms),数据

                while (!sr.EndOfStream)
                {
                    string s = sr.ReadLine();
                    string[] ss = s.Split(',');

                    double thick = double.Parse(ss[1]);
                    int ad = curve.Value2Ad(thick, Thick.Base.Common.AD2ValueFlag.NoRevised);
                    datas_vertical.Add(ad);
                }
                sr.Close();
            }
        }

        void Load()
        {

            LoadVertical();
        }


        public int GetPosition2()
        {
            return (int)(FilmLength * 1000 / Mmpp2);

        }
        public int GetSpeed2()
        {
            if (IsRunning)
                return (int)(FilmVelocity * 1000 / 60 / Mmpp2);
            else
                return 0;
        }

        public void SetOutput(ushort output)
        {
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
