ImgBrd.cpp 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220
  1. // ImgBrd.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. //#include "ImgAcq.h"
  5. #include "ImgBrd.h"
  6. #include <process.h>
  7. #include "AppSettings.h"
  8. #include "EComRFMessage_i.h"
  9. #include "CShareMemManager.h"
  10. //============================================
  11. PV_INIT_SIGNAL_HANDLER();
  12. //============================================
  13. // CImgBrd
  14. extern CString strAppPath;
  15. extern CString strAppDYNHandleName;
  16. extern CString strAppMechCompHandleName;
  17. extern CString strAppRFDTHandleName;
  18. extern CString strAppDRDTHandleName;
  19. extern CString strAppHardwareHandleName;
  20. extern CString strAppRFOCHandleName;
  21. extern CString g_strLogFilePath;
  22. extern CString g_strHWConfFilePath;
  23. extern CString g_strConfFilePath;
  24. PvStreamGEV *m_pvStream;
  25. PvPipeline *m_pvPipeline;
  26. PipelineEventSink lPipelineEventSink;
  27. #define BUFFER_NUM 10
  28. #define IMAGEWIDTH 2880
  29. CImgBrd* CImgBrd::m_pCab = NULL;
  30. IMPLEMENT_DYNAMIC(CImgBrd, CWnd)
  31. CImgBrd::CImgBrd()
  32. {
  33. m_nMode = 1;
  34. m_IsValid = false;
  35. m_IsGrab = false;
  36. m_nBuf = 0;
  37. m_pImgBuffer = NULL;
  38. m_pImgBufferSize = 0;
  39. m_strDCFFile = "";
  40. m_pLog = NULL;
  41. m_nGrabMode = 2;
  42. m_pDataBuffer = new CShareMem(_T("ImageBuffer"));
  43. m_pDataBuffer->CreateShareMem(IMAGEWIDTH*(IMAGEWIDTH+1)*BUFFER_NUM*sizeof(WORD));
  44. m_nCurrentFrame = -1;
  45. m_nTotalFrameGrab = 0;
  46. m_nPixelSpacing = 148;
  47. m_nCropLeft = 0;
  48. m_nCropTop = 0;
  49. m_nCropRight = 0;
  50. m_nCropBottom = 0;
  51. m_pwData = NULL;
  52. SizeX = 960;
  53. SizeY = 960;
  54. m_fCurAcqFrameRate = 0.0f;
  55. m_hEventGrab = NULL;
  56. m_pGrapThdPro = NULL;
  57. m_bExitGrapThdPro = false;
  58. m_IsInGrabPeriod = CreateEvent( NULL, TRUE, FALSE, NULL );
  59. m_IsLeaveSlave = CreateEvent( NULL, TRUE, FALSE, NULL );
  60. m_pCab = this;
  61. m_Mutext_Buff = CreateMutex(0,0,0);
  62. m_pvStream = NULL;
  63. m_pvPipeline = NULL;
  64. }
  65. CImgBrd::~CImgBrd()
  66. {
  67. ExitGrabThread();
  68. CloseEbusDevice();
  69. if(m_pLog != NULL)
  70. {
  71. delete m_pLog;
  72. m_pLog = NULL;
  73. }
  74. if(m_pDataBuffer)
  75. {
  76. delete m_pDataBuffer;
  77. m_pDataBuffer = NULL;
  78. }
  79. if(m_pwData)
  80. {
  81. delete[] m_pwData;
  82. m_pwData = NULL;
  83. }
  84. WaitForSingleObject(m_Mutext_Buff,INFINITE);
  85. if(m_pImgBuffer)
  86. {
  87. delete[] m_pImgBuffer;
  88. m_pImgBuffer = NULL;
  89. m_pImgBufferSize = 0;
  90. }
  91. ReleaseMutex(m_Mutext_Buff);
  92. CloseHandle(m_IsInGrabPeriod);
  93. CloseHandle(m_IsLeaveSlave);
  94. CloseHandle(m_Mutext_Buff);
  95. }
  96. // 测试使用,保存RAW图到特定目录
  97. CFile *g_TestSavingImage = NULL;
  98. bool g_bTestTrue = false;
  99. BEGIN_MESSAGE_MAP(CImgBrd, CWnd)
  100. END_MESSAGE_MAP()
  101. void CImgBrd::trimipstr(string &trimtarget)
  102. {
  103. vector<char> trimstr;
  104. DWORD len = trimtarget.size();
  105. for(DWORD i = 0;i < len;i++)
  106. {
  107. if((trimtarget[i] >= '0' && trimtarget[i] <= '9') || trimtarget[i] == '.')
  108. {
  109. trimstr.push_back(trimtarget[i]);
  110. }
  111. }
  112. trimtarget = "";
  113. trimtarget.assign(trimstr.begin(),trimstr.end());
  114. }
  115. int CImgBrd::CloseEbusDevice()
  116. {
  117. m_pLog->WriteLog("Stop pipeline",LOG_INFORMATION,LOG_DEBUG);
  118. if(m_pvPipeline)
  119. {
  120. m_pvPipeline->Stop();
  121. // Now close the stream. Also optional but nice to have.
  122. m_pLog->WriteLog("Closing stream" ,LOG_INFORMATION,LOG_DEBUG);
  123. if(m_pvStream)
  124. {
  125. m_pvStream->Close();
  126. }
  127. // Unregistered pipeline event sink. Optional but nice to have.
  128. m_pvPipeline->UnregisterEventSink( &lPipelineEventSink );
  129. delete m_pvPipeline;
  130. delete m_pvStream;
  131. PV_SAMPLE_TERMINATE();
  132. return 1;
  133. }
  134. return 0;
  135. }
  136. int CImgBrd::OpenEbusDevice()
  137. {
  138. PvResult lResult;
  139. const PvDeviceInfo* lLastDeviceInfo = NULL;
  140. char szSep[] = ":";
  141. char szIpAddress[MAX_PATH] = {0};
  142. // Find all devices on the network.
  143. PvSystem lSystem;
  144. lResult = lSystem.Find();
  145. if ( !lResult.IsOK() )
  146. {
  147. m_pLog->WriteLog("Error opening stream",LOG_ERROR,LOG_DEBUG);
  148. return 0;
  149. }
  150. //get interfaces of ip&port
  151. CString strPixiumPath;// = strAppPath + ("\\config\\config_2121S\\PixDyn.ini");
  152. strPixiumPath.Format("%s\\%s\\config\\PixDyn.ini", g_strHWConfFilePath, m_SubConfigPath);
  153. m_pLog->WriteLog(strPixiumPath,LOG_ERROR,LOG_DEBUG);
  154. GetPrivateProfileStringA("hardware","gigevision.emission.remote.address","",szIpAddress,MAX_PATH,strPixiumPath.GetBuffer());
  155. LogInfo(szIpAddress);
  156. string localipaddr;
  157. string localipport;
  158. if(strlen(szIpAddress) == 0)
  159. {
  160. m_pLog->WriteLog("gigevision.emission.remote.address in PixDyn.ini not set.using default as 192.168.0.1:50000",LOG_WARNING,LOG_DEBUG);
  161. localipaddr = "192.168.0.1";
  162. localipport = "50000";
  163. }
  164. else
  165. {
  166. char *pContext = strtok(szIpAddress,szSep);
  167. if(pContext)
  168. {
  169. localipaddr = pContext;
  170. trimipstr(localipaddr);
  171. pContext = strtok(NULL,szSep);
  172. }
  173. if(pContext)
  174. {
  175. localipport = pContext;
  176. }
  177. if(localipaddr.size() ==0 || localipport.size() == 0)
  178. {
  179. m_pLog->WriteLog("Error gigevision.emission.remote.address in PixDyn.ini ",LOG_ERROR,LOG_DEBUG);
  180. return 0;
  181. }
  182. }
  183. //LogInfo(localipaddr.c_str());
  184. //LogInfo(localipport.c_str());
  185. //target ip address
  186. memset(szIpAddress,0,MAX_PATH);
  187. GetPrivateProfileStringA("hardware","gigevision.emission.host.address","",szIpAddress,MAX_PATH,strPixiumPath.GetBuffer());
  188. //LogInfo(szIpAddress);
  189. if(strlen(szIpAddress) == 0)
  190. {
  191. m_pLog->WriteLog("Error gigevision.emission.host.address in PixDyn.ini not set.using default as 192.168.0.2",LOG_ERROR,LOG_DEBUG);
  192. strcpy(szIpAddress,"192.168.0.2");
  193. }
  194. string targetipaddr = szIpAddress;
  195. trimipstr(targetipaddr);
  196. PV_SAMPLE_INIT();
  197. // Go through all interfaces
  198. uint32_t lInterfaceCount = lSystem.GetInterfaceCount();
  199. for ( uint32_t x = 0; x < lInterfaceCount; x++ )
  200. {
  201. //cout << "Interface " << x << endl;
  202. // Get pointer to the interface.
  203. const PvInterface* lInterface = lSystem.GetInterface( x );
  204. // Is it a PvNetworkAdapter?
  205. const PvNetworkAdapter* lNIC = dynamic_cast<const PvNetworkAdapter*>( lInterface );
  206. if ( lNIC != NULL )
  207. {
  208. string ip1 = lNIC->GetIPAddress().GetAscii();
  209. trimipstr(ip1);
  210. if(ip1 != localipaddr)
  211. {
  212. continue;
  213. }
  214. //cout << " MAC Address: " << lNIC->GetMACAddress().GetAscii() << endl;
  215. //cout << " IP Address: " << lNIC->GetIPAddress().GetAscii() << endl;
  216. //cout << " Subnet Mask: " << lNIC->GetSubnetMask().GetAscii() << endl << endl;
  217. }
  218. // Go through all the devices attached to the interface
  219. uint32_t lDeviceCount = lInterface->GetDeviceCount();
  220. for ( uint32_t y = 0; y < lDeviceCount ; y++ )
  221. {
  222. const PvDeviceInfo *lDeviceInfo = lInterface->GetDeviceInfo( y );
  223. //cout << " Device " << y << endl;
  224. //cout << " Display ID: " << lDeviceInfo->GetDisplayID().GetAscii() << endl;
  225. const PvDeviceInfoGEV* lDeviceInfoGEV = dynamic_cast<const PvDeviceInfoGEV*>( lDeviceInfo );
  226. //const PvDeviceInfoU3V *lDeviceInfoU3V = dynamic_cast<const PvDeviceInfoU3V *>( lDeviceInfo );
  227. //const PvDeviceInfoUSB *lDeviceInfoUSB = dynamic_cast<const PvDeviceInfoUSB *>( lDeviceInfo );
  228. //const PvDeviceInfoPleoraProtocol* lDeviceInfoPleora = dynamic_cast<const PvDeviceInfoPleoraProtocol*>( lDeviceInfo );
  229. if ( lDeviceInfoGEV != NULL ) // Is it a GigE Vision device?
  230. {
  231. string targetip1 = lDeviceInfoGEV->GetIPAddress().GetAscii();
  232. trimipstr(targetip1);
  233. if(targetipaddr != targetip1)
  234. {
  235. continue;
  236. }
  237. //cout << "GigE Vision device MAC Address: " << lDeviceInfoGEV->GetMACAddress().GetAscii() << endl;
  238. //cout << "GigE Vision device IP Address: " << lDeviceInfoGEV->GetIPAddress().GetAscii() << endl;
  239. //cout << "GigE Vision device Serial number: " << lDeviceInfoGEV->GetSerialNumber().GetAscii() << endl << endl;
  240. lLastDeviceInfo = lDeviceInfo;
  241. }
  242. //else if ( lDeviceInfoU3V != NULL ) // Is it a USB3 Vision device?
  243. //{
  244. // cout << " GUID: " << lDeviceInfoU3V->GetDeviceGUID().GetAscii() << endl;
  245. // cout << " S/N: " << lDeviceInfoU3V->GetSerialNumber().GetAscii() << endl;
  246. // cout << " Speed: " << lUSB->GetSpeed() << endl << endl;
  247. // lLastDeviceInfo = lDeviceInfo;
  248. //}
  249. //else if ( lDeviceInfoUSB != NULL ) // Is it an unidentified USB device?
  250. //{
  251. // cout << endl;
  252. //}
  253. //else if ( lDeviceInfoPleora != NULL ) // Is it a Pleora Protocol device?
  254. //{
  255. // cout << "Pleora Protocol device MAC Address: " << lDeviceInfoPleora->GetMACAddress().GetAscii() << endl;
  256. // cout << "Pleora Protocol device IP Address: " << lDeviceInfoPleora->GetIPAddress().GetAscii() << endl;
  257. // cout << "Pleora Protocol device Serial number: " << lDeviceInfoPleora->GetSerialNumber().GetAscii() << endl << endl;
  258. //}
  259. //got a device
  260. }
  261. }
  262. // Connect to the last device found
  263. if ( lLastDeviceInfo != NULL )
  264. {
  265. //cout << "Connecting to " << lLastDeviceInfo->GetDisplayID().GetAscii() << endl;
  266. m_pvStream = new PvStreamGEV();
  267. m_pvStream->SetUserModeDataReceiverThreadPriority(6);
  268. m_pvPipeline = new PvPipeline(m_pvStream);
  269. m_pvPipeline->RegisterEventSink( &lPipelineEventSink );
  270. m_pvPipeline->SetBufferCount( 64 );
  271. m_pvPipeline->SetBufferSize(1920*1024*4);//for test
  272. m_pvPipeline->SetHandleBufferTooSmall(true);
  273. m_pvPipeline->SetBufferHandlingThreadPriority(6);//THREAD_PRIORITY_TIME_CRITICAL
  274. // Open stream
  275. m_pLog->WriteLog("Opening stream",LOG_INFORMATION,LOG_DEBUG);
  276. if ( !m_pvStream->Open( lLastDeviceInfo->GetConnectionID(),atoi(localipport.c_str()) ).IsOK() )
  277. {
  278. m_pLog->WriteLog("Error opening stream",LOG_ERROR,LOG_DEBUG);
  279. return 0;
  280. }
  281. //
  282. m_pLog->WriteLog("Starting pipeline",LOG_INFORMATION,LOG_DEBUG);
  283. PvResult res1 = m_pvPipeline->Start();
  284. if(res1.IsOK() == false)
  285. {
  286. m_pLog->WriteLog("Error start pipe",LOG_ERROR,LOG_DEBUG);
  287. return 0;
  288. }
  289. //succeed
  290. m_pLog->WriteLog("Starting pipeline Succeed",LOG_INFORMATION,LOG_DEBUG);
  291. return 1;
  292. }
  293. m_pLog->WriteLog("Error eBus Device not found ",LOG_ERROR,LOG_DEBUG);
  294. return 0;
  295. }
  296. bool CImgBrd::InitConnection()
  297. {
  298. //// Let the user select the device to receive from.
  299. //PvString lDeviceIP;
  300. //if ( !SelectDevice( lDeviceIP ) )
  301. //{
  302. // return false;
  303. //}
  304. //// Create the PvStreamGEV object.
  305. //PvStreamGEV m_lStreamGEV;
  306. //// Create the PvPipeline object.
  307. //PvPipeline m_lPipeline( &m_lStreamGEV );
  308. //// Create a PvPipeline event sink (used to trap buffer too small events).
  309. //PipelineEventSink lPipelineEventSink;
  310. //m_lPipeline.RegisterEventSink( &lPipelineEventSink );
  311. //m_lPipeline.SetBufferCount( 16 );
  312. //m_lPipeline.SetBufferSize(1920*1024*4);//for test
  313. //m_lPipeline.SetHandleBufferTooSmall(true);
  314. //// Open stream
  315. //m_pLog->WriteLog("Opening stream",LOG_INFORMATION,LOG_DEBUG);
  316. ///*if ( !m_lStreamGEV.Open( lDeviceIP, "239.192.1.1", 1042 ).IsOK() )*/
  317. //if ( !m_lStreamGEV.Open( lDeviceIP,50000 ).IsOK() )
  318. //{
  319. // m_pLog->WriteLog("Error opening stream",LOG_ERROR,LOG_DEBUG);
  320. // return false;
  321. //}
  322. //LogInfo(lDeviceIP);
  323. //// IMPORTANT: the pipeline needs to be "armed", or started before
  324. //// we instruct the device to send us images.
  325. //m_pLog->WriteLog("Starting pipeline",LOG_INFORMATION,LOG_DEBUG);
  326. return false;
  327. }
  328. bool CImgBrd::InitBrd(HWND hWnd)
  329. {
  330. m_hWnd = hWnd;
  331. if(g_bTestTrue) AfxMessageBox("Saving RAWIMAGE IN D:\\TESTRAW_IMAGE.raw");
  332. CString strlog;
  333. CAppSettings logsettings(g_strConfFilePath + "\\DROCLogMode.xml");
  334. if(m_pLog)
  335. {
  336. delete m_pLog;
  337. m_pLog = NULL;
  338. }
  339. m_pLog = new CLogFile(g_strLogFilePath,_T("Acq"),atoi(logsettings[("LogDays")]));
  340. m_pLog->SetLogMode(atoi(logsettings[_T("Acq")]));
  341. m_pLog->WriteLog("\n\n\n===========================================Begin ACQ board Log====================================\n",LOG_INFORMATION,LOG_DEBUG);
  342. if(OpenEbusDevice() == 0)
  343. {
  344. return false;
  345. }
  346. strlog.Format("Image size: Size X = %d, Size Y = %d",SizeX,SizeY);
  347. m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  348. m_ImgInfo.nWidth = SizeX;
  349. m_ImgInfo.nHeight = SizeY;
  350. ReadyImgBuff(SizeX*SizeY);
  351. m_pwData = new WORD[SizeX*SizeY];
  352. IniGrabThread();
  353. return true;
  354. }
  355. bool CImgBrd::CloseBrd(void)
  356. {
  357. if(m_IsGrab)
  358. {
  359. m_pLog->WriteLog("ERROR Calling: CloseBrd during ACQ: StopGrab here.",LOG_ERROR);
  360. StopGrab();
  361. }
  362. //if(m_pImgBuffer)
  363. //{
  364. // delete[] m_pImgBuffer;
  365. // m_pImgBuffer = NULL;
  366. // m_pImgBufferSize = 0;
  367. //}
  368. if(m_pwData)
  369. {
  370. delete[] m_pwData;
  371. m_pwData = NULL;
  372. }
  373. return true;
  374. }
  375. bool CImgBrd::SetAcqMode(int nMode)
  376. {
  377. return true;
  378. }
  379. WORD* CImgBrd::ReadyImgBuff(DWORD ImgSize)
  380. {
  381. WaitForSingleObject(m_Mutext_Buff,INFINITE);
  382. if (m_pImgBuffer==NULL)
  383. {
  384. // m_pLog->WriteLog("***m_pImgBuffer is NULL",LOG_INFORMATION,LOG_DEBUG);
  385. m_pImgBufferSize = ImgSize;
  386. m_pImgBuffer = new WORD[m_pImgBufferSize];
  387. }
  388. else
  389. {
  390. // m_strLog.Format("***lWidth*lHeight=%d, m_pImgBufferSize=%d",lWidth*lHeight, m_pImgBufferSize);
  391. // m_pLog->WriteLog(m_strLog,LOG_INFORMATION,LOG_DEBUG);
  392. if(ImgSize > m_pImgBufferSize)
  393. {
  394. delete []m_pImgBuffer;
  395. m_pImgBufferSize = ImgSize;
  396. m_pImgBuffer = new WORD[m_pImgBufferSize];
  397. }
  398. }
  399. ReleaseMutex(m_Mutext_Buff);
  400. return m_pImgBuffer;
  401. }
  402. bool CImgBrd::StartGrab(void)
  403. {
  404. CString strlog;
  405. m_nCurrentFrame = -1;
  406. m_nTotalFrameGrab = 0;
  407. strlog.Format("start grab ProcessFunction!");
  408. m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  409. m_IsValid = true;
  410. if(g_bTestTrue)
  411. g_TestSavingImage = new CFile("D:\\TESTRAW_IMAGE.raw",CFile::modeCreate|CFile::modeWrite);
  412. //StartSlave();
  413. //LogInfo("Set grab event1");
  414. //if ((m_nGrabMode==ZSKK_HARDWARE_SEQUENCE_SEQUENCERAD)||(m_nGrabMode==ZSKK_HARDWARE_SEQUENCE_PULSEFLU))
  415. //{
  416. // LogInfo("Sleep 50ms");
  417. //}
  418. //Sleep(50);
  419. m_IsGrab = true;
  420. SetEvent(m_IsInGrabPeriod);
  421. return true;
  422. }
  423. bool CImgBrd::StopGrab(int nXRayOnNum)
  424. {
  425. CString strlog;
  426. m_nXRayOnNum = nXRayOnNum;
  427. m_IsGrab = false;
  428. if(m_nGrabMode != ZSKK_HARDWARE_SEQUENCE_SINGLERAD)//single spot just caputre one image and stop capture;
  429. {
  430. ResetEvent(m_IsInGrabPeriod);
  431. }
  432. else
  433. {
  434. m_pLog->WriteLog("Single shot mode, stop grab!",LOG_INFORMATION,LOG_DEBUG);
  435. }
  436. strlog.Format("Total image frame number: %d, Frequency: %.1lf",m_nTotalFrameGrab,m_fCurAcqFrameRate );
  437. m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  438. return true;
  439. }
  440. bool CImgBrd::MSGControl(CWnd *Wnd, int nMSGType, int nMSGwParam, int nMSGpParam, int nMSGOutMode,int nTargetPosition)
  441. {
  442. CString strHandleName = strAppHardwareHandleName;
  443. switch (nTargetPosition)
  444. {
  445. case ZSKK_MSG_TARGETHANDLE_NULL:
  446. break;
  447. case ZSKK_MSG_TARGETHANDLE_RFOC:
  448. strHandleName = strAppRFOCHandleName;
  449. break;
  450. case ZSKK_MSG_TARGETHANDLE_RFHARDWARE:
  451. strHandleName = strAppHardwareHandleName;
  452. break;
  453. case ZSKK_MSG_TARGETHANDLE_RFMECHNICAL:
  454. strHandleName = strAppMechCompHandleName;
  455. break;
  456. case ZSKK_MSG_TARGETHANDLE_RFDETECTOR:
  457. strHandleName = strAppRFDTHandleName;
  458. break;
  459. case ZSKK_MSG_TARGETHANDLE_DRDETECTOR:
  460. strHandleName = strAppDRDTHandleName;
  461. break;
  462. case ZSKK_MSG_TARGETHANDLE_RFDYN:
  463. strHandleName = strAppDYNHandleName;
  464. break;
  465. default:
  466. break;
  467. }
  468. CWnd *targetWnd = CWnd::FindWindow(NULL,strHandleName);
  469. if(targetWnd != NULL)
  470. {
  471. if(nMSGOutMode == 0)
  472. {
  473. targetWnd->PostMessage(nMSGType,nMSGwParam,nMSGpParam);
  474. }
  475. else
  476. {
  477. targetWnd->SendMessage(nMSGType,nMSGwParam,nMSGpParam);
  478. }
  479. }
  480. return true;
  481. }
  482. bool CImgBrd::WriteFrame(WORD* pImgData,int nWidth,int nHeight)
  483. {
  484. if(pImgData == NULL)
  485. return false;
  486. if((nWidth <=0)||(nHeight <= 0))
  487. return false;
  488. DWORD nTotalMem = m_pDataBuffer->GetShareMemSize();
  489. int ntotal = nTotalMem/(nWidth*nHeight*sizeof(WORD));
  490. if(ntotal == 0)
  491. {
  492. m_pLog->WriteLog("GetShareMemSize failed, shared memory size is 0", LOG_ERROR);
  493. return false;
  494. }
  495. m_nCurrentFrame = (m_nCurrentFrame+1)%ntotal;
  496. m_pDataBuffer->WriteShareMemEx(m_nCurrentFrame*nWidth*nHeight*sizeof(WORD),(LPVOID)pImgData,nWidth*nHeight*sizeof(WORD));
  497. if(g_bTestTrue)
  498. {
  499. if(m_nCurrentFrame < 12)
  500. g_TestSavingImage->Write(pImgData,nWidth*nHeight*sizeof(WORD));
  501. }
  502. return true;
  503. }
  504. bool CImgBrd::SetFrameValid()
  505. {
  506. m_IsValid = true;
  507. return true;
  508. }
  509. bool CImgBrd::SetGrabMode(int nmode)
  510. {
  511. m_nGrabMode = nmode;
  512. CString strlog;
  513. strlog.Format("Grab mode: %d",m_nGrabMode);
  514. this->m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG,true);
  515. return true;
  516. }
  517. bool CImgBrd::GetImageInfo(ZSKK_ACQ_INFO &imgInfo)
  518. {
  519. imgInfo.nBits = 16;
  520. imgInfo.nColumn = SizeX;
  521. imgInfo.nRow = SizeY;
  522. return true;
  523. }
  524. int CImgBrd::CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  525. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  526. int nLeftMargin,int nTopMargin,int nRightMargin,int nBottomMargin)
  527. {
  528. if(nLeftMargin == 0 && nTopMargin == 0 && nRightMargin == 0 && nBottomMargin == 0) return -1;
  529. if((pDstData == NULL)||(pScrData == NULL)||(nSrcWidth <= 0)||(nSrcHeight <= 0)||(nBits <= 0))
  530. return -1;
  531. if((nLeftMargin >= nSrcWidth)||(nTopMargin >= nSrcHeight))
  532. return -1;
  533. int nBitsToBYTE =(int)((nBits+7)*0.125);
  534. if(nBitsToBYTE < 1)
  535. return -1;
  536. int nXL, nXR, nYL, nYR;
  537. nXL = nLeftMargin;
  538. nYL = nTopMargin;
  539. if(nSrcWidth - nRightMargin < 0)
  540. return -1;
  541. nXR = nSrcWidth - nRightMargin - 1;
  542. if(nXR < nXL)
  543. return -1;
  544. if(nSrcHeight - nBottomMargin < 0)
  545. return -1;
  546. nYR = nSrcHeight - nBottomMargin - 1;
  547. if(nYR < nYL)
  548. return -1;
  549. nDstWidth = nXR - nXL + 1;
  550. nDstHeight = nYR - nYL + 1;
  551. int i;
  552. #pragma omp parallel private(i)
  553. {
  554. #pragma omp for
  555. for(i = nYL; i< nYR; i++)
  556. ::memcpy((WORD*)pDstData + (i - nYL) * nDstWidth, (WORD*)pScrData + (i * nSrcWidth + nXL), nDstWidth * nBitsToBYTE);
  557. }
  558. return 0;
  559. }
  560. long CImgBrd::ProcessingFunction(/*long HookType, MIL_ID HookId, void MPTYPE *HookDataPtr*/)
  561. {
  562. //for test
  563. //m_pCab->m_pLog->WriteLog("Process image...",LOG_INFORMATION,LOG_DEBUG);
  564. m_pCab->m_ImgInfo.nBits = 16;
  565. int res = m_pCab->CropImageMargin( m_pCab->m_pwData, m_pCab->m_ImgInfo.nWidth, m_pCab->m_ImgInfo.nHeight,
  566. m_pCab->m_pImgBuffer, m_pCab->SizeX, m_pCab->SizeY, m_pCab->m_ImgInfo.nBits,
  567. m_pCab->m_nCropLeft, m_pCab->m_nCropTop, m_pCab->m_nCropRight, m_pCab->m_nCropBottom);
  568. if( res == 0 )
  569. {
  570. m_pCab->m_ImgInfo.pwData = m_pCab->m_pwData;
  571. }
  572. else
  573. {
  574. m_pCab->m_ImgInfo.nWidth = m_pCab->SizeX;
  575. m_pCab->m_ImgInfo.nHeight = m_pCab->SizeY;
  576. m_pCab->m_ImgInfo.pwData = m_pCab->m_pImgBuffer;
  577. }
  578. CString strlog;
  579. CWnd *pWndTest = NULL;
  580. if((m_pCab->m_nGrabMode == ZSKK_HARDWARE_SEQUENCE_SINGLERAD) && (m_pCab->m_nTotalFrameGrab == 0))
  581. {
  582. //for test
  583. strlog.Format("Single shot RAD Image ready: SizeX = %d, SizeY = %d",m_pCab->m_ImgInfo.nWidth,m_pCab->m_ImgInfo.nHeight);
  584. m_pCab->m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  585. m_pCab->WriteFrame(m_pCab->m_ImgInfo.pwData, m_pCab->m_ImgInfo.nWidth, m_pCab->m_ImgInfo.nHeight);
  586. m_pCab->MSGControl(pWndTest, ZSKK_MSG_RFHW_WFOUT, ZSKK_MSG_RFHW_WF_DATAINFOSINGLE, m_pCab->m_nCurrentFrame, ZSKK_MSG_TYPE_SYNC_NO);
  587. m_pCab->m_pLog->WriteLog("Image Send Out to UI!",LOG_INFORMATION,LOG_DEBUG);
  588. //m_pCab->m_strLog.Format("c:\\2121\\%d.raw",m_pCab->m_nTotalFrameGrab);
  589. //m_pCab->SaveImage(m_pCab->m_ImgInfo.pwData,m_pCab->m_strLog,m_pCab->m_ImgInfo.nWidth, m_pCab->m_ImgInfo.nHeight);
  590. m_pCab->StopGrab();
  591. }
  592. else if(m_pCab->m_nGrabMode == ZSKK_HARDWARE_SEQUENCE_SEQUENCERAD)
  593. {
  594. m_pCab->WriteFrame(m_pCab->m_ImgInfo.pwData, m_pCab->m_ImgInfo.nWidth, m_pCab->m_ImgInfo.nHeight);
  595. m_pCab->MSGControl(pWndTest, ZSKK_MSG_RFHW_WFOUT, ZSKK_MSG_RFHW_WF_DATAINFOSEQUENCE, m_pCab->m_nCurrentFrame, 0);
  596. strlog.Format("Sequence RAD Image ready: SizeX = %d, SizeY = %d",m_pCab->m_ImgInfo.nWidth,m_pCab->m_ImgInfo.nHeight);
  597. m_pCab->m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  598. }
  599. else if((m_pCab->m_nGrabMode == ZSKK_HARDWARE_SEQUENCE_PULSEFLU) && (m_pCab->m_nTotalFrameGrab == 0))
  600. {
  601. strlog.Format("First Flu Image .Ignore it");
  602. m_pCab->m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  603. }
  604. else if( ((m_pCab->m_nGrabMode == ZSKK_HARDWARE_SEQUENCE_PULSEFLU) || ( m_pCab->m_nGrabMode == ZSKK_HARDWARE_SEQUENCE_CONTINOUSFLU)) &&( m_pCab->m_IsGrab) )
  605. {
  606. m_pCab->WriteFrame(m_pCab->m_ImgInfo.pwData, m_pCab->m_ImgInfo.nWidth, m_pCab->m_ImgInfo.nHeight);
  607. m_pCab->MSGControl(pWndTest, ZSKK_MSG_RFHW_WFOUT, ZSKK_MSG_RFHW_WF_DATAINFOFLU, m_pCab->m_nCurrentFrame, ZSKK_MSG_TYPE_SYNC_NO);
  608. strlog.Format("Flu Image ready: SizeX = %d, SizeY = %d",m_pCab->m_ImgInfo.nWidth,m_pCab->m_ImgInfo.nHeight);
  609. m_pCab->m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  610. }
  611. ++m_pCab->m_nTotalFrameGrab;
  612. bool bSave = false;
  613. if (bSave)
  614. {
  615. m_pCab->m_strLog.Format("c:\\2121\\%d.raw",m_pCab->m_nTotalFrameGrab);
  616. m_pCab->SaveImage(m_pCab->m_ImgInfo.pwData,m_pCab->m_strLog,m_pCab->m_ImgInfo.nWidth, m_pCab->m_ImgInfo.nHeight);
  617. }
  618. return 0;
  619. }
  620. bool CImgBrd::ChangeActiveMode(CString ExamType, int nPUMode,int nSzieX,int nSizeY, int nCropLeft, int nCropTop, int nCropRight, int nCropBottom)
  621. {
  622. if(m_IsGrab)
  623. {
  624. m_pLog->WriteLog("ERROR Calling: Change DCF during ACQ: StopGrab here.",LOG_ERROR);
  625. StopGrab();
  626. }
  627. CloseBrd();
  628. SizeX = nSzieX;
  629. SizeY = nSizeY;
  630. ReadyImgBuff(SizeX*SizeY);
  631. m_strLog.Format("ChangeActiveMode: SizeX=%d, SizeY=%d", SizeX, SizeY);
  632. m_pLog->WriteLog(m_strLog,LOG_INFORMATION);
  633. //m_pImgBuffer = new WORD[SizeX*SizeY];
  634. if (m_pwData)
  635. {
  636. delete []m_pwData;
  637. m_pwData = NULL;
  638. }
  639. m_pwData = new WORD[SizeX*SizeY];
  640. m_nCropLeft = nCropLeft;
  641. m_nCropTop = nCropTop;
  642. m_nCropRight = nCropRight;
  643. m_nCropBottom = nCropBottom;
  644. m_ImgInfo.nWidth = SizeX - m_nCropLeft - m_nCropRight;
  645. m_ImgInfo.nHeight = SizeY - m_nCropTop - m_nCropBottom;
  646. m_ACQInfo.nColumn = m_ImgInfo.nWidth;
  647. m_ACQInfo.nRow = m_ImgInfo.nHeight;
  648. m_ACQInfo.nBits = 16;
  649. m_ACQInfo.fACQElementSpacing = (float)(m_nPixelSpacing*0.001);
  650. CWnd *pWndTest = NULL;
  651. CString strlog;
  652. m_strExamType = ExamType;
  653. if( ExamType != _T("RAD"))
  654. {
  655. strlog.Format("Send Flu Image information: SizeX = %d, SizeY = %d, PixelSpacing = %.3f,",m_ACQInfo.nColumn,m_ACQInfo.nRow,m_ACQInfo.fACQElementSpacing);
  656. m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  657. COPYDATASTRUCT copyData;
  658. copyData.lpData = &m_ACQInfo;
  659. copyData.cbData = sizeof(ZSKK_ACQ_INFO);
  660. MSGControl(pWndTest,ZSKK_MSG_RFDATA_OUT,ZSKK_DETECTOR_DATA_FLU_IMAGESIZEBIT,(LPARAM)&copyData,ZSKK_MSG_TYPE_SYNC_YES);
  661. }
  662. else
  663. {
  664. strlog.Format("Send RAD image information: SizeX = %d, SizeY = %d, PixelSpacing = %.3f",m_ACQInfo.nColumn,m_ACQInfo.nRow,m_ACQInfo.fACQElementSpacing);
  665. m_pLog->WriteLog(strlog,LOG_INFORMATION,LOG_DEBUG);
  666. COPYDATASTRUCT copyData;
  667. copyData.lpData = &m_ACQInfo;
  668. copyData.cbData = sizeof(ZSKK_ACQ_INFO);
  669. MSGControl(pWndTest,ZSKK_MSG_RFDATA_OUT,ZSKK_DETECTOR_DATA_RAD_IMAGESIZEBIT,(LPARAM)&copyData,ZSKK_MSG_TYPE_SYNC_YES);
  670. }
  671. this->m_pLog->WriteLog("Change acquire board mode success!",LOG_INFORMATION,LOG_DEBUG,true);
  672. return true;
  673. }
  674. void CImgBrd::Pausetime(DWORD dwSpan)
  675. {
  676. DWORD dtstart = ::GetTickCount();
  677. while((::GetTickCount() - dtstart)<dwSpan)
  678. {
  679. MSG msg;
  680. ::GetMessage(&msg, NULL, 0, 0);
  681. ::TranslateMessage(&msg);
  682. ::DispatchMessage(&msg);
  683. }
  684. }
  685. bool CImgBrd::SetPixelSpacing(int nPixelSpacing)
  686. {
  687. m_nPixelSpacing = nPixelSpacing;
  688. CString str;
  689. str.Format("pixel spacing(%d)",m_nPixelSpacing);
  690. m_pLog->WriteLog(str,LOG_INFORMATION,LOG_DEBUG);
  691. return true;
  692. }
  693. bool CImgBrd:: StartSlave()
  694. {
  695. // Get stream parameters/stats.
  696. PvGenParameterArray *lStreamParams = m_pvStream->GetParameters();
  697. PvGenInteger *lBlockCount = dynamic_cast<PvGenInteger *>( lStreamParams->Get( "BlockCount" ) );
  698. PvGenFloat *lFrameRate = dynamic_cast<PvGenFloat *>( lStreamParams->Get( "AcquisitionRate" ) );
  699. PvGenFloat *lBandwidth = dynamic_cast<PvGenFloat *>( lStreamParams->Get( "Bandwidth" ) );
  700. PvGenBoolean *lRequestMissingPackets = dynamic_cast<PvGenBoolean *>( lStreamParams->Get( "RequestMissingPackets" ) );
  701. // Disabling request missing packets.
  702. lRequestMissingPackets->SetValue( false );
  703. int64_t lBlockCountVal = 0;
  704. double lFrameRateVal = 0.0;
  705. double lBandwidthVal = 0.0;
  706. // Acquire images until the user instructs us to stop.
  707. //for test
  708. //m_pLog->WriteLog("Ready to get image.going to loop...",LOG_INFORMATION,LOG_DEBUG);
  709. //PvFlushKb();
  710. while ( 1 )//for test
  711. {
  712. if(m_pvPipeline->IsStarted() == false)
  713. {
  714. PvResult res1 = m_pvPipeline->Start();
  715. if(res1.IsOK() == false)
  716. {
  717. m_pLog->WriteLog("Error start pipe",LOG_ERROR,LOG_DEBUG);
  718. return false;
  719. }
  720. }
  721. // Retrieve next buffer
  722. PvBuffer *lBuffer = NULL;
  723. PvResult lOperationResult;
  724. //LogInfo("before PvResult lResult = m_pvPipeline->RetrieveNextBuffer( &lBuffer, 500, &lOperationResult )");
  725. PvResult lResult = m_pvPipeline->RetrieveNextBuffer( &lBuffer, 1000, &lOperationResult );
  726. //LogInfo("after PvResult lResult = m_pvPipeline->RetrieveNextBuffer( &lBuffer, 500, &lOperationResult )");
  727. if ( lResult.IsOK() )
  728. {
  729. if (lOperationResult.IsOK())
  730. {
  731. //if(WaitForSingleObject(m_IsInGrabPeriod,0) == WAIT_OBJECT_0)
  732. if(m_IsGrab == true)
  733. {
  734. //
  735. // We now have a valid buffer. This is where you would typically process the buffer.
  736. // -----------------------------------------------------------------------------------------
  737. // ...
  738. lBlockCount->GetValue( lBlockCountVal );
  739. lFrameRate->GetValue( lFrameRateVal );
  740. lBandwidth->GetValue( lBandwidthVal );
  741. // If the buffer contains an image, display width and height.
  742. uint32_t lWidth = 0, lHeight = 0;
  743. int temp = lBuffer->GetBlockID();
  744. //for test
  745. /*CString lLog;
  746. lLog.Format("BlockID(%d),ChunkCount(%d),PayLoadType(%d)",temp,lBuffer->GetChunkCount(),(int)lBuffer->GetPayloadType());
  747. m_pLog->WriteLog(lLog,LOG_INFORMATION,LOG_DEBUG);
  748. for(DWORD li = 0; li < lBuffer->GetChunkCount();li++)
  749. {
  750. uint32_t cID = 0;
  751. PvResult lres = lBuffer->GetChunkIDByIndex(li,cID);
  752. if(lres.IsOK())
  753. {
  754. CString dataLog;
  755. uint32_t cSize = lBuffer->GetChunkSizeByID(cID);
  756. const uint8_t *pChunkData = lBuffer->GetChunkRawDataByID(cID);
  757. lLog.Format("ChunkIdx(%d),ChunkId(%d),ChunkSize(%d),ChunkData:"
  758. ,li,cID,cSize);
  759. for(DWORD lj = 0;lj < cSize;lj++)
  760. {
  761. dataLog.Format("-%02X",pChunkData[lj]);
  762. lLog += dataLog;
  763. }
  764. m_pLog->WriteLog(lLog,LOG_INFORMATION,LOG_DEBUG);
  765. }
  766. }*/
  767. if ( lBuffer->GetPayloadType() == PvPayloadTypeImage )
  768. {
  769. // Get image specific buffer interface.
  770. PvImage *lImage = lBuffer->GetImage();
  771. // Read width, height
  772. lWidth = lBuffer->GetImage()->GetWidth();
  773. lHeight = lBuffer->GetImage()->GetHeight();
  774. // m_strLog.Format("***lWidth = %d, lHeight = %d", lWidth, lHeight);
  775. // m_pLog->WriteLog(m_strLog,LOG_INFORMATION,LOG_DEBUG);
  776. if ((lWidth>0)&&(lHeight>0))
  777. {
  778. WORD *p = ReadyImgBuff(((DWORD)lWidth)*((DWORD)lHeight));
  779. memcpy(m_pImgBuffer,lImage->GetDataPointer(),((DWORD)lWidth)*((DWORD)lHeight)*sizeof(WORD));
  780. ProcessingFunction();
  781. }
  782. lImage = NULL;
  783. }
  784. m_fCurAcqFrameRate = lFrameRateVal;
  785. m_strLog.Format(" BlockID(%d),Width(%d),Hight(%d),FrameRate(%.1lf),Bandwidth(%.1lf)Mb/s"
  786. ,temp,lWidth,lHeight,m_fCurAcqFrameRate,lBandwidthVal/1000000.0f);
  787. m_pLog->WriteLog(m_strLog,LOG_INFORMATION,LOG_DEBUG);
  788. }
  789. }
  790. // We have an image - do some processing (...) and VERY IMPORTANT,
  791. // release the buffer back to the pipeline.
  792. m_pvPipeline->ReleaseBuffer( lBuffer );
  793. //m_pvPipeline->Reset();
  794. }
  795. else
  796. {
  797. break;
  798. }
  799. }
  800. // We stop the pipeline - letting the object lapse out of
  801. // scope would have had the destructor do the same, but we do it anyway.
  802. //for test
  803. //LogInfo("leave StartSlave");
  804. return true;
  805. }
  806. bool CImgBrd:: SelectDevice( PvString &aIP )
  807. {
  808. /*
  809. const PvDeviceInfo *lDeviceInfo = NULL;
  810. PvResult lResult;
  811. #ifdef PV_GUI_NOT_AVAILABLE
  812. PvSystem lSystem;
  813. lDeviceInfo = PvSelectDevice( lSystem );
  814. if( lDeviceInfo == NULL )
  815. {
  816. cout << "No device selected." << endl;
  817. return false;
  818. }
  819. #else
  820. PvDeviceFinderWnd lDeviceFinderWnd;
  821. lResult = lDeviceFinderWnd.ShowModal();
  822. if( !lResult.IsOK() )
  823. {
  824. cout << "No device selected." << endl;
  825. return false;
  826. }
  827. lDeviceInfo = lDeviceFinderWnd.GetSelected();
  828. #endif // PV_GUI_NOT_AVAILABLE
  829. if( lDeviceInfo == NULL )
  830. {
  831. cout << "No device selected." << endl;
  832. return false;
  833. }
  834. // This sample only supports GigE Vision devices
  835. if ( lDeviceInfo->GetType() != PvDeviceInfoTypeGEV )
  836. {
  837. cout << "This sample only supports GigE Vision devices." << endl;
  838. return NULL;
  839. }
  840. aIP = lDeviceInfo->GetConnectionID();
  841. */
  842. return true;
  843. }
  844. bool CImgBrd::SaveImage(const WORD* pRawImg, const char* pImgName,int nWidth, int nHeight)
  845. {
  846. /*LogInfo("Begin to Save Raw Image" );
  847. LogInfo(pImgName);*/
  848. CString str;
  849. /*str.Format("with(%d) hight(%d)",nWidth,nHeight);
  850. LogInfo(str);*/
  851. if ( pRawImg == NULL || pImgName == NULL )
  852. {
  853. LogInfo("image buffer is null");
  854. return false;
  855. }
  856. CString strTemp;
  857. strTemp = /*m_strRawImgPath + "\\" + */ pImgName;
  858. CFile file;
  859. if(!file.Open(strTemp, CFile::modeCreate | CFile::modeWrite ))
  860. {
  861. LogInfo("Open file failed");
  862. return false;
  863. }
  864. else
  865. {
  866. file.Write(pRawImg, nWidth*nHeight*sizeof(WORD));
  867. }
  868. file.Close();
  869. //LogInfo("End to Save Raw Image");
  870. return true;
  871. }
  872. UINT CImgBrd::IniGrabThread()
  873. {
  874. if ( m_hEventGrab != NULL )
  875. CloseHandle( m_hEventGrab );
  876. m_hEventGrab = CreateEvent( NULL, FALSE, FALSE, NULL );
  877. if ( m_hEventExitGrapThd != NULL )
  878. CloseHandle( m_hEventExitGrapThd );
  879. m_hEventExitGrapThd = CreateEvent( NULL, FALSE, FALSE, NULL );
  880. UINT uRtn = 1;
  881. if ( m_pGrapThdPro == NULL )
  882. {
  883. m_pGrapThdPro = ::AfxBeginThread( GrabThread, this );
  884. if (m_pGrapThdPro == NULL)
  885. {
  886. LogInfo( "create GrabThread failed" );
  887. uRtn = 0;
  888. }
  889. }
  890. LogInfo( "create GrabThread success" );
  891. return uRtn;
  892. }
  893. UINT CImgBrd::ExitGrabThread()
  894. {
  895. UINT uRtn = 1;
  896. BOOL bKillThrd = false;
  897. m_bExitGrapThdPro = true;
  898. SetEvent(m_hEventGrab);
  899. DWORD wRtn = WaitForSingleObject(m_hEventExitGrapThd,5000);
  900. switch(wRtn)
  901. {
  902. case WAIT_TIMEOUT:
  903. LogInfo("Exit Grab thread time out");
  904. bKillThrd = TerminateThread(m_pGrapThdPro->m_hThread,0);
  905. break;
  906. case WAIT_OBJECT_0:
  907. LogInfo("Exit grab thread success");
  908. break;
  909. default:
  910. LogInfo("Exit Grab thread unknown default");
  911. bKillThrd = TerminateThread(m_pGrapThdPro->m_hThread,0);
  912. break;
  913. }
  914. if ( m_hEventExitGrapThd != NULL )
  915. {
  916. CloseHandle( m_hEventExitGrapThd );
  917. m_hEventExitGrapThd = NULL;
  918. }
  919. m_pGrapThdPro = NULL;
  920. return uRtn;
  921. }
  922. UINT CImgBrd:: GrabThread( LPVOID pParam )
  923. {
  924. DWORD dTimeOut=55;
  925. bool bExit = false;
  926. CString str;
  927. int icount =0;
  928. bool bRtn =false;
  929. CImgBrd* pImgBd = reinterpret_cast<CImgBrd*>(pParam);
  930. DWORD dwRet;
  931. SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
  932. while ((dwRet = WaitForSingleObject(pImgBd->m_hEventGrab, 0)) != WAIT_OBJECT_0)
  933. {
  934. pImgBd->StartSlave();
  935. }
  936. if (pImgBd->m_hEventExitGrapThd)
  937. {
  938. pImgBd->LogInfo("Thread is closed,set event exit grab thread");
  939. SetEvent(pImgBd->m_hEventExitGrapThd);
  940. }
  941. return true;
  942. }
  943. bool CImgBrd::LogInfo( LPCSTR strLog )
  944. {
  945. if (m_pLog == NULL)
  946. {
  947. return false;
  948. }
  949. else
  950. {
  951. m_pLog->WriteLog(strLog,LOG_INFORMATION,LOG_RELEASE,true);
  952. return true;
  953. }
  954. }
  955. bool CImgBrd::LogError( LPCSTR strLog )
  956. {
  957. if (m_pLog == NULL)
  958. {
  959. return false;
  960. }
  961. else
  962. {
  963. m_pLog->WriteLog(strLog,LOG_ERROR,LOG_RELEASE,true);
  964. return true;
  965. }
  966. }
  967. bool CImgBrd::LogWarn( LPCSTR strLog )
  968. {
  969. if (m_pLog == NULL)
  970. {
  971. return false;
  972. }
  973. else
  974. {
  975. m_pLog->WriteLog(strLog,LOG_WARNING,LOG_RELEASE,true);
  976. return true;
  977. }
  978. }