連接狀態與進度列

點擊 Connect 後, KINGSTAR 子系統即開始連接到硬體,我們使用標籤與進度列 (Label and Progress Bar) 來顯示連接狀態,該標籤名稱為 statusLabel 而進度列名稱為 statusProgress

標籤:連結狀態

EtherCAT 連結有四種狀態:Init, Pre-Operational (Pre-Op), Safe-Operational (Safe-Op), Operational (Op),當狀態為 Op,則連結及建立,欲在連接時顯示這些狀態,我們使用 getecState 以獲取 EtherCAT 連結的狀態,點選 Connect 後程式將檢查 EtherCAT 連結是否為,statusLabel 透過 setText 反映對應的狀態。

以下代碼在 QtGui.cpp 中:

void QtGui::btnConnectClicked()
{
   int Timeout = 0;

   ui->btnConnect->setEnabled(false);

   if (ks->getwkState() == disconnected)
   {
      statusProgress->setMaximum(0);
      statusProgress->setMinimum(0);

      while (ks->getecState() != ecatOP && Timeout < 2000)
      {
         ...........

         if (ks->getecState() == ecatInit) statusLabel->setText("EC state: Init");

         if (ks->getecState() == ecatPreOP) statusLabel->setText("EC state: PreOP");

         if (ks->getecState() == ecatSafeOP) statusLabel->setText("EC state: SafeOP");

         Timeout++;

         Sleep(100);
      }
      ...........
      statusLabel->setText("EC state: OP");
      ...........
   }
   else
   {
      ...........
   }
   ...........
}

進度列:連接進度

進度列展示需長時間完成的進度,在 Qt 中可使用 setStyleSheet 自訂其邊界、塊及文字校準,以決定完成百分比的文字是否應使用 setTextVisible 來展示,並使用setMaximumsetMinimum 函式來設定進度列之最大與最小格。

以下代碼在 QtGui.cpp 中:

statusProgress->setTextVisible(false);
statusProgress->setMaximum(100);
statusProgress->setMinimum(0);
statusProgress->setStyleSheet(          \
   "QProgressBar {                      \
      border: 2px solid grey;           \
      border-radius: 5px;               \
      text-align: center;               \
   }                                    \
                                        \
   QProgressBar::chunk {                \
      background-color: #16A0C0;        \
      width: 10px;                      \
      margin: 0.5px;                    \
}");

點選 Connect 後, getwkState 將回傳 wkState 以偵測連接狀態,在 ksworker.h 中,連接狀態定義於 workerState 列舉中,ksksWorker 物件,若連接狀態為 disconnected,則進度列之最大與最小格為零。

以下代碼在 ksworker.cpp 中:

workerState ksWorker::getwkState()
{
   return wkState;
}

以下代碼在 QtGui.cpp 中:

void QtGui::btnConnectClicked()
{
   ...........
   if (ks->getwkState() == disconnected)
   {
      statusProgress->setMaximum(0);
      statusProgress->setMinimum(0);
   }
   ...........
}

EtherCAT 狀態變為 Op 後,進度列的最大格將設為 100,我們使用 setValue 來將進度列之當前值設為 100。

以下代碼在 QtGui.cpp 中:

statusLabel->setText("EC state: OP");
statusProgress->setMaximum(100);
statusProgress->setValue(100);

EtherCAT 狀態非為 Op,進度列之當前值將設為零。

else
{
   ...........
   statusProgress->setValue(0);
   ...........
}