連接狀態與進度列
點擊 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 來展示,並使用setMaximum 和 setMinimum 函式來設定進度列之最大與最小格。
以下代碼在 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 列舉中,ks 為 ksWorker 物件,若連接狀態為 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);
...........
}