static private ReceiverReady ( |
||
settings | ||
type | RequestTypes | /// Frame type. /// |
return | byte[] |
internal static byte[] ReceiverReady(GXDLMSSettings settings, RequestTypes type)
{
if (type == RequestTypes.None)
{
throw new ArgumentException("Invalid receiverReady RequestTypes parameter.");
}
// Get next frame.
if ((type & RequestTypes.Frame) != 0)
{
byte id = settings.ReceiverReady();
return GetHdlcFrame(settings, id, null);
}
Command cmd;
if (settings.UseLogicalNameReferencing)
{
if (settings.IsServer)
{
cmd = Command.GetResponse;
}
else
{
cmd = Command.GetRequest;
}
}
else
{
if (settings.IsServer)
{
cmd = Command.ReadResponse;
}
else
{
cmd = Command.ReadRequest;
}
}
// Get next block.
GXByteBuffer bb = new GXByteBuffer(6);
if (settings.UseLogicalNameReferencing)
{
bb.SetUInt32(settings.BlockIndex);
}
else
{
bb.SetUInt16((UInt16)settings.BlockIndex);
}
settings.IncreaseBlockIndex();
byte[][] reply;
if (settings.UseLogicalNameReferencing)
{
GXDLMSLNParameters p = new GXDLMSLNParameters(settings, cmd, (byte)GetCommandType.NextDataBlock, bb, null, 0xff);
reply = GXDLMS.GetLnMessages(p);
}
else
{
GXDLMSSNParameters p = new GXDLMSSNParameters(settings, cmd, 1, (byte)VariableAccessSpecification.BlockNumberAccess, bb, null);
reply = GXDLMS.GetSnMessages(p);
}
return reply[0];
}
/// <summary> /// Read data block from the device. /// </summary> /// <param name="data">data to send</param> /// <param name="text">Progress text.</param> /// <param name="multiplier"></param> /// <returns>Received data.</returns> public byte[] ReadDataBlock(byte[] data) { byte[] reply = ReadDLMSPacket(data); byte[] allData = null; RequestTypes moredata = m_Parser.GetDataFromPacket(reply, ref allData); int maxProgress = m_Parser.GetMaxProgressStatus(allData); while (moredata != 0) { while ((moredata & RequestTypes.Frame) != 0) { data = m_Parser.ReceiverReady(RequestTypes.Frame); reply = ReadDLMSPacket(data); RequestTypes tmp = m_Parser.GetDataFromPacket(reply, ref allData); if (!Trace) { Console.Write("-"); } //If this was last frame. if ((tmp & RequestTypes.Frame) == 0) { moredata &= ~RequestTypes.Frame; break; } } if ((moredata & RequestTypes.DataBlock) != 0) { //Send Receiver Ready. data = m_Parser.ReceiverReady(RequestTypes.DataBlock); reply = ReadDLMSPacket(data); moredata = m_Parser.GetDataFromPacket(reply, ref allData); if (!Trace) { Console.Write("+"); } } } return(allData); }