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 0000000..82bb6bd Binary files /dev/null and b/src/icons/sanitize.png differ diff --git a/src/icons/waterflood.png b/src/icons/waterflood.png new file mode 100644 index 0000000..d6a3585 Binary files /dev/null and b/src/icons/waterflood.png differ 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. 右侧扫查启动,自动定位中