Thread_Controller.cpp 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492
  1. #include "StdAfx.h"
  2. #include "Thread_Controller.h"
  3. #include "StoneU_Door.h"
  4. #include "Dlg_Frame.h"
  5. #include <afxmt.h>
  6. #include <afxtempl.h>
  7. #include "mdlProject.h"
  8. #include "XJL\GlobalXJL.h"
  9. #include "atlbase.h" //加入
  10. #include "WG\_WComm_Serial.h" //加入
  11. #include "WG\_WComm_Serial_i.c" //加入
  12. #import "WG\WComm_UDP.tlb" //加入
  13. using namespace WComm_UDP; //加入
  14. #include "Dlg_ZK.h"
  15. //JK
  16. extern HINSTANCE hACSDLL; //DLL handle
  17. extern int g_nControllerOpenCount; //控制器打开总数
  18. bool g_bOK = false;
  19. void WINAPI MYOnConnect(unsigned long iLineID)
  20. {
  21. CString str;
  22. str.Format("iLineID = %d", iLineID);
  23. g_bOK = true;
  24. return;
  25. }
  26. void MYOnDisConnect(unsigned long iLineID)
  27. {
  28. }
  29. void MYCtrlOnReceConfigData(unsigned long iLineID, BYTE *pDataBuf,unsigned long DataLength)
  30. {
  31. }
  32. void MYCtrlOnSwitchChange (unsigned long iLineID,unsigned long PortNum, unsigned long Value)
  33. {
  34. }
  35. //end JK
  36. CThread_Controller::CThread_Controller( CONCROLLER controller )
  37. {
  38. m_bPause = false;
  39. m_bExitThread = false;
  40. m_bExitFinish = false;
  41. m_Thread = NULL;
  42. m_hRunObject = NULL;
  43. m_nErrorNum = 0;
  44. m_Controller = controller;
  45. memset( m_nDoorStatus,-1,40 );
  46. //InitDll();
  47. }
  48. CThread_Controller::~CThread_Controller(void)
  49. {
  50. }
  51. void CThread_Controller::SetController( CONCROLLER controller )
  52. {
  53. m_Controller = controller;
  54. }
  55. void CThread_Controller::GetDoorNameAndInOutInfo( int iIndex,CString &sDoorName,CString &sInOut )
  56. {
  57. int nDoorCount=0;
  58. if( m_Controller.sDoorName[1]!="" )
  59. nDoorCount++;
  60. if( m_Controller.sDoorName[2]!="" )
  61. nDoorCount++;
  62. if( m_Controller.sDoorName[3]!="" )
  63. nDoorCount++;
  64. if( m_Controller.sDoorName[4]!="" )
  65. nDoorCount++;
  66. iIndex = iIndex/4%4;
  67. if( nDoorCount==1 )
  68. {
  69. if( iIndex==0 || iIndex==2 )
  70. {
  71. sInOut = "【进门】";
  72. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
  73. }
  74. else
  75. {
  76. sInOut = "【出门】";
  77. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
  78. }
  79. }
  80. else if( nDoorCount==2 )
  81. {
  82. if( iIndex==0 || iIndex==2 )
  83. {
  84. sInOut = "【进门】";
  85. if( iIndex==0 )
  86. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
  87. else
  88. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[2] );
  89. }
  90. else
  91. {
  92. sInOut = "【出门】";
  93. if( iIndex==1 )
  94. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
  95. else
  96. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[2] );
  97. }
  98. }
  99. else if( nDoorCount==4 )
  100. {
  101. sInOut = "【进门】";
  102. switch( iIndex )
  103. {
  104. case 0:
  105. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
  106. break;
  107. case 1:
  108. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[2] );
  109. break;
  110. case 2:
  111. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[3] );
  112. break;
  113. case 3:
  114. sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[4] );
  115. break;
  116. }
  117. }
  118. }
  119. int CThread_Controller::StartThread( )
  120. {
  121. if (m_hRunObject == NULL)
  122. {
  123. m_hRunObject = ::CreateEvent(
  124. NULL, /* Security */
  125. TRUE, /* Manual event */
  126. 0, /* Clear on creation */
  127. 0);
  128. }
  129. else
  130. {
  131. ResetEvent( m_hRunObject );
  132. }
  133. memset( m_nDoorStatus,-1,40 );
  134. switch( m_Controller.nBrandType )
  135. {
  136. case BRAND_WG://微耕
  137. {
  138. if( m_Controller.nWordMode==0 )
  139. {
  140. if (m_Thread == NULL )
  141. {
  142. m_Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread_WG_485,this,0,NULL);
  143. if (m_Thread)
  144. {
  145. m_bExitThread = false;
  146. m_bPause = false;
  147. m_bExitFinish = true;
  148. m_nErrorNum = 0;
  149. }
  150. }
  151. }
  152. else if( m_Controller.nWordMode==1 )
  153. {
  154. if (m_Thread == NULL )
  155. {
  156. m_Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread_WG_TCP,this,0,NULL);
  157. if (m_Thread)
  158. {
  159. m_bExitThread = false;
  160. m_bPause = false;
  161. m_bExitFinish = true;
  162. m_nErrorNum = 0;
  163. }
  164. }
  165. }
  166. }
  167. break;
  168. case BRAND_ZK://中控
  169. {
  170. if (m_Thread == NULL )
  171. {
  172. if( g_pDlgMain->m_pDlgZK==NULL )
  173. {
  174. g_pDlgMain->m_pDlgZK = new CDlg_ZK();
  175. g_pDlgMain->m_pDlgZK->Create(IDD_DLG_ZK, g_pDlgMain);
  176. //g_pDlgMain->m_pDlgZK->ShowWindow( true );
  177. }
  178. MTVERIFY( m_Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread_ZK,this,0,NULL) );
  179. if (m_Thread)
  180. {
  181. m_bExitThread = false;
  182. m_bPause = false;
  183. m_bExitFinish = true;
  184. m_nErrorNum = 0;
  185. }
  186. }
  187. }
  188. break;
  189. }
  190. return TRUE;
  191. }
  192. void CThread_Controller::StopThread( )
  193. {
  194. if( m_hRunObject )
  195. MTVERIFY( SetEvent( m_hRunObject ) );
  196. m_Controller.nOperterType = OPERATE_NULL;
  197. //Sleep( 500 );
  198. if( m_Controller.nBrandType==BRAND_WG )
  199. {
  200. if( m_Thread )
  201. {
  202. // 一直等到通知结果才返回
  203. if( !m_bExitFinish )
  204. WaitForSingleObject( m_hRunObject, INFINITE );
  205. //MTVERIFY( WaitForSingleObject( m_Thread, INFINITE ) != WAIT_FAILED );
  206. MTVERIFY( CloseHandle( m_Thread ) );
  207. m_Thread = NULL;
  208. }
  209. }
  210. else if( m_Controller.nBrandType==BRAND_ZK )
  211. {
  212. if( m_Thread )
  213. {
  214. m_bExitThread = true;
  215. Sleep(300);
  216. int nCount=0;
  217. //while( !m_bExitFinish )
  218. //{
  219. // Sleep(100);
  220. // if( nCount++ > 20 )
  221. // {
  222. // TerminateThread( m_Thread , 0 );
  223. // Sleep(300);
  224. // break;
  225. // }
  226. //}
  227. CloseHandle( m_Thread );
  228. m_Thread = NULL;
  229. }
  230. }
  231. }
  232. DWORD WINAPI CThread_Controller::Thread_WG_485( CThread_Controller *pThread )
  233. {
  234. MSG message;
  235. CString strTemp;
  236. CString strInfo;
  237. HRESULT hr;
  238. // Now we will intilize COM
  239. hr = CoInitialize(0);
  240. if (!SUCCEEDED(hr))
  241. {
  242. ::MessageBox (NULL,(LPCTSTR)(g_strInitComFail),"",0);
  243. return FALSE; //出错
  244. }
  245. IWComm_Serial *wserial; //创建串口通信COM对象
  246. hr = CoCreateInstance( CLSID_CWComm_Serial, NULL, CLSCTX_INPROC_SERVER, IID_IWComm_Serial, (void**) &wserial);
  247. if(!SUCCEEDED(hr))
  248. {
  249. ::MessageBox (NULL,(LPCTSTR)(g_strInitSerialFail),"",0);
  250. return 0; //出错
  251. }
  252. //__int64 lngRet;
  253. long lngRetSerial;
  254. BSTR bstrT; //中间变量
  255. BSTR bstrFrame; //通信返回的数据
  256. BSTR bstrCmd; //发送的指令帧
  257. long controllerSN; //控制器序列号
  258. BSTR bstrComPort; //通信串口号
  259. //刷卡记录变量
  260. __int64 cardId; //卡号
  261. __int64 status; //状态
  262. BSTR bstrSwipeDate; //日期时间
  263. CString strRunDetail; //运行信息
  264. IWCOMM_OPERATEPtr wudp(__uuidof(WComm_Operate)); //创建.NET 通信对象
  265. strTemp = pThread->m_Controller.sSN;//"15978";
  266. controllerSN = _ttol((LPCTSTR)strTemp); //测试使用的控制器
  267. strTemp.Format("COM%d",pThread->m_Controller.nComPort );//"COM1";
  268. bstrComPort = strTemp.AllocSysString(); //使用的通信端口
  269. strTemp.Format("%d",controllerSN);
  270. strInfo = "控制器通信-" + strTemp + "-" + CString(bstrComPort) ;
  271. bstrT = BSTR(L"811000000000");
  272. bstrCmd = wudp->CreateBstrCommand(controllerSN, bstrT); //生成指令帧
  273. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  274. wserial->get_ErrCode((long*)&lngRetSerial);
  275. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  276. {
  277. strInfo = strInfo + char(13) + char(10) + "出错处理: 读取运行信息失败" ;
  278. //pBoxOne->SetWindowText(strInfo );
  279. //if( pThread->m_nErrorNum++>1 )
  280. {
  281. CString s;
  282. s.Format( "连接【%d】失败,错误码=%d",pThread->m_Controller.nComPort,lngRetSerial );
  283. WriteLog( s );
  284. //wudp -> Release();
  285. //wserial->Release();
  286. g_SetComIsOpen( pThread->m_Controller.sPort,0 );
  287. pThread->m_bExitFinish = true;
  288. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
  289. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
  290. return 0;
  291. }
  292. }
  293. pThread->m_nErrorNum = 0;
  294. pThread->m_bExitFinish = false;
  295. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
  296. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
  297. while( 1 )
  298. {
  299. //设置门控制参数(在线/延时)[108F]
  300. while( pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
  301. {
  302. for( int i=1;i<5;i++ )
  303. {
  304. if( pThread->m_Controller.bDoorIsSet[i] )
  305. {
  306. int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
  307. int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
  308. CString s;
  309. s.Format( "8F10%02d%02d",i,nDoorControlType );
  310. bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
  311. s += CString(bstrT);
  312. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  313. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  314. wserial -> get_ErrCode((long*)&lngRetSerial);
  315. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
  316. {
  317. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  318. {
  319. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  320. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
  321. break;
  322. }
  323. }
  324. else
  325. {
  326. pThread->m_nErrorNum = 0;
  327. //完成把标志赋为实时监控
  328. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  329. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
  330. break;
  331. }
  332. break;
  333. }
  334. }
  335. }
  336. //校准控制器时间
  337. while( pThread->m_Controller.nOperterType==OPERATE_JustTime )
  338. {
  339. bstrCmd = wudp -> CreateBstrCommandOfAdjustClockByPCTime(controllerSN); //生成指令帧
  340. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  341. wserial -> get_ErrCode((long*)&lngRetSerial);
  342. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
  343. {
  344. strInfo = strInfo + char(13) + char(10) + "校准控制器时间出错" ;
  345. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  346. {
  347. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  348. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
  349. break;
  350. }
  351. }
  352. else
  353. {
  354. pThread->m_nErrorNum = 0;
  355. //完成把标志赋为实时监控
  356. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  357. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
  358. break;
  359. }
  360. }
  361. //远程开门
  362. while( pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
  363. {
  364. for( int i=1;i<10;i++ )
  365. {
  366. if( pThread->m_Controller.bDoorIsSet[i] )
  367. {
  368. CString s;
  369. s.Format("9D10%02d",i );
  370. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  371. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  372. wserial -> get_ErrCode((long*)&lngRetSerial);
  373. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
  374. {
  375. strInfo = strInfo + char(13) + char(10) + "远程开门失败" ;
  376. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  377. {
  378. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  379. pThread->m_Controller.bDoorIsSet[i] = false;
  380. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
  381. break;
  382. }
  383. }
  384. else
  385. {
  386. pThread->m_nErrorNum = 0;
  387. //完成把标志赋为实时监控
  388. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  389. pThread->m_Controller.bDoorIsSet[i] = false;
  390. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
  391. break;
  392. }
  393. break;
  394. }
  395. }
  396. }
  397. //提取记录
  398. long recIndex;
  399. recIndex = 1;
  400. while( pThread->m_Controller.nOperterType==OPERATE_Record )
  401. {
  402. bstrT = wudp->NumToStrHex(recIndex, 4);
  403. strTemp = "8D10" + CString(bstrT);
  404. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  405. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  406. wserial->get_ErrCode((long*)&lngRetSerial);
  407. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  408. {
  409. strInfo = strInfo + char(13) + char(10) + "提取记录出错" ;
  410. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  411. {
  412. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  413. break;
  414. }
  415. }
  416. else
  417. {
  418. pThread->m_nErrorNum = 0;
  419. bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
  420. if (CString((bstrSwipeDate)) != "" )
  421. {
  422. int nIndex=0;
  423. CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  424. g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
  425. CString sTime,sCardID,sInfo,s;
  426. sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
  427. pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
  428. sTime.Format("%s",CString(bstrSwipeDate) );
  429. sCardID.Format( "%ld",cardId );
  430. if( sUserName!="" )
  431. sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
  432. sDoorName = sInOut+sDoorName;
  433. //ADOCtrl.InsertRecord( sTime,sCardID,sUserName,sDoorName,sInfo );
  434. recIndex = recIndex + 1;
  435. }
  436. else
  437. {
  438. if (recIndex > 1) //只有提取了记录才进行删除
  439. {
  440. while( true )
  441. {
  442. bstrT = wudp->NumToStrHex(recIndex-1, 4);
  443. strTemp = "8E10" + CString(bstrT);
  444. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  445. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  446. wserial -> get_ErrCode((long*)&lngRetSerial);
  447. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  448. {
  449. strInfo = strInfo + char(13) + char(10) + "删除记录失败" ;
  450. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  451. {
  452. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  453. break;
  454. }
  455. }
  456. else
  457. {
  458. pThread->m_nErrorNum=0;
  459. strInfo = strInfo + char(13) + char(10) + "删除记录成功";
  460. break;
  461. }
  462. }
  463. }
  464. //完成提取记录把标志赋为实时监控
  465. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  466. break;
  467. }
  468. }
  469. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
  470. { //响应其他事件 如Exit按钮操作
  471. ::TranslateMessage (&message);
  472. ::DispatchMessage (&message);
  473. }
  474. }
  475. //发送权限操作(1.先清空权限)
  476. if( pThread->m_Controller.nOperterType==OPERATE_Permit )
  477. {
  478. while( true )
  479. {
  480. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR("9310")) ; //生成指令帧
  481. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  482. wserial -> get_ErrCode((long*)&lngRetSerial);
  483. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  484. {
  485. strInfo = strInfo + char(13) + char(10) + "清空权限失败" ;
  486. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  487. {
  488. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  489. break;
  490. }
  491. }
  492. else
  493. {
  494. pThread->m_nErrorNum=0;
  495. strInfo = strInfo + char(13) + char(10) + "清空权限成功" ;
  496. break;
  497. }
  498. }
  499. //发送权限操作(2.再添加权限)
  500. //权限格式: 卡号(2)+区号(1)+门号(1)+卡起始年月日(2)+卡截止年月日(2)+ 控制时段索引号(1)+密码(3)+备用(4,用0填充)
  501. //发送权限按: 先发1号门(卡号小的先发), 再发2号门(卡号小的先发)
  502. //此案例中权限设为: 卡有效期从(2007-8-14 到2020-12-31), 采用默认时段1(任意时间有效), 缺省密码(1234), 备用值以00填充
  503. //以三个卡: 07217564 [9C4448],342681[B9A603],25409969[F126FE]为例,分别可以通过控制器的2个门。
  504. //实际使用按需修改
  505. // //!!!!!!!注意: 此处卡号已直接按从小到大排列赋值了. 实际使用中要用算法实现排序
  506. long privilegeIndex = 1;
  507. CString privilege;
  508. for( int nDoorIndex=1;nDoorIndex<5;nDoorIndex++ )
  509. {
  510. if( pThread->m_Controller.Card2Door[nDoorIndex].nCardCount>0 )
  511. {
  512. for( int nCardIndex=0;nCardIndex<pThread->m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
  513. {
  514. long cardno = pThread->m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
  515. privilege = "";
  516. bstrT = wudp->CardToStrHex(cardno);
  517. privilege = privilege + CString(bstrT); //卡号
  518. bstrT = wudp->NumToStrHex(nDoorIndex, 1);
  519. privilege = privilege + CString(bstrT) ; //门号
  520. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-14")) ;//有效起始日期
  521. privilege = privilege + CString(bstrT);
  522. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2020-12-31"));//有效截止日期
  523. privilege = privilege + CString(bstrT) ;
  524. bstrT = wudp->NumToStrHex(1, 1) ; //时段索引号
  525. privilege = privilege + CString(bstrT) ;
  526. bstrT = wudp->NumToStrHex(123456, 3) ; //用户密码
  527. privilege = privilege + CString(bstrT) ;
  528. bstrT = wudp->NumToStrHex(0, 4) ; //备用4字节(用0填充)
  529. privilege = privilege + CString(bstrT) ;
  530. if (lstrlen(privilege) != (16 * 2))
  531. {
  532. //生成的权限不符合要求, 请查一下上一指令中写入的每个参数是否正确
  533. strInfo = strInfo + char(13) + char(10) + "生成的权限不符合要求: 添加权限失败" ;
  534. }
  535. while( true )
  536. {
  537. bstrT = wudp->NumToStrHex(privilegeIndex, 2) ; //权限索引号
  538. strTemp = "9B10" + CString(bstrT) + privilege;
  539. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  540. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  541. wserial -> get_ErrCode((long*)&lngRetSerial);
  542. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
  543. {
  544. strInfo = strInfo + char(13) + char(10) + "添加权限失败" ;
  545. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  546. {
  547. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  548. break;
  549. }
  550. }
  551. else
  552. {
  553. pThread->m_nErrorNum = 0;
  554. privilegeIndex = privilegeIndex + 1;
  555. break;
  556. }
  557. }
  558. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
  559. { //响应其他事件 如Exit按钮操作
  560. ::TranslateMessage (&message);
  561. ::DispatchMessage (&message);
  562. }
  563. }
  564. }
  565. }
  566. //发送控制时段
  567. //发送要设定的时段 [注意0,1时段为系统固定化,更改是无效的, 所以设定的时段一般从2开始]
  568. //此案例设定时段2: 从2007-8-1到2007-12-31日
  569. //星期1到5允许在7:30-12:30, 13:30-17:30, 19:00-21:00通过, 其他时间不允许
  570. CString timeseg;
  571. timeseg = "";
  572. bstrT = wudp->NumToStrHex(0x1F, 1);
  573. timeseg = timeseg + CString(bstrT) ; //星期控制
  574. bstrT = wudp->NumToStrHex(0x00, 1);
  575. timeseg = timeseg + CString(bstrT) ; // 下一链接时段(0--表示无)
  576. bstrT = wudp->NumToStrHex(0x00, 2);
  577. timeseg = timeseg + CString(bstrT) ; // 保留2字节(0填充)
  578. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("7:30:00"));
  579. timeseg = timeseg + CString(bstrT) ; // 起始时分秒1
  580. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("12:30:00"));
  581. timeseg = timeseg + CString(bstrT) ; // 终止时分秒1
  582. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("13:30:00"));
  583. timeseg = timeseg + CString(bstrT) ; // 起始时分秒2
  584. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("17:30:00"));
  585. timeseg = timeseg + CString(bstrT) ; // 终止时分秒2
  586. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("19:00:00"));
  587. timeseg = timeseg + CString(bstrT) ; // 起始时分秒3
  588. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("21:00:00"));
  589. timeseg = timeseg + CString(bstrT) ; // 终止时分秒3
  590. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-1"));
  591. timeseg = timeseg + CString(bstrT) ; // 起始日期
  592. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-12-31"));
  593. timeseg = timeseg + CString(bstrT) ; // 终止日期
  594. bstrT = wudp->NumToStrHex(0x00, 4);
  595. timeseg = timeseg + CString(bstrT) ; // 保留4字节(0填充)
  596. if (lstrlen(timeseg) != (24 * 2))
  597. {
  598. //生成的时段不符合要求, 请查一下上一指令中写入的每个参数是否正确
  599. strInfo = strInfo + char(13) + char(10) + "生成的时段不符合要求: 修改时段失败" ;
  600. }
  601. while( true )
  602. {
  603. bstrT = wudp->NumToStrHex(2, 2) ; //时段索引号2
  604. strTemp = "9710" + CString(bstrT) + timeseg;
  605. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  606. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  607. wserial -> get_ErrCode((long*)&lngRetSerial);
  608. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  609. {
  610. strInfo = strInfo + char(13) + char(10) + "添加时段失败" ;
  611. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  612. {
  613. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  614. break;
  615. }
  616. }
  617. else
  618. {
  619. pThread->m_nErrorNum = 0;
  620. strInfo = strInfo + char(13) + char(10) + "添加时段成功" ;
  621. break;
  622. }
  623. }
  624. //完成把标志赋为实时监控
  625. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  626. }
  627. //实时监控
  628. // 读取运行状态是实现监控的关键指令。 在进行监控时, 先读取最新记录索引位的记录. 读取到最新的记录, 同时可以获取到刷卡记录数。
  629. // 这时就可以用读取到刷卡记录数加1填充到要读取的最新记录索引位上,去读取运行状态, 以便获取下一个记录。
  630. // 如果读取到了新的刷卡记录, 就可以将索引位增1, 否则保持索引位不变。 这样就可以实现数据的实时监控。
  631. // 遇到通信不上的处理,这时可对串口通信采取超时400-500毫秒作为出错,可重试一次,再接收不到数据, 可认为设备与PC机间的不能通信。
  632. __int64 watchIndex;
  633. long recCnt;
  634. watchIndex = 0 ; //缺省从0, 表示先提取最近一个记录
  635. recCnt = 0 ; //监控记录计数
  636. while( pThread->m_Controller.nOperterType==OPERATE_Moniter )
  637. {
  638. //读取在线信息
  639. DWORD dwTicks = GetTickCount() - pThread->m_dwGetDoorStatusTicks;
  640. if( dwTicks>=READ_DOORSTATUS_TIMESPACE )
  641. {
  642. bstrT = BSTR(L"811000000000");
  643. bstrCmd = wudp -> CreateBstrCommand(controllerSN, bstrT); //生成指令帧
  644. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  645. wserial -> get_ErrCode((long*)&lngRetSerial);
  646. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  647. {
  648. }
  649. else
  650. {
  651. int INDEX=0;
  652. __int64 lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 1);
  653. INDEX = 1;
  654. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  655. {
  656. pThread->m_nDoorStatus[INDEX] = lngRet;
  657. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  658. }
  659. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  660. {
  661. pThread->m_nDoorStatus[INDEX] = lngRet;
  662. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  663. }
  664. if( pThread->m_Controller.nDoorCount>1 )
  665. {
  666. lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 2);
  667. INDEX = 2;
  668. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  669. {
  670. pThread->m_nDoorStatus[INDEX] = lngRet;
  671. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  672. }
  673. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  674. {
  675. pThread->m_nDoorStatus[INDEX] = lngRet;
  676. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  677. }
  678. }
  679. if( pThread->m_Controller.nDoorCount>2 )
  680. {
  681. lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 3);
  682. INDEX = 3;
  683. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  684. {
  685. pThread->m_nDoorStatus[INDEX] = lngRet;
  686. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  687. }
  688. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  689. {
  690. pThread->m_nDoorStatus[INDEX] = lngRet;
  691. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  692. }
  693. lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 4);
  694. INDEX = 4;
  695. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  696. {
  697. pThread->m_nDoorStatus[INDEX] = lngRet;
  698. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  699. }
  700. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  701. {
  702. pThread->m_nDoorStatus[INDEX] = lngRet;
  703. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  704. }
  705. }
  706. }
  707. pThread->m_dwGetDoorStatusTicks = GetTickCount();
  708. }
  709. bstrT = wudp->NumToStrHex(watchIndex, 3) ; //表示第watchIndex个记录, 如果是0则取最新一条记录
  710. strTemp = "8110" + CString(bstrT);
  711. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  712. wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
  713. wserial -> get_ErrCode((long*)&lngRetSerial);
  714. if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
  715. {
  716. strInfo = strInfo + char(13) + char(10) + "实时监控失败" ;
  717. }
  718. else
  719. {
  720. pThread->m_nErrorNum = 0;
  721. bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
  722. if (CString(bstrSwipeDate) != "" )
  723. {
  724. int nIndex=0;
  725. CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  726. g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
  727. CString sTime,sCardID,sInfo,s;
  728. sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
  729. pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
  730. sCardID.Format( "%ld",cardId );
  731. if( sUserName!="" && sClass!="" && sJobNumber!="" )
  732. sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
  733. else if( sUserName!="" && sClass!="" )
  734. sUserName.Format( "%s( %s ) ",sUserName,sClass );
  735. else if( sUserName!="" && sJobNumber!="" )
  736. sUserName.Format( "%s( %s ) ",sUserName,sJobNumber );
  737. sTime.Format("%s",CString(bstrSwipeDate) );
  738. sDoorName = sInOut+sDoorName;
  739. recIndex = recIndex + 1; //下一条记录
  740. if (watchIndex == 0) //如果收到第一条记录
  741. {
  742. watchIndex = wudp->GetCardRecordCountFromRunInfo(bstrFrame);
  743. watchIndex = watchIndex + 1; //指向(总记录数+1), 也就是下次刷卡的存储索引位
  744. }
  745. else
  746. {
  747. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "+sUserName," "+sDoorName," "+sInfo );
  748. watchIndex = watchIndex + 1 ; //指向下一个记录位
  749. }
  750. recCnt = recCnt + 1; //记录计数 }
  751. // pBoxOne->LineScroll(pBoxOne->GetLineCount()); //显示最后一行
  752. }
  753. }
  754. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
  755. { //响应其他事件 如Exit按钮操作
  756. ::TranslateMessage (&message);
  757. ::DispatchMessage (&message);
  758. }
  759. Sleep( 1000 );
  760. }
  761. if( pThread->m_Controller.nOperterType==OPERATE_NULL )
  762. {
  763. wudp -> Release();
  764. wserial->Release();
  765. CoUninitialize();
  766. SysFreeString(bstrComPort);
  767. SetEvent( pThread->m_hRunObject );
  768. pThread->m_bExitFinish = true;
  769. break;
  770. }
  771. }//while( 1 );//( WaitForSingleObject(pThread->m_hRunObject, 200L) == WAIT_TIMEOUT );
  772. return 0;
  773. }
  774. DWORD WINAPI CThread_Controller::Thread_WG_TCP( CThread_Controller *pThread )
  775. {
  776. MSG message;
  777. CString strTemp,sTemp;
  778. CString strNewIPAddr;
  779. CString strInfo;
  780. HRESULT hr;
  781. // Now we will intilize COM
  782. hr = CoInitialize(0);
  783. if (!SUCCEEDED(hr))
  784. {
  785. ::MessageBox (NULL,(LPCTSTR)(g_strInitComFail),"",0);
  786. return -1; //出错
  787. }
  788. __int64 lngRet;
  789. BSTR bstrT; //中间变量
  790. BSTR bstrFrame; //通信返回的数据
  791. BSTR bstrCmd; //发送的指令帧
  792. long controllerSN; //控制器序列号
  793. //刷卡记录变量
  794. __int64 cardId; //卡号
  795. __int64 status; //状态
  796. BSTR bstrSwipeDate; //日期时间
  797. CString strRunDetail; //运行信息
  798. BSTR strIPAddr; //IP地址
  799. CString strMac; //MAC地址
  800. CString strHexNewIP; //New IP (十六进制)
  801. CString strHexMask; //掩码(十六进制)
  802. CString strHexGateway; //网关(十六进制)
  803. long startLoc; //字符串的起始位置
  804. IWCOMM_OPERATEPtr wudp(__uuidof(WComm_Operate)); //创建UDP 通信对象
  805. //((CWnd*)GetDlgItem(IDC_EDITSN))->GetWindowText(strTemp);
  806. controllerSN = _ttol((LPCTSTR)pThread->m_Controller.sSN ); //测试使用的控制器
  807. strIPAddr = pThread->m_Controller.sIP.AllocSysString(); //BSTR(L""); //一开始为空, 表示广播包方式
  808. //strTemp.Format("%d",controllerSN);
  809. if( pThread->m_Controller.sPort=="" )
  810. pThread->m_Controller.sPort = "60000";
  811. //读取运行状态信息(1081)
  812. while( true )
  813. {
  814. bstrT = BSTR(L"811000000000");
  815. bstrCmd = wudp->CreateBstrCommand(controllerSN, bstrT); //生成指令帧
  816. bstrFrame = wudp->udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort) ); //发送指令, 并获取返回信息
  817. if (( ERROR_SUCCESS != wudp->ErrCode)||(CString(bstrFrame)=="" ) )
  818. {
  819. //if( pThread->m_nErrorNum++>1 )
  820. {
  821. CString s;
  822. s.Format( "连接【%s,%s】失败,错误码=%d",pThread->m_Controller.sIP,pThread->m_Controller.sPort,wudp->ErrCode );
  823. WriteLog( s );
  824. pThread->m_bExitFinish = true;
  825. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
  826. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
  827. return 0;
  828. }
  829. }
  830. else
  831. break;
  832. }
  833. pThread->m_nErrorNum = 0;
  834. pThread->m_bExitFinish = false;
  835. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
  836. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
  837. while( 1 )
  838. {
  839. //设置门控制参数(在线/延时)[108F]
  840. while( pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
  841. {
  842. for( int i=1;i<5;i++ )
  843. {
  844. if( pThread->m_Controller.bDoorIsSet[i] )
  845. {
  846. int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
  847. int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
  848. CString s;
  849. s.Format( "8F10%02d%02d",i,nDoorControlType );
  850. bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
  851. s += CString(bstrT);
  852. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  853. bstrFrame = wudp->udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
  854. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  855. {
  856. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  857. {
  858. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  859. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
  860. break;
  861. }
  862. }
  863. else
  864. {
  865. pThread->m_nErrorNum = 0;
  866. //完成把标志赋为实时监控
  867. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  868. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
  869. break;
  870. }
  871. break;
  872. }
  873. }
  874. }
  875. //校准控制器时间
  876. while( pThread->m_Controller.nOperterType==OPERATE_JustTime )
  877. {
  878. bstrCmd = wudp -> CreateBstrCommandOfAdjustClockByPCTime(controllerSN); //生成指令帧
  879. bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
  880. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  881. {
  882. strInfo = strInfo + char(13) + char(10) + "校准控制器时间出错" ;
  883. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  884. {
  885. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  886. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
  887. break;
  888. }
  889. }
  890. else
  891. {
  892. pThread->m_nErrorNum=0;
  893. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  894. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
  895. break;
  896. }
  897. }
  898. //远程开门
  899. while( pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
  900. {
  901. for( int i=1;i<5;i++ )
  902. {
  903. if( pThread->m_Controller.bDoorIsSet[i] )
  904. {
  905. CString s;
  906. s.Format("9D10%02d",i );
  907. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  908. bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
  909. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  910. {
  911. strInfo = strInfo + char(13) + char(10) + "远程开门失败" ;
  912. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  913. {
  914. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  915. pThread->m_Controller.bDoorIsSet[i] = false;
  916. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
  917. break;
  918. }
  919. }
  920. else
  921. {
  922. pThread->m_nErrorNum = 0;
  923. //完成把标志赋为实时监控
  924. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  925. pThread->m_Controller.bDoorIsSet[i] = false;
  926. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
  927. break;
  928. }
  929. break;
  930. }
  931. }
  932. }
  933. //提取记录
  934. long recIndex;
  935. recIndex = 1;
  936. while( pThread->m_Controller.nOperterType==OPERATE_Record )
  937. {
  938. bstrT = wudp->NumToStrHex(recIndex, 4);
  939. strTemp = "8D10" + CString(bstrT);
  940. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  941. bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
  942. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  943. {
  944. strInfo = strInfo + char(13) + char(10) + "提取记录出错" ;
  945. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  946. {
  947. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  948. break;
  949. }
  950. }
  951. else
  952. {
  953. pThread->m_nErrorNum=0;
  954. bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
  955. if (CString((bstrSwipeDate)) != "" )
  956. {
  957. int nIndex=0;
  958. CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  959. g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
  960. CString sTime,sCardID,sInfo,s;
  961. sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
  962. pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
  963. sTime.Format("%s",CString(bstrSwipeDate) );
  964. sCardID.Format( "%ld",cardId );
  965. if( sUserName!="" )
  966. sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
  967. sDoorName = sInOut+sDoorName;
  968. //ADOCtrl.InsertRecord( sTime,sCardID,sUserName,sDoorName,sInfo );
  969. recIndex = recIndex + 1; //下一条记录
  970. }
  971. else
  972. {
  973. strTemp.Format("%ld", (recIndex-1));
  974. strInfo = strInfo + char(13) + char(10) + "提取记录完成. 总共提取记录数 =" + strTemp;
  975. if (recIndex > 1) //只有提取了记录才进行删除
  976. {
  977. while( true )
  978. {
  979. bstrT = wudp->NumToStrHex(recIndex-1, 4);
  980. strTemp = "8E10" + CString(bstrT);
  981. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  982. bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
  983. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)==""))
  984. {
  985. strInfo = strInfo + char(13) + char(10) + "删除记录失败" ;
  986. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  987. {
  988. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  989. break;
  990. }
  991. }
  992. else
  993. {
  994. pThread->m_nErrorNum = 0;
  995. strInfo = strInfo + char(13) + char(10) + "删除记录成功";
  996. break;
  997. }
  998. }
  999. }
  1000. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1001. }
  1002. }
  1003. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
  1004. ::TranslateMessage (&message);
  1005. ::DispatchMessage (&message);
  1006. }
  1007. }
  1008. //发送权限操作
  1009. if( pThread->m_Controller.nOperterType==OPERATE_Permit )
  1010. {
  1011. //获取权限个数
  1012. strTemp.Format("%ld",wudp->GetPrivilegeNumFromRunInfo(bstrFrame) );
  1013. strRunDetail = strRunDetail + char(13) + char(10) + "权限数: " + char(9) + strTemp;
  1014. #if 1
  1015. long privilegeIndex = 1;
  1016. CString privilege;
  1017. for( int nDoorIndex=1;nDoorIndex<5;nDoorIndex++ )
  1018. {
  1019. if( pThread->m_Controller.Card2Door[nDoorIndex].nCardCount>0 )
  1020. {
  1021. for( int nCardIndex=0;nCardIndex<pThread->m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
  1022. {
  1023. long cardno = pThread->m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
  1024. privilege = "";
  1025. bstrT = wudp->CardToStrHex(cardno);
  1026. privilege = privilege + CString(bstrT); //卡号
  1027. bstrT = wudp->NumToStrHex(nDoorIndex, 1);
  1028. privilege = privilege + CString(bstrT) ; //门号
  1029. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-14")) ;//有效起始日期
  1030. privilege = privilege + CString(bstrT);
  1031. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2020-12-31"));//有效截止日期
  1032. privilege = privilege + CString(bstrT) ;
  1033. bstrT = wudp->NumToStrHex(1, 1) ; //时段索引号
  1034. privilege = privilege + CString(bstrT) ;
  1035. bstrT = wudp->NumToStrHex(123456, 3) ; //用户密码
  1036. privilege = privilege + CString(bstrT) ;
  1037. bstrT = wudp->NumToStrHex(0, 4) ; //备用4字节(用0填充)
  1038. privilege = privilege + CString(bstrT) ;
  1039. if (lstrlen(privilege) != (16 * 2))
  1040. {
  1041. //生成的权限不符合要求, 请查一下上一指令中写入的每个参数是否正确
  1042. strInfo = strInfo + char(13) + char(10) + "生成的权限不符合要求: 添加权限失败" ;
  1043. }
  1044. while( true )
  1045. {
  1046. bstrT = wudp->NumToStrHex(0, 2) ; //权限索引号 不是清空再添加时为空
  1047. strTemp = "0711" + CString(bstrT) + privilege;
  1048. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1049. bstrFrame =( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
  1050. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1051. {
  1052. strInfo = strInfo + char(13) + char(10) + "添加权限失败" ;
  1053. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1054. {
  1055. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1056. break;
  1057. }
  1058. }
  1059. else
  1060. {
  1061. pThread->m_nErrorNum=0;
  1062. privilegeIndex = privilegeIndex + 1;
  1063. break;
  1064. }
  1065. }
  1066. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
  1067. { //响应其他事件 如Exit按钮操作
  1068. ::TranslateMessage (&message);
  1069. ::DispatchMessage (&message);
  1070. }
  1071. }
  1072. }
  1073. }
  1074. CString timeseg;
  1075. timeseg = "";
  1076. bstrT = wudp->NumToStrHex(0x1F, 1);
  1077. timeseg = timeseg + CString(bstrT) ; //星期控制
  1078. bstrT = wudp->NumToStrHex(0x00, 1);
  1079. timeseg = timeseg + CString(bstrT) ; // 下一链接时段(0--表示无)
  1080. bstrT = wudp->NumToStrHex(0x00, 2);
  1081. timeseg = timeseg + CString(bstrT) ; // 保留2字节(0填充)
  1082. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("7:30:00"));
  1083. timeseg = timeseg + CString(bstrT) ; // 起始时分秒1
  1084. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("12:30:00"));
  1085. timeseg = timeseg + CString(bstrT) ; // 终止时分秒1
  1086. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("13:30:00"));
  1087. timeseg = timeseg + CString(bstrT) ; // 起始时分秒2
  1088. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("17:30:00"));
  1089. timeseg = timeseg + CString(bstrT) ; // 终止时分秒2
  1090. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("19:00:00"));
  1091. timeseg = timeseg + CString(bstrT) ; // 起始时分秒3
  1092. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("21:00:00"));
  1093. timeseg = timeseg + CString(bstrT) ; // 终止时分秒3
  1094. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-1"));
  1095. timeseg = timeseg + CString(bstrT) ; // 起始日期
  1096. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-12-31"));
  1097. timeseg = timeseg + CString(bstrT) ; // 终止日期
  1098. bstrT = wudp->NumToStrHex(0x00, 4);
  1099. timeseg = timeseg + CString(bstrT) ; // 保留4字节(0填充)
  1100. if (lstrlen(timeseg) != (24 * 2))
  1101. {
  1102. //生成的时段不符合要求, 请查一下上一指令中写入的每个参数是否正确
  1103. strInfo = strInfo + char(13) + char(10) + "生成的时段不符合要求: 修改时段失败" ;
  1104. }
  1105. while( true )
  1106. {
  1107. bstrT = wudp->NumToStrHex(2, 2) ; //时段索引号2
  1108. strTemp = "9710" + CString(bstrT) + timeseg;
  1109. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1110. bstrFrame = ( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
  1111. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ))
  1112. {
  1113. strInfo = strInfo + char(13) + char(10) + "添加时段失败" ;
  1114. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1115. {
  1116. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1117. break;
  1118. }
  1119. }
  1120. else
  1121. {
  1122. pThread->m_nErrorNum = 0;
  1123. strInfo = strInfo + char(13) + char(10) + "添加时段成功" ;
  1124. break;
  1125. }
  1126. }
  1127. #else
  1128. //先清空权限
  1129. while( true )
  1130. {
  1131. bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR("9310")) ; //生成指令帧
  1132. bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
  1133. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1134. {
  1135. strInfo = strInfo + char(13) + char(10) + "清空权限失败" ;
  1136. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1137. {
  1138. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1139. break;
  1140. }
  1141. }
  1142. else
  1143. {
  1144. pThread->m_nErrorNum = 0;
  1145. strInfo = strInfo + char(13) + char(10) + "清空权限成功" ;
  1146. break;
  1147. }
  1148. }
  1149. //发送权限操作(2.再添加权限)
  1150. //权限格式: 卡号(2)+区号(1)+门号(1)+卡起始年月日(2)+卡截止年月日(2)+ 控制时段索引号(1)+密码(3)+备用(4,用0填充)
  1151. //发送权限按: 先发1号门(卡号小的先发), 再发2号门(卡号小的先发)
  1152. //此案例中权限设为: 卡有效期从(2007-8-14 到2020-12-31), 采用默认时段1(任意时间有效), 缺省密码(1234), 备用值以00填充
  1153. //以三个卡: 07217564 [9C4448],342681[B9A603],25409969[F126FE]为例,分别可以通过控制器的2个门。
  1154. //实际使用按需修改
  1155. //!!!!!!!注意: 此处卡号已直接按从小到大排列赋值了. 实际使用中要用算法实现排序
  1156. long privilegeIndex = 1;
  1157. CString privilege;
  1158. for( int nDoorIndex=1;nDoorIndex<5;nDoorIndex++ )
  1159. {
  1160. if( pThread->m_Controller.Card2Door[nDoorIndex].nCardCount>0 )
  1161. {
  1162. for( int nCardIndex=0;nCardIndex<pThread->m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
  1163. {
  1164. long cardno = pThread->m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
  1165. privilege = "";
  1166. bstrT = wudp->CardToStrHex(cardno);
  1167. privilege = privilege + CString(bstrT); //卡号
  1168. bstrT = wudp->NumToStrHex(nDoorIndex, 1);
  1169. privilege = privilege + CString(bstrT) ; //门号
  1170. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-14")) ;//有效起始日期
  1171. privilege = privilege + CString(bstrT);
  1172. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2020-12-31"));//有效截止日期
  1173. privilege = privilege + CString(bstrT) ;
  1174. bstrT = wudp->NumToStrHex(1, 1) ; //时段索引号
  1175. privilege = privilege + CString(bstrT) ;
  1176. bstrT = wudp->NumToStrHex(123456, 3) ; //用户密码
  1177. privilege = privilege + CString(bstrT) ;
  1178. bstrT = wudp->NumToStrHex(0, 4) ; //备用4字节(用0填充)
  1179. privilege = privilege + CString(bstrT) ;
  1180. if (lstrlen(privilege) != (16 * 2))
  1181. {
  1182. //生成的权限不符合要求, 请查一下上一指令中写入的每个参数是否正确
  1183. strInfo = strInfo + char(13) + char(10) + "生成的权限不符合要求: 添加权限失败" ;
  1184. }
  1185. while( true )
  1186. {
  1187. bstrT = wudp->NumToStrHex(privilegeIndex, 2) ; //权限索引号
  1188. strTemp = "9B10" + CString(bstrT) + privilege;
  1189. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1190. bstrFrame =( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
  1191. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1192. {
  1193. strInfo = strInfo + char(13) + char(10) + "添加权限失败" ;
  1194. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1195. {
  1196. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1197. break;
  1198. }
  1199. }
  1200. else
  1201. {
  1202. pThread->m_nErrorNum=0;
  1203. privilegeIndex = privilegeIndex + 1;
  1204. break;
  1205. }
  1206. }
  1207. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
  1208. { //响应其他事件 如Exit按钮操作
  1209. ::TranslateMessage (&message);
  1210. ::DispatchMessage (&message);
  1211. }
  1212. }
  1213. }
  1214. }
  1215. CString timeseg;
  1216. timeseg = "";
  1217. bstrT = wudp->NumToStrHex(0x1F, 1);
  1218. timeseg = timeseg + CString(bstrT) ; //星期控制
  1219. bstrT = wudp->NumToStrHex(0x00, 1);
  1220. timeseg = timeseg + CString(bstrT) ; // 下一链接时段(0--表示无)
  1221. bstrT = wudp->NumToStrHex(0x00, 2);
  1222. timeseg = timeseg + CString(bstrT) ; // 保留2字节(0填充)
  1223. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("7:30:00"));
  1224. timeseg = timeseg + CString(bstrT) ; // 起始时分秒1
  1225. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("12:30:00"));
  1226. timeseg = timeseg + CString(bstrT) ; // 终止时分秒1
  1227. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("13:30:00"));
  1228. timeseg = timeseg + CString(bstrT) ; // 起始时分秒2
  1229. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("17:30:00"));
  1230. timeseg = timeseg + CString(bstrT) ; // 终止时分秒2
  1231. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("19:00:00"));
  1232. timeseg = timeseg + CString(bstrT) ; // 起始时分秒3
  1233. bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("21:00:00"));
  1234. timeseg = timeseg + CString(bstrT) ; // 终止时分秒3
  1235. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-1"));
  1236. timeseg = timeseg + CString(bstrT) ; // 起始日期
  1237. bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-12-31"));
  1238. timeseg = timeseg + CString(bstrT) ; // 终止日期
  1239. bstrT = wudp->NumToStrHex(0x00, 4);
  1240. timeseg = timeseg + CString(bstrT) ; // 保留4字节(0填充)
  1241. if (lstrlen(timeseg) != (24 * 2))
  1242. {
  1243. //生成的时段不符合要求, 请查一下上一指令中写入的每个参数是否正确
  1244. strInfo = strInfo + char(13) + char(10) + "生成的时段不符合要求: 修改时段失败" ;
  1245. }
  1246. while( true )
  1247. {
  1248. bstrT = wudp->NumToStrHex(2, 2) ; //时段索引号2
  1249. strTemp = "9710" + CString(bstrT) + timeseg;
  1250. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1251. bstrFrame = ( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
  1252. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ))
  1253. {
  1254. strInfo = strInfo + char(13) + char(10) + "添加时段失败" ;
  1255. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1256. {
  1257. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1258. break;
  1259. }
  1260. }
  1261. else
  1262. {
  1263. pThread->m_nErrorNum = 0;
  1264. strInfo = strInfo + char(13) + char(10) + "添加时段成功" ;
  1265. break;
  1266. }
  1267. }
  1268. #endif
  1269. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1270. }
  1271. //实时监控
  1272. // 读取运行状态是实现监控的关键指令。 在进行监控时, 先读取最新记录索引位的记录. 读取到最新的记录, 同时可以获取到刷卡记录数。
  1273. // 这时就可以用读取到刷卡记录数加1填充到要读取的最新记录索引位上,去读取运行状态, 以便获取下一个记录。
  1274. // 如果读取到了新的刷卡记录, 就可以将索引位增1, 否则保持索引位不变。 这样就可以实现数据的实时监控。
  1275. // 遇到通信不上的处理,这时可对串口通信采取超时400-500毫秒作为出错,可重试一次,再接收不到数据, 可认为设备与PC机间的不能通信。
  1276. __int64 watchIndex;
  1277. long recCnt;
  1278. watchIndex = 0 ; //缺省从0, 表示先提取最近一个记录
  1279. recCnt = 0 ; //监控记录计数
  1280. while( pThread->m_Controller.nOperterType==OPERATE_Moniter )
  1281. {
  1282. DWORD dwTicks = GetTickCount() - pThread->m_dwGetDoorStatusTicks;
  1283. if( dwTicks>=READ_DOORSTATUS_TIMESPACE )
  1284. {
  1285. bstrT = BSTR(L"811000000000");
  1286. bstrCmd = wudp -> CreateBstrCommand(controllerSN, bstrT); //生成指令帧
  1287. //strIPAddr = BSTR(L"");
  1288. bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort) ); //发送指令, 并获取返回信息
  1289. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1290. {
  1291. }
  1292. else
  1293. {
  1294. int INDEX=0;
  1295. __int64 lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 1);
  1296. INDEX = 1;
  1297. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  1298. {
  1299. pThread->m_nDoorStatus[INDEX] = lngRet;
  1300. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  1301. }
  1302. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  1303. {
  1304. pThread->m_nDoorStatus[INDEX] = lngRet;
  1305. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  1306. }
  1307. if( pThread->m_Controller.nDoorCount>1 )
  1308. {
  1309. lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 2);
  1310. INDEX = 2;
  1311. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  1312. {
  1313. pThread->m_nDoorStatus[INDEX] = lngRet;
  1314. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  1315. }
  1316. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  1317. {
  1318. pThread->m_nDoorStatus[INDEX] = lngRet;
  1319. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  1320. }
  1321. }
  1322. if( pThread->m_Controller.nDoorCount>2 )
  1323. {
  1324. lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 3);
  1325. INDEX = 3;
  1326. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  1327. {
  1328. pThread->m_nDoorStatus[INDEX] = lngRet;
  1329. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  1330. }
  1331. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  1332. {
  1333. pThread->m_nDoorStatus[INDEX] = lngRet;
  1334. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  1335. }
  1336. lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 4);
  1337. INDEX = 4;
  1338. if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
  1339. {
  1340. pThread->m_nDoorStatus[INDEX] = lngRet;
  1341. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
  1342. }
  1343. else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
  1344. {
  1345. pThread->m_nDoorStatus[INDEX] = lngRet;
  1346. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
  1347. }
  1348. }
  1349. }
  1350. pThread->m_dwGetDoorStatusTicks = GetTickCount();
  1351. }
  1352. //strTemp = "8110" + g_ReturnStr( watchIndex,6 );
  1353. //bstrT = sTemp.AllocSysString();
  1354. bstrT = wudp->NumToStrHex(watchIndex, 3) ; //表示第watchIndex个记录, 如果是0则取最新一条记录
  1355. strTemp = "8110" + CString(bstrT);
  1356. bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1357. bstrFrame =( wudp->udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
  1358. if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1359. {
  1360. }
  1361. else
  1362. {
  1363. pThread->m_nErrorNum=0;
  1364. bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
  1365. if (CString(bstrSwipeDate) != "" )
  1366. {
  1367. int nIndex=0;
  1368. CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  1369. g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
  1370. CString sTime,sCardID,sInfo,s;
  1371. sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
  1372. pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
  1373. sCardID.Format( "%ld",cardId );
  1374. if( sUserName!="" && sClass!="" && sJobNumber!="" )
  1375. sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
  1376. else if( sUserName!="" && sClass!="" )
  1377. sUserName.Format( "%s( %s ) ",sUserName,sClass );
  1378. else if( sUserName!="" && sJobNumber!="" )
  1379. sUserName.Format( "%s( %s ) ",sUserName,sJobNumber );
  1380. sTime.Format("%s",CString(bstrSwipeDate) );
  1381. sDoorName = sInOut+sDoorName;
  1382. recIndex = recIndex + 1; //下一条记录
  1383. if (watchIndex == 0) //如果收到第一条记录
  1384. {
  1385. watchIndex = wudp->GetCardRecordCountFromRunInfo(bstrFrame);
  1386. watchIndex = watchIndex + 1; //指向(总记录数+1), 也就是下次刷卡的存储索引位
  1387. }
  1388. else
  1389. {
  1390. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "+sUserName," "+sDoorName," "+sInfo );
  1391. watchIndex = watchIndex + 1 ; //指向下一个记录位
  1392. }
  1393. recCnt = recCnt + 1; //记录计数 }
  1394. }
  1395. }
  1396. if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
  1397. ::TranslateMessage (&message);
  1398. ::DispatchMessage (&message);
  1399. }
  1400. Sleep( 1000 );
  1401. }
  1402. if( pThread->m_Controller.nOperterType==OPERATE_NULL )
  1403. {
  1404. CoUninitialize();
  1405. SysFreeString(strIPAddr);
  1406. wudp->Release();
  1407. SetEvent( pThread->m_hRunObject );
  1408. pThread->m_bExitFinish = true;
  1409. break;
  1410. }
  1411. }//while( 1 );//( WaitForSingleObject(pThread->m_hRunObject, 200L) == WAIT_TIMEOUT );
  1412. return 0;
  1413. }
  1414. DWORD WINAPI CThread_Controller::Thread_JK( CThread_Controller *pThread )
  1415. {
  1416. CString strTemp;
  1417. CString strNewIPAddr;
  1418. CString strInfo;
  1419. bool bRet=false;
  1420. //WriteLog( "Thread_TCP" );
  1421. while( true )
  1422. {
  1423. bRet = pThread->JK_ConnetController( pThread->m_Controller.nWordMode,pThread->m_Controller.sIP,pThread->m_Controller.nComPort,pThread->m_Controller.ComPort );
  1424. if( !bRet )
  1425. {
  1426. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1427. {
  1428. pThread->m_bExitFinish = true;
  1429. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
  1430. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
  1431. WriteLog("JK_ConnetController fail");
  1432. return 0;
  1433. }
  1434. }
  1435. else
  1436. {
  1437. pThread->m_Controller.LineID = 0;//g_nControllerOpenCount;
  1438. g_nControllerOpenCount++;
  1439. break;
  1440. }
  1441. }
  1442. pThread->m_nErrorNum = 0;
  1443. while( !g_bOK )
  1444. {
  1445. Sleep( 100 );
  1446. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1447. {
  1448. pThread->m_bExitFinish = true;
  1449. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
  1450. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
  1451. WriteLog("g_bOK=false");
  1452. return 0;
  1453. }
  1454. }
  1455. if( pThread->JK_IsOnline( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID ) )
  1456. {
  1457. pThread->m_nErrorNum = 0;
  1458. pThread->m_bExitFinish = false;
  1459. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
  1460. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
  1461. g_bIsInsertReconnectInfo = false;
  1462. WriteLog("JK_IsOnline ok");
  1463. }
  1464. else
  1465. {
  1466. pThread->m_bExitFinish = true;
  1467. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
  1468. g_bIsInsertReconnectInfo = true;
  1469. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
  1470. WriteLog("JK_IsOnline fail");
  1471. return 0;
  1472. }
  1473. do
  1474. {
  1475. // //设置门控制参数(在线/延时)[108F]
  1476. // while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
  1477. // {
  1478. // for( int i=1;i<5;i++ )
  1479. // {
  1480. // if( pThread->m_Controller.bDoorIsSet[i] )
  1481. // {
  1482. // int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
  1483. // int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
  1484. //
  1485. // CString s;
  1486. // s.Format( "8F10%02d%02d",i,nDoorControlType );
  1487. // bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
  1488. // s += CString(bstrT);
  1489. // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  1490. // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
  1491. // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1492. // {
  1493. // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1494. // {
  1495. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1496. // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
  1497. // break;
  1498. // }
  1499. // }
  1500. // else
  1501. // {
  1502. // pThread->m_nErrorNum = 0;
  1503. // //完成把标志赋为实时监控
  1504. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1505. // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
  1506. // break;
  1507. // }
  1508. //
  1509. // break;
  1510. // }
  1511. // }
  1512. // }
  1513. //校准控制器时间
  1514. while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_JustTime )
  1515. {
  1516. bRet = pThread->JK_AdjustTime( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
  1517. if( !bRet )
  1518. {
  1519. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1520. {
  1521. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1522. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
  1523. break;
  1524. }
  1525. }
  1526. else
  1527. {
  1528. pThread->m_nErrorNum=0;
  1529. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1530. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
  1531. break;
  1532. }
  1533. }
  1534. //
  1535. // //远程开门
  1536. // while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
  1537. // {
  1538. // for( int i=1;i<5;i++ )
  1539. // {
  1540. // if( pThread->m_Controller.bDoorIsSet[i] )
  1541. // {
  1542. // CString s;
  1543. // s.Format("9D10%02d",i );
  1544. // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  1545. // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
  1546. // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1547. // {
  1548. // strInfo = strInfo + char(13) + char(10) + "远程开门失败" ;
  1549. // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1550. // {
  1551. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1552. // pThread->m_Controller.bDoorIsSet[i] = false;
  1553. // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
  1554. // break;
  1555. // }
  1556. // }
  1557. // else
  1558. // {
  1559. // pThread->m_nErrorNum = 0;
  1560. // //完成把标志赋为实时监控
  1561. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1562. // pThread->m_Controller.bDoorIsSet[i] = false;
  1563. // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
  1564. // break;
  1565. // }
  1566. //
  1567. // break;
  1568. // }
  1569. // }
  1570. // }
  1571. //
  1572. // //提取记录
  1573. // long recIndex;
  1574. // recIndex = 1;
  1575. // while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_Record )
  1576. // {
  1577. // bstrT = wudp->NumToStrHex(recIndex, 4);
  1578. // strTemp = "8D10" + CString(bstrT);
  1579. // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1580. // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
  1581. // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  1582. // {
  1583. // strInfo = strInfo + char(13) + char(10) + "提取记录出错" ;
  1584. // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1585. // {
  1586. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1587. // break;
  1588. // }
  1589. // }
  1590. // else
  1591. // {
  1592. // pThread->m_nErrorNum=0;
  1593. // bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
  1594. // if (CString((bstrSwipeDate)) != "" )
  1595. // {
  1596. // int nIndex=0;
  1597. // CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  1598. // g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
  1599. // CString sTime,sCardID,sInfo,s;
  1600. // sInfo = g_GetStatus( cardId,status,nIndex );
  1601. // pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
  1602. // sCardID.Format( "%s(%s-%s-%ld) ",sUserName,sClass,sJobNumber,cardId );
  1603. // sTime.Format("%s",CString(bstrSwipeDate) );
  1604. //
  1605. // sDoorName = sInOut+sDoorName;
  1606. //
  1607. // ADOCtrl.InsertRecord( sTime,sCardID,sDoorName,sInfo );
  1608. //
  1609. // recIndex = recIndex + 1; //下一条记录
  1610. // }
  1611. // else
  1612. // {
  1613. // strTemp.Format("%ld", (recIndex-1));
  1614. // strInfo = strInfo + char(13) + char(10) + "提取记录完成. 总共提取记录数 =" + strTemp;
  1615. //
  1616. // if (recIndex > 1) //只有提取了记录才进行删除
  1617. // {
  1618. // while( true )
  1619. // {
  1620. // bstrT = wudp->NumToStrHex(recIndex-1, 4);
  1621. // strTemp = "8E10" + CString(bstrT);
  1622. // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
  1623. // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
  1624. // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)==""))
  1625. // {
  1626. // strInfo = strInfo + char(13) + char(10) + "删除记录失败" ;
  1627. // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1628. // {
  1629. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1630. // break;
  1631. // }
  1632. // }
  1633. // else
  1634. // {
  1635. // pThread->m_nErrorNum = 0;
  1636. // strInfo = strInfo + char(13) + char(10) + "删除记录成功";
  1637. // break;
  1638. // }
  1639. // }
  1640. // }
  1641. //
  1642. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1643. // }
  1644. // }
  1645. // if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
  1646. // ::TranslateMessage (&message);
  1647. // ::DispatchMessage (&message);
  1648. // }
  1649. //
  1650. // }
  1651. //
  1652. //发送权限操作(1.先清空权限)
  1653. if( pThread->m_Controller.nOperterType==OPERATE_Permit )
  1654. {
  1655. while( true )
  1656. {
  1657. bRet = pThread->JK_DelPermit( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
  1658. if( !bRet )
  1659. {
  1660. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1661. {
  1662. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1663. break;
  1664. }
  1665. }
  1666. else
  1667. {
  1668. pThread->m_nErrorNum = 0;
  1669. break;
  1670. }
  1671. }
  1672. while( true )
  1673. {
  1674. bRet = pThread->JK_SetPermit( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
  1675. if( !bRet )
  1676. {
  1677. if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  1678. {
  1679. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1680. break;
  1681. }
  1682. }
  1683. else
  1684. {
  1685. pThread->m_nErrorNum=0;
  1686. break;
  1687. }
  1688. }
  1689. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  1690. }
  1691. //实时监控
  1692. while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_Moniter )
  1693. {
  1694. if( !pThread->m_bExitFinish )
  1695. bRet = pThread->JK_GetEvents( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
  1696. Sleep( 200 );
  1697. }
  1698. if( pThread->m_Controller.nOperterType==OPERATE_NULL )
  1699. break;
  1700. }while( WaitForSingleObject(pThread->m_hRunObject, 200L) == WAIT_TIMEOUT );
  1701. return 0;
  1702. }
  1703. bool CThread_Controller::JK_ConnetController( int iWordMode,CString sIP,long nPort,int iPort )
  1704. {
  1705. TOnConnect FOnConnect;// 声明函数指针变量
  1706. TOnDisConnect FOnDisConnect;
  1707. FOnConnect = (TOnConnect)MYOnConnect;
  1708. FOnDisConnect = (TOnDisConnect)MYOnDisConnect;
  1709. DLLFunNT_SetCallbackFun NT_SetCallbackFun = (DLLFunNT_SetCallbackFun)GetProcAddress(hACSDLL,"NT_SetCallbackFun");
  1710. if (NT_SetCallbackFun(FOnConnect, FOnDisConnect, NULL, NULL))
  1711. {
  1712. int at=0;
  1713. }
  1714. else
  1715. {
  1716. int ab=0;
  1717. }
  1718. if( iWordMode==1 )//tcp
  1719. {
  1720. if ((!hACSDLL) || (sIP == "")) return false;
  1721. DLLFunNT_OpenConnect NT_OpenConnect = (DLLFunNT_OpenConnect)GetProcAddress(hACSDLL,"NT_OpenConnect");
  1722. if (NT_OpenConnect((LPCSTR)sIP, nPort, NULL, 0))
  1723. {
  1724. //m_Mylist.InsertString(m_Mylist.GetCount(),"Connected Success");
  1725. //m_cLine.AddString(localip);
  1726. //LineType =1;
  1727. // LineID = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCount() +1;
  1728. return true;
  1729. }
  1730. else
  1731. {
  1732. return false;
  1733. }
  1734. }
  1735. else
  1736. {
  1737. if (!hACSDLL) return false;
  1738. //Get the procedure Address 取得入口地址
  1739. DllFunOpenComm OpenComm = (DllFunOpenComm)GetProcAddress(hACSDLL,"OpenComm");
  1740. if (!OpenComm) return false;
  1741. if (OpenComm(iPort))
  1742. {
  1743. return true;
  1744. }
  1745. else
  1746. {
  1747. return false;
  1748. }
  1749. }
  1750. return true;
  1751. }
  1752. bool CThread_Controller::JK_GetModel( int iWordMode,int iLineID,int iPort,int iCtrlID )
  1753. {
  1754. if (!hACSDLL) return false;
  1755. DLLFunGetModel JK_GetModel = (DLLFunGetModel)GetProcAddress(hACSDLL,"JK_GetModel");
  1756. DLLFunNT_GetModel NT_GetModel = (DLLFunNT_GetModel)GetProcAddress(hACSDLL,"NT_GetModel");
  1757. memset(&m_Controller.rModel, 0, sizeof(TModel));
  1758. int iRet;
  1759. if (0==iWordMode)//Com Communication
  1760. {
  1761. iRet = JK_GetModel(iPort, iCtrlID, &m_Controller.rModel);
  1762. }
  1763. else
  1764. {
  1765. iRet = NT_GetModel(iLineID, iCtrlID, &m_Controller.rModel);
  1766. }
  1767. if (iRet != 0)
  1768. {
  1769. CString str;
  1770. str.Format("iWordMode=%d,iLineID=%d,iCtrlID=%d NT_GetModel fail",iWordMode,iLineID,iCtrlID );
  1771. //WriteLog(str);
  1772. return false;
  1773. }
  1774. else
  1775. {
  1776. CString str;
  1777. str.Format("iWordMode=%d,iLineID=%d,iCtrlID=%d NT_GetModel OK",iWordMode,iLineID,iCtrlID );
  1778. //WriteLog(str);
  1779. }
  1780. // m_model.SetWindowText(rModel.Model);
  1781. // memset(tmp, 0, 10);
  1782. // memcpy(tmp, rModel.Version, 6);
  1783. // m_ver.SetWindowText(tmp);
  1784. //
  1785. // m_Mylist.InsertString(m_Mylist.GetCount(),"Get Model success");
  1786. //
  1787. // CString str1;
  1788. // str1.Format("model:%s",rModel.Model);
  1789. //
  1790. //// CString str ;
  1791. // str.Format(" Ver:%s",rModel.Version);
  1792. //
  1793. // m_Mylist.InsertString(m_Mylist.GetCount(), str1 + str);
  1794. //
  1795. DLLFunGetDoorCount GetDoorCount = (DLLFunGetDoorCount)GetProcAddress(hACSDLL,"GetDoorCount");
  1796. iRet = GetDoorCount(&m_Controller.rModel);
  1797. if (iRet)
  1798. {
  1799. //str.Format("%d", iRet);
  1800. //m_DoorCount.SetWindowText (str);
  1801. }
  1802. //UpdateData(true);
  1803. return true;
  1804. }
  1805. bool CThread_Controller::JK_IsOnline( int iWordMode,int iLineID,int iPort,int iCtrlID )
  1806. {
  1807. if (!hACSDLL) return false;
  1808. int iRet;
  1809. int COUNT=0;
  1810. bool f = JK_GetModel( iWordMode,iLineID,iPort,iCtrlID );
  1811. while( !f )
  1812. {
  1813. if( COUNT++>=READ_ERROR_NUM )
  1814. {
  1815. CString str;
  1816. str.Format("iWordMode=%d,iLineID=%d,iCtrlID=%d NT_GetModel fail",iWordMode,iLineID,iCtrlID );
  1817. //WriteLog(str);
  1818. return false;
  1819. }
  1820. Sleep( 100 );
  1821. f = JK_GetModel( iWordMode,iLineID,iPort,iCtrlID );
  1822. }
  1823. if (0==iWordMode)//Com Communication
  1824. {
  1825. DLLFunOnLine OnLine = (DLLFunOnLine)GetProcAddress(hACSDLL,"OnLine");
  1826. iRet = OnLine(iPort, iCtrlID);
  1827. }
  1828. else
  1829. {
  1830. DLLFunNT_OnLine NT_OnLine = (DLLFunNT_OnLine)GetProcAddress(hACSDLL,"NT_OnLine");
  1831. iRet = NT_OnLine(iLineID, iCtrlID);
  1832. }
  1833. if (iRet != GDR_OK)
  1834. {
  1835. return false;
  1836. }
  1837. return true;
  1838. }
  1839. bool CThread_Controller::JK_DisconnetController( int iWordMode,int iLineID,int iPort )
  1840. {
  1841. if( iWordMode==1 )//tcp
  1842. {
  1843. DLLFunNT_CloseConnect NT_CloseConnect = (DLLFunNT_CloseConnect)GetProcAddress(hACSDLL,"NT_CloseConnect");
  1844. if (!NT_CloseConnect) return false;
  1845. if (NT_CloseConnect(iLineID))
  1846. {
  1847. return true;
  1848. }
  1849. }
  1850. else
  1851. {
  1852. if (!hACSDLL) return false;
  1853. DLLFunCloseComm CloseComm = (DLLFunCloseComm)GetProcAddress(hACSDLL,"CloseComm");
  1854. if (!CloseComm) return false;
  1855. if (iPort>0)
  1856. {
  1857. //调用
  1858. BOOL rbool = CloseComm(iPort);
  1859. if (rbool)
  1860. {
  1861. // m_Mylist.InsertString(m_Mylist.GetCount(),"Close Success");
  1862. // CString str;
  1863. // m_Combo1.GetLBText(ComPort, str);
  1864. // int i =((CComboBox*)GetDlgItem(IDC_COMBO1))->FindString(-1, str);
  1865. // ((CComboBox*)GetDlgItem(IDC_COMBO1))->DeleteString(i);
  1866. //// for (int i=0; i<iCount; i++)
  1867. // ComPort = 0;
  1868. return true;
  1869. }
  1870. //m_Mylist.InsertString(m_Mylist.GetCount(),"Close false");
  1871. }
  1872. }
  1873. return true;
  1874. }
  1875. bool CThread_Controller::JK_AdjustTime( int iWordMode,int iLineID,int iPort,int iCtrlID )
  1876. {
  1877. int iRet;
  1878. if (!iWordMode) //Com
  1879. {
  1880. DLLFunSetTime SetTime = (DLLFunSetTime)GetProcAddress(hACSDLL,"SetTime");
  1881. iRet = SetTime(iPort, iCtrlID);
  1882. }
  1883. else// TCP/IP
  1884. {
  1885. DLLFunNT_SetTime NT_SetTime = (DLLFunNT_SetTime)GetProcAddress(hACSDLL,"NT_SetTime");
  1886. iRet = NT_SetTime(iLineID, iCtrlID);
  1887. }
  1888. if ( iRet == GDR_RECOK)
  1889. {
  1890. //m_Mylist.InsertString(m_Mylist.GetCount(),"Download system time succeed!");
  1891. return true;
  1892. }
  1893. //m_Mylist.InsertString(m_Mylist.GetCount(),"Download system time false!");
  1894. return false;
  1895. }
  1896. bool CThread_Controller::JK_SetPermit( int iWordMode,int iLineID,int iPort,int iCtrlID )
  1897. {
  1898. TGroupCard *pCard, *pNext;
  1899. WORD Offset,GroupCount=0;
  1900. int iRet , i;
  1901. DWORD TestCards[5000];
  1902. DLLFunSetCardReg SetCardReg = (DLLFunSetCardReg)GetProcAddress(hACSDLL,"SetCardReg");
  1903. DLLFunNT_SetCardReg NT_SetCardReg = (DLLFunNT_SetCardReg)GetProcAddress(hACSDLL,"NT_SetCardReg");
  1904. for( int nDoorIndex=1;nDoorIndex<2;nDoorIndex++ )
  1905. {
  1906. for( int nCardIndex=0;nCardIndex<m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
  1907. {
  1908. long cardno = m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
  1909. TestCards[GroupCount++] = cardno;
  1910. }
  1911. }
  1912. Offset = 0;
  1913. pCard = new TGroupCard[sizeof(TGroupCard) * GroupCount];
  1914. pNext = pCard;
  1915. for (i= 0 ;i< GroupCount; i++)
  1916. {
  1917. pNext->CardNumber.dwCardNo = TestCards[i];
  1918. pNext->wCardCount =1; //a group only have a card.
  1919. if (i != GroupCount - 1)
  1920. pNext->pNext = PGroupCard(DWORD(pNext) + sizeof(TGroupCard));
  1921. else
  1922. pNext->pNext =NULL;
  1923. }
  1924. if (!iWordMode)
  1925. {
  1926. iRet =SetCardReg(iPort, iCtrlID, Offset, GroupCount, pCard);
  1927. }
  1928. else
  1929. {
  1930. iRet = NT_SetCardReg(iLineID, iCtrlID, Offset, GroupCount, pCard);
  1931. }
  1932. if (iRet == GDR_RECOK )
  1933. {
  1934. //m_Mylist.InsertString(m_Mylist.GetCount(),"Set Card List success");
  1935. }
  1936. else
  1937. {
  1938. //m_Mylist.InsertString(m_Mylist.GetCount(),"Set Card List fail! ");
  1939. //return;
  1940. }
  1941. delete []pCard;
  1942. return true;
  1943. }
  1944. bool CThread_Controller::JK_DelPermit( int iWordMode,int iLineID,int iPort,int iCtrlID )
  1945. {
  1946. int iRet;
  1947. DLLFunDelCards DelCards = (DLLFunDelCards)GetProcAddress(hACSDLL,"DelCards");
  1948. DLLFunNT_DelCards NT_DelCards=(DLLFunNT_DelCards)GetProcAddress(hACSDLL,"NT_DelCards");
  1949. if (!iWordMode)
  1950. iRet = DelCards(iPort, iCtrlID, 0, CON_MAXCARD);
  1951. else
  1952. iRet = NT_DelCards(iLineID, iCtrlID, 0, CON_MAXCARD);
  1953. if (iRet == GDR_RECOK )
  1954. {
  1955. //m_Mylist.InsertString(m_Mylist.GetCount(),"Clear Card Register succeed");
  1956. }
  1957. else
  1958. {
  1959. //m_Mylist.InsertString(m_Mylist.GetCount(),"Clear Card Register fail! ");
  1960. }
  1961. return true;
  1962. }
  1963. bool CThread_Controller::JK_GetEvents( int iWordMode,int iLineID,int iPort,int iCtrlID )
  1964. {
  1965. int nRet = -1;
  1966. PEvent lpEvent, lpNext;
  1967. BYTE BagID;
  1968. BYTE EventCount;
  1969. int iRet, i;
  1970. CString stmp, sdate ,str;
  1971. WORD itmp = sizeof(TEvent)* CON_MAXEVENTCOUNTOFBAG ;
  1972. lpEvent = new TEvent[itmp];
  1973. BagID = m_Controller.SEventBagId;
  1974. EventCount = m_Controller.SEventCount;
  1975. if (!iWordMode) //Com
  1976. {
  1977. DLLFunGetEvent GetEvent = (DLLFunGetEvent)GetProcAddress(hACSDLL,"GetEvent");
  1978. iRet = GetEvent(iPort, iCtrlID, &BagID, &EventCount, lpEvent);
  1979. }
  1980. else
  1981. {
  1982. DLLFunNT_GetEvent NT_GetEvent = (DLLFunNT_GetEvent)GetProcAddress(hACSDLL,"NT_GetEvent");
  1983. iRet = NT_GetEvent(iLineID, iCtrlID, &BagID, &EventCount, lpEvent);
  1984. }
  1985. if (iRet == GDR_OK)
  1986. {
  1987. m_Controller.SEventBagId = BagID; //Save event package number for next time
  1988. m_Controller.SEventCount = EventCount; //Save event count for next time
  1989. str.Format("%d", BagID);
  1990. CString str1;
  1991. str1.Format("%d", EventCount);
  1992. //m_Mylist.InsertString(m_Mylist.GetCount(),"Bag ID: " + str + "EventCount:" + str1);
  1993. lpNext = lpEvent;
  1994. for (i=0; i<EventCount; i++)
  1995. {
  1996. if (!lpNext) break;
  1997. stmp.Format("%d",i);
  1998. int nIndex=0;
  1999. CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  2000. g_GetCardInfoByCardNumber( lpNext->CardNumber.dwCardNo,sUserName,sClass,sJobNumber,sRemarks );
  2001. CString sTime,sCardID,sInfo,s;
  2002. sInfo = g_GetStatus( m_Controller.nBrandType,lpNext->CardNumber.dwCardNo,lpNext->Code,nIndex );
  2003. GetDoorNameAndInOutInfo( lpNext->DotID,sDoorName,sInOut );
  2004. //sCardID.Format( "%s(%s-%s-%08d) ",sUserName,sClass,sJobNumber,lpNext->CardNumber.dwCardNo );
  2005. sCardID.Format( "%08d",lpNext->CardNumber.dwCardNo );
  2006. if( sUserName!="" )
  2007. sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
  2008. SYSTEMTIME st;
  2009. st = lpNext->Time;
  2010. sTime.Format("%d-%02d-%02d %02d:%02d:%02d",st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
  2011. sDoorName = sInOut+sDoorName;
  2012. if( lpNext->DotID==1 && lpNext->CardNumber.dwCardNo>100000 )
  2013. {
  2014. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "," "+sDoorName," "+sInfo );
  2015. //ADOCtrl.InsertRecord( sTime,sCardID,sUserName,sDoorName,sInfo );
  2016. }
  2017. else if( lpNext->DotID==96 && sInfo=="离开按钮开门" )
  2018. {
  2019. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "," "," "," "+sInfo );
  2020. //ADOCtrl.InsertRecord( sTime,"","","",sInfo );
  2021. }
  2022. lpNext = lpNext->pNext;
  2023. }
  2024. }
  2025. else if (iRet == GDR_UPLOADOK)
  2026. {
  2027. //m_Mylist.InsertString(m_Mylist.GetCount(),"No Data!");
  2028. m_Controller.SEventBagId = 0;
  2029. m_Controller.SEventCount = 0;
  2030. }
  2031. else
  2032. {
  2033. if( iRet==-1 )
  2034. {
  2035. if( lpEvent )
  2036. {
  2037. delete lpEvent;
  2038. lpEvent = NULL;
  2039. }
  2040. if( m_bExitThread )
  2041. m_bExitFinish = true;
  2042. else
  2043. {
  2044. WriteLog( "WM_RECONNECT" );
  2045. SendMessage( g_pDlgMain->GetSafeHwnd(),WM_RECONNECT,(WPARAM)m_Controller.sName.GetBuffer(m_Controller.sName.GetLength()),0 );
  2046. m_Controller.sName.ReleaseBuffer();
  2047. }
  2048. return true;
  2049. }
  2050. }
  2051. if( lpEvent )
  2052. {
  2053. delete lpEvent;
  2054. lpEvent = NULL;
  2055. }
  2056. if( m_bExitThread )
  2057. m_bExitFinish = true;
  2058. return true;
  2059. }
  2060. DWORD WINAPI CThread_Controller::Thread_ZK( CThread_Controller *pThread )
  2061. {
  2062. MSG message;
  2063. CString strTemp;
  2064. if( pThread->m_Controller.sPort=="" )
  2065. pThread->m_Controller.sPort = "4370";
  2066. while( true )
  2067. {
  2068. bool bRet = false;
  2069. if( pThread->m_Controller.nWordMode==0 )
  2070. bRet = g_pDlgMain->m_pDlgZK->Connect_Com( pThread->m_Controller.sSN, pThread->m_Controller.nComPort );
  2071. else
  2072. bRet = g_pDlgMain->m_pDlgZK->Connect_Net( pThread->m_Controller.sSN, pThread->m_Controller.sIP,pThread->m_Controller.sPort );
  2073. if ( !bRet )
  2074. {
  2075. //if( pThread->m_nErrorNum++>1 )
  2076. {
  2077. pThread->m_bExitFinish = true;
  2078. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
  2079. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
  2080. return 0;
  2081. }
  2082. }
  2083. else
  2084. break;
  2085. }
  2086. pThread->m_nErrorNum = 0;
  2087. pThread->m_bExitFinish = false;
  2088. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
  2089. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
  2090. do//while( 1 )
  2091. {
  2092. //设置门控制参数(在线/延时)[108F]
  2093. while( pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
  2094. {
  2095. //if( pThread->m_Controller.bDoorIsSet[i] )
  2096. //{
  2097. // int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
  2098. // int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
  2099. //
  2100. // CString s;
  2101. // s.Format( "8F10%02d%02d",i,nDoorControlType );
  2102. // bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
  2103. // s += CString(bstrT);
  2104. // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
  2105. // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
  2106. // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
  2107. // {
  2108. // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
  2109. // {
  2110. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  2111. // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
  2112. // break;
  2113. // }
  2114. // }
  2115. // else
  2116. // {
  2117. // pThread->m_nErrorNum = 0;
  2118. // //完成把标志赋为实时监控
  2119. // pThread->m_Controller.nOperterType = OPERATE_Moniter;
  2120. // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
  2121. // break;
  2122. // }
  2123. }
  2124. //校准控制器时间
  2125. while( pThread->m_Controller.nOperterType==OPERATE_JustTime )
  2126. {
  2127. bool bRet = g_pDlgMain->m_pDlgZK->SetDeviceTime( pThread->m_Controller.sSN );
  2128. if( !bRet )
  2129. {
  2130. if( pThread->m_nErrorNum++>5 )
  2131. {
  2132. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  2133. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
  2134. break;
  2135. }
  2136. }
  2137. else
  2138. {
  2139. pThread->m_nErrorNum=0;
  2140. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  2141. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
  2142. break;
  2143. }
  2144. }
  2145. //远程开门
  2146. while( pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
  2147. {
  2148. bool bBreak = false;
  2149. for( int i=1;i<5;i++ )
  2150. {
  2151. if( pThread->m_Controller.bDoorIsSet[i] )
  2152. {
  2153. bBreak = true;
  2154. bool bRet = g_pDlgMain->m_pDlgZK->OpenDoor( pThread->m_Controller.sSN );
  2155. if( !bRet )
  2156. {
  2157. if( pThread->m_nErrorNum++>5 )
  2158. {
  2159. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  2160. pThread->m_Controller.bDoorIsSet[i] = false;
  2161. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
  2162. break;
  2163. }
  2164. }
  2165. else
  2166. {
  2167. pThread->m_nErrorNum = 0;
  2168. //完成把标志赋为实时监控
  2169. pThread->m_Controller.nOperterType = OPERATE_Moniter;
  2170. pThread->m_Controller.bDoorIsSet[i] = false;
  2171. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
  2172. break;
  2173. }
  2174. }
  2175. }
  2176. if( bBreak )
  2177. break;
  2178. }
  2179. //实时监控
  2180. while( pThread->m_Controller.nOperterType==OPERATE_Moniter )
  2181. {
  2182. //CString sShow;
  2183. //sShow.Format( "%s 实时监控 1",pThread->m_Controller.sName );
  2184. //WriteLog( sShow );
  2185. DWORD dwTicks = GetTickCount() - pThread->m_dwGetDoorStatusTicks;
  2186. if( dwTicks>=READ_DOORSTATUS_TIMESPACE )
  2187. {
  2188. int nStatus=0,INDEX=0;
  2189. if( g_pDlgMain->m_pDlgZK->GetDoorState(pThread->m_Controller.sSN,nStatus) )
  2190. {
  2191. INDEX = 1;
  2192. if (nStatus==1 && pThread->m_nDoorStatus[INDEX]!=nStatus )
  2193. {
  2194. pThread->m_nDoorStatus[INDEX] = nStatus;
  2195. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,1,1 );
  2196. }
  2197. else if ( pThread->m_nDoorStatus[INDEX]!=nStatus )
  2198. {
  2199. pThread->m_nDoorStatus[INDEX] = nStatus;
  2200. g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,1,0 );
  2201. }
  2202. }
  2203. if( pThread->m_Controller.nDoorCount>1 )
  2204. {
  2205. }
  2206. if( pThread->m_Controller.nDoorCount>2 )
  2207. {
  2208. }
  2209. pThread->m_dwGetDoorStatusTicks = GetTickCount();
  2210. }
  2211. if( g_pDlgMain->m_pDlgZK->ReadRTLog(pThread->m_Controller.sSN) && g_pDlgMain->m_pDlgZK->m_bNewRecord )
  2212. {
  2213. g_pDlgMain->m_pDlgZK->m_bNewRecord = false;
  2214. int nIndex=0;
  2215. long cardId = g_pDlgMain->m_pDlgZK->m_nCardNum;
  2216. int status = g_pDlgMain->m_pDlgZK->m_nIsInValid;
  2217. CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
  2218. g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
  2219. CString sTime,sCardID,sInfo,s;
  2220. sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
  2221. pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
  2222. sCardID.Format( "%ld",cardId );
  2223. if( sUserName!="" && sClass!="" && sJobNumber!="" )
  2224. sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
  2225. else if( sUserName!="" && sClass!="" )
  2226. sUserName.Format( "%s( %s ) ",sUserName,sClass );
  2227. else if( sUserName!="" && sJobNumber!="" )
  2228. sUserName.Format( "%s( %s ) ",sUserName,sJobNumber );
  2229. sTime.Format("%s",g_pDlgMain->m_pDlgZK->m_sTime );
  2230. sDoorName = sInOut+sDoorName;
  2231. if( sTime.GetLength()<10 && status==1 )
  2232. {
  2233. SYSTEMTIME st;
  2234. ::GetLocalTime( &st );
  2235. sTime.Format( "%d-%02d-%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond );
  2236. }
  2237. if( sCardID=="0" )
  2238. {
  2239. sCardID = "";
  2240. }
  2241. g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "+sUserName," "+sDoorName," "+sInfo );
  2242. }
  2243. //if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
  2244. // ::TranslateMessage (&message);
  2245. // ::DispatchMessage (&message);
  2246. //}
  2247. //sShow.Format( "%s 实时监控 2",pThread->m_Controller.sName );
  2248. //WriteLog( sShow );
  2249. //Sleep( 1000 );
  2250. }
  2251. if( pThread->m_Controller.nOperterType==OPERATE_NULL )
  2252. {
  2253. g_pDlgMain->m_pDlgZK->Disconnect(pThread->m_Controller.sSN);
  2254. //SetEvent( pThread->m_hRunObject );
  2255. pThread->m_bExitFinish = true;
  2256. break;
  2257. }
  2258. }while( WaitForSingleObject( pThread->m_hRunObject, 200L ) == WAIT_TIMEOUT );
  2259. return 0;
  2260. }