/// <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); }
/// <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); }
/// <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); }