Exemplo n.º 1
0
        /// <summary>
        /// Conturctor
        /// </summary>
        /// <param name="Request"><see cref="RequestTask"/></param>
        /// <param name="HandleSendReq"><see cref="HandleSendRequestDelegate"/> callback</param>
        public RequestWorker(RequestTask ReqTask, HandleSendRequestDelegate HandleSendReq)
        {
            m_RequestTask   = ReqTask;
            m_HandleSendReq = HandleSendReq;

            // create the background worker and progress bar form
            m_worker = new BackgroundWorker();
            m_worker.WorkerSupportsCancellation = true;
            m_worker.DoWork             += new DoWorkEventHandler(this.Work);
            m_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.WorkCompleted);
            m_Progress = new ProgressForm(m_worker);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Callback from the SendHartRequest() to send HART-IP request.
        /// </summary>
        /// <param name="ReqTask"><see cref="RequestTask"/></param>
        private void HandleSendHARTIPRequest(RequestTask ReqTask)
        {
            if (m_HartIPConn == null)
            {
                throw new ArgumentException("No Network connection.");
            }

            do
            {
                // send the request in the RequestTask
                ReqTask.HartIPRsp = SendRequest(ReqTask.HartIPReq);
                Logger.Log(ReqTask.HartIPRsp.ToString());

                // check if it need retries
                if ((ReqTask.HartIPRsp != null) &&
                    ((ReqTask.HartIPRsp.ResponseCode == HARTIPMessage.RSP_DR_INITIATE) ||
                     (ReqTask.HartIPRsp.ResponseCode == HARTIPMessage.RSP_DR_CONFLICT) ||
                     (ReqTask.HartIPRsp.ResponseCode == HARTIPMessage.RSP_DR_RUNNING) ||
                     (ReqTask.HartIPRsp.ResponseCode == HARTIPMessage.RSP_DEVICE_BUSY)))
                {
                    // increment the current retry value
                    ReqTask.nDrRetries += 1;

                    // if done the retries, send the flush dr cmd to gateway
                    if (ReqTask.nDrRetries >= ReqTask.nNumberOfRetries)
                    {
                        ReqTask.bIsCompleted = true;
                        SendFlushDrCmd();
                        break;
                    }

                    // double the retry delay value if the delay interval is not exceed DrDelayBaseMax
                    if ((ReqTask.nDrRetries > 1) &&
                        (ReqTask.nRetryDelay < m_nDrRetryDelay))
                    {
                        ReqTask.nRetryDelay *= 2;
                    }

                    if (ReqTask.nRetryDelay > m_nDrRetryDelay)
                    {
                        ReqTask.nRetryDelay = m_nDrRetryDelay;
                    }
                }
                else
                {
                    ReqTask.bIsCompleted = true;
                }
            } while (false);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Send a Hart Request and it handles Delay Retry.
        /// If no more dr retry, it sends nerwork HART device a flush Dr cmd.
        /// </summary>
        /// <param name="Request"><see cref="HartIPRequest"/></param>
        /// <returns><see cref="HartIPResponse"/></returns>
        public HartIPResponse SendHartRequest(HartIPRequest Request)
        {
            HartIPResponse Rsp = null;

            if (Request == null)
            {
                throw new ArgumentException("HartIPRequest is null");
            }

            if ((m_HartIPConn == null) || !m_HartIPConn.IsConnected)
            {
                throw new Exception("Call Connect to initialize the network connection first.");
            }

            lock (SyncRoot)
            {
                m_Error = String.Empty;

                // send the first request
                Rsp = SendRequest(Request);

                if (Rsp != null)
                {
                    Logger.Log(Rsp.ToString());
                }

                if ((Rsp != null) &&
                    ((Rsp.ResponseCode == HARTIPMessage.RSP_DR_INITIATE) ||
                     (Rsp.ResponseCode == HARTIPMessage.RSP_DR_CONFLICT) ||
                     (Rsp.ResponseCode == HARTIPMessage.RSP_DR_RUNNING) ||
                     (Rsp.ResponseCode == HARTIPMessage.RSP_DEVICE_BUSY)))
                {
                    if (m_nDrRetries > 0)
                    {
                        Rsp = null;
                        // Create a request task to store the request and retries values.
                        RequestTask ReqTask = new RequestTask(Request, m_nDrRetries,
                                                              m_nDrRetryDelay);

                        // Create a request worker to do the task with the callback to handles the retries.
                        RequestWorker ReqWorker = new RequestWorker(ReqTask,
                                                                    new RequestWorker.HandleSendRequestDelegate(HandleSendHARTIPRequest));
                        try
                        {
                            // start the task
                            ReqWorker.Perform();
                            Rsp = ReqTask.HartIPRsp;
                        }
                        catch (UserCancelException)
                        {
                            // user canceled action
                            m_Error = "User canceled sending retries command.";
                        }
                    }
                    else
                    {
                        SendFlushDrCmd();
                    }
                }
            }

//           if (Rsp.Command == 77)
//           { // unwrap the HART PDU in the response data
//                 Rsp
//           }

            return(Rsp);
        }