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

using Misc;
using FlyADBase;
using FLY.Thick.BulkDataModule;
using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;
namespace FLY.Thick.Base.Server
{


    public class GM_Scan : GM_ScanMotion
    {
        protected IBoltMapBase mBoltmap;
        protected BorderSearch mBorderSearch;
        protected IBulkDataServiceAdd mBulkData;
        protected DynArea mDynArea;
        protected AD2ThickHandler AD2Thick;
        /// <summary>
        /// 剔除数据用
        /// </summary>
        protected Reject mReject;

        public int m_scanCnt;//扫描次数
        public DIRECTION m_scanDir;//扫描方向
        public int[] m_boltmap_thick;//分区后thick
        private bool bTemp = false;//bulkdata 最新的一幅数据是临时数据,需要清空
        public GM_Scan(FlyAD7 flyad, GSample gsample)
            : base(flyad, gsample)
        {
            ScanCnt = -1;
            //接收PollScan的推送
            DataPosEvent += new EndEventHandler(pollScan_DataPosEvent);
            EndEvent += new EndEventHandler(pollScan_EndEvent);
        }

        public void Init(
            Reject reject, 
            IBoltMapBase boltmap,BorderSearch bordersearch,
            IBulkDataServiceAdd bulkdata, DynArea dynarea, AD2ThickHandler func_ad2thick)
        {

            mReject = reject;
            mBoltmap = boltmap;
            mBorderSearch = bordersearch;

            mBulkData = bulkdata;
            mDynArea = dynarea;

            AD2Thick = func_ad2thick;

            Misc.BindingOperations.SetBinding(mFlyAD, "PosLen", mReject, "PosLen");
            Misc.BindingOperations.SetBinding(mFlyAD, "PosOfGrid", mReject, "PosOfGrid");
        }

        protected virtual void pollScan_EndEvent(object obj, FlyADBase.MiniGridEventArgs e)
        {
            DIRECTION direction = e.direction;

            int posOfGrid = e.posOfGrid;
            int start_grid = e.grid_start;
            int start_pos = e.grid_start * e.posOfGrid;

            int[] dat = e.buf;
            
            mBoltmap.InitBoltAD();

            if (gsample.Enable)
            {
                if(!gsample.OK())
                {
                    mBulkData.ChangeEmply();
                    return;//样品还没获取成功
                }
            }

            //找边界
            if (mBorderSearch.Enable)
            {
                bool ret = mBorderSearch.FindFilm(direction, posOfGrid, start_grid, dat);
                if (!ret)//不能找到边界!
                {
                    mBorderSearch.Init();
                    mBoltmap.InitExChange();
                }
                //设置扫描范围
                //POLLSCAN----------------------------------------	
                int beginPos;
                int endPos;
                mBorderSearch.GetScanRange(out beginPos, out endPos);

                ScanStart = beginPos;
                ScanEnd = endPos;

                //mBorderSearch.GetBoltRange(direction, out beginPos, out endPos);

                Range border = mBorderSearch.GetBorder(direction);
                //mBoltmap
                mBoltmap.CalExChange(direction, border);
            }




            //----------------------------------------------------
            //FRAME
            int len = dat.Length;
            int[] _temp_thicks = new int[len];//减少数据量, 降低噪声,避免剔除时,把噪声剔除。剔除的目前只是为了剔走基材,不是为了滤波


            //AD值转厚度值
            for (int i = 0; i < len; i++)
            {
                _temp_thicks[i] = AD2Thick(dat[i]);
            }

            //只有当数据有效时,也就是膜在跑时,才会剔除数据。 默认 pDyn->m_dataValid=TRUE; 
            //只有在接到推送时,才会有可能变为pDyn->m_dataValid=FALSE;
            //这样的目前是,方便设置平移补偿!!

            mReject.DoFrameFilter(mDynArea.Target, start_grid, _temp_thicks);


            m_boltmap_thick = mBoltmap.Map(direction, start_pos, posOfGrid, _temp_thicks);
            //把左右数据删除
            for (int i = 0; i < m_boltmap_thick.Count(); i++) 
            {
                if((i < (mDynArea.DataBoltNoBegin - mDynArea.FirstBoltNo))||(i > (mDynArea.DataBoltNoEnd - mDynArea.FirstBoltNo)))
                {
                    m_boltmap_thick[i] = Misc.MyBase.NULL_VALUE;
                }
            }

            m_scanCnt++;//扫描次数
            m_scanDir = direction;//扫描方向

            //----------------------------------------------------
            //数据库
            FR_DATA_TYPE t = FR_DATA_TYPE.INVALID;
            if (mDynArea.DataValid)
                t = FR_DATA_TYPE.VALID;
            mBulkData.Change(0, 0, m_boltmap_thick, t);

            mBulkData.Save();

            //添加一幅空数据

            mBulkData.AddEmply();
        }

        void pollScan_DataPosEvent(object obj, FlyADBase.MiniGridEventArgs e)
        {
            
            Misc.DIRECTION direction = e.direction;

            int posOfGrid = e.posOfGrid;
            int start_grid = e.grid_start;
            int start_pos = e.grid_start * e.posOfGrid;

            //TODO
            int[] data = e.buf.Clone() as int[];
            //-------------------------------------
            //DIR
            mDynArea.Direction = direction;
            mDynArea.AD = data[0];

            //2.转为thick
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = AD2Thick(data[i]);
            }


            //3.动态分区

            int start_boltIndex;
            int[] boltThick;

            if (mBoltmap.UpdateBoltAD(data, start_pos, posOfGrid, direction, out start_boltIndex, out boltThick))
            {
                mDynArea.Thick = boltThick[0];
                //----------------------------------------------------
                //数据库
                FR_DATA_TYPE t = FR_DATA_TYPE.INVALID;
                if (mDynArea.DataValid)
                    t = FR_DATA_TYPE.VALID;

                if (!mBulkData.Change(0, start_boltIndex, boltThick, t))
                {
                    mBulkData.AddEmply();
                    mBulkData.Change(0, start_boltIndex, boltThick, t);
                }
                bTemp = true;
            }
        }

        public override bool Start()
        {
            bool b = base.Start();
            if (!b)
                return false;

            //设置扫描范围
            int beginPos = 0, endPos = mFlyAD.PosLen - 1;
            if (mBorderSearch.Enable)
            {
                mBorderSearch.Init();
                mBorderSearch.GetScanRange(out beginPos, out endPos);
            }
            else
            {
                mBoltmap.GetScanRange(
                    new Range() { Begin = mDynArea.ScanBoltNoBegin, End = mDynArea.ScanBoltNoEnd },
                    out beginPos, out endPos);
            }
            if (beginPos < 0)
                beginPos = 0;

            if (endPos > mFlyAD.PosLen)
                endPos = mFlyAD.PosLen;

            mBoltmap.InitBoltAD();
            //初始化推送
            mBulkData.InitPush();

            if (bTemp)
            {
                //之前有一幅临时数据剩下来
                if (!mBulkData.ChangeEmply())
                    mBulkData.AddEmply();
            }
            else
            {
                //添加空的数据
                mBulkData.AddEmply();
            }
             bTemp = false;
            return base.Start2(beginPos, endPos);
        }
        public override void Stop()
        {
            base.Stop();
        }
    }
}