feat: Add water process in GUI.

This commit is contained in:
sunwen
2025-03-04 11:04:57 +08:00
parent 7c66abb72d
commit a461a4399b
18 changed files with 1233 additions and 149 deletions

View File

@@ -19,6 +19,8 @@
#include "dicom/WorkListManager.h"
#include "components/CoordinateXYWidget.h"
#include "components/CoordinateZWidget.h"
#include "components/WaveWidget.h"
#include "components/ZFlashWidget.h"
#include "utilities/ScanProcessSequence.h"
#include "dicom/MPPSManager.h"
@@ -34,6 +36,8 @@ const size_t PREVIEW_COL = 140;
const float PIXEL_SPACING = 1.5f;
const float HALF_ROI_WIDTH = 100.0f;
const unsigned int DRAINAGE_TIME = 180000; // 3 minitues
const unsigned int WATERFLOOD_TIME = 180000; // 3 minitues
const unsigned int WATERCLEAN_TIME = 180000; // 3 minitues
}
ScanFormWidget::ScanFormWidget(QWidget* parent)
@@ -43,10 +47,19 @@ ScanFormWidget::ScanFormWidget(QWidget* parent)
, mShutdownButton(new QToolButton(this))
, mStartScanButton(new QToolButton(this))
, mDrainageButton(new QToolButton(this))
, mXYLabel(new CoordinateXYWidget(this))
, mZLabel(new CoordinateZWidget(this))
, mWaterfloodButton(new QToolButton(this))
, mCleanButton(new QToolButton(this))
//, mXYLabel(new CoordinateXYWidget(this))
, mZLabel(new ZFlashWidget(this))
, mWaveWidget(new WaveWidget(this))
, mScanProcessLabel(new QLabel(this))
, mDrainageTimer(new QTimer(this))
, mWaterfloodTimer(new QTimer(this))
, mWaterCleanTimer(new QTimer(this))
, mFlashLayoutWidget(new QWidget(this))
, mWaterProcessMode()
, mWaterCleanStep()
, mIsWaterProcessing(false)
{
auto commandlayout = new QHBoxLayout(ui->commandWidget);
@@ -59,7 +72,23 @@ ScanFormWidget::ScanFormWidget(QWidget* parent)
mDrainageTimer->setSingleShot(true);
connect(mDrainageTimer, &QTimer::timeout, this, [this]()
{
mDrainageButton->click();
finishWaterPorcess(DrainageMode);
QString message = tr("Drainage time out");
EventCenter::Default()->triggerEvent(GUIEvents::GUIErrorRaise, nullptr, (QObject*)&message);
});
mWaterfloodTimer->setSingleShot(true);
connect(mWaterfloodTimer, &QTimer::timeout, this, [this]()
{
finishWaterPorcess(WaterFloodMode);
QString message = tr("Waterflood time out");
EventCenter::Default()->triggerEvent(GUIEvents::GUIErrorRaise, nullptr, (QObject*)&message);
});
mWaterCleanTimer->setSingleShot(true);
connect(mWaterCleanTimer, &QTimer::timeout, this, [this]()
{
finishWaterPorcess(WaterCleanMode);
QString message = tr("Clean time out");
EventCenter::Default()->triggerEvent(GUIEvents::GUIErrorRaise, nullptr, (QObject*)&message);
});
}
@@ -81,55 +110,203 @@ void ScanFormWidget::initCommandWidget(QHBoxLayout *layout)
layout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding));
addVerticalLine(layout);
mWaterfloodButton->setObjectName("btnWaterflood");
mWaterfloodButton->setCheckable(true);
mWaterfloodButton->setText(tr("Waterflood"));
layout->addWidget(mWaterfloodButton);
mDrainageButton->setObjectName("btnDrainage");
mDrainageButton->setCheckable(true);
mDrainageButton->setText(tr("Drainage"));
layout->addWidget(mDrainageButton);
connect(mDrainageButton, &QToolButton::clicked, [=](bool aSatus)
mCleanButton->setObjectName("btnClean");
mCleanButton->setCheckable(true);
mCleanButton->setText(tr("Clean"));
layout->addWidget(mCleanButton);
connect(mWaterfloodButton, &QToolButton::clicked, [this](bool aStatus)
{
//Drainage
if(aSatus && DialogManager::Default()->requestAlertMessage(tr("Make sure to open the drain valve ?"), DialogButtonMode::OkAndCancel, tr("Confirm Drainage")) == QDialog::Rejected)
if(aStatus && DialogManager::Default()->requestAlertMessage(tr("Please confirm if water injection is required ?"), DialogButtonMode::OkAndCancel, tr("Confirm Water Injection")) == QDialog::Rejected)
{
mDrainageButton->setChecked(!aSatus);
mWaterfloodButton->setChecked(!aStatus);
return;
}
mDrainageButton->setEnabled(false);
if(aSatus == true)
setWaterProcessModeEnable(false);
if(aStatus)
{
mWaterfloodButton->setText(tr("Waterflooding"));
EventCenter::Default()->triggerEvent(RequestWaterflood, nullptr, nullptr);
LOG_USER_OPERATION("Perform Waterflood");
}
else
{
EventCenter::Default()->triggerEvent(RequestWaterModeExit, nullptr, nullptr);
LOG_USER_OPERATION("Stop Waterflood");
}
});
connect(mDrainageButton, &QToolButton::clicked, [=](bool aStatus)
{
if(aStatus && DialogManager::Default()->requestAlertMessage(tr("Please confirm if drainage is required ?"), DialogButtonMode::OkAndCancel, tr("Confirm Drainage")) == QDialog::Rejected)
{
mDrainageButton->setChecked(!aStatus);
return;
}
setWaterProcessModeEnable(false);
if(aStatus == true)
{
mDrainageTimer->start(DRAINAGE_TIME);
QString code = "1";
mDrainageButton->setText(tr("Drainaging"));
EventCenter::Default()->triggerEvent(RequestDrainage, nullptr, (QObject*)(&code));
EventCenter::Default()->triggerEvent(RequestDrainage, nullptr, nullptr);
LOG_USER_OPERATION("Perform Drainage");
}
else
{
mDrainageTimer->stop();
QString code = "0";
mDrainageButton->setText(tr("Drainage"));
EventCenter::Default()->triggerEvent(RequestDrainage, nullptr, (QObject*)(&code));
EventCenter::Default()->triggerEvent(RequestWaterModeExit, nullptr, nullptr);
LOG_USER_OPERATION("Stop Drainage");
}
});
connect(DeviceManager::Default(), &DeviceManager::startPumpControlResult, [this](bool aIsSucessful)
connect(mCleanButton, &QToolButton::clicked, [this](bool aStatus)
{
if(aStatus && DialogManager::Default()->requestAlertMessage(tr("Please confirm if cleaning and disinfection are required. ?"), DialogButtonMode::OkAndCancel, tr("Confirm cleaning")) == QDialog::Rejected)
{
mCleanButton->setChecked(!aStatus);
return;
}
setWaterProcessModeEnable(false);
if(aStatus)
{
mWaterCleanStep = FirstWaterClean;
mCleanButton->setText(tr("Cleaning"));
EventCenter::Default()->triggerEvent(RequestWaterClean, nullptr, nullptr);
LOG_USER_OPERATION("Perform Cleaning in first step");
}
else
{
EventCenter::Default()->triggerEvent(RequestWaterModeExit, nullptr, nullptr);
LOG_USER_OPERATION("Stop Clean");
}
});
connect(DeviceManager::Default(), &DeviceManager::startDrainageControlResult, [this](bool aIsSucessful)
{
mDrainageButton->setEnabled(true);
if(!aIsSucessful)
{
mDrainageTimer->stop();
bool isChecked = mDrainageButton->isChecked();
mDrainageButton->setChecked(!isChecked);
if(isChecked)
setWaterProcessModeEnable(true);
mDrainageButton->setChecked(false);
mDrainageButton->setText(tr("Drainage"));
}
else
{
mIsWaterProcessing = true;
mDrainageButton->setEnabled(true);
mDrainageTimer->start(DRAINAGE_TIME);
mWaterProcessMode = DrainageMode;
mWaveWidget->startCharge(50, DownWaveDirection);
}
});
connect(DeviceManager::Default(), &DeviceManager::startWaterfloodResult, [this](bool aIsSucessful)
{
if(!aIsSucessful)
{
setWaterProcessModeEnable(true);
mWaterfloodButton->setChecked(false);
mWaterfloodButton->setText(tr("Drainage"));
}
else
{
mIsWaterProcessing = true;
mWaterfloodButton->setEnabled(true);
mWaterfloodTimer->start(WATERFLOOD_TIME);
mWaterProcessMode = WaterFloodMode;
mWaveWidget->startCharge(0, UpWaveDirection);
}
});
connect(DeviceManager::Default(), &DeviceManager::startWaterCleanResult, [this](bool aIsSucessful)
{
if(!aIsSucessful)
{
setWaterProcessModeEnable(true);
mCleanButton->setChecked(false);
mCleanButton->setText(tr("Clean"));
}
else
{
mIsWaterProcessing = true;
mCleanButton->setEnabled(true);
mWaterCleanTimer->start(WATERCLEAN_TIME);
mWaterProcessMode = WaterCleanMode;
mZLabel->startFlash();
}
});
connect(DeviceManager::Default(), &DeviceManager::exitWaterProcessResult, [this](bool aIsSucessful)
{
finishWaterPorcess(mWaterProcessMode);
if(!aIsSucessful)
{
QString waterProcessMode;
switch (mWaterProcessMode)
{
mDrainageButton->setText(tr("Drainage"));
case WaterFloodMode:
waterProcessMode = tr("Waterflood");
break;
case DrainageMode:
waterProcessMode = tr("Drainage");
break;
case WaterCleanMode:
waterProcessMode = tr("Cleaning");
break;
}
else
QString message = waterProcessMode + tr(" exit failed.");
EventCenter::Default()->triggerEvent(GUIEvents::GUIErrorRaise, nullptr, (QObject*)&message);
}
});
connect(DeviceManager::Default(), &DeviceManager::waterProcessFinishedResult, [this](bool aIsSucessful)
{
if(!mIsWaterProcessing)
{
return;
}
finishWaterPorcess(mWaterProcessMode);
QString message;
if(aIsSucessful)
{
switch (mWaterProcessMode)
{
mDrainageButton->setText(tr("Drainaging"));
case WaterFloodMode:
message = tr("Waterflood finished.");
DialogManager::Default()->requestAlertMessage(message, DialogButtonMode::OkOnly, tr("Confirm Water Injection"));
break;
case DrainageMode:
message = tr("Drainage finished. Please do the disinfection in next step.");
DialogManager::Default()->requestAlertMessage(message, DialogButtonMode::OkOnly, tr("Confirm Drainage"));
break;
case WaterCleanMode:
processWaterCleanResult();
break;
}
}
else
{
switch (mWaterProcessMode)
{
case WaterFloodMode:
message = tr("Waterflood failed.");
break;
case DrainageMode:
message = tr("Drainage failed.");
break;
case WaterCleanMode:
message = tr("Clean failed.");
break;
}
EventCenter::Default()->triggerEvent(GUIEvents::GUIErrorRaise, nullptr, (QObject*)&message);
}
});
connect(mAccountButton, &QToolButton::clicked, DialogManager::Default(),&DialogManager::requestEditSelfAccount);
@@ -139,7 +316,7 @@ void ScanFormWidget::initCommandWidget(QHBoxLayout *layout)
if(DialogManager::Default()->requestAlertMessage(QString(tr("Shut down now ?")), DialogButtonMode::OkAndCancel,tr("Shut Down")) == QDialog::Accepted)
{
LOG_USER_OPERATION("Shut Down")
EventCenter::Default()->triggerEvent(GUIEvents::RequestShutdown, nullptr, nullptr);
EventCenter::Default()->triggerEvent(GUIEvents::RequestShutdown, nullptr, nullptr);
}
});
@@ -161,9 +338,9 @@ void ScanFormWidget::initCommandWidget(QHBoxLayout *layout)
{
if(aResult)
{
mAccountButton->setEnabled(false);
mDrainageButton->setEnabled(false);
mShutdownButton->setEnabled(false);
// mAccountButton->setEnabled(false);
// mDrainageButton->setEnabled(false);
// mShutdownButton->setEnabled(false);
mScanProcessLabel->setText(getAutoLocateMessage());
}
@@ -202,6 +379,69 @@ void ScanFormWidget::initCommandWidget(QHBoxLayout *layout)
}
void ScanFormWidget::setWaterProcessModeEnable(bool aIsEnable)
{
mWaterfloodButton->setEnabled(aIsEnable);
mCleanButton->setEnabled(aIsEnable);
mDrainageButton->setEnabled(aIsEnable);
}
void ScanFormWidget::processWaterCleanResult()
{
QString message;
switch (mWaterCleanStep)
{
case FirstWaterClean:
message = tr("Please click the confirm button for cleaning after disinfection.");
if(DialogManager::Default()->requestAlertMessage(message, DialogButtonMode::OkAndCancel, tr("Confirm cleaning")) == QDialog::Accepted)
{
startWaterCleanInSecondStep();
}
break;
case SecondWaterClean:
message = tr("cleanning finished.");
DialogManager::Default()->requestAlertMessage(message, DialogButtonMode::OkOnly, tr("Confirm cleaning"));
break;
}
}
void ScanFormWidget::startWaterCleanInSecondStep()
{
setWaterProcessModeEnable(false);
mWaterCleanStep = SecondWaterClean;
mCleanButton->setText(tr("Cleaning"));
mCleanButton->setChecked(true);
EventCenter::Default()->triggerEvent(RequestWaterClean, nullptr, nullptr);
LOG_USER_OPERATION("Perform Cleaning in second step");
}
void ScanFormWidget::finishWaterPorcess(WaterProcessMode aMode)
{
mIsWaterProcessing = false;
setWaterProcessModeEnable(true);
switch (aMode)
{
case WaterFloodMode:
mWaterfloodTimer->stop();
mWaterfloodButton->setText(tr("Waterflood"));
mWaterfloodButton->setChecked(false);
mWaveWidget->stopCharge();
break;
case DrainageMode:
mDrainageTimer->stop();
mDrainageButton->setText(tr("Drainage"));
mDrainageButton->setChecked(false);
mWaveWidget->stopCharge();
break;
case WaterCleanMode:
mWaterCleanTimer->stop();
mCleanButton->setText(tr("Clean"));
mCleanButton->setChecked(false);
mZLabel->stopFlash();
break;
}
}
void ScanFormWidget::initScanContent()
{
@@ -224,18 +464,26 @@ void ScanFormWidget::initScanContent()
QHBoxLayout* displayLayout = new QHBoxLayout(displayWidget);
QWidget* xyWidget = new QWidget(this);
xyWidget->setObjectName("broadcastWidget");
QHBoxLayout* xyLayout = new QHBoxLayout(xyWidget);
xyLayout->addWidget(mXYLabel);
displayLayout->addWidget(xyWidget);
// QWidget* xyWidget = new QWidget(this);
// xyWidget->setObjectName("broadcastWidget");
// QHBoxLayout* xyLayout = new QHBoxLayout(xyWidget);
// xyLayout->addWidget(mXYLabel);
// displayLayout->addWidget(xyWidget);
QWidget* zWidget = new QWidget(this);
zWidget->setObjectName("broadcastWidget");
QHBoxLayout* zLayout = new QHBoxLayout(zWidget);
zLayout->addWidget(mZLabel);
displayLayout->addWidget(zWidget);
// QWidget* zWidget = new QWidget(this);
// zWidget->setObjectName("broadcastWidget");
// QHBoxLayout* zLayout = new QHBoxLayout(zWidget);
// zLayout->addWidget(mZLabel);
// displayLayout->addWidget(zWidget);
// zWidget->hide();
mFlashLayoutWidget->setObjectName("broadcastWidget");
QHBoxLayout* flashLayout = new QHBoxLayout(mFlashLayoutWidget);
flashLayout->addWidget(mZLabel);
flashLayout->addWidget(mWaveWidget);
displayLayout->addWidget(mFlashLayoutWidget);
//mWaveWidget->startCharge();
}
@@ -353,6 +601,8 @@ void ScanFormWidget::reloadLanguage()
mStartScanButton->setText(tr("Start Scan"));
mScanProcessLabel->setText(tr("Please confirm checking patient information to start the process"));
mDrainageButton->isChecked() ? mDrainageButton->setText(tr("Drainaging")) : mDrainageButton->setText(tr("Drainage"));
mWaterfloodButton->isChecked() ? mWaterfloodButton->setText(tr("Waterflooding")) : mWaterfloodButton->setText(tr("Waterflood"));
mCleanButton->isChecked() ? mCleanButton->setText(tr("Cleaning")) : mCleanButton->setText(tr("Clean"));
}
QString ScanFormWidget::getAutoLocateMessage()

