using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FLY.Simulation.Coating
{
    public class GageAD : ISimulationGageAD
    {
        public Coating mCoating;
        CurveCollection curve;
        List<int> Datas_GageInfo = new List<int>();//机架信息

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

        /// <summary>
        /// 膜开始位置 mm
        /// </summary>
        const int FilmBegin=200;

        /// <summary>
        /// 1脉冲 = ? mm
        /// </summary>
        /// <summary>
        /// 1脉冲 = ? mm
        /// </summary>
        double mmpp = 0.1133;
        public double Mmpp
        {
            get { return mmpp; }
            set
            {
                mmpp = value;
            }
        }

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

        public int GetAD(int position)
        {
            
            int mm = (int)(position* Mmpp);
            if (mm >= Datas_GageInfo.Count())
            {
                mm = Datas_GageInfo.Count() - 1;
            }
            else if (mm < 0)
            {
                mm = 0;
            }

            int filmthick = 0;
            if (mm >= FilmBegin && mm < (FilmBegin + mCoating.FilmWidth))
            {
                filmthick = mCoating.GetData30m(mm - FilmBegin);
                if (filmthick < 0)
                    filmthick = 0;

                if ((mCoating.Datas_Horizontal[mm - FilmBegin].IsLight) || mCoating.VSignal)
                    mCoating.HSignal = true;
                else 
                    mCoating.HSignal = false;

                if ((mCoating.Datas_Horizontal[mm - FilmBegin].IsLight2) || mCoating.VSignal2)
                    mCoating.HSignal2 = true;
                else
                    mCoating.HSignal2 = false;
            }
            else 
            {
                mCoating.HSignal = false;
                mCoating.HSignal2 = false;
            }

            


            int thick = Datas_GageInfo[mm] + filmthick;


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

            thick += data;

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

        public void OnPoll(DateTime now)
        {
            mCoating.OnPoll(now);
        }


        /// <summary>
        /// 横向边界信号 i5
        /// </summary>
        public const int HSIGN_NO = 5;
        /// <summary>
        /// 辊信号 i11
        /// </summary>
        public const int RSIGN_NO = 11;
        /// <summary>
        /// 纵向边界信号 i12
        /// </summary>
        public const int VSIGN_NO = 12;

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

            if (mCoating.HSignal)
                Misc.MyBase.CLEARBIT(ref istatus, 5 - 1 );

            if (mCoating.HSignal2)
                Misc.MyBase.CLEARBIT(ref istatus, 9 - 1);

            if (mCoating.RSignal)
                Misc.MyBase.CLEARBIT(ref istatus, 11 - 1 );

            if (mCoating.VSignal)
                Misc.MyBase.CLEARBIT(ref istatus, 12 - 1 );

            if (mCoating.VSignal2)
                Misc.MyBase.CLEARBIT(ref istatus, 10 - 1);


            return istatus;
        }

        void Load_GageInfo()
        {
            Datas_GageInfo.Clear();
            using (StreamReader sr = new StreamReader("datas_gageinfo.csv"))
            {
                string header = sr.ReadLine();//标题 , 位置(mm), AD

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

                    int pos_mm = int.Parse(ss[0]);
                    int ad = int.Parse(ss[1]);
                    //转为 thick

                    int thick = curve.AD2Value(ad, CurveCollection.AD2ValueFlag.NoRevised);

                    Datas_GageInfo.Add(thick);
                }
                sr.Close();
            }
        }

        void Load()
        {

            Load_GageInfo();
        }


        public int GetPosition2()
        {
            return (int)(mCoating.FilmLength*1000 / Mmpp2);
            
        }
        public int GetSpeed2() 
        {
            if (mCoating.DeviceState)
                return (int)(mCoating.FilmVelocity * 1000 / 60 / Mmpp2);
            else
                return 0;
        }
    }
}