using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using FlyADBase;
namespace FLY.Simulation.Flyad7.OBJProxy
{
    /// <summary>
    /// 服务代理, Flyad7_OBJProxy 的一部分
    /// </summary>
    class SYS_DATA:FObj
    {
        FLYAD7 Data;
        public SYS_DATA(int objsys_idx, FLYAD7 data):base(objsys_idx)
        {
            ID = FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.ID;
            Data = data;
        }
        public override void GetValue(IFConn from, uint srcid, ushort memid, out byte[] infodata)
        {
            infodata = null;
            switch (memid) 
            {
                //case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.GET_IP:
                //    {
                //        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_IP pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_IP();
                //        pack.ep = Data.LocalEP;
                //        infodata = pack.ToBytes();

                //        return 0;
                //    }break;
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.GET_SYSINFO:
                    {
                        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_SysInfo pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_SysInfo();
                        pack.status = Data.AreaStatus;
                        pack.ret = Data.AreaRet;
                        Array.Copy(Data.Code,pack.code, pack.code.Length);
                        Array.Copy(Data.Access, pack.access, pack.access.Length);
                        pack.surplus = (UInt16)Data.Surplus;
                        infodata = pack.ToBytes();
                    }break;
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.GET_SYSPARAM:
                    {
                        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_SysParam pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_SysParam();
                        pack.posOfGrid = Data.PosOfGrid;
                        pack.ad1_interval = 1000;
                        pack.ad2_interval = 1000;
                        pack.push_interval = 100;

                        if (Data.MotorType == MOTORTYPE.NULL)
                            pack.func_enable = 0;
                        else if (Data.MotorType == MOTORTYPE.VF0)
                            pack.func_enable = 0x01;
                        else
                            pack.func_enable = 0x02;

                        pack.func_setting = 0;

                        pack.ratio01 = Data.Ratio01;
                        pack.ratio02 = Data.Ratio02;

                        infodata = pack.ToBytes();

                    } break;
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.GET_ZERO_POS:
                    {
                        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_ZeroPos pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_ZeroPos();
                        pack.zero_pos = Data.PosOffset;
                        pack.jog_velocity = Data.JogVelocity;
                        infodata = pack.ToBytes();

                    } break;
            }
        }
        public override void SetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
        {
            switch (memid)
            {
                //case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.SET_IP:
                //    {
                //        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_IP pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_IP();
                //        if (!pack.TryParse(infodata))
                //            break;
                //        Data.LocalEP = pack.ep;
                //        return 0;
                //    } break;
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.SET_SYSPARAM:
                    {
                        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_SysParam pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_SysParam();
                        if (!pack.TryParse(infodata))
                            break;
                        MOTORTYPE motortype;
                        if ((pack.func_enable & 0x03) == 0x02)
                            motortype = MOTORTYPE.SERVO;
                        else if ((pack.func_enable & 0x03) == 0x01)
                            motortype = MOTORTYPE.VF0;
                        else
                              motortype = MOTORTYPE.NULL;
                        Data.PosOfGrid = pack.posOfGrid;
                        Data.MotorType = motortype;
                        Data.Ratio01 = pack.ratio01;
                        Data.Ratio02 = pack.ratio02;
                        Data.Save();
                    } break;
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.SET_ZERO_POS:
                    {
                        FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_ZeroPos pack = new FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.Pack_ZeroPos();
                        if (!pack.TryParse(infodata))
                            break;
                        Data.PosOffset = pack.zero_pos;
                        Data.JogVelocity = pack.jog_velocity;
                        Data.Save();
                    } break;
            }
        }
        public override void  CallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] infodata)
        {
            switch (funcid) 
            {
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.CALL_ACCESS:
                    {
                        if (infodata.Length < 8)
                            break;

                        Data.SetAccess(infodata);


                    }break;
                case FLYAD7_OBJ_INTERFACE.SYS_DATA_INTERFACE.CALL_SURPLUS_SUB:
                    {
                        if (Data.Surplus!=UInt16.MaxValue && Data.Surplus!=0)
                            Data.Surplus--;

                    } break;
            }
        }
    }
}