using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;
using FLY.Thick.Base.Server;
using FLY.Thick.Blowing.Server;
using FLY.Thick.Blowing.Server.Model;
using FlyADBase;
using FObjBase;
using Misc;
using NLog.Config;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Threading;
using HistoryDb = FLY.Thick.BlowingScan.Server.Model.HistoryDb;
using OrgDbModel = FLY.Thick.BlowingScan.Server.Model.OrgDbModel;
using ScanWarning = FLY.Thick.Blowing.Server.ScanWarning;

namespace FLY.Thick.BlowingScan.Server
{

    public class TDGage : ITDGageService
    {
        #region 延时推送 MARKNO
        const int MARKNO_UPDATEV = 1;
        #endregion
        const int AlarmLamp_bit = 4;

        #region 参数--------------------------------------------------------------------
        #region 初始化------------------------------------------------------------------
        /// <summary>
        /// 参数目录 m_path;数据文件的 根目录默认是 "Gage1", 不能有 @"\"
        /// 目前也是对外的服务器目录
        /// </summary>
        public string mParamDirectory;
        /// <summary>
        /// 名字 如:gage0
        /// </summary>
        public string mName;
        #endregion

        #region 数据--------------------------------------------------------------------

        /// <summary>
        /// 当前基本简单参数
        /// </summary>
        public DynArea dynArea;

        /// <summary>
        /// 设备参数
        /// </summary>
        public InitParam initParam;

        /// <summary>
        /// 运行参数
        /// </summary>
        public BlowingFixProfile profile;

        /// <summary>
        /// 边界查找,由 boltmap 独立出来的功能
        /// </summary>
        public BorderSearch borderSearch;

        /// <summary>
        /// AD曲线
        /// </summary>
        public CurveCollection curve;

        /// <summary>
        /// 报警系统
        /// </summary>
        public FLY.OBJComponents.Server.WarningSystem warning;

        #region 运行模式

        /// <summary>
        /// AD卡
        /// </summary>
        public FlyADBase.FlyAD7 flyAd;
        /// <summary>
        /// 样品修正
        /// </summary>
        public GSample getSample;
        /// <summary>
        /// GM管理器
        /// </summary>
        GageModeManager gmManager;
        /// <summary>
        /// 断开连接
        /// </summary>
        GM_Disconnected gmDisconnected;

        /// <summary>
        /// 暂停扫描
        /// </summary>
        GM_Pause gmPause;
        /// <summary>
        /// 自动启动扫描
        /// </summary>
        GM_AutoScan gmAutoScan;

        /// <summary>
        /// 前进
        /// </summary>
        GM_Forward gmForw;
        /// <summary>
        /// 后退
        /// </summary>
        GM_Backward gmBackw;
        /// <summary>
        /// 归零
        /// </summary>
        GM_Origin gmOrg;
        /// <summary>
        /// 停止
        /// </summary>
        GM_Stop gmStop;
        /// <summary>
        /// 运行到目标位置
        /// </summary>
        GM_Goto gmRunto;
        /// <summary>
        /// 机架校正模式,参数
        /// </summary>
        public GM_ScanCorr gmScanCorr;

        /// <summary>
        /// 定点模式
        /// </summary>
        public GM_Fix gmFix;

        /// <summary>
        /// 吹膜测厚模式.扫描
        /// </summary>
        public GM_BlowingScan gmRenZiJiaScan;

        /// <summary>
        /// 扫描报警系统
        /// </summary>
        public ScanWarning scanWarning;

        /// <summary>
        /// 机架信息,不同于机架校正
        /// </summary>
        public GM_GageInfo gmGageInfo;
        #endregion

        /// <summary>
        /// 系统参数
        /// </summary>
        public SysParam sysParam;


        #region BULKDATA

        /// <summary>
        /// 数据库对象
        /// </summary>
        DbModel dbModel;
        ///// <summary>
        ///// 原始数据 数据库对象
        ///// </summary>
        //OrgDbModel orgDbModel;
        /// <summary>
        /// 数据库写操作
        /// </summary>
        public HistoryDb historyDb;
        /// <summary>
        /// 本地数据库
        /// </summary>
        LocalDb localDb;
        /// <summary>
        /// 数据库读操作
        /// </summary>
        public BulkDb bulkDb;

