using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using FLY.Thick.Blowing.OBJ_INTERFACE;
using FLY.Thick.Blowing.Server;
using FLY.Thick.Blowing.IService;

namespace FLY.Thick.Blowing.Server.OBJProxy
{
    public class BlowingFix_OBJProxy : Blowing_OBJProxy
    {
        #region 延时推送 MARKNO
        const int MARKNO_PUSH_PARAMSEXT = 2;
        const int MARKNO_PUSH_STATUS = 2;
        const int MARKNO_PUSH_R = 3;
        const int MARKNO_PUSH_EPC = 4;
        const int MARKNO_PUSH_EPCSTATE = 5;
        const int MARKNO_PUSH_SIGNBM = 9;
        #endregion

        IBlowingFixService mRenZiJia;

        public BlowingFix_OBJProxy(int objsys_idx, IBlowingFixService renzijia) :base(objsys_idx, renzijia)
        {
            mRenZiJia = renzijia;
            mRenZiJia.PropertyChanged += mRenZiJiaFix_PropertyChanged;
        }

        void mRenZiJiaFix_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (
                (e.PropertyName == "FLRange")
                )
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate()
                    {
                        byte[] buf;
                        GetValue(null, 0, BLOWINGFIX_OBJ_INTERFACE.GET_PARAMSEXT, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, BLOWINGFIX_OBJ_INTERFACE.PUSH_PARAMSEXT,
                            buf);
                    }), this, MARKNO_PUSH_PARAMSEXT);
            }
            else if (
                (e.PropertyName == "MaxR") ||
                (e.PropertyName == "MaxRFilmLength")||
                (e.PropertyName == "CalState"))
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate()
                    {
                        byte[] buf;
                        GetValue(null, 0, BLOWINGFIX_OBJ_INTERFACE.GET_R, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, BLOWINGFIX_OBJ_INTERFACE.PUSH_R,
                            buf);
                    }), this, MARKNO_PUSH_R);
            }
            else if (
                 (e.PropertyName == "EPCType") ||
                (e.PropertyName == "SampleConsume") ||
                (e.PropertyName == "SampleInterval") ||
                (e.PropertyName == "BackEdgeWait") ||
                (e.PropertyName == "IsBtnSelfHold")
                ) 
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate()
                    {
                        byte[] buf;
                        GetValue(null, 0, BLOWINGFIX_OBJ_INTERFACE.GET_EPC, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, BLOWINGFIX_OBJ_INTERFACE.PUSH_EPC,
                            buf);
                    }), this, MARKNO_PUSH_EPC);
            }
            else if (
                (e.PropertyName == "SampleTimer") ||
                (e.PropertyName == "EPCIsRunning") ||
                (e.PropertyName == "SampleAD")
                )
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate()
                    {
                        byte[] buf;
                        GetValue(null, 0, BLOWINGFIX_OBJ_INTERFACE.GET_EPCSTATE, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, BLOWINGFIX_OBJ_INTERFACE.PUSH_EPCSTATE,
                            buf);
                    }), this, MARKNO_PUSH_EPCSTATE);
            }
        }
        
        public override void CallFunction(IFConn from, uint srcid,UInt32 magic, ushort funcid, byte[] infodata)
        {
            switch (funcid) 
            {
                case BLOWINGFIX_OBJ_INTERFACE.CALL_CALR:
                    {
                        BLOWINGFIX_OBJ_INTERFACE.Pack_CalR p = new BLOWINGFIX_OBJ_INTERFACE.Pack_CalR();
                        if (p.TryParse(infodata))
                        {
                            mRenZiJia.FLRange = p.filmLenRange;
                            mRenZiJia.CalFilmLength();
                        }
                    } break;
                case BLOWINGFIX_OBJ_INTERFACE.CALL_EPCSTART:
                    {
                        mRenZiJia.EPCStart();
                        
                    }break;
                case BLOWINGFIX_OBJ_INTERFACE.CALL_EPCSTOP:
                    {
                        mRenZiJia.EPCStop();
                    } break;
            }
        }
        public override void GetValue(IFConn from, uint srcid, ushort memid, out byte[] infodata)
        {
            base.GetValue(from, srcid, memid,out infodata);
            if (infodata != null)
                return;

            switch (memid) 
            {
                case BLOWINGFIX_OBJ_INTERFACE.GET_PARAMSEXT:
                    {
                        BLOWINGFIX_OBJ_INTERFACE.Pack_ParamsExt p = new BLOWINGFIX_OBJ_INTERFACE.Pack_ParamsExt(){
                            filmLenRange = mRenZiJia.FLRange
                        };
                        infodata = p.ToBytes();
                    }break;
                case BLOWINGFIX_OBJ_INTERFACE.GET_R:
                    {
                        BLOWINGFIX_OBJ_INTERFACE.Pack_Relevency p = new BLOWINGFIX_OBJ_INTERFACE.Pack_Relevency()
                        {
                            max_relevency = mRenZiJia.MaxR,
                            max_filmLength = mRenZiJia.MaxRFilmLength,
                            calstate = mRenZiJia.CalState
                        };
                        infodata = p.ToBytes();
                    }break;

                case BLOWINGFIX_OBJ_INTERFACE.GET_EPC:
                    {

                        IBlowingFixService renzijiafix = mRenZiJia;
                        
                        BLOWINGFIX_OBJ_INTERFACE.Pack_EPC p = new BLOWINGFIX_OBJ_INTERFACE.Pack_EPC()
                        {
                            epctype = renzijiafix.EPCType,
                            sampleconsume = renzijiafix.SampleConsume,
                            sampleinterval = renzijiafix.SampleInterval,
                            backedgewait = renzijiafix.BackEdgeWait,
                            isBtnSelfHold = renzijiafix.IsBtnSelfHold
                        };
                        infodata = p.ToBytes();
                    }break;
                case BLOWINGFIX_OBJ_INTERFACE.GET_EPCSTATE:
                    {
                        IBlowingFixService renzijiafix = mRenZiJia;

                        BLOWINGFIX_OBJ_INTERFACE.Pack_EPCState p = new BLOWINGFIX_OBJ_INTERFACE.Pack_EPCState()
                        {
                            sampletimer = renzijiafix.SampleTimer,
                            isrunning = renzijiafix.EPCIsRunning,
                            samplead = renzijiafix.SampleAD
                        };
                        infodata = p.ToBytes();
                    }break;
                default:
                    infodata = null;
                    break;
            }
        }
        public override void SetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
        {
            base.SetValue(from, srcid, memid, infodata);

            switch (memid)
            {
                case BLOWINGFIX_OBJ_INTERFACE.SET_PARAMSEXT:
                    {
                        BLOWINGFIX_OBJ_INTERFACE.Pack_ParamsExt p = new BLOWINGFIX_OBJ_INTERFACE.Pack_ParamsExt();
                        if (!p.TryParse(infodata))
                            break;

                        mRenZiJia.FLRange = p.filmLenRange;
                        mRenZiJia.Apply();
                    } break;
                case BLOWINGFIX_OBJ_INTERFACE.SET_EPC:
                    {
                        BLOWINGFIX_OBJ_INTERFACE.Pack_EPC p = new BLOWINGFIX_OBJ_INTERFACE.Pack_EPC();
                        if (!p.TryParse(infodata))
                            break;

                        mRenZiJia.EPCType = p.epctype;
                        mRenZiJia.SampleConsume = p.sampleconsume;
                        mRenZiJia.SampleInterval = p.sampleinterval;
                        mRenZiJia.BackEdgeWait = p.backedgewait;
                        mRenZiJia.IsBtnSelfHold = p.isBtnSelfHold;
                        mRenZiJia.Apply();
                        
                    }break;
            }         
        }
    }

}