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);
}
}