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

namespace FLY.FeedbackRenZiJia.OBJ_INTERFACE
{
    public class HEATCELL_OBJ_INTERFACE
    {
        #region pack
        public class Pack_Params : IPack
        {
            public double kp;
            public double autoONoKp;
            public double thresholdHeatSigma;
            public bool isAutoONo;
            public bool isForbidUpDown;
            public bool isBreakUpMode;
            public int ctrlLine;
            #region IPack 成员

            public byte[] ToBytes()
            {
                List<byte> buf = new List<byte>();
                buf.AddRange(BitConverter.GetBytes(kp));
                buf.AddRange(BitConverter.GetBytes(autoONoKp));
                buf.AddRange(BitConverter.GetBytes(thresholdHeatSigma));
                buf.AddRange(BitConverter.GetBytes(ctrlLine));
                buf.AddRange(BitConverter.GetBytes(isAutoONo));
                buf.AddRange(BitConverter.GetBytes(isForbidUpDown));
                buf.AddRange(BitConverter.GetBytes(isBreakUpMode));
                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < (8*3+4+3))
                    return false;

                int idx = 0;
                kp = BitConverter.ToDouble(value, idx);
                idx += 8;
                autoONoKp = BitConverter.ToDouble(value, idx);
                idx += 8;
                thresholdHeatSigma = BitConverter.ToDouble(value, idx);
                idx += 8;
                ctrlLine = BitConverter.ToInt32(value, idx);
                idx += 4;
                isAutoONo = BitConverter.ToBoolean(value, idx);
                idx += 1;
                isForbidUpDown = BitConverter.ToBoolean(value, idx);
                idx += 1;
                isBreakUpMode = BitConverter.ToBoolean(value, idx);
                idx += 1;
                return true;
            }

            #endregion
        }
        public class Pack_Status : IPack
        {
            public bool isInAutoONo;
            public double maxHeatSigma;


            #region IPack 成员

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

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

                return buf.ToArray();
            }

            public bool TryParse(byte[] value)
            {
                if (value.Length < (1 + 8))
                    return false;
                int idx = 0;
                isInAutoONo = BitConverter.ToBoolean(value, idx);
                idx += 1;

                maxHeatSigma = BitConverter.ToDouble(value, idx);
                idx += 8;

                return true;
            }

            #endregion
        }

        public class Pack_CallSmoothRequest : IPack
        {
            public double thresholdHeatSigma;
            #region IPack 成员

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

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

                int idx = 0;

                thresholdHeatSigma = BitConverter.ToDouble(value, idx);
                idx += 8;
                return true;
            }

            #endregion
        }

        public class Pack_Frame : IPack
        {
            public int[] frame;

            #region IPack 成员

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

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

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

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

                frame = new int[len];
                for (int i = 0; i < len; i++)
                {
                    frame[i] = BitConverter.ToInt32(value, idx);
                    idx += 4;
                    if (idx > value.Length)
                        return false;
                }
                return true;
            }

            #endregion
        }
        public class Pack_ModifyHeatOffset : IPack
        {
            public int index;
            public int heatoffset;
            #region IPack 成员

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

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

            #endregion
        }
        public class Pack_ModifyBase : IPack
        {
            public int change;

            #region IPack 成员

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

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

            #endregion
        }

        #endregion

        #region Get
        /// <summary>
        /// Pack_Params
        /// </summary>
        public const UInt16 GET_PARAMS = 1;//参数
        /// <summary>
        /// Pack_Status
        /// </summary>
        public const UInt16 GET_STATE = 2;

        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 GET_THICKS = 4;
        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 GET_HEATS = 5;

        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 GET_OFFSETS = 6;

        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 GET_PREHEATS = 7;

        #endregion

        #region Set
        /// <summary>
        /// Pack_Params
        /// </summary>
        public const UInt16 SET_PARAMS = 1;//参数
        #endregion

        #region Call

        public const UInt16 CALL_HEATAPPLY = 1;

        public const UInt16 CALL_CAL = 2;


        /// <summary>
        /// Pack_ModifyHeatOffset
        /// </summary>
        public const UInt16 CALL_MODIFYHEATOFFSET = 3;

        /// <summary>
        /// Pack_BaseHeatOffset
        /// </summary>
        public const UInt16 CALL_MODIFYBASE = 4;

        public const UInt16 CALL_CLEARHEATOFFSETS = 5;
        public const UInt16 CALL_CLEARHEATS = 6;


        /// <summary>
        /// request:Pack_CallSmoothRequest
        /// reponse:NULL
        /// </summary>
        public const UInt16 CALL_SMOOTH = 9;


        #endregion

        #region Push
        /// <summary>
        /// Pack_Params
        /// </summary>
        public const UInt16 PUSH_PARAMS = 1;//参数
        /// <summary>
        /// Pack_Status
        /// </summary>
        public const UInt16 PUSH_STATE = 2;


        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 PUSH_THICKS = 4;
        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 PUSH_HEATS = 5;

        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 PUSH_OFFSETS = 6;

        /// <summary>
        /// Pack_Frame
        /// </summary>
        public const UInt16 PUSH_PREHEATS = 7;

        #endregion

    }
}