using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using System.Net;
using FlyADBase;

namespace FLYAD7_OBJ_INTERFACE
{
    public class FLYADC_OBJ_INTERFACE
    {
        #region OBJ_ID
        public const UInt32 ID = 0x10020001;
        #endregion

        #region GET
        public const UInt16 GET_POS1AD1 = 0x101;
        public class Pack_GetPos1AD1 : IPack
        {
            public int pos;
            public int ad;
            public int speed;



            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(pos));
                buf.AddRange(BitConverter.GetBytes(ad));
                buf.AddRange(BitConverter.GetBytes(speed));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < 12)
                    return false;
                pos = BitConverter.ToInt32(value, 0);
                ad = BitConverter.ToInt32(value, 4);
                speed = BitConverter.ToInt32(value, 8);
                return true;
            }

            #endregion
        }
        public const UInt16 GET_POS2 = 0x102;//long POS2
        //long segment
        //long distance
        //long speed
        public class Pack_GetPos2 : PUSH_DATA_INTERFACE.Pack_PushPos2
        {

        }
        public const UInt16 GET_AD2 = 0x103;//long AD2
        public class Pack_GetAD2 : PUSH_DATA_INTERFACE.Pack_PushAD1
        {

        }
        #endregion

        #region CALL
        public const UInt16 CALL_RESETPOS = 0x101;//ResetPos()
        #endregion

    }
    public class FLYIO_OBJ_INTERFACE
    {
        #region OBJ_ID
        public const UInt32 ID = 0x10030002;
        #endregion

        #region GetValue
        public const UInt16 GET_IO = 0x101;//unsigned char inport
        //unsigned char outport
        public class Pack_GetIO : PUSH_DATA_INTERFACE.Pack_PushIO
        {

        }
        #endregion

        #region CallFunction
        public const UInt16 CALL_OUTPORT = 0x101;//OutPort(uint8_t mask,uint8_t port) 
        public class Pack_CallOutPort : IPack
        {
            public UInt16 mask;
            public UInt16 port;
            #region IPack 成员
            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(mask));
                buf.AddRange(BitConverter.GetBytes(port));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < 4)
                    return false;
                mask = BitConverter.ToUInt16(value, 0);
                port = BitConverter.ToUInt16(value, 2);
                return true;
            }

            #endregion
        }
        #endregion
    }
    public class DRIVE_MAN_INTERFACE
    {
        #region OBJ_ID
        public const UInt32 ID = 0x10060003;
        #endregion

        #region Pack

        public class Pack_DriveParam : IPack
        {
            public UInt32 Velocity;
            public UInt32 SV;
            public UInt32 ATime;			// in ms
            public UInt32 DTime;			// in ms
            public UInt32 hspeed1;			// Home Speed1
            public UInt32 hspeed2;			// Home Speed2


            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.AddRange(BitConverter.GetBytes(Velocity));
                buf.AddRange(BitConverter.GetBytes(SV));
                buf.AddRange(BitConverter.GetBytes(ATime));
                buf.AddRange(BitConverter.GetBytes(DTime));
                buf.AddRange(BitConverter.GetBytes(hspeed1));
                buf.AddRange(BitConverter.GetBytes(hspeed2));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < 24)
                    return false;
                Velocity = BitConverter.ToUInt32(value, 0);
                SV = BitConverter.ToUInt32(value, 4);
                ATime = BitConverter.ToUInt32(value, 8);
                DTime = BitConverter.ToUInt32(value, 12);
                hspeed1 = BitConverter.ToUInt32(value, 16);
                hspeed2 = BitConverter.ToUInt32(value, 20);
                return true;
            }

            #endregion
        }
        public class Pack_DriveState : IPack
        {
            //当前运行指令(1B)+当前运行状态(1B)+运行模式(1B)+  systick(4B) + 命令序列码(4B)
            public DRIVE_MAN_ORDER order;
            public DRIVE_MAN_STATUS status;
            public byte mode;
            public int systick;
            public Int32 marker;
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.Add((byte)order);
                buf.Add((byte)status);
                buf.Add((byte)mode);
                buf.AddRange(BitConverter.GetBytes(systick));
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < (1 + 1 + 1 + 4 + 4))
                    return false;
                int idx = 0;
                order = (DRIVE_MAN_ORDER)value[idx];
                idx++;
                status = (DRIVE_MAN_STATUS)value[idx];
                idx++;
                mode = value[idx];
                idx++;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }

            #endregion
        }
        public class Pack_SyncStatus : IPack
        {
            public SYNC_STATUS status;
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.Add((byte)status);
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < (1))
                    return false;
                int idx = 0;
  
                status = (SYNC_STATUS)value[idx];
                idx++;
                return true;
            }

            #endregion
        }

        public class Pack_SyncOrderCnt : IPack
        {
            public UInt16 cnt;
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.AddRange(BitConverter.GetBytes(cnt));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < (2))
                    return false;
                int idx = 0;

                cnt = BitConverter.ToUInt16(value, idx);
                idx += 2;
                return true;
            }

            #endregion
        }
        public class Pack_MotorType : IPack
        {
            public MOTORTYPE motortype;

            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.Add((byte)motortype);
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < 1)
                    return false;
                motortype = (MOTORTYPE)value[0];
                return true;
            }

            #endregion
        }

        public abstract class Pack_OrderBase : IPack
        {
            public DRIVE_MAN_ORDER order;
            #region IPack 成员

            public virtual byte[] ToBytes()
            {
                byte[] buf = new byte[1];
                buf[0] = (byte)order;
                return buf;
            }

            public virtual bool TryParse(byte[] value)
            {
                if (value.Count() < 1)
                    return false;
                order = (DRIVE_MAN_ORDER)value[0];
                return true;
            }

            #endregion
            public static bool TryParse(byte[] value, out Pack_OrderBase outpack)
            {
                outpack = null;
                bool ret;
                if (value.Count() < 1)
                    return false;

                Pack_OrderBase pack;
                DRIVE_MAN_ORDER order = (DRIVE_MAN_ORDER)value[0];
                switch (order)
                {
                    case DRIVE_MAN_ORDER.ORIGIN:
                    case DRIVE_MAN_ORDER.FORWORD:
                    case DRIVE_MAN_ORDER.BACKWORD:
                    case DRIVE_MAN_ORDER.STOP:
                        pack = new Pack_CallPXX();
                        break;
                    case DRIVE_MAN_ORDER.RUNTO:
                        pack = new Pack_CallRunto();
                        break;
                    case DRIVE_MAN_ORDER.SYNC:
                        return Pack_SyncBase.TryParse(value, out outpack);
                        break;
                    default:
                        return false;
                }
                ret = pack.TryParse(value);
                outpack = pack;
                return ret;
            }
        }
        public class Pack_CallPXX : Pack_OrderBase
        {

        }
        public class Pack_CallRunto : Pack_OrderBase
        {
            public int to;
            public Pack_CallRunto()
            {
                order = DRIVE_MAN_ORDER.RUNTO;
            }
            #region IPack 成员

            public override byte[] ToBytes()
            {

                byte[] buf = new byte[6];
                buf[0] = (byte)DRIVE_MAN_ORDER.RUNTO;
                BitConverter.GetBytes(to).CopyTo(buf, 1);
                buf[5] = 1;
                return buf;
            }

            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 5)
                    return false;
                if (value[0] != (byte)DRIVE_MAN_ORDER.RUNTO)
                    return false;

                order = DRIVE_MAN_ORDER.RUNTO;
                to = BitConverter.ToInt32(value, 1);
                return true;
            }

            #endregion
        }
        #region 同步参数设置
        public abstract class Pack_SyncBase : Pack_OrderBase
        {
            public byte syncnnum;
            static Dictionary<byte, Type> packtype;
            static Pack_SyncBase()
            {
                packtype = new Dictionary<byte, Type>();
                packtype.Add(Pack_Pos1LCShift.GetNum(), typeof(Pack_Pos1LCShift));
                packtype.Add(Pack_Pos2Shift.GetNum(), typeof(Pack_Pos2Shift));
                packtype.Add(Pack_Pos2.GetNum(), typeof(Pack_Pos2));
                packtype.Add(Pack_Pos2Comp.GetNum(), typeof(Pack_Pos2Comp));
                packtype.Add(Pack_Pos2_01.GetNum(), typeof(Pack_Pos2_01));

                packtype.Add(Pack_SyncBeginWithPos2.GetNum(), typeof(Pack_SyncBeginWithPos2));
                packtype.Add(Pack_SyncBegin.GetNum(), typeof(Pack_SyncBegin));
                packtype.Add(Pack_SyncEnd.GetNum(), typeof(Pack_SyncEnd));
                packtype.Add(Pack_SyncPos2Clear.GetNum(), typeof(Pack_SyncPos2Clear));


                packtype.Add(Pack_SyncRunAtLC.GetNum(), typeof(Pack_SyncRunAtLC));
                packtype.Add(Pack_SyncOrigin.GetNum(), typeof(Pack_SyncOrigin));
                packtype.Add(Pack_SyncRunto.GetNum(), typeof(Pack_SyncRunto));
                packtype.Add(Pack_SyncRuntoLC.GetNum(), typeof(Pack_SyncRuntoLC));
                packtype.Add(Pack_SyncWait.GetNum(), typeof(Pack_SyncWait));
            }
            public Pack_SyncBase()
            {
                order = DRIVE_MAN_ORDER.SYNC;
            }
            public override byte[] ToBytes()
            {
                byte[] buf = new byte[2];
                buf[0] = (byte)order;
                buf[1] = syncnnum;
                return buf;
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2)
                    return false;
                order = (DRIVE_MAN_ORDER)value[0];
                syncnnum = value[1];
                return true;
            }
            public static bool TryParse(byte[] value, out Pack_OrderBase outpack)
            {
                outpack = null;
                if (value.Count() < 2)
                    return false;
                char order = (char)value[0];
                byte syncnnum = value[1];

                if (!packtype.ContainsKey(syncnnum))
                    return false;
                outpack = Activator.CreateInstance(packtype[syncnnum]) as Pack_OrderBase;
                return outpack.TryParse(value);
            }
        }
        /// <summary>
        /// 
        /// D+0x80+m_pos1_LCShift(4B:int32)
        /// </summary>
        public class Pack_Pos1LCShift : Pack_SyncBase
        {
            public int pos1_LCShift;
            public static byte GetNum()
            {
                return 0x80;
            }
            public Pack_Pos1LCShift()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos1_LCShift));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 4)
                    return false;
                int idx = 0;
                idx += 2;
                pos1_LCShift = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }
        /// <summary>
        /// 设定纵向偏移
        /// D+0x81+m_pos2_shift(4B:int32)
        /// </summary>
        public class Pack_Pos2Shift : Pack_SyncBase
        {
            public int pos2_shift;
            public static byte GetNum()
            {
                return 0x81;
            }
            public Pack_Pos2Shift()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos2_shift));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 4)
                    return false;
                int idx = 0;
                idx += 2;
                pos2_shift = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }
        /// <summary>
        /// 设定纵向值
        /// D+0x82+m_pos2(4B:int32)
        /// </summary>
        public class Pack_Pos2 : Pack_SyncBase
        {
            public int pos2;
            public static byte GetNum()
            {
                return 0x82;
            }
            public Pack_Pos2()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos2));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 4)
                    return false;
                int idx = 0;
                idx += 2;
                pos2 = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }
        /// <summary>
        /// 设定纵向值补偿系数,补偿时,先乘除后加减
        /// D+0x83+m_pos2_comp(4B:float)
        /// </summary>
        public class Pack_Pos2Comp : Pack_SyncBase
        {
            public float comp;
            public static byte GetNum()
            {
                return 0x83;
            }
            public Pack_Pos2Comp()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(comp));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 4)
                    return false;
                int idx = 0;
                idx += 2;
                comp = BitConverter.ToSingle(value, idx);
                idx += 4;
                return true;
            }
        }

        /// <summary>
        /// 纵向同步事件,0-1事件
        /// D+0x84+主轴脉冲(4B:int32)+ 'I' 或 'N'
        /// </summary>
        public class Pack_Pos2_01 : Pack_SyncBase
        {
            public int pos2;
            public bool immediately;
            public static byte GetNum()
            {
                return 0x84;
            }
            public Pack_Pos2_01()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos2));
                if (immediately)
                {
                    buf.Add((byte)'I');
                }
                else 
                {
                    buf.Add((byte)'N');
                }

                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < (2+4+1))
                    return false;
                int idx = 0;
                idx += 2;
                pos2 = BitConverter.ToInt32(value, idx);
                idx += 4;
                char c = (char)value[idx];
                if (c == 'I')
                    immediately = true;
                else
                    immediately = false;
                idx += 1;
                return true;
            }
        }

        #endregion
        #region  同步控制
        /// <summary>
        /// 进入同步状态
        /// D+0x01+m_pos2(4B:int32)
        /// </summary>
        public class Pack_SyncBeginWithPos2 : Pack_SyncBase
        {
            public int pos2;
            public static byte GetNum()
            {
                return 0x01;
            }
            public Pack_SyncBeginWithPos2()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos2));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 4)
                    return false;
                int idx = 0;
                idx += 2;
                pos2 = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }
        /// <summary>
        /// 进入同步状态
        /// D+0x02(4B:int32)
        /// </summary>
        public class Pack_SyncBegin : Pack_SyncBase
        {
            public static byte GetNum()
            {
                return 0x02;
            }
            public Pack_SyncBegin()
            {
                syncnnum = GetNum();
            }
        }
        /// <summary>
        /// 退出同步状态
        /// D+0x03
        /// </summary>
        public class Pack_SyncEnd : Pack_SyncBase
        {
            public static byte GetNum()
            {
                return 0x03;
            }
            public Pack_SyncEnd()
            {
                syncnnum = GetNum();
            }
        }
        /// <summary>
        /// 清空同步列表
        /// </summary>
        public class Pack_SyncClear : Pack_SyncBase
        {
            public static byte GetNum()
            {
                return 0x04;
            }
            public Pack_SyncClear()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2)
                    return false;
                int idx = 0;
                idx += 2;
                return true;
            }
        }

        /// <summary>
        /// 清空主轴脉冲同步列表
        /// </summary>
        public class Pack_SyncPos2Clear : Pack_SyncBase
        {
            public static byte GetNum()
            {
                return 0x05;
            }
            public Pack_SyncPos2Clear()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2)
                    return false;
                int idx = 0;
                idx += 2;
                return true;
            }
        }
        #endregion
        #region 同步扫描

        /// <summary>
        ///         7.1	同步扫描至:
        ///         D+0xE0+开始主轴位置+结束主轴位置+结束横向脉冲位置(逻辑位置)+脉冲开关(1B)+命令识标号(4B)
        /// </summary>
        public class Pack_SyncRunAtLC : Pack_SyncBase
        {
            public int pos2_begin;
            public int pos2_end;
            public int pos1lc;
            public bool hasDataGrid;
            public Int32 marker;

            public static byte GetNum()
            {
                return 0xE0;
            }
            public Pack_SyncRunAtLC()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos2_begin));
                buf.AddRange(BitConverter.GetBytes(pos2_end));
                buf.AddRange(BitConverter.GetBytes(pos1lc));
                buf.AddRange(BitConverter.GetBytes(hasDataGrid));
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 17)
                    return false;
                int idx = 0;
                idx += 2;
                pos2_begin = BitConverter.ToInt32(value, idx);
                idx += 4;
                pos2_end = BitConverter.ToInt32(value, idx);
                idx += 4;
                pos1lc = BitConverter.ToInt32(value, idx);
                idx += 4;
                hasDataGrid = BitConverter.ToBoolean(value, idx);
                idx++;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }

        /// <summary>
        /// 7.2	位于队列头时运行,归零
        /// D+0xE1+命令识标号(4B)
        /// </summary>
        public class Pack_SyncOrigin : Pack_SyncBase
        {
            public Int32 marker;
            public static byte GetNum()
            {
                return 0xE1;
            }
            public Pack_SyncOrigin()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 4)
                    return false;
                int idx = 0;
                idx += 2;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }

        /// <summary>
        /// 7.3	位于队列头时运行,以速度运行至物理位置
        /// D+0xE2+横向脉冲位置(4B:int32,物理位置)+速度(4B:int32)+脉冲开关(1B)+命令识标号(4B)
        /// </summary>
        public class Pack_SyncRunto : Pack_SyncBase
        {
            public int pos1;
            public UInt32 velocity;
            public bool hasDataGrid;
            public Int32 marker;
            public static byte GetNum()
            {
                return 0xE2;
            }
            public Pack_SyncRunto()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos1));
                buf.AddRange(BitConverter.GetBytes(velocity));
                buf.AddRange(BitConverter.GetBytes(hasDataGrid));
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 13)
                    return false;
                int idx = 0;
                idx += 2;
                pos1 = BitConverter.ToInt32(value, idx);
                idx += 4;
                velocity = BitConverter.ToUInt32(value, idx);
                idx += 4;
                hasDataGrid = BitConverter.ToBoolean(value, idx);
                idx++;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }

        /// <summary>
        ///         7.3	位于队列头时运行,以速度运行至逻辑位置
        ///         D+0xE3+横向脉冲位置(4B:int32,逻辑位置)+速度(4B:int32)+脉冲开关(1B)+命令识标号(4B)
        /// </summary>
        public class Pack_SyncRuntoLC : Pack_SyncBase
        {
            public int pos1;
            public UInt32 velocity;
            public bool hasDataGrid;
            public Int32 marker;
            public static byte GetNum()
            {
                return 0xE3;
            }
            public Pack_SyncRuntoLC()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(pos1));
                buf.AddRange(BitConverter.GetBytes(velocity));
                buf.AddRange(BitConverter.GetBytes(hasDataGrid));
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 13)
                    return false;
                int idx = 0;
                idx += 2;
                pos1 = BitConverter.ToInt32(value, idx);
                idx += 4;
                velocity = BitConverter.ToUInt32(value, idx);
                idx += 4;
                hasDataGrid = BitConverter.ToBoolean(value, idx);
                idx++;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }


        /// <summary>
        /// 7.4	等待,ms
        /// D+0xE4+毫秒数(4B:int32)+命令识标号(4B)
        /// </summary>
        public class Pack_SyncWait : Pack_SyncBase
        {
            public int ms;
            public Int32 marker;
            public static byte GetNum()
            {
                return 0xE4;
            }
            public Pack_SyncWait()
            {
                syncnnum = GetNum();
            }
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add(syncnnum);
                buf.AddRange(BitConverter.GetBytes(ms));
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }
            public override bool TryParse(byte[] value)
            {
                if (value.Count() < 2 + 8)
                    return false;
                int idx = 0;
                idx += 2;
                ms = BitConverter.ToInt32(value, idx);
                idx += 4;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }

        #endregion
        #endregion

        #region GetValue
        /// <summary>
        /// 读最近运行状态及结果和运行模式,当前运行指令(1B)+当前运行状态(1B)+运行模式(1B)
        /// Pack_DriveState
        /// </summary>
        public const UInt16 GET_STATE = 0x101;


        /// <summary>
        /// 读脉冲输出参数;
        /// 脉冲速率(4B)+初始速率(4B)+加速时间(4B)+减速时间(4B)+回零速度1(4B)+回零速度2(4B);
        /// Pack_DriveParam
        /// </summary>
        public const UInt16 GET_DRIVEPARAM = 0x102;

        /// <summary>
        /// 读同步状态 (1Byte)
        /// </summary>
        public const UInt16 GET_SYNC_STATUS = 0x103;

        /// <summary>
        /// 读同步指令数 (2Byte)
        /// </summary>
        public const UInt16 GET_SYNC_ORDER_CNT = 0x104;

        #endregion

        #region SetValue
        /// <summary>
        /// 写脉冲输出参数。脉冲速率(4B)+初始速率(4B)+加速时间(4B)+减速时间(4B)+回零速度1(4B)+回零速度2(4B);
        /// Pack_DriveParam
        /// </summary>
        public const UInt16 SET_DRIVEPARAM = 0x102;//写脉冲输出参数。

        #endregion

        #region CallFunction
        /// <summary>
        /// Pack_CallPXX,Pack_CallRunto
        /// </summary>
        public const UInt16 CALL_PXX = 0x101;//调用运行函数,发各种运行指令。

        #endregion


    }
    public class SYS_DATA_INTERFACE
    {
        #region OBJ_ID
        public const UInt32 ID = 0x10070004;
        #endregion

        #region Pack
        public class Pack_IP : IPack
        {
            public IPEndPoint ep;
            #region IPack 成员

            public byte[] ToBytes()
            {
                byte[] _addr = ep.Address.GetAddressBytes();
                byte[] ipaddr = new byte[4];
                for (int i = 0; i < ipaddr.Count() && i < _addr.Count(); i++)
                {
                    ipaddr[i] = _addr[i];
                }
                UInt16 port = (UInt16)ep.Port;

                List<byte> buf = new List<byte>();
                buf.AddRange(ipaddr);
                buf.AddRange(BitConverter.GetBytes(port));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < 6)
                    return false;
                UInt32 ipaddr = BitConverter.ToUInt32(value, 0);
                UInt16 port = BitConverter.ToUInt16(value, 4);
                ep = new IPEndPoint(ipaddr, port);
                return true;
            }

            #endregion
        }
        public class Pack_SysParam : IPack
        {
            public UInt16 posOfGrid;//1个Grid=?脉冲数(2B)
            public UInt16 ad1_interval;//定点AD1采样频率(2B)
            public UInt16 ad2_interval;//定点AD2采样频率(2B)
            public UInt16 push_interval;//信息包推送间隔(2B)
            public byte func_setting;//开关量功能设置(1B)
            public byte func_enable;//功能使能(1B)
            public UInt16 ratio01;//电机比例(2B)
            public UInt16 ratio02;//脉冲比例(2B)
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(posOfGrid));
                buf.AddRange(BitConverter.GetBytes(ad1_interval));
                buf.AddRange(BitConverter.GetBytes(ad2_interval));
                buf.AddRange(BitConverter.GetBytes(push_interval));
                buf.Add(func_setting);
                buf.Add(func_enable);
                buf.AddRange(BitConverter.GetBytes(ratio01));
                buf.AddRange(BitConverter.GetBytes(ratio02));

                return buf.ToArray();

            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < 14)
                    return false;
                int idx = 0;
                posOfGrid = BitConverter.ToUInt16(value, idx);
                idx += 2;
                ad1_interval = BitConverter.ToUInt16(value, idx);
                idx += 2;
                ad2_interval = BitConverter.ToUInt16(value, idx);
                idx += 2;
                push_interval = BitConverter.ToUInt16(value, idx);
                idx += 2;
                func_setting = value[idx];
                idx += 1;
                func_enable = value[idx];
                idx += 1;
                ratio01 = BitConverter.ToUInt16(value, idx);
                idx += 2;
                ratio02 = BitConverter.ToUInt16(value, idx);
                idx += 2;
                return true;
            }

            #endregion
        }

        /// <summary>
        /// char status;
        /// char ret;
        /// unsigned char code[6];
        /// unsigned short surplus;
        /// unsigned char access[8];
        /// </summary>
        public class Pack_SysInfo : IPack
        {


            public AREA_STATUS status;
            public AREA_ERR ret;
            public byte[] code = new byte[6];
            public UInt16 surplus;
            public byte[] access = new byte[8];


            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)status);
                buf.Add((byte)ret);
                buf.AddRange(code);
                buf.AddRange(BitConverter.GetBytes(surplus));
                buf.AddRange(access);
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < 18)
                    return false;
                int idx = 0;
                status = (AREA_STATUS)value[idx];
                idx++;
                ret = (AREA_ERR)value[idx];
                idx++;

                Array.Copy(value, idx, code, 0, 6);
                idx += 6;
                surplus = BitConverter.ToUInt16(value, idx);
                idx += 2;
                Array.Copy(value, idx, access, 0, 8);
                idx += 8;
                return true;
            }

            #endregion
        }
        public class Pack_ZeroPos : IPack
        {
            public Int16 zero_pos;//零位脉冲
            public UInt32 jog_velocity;//点动速度
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(zero_pos));
                buf.AddRange(BitConverter.GetBytes(jog_velocity));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Count() < 6)
                    return false;

                zero_pos = BitConverter.ToInt16(value, 0);
                jog_velocity = BitConverter.ToUInt32(value, 2);
                return true;
            }

            #endregion
        }
        public class Pack_Init : IPack
        {
            public byte area = 1;
            #region IPack 成员
            public byte[] ToBytes()
            {
                string password = "flymeasure@@";

                List<byte> buf = new List<byte>();
                for (int i = 0; i < password.Length; i++)
                {
                    buf.Add((byte)password[i]);
                }
                buf.Add(area);
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                return true;
            }

            #endregion
        }
        #endregion

        #region GetValue
        /// <summary>
        /// Pack_IP;
        /// unsigned char IPaddr[4]
        /// unsigned short port
        /// </summary>
        public const UInt16 GET_IP = 0x101;

        /// <summary>
        /// 运行参数读。1个Grid=?脉冲数(2B)+定点AD1采样频率(2B)+定点AD2采样频率(2B)+信息包推送间隔(2B)+开关量功能设置(1B)+功能使能(1B)+电机一圈脉冲(2B)+编码器一圈脉冲(2B)
        /// Pack_SysParam
        /// </summary>
        public const UInt16 GET_SYSPARAM = 0x102;

        /// <summary>
        /// 返回系统授权信息,状态码(1B)+返回码(1B)+序列码(6B)+系统剩余时间(2B)+授权码(8B)
        /// Pack_SysInfo
        /// </summary>
        public const UInt16 GET_SYSINFO = 0x103;

        /// <summary>
        /// Pack_ZeroPos
        /// </summary>
        public const UInt16 GET_ZERO_POS = 0x104;

        #endregion

        #region SetValue
        /// <summary>
        /// Pack_IP, 这个不支持!!!!!
        /// </summary>
        public const UInt16 SET_IP = 0x101;
        /// <summary>
        /// 运行参数写。value=1个Grid=?脉冲数(2B)+定点AD1采样频率(2B)+定点AD2采样频率(2B)+信息包推送间隔(2B)+开关量功能设置(1B)+功能使能(1B)+电机一圈脉冲(2B)+编码器一圈脉冲(2B)
        /// Pack_SysParam
        /// </summary>
        public const UInt16 SET_SYSPARAM = 0x102;

        /// <summary>
        /// Pack_ZeroPos
        /// </summary>
        public const UInt16 SET_ZERO_POS = 0x103;
        #endregion

        #region CallFunction
        public const UInt16 CALL_INIT = 0x101;//初始化系统信息区,InitArea(uint_t *pass,uint8_t area)pass是初始化需要的密码,area=01授权区,02参数区
        //密码(12byte)+初始化区域(1byte)

        public const UInt16 CALL_ACCESS = 0x102;//输入系统授权码,CheckAccessCode(uint8_t *acc)
        //授权码(8byte)


        public const UInt16 CALL_SURPLUS_SUB = 0x104;//没参数 系统使用时间加-1	
        #endregion


    }
    public class PUSH_DATA_INTERFACE
    {
        #region OBJ_ID
        public const UInt32 ID = 0x10080005;
        #endregion

        #region Pack
        public class Pack_PushPos1 
        {
            public int pos1;
            public int speed1;

            #region IPack 成员
            /// <summary>
            /// 8 bytes
            /// </summary>
            /// <returns></returns>
            public virtual byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(pos1));
                buf.AddRange(BitConverter.GetBytes(speed1));
                return buf.ToArray();
            }
            /// <summary>
            /// 8 bytes
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public virtual bool TryParse(byte[] value)
            {
                if (value.Length < 8)
                    return false;
                pos1 = BitConverter.ToInt32(value, 0);
                speed1 = BitConverter.ToInt32(value, 4);
                return true;
            }

            #endregion
        }

        public class Pack_PushAD1 : IPack
        {
            public int AD;

            #region IPack 成员
            public virtual void CopyTo(Pack_PushAD1 t)
            {
                t.AD = AD;
            }
            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(AD));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < 4)
                    return false;
                AD = BitConverter.ToInt32(value, 0);
                return true;
            }

            #endregion
        }

        public class Pack_PushIO : IPack
        {
            public UInt16 istatus;
            public UInt16 ostatus;

            #region IPack 成员
            /// <summary>
            /// 4 bytes
            /// </summary>
            /// <returns></returns>
            public virtual byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.AddRange(BitConverter.GetBytes(istatus));
                buf.AddRange(BitConverter.GetBytes(ostatus));
                return buf.ToArray();
            }
            /// <summary>
            /// 4 bytes
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public virtual bool TryParse(byte[] value)
            {
                if (value.Length < 4)
                    return false;
                int idx = 0;
                istatus = BitConverter.ToUInt16(value, idx);
                idx += 2;
                ostatus = BitConverter.ToUInt16(value, idx);
                idx += 2;

                return true;
            }

            #endregion
        }

        public class Pack_PushPos2 : IPack
        {
            public int pos2;
            public int segment;
            public int distance;
            public int speed2;
            #region IPack 成员
            /// <summary>
            /// 16 bytes
            /// </summary>
            /// <returns></returns>
            public virtual byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(pos2));
                buf.AddRange(BitConverter.GetBytes(segment));
                buf.AddRange(BitConverter.GetBytes(distance));
                buf.AddRange(BitConverter.GetBytes(speed2));
                return buf.ToArray();
            }
            /// <summary>
            /// 16 bytes
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public virtual bool TryParse(byte[] value)
            {
                if (value.Length < 16)
                    return false;
                pos2 = BitConverter.ToInt32(value, 0);
                segment = BitConverter.ToInt32(value, 4);
                distance = BitConverter.ToInt32(value, 8);
                speed2 = BitConverter.ToInt32(value, 12);
                return true;
            }

            #endregion
        }
        public class Pack_PushTGrid
        {
            public int[] data;


            /// <summary>
            /// 2+4*n
            /// </summary>
            /// <returns></returns>
            public virtual byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes((UInt16)data.Length));
                for (int i = 0; i < data.Length; i++)
                {
                    buf.AddRange(BitConverter.GetBytes(data[i]));
                }

                return buf.ToArray();
            }
            /// <summary>
            /// 2+4*n
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public virtual bool TryParse(byte[] value)
            {
                int cnt = 2;
                int idx = 0;
                if (value.Length < cnt)
                    return false;
                idx = 0;
                int len = BitConverter.ToUInt16(value, idx);
                idx += 2;
                cnt += len * 4;
                if (value.Length < cnt)
                    return false;

                data = new int[len];

                for (int i = 0; i < len; i++)
                {
                    data[i] = BitConverter.ToInt32(value, idx);
                    idx += 4;
                }

                return true;
            }

            /// <summary>
            /// 2+4*n
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public virtual bool TryParse(byte[] value,out int cnt)
            {
                cnt = 2;
                int idx = 0;
                if (value.Length < cnt)
                    return false;
                idx = 0;
                int len = BitConverter.ToUInt16(value, idx);
                idx += 2;
                cnt += len * 4;
                if (value.Length < cnt)
                    return false;

                data = new int[len];

                for (int i = 0; i < len; i++)
                {
                    data[i] = BitConverter.ToInt32(value, idx);
                    idx += 4;
                }

                return true;
            }          
        }

        public class Pack_PushStatus
        {
            public DRIVE_MAN_ORDER order;
            public DRIVE_MAN_STATUS status;

            #region IPack 成员
            /// <summary>
            /// 2 byte
            /// </summary>
            /// <returns></returns>
            public virtual byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.Add((byte)order);
                buf.Add((byte)status);
                
                return buf.ToArray();
            }
            /// <summary>
            ///  2 byte
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public virtual bool TryParse(byte[] value)
            {
                if (value.Length < 2)
                    return false;
                order = (DRIVE_MAN_ORDER)value[0];
                status = (DRIVE_MAN_STATUS)value[1];

                return true;
            }

            #endregion
        }
        public class Pack_PushGrid 
        {
            public Misc.DIRECTION direction;

            public int grid_start;

            public int[] data;
            #region IPack 成员

            public virtual byte[] ToBytes()
            {
                int grid_end = data.Length + grid_start - 1;
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes((UInt16)grid_start));

                buf.AddRange(BitConverter.GetBytes((UInt16)grid_end));

                if (direction == Misc.DIRECTION.FORWARD)
                    buf.Add(0);
                else
                    buf.Add(1);

                for (int i = 0; i < data.Length; i++)
                {
                    buf.AddRange(BitConverter.GetBytes(data[i]));
                }
                return buf.ToArray();
            }

            public virtual bool TryParse(byte[] value)
            {
                int cnt;
                return TryParse(value, out cnt);
            }

            public virtual bool TryParse(byte[] value, out int cnt)
            {
                cnt = 5;
                
                if (value.Length < cnt)
                    return false;
                int idx = 0;
                grid_start = BitConverter.ToUInt16(value, idx);
                idx += 2;
                int grid_end = BitConverter.ToUInt16(value, idx);
                idx += 2;
                if (value[idx] == 0)
                    direction = Misc.DIRECTION.FORWARD;
                else
                    direction = Misc.DIRECTION.BACKWARD;
                idx += 1;

                int len;
                len = grid_end - grid_start + 1;

                if (len < 0)
                    return false;
                cnt += len * 4;
                if (value.Length < cnt)
                    return false;

                data = new int[len];

                for (int i = 0; i < len; i++)
                {
                    data[i] = BitConverter.ToInt32(value, idx);
                    idx += 4;
                }
                return true;
            }

            #endregion
        }


        #region 带systick 的版本
        public class Pack_PushPos1_2 : Pack_PushPos1
        {
            public Int32 systick;
            #region IPack 成员

            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(base.ToBytes());
                buf.AddRange(BitConverter.GetBytes(systick));
                return buf.ToArray();
            }

            public override bool TryParse(byte[] value)
            {
                if (!base.TryParse(value))
                    return false;
                int idx = 8;
                int cnt = 8 + 4;
                if (value.Length < cnt)
                    return false;

                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }

            public bool TryParse_version(byte[] value, out int version)
            {
                version = 1;
                 if (!base.TryParse(value))
                    return false;
                int idx = 8;
                int cnt = 8 + 4;
                if (value.Length < cnt)
                    return true;
                version = 2;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;               
            }
            #endregion
        }

        public class Pack_PushIO_2 : Pack_PushIO
        {
            public UInt16 inChange;
            public Int32 pos1;
            public Int32 pos2;
            public Int32 systick;

            #region IPack 成员
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.AddRange(base.ToBytes());
                buf.AddRange(BitConverter.GetBytes(inChange));
                buf.AddRange(BitConverter.GetBytes(pos1));
                buf.AddRange(BitConverter.GetBytes(pos2));
                buf.AddRange(BitConverter.GetBytes(systick));
                return buf.ToArray();
            }

            public override bool TryParse(byte[] value)
            {
                if (!base.TryParse(value))
                    return false;
                int idx = 4;
                int cnt = 4 + 2 + 4 * 3;

                if (value.Length < cnt)
                    return false;

                inChange = BitConverter.ToUInt16(value, idx);
                idx += 2;
                pos1 = BitConverter.ToInt32(value, idx);
                idx += 4;
                pos2 = BitConverter.ToInt32(value, idx);
                idx += 4;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
            public bool TryParse_version(byte[] value, out int version) 
            {
                version = 1;
                if (!base.TryParse(value))
                    return false;
                int idx = 4;
                int cnt = 4 + 2 + 4 * 3;

                if (value.Length < cnt)
                    return true;
                version = 2;

                inChange = BitConverter.ToUInt16(value, idx);
                idx += 2;
                pos1 = BitConverter.ToInt32(value, idx);
                idx += 4;
                pos2 = BitConverter.ToInt32(value, idx);
                idx += 4;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;               
            }
            #endregion
        }
        public class Pack_PushPos2_2 : Pack_PushPos2
        {
            public Int32 systick;
            /// <summary>
            /// 20 byte
            /// </summary>
            /// <returns></returns>
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(base.ToBytes());
                buf.AddRange(BitConverter.GetBytes(systick));
                return buf.ToArray();
            }
            /// <summary>
            /// 20 byte
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public override bool TryParse(byte[] value)
            {
                if (!base.TryParse(value))
                    return false;
                int idx = 16;
                int cnt = 16 + 4;
                if (value.Length < cnt)
                    return false;

                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
            public bool TryParse_version(byte[] value, out int version)
            {
                version = 1;
                if (!base.TryParse(value))
                    return false;
                int idx = 16;
                int cnt = 16 + 4;
                if (value.Length < cnt)
                    return true;
                version = 2;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }

        public class Pack_PushTGrid_2 : Pack_PushTGrid
        {
            public Int32 systick = 0;
            #region IPack 成员

            /// <summary>
            /// 2+4*n+4
            /// </summary>
            /// <returns></returns>
            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(base.ToBytes());
                buf.AddRange(BitConverter.GetBytes(systick));

                return buf.ToArray();
            }
            /// <summary>
            /// 2+4*n+4
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public override bool TryParse(byte[] value)
            {

                int cnt;
                return TryParse(value, out cnt);
            }

            /// <summary>
            /// 2+4*n+4
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public override bool TryParse(byte[] value, out int cnt)
            {
                if (!base.TryParse(value,out cnt))
                    return false;

                int idx = cnt;

                cnt += 4;

                if (value.Length < cnt)
                    return false;

                systick = BitConverter.ToInt32(value, idx);
                idx += 4;

                return true;
            }
            public virtual bool TryParse_version(byte[] value, out int version)
            {
                version = 1;

                int cnt;

                if (!base.TryParse(value, out cnt))
                    return false;

                int idx = cnt;

                cnt += 4;

                if (value.Length < cnt)
                    return true;
                version = 2;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;

                return true;
            }
            #endregion
        }

        public class Pack_PushStatus_2 : Pack_PushStatus
        {
            //当前运行指令(1B)+当前运行状态(1B)+运行模式(1B)+  systick(4B) + 命令序列码(4B)

            public byte mode;
            public int systick;
            public Int32 marker;

            public override byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();

                buf.AddRange(base.ToBytes());
                buf.Add((byte)mode);
                buf.AddRange(BitConverter.GetBytes(systick));
                buf.AddRange(BitConverter.GetBytes(marker));
                return buf.ToArray();
            }

            public override bool TryParse(byte[] value)
            {
                if (!base.TryParse(value))
                    return false;
                int idx = 2;
                int cnt = 2 + 1 + 4 + 4;
                if (value.Length < cnt)
                    return false;
   
                mode = value[idx];
                idx++;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }

            public virtual bool TryParse_version(byte[] value, out int version)
            {
                version = 1;

                if (!base.TryParse(value))
                    return false;
                int idx = 2;
                int cnt = 2 + 1 + 4 + 4;
                if (value.Length < cnt)
                    return true;

                version = 2;
                mode = value[idx];
                idx++;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;
                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                return true;
            }
        }

        public class Pack_PushGrid_2 : Pack_PushGrid
        {
            public Int32 marker;

            public int systick;

            #region IPack 成员

            public byte[] ToBytes()
            {
               
                List<byte> buf = new List<byte>();

                buf.AddRange(base.ToBytes());

                buf.AddRange(BitConverter.GetBytes(marker));

                buf.AddRange(BitConverter.GetBytes(systick));

                return buf.ToArray();
            }
            public override bool TryParse(byte[] value) 
            {
                int cnt;
                return TryParse(value, out cnt);

            }
            public override bool TryParse(byte[] value, out int cnt)
            {
                if (!base.TryParse(value,out cnt))
                    return false;
                int idx = cnt;
                cnt += (4+4);

                if (value.Length < cnt)
                    return false;

                marker = BitConverter.ToInt32(value, idx);
                idx+=4;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;

                return true;
            }

            public virtual bool TryParse_version(byte[] value, out int version) 
            {
                version = 1;

                int cnt;

                if (!base.TryParse(value, out cnt))
                    return false;
                int idx = cnt;
                cnt += (4 + 4);

                if (value.Length < cnt)
                    return true;
                
                version = 2;

                marker = BitConverter.ToInt32(value, idx);
                idx += 4;
                systick = BitConverter.ToInt32(value, idx);
                idx += 4;

                return true;               
            }

            #endregion
        }
        #endregion

        #endregion

        #region PUSH
        // Add Sense Config: 000+00+sense_mask(4B)
        //sense_mask
        /// <summary>
        /// Pack_PushPos1
        /// </summary>
        public const UInt16 PUSH_POS1 = 0;//pos1(4B)+speed1(4B)

        /// <summary>
        /// Pack_PushAD1
        /// </summary>
        public const UInt16 PUSH_AD1 = 1;//AD1(4B)
        /// <summary>
        /// Pack_PushIO
        /// </summary>
        public const UInt16 PUSH_IO = 2;//Inport(2B)+outport(2B)

        /// <summary>
        /// Pack_PushPos2
        /// </summary>
        public const UInt16 PUSH_POS2 = 3;//pos2(4B)+段长1(4B)+段长2(4B)+speed2(4B)

        /// <summary>
        /// Pack_PushAD1
        /// </summary>
        public const UInt16 PUSH_AD2 = 4;//AD2(4B)

        /// <summary>
        /// Timegrid数据量N(2byte)+数据(N*4bytes)
        /// Pack_PushTGrid
        /// </summary>
        public const UInt16 PUSH_TIMEGRID = 5;

        public const UInt16 PUSH_GRID = 6;//开始grid(2byte)+结束grid(2byte)+grid方向(1byte)+gridAD*N(N*4byte)


        /// <summary>
        /// Pack_PushStatus
        /// </summary>
        public const UInt16 PUSH_STATUS = 7;//当前运行指令(1B)+当前运行状态(1B)
        /// <summary>
        /// Pack_PushGrid
        /// </summary>
        public const UInt16 PUSH_MINIGRID = 8;

        #endregion
    }
}