ObjA_OBJProxy.cs 4.92 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
using FObjBase;
using FObjSysTest.IService;
using FObjSysTest.OBJ_INTERFACE;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FObjSysTest.Server.OBJProxxy
{
    public class ObjA_OBJProxy : FObj
    {
        #region 延时推送 MARKNO
        const int MARKNO_PUSH_PARAMS = 1;
        const int MARKNO_PUSH_STATUS = 2;
        #endregion

        IObjAService objAService;
        public ObjA_OBJProxy(int objsys_idx, UInt32 objid, IObjAService objAService) : base(objsys_idx)
        {
            ID = objid;
            this.objAService = objAService;

            this.objAService.PropertyChanged += ObjAService_PropertyChanged;
        }

        private void ObjAService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Now")
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate ()
                    {
                        byte[] buf;
                        GetValue(null, 0, OBJA_OBJ_INTERFACE.GET_STATUS, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, OBJA_OBJ_INTERFACE.PUSH_STATUS,
                            buf);
                    }), this, MARKNO_PUSH_STATUS);
            }
            else if (e.PropertyName == "Numbers")
            {
                FObjBase.PollModule.Current.Poll_JustOnce(
                    new PollModule.PollHandler(delegate ()
                    {
                        byte[] buf;
                        GetValue(null, 0, OBJA_OBJ_INTERFACE.GET_PARAMS, out buf);
                        CurrObjSys.PushObjInfoEx(
                            this, OBJA_OBJ_INTERFACE.PUSH_PARAMS,
                            buf);
                    }), this, MARKNO_PUSH_PARAMS);
            }
        }

        #region FObj
        public override void ConnectNotify(IFConn from)
        {
            Console.WriteLine($"from.IsConnected={from.IsConnected}");
        }
        public override void GetValue(IFConn from, uint srcid, ushort memid, out byte[] infodata)
        {
            infodata = null;
            switch (memid)
            {
                case OBJA_OBJ_INTERFACE.GET_STATUS:
                    {
                        var p = new OBJA_OBJ_INTERFACE.Pack_Status()
                        {
                            now = objAService.Now
                        };
                        string json = JsonConvert.SerializeObject(p);

                        infodata = Misc.Converter.StringToBytes(json);
                    }break;
                case OBJA_OBJ_INTERFACE.GET_PARAMS:
                    {
                        var p = new OBJA_OBJ_INTERFACE.Pack_Params()
                        {
                            numbers = objAService.Numbers
                        };
                        string json = JsonConvert.SerializeObject(p);

                        infodata = Misc.Converter.StringToBytes(json);
                    }
                    break;
            }
        }
        public override void SetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
        {
            switch (memid)
            {
                case OBJA_OBJ_INTERFACE.SET_PARAMS:
                    {
                        string json = Misc.Converter.BytesToString(infodata);
                        var p = JsonConvert.DeserializeObject<OBJA_OBJ_INTERFACE.Pack_Params>(json);
                        objAService.Numbers = p.numbers;
                    }
                    break;
            }
        }
        public override void CallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] infodata)
        {
            switch (funcid)
            {
                case OBJA_OBJ_INTERFACE.CALL_GETNUMBERS:
                    {
                        string json = Misc.Converter.BytesToString(infodata);
                        var request = JsonConvert.DeserializeObject<Pack_CallGetNumbersRequest>(json);
                        objAService.GetNumbers(request.offset,
                            (asyncState, retdata) =>
                            {
                                var connContext = asyncState as ConnContext;
                                string json_reponse = JsonConvert.SerializeObject(retdata);
                                CurrObjSys.PushCallFunctionEx(
                                    connContext.from,
                                    connContext.srcid,
                                    ID,
                                    connContext.magic,
                                    OBJA_OBJ_INTERFACE.CALL_GETNUMBERS,
                                    Misc.Converter.StringToBytes(json_reponse));

                            }, new ConnContext(from, srcid, magic));
                    }
                    break;
            }
        }
        #endregion
    }
}