Gurux.DLMS.GXDLMS.HandleGbt C# (CSharp) Method

HandleGbt() private static method

Handle General block transfer message.
private static HandleGbt ( GXDLMSSettings settings, GXReplyData data ) : void
settings GXDLMSSettings DLMS settings.
data GXReplyData
return void
        private static void HandleGbt(GXDLMSSettings settings, GXReplyData data)
        {
            data.Gbt = true;
            int index = data.Data.Position - 1;
            byte ch = data.Data.GetUInt8();

            //Is streaming active.
            bool streaming = (ch & 0x40) == 1;
            byte window = (byte)(ch & 0x3F);
            //Block number.
            byte bn = data.Data.GetUInt8();
            //Block number acknowledged.
            byte bna = data.Data.GetUInt8();
            // Get APU tag.
            if (data.Data.GetUInt8() != 0)
            {
                throw new Exception("Invalid APU.");
            }
            // Get Addl tag.
            if (data.Data.GetUInt8() != 0)
            {
                throw new Exception("Invalid APU.");
            }
            data.Command = Command.None;
            if (window != 0)
            {
                int len = GXCommon.GetObjectCount(data.Data);
                if (len != data.Data.Size - data.Data.Position)
                {
                    data.IsComplete = false;
                    return;
                }
            }
            GetDataFromBlock(data.Data, index);
            GetPdu(settings, data);
            //Is Last block,
            if ((ch & 0x80) == 0)
            {
                data.MoreData |= RequestTypes.DataBlock;
            }
            else
            {
                data.MoreData &= ~RequestTypes.DataBlock;
            }
            // Get data if all data is read or we want to peek data.
            if (data.Data.Position != data.Data.Size
                    && (data.Command == Command.ReadResponse
                        || data.Command == Command.GetResponse)
                    && (data.MoreData == RequestTypes.None
                        || data.Peek))
            {
                data.Data.Position = 0;
                GetValueFromData(settings, data);
            }
        }