From a461a4399b3409f4b7fe78a96caad084ad95fd1b Mon Sep 17 00:00:00 2001 From: sunwen Date: Tue, 4 Mar 2025 11:04:57 +0800 Subject: [PATCH] feat: Add water process in GUI. --- src/components/WaveWidget.cpp | 239 ++++++++++++++++++++++ src/components/WaveWidget.h | 64 ++++++ src/components/ZFlashWidget.cpp | 103 ++++++++++ src/components/ZFlashWidget.h | 38 ++++ src/device/DeviceManager.cpp | 153 ++++++++++++-- src/device/DeviceManager.h | 27 ++- src/device/DmsAsyncAction.cpp | 1 + src/device/InfoReceiveWorker.cpp | 13 +- src/device/daq_define.h | 43 ++-- src/dicom/WorkListManager.cpp | 5 +- src/event/EventCenter.h | 3 + src/forms/scan/ScanFormWidget.cpp | 328 ++++++++++++++++++++++++++---- src/forms/scan/ScanFormWidget.h | 33 ++- src/icons/sanitize.png | Bin 0 -> 4767 bytes src/icons/waterflood.png | Bin 0 -> 8650 bytes src/stylesheet/Dark2.css | 11 + src/translations/en_US.ts | 88 +++++++- src/translations/zh_CN.ts | 233 +++++++++++++++------ 18 files changed, 1233 insertions(+), 149 deletions(-) create mode 100644 src/components/WaveWidget.cpp create mode 100644 src/components/WaveWidget.h create mode 100644 src/components/ZFlashWidget.cpp create mode 100644 src/components/ZFlashWidget.h create mode 100644 src/icons/sanitize.png create mode 100644 src/icons/waterflood.png diff --git a/src/components/WaveWidget.cpp b/src/components/WaveWidget.cpp new file mode 100644 index 0000000..a59bd8a --- /dev/null +++ b/src/components/WaveWidget.cpp @@ -0,0 +1,239 @@ +#include "WaveWidget.h" +#include +#include +#include +#include + +WaveWidget::WaveWidget(QWidget* parent) + : QWidget(parent) + , mTimer(new QTimer(this)) + , mWaveDirection() + , mValue(0) + , mYOffset(0) + , mScale(0) + , mMinValue(0) + , mMaxValue(100) + , mMinRadius(0) + , mText() + , mTextVisible(false) + , mRect() +{ + hide(); +} + +WaveWidget::~WaveWidget() +{ +} + +void WaveWidget::resizeEvent(QResizeEvent* aEvent) +{ + mMinRadius = qMin(width(), height()) / 2; + mRect = QRect(-mMinRadius, -mMinRadius, mMinRadius * 2 - 60, mMinRadius * 2); + QWidget::resizeEvent(aEvent); +} + +void WaveWidget::paintEvent(QPaintEvent* aEvent) +{ + Q_UNUSED(aEvent); + mScale = (qreal)(qAbs(mValue - mMinValue)) / (qAbs(mMaxValue - mMinValue)); + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing,true); + //p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); + painter.translate(width() / 2, height() / 4); + drawBackground(&painter); + drawWater(&painter); + drawText(&painter); +} + +void WaveWidget::drawBackground(QPainter* painter) +{ + painter->save(); + + QPen pen; + pen.setWidth(3); + pen.setColor(Qt::gray); + pen.setStyle(Qt::SolidLine); + painter->setPen(pen); + //painter->setPen(Qt::NoPen); + //painter->setBrush(QColor(40, 40, 40)); + painter->drawPie(mRect, 180*16, 180 * 16); + painter->restore(); +} + +void WaveWidget::drawText(QPainter* aPainter) +{ + if (mTextVisible) + { + aPainter->save(); + mText = QString("%1%").arg(mScale * 100,2,'f', 1); + //设置字体大小 + //QFont font = painter->font(); + //font.setPixelSize(30); + //painter->setFont(font); + //设置画笔 + aPainter->setPen(QPen(Qt::white, 4)); + //绘制文本 +// QRect r(-d->minRadius, -d->minRadius, d->minRadius * 2, d->minRadius * 2); + aPainter->drawText(mRect, Qt::AlignCenter, mText); + + aPainter->restore(); + } +} + +void WaveWidget::drawWater(QPainter* aPainter) +{ + if (mValue == mMinValue) + { + return; + } + else if (mValue >= 50) + { + aPainter->save(); + //painter->setPen(Qt::NoPen); + QLinearGradient lineGrad(QPointF(0, 0), QPointF(0, mMinRadius * 2)); + lineGrad.setColorAt(0,QColor(0,170,255,255)); + lineGrad.setColorAt(1,QColor(0,0,0,255)); + lineGrad.setSpread(QGradient::PadSpread); + aPainter->setBrush(lineGrad); + //painter->setBrush(QBrush(QColor(0,170,255, 230))); + aPainter->drawPie(mRect , 180*16, 180 * 16); + aPainter->restore(); + } + else//画波浪 + { + int side = qMin(width(), height()); + int height = side/2 - mScale * side; + aPainter->save(); + QPainterPath wavePath; //波浪区域 + QPainterPath wavePath2; //波浪区域 + + //1.8 角速度 + //4 振幅 + //height y轴相对远点偏移 + //d->yOffset x=0时的相位;反映在坐标系上则为图像的左右移动。 + //x * M_PI / 180 把x当做角度,转成弧度 + wavePath.moveTo(-mMinRadius, mMinRadius); //第一点坐标为(0,height); + for (int x = -mMinRadius; x <= mMinRadius; x++) //x从0~w的值而改变,从而得到正弦曲线 + { + double waveY = 4 * qSin(0.9 * (x * M_PI / 180 + mYOffset)) + height;// waveY随着x的值改变而改变,从而得到正弦曲线 + wavePath.lineTo(x, waveY); //从上一个绘制点画一条线到(x,waveY); + } + wavePath.lineTo(mMinRadius, mMinRadius); //右下角,坐标(width, height),移动到右下角结束点,整体形成一个闭合路径 + + wavePath2.moveTo(-mMinRadius, mMinRadius);//第一点坐标为(0,height); + for (int x = -mMinRadius; x <= mMinRadius; x++) //x从0~w的值而改变,从而得到正弦曲线 + { + double waveY = 4 * qSin(0.9 * (x * M_PI / 180 + mYOffset + 2)) + height;// waveY随着x的值改变而改变,从而得到正弦曲线 + wavePath2.lineTo(x, waveY); //从上一个绘制点画一条线到(x,waveY); + } + wavePath2.lineTo(mMinRadius, mMinRadius); //右下角,坐标(width, height),移动到右下角结束点,整体形成一个闭合路径 + + QPainterPath bigPath; + bigPath.addEllipse(mRect); + wavePath = bigPath.intersected(wavePath); + wavePath2 = bigPath.intersected(wavePath2); + + aPainter->setPen(Qt::NoPen); + + aPainter->setBrush(QBrush(QColor(100, 184, 255, 80))); + aPainter->drawPath(wavePath); //绘制路径 + + QLinearGradient lineGrad(QPointF(0, 0), QPointF(0, mMinRadius * 2)); + lineGrad.setColorAt(0,QColor(0,170,255,255)); + lineGrad.setColorAt(1,QColor(0,0,0,255)); + lineGrad.setSpread(QGradient::PadSpread); + aPainter->setBrush(lineGrad); + //painter->setBrush(QBrush(QColor(0,170,255, 230))); + aPainter->drawPath(wavePath2); //绘制路径 + aPainter->restore(); + } +} + +int WaveWidget::minimum() const +{ + return mMinValue; +} + +int WaveWidget::maximum() const +{ + return mMaxValue; +} + +int WaveWidget::value() const +{ + return mValue; +} + +QString WaveWidget::text() const +{ + return mText; +} + +void WaveWidget::setTextVisible(bool aVisible) +{ + mTextVisible = aVisible; +} + +bool WaveWidget::isTextVisible() const +{ + return mTextVisible; +} + +void WaveWidget::reset() +{ + mMinValue = 0; + mMaxValue = 100; +} +void WaveWidget::setRange(int aMinimum, int aMaximum) +{ + mMinValue = aMinimum; + mMaxValue = aMaximum; + mValue = aMinimum; +} +void WaveWidget::setMinimum(int aMinimum) +{ + mMinValue = aMinimum; + mValue = aMinimum; +} +void WaveWidget::setMaximum(int aMaximum) +{ + mMaxValue = aMaximum; +} +void WaveWidget::setValue(int aValue) +{ + if (aValue != mValue) + { + mValue = aValue; + emit valueChanged(aValue); + } +} + +void WaveWidget::startCharge(int aValue, WaveDirection aDirection) +{ + mValue = aValue; + mWaveDirection = aDirection; + connect(mTimer, &QTimer::timeout, this, &WaveWidget::updaterWater); + mTimer->start(30); + show(); +} + +void WaveWidget::stopCharge() +{ + disconnect(mTimer, &QTimer::timeout, this, &WaveWidget::updaterWater); + mTimer->stop(); + hide(); +} + +void WaveWidget::updaterWater() +{ + mYOffset += 0.3;//波浪偏移 + mValue += mWaveDirection * 0.025; + if (mValue >= 51 || mValue <0) + { + mYOffset = 0; + //d->value=0; + disconnect(mTimer, &QTimer::timeout, this, &WaveWidget::updaterWater); + emit closeSwitch(); + } + update(); +} diff --git a/src/components/WaveWidget.h b/src/components/WaveWidget.h new file mode 100644 index 0000000..709e9f2 --- /dev/null +++ b/src/components/WaveWidget.h @@ -0,0 +1,64 @@ +#ifndef WAVEWIDGET_H +#define WAVEWIDGET_H + +#include +#include + +enum WaveDirection +{ + DownWaveDirection = -1, UpWaveDirection = 1 +}; + +class WaveWidget : public QWidget +{ + Q_OBJECT +public: + explicit WaveWidget(QWidget* aParent = nullptr); + ~WaveWidget() override; + int minimum() const; + int maximum() const; + + int value() const; + + virtual QString text() const; + void setTextVisible(bool aVisible); + bool isTextVisible() const; + +protected: + void resizeEvent(QResizeEvent* aEvent) override; + void paintEvent(QPaintEvent* aEvent) override; + void drawBackground(QPainter* aPainter); + void drawText(QPainter* aPainter); + void drawWater(QPainter* aPainter); + +public slots: + void updaterWater(); + + void reset(); + void setRange(int minimum, int maximum); + void setMinimum(int minimum); + void setMaximum(int maximum); + void setValue(int value); + + + void startCharge(int aValue, WaveDirection aDirection); + void stopCharge(); +Q_SIGNALS: + void valueChanged(int aValue); + void closeSwitch(); + +private: + QTimer* mTimer; + WaveDirection mWaveDirection; + qreal mValue; + qreal mYOffset; + qreal mScale; + int mMinValue; + int mMaxValue; + int mMinRadius; + QString mText; + bool mTextVisible; + QRect mRect; +}; + +#endif // WAVEWIDGET_H diff --git a/src/components/ZFlashWidget.cpp b/src/components/ZFlashWidget.cpp new file mode 100644 index 0000000..1351a7d --- /dev/null +++ b/src/components/ZFlashWidget.cpp @@ -0,0 +1,103 @@ +#include "ZFlashWidget.h" + +#include +#include + +#include "utilities/ScanProcessSequence.h" + +namespace +{ + const int ANIME_RECT_HEIGHT = 350; + const int ANIME_SPEED = 10; + const int RENFER_START_POINT = 640; + const int TOP_POINT_Y = 0; + const int BOTTOM_POINT_Y = 395; +} + +ZFlashWidget::ZFlashWidget(QWidget* aParent) + : QWidget(aParent) + , mTimer(new QTimer(this)) + , mRenderStartPoint(RENFER_START_POINT) + , mRenderEndPoint(mRenderStartPoint+ANIME_RECT_HEIGHT) + , mRenderDirectionUp(true) + , mRenderDirectionNumber(1) + , mStopGradientEnd(1) + , mMinRadius(0) +{ + //setFixedSize(WIDGET_WIDTH,WIDGET_HEIGHT); + hide(); +} + +void ZFlashWidget::resizeEvent(QResizeEvent* aEvent) +{ + mMinRadius = qMin(width(), height()) / 2; + QWidget::resizeEvent(aEvent); +} + +void ZFlashWidget::paintEvent(QPaintEvent* aEvent) +{ + Q_UNUSED(aEvent); + QPainter p(this); + + p.translate(width() / 2, height() / 4); + QRect rect(-mMinRadius, -mMinRadius, mMinRadius * 2 - 60, mMinRadius * 2); + p.setRenderHint(QPainter::Antialiasing,true); + QLinearGradient lineGrad(QPointF(0, mRenderStartPoint), QPointF(0, mRenderEndPoint)); + lineGrad.setColorAt(0,QColor(0,0,0,255)); + lineGrad.setColorAt(0.1,QColor(0,170,255,255)); + lineGrad.setColorAt(mStopGradientEnd,QColor(0,0,0,255)); + lineGrad.setColorAt(1,QColor(0,0,0,255)); + lineGrad.setSpread(QGradient::PadSpread); + p.setBrush(lineGrad); + + QPen pen; + pen.setWidth(3); + pen.setColor(Qt::gray); + pen.setStyle(Qt::SolidLine); + p.setPen(pen); + p.drawPie(rect, 180*16, 180*16); +} + +void ZFlashWidget::startFlash() +{ + show(); + connect(mTimer,&QTimer::timeout,this, &ZFlashWidget::updateFlash); + mTimer->start(20); +} + +void ZFlashWidget::stopFlash() +{ + mTimer->stop(); + disconnect(mTimer,&QTimer::timeout,this, &ZFlashWidget::updateFlash); + hide(); +} + +void ZFlashWidget::updateFlash() +{ + if(mRenderEndPoint <= TOP_POINT_Y && mRenderDirectionUp) + { + mRenderDirectionUp = false; + mRenderDirectionNumber *= -1; + mRenderStartPoint = mRenderDirectionNumber * ANIME_SPEED + TOP_POINT_Y; + } + + if(mRenderEndPoint >= BOTTOM_POINT_Y && !mRenderDirectionUp) + { + mRenderDirectionUp = true; + mRenderDirectionNumber *= -1; + mRenderStartPoint = BOTTOM_POINT_Y - ANIME_SPEED; + } + + mRenderStartPoint -= mRenderDirectionNumber*ANIME_SPEED; + mRenderEndPoint = mRenderStartPoint + mRenderDirectionNumber*ANIME_RECT_HEIGHT; + this->update(); +} + + +void ZFlashWidget::quit() +{ + disconnect(mTimer,&QTimer::timeout,this, &ZFlashWidget::updateFlash); + mTimer->stop(); + hide(); +} + diff --git a/src/components/ZFlashWidget.h b/src/components/ZFlashWidget.h new file mode 100644 index 0000000..cc3e6f3 --- /dev/null +++ b/src/components/ZFlashWidget.h @@ -0,0 +1,38 @@ +#ifndef ZFLASHWIDGET_H +#define ZFLASHWIDGET_H + +#include + +class QTimer; + +class ZFlashWidget : public QWidget +{ + Q_OBJECT +public: + ZFlashWidget(QWidget* aParent); + void setBlinkPoint(int aZ); + void stopFlash(); + void startFlash(); + + void quit(); + +protected: + void paintEvent(QPaintEvent* aEvent) override; + void resizeEvent(QResizeEvent* aEvent) override; + +private: + void updateFlash(); + void updateStopFlash(); + +private: + QTimer* mTimer; + int mRenderStartPoint; + int mRenderEndPoint; + bool mRenderDirectionUp; + int mRenderDirectionNumber; + double mStopGradientEnd; + int mMinRadius; + +}; + +#endif // ZFLASHWIDGET_H diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index af98f38..4e8a014 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -40,7 +40,7 @@ namespace const unsigned int GET_TEMPERATURE_TIME = 60000; const int CHECK_RECON_CONNECTION_TIME = 30000; const int SHUT_DOWN_TIMEOUT = 180000;//3 minitues - const int PUMP_TIMEOUT = 3000;//3 seconds + const int WATERPROCESS_TIMEOUT = 3000;//3 seconds const int GETDMSVERSION_TIMEOUT = 5000; const int EFFECTIVE_POSITION_RADIUS = 125; const int EFFECTIVE_POSITION_Z_START = 150; @@ -113,10 +113,10 @@ void DeviceManager::initDevice() //shutdown connect(EventCenter::Default(), &EventCenter::RequestShutdown, this, &DeviceManager::shutdownDms); //Drainage - connect(EventCenter::Default(), &EventCenter::RequestDrainage, this, [this](QObject* sender, QObject* detail) - { - controlDrainage(*(QString*)detail); - }); + connect(EventCenter::Default(), &EventCenter::RequestDrainage, this, &DeviceManager::startDrainage); + connect(EventCenter::Default(), &EventCenter::RequestWaterflood, this, &DeviceManager::startWaterflood); + connect(EventCenter::Default(), &EventCenter::RequestWaterClean, this, &DeviceManager::startWaterClean); + connect(EventCenter::Default(), &EventCenter::RequestWaterModeExit, this, &DeviceManager::exitWaterProcess); //AutoLocate connect(EventCenter::Default(), &EventCenter::StartScanProcess, this, &DeviceManager::startScanProcess); connect(EventCenter::Default(), &EventCenter::StopScanProcess, this, &DeviceManager::stopScanProcess); @@ -140,8 +140,30 @@ void DeviceManager::initDevice() mGetDeviceTemperatureAction = new DmsAsyncAction(USRV_SCAN, ACT_SCAN_TEMP, this, "responseGetDeviceTemperature(const QString&)", this); mShutDownAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_PWRDOWN, this, "responseShutDown(const QString&)", this); mShutDownAction->setTimeoutInterval(SHUT_DOWN_TIMEOUT); - mPumpControlAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_PUMP, this, "responsePumpControl(const QString&)", this); - mPumpControlAction->setTimeoutInterval(PUMP_TIMEOUT); + mDrainageControlAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_WDRAIN, this, "responseDrainageControl(const QString&)", this); + mDrainageControlAction->setTimeoutInterval(WATERPROCESS_TIMEOUT); + connect(mDrainageControlAction, &DmsAsyncAction::timeout, [this]() + { + this->processDrainageResult("{\"code\":-1}"); + }); + mWaterfloodAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_WINJECT, this, "responseWaterflood(const QString&)", this); + mWaterfloodAction->setTimeoutInterval(WATERPROCESS_TIMEOUT); + connect(mWaterfloodAction, &DmsAsyncAction::timeout, [this]() + { + this->processWaterfloodResult("{\"code\":-1}"); + }); + mWaterCleanAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_WCLEAN, this, "responseWaterclean(const QString&)", this); + mWaterCleanAction->setTimeoutInterval(WATERPROCESS_TIMEOUT); + connect(mWaterCleanAction, &DmsAsyncAction::timeout, [this]() + { + this->processWaterCleanResult("{\"code\":-1}"); + }); + mWaterProcessExitAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_WEXIT, this, "responseWaterProcessExit", this); + mWaterProcessExitAction->setTimeoutInterval(WATERPROCESS_TIMEOUT); + connect(mWaterProcessExitAction, &DmsAsyncAction::timeout, [this]() + { + this->processWaterProcessExitResult("{\"code\":-1}"); + }); mGetAutoLocatePositionAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_MOTION_POSITION, this, "responseGetAutoLocatePosition(const QString&)", this); mGetSoftwareVersionAction = new DmsAsyncAction(USRV_INFOCFG, ACT_IFCFG_VERINFO, this,"responseGetSoftwareVersion(const QString&)", this); mGetSoftwareVersionAction->setTimeoutInterval(GETDMSVERSION_TIMEOUT); @@ -150,10 +172,6 @@ void DeviceManager::initDevice() { emit getDmsVersionResponsed("DMS Version Fetch Error"); }); - connect(mPumpControlAction, &DmsAsyncAction::timeout, [this]() - { - this->processPumpResult("{\"code\":-1}"); - }); connect(mGetScanProgressAction, &DmsAsyncAction::timeout, this, &DeviceManager::scanTimeout); connect(mShutDownAction, &DmsAsyncAction::timeout, this, &DeviceManager::shutdownDmsFailed); connect(mGetAutoLocatePositionAction, &DmsAsyncAction::timeout, [this]() @@ -728,9 +746,24 @@ void DeviceManager::processReceiveDMSInfoResult(int aServerID, int aActionID, co case USRV_CONTROL: switch(aActionID) { - case ACT_CTL_PUMP: - emit responsePumpControl(aContents); - processPumpResult(aContents); + case ACT_CTL_WDRAIN: + emit responseDrainageControl(aContents); + processDrainageResult(aContents); + break; + case ACT_CTL_WINJECT: + emit responseWaterflood(aContents); + processWaterfloodResult(aContents); + break; + case ACT_CTL_WCLEAN: + emit responseWaterclean(aContents); + processWaterCleanResult(aContents); + break; + case ACT_CTL_WEXIT: + emit responseWaterProcessExit(aContents); + processWaterProcessExitResult(aContents); + break; + case ACT_CTL_WRESPOSE: + processWaterProcessFinishedResult(aContents); break; case ACT_CTL_PWRDOWN: emit responseShutDown(aContents); @@ -1125,31 +1158,109 @@ bool DeviceManager::getCEStatus() return true; } -void DeviceManager::controlDrainage(const QString& aCode) +void DeviceManager::startDrainage() { - mPumpControlAction->setSendData(QString("{\"valve\":%1}").arg(aCode)); - if(!mPumpControlAction->execute()) + if(!mDrainageControlAction->execute()) { - emit startPumpControlResult(false); + emit startDrainageControlResult(false); QString msg = tr("Open pump failed."); THROW_ERROR(msg); } } -void DeviceManager::processPumpResult(const QString& aResponse) +void DeviceManager::processDrainageResult(const QString& aResponse) { QJsonObject jsonObj = toJsonObject(aResponse); if(jsonObj["code"].toInt() == 0 ) { - emit startPumpControlResult(true); + emit startDrainageControlResult(true); return; } - emit startPumpControlResult(false); + emit startDrainageControlResult(false); QString msg = tr("Open pump failed."); THROW_ERROR(msg); } +void DeviceManager::startWaterflood() +{ + if(!mWaterfloodAction->execute()) + { + emit startWaterfloodResult(false); + QString msg = tr("Water injection failed."); + THROW_ERROR(msg); + } +} + +void DeviceManager::processWaterfloodResult(const QString &aResponse) +{ + QJsonObject jsonObj = toJsonObject(aResponse); + if(jsonObj["code"].toInt() == 0 ) + { + emit startWaterfloodResult(true); + return; + } + + emit startWaterfloodResult(false); + QString msg = tr("Water injection failed."); + THROW_ERROR(msg); +} + +void DeviceManager::startWaterClean() +{ + if(!mWaterCleanAction->execute()) + { + emit startWaterCleanResult(false); + QString msg = tr("Cleaning failed."); + THROW_ERROR(msg); + } +} + +void DeviceManager::processWaterCleanResult(const QString &aResponse) +{ + QJsonObject jsonObj = toJsonObject(aResponse); + if(jsonObj["code"].toInt() == 0 ) + { + emit startWaterCleanResult(true); + return; + } + + emit startWaterCleanResult(false); + QString msg = tr("Cleaning failed."); + THROW_ERROR(msg); +} + +void DeviceManager::exitWaterProcess() +{ + if(!mWaterProcessExitAction->execute()) + { + emit exitWaterProcessResult(false); + } +} + +void DeviceManager::processWaterProcessExitResult(const QString &aResponse) +{ + QJsonObject jsonObj = toJsonObject(aResponse); + if(jsonObj["code"].toInt() == 0 ) + { + emit exitWaterProcessResult(true); + return; + } + + emit exitWaterProcessResult(false); +} + +void DeviceManager::processWaterProcessFinishedResult(const QString &aResponse) +{ + QJsonObject jsonObj = toJsonObject(aResponse); + if(jsonObj["code"].toInt() == 0 ) + { + emit waterProcessFinishedResult(true); + return; + } + emit waterProcessFinishedResult(false); +} + void DeviceManager::updateReconConnectionState(bool aIsConnected) { EventCenter::Default()->triggerEvent(ReconConnectionUpdated, nullptr, (QObject*)&aIsConnected); diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h index daf5ba4..2372c02 100644 --- a/src/device/DeviceManager.h +++ b/src/device/DeviceManager.h @@ -104,7 +104,10 @@ private: bool getCEStatus(); bool startCEScan(); void initEmptyScanMeasurementID(); - void controlDrainage(const QString& aCode); + void startDrainage(); + void startWaterflood(); + void startWaterClean(); + void exitWaterProcess(); void checkInitStatus(); bool startAutoLocate(); void stopAutoLocate(); @@ -120,7 +123,11 @@ private: void processPreviewData(const QString& aPreviewData); void processDeviceTemperature(const QString& aResponseTemperature); void processShutDownDms(const QString& aResponse); - void processPumpResult(const QString& aResponse); + void processDrainageResult(const QString& aResponse); + void processWaterfloodResult(const QString& aResponse); + void processWaterCleanResult(const QString& aResponse); + void processWaterProcessExitResult(const QString& aResponse); + void processWaterProcessFinishedResult(const QString& aResponse); void processGetSoftwareVersion(const QString& aResponse); void processEmergencyButtonReset(const QString& aResponse); @@ -152,7 +159,10 @@ signals: void responsePreviewScan(const QString& aResponse); void responseGetSoftwareVersion(const QString& aSoftwareVersion); void responseGetCEStatus(const QString& aProgress); - void responsePumpControl(const QString& aResponse); + void responseDrainageControl(const QString& aResponse); + void responseWaterflood(const QString& aResponse); + void responseWaterclean(const QString& aResponse); + void responseWaterProcessExit(const QString& aResponse); void responseSetSimulatorMode(const QString& aResponse); void responseSetHeartBeat(const QString& aResponese); void responseShutDown(const QString& aResponse); @@ -172,7 +182,11 @@ signals: void initializeFinished(); void initializeProgress(const QString& aProgress); void startPreviewScanResult(bool aIsSucessful); - void startPumpControlResult(bool aIsSucessful); + void startDrainageControlResult(bool aIsSucessful); + void startWaterfloodResult(bool aIsSucessful); + void startWaterCleanResult(bool aIsSucessful); + void exitWaterProcessResult(bool aIsSucessful); + void waterProcessFinishedResult(bool aIsSucessful); void startAutoLocateResult(bool aIsSucessful); void updateAutoLocatePosition(int aX, int aY, int aZ); void autolocatePositionEffective(); @@ -222,7 +236,10 @@ private: DmsAsyncAction* mGetDeviceTemperatureAction = nullptr; DmsAsyncAction* mGetScanProgressAction = nullptr; DmsAsyncAction* mShutDownAction = nullptr; - DmsAsyncAction* mPumpControlAction = nullptr; + DmsAsyncAction* mDrainageControlAction = nullptr; + DmsAsyncAction* mWaterfloodAction = nullptr; + DmsAsyncAction* mWaterCleanAction = nullptr; + DmsAsyncAction* mWaterProcessExitAction = nullptr; DmsAsyncAction* mGetAutoLocatePositionAction = nullptr; DmsAsyncAction* mGetSoftwareVersionAction = nullptr; DmsAsyncAction* mEmergencyResetAction = nullptr; diff --git a/src/device/DmsAsyncAction.cpp b/src/device/DmsAsyncAction.cpp index 8e40937..6681938 100644 --- a/src/device/DmsAsyncAction.cpp +++ b/src/device/DmsAsyncAction.cpp @@ -54,6 +54,7 @@ void DmsAsyncAction::sendTimeoutSignal() { if(!mIsResponsed) { + LOG_SYS_OPERATION(QString("GUI -> DMS : %1-%2, Time out.").arg(mServerId).arg(mActionId)); emit timeout(); } } diff --git a/src/device/InfoReceiveWorker.cpp b/src/device/InfoReceiveWorker.cpp index 97c45ad..7fc3d0a 100644 --- a/src/device/InfoReceiveWorker.cpp +++ b/src/device/InfoReceiveWorker.cpp @@ -93,8 +93,17 @@ void InfoReceiveWorker::responsed(int aServerID, int aActionID) case USRV_CONTROL: switch(aActionID) { - case ACT_CTL_PUMP: - DeviceManager::Default()->mPumpControlAction->responsed(); + case ACT_CTL_WDRAIN: + DeviceManager::Default()->mDrainageControlAction->responsed(); + break; + case ACT_CTL_WINJECT: + DeviceManager::Default()->mWaterfloodAction->responsed(); + break; + case ACT_CTL_WCLEAN: + DeviceManager::Default()->mWaterCleanAction->responsed(); + break; + case ACT_CTL_WEXIT: + DeviceManager::Default()->mWaterProcessExitAction->responsed(); break; case ACT_CTL_PWRDOWN: DeviceManager::Default()->mShutDownAction->responsed(); diff --git a/src/device/daq_define.h b/src/device/daq_define.h index 28a78cc..517230b 100644 --- a/src/device/daq_define.h +++ b/src/device/daq_define.h @@ -3,7 +3,8 @@ //-------------------- 定义服务和动作 --------------------------- -enum{ +enum +{ USRV_NONE = 0, USRV_SCAN, //扫查服务 USRV_XFR, //数据传输服务 @@ -17,7 +18,8 @@ enum{ }; //扫查服务动作 -enum{ +enum +{ ACT_SCAN_NONE = 0, ACT_SCAN_RESP, //上报扫查状态(错误码,结束等) ACT_SCAN_PREVIEW, //预扫 @@ -40,7 +42,8 @@ enum{ }; //数据传输服务 -enum{ +enum +{ ACT_XFR_NONE = 0, ACT_XFR_RESP, //上报传输状态(错误码,结束等) ACT_XFR_START, //启动传输(含SRC和DST参数) @@ -52,7 +55,8 @@ enum{ }; //信息与配置服务 -enum{ +enum +{ ACT_IFCFG_NONE = 0, ACT_IFCFG_RESP, //默认的配置回复 ACT_IFCFG_VERINFO, //GUI发给设备为请求数据,设备上报数据内容(软硬件版本,系统信息等一系列信息。) @@ -67,7 +71,8 @@ enum{ //杂类控制和调试服务 //配置成不透传模式,则XX_RESP永远不会上传数据,有错误也是通过LOG发回来。 //如果配置成透传,则所有结果都从XX_RESP再上报一次。XX_RESP的另外一个作用就是打包和判定是否需要上传。 -enum{ +enum +{ ACT_CTL_NONE = 0, ACT_CTL_MOTOR_CFG, //电机配置(0不透传,1透传) ACT_CTL_MOTOR_CMD, //下发电机控制命令 @@ -91,22 +96,29 @@ enum{ ACT_CTL_MOTION_STOP, //停止自动定位功能 ACT_CTL_MOTION_POSITION, //查询自动定位状态(位置) ACT_CTL_EMG_RESET, //复位急停按钮 - ACT_CTL_DRIVER, //驱动控制(加载卸载驱动) + ACT_CTL_WINJECT = 40, //注水 + ACT_CTL_WDRAIN, //排水 + ACT_CTL_WCLEAN, //清洁消毒 + ACT_CTL_WRESPOSE, //动作结束反馈 + ACT_CTL_WEXIT, //状态强制退出(都恢复到初始状态) + ACT_CTL_WSETERR, //模拟设置错误码 + ACT_CTL_DRIVER = 100, //驱动控制(加载卸载驱动) ACT_CTL_EXIT, //退出程序和守护进程 - }; //设备升级 -enum{ +enum +{ ACT_FMW_NONE = 0, - ACT_FMW_RESP, //上报升级结果 + ACT_FMW_RESP, //上报升级结果 ACT_FMW_CFG, //固件升级配置(json格式) ACT_FMW_LOAD, //下载固件到设备 ACT_FMW_START, //启动固件升级 }; //日志和报警服务 -enum{ +enum +{ ACT_LOGALM_NONE = 0, ACT_LOGALM_RPT, //ACT_LOGALM_RPT改成报警,即少数用户需要感知的消息在这里呈现。 ACT_LOGALM_CFG, //日志配置(调整日志等级) @@ -114,13 +126,15 @@ enum{ }; //心跳服务 -enum{ +enum +{ ACT_HB_NONE = 0, ACT_HB_BEAT, //心跳包 }; //网络服务 -enum{ +enum +{ ACT_NET_NONE = 0, ACT_NET_LOCAL, //向LocalSocket发送数据 ACT_NET_REMOTE, //想远程GUI发送数据 @@ -132,7 +146,8 @@ enum{ }; //调试诊断服务 -enum{ +enum +{ ACT_DIG_NONE = 0, ACT_DIG_SYNC, //同步状态(板卡以及其他) ACT_DIG_STOP, //停止当前诊断操作 @@ -146,4 +161,4 @@ enum{ ACT_DIG_SIMULATOR, //模拟功能配置 }; -#endif +#endif \ No newline at end of file diff --git a/src/dicom/WorkListManager.cpp b/src/dicom/WorkListManager.cpp index d8ebb38..dcacdd3 100644 --- a/src/dicom/WorkListManager.cpp +++ b/src/dicom/WorkListManager.cpp @@ -111,15 +111,16 @@ int WorkListManager::getPatientFromWorkList(QList& aOutPati OFList syntaxes; syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax); scu.setMaxReceivePDULength(ASC_DEFAULTMAXPDU); - scu.setACSETimeout(30); scu.setDIMSEBlockingMode(DIMSE_BLOCKING); - scu.setDIMSETimeout(0); scu.setAETitle(serverInfo.localAE.toLatin1().data()); scu.setPeerHostName(ip.data()); scu.setPeerPort(OFstatic_cast(Uint16, serverInfo.port.toInt())); scu.setPeerAETitle(aeTitle.data()); scu.setVerbosePCMode(OFFalse); scu.addPresentationContext(UID_FINDModalityWorklistInformationModel, syntaxes); // UID_FINDStudyRootQueryRetrieveInformationModel + scu.setACSETimeout(5); + scu.setDIMSETimeout(5); + scu.setConnectionTimeout(5); OFCondition cond = scu.initNetwork(); if (cond.bad()) diff --git a/src/event/EventCenter.h b/src/event/EventCenter.h index 3af4bbc..33dac1b 100644 --- a/src/event/EventCenter.h +++ b/src/event/EventCenter.h @@ -16,6 +16,9 @@ ADD_EVENT_VALUE(RequestContinueScan)\ ADD_EVENT_VALUE(RequestFullScanStop)\ ADD_EVENT_VALUE(RequestPreviewStop)\ ADD_EVENT_VALUE(RequestDrainage)\ +ADD_EVENT_VALUE(RequestWaterflood)\ +ADD_EVENT_VALUE(RequestWaterClean)\ +ADD_EVENT_VALUE(RequestWaterModeExit)\ ADD_EVENT_VALUE(ResponseDeviceTemperature)\ ADD_EVENT_VALUE(ResponsePreview)\ ADD_EVENT_VALUE(ResponsePreviewData)\ diff --git a/src/forms/scan/ScanFormWidget.cpp b/src/forms/scan/ScanFormWidget.cpp index 91b2d93..69260ce 100644 --- a/src/forms/scan/ScanFormWidget.cpp +++ b/src/forms/scan/ScanFormWidget.cpp @@ -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() diff --git a/src/forms/scan/ScanFormWidget.h b/src/forms/scan/ScanFormWidget.h index b9f4b1d..7be12c4 100644 --- a/src/forms/scan/ScanFormWidget.h +++ b/src/forms/scan/ScanFormWidget.h @@ -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(); }; diff --git a/src/icons/sanitize.png b/src/icons/sanitize.png new file mode 100644 index 0000000000000000000000000000000000000000..82bb6bd6463e6e9209359b2eaa87fc86befa7a30 GIT binary patch literal 4767 zcmeHL_g52Lx5f|wQ6!-%AcO$Yn{*Tf2~C=UbScuL2}l5Gf{`{9H6kEE2uhV+M5>4= zNZuC+U<9NE3?=Z=i^fpD!TSf?_1*QY@25L!&78Gn%|2((bDsU|XC~>onE@LsA1ea` z1DlZ{$^sk-M<)vtc&)Up!h^#xw1vS{hAN`KA_D`5oe@gsW|-4TE_noo(

