From 23a747bde43e5ba17f497377447bb8a8e719569c Mon Sep 17 00:00:00 2001 From: sunwen Date: Wed, 29 May 2024 14:29:58 +0800 Subject: [PATCH] feat: Add recon state in GUI. --- src/device/DeviceManager.cpp | 44 ++++++++++++++++++++++++++------- src/device/DeviceManager.h | 4 +++ src/device/UsctStateManager.cpp | 42 +++++++++++++++++++++++++++---- src/device/UsctStateManager.h | 17 +++++++------ src/recon/ReconManager.cpp | 4 ++- src/recon/ReconManager.h | 1 + 6 files changed, 89 insertions(+), 23 deletions(-) diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index ed829fb..dc3a29f 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -119,8 +119,8 @@ void DeviceManager::initDevice() controlDrainage(*(QString*)detail); }); //AutoLocate - connect(EventCenter::Default(), &EventCenter::StartScanProcess, this, &DeviceManager::startAutoLocate); - connect(EventCenter::Default(), &EventCenter::StopScanProcess, this, &DeviceManager::stopAutoLocate); + connect(EventCenter::Default(), &EventCenter::StartScanProcess, this, &DeviceManager::startScanProcess); + connect(EventCenter::Default(), &EventCenter::StopScanProcess, this, &DeviceManager::stopScanProcess); //Sync action mGetDeviceStatusAction = new DmsSyncAction(USRV_SCAN, ACT_SCAN_STATUS, this, "responseGetDeviceStatus(const QString&)", this); @@ -181,7 +181,9 @@ void DeviceManager::initDevice() QTimer* reconConnectionTimer = new QTimer(this); reconConnectionTimer->start(CHECK_RECON_CONNECTION_TIME); ReconManager::getInstance()->moveToThread(mReconHttpThread); - connect(reconConnectionTimer, &QTimer::timeout, ReconManager::getInstance(), &ReconManager::checkReconConnection); + connect(ReconManager::getInstance(), &ReconManager::reconStateResponsed, UsctStateManager::getInstance(), &UsctStateManager::updateReconState); + connect(this, &DeviceManager::checkReconConnection, ReconManager::getInstance(), &ReconManager::checkReconConnection); + connect(reconConnectionTimer, &QTimer::timeout, this, &DeviceManager::prepareCheckReconConnection); connect(this, &DeviceManager::createEmptyScanToRecon, ReconManager::getInstance(), &ReconManager::createEmptyScan); connect(this, &DeviceManager::createScanToRecon, ReconManager::getInstance(), &ReconManager::createScan); connect(ReconManager::getInstance(), &ReconManager::createScanResponsed, this, &DeviceManager::processReconCreateScan); @@ -306,7 +308,6 @@ void DeviceManager::startScan(const QString& json, bool empty) { QString msg = "Start scan..."; TRIGGER_EVENT(GUIEvents::InvokeOperationStart, nullptr, (QObject*)&msg); - AppGlobalValues::setInProcessing(true); mIsScanning = true; mIsEmptyScan = empty; QJsonObject patientInfo = QJsonDocument::fromJson(json.toUtf8()).object()["Patient Info"].toObject(); @@ -376,7 +377,6 @@ void DeviceManager::prepareFinishScan(bool isNormalFinish, const QString& aReaso killTimer(mScanProgressTimer); mScanProgressTimer = -1; } - AppGlobalValues::setInProcessing(false); mIsScanning = false; QString message = aReason; QObject* var = message.isEmpty() ? nullptr : (QObject*)&message; @@ -1257,6 +1257,27 @@ void DeviceManager::updateReconConnectionState(bool aIsConnected) EventCenter::Default()->triggerEvent(ReconConnectionUpdated, nullptr, (QObject*)&aIsConnected); } +void DeviceManager::startScanProcess() +{ + if( !UsctStateManager::getInstance()->getState(ReconConnectionState) || + !UsctStateManager::getInstance()->getState(ReconState) || + !UsctStateManager::getInstance()->getState(ReconDBState)) + { + TRIGGER_EVENT(StopScanProcess, nullptr, nullptr); + QString errorMessage = tr("Recon error, can't start scan process"); + THROW_ERROR(errorMessage); + return; + } + AppGlobalValues::setInProcessing(true); + startAutoLocate(); +} + +void DeviceManager::stopScanProcess() +{ + AppGlobalValues::setInProcessing(false); + stopAutoLocate(); +} + bool DeviceManager::startAutoLocate() { if(ScanProcessSequence::getInstance()->getScanPositionSize() == 0) @@ -1275,10 +1296,6 @@ bool DeviceManager::startAutoLocate() mGetAutoLocatePositionTimer = startTimer(1000); return true; } - else - { - stopAutoLocate(); - } } TRIGGER_EVENT(StopScanProcess, nullptr, nullptr); QString errorMessage = tr("Start auto locate failed"); @@ -1361,3 +1378,12 @@ void DeviceManager::checkDataQuality() TRIGGER_EVENT(StopScanProcess, nullptr, nullptr); return; } + +void DeviceManager::prepareCheckReconConnection() +{ + if(AppGlobalValues::InProcessing().toBool()) + { + return; + } + emit checkReconConnection(); +} diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h index 296199d..46f2a10 100644 --- a/src/device/DeviceManager.h +++ b/src/device/DeviceManager.h @@ -94,6 +94,8 @@ private: //-----------------new DeviceStatus getDeviceStatus(); + void startScanProcess(); + void stopScanProcess(); bool startFullScan(const QString& aPatientInfo); void stopFullScan(); void stopPreviewScan(); @@ -138,6 +140,7 @@ private slots: void processReconQueryScanState(bool aResult, const QVariant& aState); void startCreateReconRecord(); void updateReconConnectionState(bool aIsConnected); + void prepareCheckReconConnection(); //GUI void scanTimeout(); @@ -169,6 +172,7 @@ signals: void createScanToRecon(const QString& aScanID, const QString& aStudyUID,const QString& aMPPSUID, const QString& aReferenceID, const QString& aPath); void queryScanStatusToRecon(const QStringList& aScanIDs); void updateReconStateFinished(); + void checkReconConnection(); //GUI void initializeFinished(); void initializeProgress(const QString& aProgress); diff --git a/src/device/UsctStateManager.cpp b/src/device/UsctStateManager.cpp index be042ca..82a6905 100644 --- a/src/device/UsctStateManager.cpp +++ b/src/device/UsctStateManager.cpp @@ -24,19 +24,19 @@ UsctStateManager::UsctStateManager(QObject* aParent) void UsctStateManager::setState(int aStateCode, bool aState) { - bool stateTemp = mState[aStateCode]; - mState[aStateCode] = aState; - if(stateTemp != aState) + if(aState == mState[aStateCode]) { - bool UsctState = getUsctState(); - EventCenter::Default()->triggerEvent(UsctStateUpdated, nullptr, (QObject*)&UsctState); + return; } mState[aStateCode] = aState; + bool UsctState = getUsctState(); + EventCenter::Default()->triggerEvent(UsctStateUpdated, nullptr, (QObject*)&UsctState); if(aState) { int msg = aStateCode; EventCenter::Default()->triggerEvent(ErrorStateUnactive, nullptr, (QObject*)&msg); } + else { QPair msg(QPair(aStateCode, getStateErrorMessage(aStateCode))); EventCenter::Default()->triggerEvent(ErrorStateActive, nullptr, (QObject*)&msg); @@ -65,6 +65,38 @@ QString UsctStateManager::getStateErrorMessage(int aStateCode) case ReconPacsState : return "Recon Pacs Connection Error"; case ReconEmptyScanState : return "Recon Empty Scan Data Error"; case ReconDBState : return "Recon Database Connection Error"; + case ReconConnectionState : return "Recon Connection Error"; default: return "Unknow Error"; } } + +void UsctStateManager::updateReconState(bool aIsConnected,int aState) +{ + setState(ReconConnectionState, aIsConnected); + for (int i = 0; i < 5; ++i) + { + + int mask = 1 << i; + bool result = true; + if (aState & mask) + { + result = false; + } + switch(i) + { + case ReconState: setState(ReconState, result); break; + case ReconDBState: setState(ReconDBState, result); break; + case ReconEmptyScanState: setState(ReconEmptyScanState, result); break; + case ReconPacsState: setState(ReconPacsState, result); break; + case ReconMppsState: setState(ReconMppsState, result); break; + default: break; + } + } +} + +bool UsctStateManager::getState(UsctState aStateCode) +{ + return mState[aStateCode]; +} + + diff --git a/src/device/UsctStateManager.h b/src/device/UsctStateManager.h index b1f5757..dddd388 100644 --- a/src/device/UsctStateManager.h +++ b/src/device/UsctStateManager.h @@ -6,14 +6,14 @@ enum UsctState { - DmsState = 0, //Dms是否有致命错误,false代表存在致命错误 - DmsConnectionState, - ReconState, //Recon是否有致命错误,false代表存在致命错误 - ReconMppsState, - ReconPacsState, - ReconConnectionState, + ReconState = 0, //Recon是否有致命错误,false代表存在致命错误 + ReconDBState, ReconEmptyScanState, - ReconDBState + ReconPacsState, + ReconMppsState, + ReconConnectionState, + DmsState, //Dms是否有致命错误,false代表存在致命错误 + DmsConnectionState }; class UsctStateManager : public QObject @@ -24,11 +24,12 @@ public: bool getUsctState(); void setState(int aStateCode, bool aState); + void updateReconState(bool aIsConnected,int aState); + bool getState(UsctState aStateCode); private: QString getStateErrorMessage(int aStateCode); - private: UsctStateManager(QObject* aParent = nullptr); UsctStateManager(const UsctStateManager&); diff --git a/src/recon/ReconManager.cpp b/src/recon/ReconManager.cpp index 979eff5..2e39202 100644 --- a/src/recon/ReconManager.cpp +++ b/src/recon/ReconManager.cpp @@ -110,14 +110,16 @@ void ReconManager::checkReconConnection() emit restartCreatReconRecord(); } mIsConnected = response.good(); + int state = 0; if (mIsConnected) { cJSON* json = cJSON_Parse(response.message().data()); cJSON* stateProperty = cJSON_GetObjectItem(json, "State"); - int state = stateProperty->valueint; + state = stateProperty->valueint; cJSON_Delete(json); qDebug()<<"Recon State:"<