View File

@@ -11,8 +11,21 @@ class PatientInformation;
class QToolButton;
class CoordinateXYWidget;
class CoordinateZWidget;
class ZFlashWidget;
class WaveWidget;
class ScanFormWidget :public TabFormWidget {
enum WaterProcessMode
{
WaterFloodMode = 0, DrainageMode, WaterCleanMode
};
enum WaterCleanStep
{
FirstWaterClean = 0, SecondWaterClean
};
class ScanFormWidget :public TabFormWidget
{
Q_OBJECT
public:
explicit ScanFormWidget(QWidget *parent = nullptr);
@@ -27,10 +40,19 @@ private:
QToolButton* mShutdownButton;
QToolButton* mStartScanButton;
QToolButton* mDrainageButton;
CoordinateXYWidget* mXYLabel;
CoordinateZWidget* mZLabel;
QToolButton* mWaterfloodButton;
QToolButton* mCleanButton;
//CoordinateXYWidget* mXYLabel;
ZFlashWidget* mZLabel;
WaveWidget* mWaveWidget;
QLabel* mScanProcessLabel;
QTimer* mDrainageTimer;
QTimer* mWaterfloodTimer;
QTimer* mWaterCleanTimer;
QWidget* mFlashLayoutWidget;
WaterProcessMode mWaterProcessMode;
WaterCleanStep mWaterCleanStep;
bool mIsWaterProcessing;
void initCommandWidget(QHBoxLayout *layout);
void initScanContent();
@@ -39,11 +61,14 @@ private:
void reloadLanguage();
void setScanProtocal(PatientInformation* aPatient, int aProtocal);
QString getAutoLocateMessage();
void finishWaterPorcess(WaterProcessMode aMode);
void startWaterCleanInSecondStep();
void processWaterCleanResult();
private slots:
void protocolChanged(int type);
void prepareStartFullScan();
void setWaterProcessModeEnable(bool aIsEnable = true);
void initEvents();
};