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

namespace FLY.Thick.Base.OBJ_INTERFACE
{
    public class SCANCORR_OBJ_INTERFACE
    {

        #region Pack
        public class Pack_GetState : IPack
        {
            public int progress;
            public bool ing;

            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(progress));
                buf.AddRange(BitConverter.GetBytes(ing));

                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                int index = 0;
                progress = BitConverter.ToInt32(value, index);
                index += 4;
                ing = BitConverter.ToBoolean(value, index);
                index += 1;
                return true;
            }

            #endregion
        }
        public class Pack_ValidRange : IPack 
        {
            public int begin;
            public int end;
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(begin));
                buf.AddRange(BitConverter.GetBytes(end));

                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < 8)
                    return false;
                int index = 0;
                begin = BitConverter.ToInt32(value, index);
                index += 4;
                end = BitConverter.ToInt32(value, index);
                index += 4;
                return true;
            }

            #endregion
        }
        public class Pack_StartParams : IPack 
        {
            public int scantimer;
            public int smoothfactor;
            public int posofgrid;
            public int poslen;
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(scantimer));
                buf.AddRange(BitConverter.GetBytes(smoothfactor));
                buf.AddRange(BitConverter.GetBytes(posofgrid));
                buf.AddRange(BitConverter.GetBytes(poslen));

                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < 16)
                    return false;
                int index = 0;
                scantimer = BitConverter.ToInt32(value, index);
                index += 4;
                smoothfactor = BitConverter.ToInt32(value, index);
                index += 4;
                posofgrid  = BitConverter.ToInt32(value, index);
                index += 4;
                poslen = BitConverter.ToInt32(value, index);
                index += 4;
                return true;
            }

            #endregion

        }
        public class Pack_Enable : IPack
        {
            public bool enable;

            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(enable));

                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                int index = 0;
                enable = BitConverter.ToBoolean(value, index);
                index += 1;
                return true;
            }

            #endregion

        }
        public class Pack_Data : IPack
        {
            public List<int> data;

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(data.Count()));
                for (int i = 0; i < data.Count(); i++) 
                {
                    buf.AddRange(BitConverter.GetBytes(data[i]));
                }
                return buf.ToArray();
            }

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

                int len = BitConverter.ToInt32(value, idx);
                idx += 4;
                cnt += len * 4;
                if(value.Length<cnt)
                    return false;

                if (data == null)
                    data = new List<int>();

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

                return true;
            }
        }
        public class Pack_GroupParams : IPack 
        {
            public int avgad0;
            public int avgad1;

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

            public bool TryParse(byte[] value)
            {
                if (value.Length <8)
                    return false;
                int index = 0;
                avgad0 = BitConverter.ToInt32(value, index);
                index += 4;
                avgad1 = BitConverter.ToInt32(value, index);
                index += 4;
                return true;
            }
        }
        public class Pack_CallStart : IPack
        {
            public int scantimer;
            public int smoothfactor;
            public int groupindex;

            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(scantimer));
                buf.AddRange(BitConverter.GetBytes(smoothfactor));
                buf.AddRange(BitConverter.GetBytes(groupindex));

                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                int index = 0;
                scantimer = BitConverter.ToInt32(value, index);
                index += 4;
                smoothfactor = BitConverter.ToInt32(value, index);
                index += 4;
                groupindex = BitConverter.ToInt32(value, index);
                index += 4;
                return true;
            }

            #endregion
        }
        
        #endregion
        #region GetValue
        /// <summary>
        /// Pack_GetState
        /// </summary>
        public const UInt16 GET_PROGRESS = 1;
        /// <summary>
        /// Pack_Enable
        /// </summary>
        public const UInt16 GET_ENABLE = 2;
        /// <summary>
        /// Pack_StartParams
        /// </summary>
        public const UInt16 GET_START_PARAMS = 3;
        /// <summary>
        /// Pack_GroupParams
        /// </summary>
        public const UInt16 GET_GROUP_PARAMS = 4;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 GET_GROUP0_FORW = 5;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 GET_GROUP0_BACKW = 6;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 GET_GROUP1_FORW = 7;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 GET_GROUP1_BACKW = 8;

        /// <summary>
        /// Pack_ValidRange
        /// </summary>
        public const UInt16 GET_VALIDRANGE = 9;
        #endregion

        #region SetValue
        /// <summary>
        /// Pack_Enable
        /// </summary>
        public const UInt16 SET_ENABLE = 2;

        /// <summary>
        /// Pack_ValidRange
        /// </summary>
        public const UInt16 SET_VALIDRANGE = 9;
        #endregion
        
        #region CallFunction
        /// <summary>
        /// Pack_CallStart
        /// </summary>
        public const UInt16 CALL_START = 1;

        /// <summary>
        /// Pack_int
        /// </summary>
        public const UInt16 CALL_CLEAR = 2;

        /// <summary>
        /// Pack_CallStart
        /// </summary>
        public const UInt16 CALL_SMOOTH = 3;
        #endregion
        #region PushInfo
        /// <summary>
        /// Pack_GetState
        /// </summary>
        public const UInt16 PUSH_PROGRESS = 1;
        public const UInt16 PUSH_ENABLE = 2;
        public const UInt16 PUSH_START_PARAMS = 3;
        /// <summary>
        /// Pack_GroupParams
        /// </summary>
        public const UInt16 PUSH_GROUP_PARAMS = 4;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 PUSH_GROUP0_FORW = 5;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 PUSH_GROUP0_BACKW = 6;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 PUSH_GROUP1_FORW = 7;
        /// <summary>
        /// Pack_Data
        /// </summary>
        public const UInt16 PUSH_GROUP1_BACKW = 8;

        /// <summary>
        /// Pack_ValidRange
        /// </summary>
        public const UInt16 PUSH_VALIDRANGE = 9;
        #endregion

    }
}
