12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492 |
- #include "StdAfx.h"
- #include "Thread_Controller.h"
- #include "StoneU_Door.h"
- #include "Dlg_Frame.h"
- #include <afxmt.h>
- #include <afxtempl.h>
- #include "mdlProject.h"
- #include "XJL\GlobalXJL.h"
- #include "atlbase.h" //加入
- #include "WG\_WComm_Serial.h" //加入
- #include "WG\_WComm_Serial_i.c" //加入
- #import "WG\WComm_UDP.tlb" //加入
- using namespace WComm_UDP; //加入
- #include "Dlg_ZK.h"
- //JK
- extern HINSTANCE hACSDLL; //DLL handle
- extern int g_nControllerOpenCount; //控制器打开总数
- bool g_bOK = false;
- void WINAPI MYOnConnect(unsigned long iLineID)
- {
- CString str;
- str.Format("iLineID = %d", iLineID);
- g_bOK = true;
- return;
- }
- void MYOnDisConnect(unsigned long iLineID)
- {
- }
- void MYCtrlOnReceConfigData(unsigned long iLineID, BYTE *pDataBuf,unsigned long DataLength)
- {
- }
- void MYCtrlOnSwitchChange (unsigned long iLineID,unsigned long PortNum, unsigned long Value)
- {
-
- }
- //end JK
- CThread_Controller::CThread_Controller( CONCROLLER controller )
- {
- m_bPause = false;
- m_bExitThread = false;
- m_bExitFinish = false;
- m_Thread = NULL;
- m_hRunObject = NULL;
-
- m_nErrorNum = 0;
- m_Controller = controller;
- memset( m_nDoorStatus,-1,40 );
- //InitDll();
- }
- CThread_Controller::~CThread_Controller(void)
- {
- }
- void CThread_Controller::SetController( CONCROLLER controller )
- {
- m_Controller = controller;
- }
- void CThread_Controller::GetDoorNameAndInOutInfo( int iIndex,CString &sDoorName,CString &sInOut )
- {
- int nDoorCount=0;
- if( m_Controller.sDoorName[1]!="" )
- nDoorCount++;
- if( m_Controller.sDoorName[2]!="" )
- nDoorCount++;
- if( m_Controller.sDoorName[3]!="" )
- nDoorCount++;
- if( m_Controller.sDoorName[4]!="" )
- nDoorCount++;
- iIndex = iIndex/4%4;
- if( nDoorCount==1 )
- {
- if( iIndex==0 || iIndex==2 )
- {
- sInOut = "【进门】";
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
- }
- else
- {
- sInOut = "【出门】";
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
- }
- }
- else if( nDoorCount==2 )
- {
- if( iIndex==0 || iIndex==2 )
- {
- sInOut = "【进门】";
- if( iIndex==0 )
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
- else
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[2] );
- }
- else
- {
- sInOut = "【出门】";
- if( iIndex==1 )
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
- else
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[2] );
- }
- }
- else if( nDoorCount==4 )
- {
- sInOut = "【进门】";
- switch( iIndex )
- {
- case 0:
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[1] );
- break;
- case 1:
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[2] );
- break;
- case 2:
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[3] );
- break;
- case 3:
- sDoorName.Format("%d-%s",m_Controller.nID,m_Controller.sDoorName[4] );
- break;
- }
- }
- }
- int CThread_Controller::StartThread( )
- {
- if (m_hRunObject == NULL)
- {
- m_hRunObject = ::CreateEvent(
- NULL, /* Security */
- TRUE, /* Manual event */
- 0, /* Clear on creation */
- 0);
- }
- else
- {
- ResetEvent( m_hRunObject );
- }
- memset( m_nDoorStatus,-1,40 );
- switch( m_Controller.nBrandType )
- {
- case BRAND_WG://微耕
- {
- if( m_Controller.nWordMode==0 )
- {
- if (m_Thread == NULL )
- {
- m_Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread_WG_485,this,0,NULL);
-
- if (m_Thread)
- {
- m_bExitThread = false;
- m_bPause = false;
- m_bExitFinish = true;
- m_nErrorNum = 0;
- }
- }
- }
- else if( m_Controller.nWordMode==1 )
- {
- if (m_Thread == NULL )
- {
- m_Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread_WG_TCP,this,0,NULL);
-
- if (m_Thread)
- {
- m_bExitThread = false;
- m_bPause = false;
- m_bExitFinish = true;
- m_nErrorNum = 0;
- }
- }
- }
- }
- break;
- case BRAND_ZK://中控
- {
- if (m_Thread == NULL )
- {
- if( g_pDlgMain->m_pDlgZK==NULL )
- {
- g_pDlgMain->m_pDlgZK = new CDlg_ZK();
- g_pDlgMain->m_pDlgZK->Create(IDD_DLG_ZK, g_pDlgMain);
- //g_pDlgMain->m_pDlgZK->ShowWindow( true );
- }
- MTVERIFY( m_Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread_ZK,this,0,NULL) );
-
- if (m_Thread)
- {
- m_bExitThread = false;
- m_bPause = false;
- m_bExitFinish = true;
- m_nErrorNum = 0;
- }
- }
- }
- break;
- }
- return TRUE;
- }
- void CThread_Controller::StopThread( )
- {
- if( m_hRunObject )
- MTVERIFY( SetEvent( m_hRunObject ) );
- m_Controller.nOperterType = OPERATE_NULL;
- //Sleep( 500 );
- if( m_Controller.nBrandType==BRAND_WG )
- {
- if( m_Thread )
- {
- // 一直等到通知结果才返回
- if( !m_bExitFinish )
- WaitForSingleObject( m_hRunObject, INFINITE );
- //MTVERIFY( WaitForSingleObject( m_Thread, INFINITE ) != WAIT_FAILED );
- MTVERIFY( CloseHandle( m_Thread ) );
- m_Thread = NULL;
- }
- }
- else if( m_Controller.nBrandType==BRAND_ZK )
- {
- if( m_Thread )
- {
- m_bExitThread = true;
- Sleep(300);
- int nCount=0;
- //while( !m_bExitFinish )
- //{
- // Sleep(100);
- // if( nCount++ > 20 )
- // {
- // TerminateThread( m_Thread , 0 );
- // Sleep(300);
- // break;
- // }
- //}
- CloseHandle( m_Thread );
- m_Thread = NULL;
- }
- }
- }
- DWORD WINAPI CThread_Controller::Thread_WG_485( CThread_Controller *pThread )
- {
- MSG message;
- CString strTemp;
- CString strInfo;
- HRESULT hr;
- // Now we will intilize COM
- hr = CoInitialize(0);
- if (!SUCCEEDED(hr))
- {
- ::MessageBox (NULL,(LPCTSTR)(g_strInitComFail),"",0);
- return FALSE; //出错
- }
- IWComm_Serial *wserial; //创建串口通信COM对象
- hr = CoCreateInstance( CLSID_CWComm_Serial, NULL, CLSCTX_INPROC_SERVER, IID_IWComm_Serial, (void**) &wserial);
- if(!SUCCEEDED(hr))
- {
- ::MessageBox (NULL,(LPCTSTR)(g_strInitSerialFail),"",0);
- return 0; //出错
- }
- //__int64 lngRet;
- long lngRetSerial;
- BSTR bstrT; //中间变量
- BSTR bstrFrame; //通信返回的数据
- BSTR bstrCmd; //发送的指令帧
- long controllerSN; //控制器序列号
- BSTR bstrComPort; //通信串口号
- //刷卡记录变量
- __int64 cardId; //卡号
- __int64 status; //状态
- BSTR bstrSwipeDate; //日期时间
- CString strRunDetail; //运行信息
- IWCOMM_OPERATEPtr wudp(__uuidof(WComm_Operate)); //创建.NET 通信对象
- strTemp = pThread->m_Controller.sSN;//"15978";
- controllerSN = _ttol((LPCTSTR)strTemp); //测试使用的控制器
- strTemp.Format("COM%d",pThread->m_Controller.nComPort );//"COM1";
- bstrComPort = strTemp.AllocSysString(); //使用的通信端口
- strTemp.Format("%d",controllerSN);
- strInfo = "控制器通信-" + strTemp + "-" + CString(bstrComPort) ;
- bstrT = BSTR(L"811000000000");
- bstrCmd = wudp->CreateBstrCommand(controllerSN, bstrT); //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial->get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "出错处理: 读取运行信息失败" ;
- //pBoxOne->SetWindowText(strInfo );
- //if( pThread->m_nErrorNum++>1 )
- {
- CString s;
- s.Format( "连接【%d】失败,错误码=%d",pThread->m_Controller.nComPort,lngRetSerial );
- WriteLog( s );
- //wudp -> Release();
- //wserial->Release();
- g_SetComIsOpen( pThread->m_Controller.sPort,0 );
- pThread->m_bExitFinish = true;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
- return 0;
- }
- }
- pThread->m_nErrorNum = 0;
- pThread->m_bExitFinish = false;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
- while( 1 )
- {
- //设置门控制参数(在线/延时)[108F]
- while( pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
- {
- for( int i=1;i<5;i++ )
- {
- if( pThread->m_Controller.bDoorIsSet[i] )
- {
- int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
- int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
-
- CString s;
- s.Format( "8F10%02d%02d",i,nDoorControlType );
- bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
- s += CString(bstrT);
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
- {
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
- break;
- }
- break;
- }
- }
- }
- //校准控制器时间
- while( pThread->m_Controller.nOperterType==OPERATE_JustTime )
- {
- bstrCmd = wudp -> CreateBstrCommandOfAdjustClockByPCTime(controllerSN); //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
- {
- strInfo = strInfo + char(13) + char(10) + "校准控制器时间出错" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
- break;
- }
- }
-
- //远程开门
- while( pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
- {
- for( int i=1;i<10;i++ )
- {
- if( pThread->m_Controller.bDoorIsSet[i] )
- {
- CString s;
- s.Format("9D10%02d",i );
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
- {
- strInfo = strInfo + char(13) + char(10) + "远程开门失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- pThread->m_Controller.bDoorIsSet[i] = false;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- pThread->m_Controller.bDoorIsSet[i] = false;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
- break;
- }
- break;
- }
- }
- }
- //提取记录
- long recIndex;
- recIndex = 1;
- while( pThread->m_Controller.nOperterType==OPERATE_Record )
- {
- bstrT = wudp->NumToStrHex(recIndex, 4);
- strTemp = "8D10" + CString(bstrT);
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial->get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "提取记录出错" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
- if (CString((bstrSwipeDate)) != "" )
- {
- int nIndex=0;
- CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
- CString sTime,sCardID,sInfo,s;
- sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
- pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
-
- sTime.Format("%s",CString(bstrSwipeDate) );
- sCardID.Format( "%ld",cardId );
- if( sUserName!="" )
- sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
- sDoorName = sInOut+sDoorName;
-
- //ADOCtrl.InsertRecord( sTime,sCardID,sUserName,sDoorName,sInfo );
- recIndex = recIndex + 1;
- }
- else
- {
- if (recIndex > 1) //只有提取了记录才进行删除
- {
- while( true )
- {
- bstrT = wudp->NumToStrHex(recIndex-1, 4);
- strTemp = "8E10" + CString(bstrT);
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "删除记录失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- strInfo = strInfo + char(13) + char(10) + "删除记录成功";
- break;
- }
- }
- }
- //完成提取记录把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
- { //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- }
- //发送权限操作(1.先清空权限)
- if( pThread->m_Controller.nOperterType==OPERATE_Permit )
- {
- while( true )
- {
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR("9310")) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "清空权限失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- strInfo = strInfo + char(13) + char(10) + "清空权限成功" ;
- break;
- }
- }
- //发送权限操作(2.再添加权限)
- //权限格式: 卡号(2)+区号(1)+门号(1)+卡起始年月日(2)+卡截止年月日(2)+ 控制时段索引号(1)+密码(3)+备用(4,用0填充)
- //发送权限按: 先发1号门(卡号小的先发), 再发2号门(卡号小的先发)
- //此案例中权限设为: 卡有效期从(2007-8-14 到2020-12-31), 采用默认时段1(任意时间有效), 缺省密码(1234), 备用值以00填充
- //以三个卡: 07217564 [9C4448],342681[B9A603],25409969[F126FE]为例,分别可以通过控制器的2个门。
- //实际使用按需修改
-
- // //!!!!!!!注意: 此处卡号已直接按从小到大排列赋值了. 实际使用中要用算法实现排序
- long privilegeIndex = 1;
- CString privilege;
- for( int nDoorIndex=1;nDoorIndex<5;nDoorIndex++ )
- {
- if( pThread->m_Controller.Card2Door[nDoorIndex].nCardCount>0 )
- {
- for( int nCardIndex=0;nCardIndex<pThread->m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
- {
- long cardno = pThread->m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
-
- privilege = "";
- bstrT = wudp->CardToStrHex(cardno);
- privilege = privilege + CString(bstrT); //卡号
- bstrT = wudp->NumToStrHex(nDoorIndex, 1);
- privilege = privilege + CString(bstrT) ; //门号
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-14")) ;//有效起始日期
- privilege = privilege + CString(bstrT);
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2020-12-31"));//有效截止日期
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(1, 1) ; //时段索引号
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(123456, 3) ; //用户密码
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(0, 4) ; //备用4字节(用0填充)
- privilege = privilege + CString(bstrT) ;
- if (lstrlen(privilege) != (16 * 2))
- {
- //生成的权限不符合要求, 请查一下上一指令中写入的每个参数是否正确
- strInfo = strInfo + char(13) + char(10) + "生成的权限不符合要求: 添加权限失败" ;
- }
- while( true )
- {
- bstrT = wudp->NumToStrHex(privilegeIndex, 2) ; //权限索引号
- strTemp = "9B10" + CString(bstrT) + privilege;
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ))
- {
- strInfo = strInfo + char(13) + char(10) + "添加权限失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- privilegeIndex = privilegeIndex + 1;
- break;
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
- { //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- }
- }
- }
- //发送控制时段
- //发送要设定的时段 [注意0,1时段为系统固定化,更改是无效的, 所以设定的时段一般从2开始]
- //此案例设定时段2: 从2007-8-1到2007-12-31日
- //星期1到5允许在7:30-12:30, 13:30-17:30, 19:00-21:00通过, 其他时间不允许
- CString timeseg;
- timeseg = "";
- bstrT = wudp->NumToStrHex(0x1F, 1);
- timeseg = timeseg + CString(bstrT) ; //星期控制
- bstrT = wudp->NumToStrHex(0x00, 1);
- timeseg = timeseg + CString(bstrT) ; // 下一链接时段(0--表示无)
- bstrT = wudp->NumToStrHex(0x00, 2);
- timeseg = timeseg + CString(bstrT) ; // 保留2字节(0填充)
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("7:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒1
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("12:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒1
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("13:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒2
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("17:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒2
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("19:00:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒3
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("21:00:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒3
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-1"));
- timeseg = timeseg + CString(bstrT) ; // 起始日期
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-12-31"));
- timeseg = timeseg + CString(bstrT) ; // 终止日期
- bstrT = wudp->NumToStrHex(0x00, 4);
- timeseg = timeseg + CString(bstrT) ; // 保留4字节(0填充)
- if (lstrlen(timeseg) != (24 * 2))
- {
- //生成的时段不符合要求, 请查一下上一指令中写入的每个参数是否正确
- strInfo = strInfo + char(13) + char(10) + "生成的时段不符合要求: 修改时段失败" ;
- }
- while( true )
- {
- bstrT = wudp->NumToStrHex(2, 2) ; //时段索引号2
- strTemp = "9710" + CString(bstrT) + timeseg;
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "添加时段失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- strInfo = strInfo + char(13) + char(10) + "添加时段成功" ;
- break;
- }
- }
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- }
- //实时监控
- // 读取运行状态是实现监控的关键指令。 在进行监控时, 先读取最新记录索引位的记录. 读取到最新的记录, 同时可以获取到刷卡记录数。
- // 这时就可以用读取到刷卡记录数加1填充到要读取的最新记录索引位上,去读取运行状态, 以便获取下一个记录。
- // 如果读取到了新的刷卡记录, 就可以将索引位增1, 否则保持索引位不变。 这样就可以实现数据的实时监控。
- // 遇到通信不上的处理,这时可对串口通信采取超时400-500毫秒作为出错,可重试一次,再接收不到数据, 可认为设备与PC机间的不能通信。
- __int64 watchIndex;
- long recCnt;
- watchIndex = 0 ; //缺省从0, 表示先提取最近一个记录
- recCnt = 0 ; //监控记录计数
- while( pThread->m_Controller.nOperterType==OPERATE_Moniter )
- {
- //读取在线信息
- DWORD dwTicks = GetTickCount() - pThread->m_dwGetDoorStatusTicks;
- if( dwTicks>=READ_DOORSTATUS_TIMESPACE )
- {
- bstrT = BSTR(L"811000000000");
- bstrCmd = wudp -> CreateBstrCommand(controllerSN, bstrT); //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- }
- else
- {
- int INDEX=0;
- __int64 lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 1);
- INDEX = 1;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
-
- if( pThread->m_Controller.nDoorCount>1 )
- {
- lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 2);
- INDEX = 2;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- }
- if( pThread->m_Controller.nDoorCount>2 )
- {
- lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 3);
- INDEX = 3;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 4);
- INDEX = 4;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- }
- }
- pThread->m_dwGetDoorStatusTicks = GetTickCount();
- }
- bstrT = wudp->NumToStrHex(watchIndex, 3) ; //表示第watchIndex个记录, 如果是0则取最新一条记录
- strTemp = "8110" + CString(bstrT);
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- wserial->serial_comm(bstrCmd, bstrComPort,&bstrFrame); //发送指令, 并获取返回信息
- wserial -> get_ErrCode((long*)&lngRetSerial);
- if (( ERROR_SUCCESS != lngRetSerial)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "实时监控失败" ;
- }
- else
- {
- pThread->m_nErrorNum = 0;
- bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
- if (CString(bstrSwipeDate) != "" )
- {
- int nIndex=0;
- CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
- CString sTime,sCardID,sInfo,s;
- sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
- pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
- sCardID.Format( "%ld",cardId );
-
- if( sUserName!="" && sClass!="" && sJobNumber!="" )
- sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
- else if( sUserName!="" && sClass!="" )
- sUserName.Format( "%s( %s ) ",sUserName,sClass );
- else if( sUserName!="" && sJobNumber!="" )
- sUserName.Format( "%s( %s ) ",sUserName,sJobNumber );
- sTime.Format("%s",CString(bstrSwipeDate) );
-
- sDoorName = sInOut+sDoorName;
-
- recIndex = recIndex + 1; //下一条记录
- if (watchIndex == 0) //如果收到第一条记录
- {
- watchIndex = wudp->GetCardRecordCountFromRunInfo(bstrFrame);
- watchIndex = watchIndex + 1; //指向(总记录数+1), 也就是下次刷卡的存储索引位
- }
- else
- {
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "+sUserName," "+sDoorName," "+sInfo );
- watchIndex = watchIndex + 1 ; //指向下一个记录位
- }
- recCnt = recCnt + 1; //记录计数 }
- // pBoxOne->LineScroll(pBoxOne->GetLineCount()); //显示最后一行
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
- { //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- Sleep( 1000 );
- }
- if( pThread->m_Controller.nOperterType==OPERATE_NULL )
- {
- wudp -> Release();
- wserial->Release();
- CoUninitialize();
- SysFreeString(bstrComPort);
- SetEvent( pThread->m_hRunObject );
- pThread->m_bExitFinish = true;
- break;
- }
- }//while( 1 );//( WaitForSingleObject(pThread->m_hRunObject, 200L) == WAIT_TIMEOUT );
- return 0;
- }
- DWORD WINAPI CThread_Controller::Thread_WG_TCP( CThread_Controller *pThread )
- {
- MSG message;
- CString strTemp,sTemp;
- CString strNewIPAddr;
- CString strInfo;
- HRESULT hr;
- // Now we will intilize COM
- hr = CoInitialize(0);
- if (!SUCCEEDED(hr))
- {
- ::MessageBox (NULL,(LPCTSTR)(g_strInitComFail),"",0);
- return -1; //出错
- }
- __int64 lngRet;
- BSTR bstrT; //中间变量
- BSTR bstrFrame; //通信返回的数据
- BSTR bstrCmd; //发送的指令帧
- long controllerSN; //控制器序列号
-
- //刷卡记录变量
- __int64 cardId; //卡号
- __int64 status; //状态
- BSTR bstrSwipeDate; //日期时间
- CString strRunDetail; //运行信息
- BSTR strIPAddr; //IP地址
- CString strMac; //MAC地址
- CString strHexNewIP; //New IP (十六进制)
- CString strHexMask; //掩码(十六进制)
- CString strHexGateway; //网关(十六进制)
- long startLoc; //字符串的起始位置
- IWCOMM_OPERATEPtr wudp(__uuidof(WComm_Operate)); //创建UDP 通信对象
- //((CWnd*)GetDlgItem(IDC_EDITSN))->GetWindowText(strTemp);
- controllerSN = _ttol((LPCTSTR)pThread->m_Controller.sSN ); //测试使用的控制器
- strIPAddr = pThread->m_Controller.sIP.AllocSysString(); //BSTR(L""); //一开始为空, 表示广播包方式
- //strTemp.Format("%d",controllerSN);
- if( pThread->m_Controller.sPort=="" )
- pThread->m_Controller.sPort = "60000";
- //读取运行状态信息(1081)
- while( true )
- {
- bstrT = BSTR(L"811000000000");
- bstrCmd = wudp->CreateBstrCommand(controllerSN, bstrT); //生成指令帧
- bstrFrame = wudp->udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort) ); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- //if( pThread->m_nErrorNum++>1 )
- {
- CString s;
- s.Format( "连接【%s,%s】失败,错误码=%d",pThread->m_Controller.sIP,pThread->m_Controller.sPort,wudp->ErrCode );
- WriteLog( s );
- pThread->m_bExitFinish = true;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
- return 0;
- }
- }
- else
- break;
- }
- pThread->m_nErrorNum = 0;
- pThread->m_bExitFinish = false;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
- while( 1 )
- {
- //设置门控制参数(在线/延时)[108F]
- while( pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
- {
- for( int i=1;i<5;i++ )
- {
- if( pThread->m_Controller.bDoorIsSet[i] )
- {
- int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
- int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
-
- CString s;
- s.Format( "8F10%02d%02d",i,nDoorControlType );
- bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
- s += CString(bstrT);
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- bstrFrame = wudp->udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
- break;
- }
- break;
- }
- }
- }
- //校准控制器时间
- while( pThread->m_Controller.nOperterType==OPERATE_JustTime )
- {
- bstrCmd = wudp -> CreateBstrCommandOfAdjustClockByPCTime(controllerSN); //生成指令帧
- bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "校准控制器时间出错" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
- break;
- }
- }
- //远程开门
- while( pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
- {
- for( int i=1;i<5;i++ )
- {
- if( pThread->m_Controller.bDoorIsSet[i] )
- {
- CString s;
- s.Format("9D10%02d",i );
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "远程开门失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- pThread->m_Controller.bDoorIsSet[i] = false;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- pThread->m_Controller.bDoorIsSet[i] = false;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
- break;
- }
- break;
- }
- }
- }
- //提取记录
- long recIndex;
- recIndex = 1;
- while( pThread->m_Controller.nOperterType==OPERATE_Record )
- {
- bstrT = wudp->NumToStrHex(recIndex, 4);
- strTemp = "8D10" + CString(bstrT);
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "提取记录出错" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
- if (CString((bstrSwipeDate)) != "" )
- {
- int nIndex=0;
- CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
- CString sTime,sCardID,sInfo,s;
- sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
- pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
-
- sTime.Format("%s",CString(bstrSwipeDate) );
- sCardID.Format( "%ld",cardId );
- if( sUserName!="" )
- sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
-
- sDoorName = sInOut+sDoorName;
-
- //ADOCtrl.InsertRecord( sTime,sCardID,sUserName,sDoorName,sInfo );
-
- recIndex = recIndex + 1; //下一条记录
- }
- else
- {
- strTemp.Format("%ld", (recIndex-1));
- strInfo = strInfo + char(13) + char(10) + "提取记录完成. 总共提取记录数 =" + strTemp;
- if (recIndex > 1) //只有提取了记录才进行删除
- {
- while( true )
- {
- bstrT = wudp->NumToStrHex(recIndex-1, 4);
- strTemp = "8E10" + CString(bstrT);
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)==""))
- {
- strInfo = strInfo + char(13) + char(10) + "删除记录失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- strInfo = strInfo + char(13) + char(10) + "删除记录成功";
- break;
- }
- }
- }
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- }
- //发送权限操作
- if( pThread->m_Controller.nOperterType==OPERATE_Permit )
- {
- //获取权限个数
- strTemp.Format("%ld",wudp->GetPrivilegeNumFromRunInfo(bstrFrame) );
- strRunDetail = strRunDetail + char(13) + char(10) + "权限数: " + char(9) + strTemp;
- #if 1
- long privilegeIndex = 1;
- CString privilege;
- for( int nDoorIndex=1;nDoorIndex<5;nDoorIndex++ )
- {
- if( pThread->m_Controller.Card2Door[nDoorIndex].nCardCount>0 )
- {
- for( int nCardIndex=0;nCardIndex<pThread->m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
- {
- long cardno = pThread->m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
-
- privilege = "";
- bstrT = wudp->CardToStrHex(cardno);
- privilege = privilege + CString(bstrT); //卡号
- bstrT = wudp->NumToStrHex(nDoorIndex, 1);
- privilege = privilege + CString(bstrT) ; //门号
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-14")) ;//有效起始日期
- privilege = privilege + CString(bstrT);
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2020-12-31"));//有效截止日期
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(1, 1) ; //时段索引号
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(123456, 3) ; //用户密码
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(0, 4) ; //备用4字节(用0填充)
- privilege = privilege + CString(bstrT) ;
- if (lstrlen(privilege) != (16 * 2))
- {
- //生成的权限不符合要求, 请查一下上一指令中写入的每个参数是否正确
- strInfo = strInfo + char(13) + char(10) + "生成的权限不符合要求: 添加权限失败" ;
- }
- while( true )
- {
- bstrT = wudp->NumToStrHex(0, 2) ; //权限索引号 不是清空再添加时为空
- strTemp = "0711" + CString(bstrT) + privilege;
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame =( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "添加权限失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- privilegeIndex = privilegeIndex + 1;
- break;
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
- { //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- }
- }
- }
- CString timeseg;
- timeseg = "";
- bstrT = wudp->NumToStrHex(0x1F, 1);
- timeseg = timeseg + CString(bstrT) ; //星期控制
- bstrT = wudp->NumToStrHex(0x00, 1);
- timeseg = timeseg + CString(bstrT) ; // 下一链接时段(0--表示无)
- bstrT = wudp->NumToStrHex(0x00, 2);
- timeseg = timeseg + CString(bstrT) ; // 保留2字节(0填充)
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("7:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒1
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("12:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒1
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("13:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒2
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("17:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒2
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("19:00:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒3
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("21:00:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒3
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-1"));
- timeseg = timeseg + CString(bstrT) ; // 起始日期
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-12-31"));
- timeseg = timeseg + CString(bstrT) ; // 终止日期
- bstrT = wudp->NumToStrHex(0x00, 4);
- timeseg = timeseg + CString(bstrT) ; // 保留4字节(0填充)
- if (lstrlen(timeseg) != (24 * 2))
- {
- //生成的时段不符合要求, 请查一下上一指令中写入的每个参数是否正确
- strInfo = strInfo + char(13) + char(10) + "生成的时段不符合要求: 修改时段失败" ;
- }
- while( true )
- {
- bstrT = wudp->NumToStrHex(2, 2) ; //时段索引号2
- strTemp = "9710" + CString(bstrT) + timeseg;
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame = ( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ))
- {
- strInfo = strInfo + char(13) + char(10) + "添加时段失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- strInfo = strInfo + char(13) + char(10) + "添加时段成功" ;
- break;
- }
- }
- #else
- //先清空权限
- while( true )
- {
- bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR("9310")) ; //生成指令帧
- bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort)); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "清空权限失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- strInfo = strInfo + char(13) + char(10) + "清空权限成功" ;
- break;
- }
- }
- //发送权限操作(2.再添加权限)
- //权限格式: 卡号(2)+区号(1)+门号(1)+卡起始年月日(2)+卡截止年月日(2)+ 控制时段索引号(1)+密码(3)+备用(4,用0填充)
- //发送权限按: 先发1号门(卡号小的先发), 再发2号门(卡号小的先发)
- //此案例中权限设为: 卡有效期从(2007-8-14 到2020-12-31), 采用默认时段1(任意时间有效), 缺省密码(1234), 备用值以00填充
- //以三个卡: 07217564 [9C4448],342681[B9A603],25409969[F126FE]为例,分别可以通过控制器的2个门。
- //实际使用按需修改
-
- //!!!!!!!注意: 此处卡号已直接按从小到大排列赋值了. 实际使用中要用算法实现排序
- long privilegeIndex = 1;
- CString privilege;
- for( int nDoorIndex=1;nDoorIndex<5;nDoorIndex++ )
- {
- if( pThread->m_Controller.Card2Door[nDoorIndex].nCardCount>0 )
- {
- for( int nCardIndex=0;nCardIndex<pThread->m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
- {
- long cardno = pThread->m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
-
- privilege = "";
- bstrT = wudp->CardToStrHex(cardno);
- privilege = privilege + CString(bstrT); //卡号
- bstrT = wudp->NumToStrHex(nDoorIndex, 1);
- privilege = privilege + CString(bstrT) ; //门号
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-14")) ;//有效起始日期
- privilege = privilege + CString(bstrT);
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2020-12-31"));//有效截止日期
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(1, 1) ; //时段索引号
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(123456, 3) ; //用户密码
- privilege = privilege + CString(bstrT) ;
- bstrT = wudp->NumToStrHex(0, 4) ; //备用4字节(用0填充)
- privilege = privilege + CString(bstrT) ;
- if (lstrlen(privilege) != (16 * 2))
- {
- //生成的权限不符合要求, 请查一下上一指令中写入的每个参数是否正确
- strInfo = strInfo + char(13) + char(10) + "生成的权限不符合要求: 添加权限失败" ;
- }
- while( true )
- {
- bstrT = wudp->NumToStrHex(privilegeIndex, 2) ; //权限索引号
- strTemp = "9B10" + CString(bstrT) + privilege;
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame =( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- strInfo = strInfo + char(13) + char(10) + "添加权限失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- privilegeIndex = privilegeIndex + 1;
- break;
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE))
- { //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- }
- }
- }
- CString timeseg;
- timeseg = "";
- bstrT = wudp->NumToStrHex(0x1F, 1);
- timeseg = timeseg + CString(bstrT) ; //星期控制
- bstrT = wudp->NumToStrHex(0x00, 1);
- timeseg = timeseg + CString(bstrT) ; // 下一链接时段(0--表示无)
- bstrT = wudp->NumToStrHex(0x00, 2);
- timeseg = timeseg + CString(bstrT) ; // 保留2字节(0填充)
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("7:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒1
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("12:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒1
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("13:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒2
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("17:30:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒2
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("19:00:00"));
- timeseg = timeseg + CString(bstrT) ; // 起始时分秒3
- bstrT = wudp->MSDateHmsToWCDateHms(A2BSTR("21:00:00"));
- timeseg = timeseg + CString(bstrT) ; // 终止时分秒3
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-8-1"));
- timeseg = timeseg + CString(bstrT) ; // 起始日期
- bstrT = wudp->MSDateYmdToWCDateYmd(A2BSTR("2007-12-31"));
- timeseg = timeseg + CString(bstrT) ; // 终止日期
- bstrT = wudp->NumToStrHex(0x00, 4);
- timeseg = timeseg + CString(bstrT) ; // 保留4字节(0填充)
- if (lstrlen(timeseg) != (24 * 2))
- {
- //生成的时段不符合要求, 请查一下上一指令中写入的每个参数是否正确
- strInfo = strInfo + char(13) + char(10) + "生成的时段不符合要求: 修改时段失败" ;
- }
- while( true )
- {
- bstrT = wudp->NumToStrHex(2, 2) ; //时段索引号2
- strTemp = "9710" + CString(bstrT) + timeseg;
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame = ( wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ))
- {
- strInfo = strInfo + char(13) + char(10) + "添加时段失败" ;
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- strInfo = strInfo + char(13) + char(10) + "添加时段成功" ;
- break;
- }
- }
- #endif
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- }
- //实时监控
- // 读取运行状态是实现监控的关键指令。 在进行监控时, 先读取最新记录索引位的记录. 读取到最新的记录, 同时可以获取到刷卡记录数。
- // 这时就可以用读取到刷卡记录数加1填充到要读取的最新记录索引位上,去读取运行状态, 以便获取下一个记录。
- // 如果读取到了新的刷卡记录, 就可以将索引位增1, 否则保持索引位不变。 这样就可以实现数据的实时监控。
- // 遇到通信不上的处理,这时可对串口通信采取超时400-500毫秒作为出错,可重试一次,再接收不到数据, 可认为设备与PC机间的不能通信。
- __int64 watchIndex;
- long recCnt;
- watchIndex = 0 ; //缺省从0, 表示先提取最近一个记录
- recCnt = 0 ; //监控记录计数
- while( pThread->m_Controller.nOperterType==OPERATE_Moniter )
- {
- DWORD dwTicks = GetTickCount() - pThread->m_dwGetDoorStatusTicks;
- if( dwTicks>=READ_DOORSTATUS_TIMESPACE )
- {
- bstrT = BSTR(L"811000000000");
- bstrCmd = wudp -> CreateBstrCommand(controllerSN, bstrT); //生成指令帧
- //strIPAddr = BSTR(L"");
- bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort) ); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- }
- else
- {
- int INDEX=0;
- __int64 lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 1);
- INDEX = 1;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- if( pThread->m_Controller.nDoorCount>1 )
- {
- lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 2);
- INDEX = 2;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- }
- if( pThread->m_Controller.nDoorCount>2 )
- {
- lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 3);
- INDEX = 3;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- lngRet = wudp->GetDoorStatusFromRunInfo(bstrFrame, 4);
- INDEX = 4;
- if (lngRet==1 && pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=lngRet )
- {
- pThread->m_nDoorStatus[INDEX] = lngRet;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,INDEX,0 );
- }
- }
- }
- pThread->m_dwGetDoorStatusTicks = GetTickCount();
- }
- //strTemp = "8110" + g_ReturnStr( watchIndex,6 );
- //bstrT = sTemp.AllocSysString();
- bstrT = wudp->NumToStrHex(watchIndex, 3) ; //表示第watchIndex个记录, 如果是0则取最新一条记录
- strTemp = "8110" + CString(bstrT);
- bstrCmd = wudp->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- bstrFrame =( wudp->udp_comm(bstrCmd, strIPAddr, atoi(pThread->m_Controller.sPort))); //发送指令, 并获取返回信息
- if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- {
- }
- else
- {
- pThread->m_nErrorNum=0;
- bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
- if (CString(bstrSwipeDate) != "" )
- {
- int nIndex=0;
- CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
- CString sTime,sCardID,sInfo,s;
- sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
- pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
- sCardID.Format( "%ld",cardId );
-
- if( sUserName!="" && sClass!="" && sJobNumber!="" )
- sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
- else if( sUserName!="" && sClass!="" )
- sUserName.Format( "%s( %s ) ",sUserName,sClass );
- else if( sUserName!="" && sJobNumber!="" )
- sUserName.Format( "%s( %s ) ",sUserName,sJobNumber );
- sTime.Format("%s",CString(bstrSwipeDate) );
- sDoorName = sInOut+sDoorName;
-
- recIndex = recIndex + 1; //下一条记录
- if (watchIndex == 0) //如果收到第一条记录
- {
- watchIndex = wudp->GetCardRecordCountFromRunInfo(bstrFrame);
- watchIndex = watchIndex + 1; //指向(总记录数+1), 也就是下次刷卡的存储索引位
- }
- else
- {
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "+sUserName," "+sDoorName," "+sInfo );
- watchIndex = watchIndex + 1 ; //指向下一个记录位
- }
- recCnt = recCnt + 1; //记录计数 }
- }
- }
- if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
- ::TranslateMessage (&message);
- ::DispatchMessage (&message);
- }
- Sleep( 1000 );
- }
-
- if( pThread->m_Controller.nOperterType==OPERATE_NULL )
- {
- CoUninitialize();
- SysFreeString(strIPAddr);
- wudp->Release();
- SetEvent( pThread->m_hRunObject );
- pThread->m_bExitFinish = true;
- break;
- }
- }//while( 1 );//( WaitForSingleObject(pThread->m_hRunObject, 200L) == WAIT_TIMEOUT );
- return 0;
- }
- DWORD WINAPI CThread_Controller::Thread_JK( CThread_Controller *pThread )
- {
- CString strTemp;
- CString strNewIPAddr;
- CString strInfo;
- bool bRet=false;
- //WriteLog( "Thread_TCP" );
- while( true )
- {
- bRet = pThread->JK_ConnetController( pThread->m_Controller.nWordMode,pThread->m_Controller.sIP,pThread->m_Controller.nComPort,pThread->m_Controller.ComPort );
- if( !bRet )
- {
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_bExitFinish = true;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
- WriteLog("JK_ConnetController fail");
- return 0;
- }
- }
- else
- {
- pThread->m_Controller.LineID = 0;//g_nControllerOpenCount;
- g_nControllerOpenCount++;
- break;
- }
- }
- pThread->m_nErrorNum = 0;
- while( !g_bOK )
- {
- Sleep( 100 );
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_bExitFinish = true;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
- WriteLog("g_bOK=false");
- return 0;
- }
- }
- if( pThread->JK_IsOnline( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID ) )
- {
- pThread->m_nErrorNum = 0;
- pThread->m_bExitFinish = false;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
- g_bIsInsertReconnectInfo = false;
- WriteLog("JK_IsOnline ok");
- }
- else
- {
- pThread->m_bExitFinish = true;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
- g_bIsInsertReconnectInfo = true;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
- WriteLog("JK_IsOnline fail");
- return 0;
- }
- do
- {
- // //设置门控制参数(在线/延时)[108F]
- // while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
- // {
- // for( int i=1;i<5;i++ )
- // {
- // if( pThread->m_Controller.bDoorIsSet[i] )
- // {
- // int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
- // int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
- //
- // CString s;
- // s.Format( "8F10%02d%02d",i,nDoorControlType );
- // bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
- // s += CString(bstrT);
- // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
- // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- // {
- // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- // {
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
- // break;
- // }
- // }
- // else
- // {
- // pThread->m_nErrorNum = 0;
- // //完成把标志赋为实时监控
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
- // break;
- // }
- //
- // break;
- // }
- // }
- // }
- //校准控制器时间
- while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_JustTime )
- {
- bRet = pThread->JK_AdjustTime( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
- if( !bRet )
- {
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
- break;
- }
- }
- //
- // //远程开门
- // while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
- // {
- // for( int i=1;i<5;i++ )
- // {
- // if( pThread->m_Controller.bDoorIsSet[i] )
- // {
- // CString s;
- // s.Format("9D10%02d",i );
- // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
- // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- // {
- // strInfo = strInfo + char(13) + char(10) + "远程开门失败" ;
- // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- // {
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // pThread->m_Controller.bDoorIsSet[i] = false;
- // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
- // break;
- // }
- // }
- // else
- // {
- // pThread->m_nErrorNum = 0;
- // //完成把标志赋为实时监控
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // pThread->m_Controller.bDoorIsSet[i] = false;
- // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
- // break;
- // }
- //
- // break;
- // }
- // }
- // }
- //
- // //提取记录
- // long recIndex;
- // recIndex = 1;
- // while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_Record )
- // {
- // bstrT = wudp->NumToStrHex(recIndex, 4);
- // strTemp = "8D10" + CString(bstrT);
- // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
- // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- // {
- // strInfo = strInfo + char(13) + char(10) + "提取记录出错" ;
- // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- // {
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // break;
- // }
- // }
- // else
- // {
- // pThread->m_nErrorNum=0;
- // bstrSwipeDate = wudp->GetSwipeDateFromRunInfo(bstrFrame, &cardId, &status) ;
- // if (CString((bstrSwipeDate)) != "" )
- // {
- // int nIndex=0;
- // CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- // g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
- // CString sTime,sCardID,sInfo,s;
- // sInfo = g_GetStatus( cardId,status,nIndex );
- // pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
- // sCardID.Format( "%s(%s-%s-%ld) ",sUserName,sClass,sJobNumber,cardId );
- // sTime.Format("%s",CString(bstrSwipeDate) );
- //
- // sDoorName = sInOut+sDoorName;
- //
- // ADOCtrl.InsertRecord( sTime,sCardID,sDoorName,sInfo );
- //
- // recIndex = recIndex + 1; //下一条记录
- // }
- // else
- // {
- // strTemp.Format("%ld", (recIndex-1));
- // strInfo = strInfo + char(13) + char(10) + "提取记录完成. 总共提取记录数 =" + strTemp;
- //
- // if (recIndex > 1) //只有提取了记录才进行删除
- // {
- // while( true )
- // {
- // bstrT = wudp->NumToStrHex(recIndex-1, 4);
- // strTemp = "8E10" + CString(bstrT);
- // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(strTemp)) ; //生成指令帧
- // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
- // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)==""))
- // {
- // strInfo = strInfo + char(13) + char(10) + "删除记录失败" ;
- // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- // {
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // break;
- // }
- // }
- // else
- // {
- // pThread->m_nErrorNum = 0;
- // strInfo = strInfo + char(13) + char(10) + "删除记录成功";
- // break;
- // }
- // }
- // }
- //
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // }
- // }
- // if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
- // ::TranslateMessage (&message);
- // ::DispatchMessage (&message);
- // }
- //
- // }
- //
- //发送权限操作(1.先清空权限)
- if( pThread->m_Controller.nOperterType==OPERATE_Permit )
- {
- while( true )
- {
- bRet = pThread->JK_DelPermit( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
- if( !bRet )
- {
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- break;
- }
- }
- while( true )
- {
- bRet = pThread->JK_SetPermit( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
- if( !bRet )
- {
- if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- break;
- }
- }
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- }
- //实时监控
- while( !pThread->m_bExitThread && pThread->m_Controller.nOperterType==OPERATE_Moniter )
- {
- if( !pThread->m_bExitFinish )
- bRet = pThread->JK_GetEvents( pThread->m_Controller.nWordMode,pThread->m_Controller.LineID,pThread->m_Controller.ComPort,pThread->m_Controller.CtrlID );
- Sleep( 200 );
- }
- if( pThread->m_Controller.nOperterType==OPERATE_NULL )
- break;
- }while( WaitForSingleObject(pThread->m_hRunObject, 200L) == WAIT_TIMEOUT );
- return 0;
- }
- bool CThread_Controller::JK_ConnetController( int iWordMode,CString sIP,long nPort,int iPort )
- {
- TOnConnect FOnConnect;// 声明函数指针变量
- TOnDisConnect FOnDisConnect;
-
- FOnConnect = (TOnConnect)MYOnConnect;
- FOnDisConnect = (TOnDisConnect)MYOnDisConnect;
-
- DLLFunNT_SetCallbackFun NT_SetCallbackFun = (DLLFunNT_SetCallbackFun)GetProcAddress(hACSDLL,"NT_SetCallbackFun");
-
- if (NT_SetCallbackFun(FOnConnect, FOnDisConnect, NULL, NULL))
- {
- int at=0;
- }
- else
- {
- int ab=0;
- }
- if( iWordMode==1 )//tcp
- {
- if ((!hACSDLL) || (sIP == "")) return false;
-
- DLLFunNT_OpenConnect NT_OpenConnect = (DLLFunNT_OpenConnect)GetProcAddress(hACSDLL,"NT_OpenConnect");
- if (NT_OpenConnect((LPCSTR)sIP, nPort, NULL, 0))
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Connected Success");
- //m_cLine.AddString(localip);
- //LineType =1;
- // LineID = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCount() +1;
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- if (!hACSDLL) return false;
- //Get the procedure Address 取得入口地址
- DllFunOpenComm OpenComm = (DllFunOpenComm)GetProcAddress(hACSDLL,"OpenComm");
-
- if (!OpenComm) return false;
-
- if (OpenComm(iPort))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- return true;
- }
- bool CThread_Controller::JK_GetModel( int iWordMode,int iLineID,int iPort,int iCtrlID )
- {
- if (!hACSDLL) return false;
-
- DLLFunGetModel JK_GetModel = (DLLFunGetModel)GetProcAddress(hACSDLL,"JK_GetModel");
- DLLFunNT_GetModel NT_GetModel = (DLLFunNT_GetModel)GetProcAddress(hACSDLL,"NT_GetModel");
- memset(&m_Controller.rModel, 0, sizeof(TModel));
- int iRet;
- if (0==iWordMode)//Com Communication
- {
- iRet = JK_GetModel(iPort, iCtrlID, &m_Controller.rModel);
- }
- else
- {
- iRet = NT_GetModel(iLineID, iCtrlID, &m_Controller.rModel);
- }
- if (iRet != 0)
- {
- CString str;
- str.Format("iWordMode=%d,iLineID=%d,iCtrlID=%d NT_GetModel fail",iWordMode,iLineID,iCtrlID );
- //WriteLog(str);
- return false;
- }
- else
- {
- CString str;
- str.Format("iWordMode=%d,iLineID=%d,iCtrlID=%d NT_GetModel OK",iWordMode,iLineID,iCtrlID );
- //WriteLog(str);
- }
- // m_model.SetWindowText(rModel.Model);
- // memset(tmp, 0, 10);
- // memcpy(tmp, rModel.Version, 6);
- // m_ver.SetWindowText(tmp);
- //
- // m_Mylist.InsertString(m_Mylist.GetCount(),"Get Model success");
- //
- // CString str1;
- // str1.Format("model:%s",rModel.Model);
- //
- //// CString str ;
- // str.Format(" Ver:%s",rModel.Version);
- //
- // m_Mylist.InsertString(m_Mylist.GetCount(), str1 + str);
- //
- DLLFunGetDoorCount GetDoorCount = (DLLFunGetDoorCount)GetProcAddress(hACSDLL,"GetDoorCount");
- iRet = GetDoorCount(&m_Controller.rModel);
- if (iRet)
- {
- //str.Format("%d", iRet);
- //m_DoorCount.SetWindowText (str);
- }
- //UpdateData(true);
- return true;
- }
- bool CThread_Controller::JK_IsOnline( int iWordMode,int iLineID,int iPort,int iCtrlID )
- {
- if (!hACSDLL) return false;
- int iRet;
- int COUNT=0;
- bool f = JK_GetModel( iWordMode,iLineID,iPort,iCtrlID );
- while( !f )
- {
- if( COUNT++>=READ_ERROR_NUM )
- {
- CString str;
- str.Format("iWordMode=%d,iLineID=%d,iCtrlID=%d NT_GetModel fail",iWordMode,iLineID,iCtrlID );
- //WriteLog(str);
- return false;
- }
- Sleep( 100 );
- f = JK_GetModel( iWordMode,iLineID,iPort,iCtrlID );
- }
-
- if (0==iWordMode)//Com Communication
- {
- DLLFunOnLine OnLine = (DLLFunOnLine)GetProcAddress(hACSDLL,"OnLine");
- iRet = OnLine(iPort, iCtrlID);
- }
- else
- {
- DLLFunNT_OnLine NT_OnLine = (DLLFunNT_OnLine)GetProcAddress(hACSDLL,"NT_OnLine");
- iRet = NT_OnLine(iLineID, iCtrlID);
- }
- if (iRet != GDR_OK)
- {
- return false;
- }
- return true;
- }
- bool CThread_Controller::JK_DisconnetController( int iWordMode,int iLineID,int iPort )
- {
- if( iWordMode==1 )//tcp
- {
- DLLFunNT_CloseConnect NT_CloseConnect = (DLLFunNT_CloseConnect)GetProcAddress(hACSDLL,"NT_CloseConnect");
- if (!NT_CloseConnect) return false;
-
- if (NT_CloseConnect(iLineID))
- {
- return true;
- }
- }
- else
- {
- if (!hACSDLL) return false;
- DLLFunCloseComm CloseComm = (DLLFunCloseComm)GetProcAddress(hACSDLL,"CloseComm");
- if (!CloseComm) return false;
- if (iPort>0)
- {
- //调用
- BOOL rbool = CloseComm(iPort);
- if (rbool)
- {
- // m_Mylist.InsertString(m_Mylist.GetCount(),"Close Success");
- // CString str;
- // m_Combo1.GetLBText(ComPort, str);
-
- // int i =((CComboBox*)GetDlgItem(IDC_COMBO1))->FindString(-1, str);
- // ((CComboBox*)GetDlgItem(IDC_COMBO1))->DeleteString(i);
- //// for (int i=0; i<iCount; i++)
- // ComPort = 0;
- return true;
- }
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Close false");
- }
- }
- return true;
- }
- bool CThread_Controller::JK_AdjustTime( int iWordMode,int iLineID,int iPort,int iCtrlID )
- {
- int iRet;
- if (!iWordMode) //Com
- {
- DLLFunSetTime SetTime = (DLLFunSetTime)GetProcAddress(hACSDLL,"SetTime");
-
- iRet = SetTime(iPort, iCtrlID);
- }
- else// TCP/IP
- {
- DLLFunNT_SetTime NT_SetTime = (DLLFunNT_SetTime)GetProcAddress(hACSDLL,"NT_SetTime");
-
- iRet = NT_SetTime(iLineID, iCtrlID);
- }
-
- if ( iRet == GDR_RECOK)
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Download system time succeed!");
- return true;
- }
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Download system time false!");
- return false;
- }
- bool CThread_Controller::JK_SetPermit( int iWordMode,int iLineID,int iPort,int iCtrlID )
- {
- TGroupCard *pCard, *pNext;
- WORD Offset,GroupCount=0;
- int iRet , i;
- DWORD TestCards[5000];
- DLLFunSetCardReg SetCardReg = (DLLFunSetCardReg)GetProcAddress(hACSDLL,"SetCardReg");
- DLLFunNT_SetCardReg NT_SetCardReg = (DLLFunNT_SetCardReg)GetProcAddress(hACSDLL,"NT_SetCardReg");
- for( int nDoorIndex=1;nDoorIndex<2;nDoorIndex++ )
- {
- for( int nCardIndex=0;nCardIndex<m_Controller.Card2Door[nDoorIndex].nCardCount;nCardIndex++ )
- {
- long cardno = m_Controller.Card2Door[nDoorIndex].nCardNum[nCardIndex];
- TestCards[GroupCount++] = cardno;
- }
- }
- Offset = 0;
-
- pCard = new TGroupCard[sizeof(TGroupCard) * GroupCount];
- pNext = pCard;
- for (i= 0 ;i< GroupCount; i++)
- {
- pNext->CardNumber.dwCardNo = TestCards[i];
- pNext->wCardCount =1; //a group only have a card.
- if (i != GroupCount - 1)
- pNext->pNext = PGroupCard(DWORD(pNext) + sizeof(TGroupCard));
- else
- pNext->pNext =NULL;
- }
- if (!iWordMode)
- {
- iRet =SetCardReg(iPort, iCtrlID, Offset, GroupCount, pCard);
- }
- else
- {
- iRet = NT_SetCardReg(iLineID, iCtrlID, Offset, GroupCount, pCard);
- }
-
- if (iRet == GDR_RECOK )
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Set Card List success");
-
- }
- else
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Set Card List fail! ");
- //return;
- }
- delete []pCard;
- return true;
- }
- bool CThread_Controller::JK_DelPermit( int iWordMode,int iLineID,int iPort,int iCtrlID )
- {
- int iRet;
- DLLFunDelCards DelCards = (DLLFunDelCards)GetProcAddress(hACSDLL,"DelCards");
- DLLFunNT_DelCards NT_DelCards=(DLLFunNT_DelCards)GetProcAddress(hACSDLL,"NT_DelCards");
- if (!iWordMode)
- iRet = DelCards(iPort, iCtrlID, 0, CON_MAXCARD);
- else
- iRet = NT_DelCards(iLineID, iCtrlID, 0, CON_MAXCARD);
- if (iRet == GDR_RECOK )
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Clear Card Register succeed");
-
- }
- else
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Clear Card Register fail! ");
- }
- return true;
- }
- bool CThread_Controller::JK_GetEvents( int iWordMode,int iLineID,int iPort,int iCtrlID )
- {
- int nRet = -1;
- PEvent lpEvent, lpNext;
- BYTE BagID;
- BYTE EventCount;
- int iRet, i;
- CString stmp, sdate ,str;
- WORD itmp = sizeof(TEvent)* CON_MAXEVENTCOUNTOFBAG ;
- lpEvent = new TEvent[itmp];
- BagID = m_Controller.SEventBagId;
- EventCount = m_Controller.SEventCount;
-
- if (!iWordMode) //Com
- {
- DLLFunGetEvent GetEvent = (DLLFunGetEvent)GetProcAddress(hACSDLL,"GetEvent");
- iRet = GetEvent(iPort, iCtrlID, &BagID, &EventCount, lpEvent);
- }
- else
- {
- DLLFunNT_GetEvent NT_GetEvent = (DLLFunNT_GetEvent)GetProcAddress(hACSDLL,"NT_GetEvent");
- iRet = NT_GetEvent(iLineID, iCtrlID, &BagID, &EventCount, lpEvent);
- }
-
- if (iRet == GDR_OK)
- {
- m_Controller.SEventBagId = BagID; //Save event package number for next time
- m_Controller.SEventCount = EventCount; //Save event count for next time
-
- str.Format("%d", BagID);
- CString str1;
- str1.Format("%d", EventCount);
- //m_Mylist.InsertString(m_Mylist.GetCount(),"Bag ID: " + str + "EventCount:" + str1);
-
- lpNext = lpEvent;
-
- for (i=0; i<EventCount; i++)
- {
- if (!lpNext) break;
- stmp.Format("%d",i);
-
- int nIndex=0;
- CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- g_GetCardInfoByCardNumber( lpNext->CardNumber.dwCardNo,sUserName,sClass,sJobNumber,sRemarks );
- CString sTime,sCardID,sInfo,s;
- sInfo = g_GetStatus( m_Controller.nBrandType,lpNext->CardNumber.dwCardNo,lpNext->Code,nIndex );
- GetDoorNameAndInOutInfo( lpNext->DotID,sDoorName,sInOut );
- //sCardID.Format( "%s(%s-%s-%08d) ",sUserName,sClass,sJobNumber,lpNext->CardNumber.dwCardNo );
- sCardID.Format( "%08d",lpNext->CardNumber.dwCardNo );
- if( sUserName!="" )
- sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
- SYSTEMTIME st;
- st = lpNext->Time;
- sTime.Format("%d-%02d-%02d %02d:%02d:%02d",st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
- sDoorName = sInOut+sDoorName;
-
- if( lpNext->DotID==1 && lpNext->CardNumber.dwCardNo>100000 )
- {
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "," "+sDoorName," "+sInfo );
- //ADOCtrl.InsertRecord( sTime,sCardID,sUserName,sDoorName,sInfo );
- }
- else if( lpNext->DotID==96 && sInfo=="离开按钮开门" )
- {
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "," "," "," "+sInfo );
- //ADOCtrl.InsertRecord( sTime,"","","",sInfo );
- }
- lpNext = lpNext->pNext;
- }
- }
- else if (iRet == GDR_UPLOADOK)
- {
- //m_Mylist.InsertString(m_Mylist.GetCount(),"No Data!");
- m_Controller.SEventBagId = 0;
- m_Controller.SEventCount = 0;
- }
- else
- {
- if( iRet==-1 )
- {
- if( lpEvent )
- {
- delete lpEvent;
- lpEvent = NULL;
- }
-
- if( m_bExitThread )
- m_bExitFinish = true;
- else
- {
- WriteLog( "WM_RECONNECT" );
- SendMessage( g_pDlgMain->GetSafeHwnd(),WM_RECONNECT,(WPARAM)m_Controller.sName.GetBuffer(m_Controller.sName.GetLength()),0 );
- m_Controller.sName.ReleaseBuffer();
- }
- return true;
- }
- }
- if( lpEvent )
- {
- delete lpEvent;
- lpEvent = NULL;
- }
- if( m_bExitThread )
- m_bExitFinish = true;
- return true;
- }
- DWORD WINAPI CThread_Controller::Thread_ZK( CThread_Controller *pThread )
- {
- MSG message;
- CString strTemp;
- if( pThread->m_Controller.sPort=="" )
- pThread->m_Controller.sPort = "4370";
- while( true )
- {
- bool bRet = false;
- if( pThread->m_Controller.nWordMode==0 )
- bRet = g_pDlgMain->m_pDlgZK->Connect_Com( pThread->m_Controller.sSN, pThread->m_Controller.nComPort );
- else
- bRet = g_pDlgMain->m_pDlgZK->Connect_Net( pThread->m_Controller.sSN, pThread->m_Controller.sIP,pThread->m_Controller.sPort );
- if ( !bRet )
- {
- //if( pThread->m_nErrorNum++>1 )
- {
- pThread->m_bExitFinish = true;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,2 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,false,pThread->m_Controller.sName );
- return 0;
- }
- }
- else
- break;
- }
- pThread->m_nErrorNum = 0;
- pThread->m_bExitFinish = false;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,0 );
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ReConnect,true,pThread->m_Controller.sName );
- do//while( 1 )
- {
- //设置门控制参数(在线/延时)[108F]
- while( pThread->m_Controller.nOperterType==OPERATE_ControlAndDelayTime )
- {
- //if( pThread->m_Controller.bDoorIsSet[i] )
- //{
- // int nDoorControlType=pThread->m_Controller.nDoorControlType[i];
- // int nDoorDelayTime = pThread->m_Controller.nDoorDelayTime[i]*10;
- //
- // CString s;
- // s.Format( "8F10%02d%02d",i,nDoorControlType );
- // bstrT = wudp->NumToStrHex(nDoorDelayTime,2);
- // s += CString(bstrT);
- // bstrCmd = wudp ->CreateBstrCommand(controllerSN, A2BSTR(s)) ; //生成指令帧
- // bstrFrame = wudp -> udp_comm(bstrCmd, strIPAddr, 60000); //发送指令, 并获取返回信息
- // if (( ERROR_SUCCESS != wudp ->ErrCode)||(CString(bstrFrame)=="" ) )
- // {
- // if( pThread->m_nErrorNum++>READ_ERROR_NUM )
- // {
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,false );
- // break;
- // }
- // }
- // else
- // {
- // pThread->m_nErrorNum = 0;
- // //完成把标志赋为实时监控
- // pThread->m_Controller.nOperterType = OPERATE_Moniter;
- // g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_ControlAndDelayTime,true );
- // break;
- // }
- }
- //校准控制器时间
- while( pThread->m_Controller.nOperterType==OPERATE_JustTime )
- {
- bool bRet = g_pDlgMain->m_pDlgZK->SetDeviceTime( pThread->m_Controller.sSN );
- if( !bRet )
- {
- if( pThread->m_nErrorNum++>5 )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum=0;
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_JustTime,true );
- break;
- }
- }
- //远程开门
- while( pThread->m_Controller.nOperterType==OPERATE_DoorOpen )
- {
- bool bBreak = false;
- for( int i=1;i<5;i++ )
- {
- if( pThread->m_Controller.bDoorIsSet[i] )
- {
- bBreak = true;
- bool bRet = g_pDlgMain->m_pDlgZK->OpenDoor( pThread->m_Controller.sSN );
- if( !bRet )
- {
- if( pThread->m_nErrorNum++>5 )
- {
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- pThread->m_Controller.bDoorIsSet[i] = false;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,false );
- break;
- }
- }
- else
- {
- pThread->m_nErrorNum = 0;
- //完成把标志赋为实时监控
- pThread->m_Controller.nOperterType = OPERATE_Moniter;
- pThread->m_Controller.bDoorIsSet[i] = false;
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( OPERATE_DoorOpen,true );
- break;
- }
- }
- }
- if( bBreak )
- break;
- }
- //实时监控
- while( pThread->m_Controller.nOperterType==OPERATE_Moniter )
- {
- //CString sShow;
- //sShow.Format( "%s 实时监控 1",pThread->m_Controller.sName );
- //WriteLog( sShow );
- DWORD dwTicks = GetTickCount() - pThread->m_dwGetDoorStatusTicks;
- if( dwTicks>=READ_DOORSTATUS_TIMESPACE )
- {
- int nStatus=0,INDEX=0;
- if( g_pDlgMain->m_pDlgZK->GetDoorState(pThread->m_Controller.sSN,nStatus) )
- {
- INDEX = 1;
- if (nStatus==1 && pThread->m_nDoorStatus[INDEX]!=nStatus )
- {
- pThread->m_nDoorStatus[INDEX] = nStatus;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,1,1 );
- }
- else if ( pThread->m_nDoorStatus[INDEX]!=nStatus )
- {
- pThread->m_nDoorStatus[INDEX] = nStatus;
- g_pDlgMain->m_pDlg_Moniter->AddDoorToList( pThread->m_Controller.sName,1,0 );
- }
- }
-
- if( pThread->m_Controller.nDoorCount>1 )
- {
-
- }
- if( pThread->m_Controller.nDoorCount>2 )
- {
-
- }
- pThread->m_dwGetDoorStatusTicks = GetTickCount();
- }
- if( g_pDlgMain->m_pDlgZK->ReadRTLog(pThread->m_Controller.sSN) && g_pDlgMain->m_pDlgZK->m_bNewRecord )
- {
- g_pDlgMain->m_pDlgZK->m_bNewRecord = false;
- int nIndex=0;
- long cardId = g_pDlgMain->m_pDlgZK->m_nCardNum;
- int status = g_pDlgMain->m_pDlgZK->m_nIsInValid;
- CString sUserName,sClass,sJobNumber,sRemarks,sDoorName,sInOut;
- g_GetCardInfoByCardNumber( cardId,sUserName,sClass,sJobNumber,sRemarks );
- CString sTime,sCardID,sInfo,s;
- sInfo = g_GetStatus( pThread->m_Controller.nBrandType,cardId,status,nIndex );
- pThread->GetDoorNameAndInOutInfo( nIndex,sDoorName,sInOut );
- sCardID.Format( "%ld",cardId );
-
- if( sUserName!="" && sClass!="" && sJobNumber!="" )
- sUserName.Format( "%s( %s-%s ) ",sUserName,sClass,sJobNumber );
- else if( sUserName!="" && sClass!="" )
- sUserName.Format( "%s( %s ) ",sUserName,sClass );
- else if( sUserName!="" && sJobNumber!="" )
- sUserName.Format( "%s( %s ) ",sUserName,sJobNumber );
- sTime.Format("%s",g_pDlgMain->m_pDlgZK->m_sTime );
- sDoorName = sInOut+sDoorName;
- if( sTime.GetLength()<10 && status==1 )
- {
- SYSTEMTIME st;
- ::GetLocalTime( &st );
- sTime.Format( "%d-%02d-%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond );
- }
- if( sCardID=="0" )
- {
- sCardID = "";
- }
- g_pDlgMain->m_pDlg_Moniter->InsertItemToList( " "+sTime," "+sCardID," "+sUserName," "+sDoorName," "+sInfo );
- }
- //if(::PeekMessage (&message,NULL,0,0,PM_REMOVE)){ //响应其他事件 如Exit按钮操作
- // ::TranslateMessage (&message);
- // ::DispatchMessage (&message);
- //}
- //sShow.Format( "%s 实时监控 2",pThread->m_Controller.sName );
- //WriteLog( sShow );
- //Sleep( 1000 );
- }
- if( pThread->m_Controller.nOperterType==OPERATE_NULL )
- {
- g_pDlgMain->m_pDlgZK->Disconnect(pThread->m_Controller.sSN);
- //SetEvent( pThread->m_hRunObject );
- pThread->m_bExitFinish = true;
- break;
- }
- }while( WaitForSingleObject( pThread->m_hRunObject, 200L ) == WAIT_TIMEOUT );
- return 0;
- }
|