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

ReceiverReady() static private method

Generates an acknowledgment message, with which the server is informed to send next packets.
static private ReceiverReady ( GXDLMSSettings settings, RequestTypes type ) : byte[]
settings GXDLMSSettings
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];
        }

Usage Example

Ejemplo n.º 1
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);
        }