H%5iNs$$Np5Y=73r#?l@I9D)w)& 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 literal 0 HcmV?d00001 diff --git a/src/stylesheet/Dark2.css b/src/stylesheet/Dark2.css index 709022d..746d19c 100644 --- a/src/stylesheet/Dark2.css +++ b/src/stylesheet/Dark2.css @@ -809,6 +809,17 @@ QToolButton#btnScan { QToolButton#btnDrainage { qproperty-icon:url(":/icons/drainage.png"); + padding: 5px; +} + +QToolButton#btnWaterflood { + qproperty-icon:url(":/icons/waterflood.png"); + padding: 5px; +} + +QToolButton#btnClean { + qproperty-icon:url(":/icons/sanitize.png"); + padding: 5px; } /*------AdminSettingForm---------------------------------------------------*/ diff --git a/src/translations/en_US.ts b/src/translations/en_US.ts index 63fed1a..988ebfe 100644 --- a/src/translations/en_US.ts +++ b/src/translations/en_US.ts @@ -408,6 +408,14 @@ progress:99% After lying down, click the confirm buttonto start scanning on the next side. + + Water injection failed. + + + + Cleaning failed. + + DialogManager @@ -1532,10 +1540,6 @@ The emergency button has been pushed. Please reset it before other operations.Confirm Drainage - - Make sure to open the drain valve ? - - Account @@ -1580,6 +1584,82 @@ The emergency button has been pushed. Please reset it before other operations.Waterflood + + Clean + + + + Please confirm if water injection is required ? + + + + Confirm Water Injection + + + + Please confirm if drainage is required ? + + + + Please confirm if cleaning and disinfection are required. ? + + + + Confirm cleaning + + + + Waterflooding + + + + Cleaning + + + + Drainage time out + + + + Waterflood time out + + + + Clean time out + + + + Waterflood failed. + + + + Drainage failed. + + + + Clean failed. + + + + Waterflood finished. + + + + Please click the confirm button for cleaning after disinfection. + + + + cleanning finished. + + + + exit failed. + + + + Drainage finished. Please do the disinfection in next step. + + ScanSearchCriteriaForm diff --git a/src/translations/zh_CN.ts b/src/translations/zh_CN.ts index e095d2c..ed9930e 100644 --- a/src/translations/zh_CN.ts +++ b/src/translations/zh_CN.ts @@ -468,89 +468,89 @@ DeviceManager - - - - + + + + DMS connection error DMS失去连接 - - + + progress:%1% 进度:%1% - + Patient can leave. progress:%1% 检查对象可以起身 进度:%1% - + Data quality assessment in progress progress:99% 数据质量判断中 进度:99% - - - + + + Initialize Failed. 初始化失败 - + Fail to connect to DB!Reboot device to try! 数据库连接失败,请重启设备后再试! - + Device is not ready, start scan operation failed! 设备状态错误,无法开始检查流程 - + Device is not ready, start empty scan operation failed! 设备状态错误,无法开始空水扫查 - + Scan completed! Please prepare for the next scan. After lying down, click the confirm buttonto start scanning on the next side. 扫查结束,请准备下一侧扫查。 请在趴好后再点击确认按钮! - + Scan completed! 扫查结束 - + Error: 错误: - + Start scan failed. Reason:time out. 扫查启动失败,原因:超时 - + Start scan failed. Reason:%1 扫查启动失败,原因:%1 - + Start CE Scan Failed. CE扫查启动失败 - + Shut down failed, please push emergency button to shutdown. 关机失败,请按紧急按钮进行关机。 @@ -559,43 +559,55 @@ After lying down, click the confirm buttonto start scanning on the next side.扫查数据上传失败 - + Create empty scan data failed 空水数据新增失败 - + Create scan data failed 扫查数据新增失败 - + Recon disconnected. 重建服务器已断开连接 - - + + Open pump failed. 排水阀打开失败 - + + + Water injection failed. + 注水启动失败 + + + + + Cleaning failed. + 清洁启动失败 + + + Recon error, can't start scan process 重建服务器错误,无法开始检查流程 - + Start auto locate failed 自动化定位启动失败 - + The data quality is low, please restart the data scan. 扫查数据质量较低,请重新开始检查流程 - + Device reset failed, please contact maintenance person 设备复位失败,请联系维修人员 @@ -2363,22 +2375,39 @@ The emergency button has been pushed. Please reset it before other operations.空扫 - - - - + + + + + + Drainage 排水 - - + + Account 账户 - - + + Drainage time out + 排水运行超时 + + + + Waterflood time out + 注水运行超时 + + + + Clean time out + 清洁运行超时 + + + + ShutDown 关机 @@ -2387,67 +2416,155 @@ The emergency button has been pushed. Please reset it before other operations.录入检查对象 - - + + Start Scan 开始检查流程 - + + + + Waterflood - + 注水 - - Make sure to open the drain valve ? - 请确认是否打开排水阀? + + + + + Clean + 清洁 - + + Please confirm if water injection is required ? + 请确认是否进行注水? + + + + + Confirm Water Injection + 注水确认 + + + + + Waterflooding + 注水中 + + + + Confirm Drainage 排水确认 - - - + + Please confirm if drainage is required ? + 请确认是否进行排水? + + + + Drainaging 排水中 - + + Please confirm if cleaning and disinfection are required. ? + 请确认是否进行清洁消毒? + + + + + + Confirm cleaning + 清洁确认 + + + + + + + Cleaning + 清洁中 + + + + exit failed. + 退出失败 + + + + Waterflood finished. + 注水完成 + + + + Please click the confirm button for cleaning after disinfection. + 请消毒完成后,再点击确认按钮进行清洁 + + + + Waterflood failed. + 注水失败 + + + + Drainage finished. Please do the disinfection in next step. + 排水完成,请下一步进行清洁消毒 + + + + Drainage failed. + 排水失败 + + + + Clean failed. + 清洁失败 + + + Shut down now ? 是否需要进行设备关机操作,请确认? - + Shut Down 关机 - - - + + + Please confirm checking patient information to start the process 请确定检查对象信息开始流程 - + Data scanning, please keep the current position and don't move. 数据扫查中,请检查对象保持当前姿势,不要移动 - + Data exporting, patient can leave the holder 数据导出中,检查对象可以离开检查仓 - + + cleanning finished. + 清洁完成 + + + Left side scan initiated, auto positioning in progress. 左侧扫查启动,自动定位中 - + Right side scan initiated, auto positioning in progress. 右侧扫查启动,自动定位中