ToolDialog.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. #include "ToolDialog.h"
  2. #include <QImage>
  3. #include <QFileInfo>
  4. #include <QFileDialog>
  5. #include <QElapsedTimer>
  6. #include <QGridLayout>
  7. // 动态库文件在不同系统下的扩展名
  8. #ifdef Q_OS_WIN
  9. #define SDK_EXT ".dll"
  10. #else
  11. #define SDK_EXT ".so"
  12. #endif
  13. ToolDialogImpl::ToolDialogImpl(QWidget* parent)
  14. : DllToolDialog(parent)
  15. {
  16. ui.setupUi(this);
  17. this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/);
  18. // 显示控件初始化
  19. hwndUnit = new HWndUnit(this);
  20. Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
  21. hwndUnit->setWndTitle(("相机1"));
  22. connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI()));
  23. connect(this, SIGNAL(sigUpdateImage()), this, SLOT(OnUpdateImage()));
  24. /// Init
  25. m_pCamera = nullptr;
  26. m_isConnect = false;
  27. m_isLoadSdk = false;
  28. ui.btn_CloseCamera->setEnabled(false);
  29. ui.btn_StateCamera->setEnabled(false);
  30. ui.btn_StopCamera->setEnabled(false);
  31. ui.comboWorkMode->setEnabled(false);
  32. ui.btn_Config->setEnabled(false);
  33. ui.btn_Trigger->setEnabled(false);
  34. ui.comboWorkMode->addItem("自由采集");
  35. ui.comboWorkMode->addItem("硬件触发");
  36. ui.comboWorkMode->addItem("软件触发");
  37. QString strPath = QCoreApplication::applicationDirPath() + "//Camera//";
  38. LoadSDKFile(strPath);
  39. }
  40. ToolDialogImpl::~ToolDialogImpl()
  41. {
  42. //
  43. on_btn_CloseCamera_clicked();
  44. // 释放Lib资源
  45. if (m_lib.isLoaded())
  46. {
  47. m_lib.unload();
  48. }
  49. }
  50. void ToolDialogImpl::LoadSDKFile(const QString& strPath)
  51. {
  52. QDir dir(strPath);
  53. if (!dir.exists() || strPath.indexOf("platforms") > 1)
  54. return;
  55. // 取所有的文件和文件名,但是去掉.和..的文件夹
  56. dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
  57. // 文件夹优先
  58. dir.setSorting(QDir::DirsFirst);
  59. QFileInfoList list = dir.entryInfoList();
  60. int i = 0;
  61. while (i < list.size())
  62. {
  63. QFileInfo fileInfo = list.at(i);
  64. bool bisDir = fileInfo.isDir();
  65. if (bisDir)
  66. {
  67. LoadSDKFile(fileInfo.filePath());
  68. }
  69. else
  70. {
  71. QString strFileName = fileInfo.fileName();
  72. // 加载所有的dll工具
  73. if (strFileName.endsWith(SDK_EXT))
  74. {
  75. QString strDllFullPath = fileInfo.absoluteFilePath();
  76. ui.comboSDKName->addItem(fileInfo.baseName());
  77. SDKINFO sdkInfo;
  78. sdkInfo.fileInfo = fileInfo;
  79. m_infAllSdkInfo.push_back(sdkInfo);
  80. }
  81. }
  82. i++;
  83. };
  84. return;
  85. }
  86. void ToolDialogImpl::on_btn_LoadSDK_clicked()
  87. {
  88. m_strLoadSdkPath.clear();
  89. m_isLoadSdk = false;
  90. QString strName = ui.comboSDKName->currentText();
  91. for (int i = 0; i < m_infAllSdkInfo.size(); i++)
  92. {
  93. SDKINFO& sdkInfo = m_infAllSdkInfo[i];
  94. if (sdkInfo.fileInfo.baseName() == strName)
  95. {
  96. m_strLoadSdkPath = sdkInfo.fileInfo.absoluteFilePath();
  97. qDebug() << m_strLoadSdkPath;
  98. if (! m_strLoadSdkPath.isEmpty())
  99. {
  100. m_lib.setFileName(m_strLoadSdkPath);
  101. if (m_lib.load())
  102. {
  103. typedef SDKINFO(*getSDKInfo)();
  104. getSDKInfo getSdkInfo = (getSDKInfo)m_lib.resolve("getSDKInfo");
  105. if (getSdkInfo != nullptr)
  106. {
  107. SDKINFO info = getSdkInfo();
  108. sdkInfo.strName = info.strName;
  109. sdkInfo.strSDKVersion = info.strSDKVersion;
  110. ui.lab_SdkInfo->setText(info.strName + "(" + info.strSDKVersion + ")");
  111. m_isLoadSdk = true;
  112. }
  113. else
  114. {
  115. ui.lab_SdkInfo->setText(strName + "(Info Error!)");
  116. m_isLoadSdk = false;
  117. // 如果找不到info 函数,说明该工具可能是不兼容的
  118. //m_lib.unload();// 卸载动态库会崩溃
  119. qWarning() << strName << "(Info Error!)";
  120. return;
  121. }
  122. }
  123. else
  124. {
  125. ui.lab_SdkInfo->setText("Load " + strName + "Error (" + m_lib.errorString() + ")");
  126. m_isLoadSdk = false;
  127. qWarning() << "Error" << m_lib.errorString();
  128. return;
  129. }
  130. }
  131. return;
  132. }
  133. }
  134. }
  135. VPEnum::RETURN_VALUE ToolDialogImpl::Execute()
  136. {
  137. emit sigUpdateUI();
  138. return VPEnum::RETURN_VALUE::Success;
  139. }
  140. void ToolDialogImpl::Running(bool bRun)
  141. {
  142. }
  143. bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut)
  144. {
  145. int m_nWorkMode = ui.comboWorkMode->currentIndex();;
  146. int paranum;//参数数量
  147. if (bIsOut)//保存参数流程
  148. {
  149. paranum = 5;
  150. ar << paranum;//先保存参数数量
  151. ar << (int)1 << m_strLoadSdkPath;
  152. ar << (int)2 << m_isLoadSdk;
  153. ar << (int)3 << m_strSerial;
  154. ar << (int)4 << m_isConnect;
  155. ar << (int)5 << m_nWorkMode;
  156. }
  157. else//加载参数流程,参数加载顺序一定要跟保存顺序一致
  158. {
  159. int nSize1 = 0;
  160. int para;
  161. ar >> paranum;//读取参数数量
  162. for (int i = 0; i < paranum; i++)
  163. {
  164. ar >> para;
  165. switch (para)
  166. {
  167. case 1: ar >> m_strLoadSdkPath; break;
  168. case 2: ar >> m_isLoadSdk; break;
  169. case 3: ar >> m_strSerial; break;
  170. case 4: ar >> m_isConnect; break;
  171. case 5: ar >> m_nWorkMode; break;
  172. default:
  173. {
  174. qWarning() << "Serialized(In) Error";
  175. return false;
  176. }
  177. break;
  178. }
  179. }
  180. // 检查dll 资源是否匹配( dll资源是否存在)
  181. bool isDllOK = false;
  182. if (m_isLoadSdk && !m_strLoadSdkPath.isEmpty())
  183. {
  184. for (int i = 0; i < m_infAllSdkInfo.size(); i++)
  185. {
  186. SDKINFO& sdkInfo = m_infAllSdkInfo[i];
  187. if (m_strLoadSdkPath == sdkInfo.fileInfo.absoluteFilePath())
  188. {
  189. ui.comboSDKName->setCurrentIndex(i);
  190. isDllOK = true;
  191. break;
  192. }
  193. }
  194. }
  195. if (! isDllOK)
  196. {
  197. return true;
  198. }
  199. //
  200. on_btn_LoadSDK_clicked();
  201. ui.comboWorkMode->setCurrentIndex(m_nWorkMode);
  202. if (m_isConnect)
  203. {
  204. // 首先刷新一下相机列表
  205. on_btn_CameraRefresh_clicked();
  206. m_pCamera = NewCamera(m_strSerial);
  207. if (m_pCamera)
  208. {
  209. ui.btn_OpenCamera->setEnabled(false);
  210. ui.btn_CloseCamera->setEnabled(true);
  211. ui.btn_StateCamera->setEnabled(true);
  212. ui.comboWorkMode->setEnabled(true);
  213. ui.btn_Config->setEnabled(false);
  214. }
  215. on_btn_StateCamera_clicked();
  216. }
  217. }
  218. return true;
  219. }
  220. void ToolDialogImpl::on_UpdateUI()
  221. {
  222. }
  223. void ToolDialogImpl::OnUpdateImage()
  224. {
  225. QCoreApplication::sendEvent(this->m_pEventTarget, &this->m_PickEvent);
  226. }
  227. /// <summary>
  228. /// 确定
  229. /// </summary>
  230. void ToolDialogImpl::on_btnOK_clicked()
  231. {
  232. this->hide();
  233. }
  234. /// <summary>
  235. /// 取消按钮
  236. /// </summary>
  237. void ToolDialogImpl::on_btnCancel_clicked()
  238. {
  239. // 将本工具的恢复到打开工具之前的状态
  240. RecoverData();
  241. }
  242. /// <summary>
  243. /// 测试按钮
  244. /// </summary>
  245. void ToolDialogImpl::on_btnExecute_clicked()
  246. {
  247. QElapsedTimer toolTimer;
  248. toolTimer.start();
  249. VPEnum::RETURN_VALUE ret = this->Execute();
  250. double nExecTime = toolTimer.elapsed();
  251. QString str;
  252. str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5);
  253. ui.label_time->setText(str);
  254. str = QString("状态: %1 ").arg(QMetaEnum::fromType<VPEnum::RETURN_VALUE>().key((short)ret));
  255. ui.label_state->setText(str);
  256. }
  257. void ToolDialogImpl::on_btn_CameraRefresh_clicked()
  258. {
  259. // 遍历Camera 文件夹
  260. // initEnv
  261. if (m_lib.isLoaded())
  262. {
  263. // Init
  264. typedef bool(*INITENV)();
  265. INITENV initEnv = (INITENV)m_lib.resolve("initEnv");
  266. if (initEnv != nullptr)
  267. {
  268. bool b = initEnv();
  269. }
  270. // SerialRefresh
  271. strAllSerial = CameraSerialRefresh();
  272. }
  273. ui.comboCameraSerial->clear();
  274. for (size_t i = 0; i < strAllSerial.size(); i++)
  275. {
  276. ui.comboCameraSerial->addItem(strAllSerial[i]);
  277. }
  278. }
  279. void ToolDialogImpl::on_btn_OpenCamera_clicked()
  280. {
  281. int nIndex = ui.comboCameraSerial->currentIndex();
  282. if (strAllSerial.size() == 0)
  283. {
  284. return;
  285. }
  286. if (!m_pCamera)
  287. {
  288. m_strSerial = strAllSerial[nIndex];
  289. m_pCamera = NewCamera(m_strSerial);
  290. }
  291. if (m_pCamera)
  292. {
  293. ui.btn_LoadSDK->setEnabled(false);
  294. ui.comboSDKName->setEnabled(false);
  295. ui.btn_OpenCamera->setEnabled(false);
  296. ui.btn_CloseCamera->setEnabled(true);
  297. ui.btn_StateCamera->setEnabled(true);
  298. ui.comboWorkMode->setEnabled(true);
  299. ui.btn_Config->setEnabled(false);
  300. m_isConnect = true;
  301. }
  302. else
  303. {
  304. qWarning() << "OpenCamera" << m_strSerial << "Error";
  305. }
  306. }
  307. void ToolDialogImpl::on_btn_CloseCamera_clicked()
  308. {
  309. if (m_pCamera)
  310. {
  311. delete m_pCamera;
  312. m_pCamera = nullptr;
  313. ui.btn_LoadSDK->setEnabled(true);
  314. ui.comboSDKName->setEnabled(true);
  315. ui.btn_OpenCamera->setEnabled(true);
  316. ui.btn_CloseCamera->setEnabled(false);
  317. // 如果关闭了相机,所有按钮君禁止点击
  318. ui.btn_CloseCamera->setEnabled(false);
  319. ui.btn_StateCamera->setEnabled(false);
  320. ui.btn_StopCamera->setEnabled(false);
  321. ui.comboWorkMode->setEnabled(false);
  322. ui.btn_Config->setEnabled(false);
  323. ui.btn_Trigger->setEnabled(false);
  324. }
  325. }
  326. void ToolDialogImpl::on_btn_StateCamera_clicked()
  327. {
  328. if (!m_pCamera)
  329. {
  330. return;
  331. }
  332. int nIndex = ui.comboWorkMode->currentIndex();
  333. switch (nIndex)
  334. {
  335. case 0:
  336. {
  337. ui.btn_Trigger->setEnabled(false);
  338. m_pCamera->setWorkMode(IBaseCamCommon::eContinu);
  339. }break;
  340. case 1:
  341. {
  342. ui.btn_Trigger->setEnabled(true);
  343. m_pCamera->setWorkMode(IBaseCamCommon::eHardware);
  344. } break;
  345. case 2:
  346. {
  347. ui.btn_Trigger->setEnabled(true);
  348. m_pCamera->setWorkMode(IBaseCamCommon::eSoftware);
  349. } break;
  350. default:
  351. break;
  352. }
  353. if (m_pCamera)
  354. {
  355. m_pCamera->startWork();
  356. ui.comboWorkMode->setEnabled(false);
  357. ui.btn_StateCamera->setEnabled(false);
  358. ui.btn_StopCamera->setEnabled(true);
  359. ui.btn_Config->setEnabled(true);
  360. }
  361. }
  362. void ToolDialogImpl::on_btn_StopCamera_clicked()
  363. {
  364. if (m_pCamera)
  365. {
  366. m_pCamera->stopWork();
  367. ui.comboWorkMode->setEnabled(true);
  368. ui.btn_StateCamera->setEnabled(true);
  369. ui.btn_StopCamera->setEnabled(false);
  370. ui.btn_Config->setEnabled(false);
  371. ui.btn_Trigger->setEnabled(false);
  372. }
  373. }
  374. void ToolDialogImpl::on_btn_Config_clicked()
  375. {
  376. if (m_pCamera)
  377. {
  378. m_pCamera->showParamConfigWindow();
  379. }
  380. }
  381. void ToolDialogImpl::on_btn_Trigger_clicked()
  382. {
  383. if (m_pCamera)
  384. {
  385. m_pCamera->softTriggerCap();
  386. }
  387. }
  388. QVector<QString> ToolDialogImpl::CameraSerialRefresh()
  389. {
  390. QVector<QString> Serial;
  391. if (m_lib.isLoaded())
  392. {
  393. typedef CameraSerial(*CAMERASERIAL)();
  394. CAMERASERIAL cameraSerial = (CAMERASERIAL)m_lib.resolve("cameraSerial");
  395. CameraSerial mSerial;
  396. if (cameraSerial != NULL)
  397. {
  398. mSerial = cameraSerial();
  399. }
  400. Serial.clear();
  401. for (size_t i = 0; i < mSerial.mSize; i++)
  402. {
  403. QString str = mSerial.mSerial[i];
  404. Serial.push_back(str);
  405. }
  406. }
  407. return Serial;
  408. }
  409. IBaseCamera* ToolDialogImpl::NewCamera(QString CameraSerial)
  410. {
  411. IBaseCamera* camera = NULL;
  412. if (m_lib.isLoaded())
  413. {
  414. typedef IBaseCamera* (*CREATECAMERA)(QString);
  415. CREATECAMERA createCamera = (CREATECAMERA)m_lib.resolve("createCamera");
  416. if (createCamera != NULL)
  417. {
  418. camera = createCamera(CameraSerial);
  419. }
  420. if (NULL != camera)
  421. {
  422. camera->setReceCallBack(CameraCallback, (long long)this, "main");//设置接收图像数据回调函数
  423. camera->setReceLogCallBack(CameraLogCallback, (long long)this);//设置接收图像日志回调函数
  424. if (false == camera->setWorkMode(IBaseCamCommon::eContinu, false))
  425. {
  426. qDebug() << "setWorkMode Error";
  427. }
  428. }
  429. }
  430. return camera;
  431. }
  432. // 相机回调
  433. void ToolDialogImpl::CameraCallback(IBaseCamCommon::CamImgData* camdata, int frameCount, QString serial, long long userParam)
  434. {
  435. ToolDialogImpl* pParam = (ToolDialogImpl*)(userParam);
  436. if (pParam != NULL)
  437. {
  438. try
  439. {
  440. GenImage1(&pParam->m_Image, "byte", camdata->width, camdata->height, (Hlong)camdata->imgData);
  441. pParam->hwndUnit->ShowImage(pParam->m_Image);
  442. QString str = QString("TriggerIndex %1\nFrameNum %2\nLostPacket %3").
  443. arg(camdata->nTriggerIndex).
  444. arg(camdata->nFrameNum).
  445. arg(camdata->nLostPacket);
  446. pParam->hwndUnit->ShowMsg(str.toStdString().c_str());
  447. pParam->hwndUnit->Refresh();
  448. emit pParam->sigUpdateImage();
  449. }
  450. catch (...)
  451. {
  452. qDebug() << "CameraCallback Error";
  453. }
  454. }
  455. }
  456. // Log 回调
  457. void ToolDialogImpl::CameraLogCallback(QString serial, QString Massage, long long userParam)
  458. {
  459. ToolDialogImpl* pParam = (ToolDialogImpl*)(userParam);
  460. if (pParam != NULL)
  461. {
  462. }
  463. }