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.Casting
{
    /// <summary>
    /// 流延
    /// </summary>
    public class GageAD : ISimulationGageAD, INotifyPropertyChanged
    {
        CurveCollection curve;
        //这是整个机架的数据
        List<int> datas_horizontal = new List<int>();//横向AD数据, 1mm 一个AD值

        /// <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.0943;

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

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

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

        /// <summary>
        /// 机架总长 mm
        /// </summary>
        public int TotalLength { get; set; } = 3000;

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

        public int GetAD(int mm)
        {
            if (mm < 0)
                mm = 0;
            else if (mm >= datas_horizontal.Count())
                mm = datas_horizontal.Count() - 1;
            int ad = datas_horizontal[mm];
            
            return ad;
        }


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


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

            
            dtlast = now;
        }

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

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

            return istatus;
        }

        void LoadHorizontal()
        {
            datas_horizontal.Clear();
            using (StreamReader sr = new StreamReader(@"casting\datas_horizontal.csv"))
            {
                string header = sr.ReadLine();//位置(mm),数据

                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_horizontal.Add(ad);
                }
                sr.Close();
            }
        }

        void Load()
        {

            LoadHorizontal();
        }


        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;
    }
}
