private static void HandleReadBlockNumberAccess(GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
UInt16 blockNumber = data.GetUInt16();
if (xml != null)
{
xml.AppendStartTag(Command.ReadRequest, VariableAccessSpecification.BlockNumberAccess);
xml.AppendLine("<BlockNumber Value=\"" + xml.IntegerToHex(blockNumber, 4) + "\" />");
xml.AppendEndTag(Command.ReadRequest, VariableAccessSpecification.BlockNumberAccess);
return;
}
if (blockNumber != settings.BlockIndex)
{
GXByteBuffer bb = new GXByteBuffer();
Debug.WriteLine("handleReadRequest failed. Invalid block number. " + settings.BlockIndex + "/" + blockNumber);
bb.SetUInt8(ErrorCode.DataBlockNumberInvalid);
GXDLMS.GetSNPdu(new GXDLMSSNParameters(settings, Command.ReadResponse, 1, (byte)SingleReadResponse.DataAccessError, bb, null), replyData);
settings.ResetBlockIndex();
return;
}
if (settings.Index != settings.Count && server.transaction.data.Size < settings.MaxPduSize)
{
List<ValueEventArgs> reads = new List<ValueEventArgs>();
List<ValueEventArgs> actions = new List<ValueEventArgs>();
foreach (ValueEventArgs it in server.transaction.targets)
{
if (it.action)
{
actions.Add(it);
}
else
{
reads.Add(it);
}
}
if (reads.Count != 0)
{
server.NotifyRead(reads.ToArray());
}
if (actions.Count != 0)
{
server.NotifyAction(actions.ToArray());
}
GetReadData(settings, server.transaction.targets, server.transaction.data);
}
settings.IncreaseBlockIndex();
GXDLMSSNParameters p = new GXDLMSSNParameters(settings, Command.ReadResponse, 1,
(byte)SingleReadResponse.DataBlockResult, null, server.transaction.data);
p.multipleBlocks = true;
GXDLMS.GetSNPdu(p, replyData);
//If all data is sent.
if (server.transaction.data.Size == server.transaction.data.Position)
{
server.transaction = null;
settings.ResetBlockIndex();
}
else
{
server.transaction.data.Trim();
}
}