#include "ToolDialog.h" #include #include #include #include #include // 动态库文件在不同系统下的扩展名 #ifdef Q_OS_WIN #define SDK_EXT ".dll" #else #define SDK_EXT ".so" #endif ToolDialogImpl::ToolDialogImpl(QWidget* parent) : DllToolDialog(parent) { ui.setupUi(this); this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/); // 显示控件初始化 hwndUnit = new HWndUnit(this); Util::ShowUnitInWidget(ui.Image_widget, hwndUnit); hwndUnit->setWndTitle(("相机1")); connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI())); connect(this, SIGNAL(sigUpdateImage()), this, SLOT(OnUpdateImage())); /// Init m_pCamera = nullptr; m_isConnect = false; m_isLoadSdk = false; ui.btn_CloseCamera->setEnabled(false); ui.btn_StateCamera->setEnabled(false); ui.btn_StopCamera->setEnabled(false); ui.comboWorkMode->setEnabled(false); ui.btn_Config->setEnabled(false); ui.btn_Trigger->setEnabled(false); ui.comboWorkMode->addItem("自由采集"); ui.comboWorkMode->addItem("硬件触发"); ui.comboWorkMode->addItem("软件触发"); QString strPath = QCoreApplication::applicationDirPath() + "//Camera//"; LoadSDKFile(strPath); } ToolDialogImpl::~ToolDialogImpl() { // on_btn_CloseCamera_clicked(); // 释放Lib资源 if (m_lib.isLoaded()) { m_lib.unload(); } } void ToolDialogImpl::LoadSDKFile(const QString& strPath) { QDir dir(strPath); if (!dir.exists() || strPath.indexOf("platforms") > 1) return; // 取所有的文件和文件名,但是去掉.和..的文件夹 dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); // 文件夹优先 dir.setSorting(QDir::DirsFirst); QFileInfoList list = dir.entryInfoList(); int i = 0; while (i < list.size()) { QFileInfo fileInfo = list.at(i); bool bisDir = fileInfo.isDir(); if (bisDir) { LoadSDKFile(fileInfo.filePath()); } else { QString strFileName = fileInfo.fileName(); // 加载所有的dll工具 if (strFileName.endsWith(SDK_EXT)) { QString strDllFullPath = fileInfo.absoluteFilePath(); ui.comboSDKName->addItem(fileInfo.baseName()); SDKINFO sdkInfo; sdkInfo.fileInfo = fileInfo; m_infAllSdkInfo.push_back(sdkInfo); } } i++; }; return; } void ToolDialogImpl::on_btn_LoadSDK_clicked() { m_strLoadSdkPath.clear(); m_isLoadSdk = false; QString strName = ui.comboSDKName->currentText(); for (int i = 0; i < m_infAllSdkInfo.size(); i++) { SDKINFO& sdkInfo = m_infAllSdkInfo[i]; if (sdkInfo.fileInfo.baseName() == strName) { m_strLoadSdkPath = sdkInfo.fileInfo.absoluteFilePath(); qDebug() << m_strLoadSdkPath; if (! m_strLoadSdkPath.isEmpty()) { m_lib.setFileName(m_strLoadSdkPath); if (m_lib.load()) { typedef SDKINFO(*getSDKInfo)(); getSDKInfo getSdkInfo = (getSDKInfo)m_lib.resolve("getSDKInfo"); if (getSdkInfo != nullptr) { SDKINFO info = getSdkInfo(); sdkInfo.strName = info.strName; sdkInfo.strSDKVersion = info.strSDKVersion; ui.lab_SdkInfo->setText(info.strName + "(" + info.strSDKVersion + ")"); m_isLoadSdk = true; } else { ui.lab_SdkInfo->setText(strName + "(Info Error!)"); m_isLoadSdk = false; // 如果找不到info 函数,说明该工具可能是不兼容的 //m_lib.unload();// 卸载动态库会崩溃 qWarning() << strName << "(Info Error!)"; return; } } else { ui.lab_SdkInfo->setText("Load " + strName + "Error (" + m_lib.errorString() + ")"); m_isLoadSdk = false; qWarning() << "Error" << m_lib.errorString(); return; } } return; } } } VPEnum::RETURN_VALUE ToolDialogImpl::Execute() { emit sigUpdateUI(); return VPEnum::RETURN_VALUE::Success; } void ToolDialogImpl::Running(bool bRun) { } bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut) { int m_nWorkMode = ui.comboWorkMode->currentIndex();; int paranum;//参数数量 if (bIsOut)//保存参数流程 { paranum = 5; ar << paranum;//先保存参数数量 ar << (int)1 << m_strLoadSdkPath; ar << (int)2 << m_isLoadSdk; ar << (int)3 << m_strSerial; ar << (int)4 << m_isConnect; ar << (int)5 << m_nWorkMode; } else//加载参数流程,参数加载顺序一定要跟保存顺序一致 { int nSize1 = 0; int para; ar >> paranum;//读取参数数量 for (int i = 0; i < paranum; i++) { ar >> para; switch (para) { case 1: ar >> m_strLoadSdkPath; break; case 2: ar >> m_isLoadSdk; break; case 3: ar >> m_strSerial; break; case 4: ar >> m_isConnect; break; case 5: ar >> m_nWorkMode; break; default: { qWarning() << "Serialized(In) Error"; return false; } break; } } // 检查dll 资源是否匹配( dll资源是否存在) bool isDllOK = false; if (m_isLoadSdk && !m_strLoadSdkPath.isEmpty()) { for (int i = 0; i < m_infAllSdkInfo.size(); i++) { SDKINFO& sdkInfo = m_infAllSdkInfo[i]; if (m_strLoadSdkPath == sdkInfo.fileInfo.absoluteFilePath()) { ui.comboSDKName->setCurrentIndex(i); isDllOK = true; break; } } } if (! isDllOK) { return true; } // on_btn_LoadSDK_clicked(); ui.comboWorkMode->setCurrentIndex(m_nWorkMode); if (m_isConnect) { // 首先刷新一下相机列表 on_btn_CameraRefresh_clicked(); m_pCamera = NewCamera(m_strSerial); if (m_pCamera) { ui.btn_OpenCamera->setEnabled(false); ui.btn_CloseCamera->setEnabled(true); ui.btn_StateCamera->setEnabled(true); ui.comboWorkMode->setEnabled(true); ui.btn_Config->setEnabled(false); } on_btn_StateCamera_clicked(); } } return true; } void ToolDialogImpl::on_UpdateUI() { } void ToolDialogImpl::OnUpdateImage() { QCoreApplication::sendEvent(this->m_pEventTarget, &this->m_PickEvent); } /// /// 确定 /// void ToolDialogImpl::on_btnOK_clicked() { this->hide(); } /// /// 取消按钮 /// void ToolDialogImpl::on_btnCancel_clicked() { // 将本工具的恢复到打开工具之前的状态 RecoverData(); } /// /// 测试按钮 /// void ToolDialogImpl::on_btnExecute_clicked() { QElapsedTimer toolTimer; toolTimer.start(); VPEnum::RETURN_VALUE ret = this->Execute(); double nExecTime = toolTimer.elapsed(); QString str; str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5); ui.label_time->setText(str); str = QString("状态: %1 ").arg(QMetaEnum::fromType().key((short)ret)); ui.label_state->setText(str); } void ToolDialogImpl::on_btn_CameraRefresh_clicked() { // 遍历Camera 文件夹 // initEnv if (m_lib.isLoaded()) { // Init typedef bool(*INITENV)(); INITENV initEnv = (INITENV)m_lib.resolve("initEnv"); if (initEnv != nullptr) { bool b = initEnv(); } // SerialRefresh strAllSerial = CameraSerialRefresh(); } ui.comboCameraSerial->clear(); for (size_t i = 0; i < strAllSerial.size(); i++) { ui.comboCameraSerial->addItem(strAllSerial[i]); } } void ToolDialogImpl::on_btn_OpenCamera_clicked() { int nIndex = ui.comboCameraSerial->currentIndex(); if (strAllSerial.size() == 0) { return; } if (!m_pCamera) { m_strSerial = strAllSerial[nIndex]; m_pCamera = NewCamera(m_strSerial); } if (m_pCamera) { ui.btn_LoadSDK->setEnabled(false); ui.comboSDKName->setEnabled(false); ui.btn_OpenCamera->setEnabled(false); ui.btn_CloseCamera->setEnabled(true); ui.btn_StateCamera->setEnabled(true); ui.comboWorkMode->setEnabled(true); ui.btn_Config->setEnabled(false); m_isConnect = true; } else { qWarning() << "OpenCamera" << m_strSerial << "Error"; } } void ToolDialogImpl::on_btn_CloseCamera_clicked() { if (m_pCamera) { delete m_pCamera; m_pCamera = nullptr; ui.btn_LoadSDK->setEnabled(true); ui.comboSDKName->setEnabled(true); ui.btn_OpenCamera->setEnabled(true); ui.btn_CloseCamera->setEnabled(false); // 如果关闭了相机,所有按钮君禁止点击 ui.btn_CloseCamera->setEnabled(false); ui.btn_StateCamera->setEnabled(false); ui.btn_StopCamera->setEnabled(false); ui.comboWorkMode->setEnabled(false); ui.btn_Config->setEnabled(false); ui.btn_Trigger->setEnabled(false); } } void ToolDialogImpl::on_btn_StateCamera_clicked() { if (!m_pCamera) { return; } int nIndex = ui.comboWorkMode->currentIndex(); switch (nIndex) { case 0: { ui.btn_Trigger->setEnabled(false); m_pCamera->setWorkMode(IBaseCamCommon::eContinu); }break; case 1: { ui.btn_Trigger->setEnabled(true); m_pCamera->setWorkMode(IBaseCamCommon::eHardware); } break; case 2: { ui.btn_Trigger->setEnabled(true); m_pCamera->setWorkMode(IBaseCamCommon::eSoftware); } break; default: break; } if (m_pCamera) { m_pCamera->startWork(); ui.comboWorkMode->setEnabled(false); ui.btn_StateCamera->setEnabled(false); ui.btn_StopCamera->setEnabled(true); ui.btn_Config->setEnabled(true); } } void ToolDialogImpl::on_btn_StopCamera_clicked() { if (m_pCamera) { m_pCamera->stopWork(); ui.comboWorkMode->setEnabled(true); ui.btn_StateCamera->setEnabled(true); ui.btn_StopCamera->setEnabled(false); ui.btn_Config->setEnabled(false); ui.btn_Trigger->setEnabled(false); } } void ToolDialogImpl::on_btn_Config_clicked() { if (m_pCamera) { m_pCamera->showParamConfigWindow(); } } void ToolDialogImpl::on_btn_Trigger_clicked() { if (m_pCamera) { m_pCamera->softTriggerCap(); } } QVector ToolDialogImpl::CameraSerialRefresh() { QVector Serial; if (m_lib.isLoaded()) { typedef CameraSerial(*CAMERASERIAL)(); CAMERASERIAL cameraSerial = (CAMERASERIAL)m_lib.resolve("cameraSerial"); CameraSerial mSerial; if (cameraSerial != NULL) { mSerial = cameraSerial(); } Serial.clear(); for (size_t i = 0; i < mSerial.mSize; i++) { QString str = mSerial.mSerial[i]; Serial.push_back(str); } } return Serial; } IBaseCamera* ToolDialogImpl::NewCamera(QString CameraSerial) { IBaseCamera* camera = NULL; if (m_lib.isLoaded()) { typedef IBaseCamera* (*CREATECAMERA)(QString); CREATECAMERA createCamera = (CREATECAMERA)m_lib.resolve("createCamera"); if (createCamera != NULL) { camera = createCamera(CameraSerial); } if (NULL != camera) { camera->setReceCallBack(CameraCallback, (long long)this, "main");//设置接收图像数据回调函数 camera->setReceLogCallBack(CameraLogCallback, (long long)this);//设置接收图像日志回调函数 if (false == camera->setWorkMode(IBaseCamCommon::eContinu, false)) { qDebug() << "setWorkMode Error"; } } } return camera; } // 相机回调 void ToolDialogImpl::CameraCallback(IBaseCamCommon::CamImgData* camdata, int frameCount, QString serial, long long userParam) { ToolDialogImpl* pParam = (ToolDialogImpl*)(userParam); if (pParam != NULL) { try { GenImage1(&pParam->m_Image, "byte", camdata->width, camdata->height, (Hlong)camdata->imgData); pParam->hwndUnit->ShowImage(pParam->m_Image); QString str = QString("TriggerIndex %1\nFrameNum %2\nLostPacket %3"). arg(camdata->nTriggerIndex). arg(camdata->nFrameNum). arg(camdata->nLostPacket); pParam->hwndUnit->ShowMsg(str.toStdString().c_str()); pParam->hwndUnit->Refresh(); emit pParam->sigUpdateImage(); } catch (...) { qDebug() << "CameraCallback Error"; } } } // Log 回调 void ToolDialogImpl::CameraLogCallback(QString serial, QString Massage, long long userParam) { ToolDialogImpl* pParam = (ToolDialogImpl*)(userParam); if (pParam != NULL) { } }