EntityCamera.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. #include "EntityCamera.h"
  2. /// 初始化相机环境
  3. bool ICamera::initEnv()
  4. {
  5. return true;
  6. }
  7. /// 关闭相机环境
  8. bool ICamera::closeEnv()
  9. {
  10. return true;
  11. }
  12. /// 获取所有相机序列号
  13. QVector<QString> ICamera::cameraSerial()
  14. {
  15. QVector<QString> Seriallist;
  16. Seriallist.clear();
  17. int g_serverCount = m_pManger->GetServerCount(SapManager::ResourceAcqDevice);//得到采集设备的数量
  18. char* serverSerial = new char[100];
  19. for (int i = 0; i < g_serverCount; i++)
  20. {
  21. memset(serverSerial, 0, 100 * sizeof(char));
  22. m_pManger->GetServerSerialNumber(i + 1, serverSerial);
  23. if (serverSerial != NULL)
  24. {
  25. QString str = QString(QLatin1String(serverSerial));
  26. Seriallist.push_back(str);
  27. }
  28. }
  29. delete serverSerial;
  30. return Seriallist;
  31. }
  32. EntityCamera::EntityCamera() :
  33. m_pCamParamConfig(nullptr),
  34. m_pDialogCamPasram(nullptr)
  35. {
  36. m_nImageChannels = 1;
  37. //////////////////////////////////////////////////////////////////////////
  38. m_Xfer = NULL;
  39. m_pBuffers = NULL;
  40. m_pCamera = NULL;
  41. m_pColorconv = NULL;
  42. m_pFeature = NULL;
  43. }
  44. EntityCamera::~EntityCamera(void)
  45. {
  46. this->stopWork();
  47. //检查当前数据传输是否正在进行中。
  48. for (int i = 0; i < 30; i++)
  49. {
  50. if (m_Xfer != NULL)
  51. {
  52. if (m_Xfer->IsGrabbing())
  53. {
  54. Sleep(100);
  55. }
  56. }
  57. }
  58. bool bcloseCamera = this->closeCamera();
  59. if (nullptr != m_pDialogCamPasram)
  60. {
  61. delete m_pDialogCamPasram;
  62. m_pDialogCamPasram = NULL;
  63. }
  64. if (nullptr != m_pCamParamConfig)
  65. {
  66. delete m_pCamParamConfig;
  67. m_pCamParamConfig = nullptr;
  68. }
  69. }
  70. /// 创建ENTITY相机
  71. EntityCamera* EntityCamera::createCamera(QString serial)
  72. {
  73. EntityCamera* camera = NULL;
  74. try
  75. {
  76. camera = new EntityCamera();
  77. if (camera)
  78. {
  79. /// 打开相机
  80. if (true == camera->openCamera(serial))
  81. {
  82. if (false == camera->initialize())
  83. {
  84. delete camera;
  85. camera = NULL;
  86. }
  87. }
  88. else
  89. {
  90. delete camera;
  91. camera = NULL;
  92. }
  93. }
  94. }
  95. catch (...)
  96. {
  97. delete camera;
  98. camera = NULL;
  99. }
  100. return camera;
  101. }
  102. /// 打开相机
  103. bool EntityCamera::openCamera(QString serial)
  104. {
  105. bool bret = true;
  106. m_strSerial = serial;
  107. char* serverName = new char[100];
  108. memset(serverName, 0, 100 * sizeof(char));
  109. bool bIsServerName = SN_ToSeverName(serial, serverName);
  110. if (bIsServerName == false)
  111. {
  112. return false;
  113. }
  114. SapLocation loc(serverName, 0);
  115. delete serverName;
  116. m_pCamera = new SapAcqDevice(loc, NULL);//第二个参数写载入的ccf文件路径 m_pCamera->SaveFeatures("123.ccf");//error
  117. if (m_pCamera && !*m_pCamera && !m_pCamera->Create())
  118. {
  119. return false;
  120. }
  121. m_pFeature = new SapFeature(m_pCamera->GetLocation());
  122. m_pFeature->Create();
  123. BOOL isAvailable;
  124. m_pCamera->IsFeatureAvailable("Width", &isAvailable);//检查节点可以使用
  125. if (isAvailable)
  126. {
  127. m_pCamera->GetFeatureValue("Width", &m_iImageWidth);
  128. }
  129. m_pCamera->IsFeatureAvailable("Height", &isAvailable);//检查节点可以使用
  130. if (isAvailable)
  131. {
  132. m_pCamera->GetFeatureValue("Height", &m_iImageHeight);
  133. }
  134. //mImgCapBuffer.imgData = new uint8_t * [m_iImageWidth * m_iImageHeight * 3];
  135. m_pBuffers = new SapBufferWithTrash(2, m_pCamera);
  136. m_pColorconv = new SapColorConversion(m_pBuffers);
  137. m_Xfer = new SapAcqDeviceToBuf(m_pCamera, m_pBuffers, XferCallback, this);
  138. if (m_pBuffers && !*m_pBuffers && !m_pBuffers->Create())
  139. {
  140. return false;
  141. }
  142. if (m_pColorconv && !*m_pColorconv && !m_pColorconv->Create())
  143. {
  144. return false;
  145. }
  146. if (m_Xfer && !*m_Xfer && !m_Xfer->Create())
  147. {
  148. return false;
  149. }
  150. return bret;
  151. }
  152. /// 关闭相机
  153. bool EntityCamera::closeCamera()
  154. {
  155. bool bret = true;
  156. if (m_Xfer && *m_Xfer) m_Xfer->Destroy();
  157. if (m_pFeature && *m_pFeature) m_pFeature->Destroy();
  158. // if (m_pColorconv && *m_pColorconv) m_pColorconv->Destroy();
  159. if (m_pBuffers && *m_pBuffers) m_pBuffers->Destroy();
  160. if (m_pCamera && *m_pCamera) m_pCamera->Destroy();
  161. if (m_Xfer) delete m_Xfer;
  162. if (m_pFeature) delete m_pFeature;
  163. // if (m_pColorconv) delete m_pColorconv;
  164. if (m_pBuffers) delete m_pBuffers;
  165. if (m_pCamera) delete m_pCamera;
  166. return bret;
  167. }
  168. /// 初始化
  169. bool EntityCamera::initialize()
  170. {
  171. if (NULL == m_pDialogCamPasram)
  172. {
  173. m_pDialogCamPasram = new DialogCamPasram(this);
  174. }
  175. if (imageChannels() == 3)
  176. {
  177. m_pColorconv->Enable(true, false);
  178. m_pColorconv->SetOutputFormat(SapFormatRGB888);
  179. m_pColorconv->SetAlign(SapColorConversion::AlignRGGB);
  180. }
  181. return true;
  182. }
  183. /// 加载参数
  184. void EntityCamera::loadCamParam()
  185. {
  186. }
  187. /// 保存参数
  188. void EntityCamera::saveCamParam()
  189. {
  190. }
  191. /// 设置相机工作模式
  192. bool EntityCamera::setWorkMode(IBaseCamCommon::CamWorkMode mode, bool Running )
  193. {
  194. if (!m_pCamera->IsServerAccessible(m_pCamera->GetLocation()))
  195. {
  196. return false;
  197. }
  198. bool bret = true;
  199. this->stopWork();
  200. switch (mode)
  201. {
  202. case IBaseCamCommon::eContinu:
  203. //连续采集模式 相机一直工作采图
  204. this->setToFreeRunMode();
  205. break;
  206. case IBaseCamCommon::eHardware:
  207. //中断采集模式 相机接收到硬件中断中断命令采集图像
  208. this->setToHardwareTrigerMode();
  209. break;
  210. case IBaseCamCommon::eSoftware:
  211. //中断采集模式 相机接收到软件中断命令采集图像
  212. bret = this->setToSoftwareTrigerMode();
  213. break;
  214. case IBaseCamCommon::eSuspendCou:
  215. break;
  216. default:
  217. break;
  218. }
  219. mWorkMode = mode; //工作模式
  220. return bret;
  221. }
  222. /// 相机工作模式
  223. IBaseCamCommon::CamWorkMode EntityCamera::workMode()
  224. {
  225. return mWorkMode;
  226. }
  227. /// 相机开始工作
  228. bool EntityCamera::startWork()
  229. {
  230. if (!m_Xfer)
  231. {
  232. return false;
  233. }
  234. bool bret = true;
  235. if (!m_Xfer->IsGrabbing())//检查当前数据传输是否正在进行中。
  236. {
  237. bret = !m_Xfer->Grab();// Grab()如果成功返回true,否则为false
  238. }
  239. return bret;
  240. }
  241. /// 相机停止工作
  242. bool EntityCamera::stopWork()
  243. {
  244. if (!m_pCamera->IsServerAccessible(m_pCamera->GetLocation()))
  245. {
  246. return false;
  247. }
  248. if (!m_Xfer)
  249. {
  250. return false;
  251. }
  252. bool bret = true;
  253. if (m_Xfer->IsGrabbing())//检查当前数据传输是否正在进行中。
  254. {
  255. bret = !m_Xfer->Freeze();
  256. }
  257. return bret;
  258. }
  259. /// 相机序列号
  260. QString EntityCamera::serial()
  261. {
  262. return m_strSerial;
  263. }
  264. /// 重启相机
  265. bool EntityCamera::restartCamera()
  266. {
  267. if (m_pCamera == NULL)
  268. {
  269. return false;
  270. }
  271. if (m_pCamera->IsServerAccessible(m_pCamera->GetLocation()))
  272. {
  273. stopWork();
  274. startWork();
  275. }
  276. return true;
  277. }
  278. /// 获取一桢图像
  279. bool EntityCamera::captureImage(void** buf, int size)
  280. {
  281. return true;
  282. }
  283. /// 获取图像宽
  284. int EntityCamera::imageWidth(void)
  285. {
  286. return 0;
  287. }
  288. /// 获取图像高
  289. int EntityCamera::imageHeight(void)
  290. {
  291. return 0;
  292. }
  293. /// 获取图像通道数
  294. int EntityCamera::imageChannels(void)
  295. {
  296. return m_nImageChannels;
  297. }
  298. /// 获取配置参数类
  299. IBaseCamParamConfig* EntityCamera::camParamConfig()
  300. {
  301. CamParamConfig* paramConfig = nullptr; //配置参数类
  302. if (nullptr == m_pCamParamConfig)
  303. {
  304. m_pCamParamConfig = new CamParamConfig(this);
  305. }
  306. paramConfig = m_pCamParamConfig;
  307. return paramConfig;
  308. }
  309. /// 显示设置参数窗口页面
  310. void EntityCamera::showParamConfigWindow(int mode )
  311. {
  312. if (m_pDialogCamPasram)
  313. {
  314. m_pDialogCamPasram->setModal(true);
  315. m_pDialogCamPasram->show();
  316. }
  317. }
  318. /// 获取相机最大分辨率
  319. bool EntityCamera::getMaxSize(int& w, int& h)
  320. {
  321. return true;
  322. }
  323. /// 设置相机分辨率
  324. bool EntityCamera::setResolution(int w, int h)
  325. {
  326. return true;
  327. }
  328. /// 获取已注册图像回调的数量
  329. int EntityCamera::getReceCallBackSIze()
  330. {
  331. return m_pImgCallBack.size();
  332. }
  333. ///设置接收图像数据回调函数
  334. void EntityCamera::setReceCallBack(IBaseCamCommon::receImgCallBack callBack, long long userParam, QString userID)
  335. {
  336. //this->m_pReceImgFunction = callBack;
  337. //this->mUserParam = userParam;
  338. IBaseCamCommon::ImgCallBack* pImgCallBack = new IBaseCamCommon::ImgCallBack;
  339. pImgCallBack->pReceFunction = callBack;
  340. pImgCallBack->pUserParam = userParam;
  341. pImgCallBack->strUserID = userID;
  342. m_pImgCallBack.push_back(pImgCallBack);
  343. }
  344. ///设置接收Log数据回调函数
  345. void EntityCamera::setReceLogCallBack(IBaseCamCommon::receLogCallBack callBack, long long userParam)
  346. {
  347. this->m_pReceLogFunction = callBack;
  348. this->mLogUserParam = userParam;
  349. }
  350. /// 执行回调函数
  351. void EntityCamera::execCallFunction(IBaseCamCommon::CamImgData* img, int frameCount)
  352. {
  353. // printf( "执行回调函数\n" );
  354. // if (this->m_pReceImgFunction != NULL)
  355. // {
  356. // this->m_pReceImgFunction(img, frameCount, m_strSerial, mUserParam);
  357. // }
  358. for (int i = 0; i < m_pImgCallBack.size(); i++)
  359. {
  360. if (m_pImgCallBack[i]->pReceFunction != nullptr)
  361. {
  362. if (m_pImgCallBack[i]->strUserID == m_strUserID)
  363. {
  364. m_pImgCallBack[i]->pReceFunction(img, frameCount, m_strSerial, m_pImgCallBack[i]->pUserParam);
  365. }
  366. }
  367. }
  368. m_strUserID = "main";
  369. }
  370. /// 执行Log回调函数
  371. void EntityCamera::execLogCallFunction(QString serial, QString Massage, long long userParam)
  372. {
  373. // printf( "执行回调函数\n" );
  374. if (this->m_pReceLogFunction != NULL)
  375. {
  376. this->m_pReceLogFunction(serial, Massage, userParam);
  377. }
  378. }
  379. /// 软件触发采图
  380. void EntityCamera::softTriggerCap(QString userID)
  381. {
  382. if (!m_pCamera->IsServerAccessible(m_pCamera->GetLocation()))
  383. {
  384. return;
  385. }
  386. //if (IBaseCamCommon::eSuspend == this->mWorkMode)//
  387. {
  388. bool Trigger = true;
  389. BOOL isAvailable;
  390. m_pCamera->IsFeatureAvailable("TriggerSoftware", &isAvailable);//检查节点可以使用
  391. if (isAvailable)
  392. {
  393. m_pCamera->SetFeatureValue("TriggerSoftware", Trigger);
  394. }
  395. }
  396. //if (ICamCommon::eContinu == this->mWorkMode)
  397. {
  398. // m_Xfer->Snap();
  399. }
  400. m_strUserID = userID;
  401. }
  402. //////////////////////////////////////////////////////////////////////////
  403. bool EntityCamera::SN_ToSeverName(QString strSN, char* ServerName)
  404. {
  405. char* serverSerial;
  406. serverSerial = new char[100];
  407. int serverCount = m_pManger->GetServerCount(SapManager::ResourceAcqDevice);//得到采集设备的数量
  408. for (int serverIndex = 0; serverIndex < serverCount; serverIndex++)
  409. {
  410. {
  411. memset(serverSerial, 0, 100 * sizeof(char));
  412. m_pManger->GetServerSerialNumber(serverIndex + 1, serverSerial);
  413. QString str = QString(QLatin1String(serverSerial));
  414. if (str == strSN)
  415. {
  416. BOOL IsServerName = m_pManger->GetServerName(serverIndex, SapManager::ResourceAcqDevice, ServerName);
  417. if (IsServerName)
  418. {
  419. delete serverSerial;
  420. return true;
  421. }
  422. }
  423. }
  424. }
  425. delete serverSerial;
  426. return false;
  427. }
  428. void EntityCamera::XferCallback(SapXferCallbackInfo* pInfo)
  429. {
  430. EntityCamera* pDlg = (EntityCamera*)pInfo->GetContext();
  431. if (pInfo->IsTrash())
  432. {
  433. return;
  434. }
  435. if (pDlg->m_Xfer->UpdateFrameRateStatistics())
  436. {
  437. SapXferFrameRateInfo* pStats = pDlg->m_Xfer->GetFrameRateStatistics();
  438. if (pStats->IsLiveFrameRateAvailable() && !pStats->IsLiveFrameRateStalled())
  439. {
  440. //pDlg->strLiveFrameRate.Format(_T("帧率:%.1f"), pStats->GetLiveFrameRate());
  441. }
  442. }
  443. int m_iImageWidth = pDlg->m_pBuffers->GetWidth();
  444. int m_iImageHeight = pDlg->m_pBuffers->GetHeight();
  445. //BYTE* pData;
  446. //pDlg->m_pBuffers->GetAddress((void**)&pData);
  447. int nImageCount = 1;
  448. BOOL success = pDlg->m_pBuffers->GetAddress((void**)&pDlg->mImgCapBuffer.imgData);
  449. pDlg->mImgCapBuffer.count = nImageCount;
  450. pDlg->mImgCapBuffer.height = m_iImageHeight;
  451. pDlg->mImgCapBuffer.width = m_iImageWidth;
  452. pDlg->execCallFunction(&pDlg->mImgCapBuffer, nImageCount);
  453. }
  454. //每次输入信号连接状态改变时都调用这个函数。
  455. void EntityCamera::SignalCallback(SapAcqCallbackInfo* pInfo)
  456. {
  457. EntityCamera* pDlg = (EntityCamera*)pInfo->GetContext();
  458. pDlg->GetSignalStatus(pInfo->GetSignalStatus());
  459. }
  460. void EntityCamera::GetSignalStatus()
  461. {
  462. }
  463. void EntityCamera::GetSignalStatus(SapAcquisition::SignalStatus signalStatus)
  464. {
  465. m_IsSignalDetected = (signalStatus != SapAcquisition::SignalNone);
  466. if (!m_IsSignalDetected)
  467. {
  468. QString newTitle = "未检测到摄像机信号";
  469. qDebug() << newTitle;
  470. }
  471. }
  472. /// 设置连续采集模式
  473. bool EntityCamera::setToFreeRunMode()
  474. {
  475. if (!m_Xfer->IsGrabbing())//检查当前数据传输是否正在进行中。
  476. {
  477. BOOL isAvailable;
  478. m_pCamera->IsFeatureAvailable("TriggerSelector", &isAvailable);//检查节点可以使用
  479. if (isAvailable)
  480. {
  481. m_pCamera->SetFeatureValue("TriggerSelector", "FrameStart");
  482. }
  483. m_pCamera->IsFeatureAvailable("TriggerMode", &isAvailable);//检查节点可以使用
  484. if (isAvailable)
  485. {
  486. m_pCamera->SetFeatureValue("TriggerMode", "Off");
  487. }
  488. }
  489. return true;
  490. }
  491. /// 设置软件触发模式
  492. bool EntityCamera::setToSoftwareTrigerMode()
  493. {
  494. if (!m_Xfer->IsGrabbing())//检查当前数据传输是否正在进行中。
  495. {
  496. BOOL isAvailable;
  497. m_pCamera->IsFeatureAvailable("TriggerSelector", &isAvailable);//检查节点可以使用
  498. if (isAvailable)
  499. {
  500. m_pCamera->SetFeatureValue("TriggerSelector", "FrameStart");
  501. }
  502. m_pCamera->IsFeatureAvailable("TriggerMode", &isAvailable);//检查节点可以使用
  503. if (isAvailable)
  504. {
  505. m_pCamera->SetFeatureValue("TriggerMode", "On");
  506. }
  507. m_pCamera->IsFeatureAvailable("TriggerSource", &isAvailable);//检查节点可以使用
  508. if (isAvailable)
  509. {
  510. m_pCamera->SetFeatureValue("TriggerSource", "Software");
  511. }
  512. }
  513. return true;
  514. }
  515. /// 设置硬件触发模式
  516. bool EntityCamera::setToHardwareTrigerMode()
  517. {
  518. //if (!m_Xfer->IsGrabbing())//检查当前数据传输是否正在进行中。
  519. {
  520. BOOL isAvailable;
  521. m_pCamera->IsFeatureAvailable("TriggerSelector", &isAvailable);//检查节点可以使用
  522. if (isAvailable)
  523. {
  524. m_pCamera->SetFeatureValue("TriggerSelector", "FrameStart");
  525. }
  526. m_pCamera->IsFeatureAvailable("TriggerMode", &isAvailable);//检查节点可以使用
  527. if (isAvailable)
  528. {
  529. m_pCamera->SetFeatureValue("TriggerMode", "On");
  530. }
  531. m_pCamera->IsFeatureAvailable("TriggerSource", &isAvailable);//检查节点可以使用
  532. if (isAvailable)
  533. {
  534. m_pCamera->SetFeatureValue("TriggerSource", "Line1");
  535. }
  536. m_pCamera->IsFeatureAvailable("LineSelector", &isAvailable);//检查节点可以使用
  537. if (isAvailable)
  538. {
  539. m_pCamera->SetFeatureValue("LineSelector", "Line3");
  540. }
  541. m_pCamera->IsFeatureAvailable("outputLineSource", &isAvailable);//检查节点可以使用
  542. if (isAvailable)
  543. {
  544. m_pCamera->SetFeatureValue("outputLineSource", "ExposureActive");
  545. }
  546. //m_pCamera->SetFeatureValue("outputLinePulseDuration", "400");
  547. }
  548. return true;
  549. }