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>
        /// 拉伸前 大辊直径
        /// </summary>
        const double RLenBeforeStretching = 800 * 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/min
        /// </summary>
        public double FilmVelocityBeforeStretching { get; set; } = 10;

        /// <summary>
        /// 拉伸前膜长 m
        /// </summary>
        public double FilmLengthBeforeStretching { get; set; }

        /// <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;
        PlcLink plcLink;
        Random random;
        public GageAD()
        {
            curve = new CurveCollection();

            plcLink = new PlcLink();
            plcLink.Init();
            Load();

            random = new Random();
        }

        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];
            ad += (int)(ad * (random.NextDouble() * 0.01 - 0.005));

            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;

                FilmLengthBeforeStretching += min * FilmLengthBeforeStretching;
            }

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

            p = FilmLengthBeforeStretching * 1000 % RLenBeforeStretching;
            if (p < RLen / 10)
                Misc.MyBase.CLEARBIT(ref istatus, IODefinition.IN_RSENSOR2);

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