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

using System.ComponentModel;
using FLY.Thick.BulkDataModule;

using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;


namespace FLY.Thick.Base.Server
{
    public class GM_Fix : IGageMode, IFixService
    {
        #region IGageMode
        public CTRL_STATE GMState
        {
            get { return CTRL_STATE.FIX; }
        }
        private bool isrunning = false;
        public bool IsRunning
        {
            get { return isrunning; }
            protected set {
                if (isrunning != value)
                {
                    isrunning = value;
                    NotifyPropertyChanged("IsRunning");
                }
            }
        }
        #endregion
        protected FlyADBase.FlyAD7 mFlyAD;
        protected DynArea mDynArea;
        protected AD2ThickHandler AD2Thick;

        public GM_Fix(FlyADBase.FlyAD7 flyad) 
        {
            mFlyAD = flyad;
            flyad.TimeGridEvent += new FlyADBase.TimeGridEventHandler(flyad_TimeGridEvent);
        }
        public void Init(DynArea dynarea, AD2ThickHandler func_ad2thick)
        {

            mDynArea = dynarea;

            AD2Thick = func_ad2thick;
        }
        /// <summary>
        /// 1s 的AD值
        /// </summary>
        List<int> Data1s = new List<int>();


        void flyad_TimeGridEvent(object sender, FlyADBase.TimeGridEventArgs e)
        {
            DateTime dt = e.Time;
            TimeSpan ts = e.Ts;
            int[] data2 = e.Data;

            int[] data = (int[])data2.Clone();

            Data1s.AddRange(data);
            if ((Data1s.Count * ts.Ticks) / TimeSpan.TicksPerSecond >= 1) 
            {
                int ad = Misc.MyMath.Avg(Data1s.ToArray());
                Data1s.Clear();

                mDynArea.AD = ad;

                mDynArea.Thick = AD2Thick(ad);
            }
            //转换为thick
            for (int i = 0; i < data.Length; i++)
                data[i] = AD2Thick(data[i]);
            
            if (TimeGridEvent != null)
                TimeGridEvent(this, new TimeGridEventArgs() { time = e.Time, ts = e.Ts, data = data });
        }

        #region IGageMode
        public bool Start()
        {
            IsRunning = true;
            return true;
        }

        public void Stop()
        {
            IsRunning = false;
        }

        #endregion


        protected void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;


        event TimeGridEventHandler TimeGridEvent;
        public void RegistTimeGridEvent(TimeGridEventHandler handler)
        {
            TimeGridEvent += handler;
        }


        public void UnRegistTimeGridEvent(TimeGridEventHandler handler)
        {
            TimeGridEvent -= handler;
        }
    }
}