using FlyADBase.Inc;
using FObjBase;
using GeneralGommunication;
using NLog;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace FlyADBase
{
    public class FlyAd2021B2Core : Dev7E, IFlyAd2021B2Core
    {
        const UInt16 P_Saved_Index_Op_Mode = 0;
        const UInt16 P_Saved_Index_Op_Motor = 1;
        const UInt16 P_Saved_Index_Op_Encoder = 2;
        const UInt16 P_Saved_Index_Op_Shift = 3;
        const UInt16 P_Saved_Index_Op_Speed = 4;


        /// <summary>
        /// 数据推送事件
        /// </summary>
        public event PushDataEventHandler PushDataEvent;

        /// <summary>
        /// 运行状态推送事件
        /// </summary>
        public event PushRunResultEventHandler PushRunResultEvent;

        COMMREQ COMMREQ_RN;
        public FlyAd2021B2Core()
        {
            logger = NLog.LogManager.GetCurrentClassLogger();

            //COMMREQ_RN 作为事件，会触发一次，作为指令，也会回复一次
            COMMREQ_RN = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RN"),
                ResponseLen = 5,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    DRIVE_MAN_STATUS result = (DRIVE_MAN_STATUS)pack[dataIdx];
                    dataIdx += 1;
                    UInt32 serial = BitConverter.ToUInt32(pack, dataIdx);
                    dataIdx += 4;

                    return new GetRunResult_Response()
                    {
                        result = result,
                        serial = serial
                    };
                }
            };
        }


        protected override void ParsePackAfterCheckCRC8(byte[] pack) 
        {
            byte B0 = pack[0];
            bool PT = Misc.MyBase.CHECKBIT(B0, 7);
            if (!PT)
            {
                ParseDataPack(pack);
            }
            else
            {

                ParseFuncPack(pack);
            }
        }

        void ParseDataPack(byte[] pack)
        {
            PushDataEventArgs eventArgs = new PushDataEventArgs();

            int ReponseLen = 4;  //B0(1)+B1(1)+AD(2)
            if (ReponseLen > pack.Count())
            {
                //失败，指令长度不对！！
                ErrCnt++;
                return;
            }

            byte systick = pack[0];
            Misc.MyBase.CLEARBIT(ref systick, 7);
            eventArgs.SysTick = systick;

            byte B1 = pack[1];
            bool hasIn = Misc.MyBase.CHECKBIT(B1, 7);
            bool hasENC1 = Misc.MyBase.CHECKBIT(B1, 6);
            bool hasENC2 = Misc.MyBase.CHECKBIT(B1, 5);
            bool hasOut = Misc.MyBase.CHECKBIT(B1, 4);
            bool hasAd2 = Misc.MyBase.CHECKBIT(B1, 3);

            var buf = pack;
            int index = 2;

            eventArgs.AD = BitConverter.ToUInt16(buf, index);
            index += 2;

            if (hasIn)
            {
                ReponseLen += 4;//IN(2)+ICHANGE(2)
                if (ReponseLen > pack.Count())
                {
                    //失败，指令长度不对！！
                    ErrCnt++;
                    return;
                }


                eventArgs.In = BitConverter.ToUInt16(buf, index);
                index += 2;
                eventArgs.InChange = BitConverter.ToUInt16(buf, index);
                index += 2;
            }

            if (hasENC1)
            {
                ReponseLen += 2;//ENC1(2)
                if (ReponseLen > pack.Count())
                {
                    //失败，指令长度不对！！
                    ErrCnt++;
                    return;
                }

                eventArgs.ENC1 = BitConverter.ToUInt16(buf, index);
                index += 2;
            }

            if (hasENC2)
            {
                ReponseLen += 2;//ENC2(2)
                if (ReponseLen > pack.Count())
                {
                    //失败，指令长度不对！！
                    ErrCnt++;
                    return;
                }

                eventArgs.ENC2 = BitConverter.ToUInt16(buf, index);
                index += 2;
            }

            if (hasOut)
            {
                ReponseLen += 2;//OUT(2)
                if (ReponseLen > pack.Count())
                {
                    //失败，指令长度不对！！
                    ErrCnt++;
                    return;
                }

                eventArgs.Out = BitConverter.ToUInt16(buf, index);
                index += 2;
            }

            if (hasAd2)
            {
                ReponseLen += 2;//AD2(2)
                if (ReponseLen > pack.Count())
                {
                    //失败，指令长度不对！！
                    ErrCnt++;
                    return;
                }

                eventArgs.AD2 = BitConverter.ToUInt16(buf, index);
                index += 2;
            }
            PushDataEvent?.Invoke(this, eventArgs);
        }
        void ParseFuncPack_PushRunResultEvent(byte[] pack)
        {

            PushRunResultEventArgs eventArgs = new PushRunResultEventArgs();

            var retData = COMMREQ_RN.ParseFuncPack(pack, 1 + COMMREQ_RN.Prefix.Count()) as GetRunResult_Response;
            eventArgs.Status = retData.result;
            eventArgs.Serial = retData.serial;

            //logger.Debug($"PushRunResultEvent {Newtonsoft.Json.JsonConvert.SerializeObject(retData)}");

            byte systick = pack[0];
            Misc.MyBase.CLEARBIT(ref systick, 7);
            eventArgs.SysTick = systick;
            PushRunResultEvent?.Invoke(this, eventArgs);
        }
        
        
        
        /// <summary>
        /// 功能包解析
        /// </summary>
        /// <param name="datas"></param>
        protected override void ParseFuncPack(byte[] pack)
        {
            //TODO 要处理  TimeOut / ParseFuncPack / GetSendMsg 线性同步问题

            //优先处理 PushRunResultEvent 事件
            if (Is_RN_Match(pack))
            {
                ParseFuncPack_PushRunResultEvent(pack);
            }

            base.ParseFuncPack(pack);
        }

        /// <summary>
        /// 数据发送，输入不需要包含开头的7E； 输出会添加CRC8 和 7E
        /// </summary>
        /// <param name="datas"></param>
        protected override List<byte> GetSendPack(List<byte> datas)
        {
            datas.Insert(0, 0x80);//插入B0
            return base.GetSendPack(datas);
        }


        bool Is_RN_Match(byte[] pack)
        {
            //datas[0] 是B0, 不应该用于判断
            if (pack.Count() < COMMREQ_RN.Prefix.Length + PrefixIndex)
                return false;
            return base.IsMatch(COMMREQ_RN, pack);
        }

        #region IOComm IO指令
        /// <summary>
        /// 获取输入口状态
        /// </summary>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        [CallBack(typeof(UInt16))]
        public void GetIn(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("IGI"),
                ResponseLen = 2,
                ParseFuncPack = (pack, dataIdx) => { return BitConverter.ToUInt16(pack, dataIdx); }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        /// <summary>
        /// 获取输出口状态
        /// </summary>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        [CallBack(typeof(UInt16))]
        public void GetOut(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("IGO"),
                ResponseLen = 2,
                ParseFuncPack = (pack, dataIdx) => { return BitConverter.ToUInt16(pack, dataIdx); }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(Int32))]
        public void GetEnc1(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("IGP0"),
                ResponseLen = 4,
                ParseFuncPack = (pack,dataIdx)=>BitConverter.ToInt32(pack, dataIdx) 
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(Int32))]
        public void GetEnc2(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("IGP1"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => BitConverter.ToInt32(pack, dataIdx)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(GetEncAll_Response))]
        public void GetEncAll(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("IGPA"),
                ResponseLen = 8,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    int pos1 = BitConverter.ToInt32(pack, dataIdx);
                    dataIdx += 4;
                    int pos2 = BitConverter.ToInt32(pack, dataIdx);
                    dataIdx += 4;
                    return new GetEncAll_Response()
                    {
                        pos1 = pos1,
                        pos2 = pos2
                    };
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void SetOutPorts(UInt16 mask, UInt16 value, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(mask));
            datas.AddRange(BitConverter.GetBytes(value));
            var datasObj = new { mask, value };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("ISO")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }
        #endregion

        #region RunComm 运行指令 SetRunParam
        public void SetRunParam_V(UInt32 velocity, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(velocity));
            var datasObj = new { velocity };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RPV")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetRunParam_SV(UInt32 sv, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(sv));
            var datasObj = new { sv };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RPS")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetRunParam_AccTime(UInt32 accTime, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(accTime));
            var datasObj = new { accTime };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RPU")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetRunParam_DecTime(UInt32 decTime, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(decTime));
            var datasObj = new { decTime };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RPD")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetRunParam_HSpd1(UInt32 homespd1, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(homespd1));
            var datasObj = new { homespd1 };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RP1")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetRunParam_HSpd2(UInt32 homespd2, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(homespd2));
            var datasObj = new { homespd2 };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RP2")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        #endregion

        #region RunComm 运行指令 GetRunParam
        public void GetRunParam_V(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RpV"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    return BitConverter.ToUInt32(pack, dataIdx);
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void GetRunParam_SV(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RpS"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    return BitConverter.ToUInt32(pack, dataIdx);
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void GetRunParam_AccTime(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RpU"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    return BitConverter.ToUInt32(pack, dataIdx);
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void GetRunParam_DecTime(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RpD"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    return BitConverter.ToUInt32(pack, dataIdx);
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void GetRunParam_HSpd1(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("Rp1"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    return BitConverter.ToUInt32(pack, dataIdx);
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void GetRunParam_HSpd2(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("Rp2"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    return BitConverter.ToUInt32(pack, dataIdx);
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        #endregion

        #region RunComm 运行指令
        public void GetRunResult(CallBackHandler asyncDelegate, object asyncContext)
        {
            //COMMREQ_RN 作为事件，会触发一次，作为指令，也会回复一次
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RN"),
                ResponseLen = 5,
                ParseFuncPack = (pack, dataIdx) =>
                {
                    DRIVE_MAN_STATUS result = (DRIVE_MAN_STATUS)pack[dataIdx];
                    dataIdx += 1;
                    UInt32 serial = BitConverter.ToUInt32(pack, dataIdx);
                    dataIdx += 4;

                    return new GetRunResult_Response()
                    {
                        result = result,
                        serial = serial
                    };
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        public void Forw(Int32 serial, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(serial));
            var datasObj = new { serial };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RF")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void Backw(Int32 serial, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(serial));
            var datasObj = new { serial };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RB")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }
        public void Org(Int32 serial, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(serial));
            var datasObj = new { serial };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RO")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void RunTo(int targetPos, Int32 serial, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.Add((byte)'P');
            datas.AddRange(BitConverter.GetBytes(targetPos));
            datas.AddRange(BitConverter.GetBytes(serial));
            var datasObj = new { targetPos, serial };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RR")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }
        public void Stop(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RS")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }
        public void EStop(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("RT")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }
        #endregion

        #region SysParamComm 系统参数指令
        /// <summary>
        /// 获取系统当前Tick
        /// </summary>
        [CallBack(typeof(UInt32))]
        public void GetSysTick(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("ST"),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => BitConverter.ToInt32(pack, dataIdx)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        #endregion

        #region GetSysParam 读运行参数
        [CallBack(typeof(MOTORTYPE))]
        public void GetSysParam_MotorType(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PG",P_Saved_Index_Op_Mode),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => 
                {
                    byte motorType = pack[dataIdx];
                    motorType &= 3;
                    return (MOTORTYPE)motorType;
                }
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(UInt16))]
        public void GetSysParam_Ratio01(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PG", P_Saved_Index_Op_Motor),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => BitConverter.ToUInt16(pack, dataIdx)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(UInt16))]
        public void GetSysParam_Ratio02(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PG", P_Saved_Index_Op_Encoder),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => BitConverter.ToUInt16(pack, dataIdx)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(Int16))]
        public void GetSysParam_Zero(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PG", P_Saved_Index_Op_Shift),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => BitConverter.ToInt16(pack, dataIdx)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }

        [CallBack(typeof(UInt32))]
        public void GetSysParam_Jog(CallBackHandler asyncDelegate, object asyncContext)
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PG", P_Saved_Index_Op_Speed),
                ResponseLen = 4,
                ParseFuncPack = (pack, dataIdx) => BitConverter.ToUInt32(pack, dataIdx)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }
        #endregion

        #region SetSysParam 设置运行参数


        public void SetSysParam_MotorType(MOTORTYPE motorType, CallBackHandler asyncDelegate, object asyncContext)
        {
            UInt32 request = (UInt32)motorType;
            request |= (0x3 << 2);
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(request));

            var datasObj = new { motorType };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PS", P_Saved_Index_Op_Mode)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }


        public void SetSysParam_Ratio01(UInt16 ratio01, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes((UInt32)ratio01));
            var datasObj = new { ratio01 };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PS", P_Saved_Index_Op_Motor)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetSysParam_Ratio02(UInt16 ratio02, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes((UInt32)ratio02));
            var datasObj = new { ratio02 };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PS",P_Saved_Index_Op_Encoder)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetSysParam_Zero(Int16 zero, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes((Int32)zero));
            var datasObj = new { zero };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PS",P_Saved_Index_Op_Shift)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetSysParam_Jog(UInt32 jog, CallBackHandler asyncDelegate, object asyncContext)
        {
            List<byte> datas = new List<byte>();
            datas.AddRange(BitConverter.GetBytes(jog));
            var datasObj = new { jog };

            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PS", P_Saved_Index_Op_Speed)
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext,
                    datas = datas.ToArray(),
                    datasObj = datasObj
                });
        }

        public void SetSysParam_Apply(CallBackHandler asyncDelegate, object asyncContext) 
        {
            COMMREQ commReq = new COMMREQ()
            {
                Prefix = COMMREQ.ToPrefix("PA")
            };

            //放入 交易队列
            AddTran(
                new COMMREQ_Transaction()
                {
                    commReq = commReq,
                    asyncDelegate = asyncDelegate,
                    asyncContext = asyncContext
                });
        }
        #endregion

    }
}
