Esempio 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    = Client.GetDataFromPacket(reply, ref allData);
            int          maxProgress = Client.GetMaxProgressStatus(allData);

            while (moredata != 0)
            {
                while ((moredata & RequestTypes.Frame) != 0)
                {
                    data  = Client.ReceiverReady(RequestTypes.Frame);
                    reply = ReadDLMSPacket(data);
                    RequestTypes tmp = Client.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     = Client.ReceiverReady(RequestTypes.DataBlock);
                    reply    = ReadDLMSPacket(data);
                    moredata = Client.GetDataFromPacket(reply, ref allData);
                    if (!Trace)
                    {
                        Console.Write("+");
                    }
                }
            }
            return(allData);
        }
        /// <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>
        internal byte[] ReadDataBlock(byte[] data, string text, double multiplier)
        {
            if (Parent.InactivityMode == InactivityMode.ReopenActive && Media is GXSerial && DateTime.Now.Subtract(ConnectionStartTime).TotalSeconds > 40)
            {
                Parent.Disconnect();
                Parent.InitializeConnection();
            }
            GXLogWriter.WriteLog(text, data);
            byte[]       reply    = ReadDLMSPacket(data);
            byte[]       allData  = null;
            RequestTypes moredata = m_Cosem.GetDataFromPacket(reply, ref allData);

            if (OnDataReceived != null)
            {
                OnDataReceived(this, (byte[])allData);
            }
            if ((moredata & (RequestTypes.Frame | RequestTypes.DataBlock)) != 0)
            {
                int maxProgress = m_Cosem.GetMaxProgressStatus(allData);
                NotifyProgress(text, 1, maxProgress);
                while (moredata != 0)
                {
                    while ((moredata & RequestTypes.Frame) != 0)
                    {
                        data = m_Cosem.ReceiverReady(RequestTypes.Frame);
                        GXLogWriter.WriteLog("Get next frame: ", (byte[])data);
                        reply = ReadDLMSPacket(data);
                        RequestTypes tmp = m_Cosem.GetDataFromPacket(reply, ref allData);
                        if (OnDataReceived != null)
                        {
                            OnDataReceived(this, (byte[])allData);
                        }
                        //If this was last frame.
                        if ((tmp & RequestTypes.Frame) == 0)
                        {
                            moredata &= ~RequestTypes.Frame;
                            break;
                        }
                        int current = m_Cosem.GetCurrentProgressStatus(allData);
                        //TODO: System.Diagnostics.Debug.Assert(!(current == maxProgress && moredata != RequestTypes.None));
                        NotifyProgress(text, (int)(multiplier * current), maxProgress);
                    }
                    if (Parent.InactivityMode == InactivityMode.ReopenActive && Media is GXSerial && DateTime.Now.Subtract(ConnectionStartTime).TotalSeconds > 40)
                    {
                        Parent.Disconnect();
                        Parent.InitializeConnection();
                    }
                    if ((moredata & RequestTypes.DataBlock) != 0)
                    {
                        //Send Receiver Ready.
                        data = m_Cosem.ReceiverReady(RequestTypes.DataBlock);
                        GXLogWriter.WriteLog("Get Next Data block: ", (byte[])data);
                        reply    = ReadDLMSPacket(data);
                        moredata = m_Cosem.GetDataFromPacket(reply, ref allData);
                        if (OnDataReceived != null)
                        {
                            OnDataReceived(this, (byte[])allData);
                        }
                        int current = m_Cosem.GetCurrentProgressStatus(allData);
                        //TODO: System.Diagnostics.Debug.Assert(!(current == maxProgress && moredata != RequestTypes.None));
                        NotifyProgress(text, (int)(multiplier * current), maxProgress);
                    }
                }
            }
            return(allData);
        }