#ifndef CAMERAManager_H #define CAMERAManager_H #include #include #include #include #include #include #include #include #include #include #include #include #include //硬触发要求在触发相机前给出触发信号 class backEndManager; class camera : public QThread { Q_OBJECT public: QTime lastUpdateTime; QString cameraName; camera(cameraModule cameraModulePtrIn, int indexIn); ~camera() { runFlag = false; this->terminate(); while (this->isRunning() == true); } void run(); void stop() { runFlag = false; while (this->isRunning() == true); } void getImgQueueSize(); void captureImage(std::shared_ptr dataIn) { requestQueue.enqueue(dataIn); } //相机操作 bool trigger() { if (!cameraModulePtr.module_ptr->run()) { qCritical() << "[Error] " << " m_name:" << cameraName << " run failed!"; return false; } return true; } double getCameraValue()//点激光相机专用 { double value = 0; std::vector camera_mat; QByteArray task_name; int cnt = 0; while (!cameraModulePtr.module_ptr->sendData(camera_mat, task_name)) { QThread::msleep(10); cnt++; if (cnt > 500) return 0; } value = task_name.toDouble(); return value; } void getCameraImg(std::vector& mats) { QByteArray task_name; if (cameraModulePtr.module_ptr->sendData(mats, task_name)) qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:" << mats.size(); } void setDigitalShift(float value) { sendData("DigitalShift_" + std::to_string(value)); } void setExposureTime(float value) { sendData("exposure_" + std::to_string(value)); } void setUserSet(int value) { sendData("userset_" + std::to_string(value)); } private: //detData* data = nullptr; void sendData(std::string str) { QByteArray task_name(QByteArray::fromStdString(str)); std::vector camera_mat; if (!cameraModulePtr.module_ptr->sendData(camera_mat, task_name)) qCritical() << "[Error] " << "set exposure error!"; } int index = 0; int timeout = 5000; QMutex mutex; cameraModule cameraModulePtr; QQueueimgQueue; QQueue>requestQueue; backEndManager* _backEndManager; bool runFlag = true; int imgLost = 0;//未取用从而丢失的图片数量 int showLost = 0;//因为窗口刷新速率低而未显示的数量 }; class cameraManager : public serviceModule { Q_OBJECT public: bool initFlag = false; void initialization(); ~cameraManager(); void run(); std::unordered_mapcameras;//key 相机名 camera* getCamera(std::string cameraName) { auto camera = cameras.find(cameraName); if (camera != cameras.end()) return camera->second; return nullptr; } void stop() { for (auto camera : cameras) camera.second->stop(); } private: bool loadModule(QString keyName, QString moduleName,QString triggerMode, QByteArray initByte); std::vectorcamerasVec;//用于初始化和销毁 std::vector vec_mat;//没啥用,一直保持为空就好 QList lib_list; public slots: void cameraTrigger(std::string Name) { auto camera=cameras.find(Name); if (camera != cameras.end()) { camera->second->trigger(); } } }; #endif