From 1d6631eb1f7b2207e6b5dc63616d5105c0e076e9 Mon Sep 17 00:00:00 2001 From: Krad Date: Wed, 13 Oct 2021 17:38:31 +0800 Subject: [PATCH] Add a class called DeviceManager to manage ShimLib operation. --- src/device/DeviceManager.cpp | 126 +++++++++++++++++++++++++++++++++++ src/device/DeviceManager.h | 32 +++++++++ 2 files changed, 158 insertions(+) create mode 100644 src/device/DeviceManager.cpp create mode 100644 src/device/DeviceManager.h diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp new file mode 100644 index 0000000..91a76bb --- /dev/null +++ b/src/device/DeviceManager.cpp @@ -0,0 +1,126 @@ +// +// Created by Krad on 2021/10/12. +// +#include "ShimLib/ShimLib.h" +#include "DeviceManager.h" +#include "../event/EventCenter.h" +#include + +#define triggerEvent EventCenter::Default()->triggerEvent + +const char * getJsonFromPatInf(QObject* obj) +{ + return nullptr; +} + +void DeviceManager::initDevice() { + // empty scan + connect(EventCenter::Default(),&EventCenter::RequestEmptyScan,[=](){ + const char * json = ""; + processScan(json); + }); + // Patient scan + connect(EventCenter::Default(),&EventCenter::RequestPatientScan,[=](QObject* sender, QObject* detail){ + const char * json = getJsonFromPatInf(detail); + if (json) + { + processScan(json); + } + }); + // stop + connect(EventCenter::Default(),&EventCenter::RequestStop,[=](){ + triggerEvent(GUIEvents::InvokeOperationStart, nullptr, nullptr); + StatusInfo inf = GetStatus(); + if (inf.status==SCANING) + { + //ScanControl fail + if(ScanControl(STOP)) + { + triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + lastStatus = -1; + previewing = false; + return; + } + lastStatus = -1; + previewing = false; + triggerEvent(GUIEvents::InvokeOperationEnd, nullptr, nullptr); + triggerEvent(GUIEvents::ResponseStop, nullptr, nullptr); + } + }); + // preview + connect(EventCenter::Default(),&EventCenter::RequestPreviewScan,[=](){ + triggerEvent(GUIEvents::InvokeOperationStart, nullptr, nullptr); + StatusInfo inf = GetStatus(); + if (inf.status==READY) + { + //ScanControl + if(!ScanControl(PREVIEW_SCAN)) + { + lastStatus = SCANING; + previewing = true; + timerID = startTimer(500); + triggerEvent(GUIEvents::ResponsePreview, nullptr, nullptr); + triggerEvent(GUIEvents::InvokeOperationEnd, nullptr, nullptr); + return; + } + } + triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + }); +} + +void DeviceManager::timerEvent(QTimerEvent *event) { + StatusInfo inf = GetStatus(); + if (inf.status==SCANING) + { + lastStatus = SCANING; + //normal scan + if(!previewing) + { + QVariant var(inf.progress); + triggerEvent(GUIEvents::InvokeOperationProgress, nullptr, (QObject*)&var); + } + //preview scan + else{ + const char * data = GetPreviewData(); + QByteArray* bytes = new QByteArray(data); + triggerEvent(GUIEvents::ResponsePreviewData, nullptr, (QObject*)bytes); + } + + } else{ + if (lastStatus == SCANING && !errorOccured) + { + QVariant var(true); + triggerEvent(GUIEvents::InvokeOperationEnd, nullptr, (QObject*)&var); + lastStatus = -1; + previewing = false; + } + //内部错误,导致Scan停止 + else if (lastStatus == SCANING && errorOccured) + { + //正常情况下,设备应该已经调用的错误callback,然后会回归Ready状态,清理lastStatus即可 + lastStatus = -1; + previewing = false; + } + killTimer(timerID); + } +} + +void DeviceManager::processScan(const char *json) { + triggerEvent(GUIEvents::InvokeOperationStart, nullptr, nullptr); + int ret = SetScanInf(json); + if (ret){ + triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + return; + } + StatusInfo inf = GetStatus(); + if (inf.status==READY) + { + //ScanControl fail + if(!ScanControl(SCAN)) { + lastStatus = SCANING; + timerID = startTimer(300); + return; + } + } + triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); +} diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h new file mode 100644 index 0000000..d0bffd0 --- /dev/null +++ b/src/device/DeviceManager.h @@ -0,0 +1,32 @@ +// +// Created by Krad on 2021/10/12. +// + +#ifndef GUI_DEVICEMANAGER_H +#define GUI_DEVICEMANAGER_H + +#include +class DeviceManager:public QObject { + Q_OBJECT + +public: + static DeviceManager* Default(){ + static DeviceManager manager; + return &manager; + } + void setDeviceErrorCallBack(); + void initDevice(); + +protected: + void timerEvent(QTimerEvent* event) override ; + +private: + void processScan(const char * json); + int timerID = -1; + int lastStatus=-1; + bool previewing = false; + bool errorOccured = false; +}; + + +#endif //GUI_DEVICEMANAGER_H