        #endregion

        #endregion

        #endregion

        public TDGage(string nam)
        {
            mName = nam;
            mParamDirectory = mName;// @"D:\" + m_name;

            if (!System.IO.Directory.Exists(mParamDirectory))
            {
                System.IO.Directory.CreateDirectory(mParamDirectory);
            }
            System.Environment.CurrentDirectory = mParamDirectory;


            #region create
            sysParam = new SysParam(null);//系统参数

            initParam = new InitParam(null) { HasHold = false };

            profile = new BlowingFixProfile(null);//运行配置参数

            borderSearch = new BorderSearchPlastic(null);//边界查找

            curve = new CurveCollection(null);//AD转thick


            dbModel = new DbModel();
            //orgDbModel = new OrgDbModel();
            localDb = new LocalDb();
            historyDb = new HistoryDb();
            bulkDb = new BulkDb();

            dynArea = new DynArea();

            warning = new FLY.OBJComponents.Server.WarningSystem();
            scanWarning = new ScanWarning();


            flyAd = new FlyAD7();
            gmManager = new GageModeManager();
            gmFix = new GM_Fix(flyAd);
            gmAutoScan = new GM_AutoScan(flyAd);
            gmDisconnected = new GM_Disconnected(flyAd);
            gmPause = new GM_Pause(flyAd);
            gmForw = new GM_Forward(flyAd);
            gmBackw = new GM_Backward(flyAd);
            gmRunto = new GM_Goto(flyAd);
            gmOrg = new GM_Origin(flyAd);
            gmStop = new GM_Stop(flyAd);
            gmGageInfo = new GM_GageInfo(flyAd);
            gmScanCorr = new GM_ScanCorr(flyAd);
            getSample = new GSample(flyAd);
            gmRenZiJiaScan = new GM_BlowingScan(flyAd, getSample);


            #endregion

            #region 注入初始化

            //---------------------------------------------------------------------------------------------------------------
            //数据库
            dbModel.Init();
            //orgDbModel.Init();
            dbModel.KeepDBSize(initParam.DBKeepMonth);
            historyDb.Init(dbModel, localDb);
            //historyDb.KeepOrgDbSize(3);
            //PollModule.Current.Poll_Config(PollModule.POLL_CONFIG.ADD, () =>
            //{
            //    //避免1个月都不关程序,每天检查一次
            //    historyDb.KeepOrgDbSize(3);
            //}, TimeSpan.FromDays(1));

            bulkDb.Init(historyDb, localDb, dbModel);


            //---------------------------------------------------------------------------------------------------------------
            //有效范围
            Misc.BindingOperations.SetBinding(initParam, new string[] { nameof(initParam.PosLength) },
                () =>
                {
                    borderSearch.Valid.Begin = 0;
                    borderSearch.Valid.End = initParam.PosLength - 1;
                });


            //---------------------------------------------------------------------------------------------------------------
            //dynarea
            Misc.BindingOperations.SetBinding(profile.Param, nameof(profile.Param.PName), dynArea, nameof(dynArea.ProductName));
            Misc.BindingOperations.SetBinding(profile.Param, nameof(profile.Param.Target), () =>
            {
                dynArea.Target = (int)(profile.Param.Target * 100);
            });
            Misc.BindingOperations.SetBinding(profile.Param, 
                new string[] { 
                    nameof(profile.Param.Target),
                    nameof(profile.Param.TolerancePercent)
                }, () =>
            {
                dynArea.Alarm = (int)(profile.Param.Target * profile.Param.TolerancePercent * 100);
            });
            Misc.BindingOperations.SetBinding(profile.Param, nameof(profile.Param.K), dynArea, nameof(dynArea.Comp));

            Misc.BindingOperations.SetBinding(borderSearch, new string[] { nameof(borderSearch.Width) },
                delegate ()
                {
                    dynArea.Width = borderSearch.Width * initParam.Encoder1_mmpp;
                });

            initParam.PropertyChanged += (s, e) =>
            {
                if (e.PropertyName == nameof(initParam.Encoder1_mmpp))
                {
                    dynArea.Width = borderSearch.Width * initParam.Encoder1_mmpp;
                }
            };
            dynArea.PropertyChanged += new PropertyChangedEventHandler(mDynArea_PropertyChanged);




            //---------------------------------------------------------------------------------------------------------------
            //GageModeManager
            Misc.BindingOperations.SetBinding(gmManager, nameof(gmManager.State), dynArea, nameof(dynArea.ControllerState));


            //---------------------------------------------------------------------------------------------------------------
            //FlyAD7_Create

            flyAd.Load();
            flyAd.Connect();

            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.PosLength), flyAd, nameof(flyAd.PosLen));

            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.IStatus), dynArea, nameof(dynArea.IStatus));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.OStatus), dynArea, nameof(dynArea.OStatus));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.Position), dynArea, nameof(dynArea.Position));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.Position2), dynArea, nameof(dynArea.Position2));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.Surplus), dynArea, nameof(dynArea.Hrs));
            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.IsConnected), dynArea, nameof(dynArea.FLYADIsConnect));

            Misc.BindingOperations.SetBinding(flyAd, nameof(flyAd.PosOfGrid), initParam, nameof(initParam.PosOfGrid));

            //------------------------------------------------------------------------------------------------------------------------------------
            //速度------------------------------------------------------------------------------------------------------------------------------
            flyAd.PropertyChanged += (s, e) =>
            {
                if (e.PropertyName == nameof(flyAd.Speed))
                {
                    double speed = flyAd.Speed * initParam.Encoder1_mmpp;//mm/s
                    speed = speed * 60 / 1000;//m/min
                    dynArea.Velocity = speed;
                }
            };


            //------------------------------------------------------------------------------------------------------------------------------------
            //数据有效-----------------------------------------------------------------------------------------------------------------------------
            flyAd.IStatusChangedEvent += (s, e) =>
            {
                if (initParam.DataValidSrc != DATAVALIDSRC.BYINPUT)
                    return;

                if (Misc.MyBase.CHECKBIT(e.IChanged, 6 - 1))
                {
                    if (!Misc.MyBase.CHECKBIT(e.IStatus, 6 - 1))
                        dynArea.DataValid = false;
                    else
                        dynArea.DataValid = true;
                }
            };

            Misc.BindingOperations.SetBinding(initParam, new string[] { nameof(initParam.DataValidSrc) }, update_datavalid);


            Misc.BindingOperations.SetBinding(flyAd, new string[] { nameof(flyAd.Ratio02), nameof(flyAd.Ratio01) },
                delegate ()
                {
                    initParam.Speed1Scale = (double)flyAd.Ratio02 / flyAd.Ratio01;
                });

            Misc.BindingOperations.SetBinding(initParam, 
                new string[] { 
                    nameof(initParam.SVelocity),
                    nameof(initParam.ATime),
                    nameof(initParam.DTime),
                    nameof(initParam.HVelocity1),
                    nameof(initParam.HVelocity2)
                },
                delegate ()
                {
                    PollModule.Current.Poll_JustOnce(delegate ()
                    {
                        flyAd.SetPosParam(0xffffffff, initParam.SVelocity, initParam.ATime, initParam.DTime, initParam.HVelocity1, initParam.HVelocity2);

                    }, this, MARKNO_UPDATEV);
                });

            Misc.BindingOperations.SetBinding(flyAd, new string[] { nameof(flyAd.IsConnected) },
                delegate ()
                {
                    if (flyAd.IsConnected == true)
                    {
                        //还需要在flyad 重新连接上时,设置!!!!!
                        PollModule.Current.Poll_JustOnce(delegate ()
                        {
                            flyAd.SetPosParam(0xffffffff, initParam.SVelocity, initParam.ATime, initParam.DTime, initParam.HVelocity1, initParam.HVelocity2);

                        }, this, MARKNO_UPDATEV);
                    }
                });

            //---------------------------------------------------------------------------------------------------------------
            //Warning_Create

            warning.Init(historyDb.ErrorBuffer);

            Misc.BindingOperations.SetBinding(warning, nameof(warning.IsRinging), () =>
            {
                if (warning.IsRinging)
                {
                    flyAd.SetOutput(
                        (UInt16)Misc.MyBase.BIT(AlarmLamp_bit - 1),
                        (UInt16)~Misc.MyBase.BIT(AlarmLamp_bit - 1));
                }
                else
                {
                    flyAd.SetOutput(
                        (UInt16)Misc.MyBase.BIT(AlarmLamp_bit - 1),
                        (UInt16)Misc.MyBase.BIT(AlarmLamp_bit - 1));
                }
            });

            //---------------------------------------------------------------------------------------------------------------
            //ScanWarning_Create
            scanWarning.Init(warning, historyDb);


            //---------------------------------------------------------------------------------------------------------------
            //GM_Fix_Create
            gmFix.Init(dynArea, AD2Thick);
            gmFix.IsIgnoreDataWhenIdle = false;
            gmManager.AddGM(gmFix);


            //---------------------------------------------------------------------------------------------------------------
            //GM_AutoScan_Create
            gmAutoScan.Init(StartP1);
            Misc.BindingOperations.SetBinding(gmAutoScan, nameof(gmAutoScan.Counter), dynArea, nameof(dynArea.AutoScanCounter));
            gmManager.AddGM(gmAutoScan);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Disconnected_Create
            gmDisconnected.Init(dynArea, gmAutoScan);
            gmManager.AddGM(gmDisconnected);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Pause_Create
            gmPause.Init(dynArea, gmAutoScan);
            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.ReStartDelay), gmPause, nameof(gmPause.Delay));
            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.AutoF1F3), gmPause, nameof(gmPause.Enable));
            gmManager.AddGM(gmPause);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Forward_Create

            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VJOG), gmForw, nameof(gmForw.Velocity));
            gmManager.AddGM(gmForw);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Backward_Create

            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VJOG), gmBackw, nameof(gmForw.Velocity));
            gmManager.AddGM(gmBackw);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Goto_Create

            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VJOG), gmRunto, nameof(gmForw.Velocity));
            gmManager.AddGM(gmRunto);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Origin_Create
            gmManager.AddGM(gmOrg);

            //---------------------------------------------------------------------------------------------------------------
            //GM_Stop_Create

            gmManager.AddGM(gmStop);

            //---------------------------------------------------------------------------------------------------------------
            //GM_GageInfo_Create


            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VAccuracy), gmGageInfo, nameof(gmGageInfo.Velocity));
            gmManager.AddGM(gmGageInfo);

            //---------------------------------------------------------------------------------------------------------------
            //GM_ScanCorr_Create

            gmManager.AddGM(gmScanCorr);
            flyAd.CorrectADs = new FlyADBase.CorrectADsHandler(gmScanCorr.CorrectADs);
            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VAccuracy), gmScanCorr, nameof(gmScanCorr.Velocity));

            Misc.BindingOperations.SetBinding(borderSearch.Valid, nameof(Range.Begin), gmScanCorr, nameof(gmScanCorr.ValidBegin), BindingOperations.BindingMode.TwoWay);
            Misc.BindingOperations.SetBinding(borderSearch.Valid, nameof(Range.End), gmScanCorr, nameof(gmScanCorr.ValidEnd), BindingOperations.BindingMode.TwoWay);



            //---------------------------------------------------------------------------------------------------------------
            //GSample_Create

            getSample.Init(gmGageInfo, warning);
            Misc.BindingOperations.SetBinding(getSample.Samples[0], nameof(SampleCell.AD), borderSearch, nameof(borderSearch.CurrTempAD));
            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VAccuracy), getSample, nameof(getSample.Velocity));
            getSample.SampleChangedEvent += new SampleChangedEventHandler(getSample_SampleChangedEvent);

            //---------------------------------------------------------------------------------------------------------------
            //GM_RenZiJiaScan_Create

            gmManager.AddGM(gmRenZiJiaScan);
            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.AutoOrgInterval), gmRenZiJiaScan, nameof(gmRenZiJiaScan.OrgInterval));
            Misc.BindingOperations.SetBinding(initParam, nameof(initParam.VScan), gmRenZiJiaScan, nameof(gmRenZiJiaScan.Velocity));
            Misc.BindingOperations.SetBinding(gmRenZiJiaScan.mPDetect, nameof(gmRenZiJiaScan.mPDetect.RollPerimeter), initParam, nameof(initParam.MmOfR), BindingOperations.BindingMode.TwoWay);
            
            Misc.BindingOperations.SetBinding(gmRenZiJiaScan.mPDetect, nameof(gmRenZiJiaScan.mPDetect.FilmVelocity), dynArea, nameof(dynArea.FilmVelocity));

            dynArea.NBolts = gmRenZiJiaScan.NBolts;
            dynArea.FirstBoltNo = 1;
            dynArea.DataBoltNoBegin = 1;
            dynArea.DataBoltNoEnd = gmRenZiJiaScan.NBolts;
            dynArea.ScanBoltNoBegin = 1;
            dynArea.ScanBoltNoEnd = gmRenZiJiaScan.NBolts;

            gmRenZiJiaScan.Init(
                borderSearch,
                dynArea, AD2Thick,
                profile.Param, historyDb, bulkDb);

            gmRenZiJiaScan.PropertyChanged += (s, e) =>
            {
                if (e.PropertyName == nameof(gmRenZiJiaScan.NBolts))
                {
                    dynArea.NBolts = gmRenZiJiaScan.NBolts;
                    dynArea.FirstBoltNo = 1;

                    dynArea.DataBoltNoBegin = 1;
                    dynArea.DataBoltNoEnd = gmRenZiJiaScan.NBolts;
                    dynArea.ScanBoltNoBegin = 1;
                    dynArea.ScanBoltNoEnd = gmRenZiJiaScan.NBolts;
                }
            };

            



            ErrNoForCheckInit();


            #endregion
            gmFix.Start();
        }


        class ErrNoForCheckItem
        {
            public FLY.OBJComponents.Common.ERRNO errno;
            public Func<bool> conditional;
            /// <summary>
            /// 持续时间,单位s
            /// </summary>
            public int cnt;

            int timer = -1;
            public FLY.OBJComponents.Server.WarningSystem mWarning;
            public void Clear()
            {
                if (timer == 0)
                {
                    mWarning.Add(
                        errno.Code,
                        errno.Descrption,
                        FLY.OBJComponents.Common.ERR_STATE.OFF);
                }
                timer = -1;
            }
            public void OnPoll()
            {
                if (conditional())
                {
                    if (timer < 0)
                        timer = cnt;
                    else
                    {
                        if (timer > 0)
                            timer--;

                        if (timer == 0)
                        {
                            mWarning.Add(
                                errno.Code,
                                errno.Descrption,
                                FLY.OBJComponents.Common.ERR_STATE.ON);
                        }
                    }
                }
                else
                {
                    Clear();
                }
            }
        }

        List<ErrNoForCheckItem> ErrNoForCheckItems = new List<ErrNoForCheckItem>();
        void ErrNoForCheckInit()
        {

            ErrNoForCheckItems.Add(//AD值太小
                new ErrNoForCheckItem()
                {
                    errno = FLY.Thick.BlowingScan.Common.ERRNOs.BASE_ERRNO_AD_MIN,
                    cnt = 20,
                    conditional = delegate ()
                    {
                        return dynArea.AD < (dynArea.ADMax * 0.01);
                    }
                });

            ErrNoForCheckItems.Add(//AD值太大
                new ErrNoForCheckItem()
                {
                    errno = FLY.Thick.BlowingScan.Common.ERRNOs.BASE_ERRNO_AD_MAX,
                    cnt = 20,
                    conditional = delegate ()
                    {
                        return (dynArea.AD > (dynArea.ADMax * 0.98));
                    }
                });

            //ErrNoForCheckItems.Add(//限位
            //    new ErrNoForCheckItem()
            //    {
            //        errno = FLY.Thick.Base.Common.ERRNOs.BASE_ERRNO_LIMIT,
            //        cnt = 2,
            //        conditional = delegate ()
            //        {
            //            return ((Misc.MyBase.CHECKBIT(dynArea.IStatus, 3 - 1) == true) || (Misc.MyBase.CHECKBIT(dynArea.IStatus, 4 - 1) == true));
            //        }
            //    });

            //ErrNoForCheckItems.Add(//急停
            //    new ErrNoForCheckItem()
            //    {
            //        errno = FLY.Thick.Base.Common.ERRNOs.BASE_ERRNO_EMERGENCY,
            //        cnt = 2,
            //        conditional = delegate ()
            //        {
            //            return ((Misc.MyBase.CHECKBIT(dynArea.IStatus, 7 - 1) == false) || (Misc.MyBase.CHECKBIT(dynArea.IStatus, 8 - 1) == false));
            //        }
            //    });

            foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
            {
                item.mWarning = warning;
            }

            FObjBase.PollModule.Current.Poll_Config(
                FObjBase.PollModule.POLL_CONFIG.ADD,
                onpoll_checkErrNo, TimeSpan.FromSeconds(1));
        }

        bool isInit_onpoll_checkErrNo;
        void onpoll_checkErrNo() //1秒执行一次
        {
            if (!isInit_onpoll_checkErrNo)
            {
                isInit_onpoll_checkErrNo = true;
                checkDynAreaError();
            }

            if (!dynArea.FLYADIsConnect)
            {
                foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
                    item.Clear();
            }
            else
            {
                foreach (ErrNoForCheckItem item in ErrNoForCheckItems)
                    item.OnPoll();
            }
        }

        void mDynArea_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == nameof(dynArea.FilmVelocity))
            {
                update_datavalid();
            }
            else if (e.PropertyName == nameof(dynArea.Hrs))
            {
                if (dynArea.Hrs < 48 && dynArea.Hrs > 0)//授权限制提醒
                {

                    warning.Add(
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_LICENSE_TIP.Code,
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_LICENSE_TIP.Descrption,
                        OBJComponents.Common.ERR_STATE.ON);
                }
            }
            else if (e.PropertyName == nameof(dynArea.SecuteLock)) //授权限制
            {
                if (dynArea.SecuteLock)
                {
                    warning.Add(
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_LICENSE.Code,
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_LICENSE.Descrption,
                        OBJComponents.Common.ERR_STATE.ON);
                }
                else
                {
                    warning.Add(
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_LICENSE.Code,
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_LICENSE.Descrption,
                        OBJComponents.Common.ERR_STATE.OFF);
                }
            }
            else if (e.PropertyName == nameof(dynArea.FLYADIsConnect))//连接断开
            {
                if (!dynArea.FLYADIsConnect)
                {
                    warning.Add(
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_FLYAD7DISCONNECTED.Code,
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_FLYAD7DISCONNECTED.Descrption,
                        OBJComponents.Common.ERR_STATE.ON);

                }
                else
                {
                    warning.Add(
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_FLYAD7DISCONNECTED.Code,
                        FLY.Thick.Blowing.Common.ERRNOs.BASE_ERRNO_FLYAD7DISCONNECTED.Descrption,
                        OBJComponents.Common.ERR_STATE.OFF);
                }
            }

        }

        void checkDynAreaError()
        {
            if (dynArea.Hrs < 48 && dynArea.Hrs > 0)//授权限制提醒
            {
                warning.Add(
                    Common.ERRNOs.BASE_ERRNO_LICENSE_TIP.Code,
                    Common.ERRNOs.BASE_ERRNO_LICENSE_TIP.Descrption,
                    OBJComponents.Common.ERR_STATE.ON);
            }
            if (dynArea.SecuteLock)
            {
                warning.Add(
                    Common.ERRNOs.BASE_ERRNO_LICENSE.Code,
                    Common.ERRNOs.BASE_ERRNO_LICENSE.Descrption,
                    OBJComponents.Common.ERR_STATE.ON);
            }
            if (!dynArea.FLYADIsConnect)
            {
                warning.Add(
                    Common.ERRNOs.BASE_ERRNO_FLYAD7DISCONNECTED.Code,
                    Common.ERRNOs.BASE_ERRNO_FLYAD7DISCONNECTED.Descrption,
                    OBJComponents.Common.ERR_STATE.ON);
            }

        }

        void update_datavalid()
        {
            switch (initParam.DataValidSrc)
            {
                case DATAVALIDSRC.VALID:
                    dynArea.DataValid = true;
                    break;
                case DATAVALIDSRC.INVALID:
                    dynArea.DataValid = false;
                    break;
                case DATAVALIDSRC.BYEN2:
                    {
                        if (dynArea.FilmVelocity < 2)
                            dynArea.DataValid = false;
                        else
                            dynArea.DataValid = true;
                    }
                    break;
                case DATAVALIDSRC.BYINPUT:
                    {
                        if (!Misc.MyBase.CHECKBIT(flyAd.IStatus, 6 - 1))
                            dynArea.DataValid = false;
                        else
                            dynArea.DataValid = true;
                    }
                    break;
            }
        }



        public int AD2Thick(int ad)
        {
            int thick = Misc.MyBase.NULL_VALUE;

            if (Misc.MyBase.ISVALIDATA(ad))
            {

                if (getSample.Enable)//动态温修
                    thick = curve.AD2Value(ad, AD2ValueFlag.Revised);
                else
                    thick = curve.AD2Value(ad, AD2ValueFlag.NoRevised);

                thick = (int)(thick * profile.Param.K);
            }
            return thick;
        }




        void getSample_SampleChangedEvent(object sender)
        {

            CurveCollection pCurve = curve;
            GSample gsample = getSample;

            dynArea.SampleAD = gsample.Samples.Select(s => s.AD).ToArray();

            if (gsample.OK())
            {
                List<CurveCollection.ExChange> list = new List<CurveCollection.ExChange>();
                for (int i = 0; i < gsample.Samples.Count(); i++)
                {
                    var sample = gsample.Samples[i];
                    if ((sample.Enable) && (!sample.JustForCheck) && (sample.AD > 0))
                    {
                        list.Add(new CurveCollection.ExChange() { OrgAD = sample.OrgAD, CurrAD = sample.AD });
                    }
                }
                pCurve.ModifyExChange(list);
                pCurve.ReviseCurve();

                for (int i = 0; i < gsample.Samples.Count(); i++)
                {
                    var sample = gsample.Samples[i];
                    if ((sample.Enable) && (sample.AD > 0))
                    {
                        sample.SampleValue = curve.AD2Value(sample.AD, AD2ValueFlag.Revised);
                    }
                }

                //历史数据保存
                var sampleads = from sample in gsample.Samples where sample.Enable select sample.AD;
                if (sampleads.Count() > 0)
                {
                    historyDb.AddSampleData(
                        new Lc_Sample()
                        {
                            Time = DateTime.Now,
                            SampleADs = sampleads.ToArray()
                        });
                }

            }
        }


        #region ITDGageService

        /// <summary>
        /// 
        /// </summary>
        public void StartP1()
        {
            gmRenZiJiaScan.Start();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="mode"></param>
        public void StartP2(STARTP2_MODE mode)
        {
            StartP2(mode, 0);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="mode"></param>
        /// <param name="targetpos"></param>
        public void StartP2(STARTP2_MODE mode, int targetpos)
        {
            switch (mode)
            {
                case STARTP2_MODE.ORG:
                    gmOrg.Start();
                    break;
                case STARTP2_MODE.STOP:
                    gmStop.Start();
                    break;
                case STARTP2_MODE.FORW:
                case STARTP2_MODE.FORW_UNTIL_STOP:
                    gmForw.Start();
                    break;
                case STARTP2_MODE.BACKW:
                case STARTP2_MODE.BACKW_UNTIL_STOP:
                    gmBackw.Start();
                    break;
                case STARTP2_MODE.RUNTO:
                    gmRunto.Start(targetpos);
                    break;
            }
        }

        #endregion
    }
}