diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index 3e1db38..32c555f 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -146,6 +146,7 @@ void DeviceManager::initDevice() 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); + mEmergencyResetAction = new DmsAsyncAction(USRV_CONTROL, ACT_CTL_EMG_RESET, this,"responseEmergencyButtonReset(const QString&)", this); connect(mGetSoftwareVersionAction, &DmsAsyncAction::timeout, [this]() { emit getDmsVersionResponsed("DMS Version Fetch Error"); @@ -764,6 +765,9 @@ void DeviceManager::processReceiveDMSInfoResult(int aServerID, int aActionID, co emit responseGetAutoLocatePosition(aContents); processAutoLocatePosition(aContents); break; + case ACT_CTL_EMG_RESET: + processEmergencyButtonReset(aContents); + break; } break; default: @@ -779,6 +783,19 @@ void DeviceManager::processAlarm(const QString& aAlarm) qDebug()<<"processAlarm : "<= 400 && alarmCode < 500) { + switch (alarmCode) + { + case 492://left emergency button pushed + prepareFinishScan(false,""); + emit emergencyButtonPushed(true, false); + return; + case 494://right emergency button pushed + prepareFinishScan(false,""); + emit emergencyButtonPushed(false, false); + return; + default: + break; + } if(mIsScanning) { prepareFinishScan(false, alarm); @@ -912,7 +929,7 @@ void DeviceManager::getScanProcess() void DeviceManager::shutdownDms() { - if(mIsTransfering) + if(mIsTransfering) { QString msg = tr("Data is currently being transmitted, please shut down later."); THROW_ERROR(msg); @@ -1438,3 +1455,31 @@ void DeviceManager::prepareCheckReconConnection() } emit checkReconConnection(); } + +void DeviceManager::processEmergencyButtonReset(const QString& aResponse) +{ + QJsonObject jsonObj = toJsonObject(aResponse); + int code = jsonObj["code"].toInt(); + if(code == -1) + { + QString errorMessage = tr("Device reset failed, please contact maintenance person"); + THROW_ERROR(errorMessage); + } + + if(jsonObj["info"].toString() == "left" ) + { + emit emergencyButtonPushed(true, true); + return; + } + + if(jsonObj["info"].toString() == "right" ) + { + emit emergencyButtonPushed(false, true); + return; + } +} + +void DeviceManager::prepareEmergencyReset() +{ + mEmergencyResetAction->execute(); +} diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h index 237924d..53d11f2 100644 --- a/src/device/DeviceManager.h +++ b/src/device/DeviceManager.h @@ -69,6 +69,7 @@ public: bool hasValidEmptyScan(); bool updateTransferProgress(); int getTransferProgress(); + void prepareEmergencyReset(); public slots: void updateReconState(); @@ -125,6 +126,7 @@ private: void processShutDownDms(const QString& aResponse); void processPumpResult(const QString& aResponse); void processGetSoftwareVersion(const QString& aResponse); + void processEmergencyButtonReset(const QString& aResponse); void insertEmptyScanRecord(); void insertScanRecord(); @@ -167,6 +169,7 @@ signals: void responseStopAutoLocate(const QString& aResponse); void responseGetAutoLocatePosition(const QString& aResponse); void responseCheckDataQuality(const QString& aResponse); + void responseEmergencyButtonReset(const QString& aResponse); //Recon void createEmptyScanToRecon(const QString& aScanID, const QString& aPath); void createScanToRecon(const QString& aScanID, const QString& aStudyUID,const QString& aMPPSUID, const QString& aReferenceID, const QString& aPath); @@ -185,6 +188,7 @@ signals: void shutdownDmsSended(); void shutdownDmsFailed(); void getDmsVersionResponsed(const QString& aDmsVersion); + void emergencyButtonPushed(bool aIsLeft, bool aIsReset); private: @@ -241,6 +245,7 @@ private: DmsAsyncAction* mPumpControlAction = nullptr; DmsAsyncAction* mGetAutoLocatePositionAction = nullptr; DmsAsyncAction* mGetSoftwareVersionAction = nullptr; + DmsAsyncAction* mEmergencyResetAction = nullptr; InfoReceiveWorker* mInfoReceiveWorker = nullptr; diff --git a/src/device/daq_define.h b/src/device/daq_define.h index 83ae357..28a78cc 100644 --- a/src/device/daq_define.h +++ b/src/device/daq_define.h @@ -90,6 +90,7 @@ enum{ ACT_CTL_MOTION_START, //启动自动定位功能 ACT_CTL_MOTION_STOP, //停止自动定位功能 ACT_CTL_MOTION_POSITION, //查询自动定位状态(位置) + ACT_CTL_EMG_RESET, //复位急停按钮 ACT_CTL_DRIVER, //驱动控制(加载卸载驱动) ACT_CTL_EXIT, //退出程序和守护进程 @@ -98,7 +99,7 @@ enum{ //设备升级 enum{ ACT_FMW_NONE = 0, - ACT_FMW_RESP, //上报升级结果 + ACT_FMW_RESP, //上报升级结果 ACT_FMW_CFG, //固件升级配置(json格式) ACT_FMW_LOAD, //下载固件到设备 ACT_FMW_START, //启动固件升级 @@ -142,6 +143,7 @@ enum{ ACT_DIG_PROGRESS, //进度上报 ACT_DIG_WARNING, //报警状态上报 ACT_DIG_MISCT, //杂类测试。 + ACT_DIG_SIMULATOR, //模拟功能配置 }; -#endif \ No newline at end of file +#endif diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index a23c881..79619e3 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -38,6 +38,7 @@ #include "utilities/GetLockScreenTimeHelper.h" #include "utilities/GetProtocalHelper.h" #include "utilities/WorklistFilterHelper.h" +#include "device/DeviceManager.h" #include "appvals/AppGlobalValues.h" #include "json/jsonobject.h" @@ -54,6 +55,8 @@ DialogManager::DialogManager() , mScreenSaverWindow(nullptr) , mOperationMessageDialog(nullptr) , mSyncDialog(nullptr) + , mLeftEmergencyDialog(nullptr) + , mRightEmergencyDialog(nullptr) , mTopWidget(nullptr) , mCEchoTestDialog(nullptr) , mWorklistLoadingDialog(nullptr) @@ -61,17 +64,27 @@ DialogManager::DialogManager() } -void DialogManager::init(QWidget* aParent) { +DialogManager::~DialogManager() +{ + clearMessageDialog(); + //delete mScreenSaverWindow; +} + +void DialogManager::init(QWidget* aParent) +{ connect(EventCenter::Default(), &EventCenter::DeviceErrorRaise,this,&DialogManager::raiseDeviceError); connect(EventCenter::Default(), &EventCenter::DeviceInfoRaise,this,&DialogManager::raiseDeviceInfo); connect(EventCenter::Default(), &EventCenter::InvokeOperationStart,this,&DialogManager::invokeOperationStart); connect(EventCenter::Default(), &EventCenter::InvokeOperationProgress,this,&DialogManager::invokeOperationProgress); connect(EventCenter::Default(), &EventCenter::InvokeOperationPending,this,&DialogManager::invokeOperationPending); connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd); + connect(DeviceManager::Default(), &DeviceManager::emergencyButtonPushed, this, &DialogManager::requestEmergencyButtonPushed); MultyMessageDialogManager::getInstance()->setDialogParent(aParent); mTopWidget = aParent; mScreenSaverWindow = new ScreenSaverWindow(); mWorklistLoadingDialog = new WorklistLoadingDialog(aParent); + mLeftEmergencyDialog = nullptr; + mRightEmergencyDialog = nullptr; connect(EventCenter::Default(), &EventCenter::WorklistSearchFinished, mWorklistLoadingDialog, &QDialog::accept); } @@ -609,11 +622,6 @@ void DialogManager::clearMessageDialog() { } } -DialogManager::~DialogManager() { - clearMessageDialog(); - //delete mScreenSaverWindow; -} - void DialogManager::raiseMultyMessageDialog(const QString& aMessage, MessageLevel aMessageLevel) { MultyMessageDialogManager::getInstance()->raiseDialog(aMessage, aMessageLevel); @@ -649,3 +657,75 @@ void DialogManager::setFocusToTopDialog() mTopWidget->setFocus(); } } + +void DialogManager::requestEmergencyButtonPushed(bool aIsLeftButton, bool aIsRest) +{ + qDebug()<<"requestEmergencyButtonPushed" << aIsLeftButton<setEnableExitButton(true); + } + else + { + dialog->setEnableExitButton(false); + if(!dialog->isHidden()) + { + return; + } + if(mFunctionDialog!= nullptr && mFunctionDialog->isRunning()) + { + dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint | Qt::BypassWindowManagerHint ); + } + else + { + dialog->setWindowFlags(dialog->windowFlags() & ~Qt::WindowStaysOnTopHint & ~Qt::BypassWindowManagerHint ); + } + + if (nullptr != mTopWidget && mTopWidget->inherits("GUIMessageDialog")) + { + GUIMessageDialog* parent = qobject_cast(mTopWidget); + if (parent->getDialogPos().y() + 320 + GUIMESSAGEDIALOG_OFFSET < 1080) + { + dialog->moveDialog(parent->getDialogPos() + QPoint(GUIMESSAGEDIALOG_OFFSET, GUIMESSAGEDIALOG_OFFSET)); + } + } + + dialog->showMessage(message); + + dialog->stopLoading(); + dialog->showExitButton(); + setTopWidget(dialog); + dialog->setWindowModality(Qt::WindowModal); + dialog->showFullScreen (); + dialog->exec(); + releaseTopWidget(dialog); + + if( (mLeftEmergencyDialog == nullptr || mLeftEmergencyDialog->isHidden()) && + (mRightEmergencyDialog == nullptr || mRightEmergencyDialog->isHidden())) + { + DeviceManager::Default()->prepareEmergencyReset(); + } + + delete dialog; + } +} diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index 46831b3..a1c8bdb 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -88,6 +88,7 @@ public: void invokeOperationEnd(QObject* parent, QObject* msg); void setFocusToTopDialog(); void requestLoadingWorklist(); + void requestEmergencyButtonPushed(bool aIsLeftButton, bool aIsRest); private: void clearMessageDialog(); @@ -102,6 +103,8 @@ private: ScreenSaverWindow* mScreenSaverWindow; QPointer mOperationMessageDialog; QPointer mSyncDialog; + QPointer mLeftEmergencyDialog; + QPointer mRightEmergencyDialog; QWidget* mTopWidget; std::mutex mMutex; CEchoTestDialog* mCEchoTestDialog; diff --git a/src/dialogs/GUIMessageDialog.cpp b/src/dialogs/GUIMessageDialog.cpp index 2a83fc8..1717eb3 100644 --- a/src/dialogs/GUIMessageDialog.cpp +++ b/src/dialogs/GUIMessageDialog.cpp @@ -199,4 +199,8 @@ QPoint GUIMessageDialog::getDialogPos() { return mUI->innerWidget->pos(); } -; + +void GUIMessageDialog::setEnableExitButton(bool aIsEnabled) +{ + mBtnAppend->setEnabled(aIsEnabled); +} diff --git a/src/dialogs/GUIMessageDialog.h b/src/dialogs/GUIMessageDialog.h index 609c2cc..d916204 100644 --- a/src/dialogs/GUIMessageDialog.h +++ b/src/dialogs/GUIMessageDialog.h @@ -28,6 +28,8 @@ public: void setOpacity(double); void moveDialog(const QPoint& aPos); QPoint getDialogPos(); + void setEnableExitButton(bool aIsEnabled); + protected: void timerEvent(QTimerEvent* event) override ; private: diff --git a/src/stylesheet/Dark2.css b/src/stylesheet/Dark2.css index 520f2ff..d2fd6fd 100644 --- a/src/stylesheet/Dark2.css +++ b/src/stylesheet/Dark2.css @@ -858,6 +858,10 @@ QToolButton#mppsSettingsButton{ text-align: center; } +QPushButton#cechoButton{ + background: #365880; +} + /*------AccountTableForm-----------------------------------------------------*/ QWidget#commandWidgetnoBBorder { min-height: 123px; @@ -876,9 +880,6 @@ QWidget#SearchCriteriaForm QPushButton:disabled { color:#505050; } - - - /*------Dialogs--------------------------------------------------------------*/ /*------GUIFormBaseDialog----------------------------------------------------*/ diff --git a/src/translations/en_US.ts b/src/translations/en_US.ts index 4a716ca..c07e7de 100644 --- a/src/translations/en_US.ts +++ b/src/translations/en_US.ts @@ -237,26 +237,26 @@ Connecting from device to %1:%2...... + + Connection test from device to %1:%2 failed + + Connection test from device to %1:%2 successed + + Connecting from server to %1:%2...... + + Connection test from server to %1:%2 successed - - Connection test from device to %1:%2 failed - - Connection test from server to %1:%2 failed - - Connecting from server to %1:%2...... - - CEchoTestDialog @@ -411,6 +411,21 @@ progress:99% Error: + + Device reset failed, please contact maintenance person + + + + + DialogManager + + The left emergency button has been pressed. Please reset left the emergency button before operating the device + + + + The right emergency button has been pressed. Please reset right the emergency button before operating the device + + DicomCfgDialog @@ -1293,11 +1308,11 @@ progress:99% PatientInformation - Scheduled Date + Accession Number - Accession Number + Scheduled Date diff --git a/src/translations/zh_CN.ts b/src/translations/zh_CN.ts index c04d0f7..6b53b4b 100644 --- a/src/translations/zh_CN.ts +++ b/src/translations/zh_CN.ts @@ -468,139 +468,144 @@ 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! 扫查结束 - + Error: 错误: - + Start scan failed. Reason:time out. 扫查启动失败,原因:超时 - + Start scan failed. Reason:%1 扫查启动失败,原因:%1 - + Start CE Scan Failed. CE扫查启动失败 - + Data is currently being transmitted, please shut down later. 数据传输中,请稍后再执行关机。 - + Shut down failed, please push emergency button to shutdown. 关机失败,请按紧急按钮进行关机。 - - - + + + Scan data transfer failed. 扫查数据上传失败 - + Scan data transfer Succeeded! - + Create empty scan data failed 空水数据新增失败 - + Create scan data failed 扫查数据新增失败 - + Recon disconnected. 重建服务器已断开连接 - - + + Open pump 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 + 设备复位失败,请联系维修人员 + DialogManager @@ -616,6 +621,16 @@ progress:99% Last 7 days 过去7天 + + + The left emergency button has been pressed. Please reset left the emergency button before operating the device + 检查对象左侧急停按钮被按下,请将左侧急停按钮复位后,再进行设备操作 + + + + The right emergency button has been pressed. Please reset right the emergency button before operating the device + 检查对象右侧急停按钮被按下,请将右侧急停按钮复位后,再进行设备操作 + DicomCfgDialog @@ -1781,6 +1796,11 @@ progress:99% No + + + Server AE + 服务器AE + AETitle @@ -1796,11 +1816,6 @@ progress:99% Port - - - Server AE - 服务器AE - Use SC @@ -2151,44 +2166,44 @@ progress:99% 刷新 - - + + Patient ID 检查对象ID - - + + Accession Number 检查单号 - - + + Patient Name 检查对象姓名 - - + + Operator Name 操作员 - - + + Scan Time 检查时间 - - + + Laterality 检查位置 - - + + State 重建状态 @@ -2265,49 +2280,49 @@ progress:99% 数据传输失败 - + Transfer completed 数据传输成功 - - + + Recon create failed 重建任务建立失败 - - + + Wait to recon 等待重建 - + Recon ing 重建中 - + Recon failed 重建失败 - + Recon succeed 重建成功 - + PACS failed 归档失败 - + PACS succeed 归档成功 - + Unknow 未知