diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index 9e1e0ac..b9519e4 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -83,10 +83,10 @@ QString getFullScanJson(QObject* obj) void DeviceManager::initDevice() { - dmsmq_init(); + mIsInitializing = true; + dmsmq_init(); if(JsonObject::Instance()->isDmsSimulator()) { - qDebug()<< JsonObject::Instance()->isDmsSimulator(); //set simulator QString simulatorCode = "{ \"code\":0, \"info\":\"1\"}"; QByteArray byteArray = simulatorCode.toUtf8(); @@ -132,7 +132,10 @@ void DeviceManager::initDevice() mPreviewScanAction = new DmsSyncAction(USRV_SCAN, ACT_SCAN_PREVIEW, this, "responsePreviewScan(const QString&)", this); mTransferAction = new DmsSyncAction(USRV_XFR, ACT_XFR_START, this, "responseTransfer(const QString&)", this); mGetTransferProgressAction = new DmsSyncAction(USRV_XFR, ACT_XFR_PROGRESS_PASSIVE, this, "responseGetTransferProgress(const QString&)", this); - + mCEScanAction = new DmsSyncAction(USRV_SCAN, ACT_SCAN_CE, this, "responseCEScan(const QString&)", this); + mGetCEStatusAction = new DmsSyncAction(USRV_SCAN, ACT_SCAN_CE_STATUS, this, "responseGetCEStatus(const QString&)", this); + mPumpControlAction = new DmsSyncAction(USRV_CONTROL, ACT_CTL_PUMP, this, "responsePumpControl(const QString&)", this); + //Async action mGetScanProgressAction = new DmsAsyncAction(USRV_SCAN, ACT_SCAN_PROGRESS_PASSIVE, this,"responseGetScanProgress(const QString&)", this); mGetSoftwareVersionAction = new DmsAsyncAction(USRV_INFOCFG, ACT_IFCFG_VERINFO, this,"responseGetSoftwareVersion(const QString&)", this); @@ -166,10 +169,55 @@ void DeviceManager::initDevice() { mStopScanAction->execute(); } - startTransfer(); + if(!getCEStatus()) + { + if(startCEScan()) + { + mScanProgressTimer = startTimer(500); + } + } + else + { + emit initializeProgress("33"); + QThread::msleep(500); + emit initializeProgress("66"); + QThread::msleep(500); + emit initializeProgress("100"); + emit initializeFinished(); + } + + startTransfer(); initEmptyScanMeasurementID(); //mGetSoftwareVersionAction->execute(); + +} + +void DeviceManager::processInitializeProgress(const QString& aProgress) +{ + if(!mIsInitializing) + { + return; + } + QJsonObject jsonObj = toJsonObject(aProgress); + int code = jsonObj["code"].toInt(); + QString msg = jsonObj["info"].toString(); + switch (code) + { + case 1: + emit initializeProgress(msg); + break; + case 2: + prepareFinishInitialize(); + emit initializeFinished(); + break; + case -1: + prepareFinishInitialize(); + THROW_ERROR(msg); + break; + default: + break; + } } bool DeviceManager::hasValidEmptyScan() @@ -209,7 +257,7 @@ void DeviceManager::startScan(const QString& json, bool empty) } } -void DeviceManager::processScanProcess(const QString& aProgress) +void DeviceManager::processScanProgress(const QString& aProgress) { if(mIsScanning == false) { @@ -274,6 +322,8 @@ void DeviceManager::prepareFinishScan(bool isNormalFinish, const QString& aReaso insertScanRecord(); } + startTransfer(); + if(isCompleteNotify) { QString msg = QString("Scan completed!"); @@ -283,8 +333,16 @@ void DeviceManager::prepareFinishScan(bool isNormalFinish, const QString& aReaso { TRIGGER_EVENT(InvokeOperationEnd, nullptr, var); } +} -startTransfer(); +void DeviceManager::prepareFinishInitialize() +{ + mIsInitializing = false; + if(mScanProgressTimer != -1) + { + killTimer(mScanProgressTimer); + mScanProgressTimer = -1; + } } void DeviceManager::stopFullScan() @@ -449,15 +507,28 @@ void DeviceManager::processReceiveDMSInfoResult(int aServerID, int aActionID, co break; case ACT_SCAN_PROGRESS_PASSIVE : emit responseGetScanProgress(aContents); - processScanProcess(aContents); - break; + if(mIsInitializing) + { + processInitializeProgress(aContents); + } + else + { + processScanProgress(aContents); + } + break; case ACT_SCAN_PRESIG: processPreviewData(aContents); break; case ACT_SCAN_STOP : emit responseStopScan(aContents); break; - default: + case ACT_SCAN_CE : + emit responseCEScan(aContents); + break; + case ACT_SCAN_CE_STATUS : + emit responseGetCEStatus(aContents); + break; + default: break; } break; @@ -494,6 +565,14 @@ void DeviceManager::processReceiveDMSInfoResult(int aServerID, int aActionID, co break; } break; + case USRV_CONTROL: + switch(aActionID) + { + case ACT_CTL_PUMP: + emit responsePumpControl(aContents); + break; + } + break; default: break; } @@ -582,6 +661,26 @@ bool DeviceManager::startFullScan(const QString& aPatientInfo) return true; } +bool DeviceManager::startCEScan() +{ + DmsSyncActionResult result = mCEScanAction->execute(); + if(!result.mIsSucessful) + { + QString message = QString("Dms connection error. Reason:%1").arg(result.mData); + THROW_ERROR(message); + return false; + } + + QJsonObject jsonObj = toJsonObject(result.mData); + if(jsonObj.contains("code") && jsonObj["code"].toInt() != 0) + { + QString msg = jsonObj["info"].toString(); + THROW_ERROR(msg); + return false; + } + return true; +} + void DeviceManager::getDeviceTemperature() { mGetDeviceTemperatureAction->execute(); @@ -896,3 +995,19 @@ int DeviceManager::getTransferProgress() return mTransferProgress; } +bool DeviceManager::getCEStatus() +{ + auto result = mGetCEStatusAction->execute(); + if(result.mIsSucessful) + { + QJsonObject jsonObj = toJsonObject(result.mData); + if(jsonObj["code"].toInt() == 0 ) + { + if(jsonObj["info"].toString().toInt() == 0) + { + return false; + } + } + } + return true; +} diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h index 6c3f644..1b5b845 100644 --- a/src/device/DeviceManager.h +++ b/src/device/DeviceManager.h @@ -101,11 +101,15 @@ private: void stopPreviewScan(); void getDeviceTemperature(); void getScanProcess(); + bool getCEStatus(); + bool startCEScan(); void startTransfer(); void initEmptyScanMeasurementID(); - void processScanProcess(const QString& aProgress); + void processScanProgress(const QString& aProgress); + void processInitializeProgress(const QString& aProgress); void prepareFinishScan(bool isNormalFinish, const QString& aReason = ""); + void prepareFinishInitialize(); void processAlarm(const QString& aAlarm); void processPreviewData(const QString& aPreviewData); void processGetSoftwareVersion(const QString& aSoftwareVersion); @@ -119,6 +123,7 @@ private: private slots: //DMS void processReceiveDMSInfoResult(int aServerID, int aActionID, const QString& aContents); + //Recon void processReconCreateEmptyScan(bool aResult, const QString& aScanID, const QString& aMessage); void processReconCreateScan(bool aResult, const QString& aScanID, const QString& aMessage); @@ -131,12 +136,15 @@ signals: void responseGetDeviceStatus(const QString& aDeviceStatus); void responseGetDeviceTemperature(const QString& aDeviceTemperature); void responseFullScan(const QString& aResponse); + void responseCEScan(const QString& aResponse); void responseGetScanProgress(const QString& aProgrese); void responseStopScan(const QString& aResponse); void responsePreviewScan(const QString& aResponse); void responseGetSoftwareVersion(const QString& aSoftwareVersion); void responseTransfer(const QString& aResponse); void responseGetTransferProgress(const QString& aProgress); + void responseGetCEStatus(const QString& aProgress); + void responsePumpControl(const QString aResponse); //Recon void createEmptyScanToRecon(const QString& aScanID, const QString& aPath); void createScanToRecon(const QString& aScanID, const QString& aPatientID, const QString& aReferenceID, const QString& aPath); @@ -144,6 +152,7 @@ signals: void updateReconStateFinished(); //GUI void initializeFinished(); + void initializeProgress(const QString& aProgress); void transferStatusUpdated(); @@ -156,6 +165,7 @@ private: bool mIsScanning = false; bool mIsTransfering = false; bool mIsPreviewing = false; + bool mIsInitializing = false; QString mCurrentScanMeasurementID = ""; QString mCurrentEmptyMeasurementID = ""; @@ -176,6 +186,8 @@ private: DmsSyncAction* mStopScanAction = nullptr; DmsSyncAction* mTransferAction = nullptr; DmsSyncAction* mGetTransferProgressAction = nullptr; + DmsSyncAction* mGetCEStatusAction = nullptr; + DmsSyncAction* mPumpControlAction = nullptr; DmsAsyncAction* mGetDeviceTemperatureAction = nullptr; DmsAsyncAction* mGetScanProgressAction = nullptr; diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index b66398e..4db5a2e 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -89,6 +89,7 @@ void DialogManager::requestLogin(QWidget* aParent) //Login 直接最顶层模态 if (!mFunctionDialog){ mFunctionDialog = new LoginDialog(aParent); + connect(mFunctionDialog, &LoginDialog::loginDialogShown, this, &DialogManager::loginDialogShown, Qt::QueuedConnection); } if(mFunctionDialog->isRunning()) diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index 7f48534..9ac9593 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -33,6 +33,7 @@ struct DialogResult }; class DialogManager:public QObject { + Q_OBJECT public: static DialogManager *Default() { static DialogManager manager; @@ -82,6 +83,9 @@ private: void setTopWidget(QWidget* widget); void releaseTopWidget(QWidget* expectedTopWidget); +signals: + void loginDialogShown(); + private: LoginDialog* mFunctionDialog; ScreenSaverWindow* mScreenSaverWindow; diff --git a/src/main.cpp b/src/main.cpp index 50e8ee3..1b2199e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -115,8 +115,6 @@ int main(int argc, char* argv[]) Timer.start(1000); thread.start(); - w.requestLogin(); - DeviceManager::Default()->initDevice(); ret = a.exec(); @@ -126,9 +124,8 @@ int main(int argc, char* argv[]) else { w.showFullScreen(); - w.requestLogin(); - DeviceManager::Default()->initDevice(); + ret = a.exec(); } DeviceManager::Default()->close(); diff --git a/src/windows/InitializeWidget.cpp b/src/windows/InitializeWidget.cpp new file mode 100644 index 0000000..72e3a14 --- /dev/null +++ b/src/windows/InitializeWidget.cpp @@ -0,0 +1,30 @@ +#include "InitializeWidget.h" + +#include +#include +#include + +InitializeWidget::InitializeWidget(QWidget* aParent) + : QWidget(aParent) + , mMessage(new QLabel(this)) + , mProgressBar(new QProgressBar(this)) +{ + setContentsMargins(0, 0, 0, 0); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(mMessage); + layout->addWidget(mProgressBar); + + QPixmap pixmap = QPixmap("./cfgs/initialize.jpg"); + mMessage->setPixmap(pixmap); + mMessage->setScaledContents(true); + mProgressBar->setTextVisible(true); + mProgressBar->setFormat("Initializing %p%"); + mProgressBar->setAlignment(Qt::AlignCenter); +} + +void InitializeWidget::setMessage(const QString& aMessage) +{ + mProgressBar->setValue(aMessage.toInt()); +} diff --git a/src/windows/InitializeWidget.h b/src/windows/InitializeWidget.h new file mode 100644 index 0000000..382b3c4 --- /dev/null +++ b/src/windows/InitializeWidget.h @@ -0,0 +1,24 @@ +#ifndef INITIALIZEWIDGET_H +#define INITIALIZEWIDGET_H + +#include + +class QLabel; +class QProgressBar; + +class InitializeWidget : public QWidget +{ + Q_OBJECT +public: + InitializeWidget(QWidget* aParent); + +public slots: + void setMessage(const QString& aMessage); + +private: + QLabel* mMessage; + QProgressBar* mProgressBar; + +}; + +#endif // INITIALIZEWIDGET_H diff --git a/src/windows/LoginDialog.cpp b/src/windows/LoginDialog.cpp index 0d0b37b..6ce5ecd 100644 --- a/src/windows/LoginDialog.cpp +++ b/src/windows/LoginDialog.cpp @@ -152,4 +152,11 @@ bool LoginDialog::isRunning() return mIsRunning; } +void LoginDialog::showEvent(QShowEvent* event) +{ + QDialog::showEvent(event); + emit loginDialogShown(); +} + + diff --git a/src/windows/LoginDialog.h b/src/windows/LoginDialog.h index 8a06a42..5fc765b 100644 --- a/src/windows/LoginDialog.h +++ b/src/windows/LoginDialog.h @@ -24,8 +24,12 @@ public: int exec() override; bool isRunning(); +protected: + void showEvent(QShowEvent *event) override; + signals: void sigUserLoginSuccessful(const QString& aUserCode); + void loginDialogShown(); private slots: void doLogin(); diff --git a/src/windows/MainWindow.cpp b/src/windows/MainWindow.cpp index b22e167..9bbbaf9 100644 --- a/src/windows/MainWindow.cpp +++ b/src/windows/MainWindow.cpp @@ -8,6 +8,7 @@ #include #include +#include "InitializeWidget.h" #include "event/EventCenter.h" #include "forms/TabFormWidget.h" #include "forms/recon/ReconFormWidget.h" @@ -29,6 +30,7 @@ MainWindow::MainWindow(QWidget* aParent) , mDebugConsoleWidget(nullptr) , mDebugMessageConsole(nullptr) , mTabWidget(new QTabWidget(this)) + , mInitializWidget(new InitializeWidget(this)) , mAdminTabIndex(-1) , mThread(nullptr) , mIsDebugMode(false) @@ -46,25 +48,14 @@ MainWindow::MainWindow(QWidget* aParent) connect(DeviceManager::Default(), &DeviceManager::raiseGlobalInfo, this, &MainWindow::triggerInfo); connect(EventCenter::Default(), &EventCenter::ReloadLanguage, this, &MainWindow::reloadLanguage); connect(EventCenter::Default(), &EventCenter::RequestScreenSaver, this, &MainWindow::requestScreenSaver); - GUIErrorHandle::Default()->init(); - mThread = QThread::create([]() { - QThread::sleep(10); - int f = 0x00100001; - for (int i = 0; i < 8; ++i) - { - QThread::sleep(10); - f = f << (i * 4); - char* v = (char*)&f; - QString msg; - msg.append("w "); - msg.append(v[0]); - msg.append(v[1]); - msg.append(v[2]); - msg.append(v[3]); - EventCenter::Default()->triggerEvent(GUIErrorRaise, nullptr, (QObject*)&msg); - } + connect(DeviceManager::Default(), &DeviceManager::initializeFinished, this, &MainWindow::requestLogin); + connect(DeviceManager::Default(), &DeviceManager::initializeProgress, mInitializWidget, &InitializeWidget::setMessage); + connect(DialogManager::Default(), &DialogManager::loginDialogShown, this, [this]() + { + mInitializWidget->setVisible(false); + mTabWidget->setVisible(true); }); - mThread->start(); + GUIErrorHandle::Default()->init(); QApplication::setActiveWindow(centralWidget()); } @@ -97,6 +88,9 @@ void MainWindow::initializeLayout() QWidget* topBarWidget = new TopBarWidget(this); layout->addWidget(topBarWidget); layout->addWidget(mTabWidget); + layout->addWidget(mInitializWidget); + + mTabWidget->setVisible(false); } void MainWindow::initializeTabWidget() diff --git a/src/windows/MainWindow.h b/src/windows/MainWindow.h index e1ed046..27b5dac 100644 --- a/src/windows/MainWindow.h +++ b/src/windows/MainWindow.h @@ -18,6 +18,7 @@ class QGestureEvent; class QSwipeGesture; class QPanGesture; class QDockWidget; +class InitializeWidget; class MainWindow : public QMainWindow { @@ -29,13 +30,13 @@ public: static void QMessageOutput(QtMsgType aType, const QMessageLogContext& aContext, const QString& aMessage); void centerWidgetHide(); void centerWidgetShow(); - void requestLogin(); void requestScreenSaver(); QTextEdit* getEdit(); void debugConsoleOn(); void grabGestures(const QList& aGestures); public slots: + void requestLogin(); void triggerError(const QString&); void triggerInfo(const QPair&); @@ -58,6 +59,7 @@ private: QDockWidget* mDebugConsoleWidget; QTextEdit* mDebugMessageConsole; QTabWidget* mTabWidget; + InitializeWidget* mInitializWidget; int mAdminTabIndex; QThread* mThread; bool mIsDebugMode;