YAServerDlg.cpp 179 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754
  1. // YAServerDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "YAServer.h"
  5. #include "YAServerDlg.h"
  6. #include "afxdialogex.h"
  7. #include <stdio.h>
  8. #include <sio_client.h>
  9. //#include <functional>
  10. //#include <thread> // c++11init_reader
  11. //#include <mutex> // c++11
  12. #include <condition_variable>
  13. #include <string>
  14. #include "def.h"
  15. #include "socketdef.h"
  16. #include <Functions/Functions.h>
  17. #include <json/json.h>
  18. #include "MysqlConnPool.h"
  19. #include "locate_algorithm.h"
  20. //#include "parse_data.h"
  21. #include <strconv/strconv.h>
  22. #include <kalman/locate.h>
  23. #include <INIFILE.h>
  24. #include "log_def.h"
  25. #include "DbSettingDlg.h"
  26. #include "LogSetting.h"
  27. #include "SysSetting.h"
  28. //#define CM_PIX 113.3 // (100.0 * 17.0 / 15.0) //每m像素数
  29. //#define CM_PIX 100 // 360.0/7.20 // 认证
  30. //#define CM_PIX 1.15 // 440 / 380m
  31. //#define CM_PIX (1.0 / 30.0)
  32. #define STR_LEN_TIME 30
  33. #ifdef _DEBUG
  34. #ifndef DEBUG_NEW
  35. #define new DEBUG_NEW
  36. #endif
  37. #endif
  38. //CalLocation cal_locate(0.05, 1, 0.3, 0.3);
  39. //CalLocation cal_locate1(0.0064, 1, 0.01);
  40. //CalLocation cal_locate2(0.0064, 1, 0.25);
  41. //CalLocation cal_locate3(0.0064, 0.09, 0.01);
  42. //CalLocation cal_locate4(0.0004, 1, 0.01);
  43. //bool is_init_calman = false;
  44. //Point2* Anc1;
  45. //CStdioFile std_file(L"d:\mat3_log.txt", CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone);
  46. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  47. //int aa = 0;
  48. DWORD g_tickcount;
  49. DWORD g_diffTickCount = 0;
  50. class CAboutDlg : public CDialogEx
  51. {
  52. public:
  53. CAboutDlg();
  54. // 对话框数据
  55. enum { IDD = IDD_ABOUTBOX };
  56. protected:
  57. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  58. // 实现
  59. protected:
  60. DECLARE_MESSAGE_MAP()
  61. };
  62. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  63. {
  64. }
  65. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  66. {
  67. CDialogEx::DoDataExchange(pDX);
  68. }
  69. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  70. END_MESSAGE_MAP()
  71. // CYAServerDlg 对话框
  72. CYAServerDlg::CYAServerDlg(CWnd* pParent /*=NULL*/)
  73. : CDialogEx(CYAServerDlg::IDD, pParent),
  74. _server(this),
  75. _io(new client())
  76. {
  77. ws_init();
  78. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  79. }
  80. void CYAServerDlg::DoDataExchange(CDataExchange* pDX)
  81. {
  82. CDialogEx::DoDataExchange(pDX);
  83. DDX_Control(pDX, IDC_BTN_START, m_btStart);
  84. DDX_Control(pDX, IDC_BTN_STOP, m_btStop);
  85. DDX_Control(pDX, IDC_LIST_READER, m_listctrl_reader);
  86. DDX_Control(pDX, IDC_LIST_LOG, m_list_log);
  87. }
  88. BEGIN_MESSAGE_MAP(CYAServerDlg, CDialogEx)
  89. ON_WM_SYSCOMMAND()
  90. ON_WM_PAINT()
  91. ON_WM_QUERYDRAGICON()
  92. ON_WM_TIMER()
  93. ON_BN_CLICKED(IDC_BTN_START, &CYAServerDlg::OnBnStart)
  94. ON_BN_CLICKED(IDC_BTN_STOP, &CYAServerDlg::OnBnStop)
  95. ON_BN_CLICKED(IDC_BTN_EXIT, &CYAServerDlg::OnBnExit)
  96. ON_BN_CLICKED(IDC_BTN_SYNCTIME, &CYAServerDlg::OnBnSyncTime)
  97. ON_MESSAGE(WM_ON_MONITOR, on_monitor)
  98. ON_COMMAND(ID_MENU_DB, &CYAServerDlg::OnMenuDb)
  99. ON_COMMAND(ID_MENU_LOG, &CYAServerDlg::OnMenuLog)
  100. ON_COMMAND(ID_MENU_PARAM, &CYAServerDlg::OnMenuParam)
  101. ON_BN_CLICKED(IDC_BTN_HIS, &CYAServerDlg::OnBnCallHisData)
  102. ON_MESSAGE(MSG_REFRESH_IP_LIST, &CYAServerDlg::OnMsgRefreshIpList)
  103. END_MESSAGE_MAP()
  104. // CYAServerDlg 消息处理程序
  105. UINT WaitForS(int nSecond,bool bSleep=false)//用于等待一段时间的函数,普通精度的,参数单位秒
  106. {
  107. COleDateTime start_time = COleDateTime::GetCurrentTime();
  108. COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;
  109. while(end_time.GetTotalSeconds() < nSecond){
  110. if(!bSleep){
  111. MSG msg;
  112. PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
  113. TranslateMessage(&msg);
  114. DispatchMessage(&msg);
  115. //以上四行是实现在延时或定时期间能处理其他的消息,降低CPU的占有率,但也降低延时或定时精度
  116. }
  117. Sleep(80);
  118. end_time = COleDateTime::GetCurrentTime()-start_time;
  119. }
  120. return 0;
  121. }
  122. UINT WaitForMS(int mSecond,bool bSleep=false)//高精度的等待函数,参数单位毫秒
  123. {
  124. double dfFreq;
  125. LARGE_INTEGER litmp;
  126. QueryPerformanceFrequency(&litmp);
  127. dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
  128. QueryPerformanceCounter(&litmp);
  129. LONGLONG QPart0 = litmp.QuadPart;// 获得初始值
  130. while((double)(litmp.QuadPart-QPart0)/dfFreq < double(mSecond/1000)){
  131. if(!bSleep){
  132. MSG msg;
  133. PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
  134. TranslateMessage(&msg);
  135. DispatchMessage(&msg);
  136. //以上四行是实现在延时或定时期间能处理其他的消息,降低CPU的占有率,但也降低延时或定时精度
  137. }
  138. QueryPerformanceCounter(&litmp);
  139. }
  140. return 0;
  141. }
  142. ULONGLONG time_send_json_counting;
  143. ULONGLONG time_send_json_device_state;
  144. ULONGLONG time_send_json_alarm;
  145. ULONGLONG time_send_json_postion;
  146. ULONGLONG time_sync_reader_time;
  147. ULONGLONG time_clear_call_time;
  148. ULONGLONG time_send_call;
  149. bool g_exit=false;
  150. long giSqlCount=0;
  151. long giSqlThreadCount=0;
  152. long gSqlTimes=0;
  153. long giAllSqlCount=0;
  154. long giAllThreadCount=0;
  155. HANDLE hSemaHandle=NULL;
  156. UINT _exec_sql(LPVOID lparam)
  157. {
  158. InterlockedIncrement(&giSqlThreadCount);
  159. CYAServerDlg *pFrame = reinterpret_cast <CYAServerDlg*>(theApp.m_pMainWnd);
  160. SQLTHREAD_DATA* pSQLData= (SQLTHREAD_DATA*)lparam;
  161. char* strSQL=pSQLData->pText;
  162. if(strlen(strSQL)==0){ // SQL语句为空
  163. free(strSQL);
  164. strSQL=NULL;
  165. delete pSQLData;
  166. pSQLData=NULL;
  167. return 1;
  168. }
  169. int RepeatTimes=pSQLData->nRepeatTimes;
  170. if(RepeatTimes>0){ // 等待重试写入数据库
  171. Sleep(5000);
  172. }
  173. //如果没有其他进程创建这个信号灯,则重新创建
  174. if(!hSemaHandle){
  175. hSemaHandle = CreateSemaphore(NULL, MAX_SEMACOUNT, MAX_SEMACOUNT, NULL);//"SQLSema");
  176. }
  177. if(hSemaHandle==NULL){ //无法创建信号量
  178. free(strSQL);
  179. delete pSQLData;
  180. InterlockedDecrement(&giSqlThreadCount);
  181. return 1;
  182. }
  183. WaitForSingleObject(hSemaHandle,60000);
  184. //if(g_DisconnectDB && giConnCount>=MaxConnCount-1)
  185. //{
  186. // DWORD d=GetTickCount();
  187. // while( (GetTickCount()-d<=32000) && g_DisconnectDB )
  188. // {
  189. // Sleep(1000);
  190. // }
  191. // CString s;
  192. // s.Format("等待数据库连接成功,耗时:%d ms 连接状态:%d",GetTickCount()-d,g_DisconnectDB);
  193. // pFrame->WriteInfoFile(s);
  194. //}
  195. //LARGE_INTEGER litmp;
  196. //double dFreq = 0.0;
  197. //QueryPerformanceFrequency(&litmp);
  198. //dFreq=(double)litmp.QuadPart;// 获得计数器的时钟频率
  199. //LARGE_INTEGER timedata1;
  200. //LARGE_INTEGER timedata2;
  201. //::QueryPerformanceCounter(&timedata1);
  202. //DWORD dw=GetTickCount();
  203. //bool bNewConn;
  204. //bNewConn=false;
  205. //_ConnectionPtr pConn;
  206. //pConn = NULL;
  207. //try
  208. //{
  209. // InterlockedIncrement(&giSqlCount);
  210. // if( giConnCount<MaxConnCount )
  211. // {
  212. // bNewConn=true;
  213. // InterlockedIncrement(&giConnCount);
  214. // pConn.CreateInstance(__uuidof(Connection));
  215. // if(pConn)
  216. // {
  217. // pConn->ConnectionTimeout = 10;
  218. // pConn->CommandTimeout = 180;//90;
  219. // pConn->Open(_bstr_t(theApp.m_ConnectStr),_T(""),_T(""),adModeUnknown);
  220. // pConn->Execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED",NULL,adCmdText);
  221. // pConn->Execute(strSQL,NULL,adCmdText);
  222. // if (pConn->State & adStateOpen)
  223. // pConn->Close();
  224. // pConn.Release();
  225. // pConn=NULL;
  226. // }
  227. // InterlockedDecrement(&giConnCount);
  228. // }
  229. // else
  230. // {
  231. // bNewConn=false;
  232. // theApp.m_pConn->Execute(strSQL,NULL,adCmdText);
  233. // }
  234. // ::QueryPerformanceCounter(&timedata2);
  235. // //(double)(timedata2.QuadPart-timedata1.QuadPart)/3600 ms
  236. // LONG dwOk=(double)(timedata2.QuadPart-timedata1.QuadPart)/dFreq*10000;//GetTickCount()-dw;
  237. // InterlockedExchangeAdd(&gSqlTimes, dwOk);
  238. // InterlockedIncrement(&giAllSqlCount);
  239. // InterlockedDecrement(&giSqlCount);
  240. // if(RepeatTimes>0)
  241. // {
  242. // //pFrame->WriteInfoFile("重试写入数据库成功");
  243. // }
  244. //}
  245. //catch(_com_error e)
  246. //{
  247. // if(bNewConn){
  248. // InterlockedDecrement(&giConnCount);
  249. // if (pConn->State & adStateOpen)
  250. // pConn->Close();
  251. // pConn.Release();
  252. // pConn=NULL;
  253. // }
  254. // InterlockedDecrement(&giSqlCount);
  255. // LONG dwOk=(double)(timedata2.QuadPart-timedata1.QuadPart)/dFreq*10000;//GetTickCount()-dw;
  256. // InterlockedExchangeAdd(&gSqlTimes, dwOk);
  257. // InterlockedIncrement(&giAllSqlCount);
  258. // //?err
  259. // //CString s;
  260. // //s.Format("%08lx",e.Error());
  261. // //g_LastDBErrorTime=COleDateTime::GetCurrentTime();
  262. // if(s=="80004005")
  263. // {
  264. // //g_DisconnectDB=TRUE;
  265. // //g_LastDisconnectTime=COleDateTime::GetCurrentTime();
  266. // //pFrame->ShowAppMessage("数据库已经断开。");
  267. // }
  268. // if((RepeatTimes<2) && (e.Error()!=0x80040e2f) )//重试次数小于1次的,继续重试 ; 0x80040e2f(插入重复键)
  269. // {
  270. // //CString strTemp;
  271. // //strTemp.Format(_T("执行SQL语句产生错误,等待后重试。\r\n\t错误信息:%s\r\n\t错误描述:%s\r\n\t源 :%s 错误号:%s"),e.ErrorMessage(),(LPCTSTR)_bstr_t(e.Description()),(LPCTSTR)_bstr_t(e.Source()),s);
  272. // //pFrame->ShowAppMessage(strTemp);
  273. // //if(pFrame->m_bSaveSQL)//Add
  274. // //{
  275. // // strTemp.Format("--err:%s",(LPCTSTR)_bstr_t(e.Description()));
  276. // // pFrame->WriteSQLText(strTemp,false);//?del
  277. // // pFrame->WriteSQLText(strSQL,false);
  278. // // pFrame->WriteSQLText("--end",false);
  279. // //}
  280. // //pSQLData->nRepeatTimes++;
  281. // //::AfxBeginThread(_ExecSql, (LPVOID)pSQLData);//写入数据库
  282. // //ReleaseSemaphore(hSemaHandle,1,NULL);
  283. // //InterlockedDecrement(&giSqlThreadCount);
  284. // return 0;
  285. // }
  286. // else//否则不再重试
  287. // {
  288. // //CString strTemp;
  289. // //strTemp.Format(_T("连续无法写入数据库,不再重试。\r\n\t错误信息:%s\r\n\t错误描述:%s\r\n\t源 :%s 错误号:%s"),e.ErrorMessage(),(LPCTSTR)_bstr_t(e.Description()),(LPCTSTR)_bstr_t(e.Source()),s);
  290. // //pFrame->ShowAppMessage(strTemp);
  291. // //if(e.Error()!=0x80040e2f)// 0x80040e2f(插入重复键)
  292. // //{
  293. // // pFrame->WriteInfoFile(strSQL);
  294. // // pFrame->WriteSQLText("--无法写入数据库",false);
  295. // // pFrame->WriteSQLText(strSQL,false);
  296. // //}
  297. // free(strSQL);
  298. // delete pSQLData;
  299. // ReleaseSemaphore(hSemaHandle,1,NULL);
  300. // InterlockedDecrement(&giSqlThreadCount);
  301. // return 1;
  302. // }
  303. //}
  304. ////if(pFrame->m_bSaveSQL)
  305. ////{
  306. //// CString s;
  307. //// s.Format("%d %d %s",giAllSqlCount,giSqlThreadCount,strSQL);
  308. //// pFrame->WriteSQLText(s,false);
  309. ////}
  310. //free(strSQL);
  311. //delete pSQLData;
  312. //LONG lPreCount=MAX_SEMACOUNT;
  313. //ReleaseSemaphore(hSemaHandle,1,&lPreCount);
  314. //InterlockedDecrement(&giSqlThreadCount);
  315. return 0;
  316. }
  317. UINT _thread_timer(LPVOID lparam)
  318. {
  319. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(lparam);
  320. while(!g_exit){
  321. ULONGLONG cur_time =::GetTickCount();
  322. //case TMR_SYNC_READER_TIME:
  323. // {
  324. // send_sync_reader();
  325. // break;
  326. // }
  327. //case TMR_CLEAR_CALL_TIMER:
  328. // {
  329. // clear_call_info();
  330. // break;
  331. // }
  332. //case TMR_SEND_CALL:
  333. // {
  334. // send_call_info();
  335. // break;
  336. // }
  337. // send_json_counting
  338. //if(cur_time - time_send_json_counting > theApp.send_json_counting ){
  339. // dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_counting());
  340. // time_send_json_counting = ::GetTickCount();
  341. //}
  342. //// send_json_alarm
  343. //if(cur_time - time_send_json_alarm > theApp.send_json_alarm){
  344. // dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_alarm());
  345. // time_send_json_alarm = ::GetTickCount();
  346. //}
  347. //// send_json_device
  348. //if(cur_time - time_send_json_device_state > theApp.send_json_alarm){
  349. // dlg->deal_readers();
  350. // dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_device_state());
  351. // time_send_json_device_state = ::GetTickCount();
  352. //}
  353. // send_json_postion
  354. if(cur_time - time_send_json_postion > theApp.send_json_postion){
  355. dlg->package_data();
  356. time_send_json_postion = ::GetTickCount();
  357. }
  358. WaitForMS(10);
  359. }
  360. return 0;
  361. }
  362. UINT _thread_monitor(LPVOID lparam)
  363. {
  364. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(lparam);
  365. time_t time_end = time(NULL);
  366. while (!g_exit){
  367. time_t time_current = time(NULL);
  368. // 判断采集状态, 20s没有接收到数据认为采集中断
  369. dlg->is_server_ok = (difftime(time_current, dlg->m_time_last_rec) > 20) ? false : true;
  370. dlg->set_run_state(); // 更新采集运行状态
  371. if(!IsWindow(theApp.m_hwnd_monitor)){ // 监控程序没有打开
  372. theApp.m_hwnd_monitor = NULL;
  373. //// 启动监控程序
  374. //if(strlen(theApp.m_path_monitor)<=0){
  375. // strcpy(theApp.m_path_monitor, "YAMonitor.exe");//启动同目录下的monitor
  376. //}
  377. //WinExec(theApp.m_path_monitor, SW_HIDE);
  378. }
  379. // 发送给监控程序
  380. if(theApp.m_hwnd_monitor && dlg->m_bListen){
  381. WPARAM wpSERVERSTATE=WPARAM(dlg->m_uint_state);
  382. ::PostMessage(theApp.m_hwnd_monitor, WM_ON_MONITOR, wpSERVERSTATE, LPARAM(dlg->m_hWnd));
  383. }
  384. WaitForS(10);
  385. }
  386. return 0;
  387. }
  388. BOOL CYAServerDlg::OnInitDialog()
  389. {
  390. CDialogEx::OnInitDialog();
  391. // 将“关于...”菜单项添加到系统菜单中。
  392. // IDM_ABOUTBOX 必须在系统命令范围内。
  393. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  394. ASSERT(IDM_ABOUTBOX < 0xF000);
  395. CMenu* pSysMenu = GetSystemMenu(FALSE);
  396. if (pSysMenu != NULL)
  397. {
  398. BOOL bNameValid;
  399. CString strAboutMenu;
  400. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  401. ASSERT(bNameValid);
  402. if (!strAboutMenu.IsEmpty())
  403. {
  404. pSysMenu->AppendMenu(MF_SEPARATOR);
  405. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  406. }
  407. }
  408. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  409. // 执行此操作
  410. SetIcon(m_hIcon, TRUE); // 设置大图标
  411. SetIcon(m_hIcon, FALSE); // 设置小图标
  412. init_param();
  413. init_ui();
  414. init_base_data();
  415. load_his_data();
  416. //ReceiveDateTime=COleDateTime::GetCurrentTime();
  417. theApp.set_server_handle(this->m_hWnd);
  418. theApp.load_monitor_conf();
  419. m_thread_monitor = ::AfxBeginThread(_thread_monitor, this, THREAD_PRIORITY_HIGHEST);
  420. RECT rc;
  421. GetWindowRect(&rc);
  422. rc.left=rc.right;
  423. rc.right+=250;
  424. //创建菜单
  425. m_mnMain.LoadMenu(IDR_MENUMAIN);
  426. SetMenu(&m_mnMain);
  427. CString strInfo;
  428. //SetTimer(RELOADCARD_TIMER,RELOADCARD_INTERVAL,0);
  429. //SetTimer(WRITE_LASTTIME,theApp.LastTimeInterval,0);
  430. //// 将图标放入系统托盘
  431. //nd.cbSize = sizeof (NOTIFYICONDATA);
  432. //nd.hWnd = m_hWnd;
  433. //nd.uID = IDI_ICON;
  434. //nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
  435. //nd.uCallbackMessage= WM_NOTIFYICON;
  436. //nd.hIcon = m_hIcon;
  437. //strcpy(nd.szTip, "采集应用服务器");
  438. //Shell_NotifyIcon(NIM_ADD, &nd);
  439. SetWindowText(_T("永安信通数据采集系统"));
  440. //OnBnStart();
  441. time_send_json_counting = time_send_json_device_state=time_send_json_alarm=time_send_json_postion=::GetTickCount();
  442. time_sync_reader_time=time_clear_call_time=time_send_call=::GetTickCount();
  443. m_thread_timer = ::AfxBeginThread(_thread_timer, this, THREAD_PRIORITY_HIGHEST);
  444. UpdateData(FALSE);
  445. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  446. }
  447. void CYAServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
  448. {
  449. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  450. {
  451. CAboutDlg dlgAbout;
  452. dlgAbout.DoModal();
  453. }
  454. else
  455. {
  456. CDialogEx::OnSysCommand(nID, lParam);
  457. }
  458. }
  459. // 如果向对话框添加最小化按钮,则需要下面的代码
  460. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  461. // 这将由框架自动完成。
  462. void CYAServerDlg::OnPaint()
  463. {
  464. if (IsIconic())
  465. {
  466. CPaintDC dc(this); // 用于绘制的设备上下文or
  467. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  468. // 使图标在工作区矩形中居中
  469. int cxIcon = GetSystemMetrics(SM_CXICON);
  470. int cyIcon = GetSystemMetrics(SM_CYICON);
  471. CRect rect;
  472. GetClientRect(&rect);
  473. int x = (rect.Width() - cxIcon + 1) / 2;
  474. int y = (rect.Height() - cyIcon + 1) / 2;
  475. // 绘制图标
  476. dc.DrawIcon(x, y, m_hIcon);
  477. }
  478. else
  479. {
  480. CDialogEx::OnPaint();
  481. }
  482. }
  483. //当用户拖动最小化窗口时系统调用此函数取得光标
  484. //显示。
  485. HCURSOR CYAServerDlg::OnQueryDragIcon()
  486. {
  487. return static_cast<HCURSOR>(m_hIcon);
  488. }
  489. void CYAServerDlg::OnBnStart()
  490. {
  491. //Test();
  492. if(!is_websocket_login){
  493. ws_login();
  494. }
  495. start_tcp_server();
  496. }
  497. void CYAServerDlg::OnBnStop()
  498. {
  499. //if(MessageBoxEx(m_hWnd, _T("确定停止吗?"), _T("询问"), MB_ICONQUESTION|MB_OKCANCEL|MB_DEFBUTTON2,NULL) == IDCANCEL){
  500. // return;
  501. //}
  502. stop_tcp_server();
  503. //stop_timer();
  504. }
  505. LRESULT CYAServerDlg::on_monitor( WPARAM wParam, LPARAM lParam )
  506. {
  507. if(m_bListen){
  508. m_uint_state = wParam ;
  509. }
  510. if(wParam == 0xFFFF){
  511. stop_and_exit();
  512. }
  513. return S_OK;
  514. }
  515. void CYAServerDlg::init_ui()
  516. {
  517. set_app_state(ST_STOPPED);
  518. m_listctrl_reader.SetColumnHeader(_T("分站号,60;分站地址,120;状态,60;"));
  519. m_listctrl_reader.SetGridLines(TRUE);
  520. m_listctrl_reader.SetEditable(FALSE);
  521. m_listctrl_reader.SetSortable(FALSE);
  522. Invalidate(FALSE);
  523. }
  524. void CYAServerDlg::set_app_state( EnAppState eas )
  525. {
  526. m_enState = eas;
  527. if(this->GetSafeHwnd() == nullptr)
  528. return;
  529. m_btStart.EnableWindow(m_enState == ST_STOPPED);
  530. m_btStop.EnableWindow(m_enState == ST_STARTED);
  531. //m_Close.EnableWindow(m_enState == ST_STARTED);
  532. //m_SycnTime.EnableWindow(m_enState == ST_STARTED);
  533. //m_HistoryData.EnableWindow(m_enState == ST_STARTED);
  534. }
  535. void CYAServerDlg::init_param()
  536. {
  537. ::SetMainWnd(this);
  538. ::SetInfoList(&m_list_log);
  539. dw_last_send_time = GetTickCount();
  540. m_time_last_rec = time(NULL);
  541. m_bListen = FALSE;
  542. m_nPort = PORT_SERVER_MASTER;
  543. m_nCountClick = 0;
  544. m_ws_url = TEST_WS_URL;
  545. time_over_count_person = time_over_count_vehicle = 0;
  546. is_server_ok = true;
  547. g_exit = false;
  548. InitializeCriticalSection(&m_csWriteLog);
  549. InitializeCriticalSection(&m_csRemoveSocket);
  550. //down_mine_count.count_vehicle = 0;
  551. //down_mine_count.count_person = 0;
  552. //down_mine_count.count_total = 0;
  553. //Anc1 = new Point2[3];
  554. //Anc1[0].x = 178;
  555. //Anc1[0].y = 182;
  556. //Anc1[1].x = Anc1[1].y = 650;
  557. //Anc1[2].x = 995;
  558. //Anc1[2].y = 190;
  559. //Anc1[0].x = 1.30;
  560. //Anc1[0].y = 1.77;
  561. //Anc1[1].x = 5.53;
  562. //Anc1[1].y = 5.36;
  563. //Anc1[2].x = 8.63;
  564. //Anc1[2].y = 1.60;
  565. //double x[3] = {1.18, 5.6, 8.61}; // 坐标
  566. //double y[3] = {1.58, 5.42, 1.52}; // 坐标
  567. //cal_locate.setAnchors(Anc1);
  568. //从配置中读取(regedit)
  569. load_param_from_ini();
  570. database_connect();
  571. ws_open();
  572. //UpdateData(FALSE);
  573. }
  574. void CYAServerDlg::stop_and_exit()
  575. {
  576. stop_tcp_server();
  577. //set_button_state(TRUE);
  578. ws_close();
  579. //m_listctrl_reader.DeleteAllItems();
  580. //if(m_bIsInit) //停止定时器(停止呼叫、通行侦测)
  581. // ::KillTimer(NULL, CLEAR_CALL_TIMER);
  582. //::KillTimer(NULL, CLEAR_PASS_TIMER);
  583. //{
  584. // //m_Comm.Stop(1);
  585. // //?m_Comm
  586. // ShowAppMessage("停止采集数据");
  587. // READER_EX_INFO *pCurReaderEx;
  588. // for(int i=0;i<MaxMineID;i++)
  589. // for(int j=1;j<MAXREADERCOUNT;j++)
  590. // {
  591. // pCurReaderEx=AllReaderData[j][i];
  592. // if(pCurReaderEx==NULL)//没有该分站
  593. // continue;
  594. // SaveReaderData(i,pCurReaderEx);//停止服务
  595. // }
  596. // //停止监听
  597. // m_bIsInit = FALSE;
  598. //}
  599. //if(m_bListen)
  600. //{
  601. // ClearListener();
  602. // ShowAppMessage("停止监听\n");
  603. // m_bListen=FALSE;
  604. //}
  605. g_exit = true;
  606. if(m_thread_monitor){
  607. WaitForSingleObject(m_thread_monitor->m_hThread,INFINITE);
  608. }
  609. m_thread_monitor = NULL;
  610. if(m_thread_timer){
  611. WaitForSingleObject(m_thread_timer->m_hThread, INFINITE);
  612. }
  613. m_thread_timer = NULL;
  614. DeleteCriticalSection(&m_csWriteLog);
  615. DeleteCriticalSection(&m_csRemoveSocket);
  616. }
  617. void CYAServerDlg::set_run_state()
  618. {
  619. m_uint_state = 0;
  620. if(!is_server_ok){
  621. m_uint_state |= 0x10; // 长时间未接收到采集数据(网络故障,采集故障)
  622. }
  623. //m_uKJ133State=0;
  624. //UINT uNoClient=0x0002;
  625. //UINT uClientError=0;
  626. //for(POSITION pos = m_connectionList.GetHeadPosition(); pos != NULL;)
  627. //{
  628. // CClientSocket* pSocket = (CClientSocket*)m_connectionList.GetNext(pos);
  629. // uNoClient=0;
  630. // if(pSocket->bError)
  631. // uClientError=0x0004;
  632. //}
  633. //m_uKJ133State |= uNoClient;
  634. //m_uKJ133State |= uClientError;
  635. //m_uKJ133State |= (m_bListen?0:0x0001);
  636. //m_uKJ133State |= uReaderError;
  637. //m_uKJ133State |= iMo;//0x0010,采集数据出问题 0x0000,没问题
  638. //if(g_DisconnectDB)
  639. // m_uKJ133State |=0x0100;
  640. //UINT uDBError=0;
  641. //UINT uDisconnect=0;
  642. //COleDateTime nowTime=COleDateTime::GetCurrentTime();
  643. //COleDateTimeSpan spDateTime;
  644. //spDateTime.SetDateTimeSpan(0,1,0,0);
  645. //if(g_LastDBErrorTime + spDateTime > nowTime)
  646. // uDBError=0x0200;
  647. //if(g_LastDisconnectTime + spDateTime > nowTime)
  648. // uDisconnect=0x0400;
  649. //m_uKJ133State |= uDBError;
  650. //m_uKJ133State |= uDisconnect;
  651. }
  652. int CYAServerDlg::init_staffer(string staff_id /* = "" */, bool is_card /*= false*/ )
  653. {
  654. CMysqlConn* pConn = NULL;
  655. CDBConnGuard pDbGuard(pConn);
  656. MYSQL_RES* pRes;
  657. MYSQL_ROW pRow;
  658. int err = 0;
  659. char buf[LENGTH_SQL] = {0};
  660. if(staff_id.length() == 0){
  661. sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \
  662. s.dept_id, s.group_id, s.occupation_id, \
  663. d.name as dname, g.name as gname, o.name as oname \
  664. FROM dat_staff s \
  665. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  666. LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \
  667. LEFT JOIN dat_group g ON s.group_id = g.group_id \
  668. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  669. WHERE c.card_type_id = 1 and s.state = 0;");
  670. }else if(is_card){
  671. sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \
  672. s.dept_id, s.group_id, s.occupation_id, \
  673. d.name as dname, g.name as gname, o.name as oname \
  674. FROM dat_staff s \
  675. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  676. LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \
  677. LEFT JOIN dat_group g ON s.group_id = g.group_id \
  678. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  679. WHERE c.card_type_id = 1 and s.state = 0 AND s.card_id = '%s';", staff_id.c_str());
  680. }else{
  681. sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \
  682. s.dept_id, s.group_id, s.occupation_id, \
  683. d.name as dname, g.name as gname, o.name as oname \
  684. FROM dat_staff s \
  685. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  686. LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \
  687. LEFT JOIN dat_group g ON s.group_id = g.group_id \
  688. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  689. WHERE c.card_type_id = 1 and s.state = 0 AND staffer_id = '%s';", staff_id.c_str());
  690. }
  691. pRes = pConn->Execute(buf, err);
  692. Card* pCard = NULL;
  693. int nRow = 0;
  694. while(pRow = mysql_fetch_row(pRes)) {
  695. CardMap::iterator it = mp_card_list_all.find(pRow[1]);
  696. if(it != mp_card_list_all.end()){
  697. pCard = it->second;
  698. }else{
  699. pCard = new Card(pRow[1], atoi(pRow[2]), theApp.z_offset);
  700. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  701. nRow++;
  702. }
  703. pCard->id = pRow[0];
  704. pCard->name = pRow[3];
  705. pCard->dept_id = atoi(pRow[4]);
  706. pCard->group_id = atoi(pRow[5]);
  707. pCard->department = pRow[7];
  708. pCard->group = pRow[8];
  709. pCard->occupation = pRow[9];
  710. }
  711. mysql_free_result(pRes);
  712. CString strlog;
  713. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_STAFF), nRow, _T(LOG_RECORD_COUNT));
  714. show_log(strlog);
  715. return 0;
  716. }
  717. int CYAServerDlg::init_vehicle(string vehicle_id /* = "" */, bool is_card /*= false*/)
  718. {
  719. CMysqlConn* pConn = NULL;
  720. CDBConnGuard pDbGuard(pConn);
  721. MYSQL_RES* pRes;
  722. MYSQL_ROW pRow;
  723. int err = 0;
  724. char buf[LENGTH_SQL] = {0};
  725. if(vehicle_id.length() == 0){
  726. sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  727. v.dept_id, v.group_id, v.vehicle_type_id, \
  728. d.name as dname, g.name as gname, vt.name as vtname \
  729. FROM dat_vehicle v \
  730. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  731. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  732. LEFT JOIN dat_group g ON v.group_id = g.group_id \
  733. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  734. WHERE c.card_type_id = 2 and v.state = 0;");
  735. }else if(is_card){
  736. sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  737. v.dept_id, v.group_id, v.vehicle_type_id, \
  738. d.name as dname, g.name as gname, vt.name as vtname \
  739. FROM dat_vehicle v \
  740. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  741. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  742. LEFT JOIN dat_group g ON v.group_id = g.group_id \
  743. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  744. WHERE c.card_type_id = 2 and v.state = 0 AND v.card_id ='%s';", vehicle_id.c_str());
  745. }else{
  746. sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  747. v.dept_id, v.group_id, v.vehicle_type_id, \
  748. d.name as dname, g.name as gname, vt.name as vtname \
  749. FROM dat_vehicle v \
  750. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  751. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  752. LEFT JOIN dat_group g ON v.group_id = g.group_id \
  753. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  754. WHERE c.card_type_id = 2 and v.state = 0 AND vehicle_id='%s';", vehicle_id.c_str());
  755. }
  756. pRes = pConn->Execute(buf, err);
  757. Card* pCard = NULL;
  758. int nRow = 0;
  759. while(pRow = mysql_fetch_row(pRes)){
  760. CardMap::iterator it = mp_card_list_all.find(pRow[1]);
  761. if(it != mp_card_list_all.end()){
  762. pCard = it->second;
  763. }else{
  764. pCard = new Card(pRow[1], atoi(pRow[2]), theApp.z_offset);
  765. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  766. nRow++;
  767. }
  768. pCard->id = (pRow[0] == NULL) ? "" : pRow[0];
  769. pCard->name = (pRow[3] == NULL) ? "" : pRow[3];
  770. pCard->number = (pRow[4] == NULL) ? "" : pRow[4];
  771. pCard->dept_id = atoi(pRow[5]);
  772. pCard->group_id = atoi(pRow[6]);
  773. pCard->department = (pRow[8] == NULL) ? "" : pRow[8];
  774. pCard->group = (pRow[9] == NULL) ? "" : pRow[9];
  775. pCard->worktype = (pRow[10] == NULL) ? "" : pRow[10];
  776. }
  777. mysql_free_result(pRes);
  778. CString strlog;
  779. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
  780. show_log(strlog);
  781. return 0;
  782. }
  783. int CYAServerDlg::init_map(int map_id /*= 0*/)
  784. {
  785. CMysqlConn* pConn = NULL;
  786. CDBConnGuard pDbGuard(pConn);
  787. MYSQL_ROW pRow;
  788. MYSQL_RES *pRes = NULL;
  789. int err = 0;
  790. char strsql[LENGTH_SQL] = {0};
  791. if(map_id == 0){
  792. sprintf_s(strsql, "SELECT map_id, name, scale FROM dat_map;");
  793. }else{
  794. sprintf_s(strsql, "SELECT map_id, name, scale FROM dat_map WHERE map_id = %d; ", map_id);
  795. }
  796. pRes = pConn->Execute(strsql, err);
  797. MapInfo* pMap = NULL;
  798. int nRow = 0;
  799. while(pRow = mysql_fetch_row(pRes)){
  800. MapInfoMap::iterator it = mp_map_list.find(atoi(pRow[0]));
  801. if(it != mp_map_list.end()){
  802. pMap = it->second;
  803. }else{
  804. pMap = new MapInfo();
  805. pMap->map_id = atoi(pRow[0]);
  806. mp_map_list.insert(make_pair(pMap->map_id, pMap));
  807. nRow++;
  808. }
  809. pMap->map_name = pRow[1];
  810. pMap->map_scale = atof(pRow[2]);
  811. }
  812. mysql_free_result(pRes);
  813. CString strlog;
  814. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_MAP), nRow, _T(LOG_RECORD_COUNT));
  815. show_log(strlog);
  816. return 0;
  817. }
  818. int CYAServerDlg::init_area(int area_id /* = 0 */)
  819. {
  820. CMysqlConn* pConn = NULL;
  821. CDBConnGuard pDbGuard(pConn);
  822. MYSQL_ROW pRow;
  823. MYSQL_RES *pRes = NULL;
  824. int err = 0;
  825. char strsql[LENGTH_SQL] = {0};
  826. if(area_id == 0){
  827. sprintf_s(strsql, "SELECT area_id, name, map_id, area_type_id, path, \
  828. over_count_person, over_count_vehicle, over_time_person, over_time_vehicle \
  829. FROM dat_area;");
  830. }else{
  831. sprintf_s(strsql, "SELECT area_id, name, map_id, area_type_id, path, \
  832. over_count_person, over_count_vehicle, over_time_person, over_time_vehicle \
  833. FROM dat_area WHERE area_id = %d; ", area_id);
  834. }
  835. pRes = pConn->Execute(strsql, err);
  836. Area* pArea = NULL;
  837. int nRow = 0;
  838. while(pRow = mysql_fetch_row(pRes)){
  839. AreaMap::iterator it = mp_area_list.find(atoi(pRow[0]));
  840. if(it != mp_area_list.end()){
  841. pArea = it->second;
  842. }else{
  843. pArea = new Area();
  844. pArea->area_id = atoi(pRow[0]);
  845. mp_area_list.insert(make_pair(pArea->area_id, pArea));
  846. nRow++;
  847. }
  848. pArea->map_id = atoi(pRow[2]);
  849. MapInfoMap::iterator map_it = mp_map_list.find(pArea->map_id);
  850. if(map_it != mp_map_list.end()){
  851. AreaMap::iterator area_it = map_it->second->map_area_list.find(pArea->area_id);
  852. if(area_it == map_it->second->map_area_list.end()){
  853. map_it->second->map_area_list.insert(make_pair(pArea->area_id, pArea));
  854. }
  855. }
  856. pArea->area_name = pRow[1];
  857. pArea->area_type_id = atoi(pRow[3]);
  858. pArea->path = pRow[4]; // 多边形
  859. pArea->over_count_person = atoi(pRow[5]);
  860. pArea->over_count_vehicle = atoi(pRow[6]);
  861. pArea->over_time_person = atoi(pRow[7]);
  862. pArea->under_time_vehicle = atoi(pRow[8]);
  863. pArea->init_border(pRow[4]);
  864. //pArea->x1 = atof(pRow[8]);
  865. //pArea->y1 = atof(pRow[9]);
  866. //pArea->z1 = atof(pRow[10]);
  867. //pArea->sr = atof(pRow[11]);
  868. }
  869. mysql_free_result(pRes);
  870. CString strlog;
  871. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_AREA), nRow, _T(LOG_RECORD_COUNT));
  872. show_log(strlog);
  873. return 0;
  874. }
  875. int CYAServerDlg::init_reader(int reader_id /* = 0 */)
  876. {
  877. // 从数据库中读取
  878. CMysqlConn* pConn = NULL;
  879. CDBConnGuard pDbGuard(pConn);
  880. MYSQL_ROW pRow;
  881. MYSQL_RES *pRes = NULL;
  882. int err = 0;
  883. char strsql[LENGTH_SQL] = {0};
  884. if(reader_id == 0){
  885. sprintf_s(strsql, "SELECT reader_id, map_id, area_id, name, x, y, z, angle, \
  886. state, ip, device_type_id, reader_type_id \
  887. FROM dat_reader WHERE state=0;");
  888. }else{
  889. sprintf_s(strsql, "SELECT reader_id, map_id, area_id, name, x, y, z, angle, \
  890. state, ip, device_type_id, reader_type_id \
  891. FROM dat_reader WHERE state=0 AND reader_id = %d; ", reader_id);
  892. }
  893. pRes = pConn->Execute(strsql, err);
  894. Reader* pReader = NULL;
  895. int nRow = 0;;
  896. while(pRow = mysql_fetch_row(pRes)) {
  897. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[0]));
  898. if(it != mp_reader_list.end()){
  899. pReader = it->second;
  900. }else{
  901. pReader = new Reader();
  902. pReader->reader_id = atoi(pRow[0]);
  903. mp_reader_list.insert(make_pair(pReader->reader_id, pReader));
  904. nRow++;
  905. }
  906. pReader->map_id = atoi(pRow[1]);
  907. MapInfoMap::iterator map_it = mp_map_list.find(pReader->map_id);
  908. if(map_it != mp_map_list.end()){
  909. ReaderMap::iterator reader_it = map_it->second->map_reader_list.find(pReader->reader_id);
  910. if(reader_it == map_it->second->map_reader_list.end()){
  911. map_it->second->map_reader_list.insert(make_pair(pReader->reader_id, pReader));
  912. }
  913. pReader->map_scale = map_it->second->map_scale;
  914. }
  915. pReader->area_id = atoi(pRow[2]);
  916. pReader->reader_name = pRow[3];
  917. pReader->reader_x = atof(pRow[4]);
  918. pReader->reader_y = atof(pRow[5]);
  919. pReader->reader_z = atof(pRow[6]);
  920. pReader->reader_angle = atof(pRow[7]) * M_PI /180;
  921. pReader->ip = pRow[9];
  922. pReader->device_type_id = atoi(pRow[10]);
  923. pReader->pos_state = atoi(pRow[11]);
  924. }
  925. mysql_free_result(pRes);
  926. CString strlog;
  927. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_READER), nRow, _T(LOG_RECORD_COUNT));
  928. show_log(strlog);
  929. return 0;
  930. }
  931. int CYAServerDlg::init_antenna(int reader_id /* = 0 */)
  932. {
  933. CMysqlConn* pConn = NULL;
  934. CDBConnGuard pDbGuard(pConn);
  935. MYSQL_ROW pRow;
  936. MYSQL_RES *pRes = NULL;
  937. int err = 0;
  938. char strsql[LENGTH_SQL] = {0};
  939. if(reader_id == 0){
  940. sprintf_s(strsql, "SELECT antenna_id, a.reader_id, reader_idx, a.x, a.y, a.z, a.angle \
  941. FROM dat_antenna a, dat_reader r \
  942. WHERE a.reader_id = r.reader_id;");
  943. }else{
  944. sprintf_s(strsql, "SELECT antenna_id, a.reader_id, reader_idx, a.x, a.y, a.z, a.angle \
  945. FROM dat_antenna a, dat_reader r \
  946. WHERE a.reader_id = r.reader_id AND reader_id = %d; ", reader_id);
  947. }
  948. pRes = pConn->Execute(strsql,err);
  949. int nRow = 0;
  950. while(pRow = mysql_fetch_row(pRes)){
  951. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[1]));
  952. if(it != mp_reader_list.end()){
  953. Antenna* ant = new Antenna();
  954. ant->antenna_id = atoi(pRow[0]);
  955. ant->antenna_x = atof(pRow[3]);
  956. ant->antenna_y = atof(pRow[4]);
  957. ant->antenna_z = atof(pRow[5]);
  958. ant->antenna_angle = atof(pRow[6]) * M_PI / 180.0;
  959. int idx = (atoi(pRow[2]) == 1) ? 0 : 1;
  960. it->second->ant[idx] = ant;
  961. nRow++;
  962. }
  963. }
  964. mysql_free_result(pRes);
  965. CString strlog;
  966. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ANTENNA), nRow, _T(LOG_RECORD_COUNT));
  967. show_log(strlog);
  968. return 0;
  969. }
  970. int CYAServerDlg::init_dev_adhoc( int reader_id /*= 0*/ )
  971. {
  972. CMysqlConn* pConn = NULL;
  973. CDBConnGuard pDbGuard(pConn);
  974. MYSQL_ROW pRow;
  975. MYSQL_RES *pRes = NULL;
  976. int err = 0;
  977. char strsql[LENGTH_SQL] = {0};
  978. if(reader_id == 0){
  979. sprintf_s(strsql, "select ad.adhoc_id, ad.reader_id, ad.idx, ad.x, ad.y, ad.z from dat_dev_adhoc ad, dat_reader r \
  980. where ad.reader_id = r.reader_id;");
  981. }else{
  982. sprintf_s(strsql, "select ad.adhoc_id, ad.reader_id, ad.idx, ad.x, ad.y, ad.z from dat_dev_adhoc ad, dat_reader r \
  983. where ad.reader_id = r.reader_id and ad.reader_id = %d; ", reader_id);
  984. }
  985. pRes = pConn->Execute(strsql,err);
  986. int nRow = 0;
  987. int idx = 0;
  988. while(pRow = mysql_fetch_row(pRes)){
  989. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[1]));
  990. if(it != mp_reader_list.end()){
  991. Adhoc* adhoc = new Adhoc();
  992. adhoc->adhoc_id = atoi(pRow[0]);
  993. adhoc->idx = atoi(pRow[2]);
  994. adhoc->x = atof(pRow[3]);
  995. adhoc->y = atof(pRow[4]);
  996. adhoc->z = atof(pRow[5]);
  997. idx = (adhoc->idx < ADHOC_COUNT)?adhoc->idx:0;
  998. it->second->adhoc[idx] = adhoc;
  999. nRow++;
  1000. }
  1001. }
  1002. mysql_free_result(pRes);
  1003. CString strlog;
  1004. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ADHOC), nRow, _T(LOG_RECORD_COUNT));
  1005. show_log(strlog);
  1006. return 0;
  1007. }
  1008. /*
  1009. * 函数名:init_all_readers_coverage
  1010. * 从数据库的dat_reader_path表中读取指定map_id和reader_id的地图范围集,
  1011. * 将此分站的地图范围集保存在分站类中的readerCoverage中;
  1012. * 如果指定了相同的地图范围集的reader_id,则直接将指定的reader_id的地图范围集赋值给此reader_id的地图范围集
  1013. * 然后将地图集赋值给station
  1014. *
  1015. *
  1016. * @param
  1017. * reader_id 分站id号
  1018. *
  1019. * @return
  1020. * -1,表示在分站map中未找到此分站信息或者未正常执行;0,表示正常执行
  1021. *
  1022. */
  1023. int CYAServerDlg::init_all_readers_coverage(int reader_id)
  1024. {
  1025. CMysqlConn* pConn = NULL;
  1026. CDBConnGuard pDbGuard(pConn);
  1027. //如果无可用数据库连接,不执行后续操作
  1028. if(pConn == NULL){
  1029. return -1;
  1030. }
  1031. char sql[LENGTH_SQL] = {0};
  1032. if(reader_id == 0){
  1033. sprintf_s(sql, "select p.same_config_reader,p.reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_17 p ,dat_reader r where p.reader_id = r.reader_id;");
  1034. }else{
  1035. sprintf_s(sql, "select same_config_reader,reader_id,idx,x,y,z,is_bezier from dat_reader_path_17 where reader_id = %d; ", reader_id);
  1036. }
  1037. MYSQL_RES* pRes = NULL;
  1038. MYSQL_ROW pRow;
  1039. int err = 0;
  1040. int nRow = 0;
  1041. //查询数据库
  1042. pRes = pConn->Execute(sql,err);
  1043. //从数据库获得信息赋给分站对象的地图集
  1044. while(pRow = mysql_fetch_row(pRes)){
  1045. int nReaderId = atoi(pRow[1]);
  1046. ReaderMap::iterator it = mp_reader_list.find(nReaderId);
  1047. int nSameConfigReader = atoi(pRow[0]);
  1048. int nIdx = atoi(pRow[2]);
  1049. //判断地图集信息是否可利用其它分站的覆盖范围,如果可用,则使用其它分站的覆盖范围
  1050. //-1表示不可用,否则表示可复用分站id号为nSameConfigReader的地图集覆盖范围
  1051. if(nSameConfigReader == -1){
  1052. _point p;
  1053. p.x = atof(pRow[3]);
  1054. p.y = atof(pRow[4]);
  1055. p.z = atof(pRow[5]);
  1056. it->second->readerCoveragePath.insert(make_pair(nIdx,p));
  1057. it->second->bIsInitCoverage = true;
  1058. nRow++;
  1059. }else{
  1060. it->second->readerCoveragePath = mp_reader_list.find(nSameConfigReader)->second->readerCoveragePath;
  1061. it->second->bIsInitCoverage = true;
  1062. nRow++;
  1063. }
  1064. }
  1065. mysql_free_result(pRes);
  1066. //输出操作数据库的日志信息
  1067. CString strlog;
  1068. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
  1069. show_log(strlog);
  1070. //根据获得地图集将其赋给mp_reader_path_list
  1071. ReaderMap::iterator it = mp_reader_list.begin();
  1072. for(it;it!=mp_reader_list.end();it++){
  1073. if(it->second->bIsInitCoverage){
  1074. int nReaderId = it->second->reader_id - 1;
  1075. double dMapScale = mp_map_list.find(it->second->map_id)->second->map_scale;
  1076. ReaderPath* pReaderPath = NULL;
  1077. ReaderPathMap::iterator prpIt = mp_reader_path_list.find(nReaderId);
  1078. if(prpIt != mp_reader_path_list.end()){
  1079. pReaderPath = prpIt->second;
  1080. }else{
  1081. pReaderPath = new ReaderPath();
  1082. mp_reader_path_list.insert(make_pair(nReaderId,pReaderPath));
  1083. }
  1084. pReaderPath->nRealCalcPoints = it->second->readerCoveragePath.size();
  1085. for(int i=0;i<2;i++){
  1086. pReaderPath->x[i] = it->second->ant[i]->antenna_x*dMapScale;
  1087. pReaderPath->y[i] = it->second->ant[i]->antenna_y*dMapScale;
  1088. pReaderPath->z[i] = it->second->ant[i]->antenna_z*dMapScale;
  1089. }
  1090. for(size_t j = 1;j <= it->second->readerCoveragePath.size(); j++){
  1091. pReaderPath->px[j - 1] = it->second->readerCoveragePath.find(j)->second.x*dMapScale;
  1092. pReaderPath->py[j - 1] = it->second->readerCoveragePath.find(j)->second.y*dMapScale;
  1093. pReaderPath->pz[j - 1] = it->second->readerCoveragePath.find(j)->second.z*dMapScale;
  1094. }
  1095. //以下对应与全局变量的数组形式的另一种实现
  1096. //初始化
  1097. /*station[nReaderId].nRealCalcPoints = 0;
  1098. for(int i=0;i<2;i++){
  1099. station[nReaderId].x[i] = 0;
  1100. station[nReaderId].y[i] = 0;
  1101. station[nReaderId].z[i] = 0;
  1102. }
  1103. for(int i=0;i<MAX_CALC_POINTS;i++){
  1104. station[nReaderId].px[i] = 0;
  1105. station[nReaderId].py[i] = 0;
  1106. station[nReaderId].pz[i] = 0;
  1107. }
  1108. //double dMapScale = mp_map_list.find(it->second->map_id)->second->map_scale;
  1109. station[nReaderId].nRealCalcPoints = it->second->readerCoveragePath.size();
  1110. for(int i=0;i<2;i++){
  1111. station[nReaderId].x[i] = it->second->ant[i]->antenna_x*dMapScale;
  1112. station[nReaderId].y[i] = it->second->ant[i]->antenna_y*dMapScale;
  1113. station[nReaderId].z[i] = it->second->ant[i]->antenna_z*dMapScale;
  1114. }
  1115. for(size_t j = 1;j <= it->second->readerCoveragePath.size(); j++){
  1116. station[nReaderId].px[j - 1] = it->second->readerCoveragePath.find(j)->second.x*dMapScale;
  1117. station[nReaderId].py[j - 1] = it->second->readerCoveragePath.find(j)->second.y*dMapScale;
  1118. station[nReaderId].pz[j - 1] = it->second->readerCoveragePath.find(j)->second.z*dMapScale;
  1119. }*/
  1120. }
  1121. }
  1122. return 0;
  1123. }
  1124. /*
  1125. * 函数名:init_tdoa_all_readers_coverage
  1126. * 实现初始化TDOA方式的地图集描述,并存储冗余数据
  1127. * 冗余数据的主要作用在于:例如存在分站<B1,B2>之间的地图集描述,那么也存在<B2,B1>的对应关系
  1128. *
  1129. * param
  1130. * reader_id ------ 分站id号
  1131. *
  1132. * return
  1133. * 如果执行失败返回-1
  1134. * 正确执行,返回0
  1135. *
  1136. */
  1137. int CYAServerDlg::init_tdoa_all_readers_coverage(int reader_id)
  1138. {
  1139. CMysqlConn* pConn = NULL;
  1140. CDBConnGuard pDbGuard(pConn);
  1141. //无可用数据库连接
  1142. if(pConn == NULL){
  1143. return -1;
  1144. }
  1145. char sql[LENGTH_SQL] = {0};
  1146. if(reader_id == 0){
  1147. sprintf_s(sql, "select p.start_reader_id,p.end_reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_tdoa p ,dat_reader r where p.start_reader_id = r.reader_id;");
  1148. }else{
  1149. sprintf_s(sql, "select start_reader_id,end_reader_id,idx,x,y,z,is_bezier from dat_reader_path_tdoa where reader_id = %d; ", reader_id);
  1150. }
  1151. MYSQL_RES* pRes = NULL;
  1152. MYSQL_ROW pRow;
  1153. int err = 0;
  1154. int nRow = 0;
  1155. //查询数据库
  1156. pRes = pConn->Execute(sql,err);
  1157. double mapScale = 0.0;
  1158. while(pRow = mysql_fetch_row(pRes)){
  1159. int start_reader_id = atoi(pRow[0]);
  1160. int end_reader_id = atoi(pRow[1]);
  1161. int ndx = atoi(pRow[2]);
  1162. //后缀_r都为冗余信息
  1163. ReaderPath* prp = NULL;
  1164. ReaderPath* prp_r = NULL;
  1165. TDOAReaderPathMap::iterator it = mp_reader_path_list_tdoa.find(start_reader_id);
  1166. if(it == mp_reader_path_list_tdoa.end()){
  1167. ReaderPathMap* prpm = new ReaderPathMap();
  1168. ReaderPath* prp1 = new ReaderPath();
  1169. prpm->insert(make_pair(end_reader_id,prp1));
  1170. mp_reader_path_list_tdoa.insert(make_pair(start_reader_id,*prpm));
  1171. //冗余数据
  1172. ReaderPathMap* prpm_r = new ReaderPathMap();
  1173. ReaderPath* prp1_r = new ReaderPath();
  1174. prpm_r->insert(make_pair(start_reader_id,prp1_r));
  1175. mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,*prpm_r));
  1176. }else{
  1177. ReaderPathMap::iterator it2;
  1178. it2 = it->second.find(end_reader_id);
  1179. if(it2 == it->second.end()){
  1180. ReaderPath* prp1 = new ReaderPath();
  1181. it->second.insert(make_pair(end_reader_id,prp1));
  1182. //冗余数据
  1183. ReaderPathMap* prpm_r = new ReaderPathMap();
  1184. ReaderPath* prp1_r = new ReaderPath();
  1185. prpm_r->insert(make_pair(start_reader_id,prp1_r));
  1186. mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,*prpm_r));
  1187. }
  1188. }
  1189. ReaderPathMap::iterator it_rpm = mp_reader_path_list_tdoa.find(start_reader_id)->second.find(end_reader_id);
  1190. if(it_rpm!=mp_reader_path_list_tdoa.find(start_reader_id)->second.end()){
  1191. prp = it_rpm->second;
  1192. }else{
  1193. prp = new ReaderPath();
  1194. }
  1195. //冗余信息
  1196. ReaderPathMap::iterator it_rpm_r = mp_reader_path_list_tdoa.find(end_reader_id)->second.find(start_reader_id);
  1197. if(it_rpm_r!=mp_reader_path_list_tdoa.find(end_reader_id)->second.end()){
  1198. prp_r = it_rpm_r->second;
  1199. }else{
  1200. prp_r = new ReaderPath();
  1201. }
  1202. //获得地图比例
  1203. int map_id = mp_reader_list.find(start_reader_id)->second->map_id;
  1204. MapInfoMap::iterator mit = mp_map_list.find(map_id);
  1205. if(mit == mp_map_list.end()){
  1206. //没有相关地图信息,要输出错误日志
  1207. AfxMessageBox(_T("分站所在地图不存在!"));
  1208. break;
  1209. }
  1210. mapScale = mp_map_list.find(map_id)->second->map_scale;
  1211. //获得分站坐标,其中索引0表示起始分站坐标,索引1表示结束分站坐标
  1212. prp->x[0] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale;
  1213. prp->y[0] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale;
  1214. prp->x[1] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale;
  1215. prp->y[1] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale;
  1216. prp->px[ndx-1] = atof(pRow[3])*mapScale;
  1217. prp->py[ndx-1] = atof(pRow[4])*mapScale;
  1218. prp->nRealCalcPoints++;
  1219. //冗余信息
  1220. prp_r->x[0] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale;
  1221. prp_r->y[0] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale;
  1222. prp_r->x[1] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale;
  1223. prp_r->y[1] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale;
  1224. prp_r->px[ndx-1] = atof(pRow[3])*mapScale;
  1225. prp_r->py[ndx-1] = atof(pRow[4])*mapScale;
  1226. prp_r->nRealCalcPoints++;
  1227. }
  1228. mysql_free_result(pRes);
  1229. //输出操作结果信息
  1230. CString strlog;
  1231. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
  1232. show_log(strlog);
  1233. return 0;
  1234. }
  1235. //int CYAServerDlg::init_adhoc( string adhoc_id /*= ""*/ )
  1236. //{
  1237. // CMysqlConn* pConn = NULL;
  1238. // CDBConnGuard pDbGuard(pConn);
  1239. // MYSQL_RES* pRes;
  1240. // MYSQL_ROW pRow;
  1241. // int err = 0;
  1242. // char buf[LENGTH_SQL] = {0};
  1243. // if(adhoc_id.length() == 0){
  1244. // sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  1245. // v.dept_id, v.group_id, v.vehicle_type_id, \
  1246. // d.name as dname, g.name as gname, vt.name as vtname, v.dept_id \
  1247. // FROM dat_vehicle v \
  1248. // LEFT JOIN dat_card c ON v.card_id = c.card_id \
  1249. // LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  1250. // LEFT JOIN dat_group g ON v.group_id = g.group_id \
  1251. // LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  1252. // WHERE c.card_type_id = 2 and v.state = 0;");
  1253. // }else{
  1254. // sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  1255. // v.dept_id, v.group_id, v.vehicle_type_id, \
  1256. // d.name as dname, g.name as gname, vt.name as vtname, v.dept_id \
  1257. // FROM dat_vehicle v \
  1258. // LEFT JOIN dat_card c ON v.card_id = c.card_id \
  1259. // LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  1260. // LEFT JOIN dat_group g ON v.group_id = g.group_id \
  1261. // LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  1262. // WHERE c.card_type_id = 2 and v.state = 0 AND vehicle_id='%s';", vehicle_id);
  1263. // }
  1264. // pRes = pConn->Execute(buf, err);
  1265. // Card* pCard = NULL;
  1266. // int nRow = 0;
  1267. // while(pRow = mysql_fetch_row(pRes)){
  1268. // CardMap::iterator it = mp_card_list_all.find(pRow[1]);
  1269. // if(it != mp_card_list_all.end()){
  1270. // pCard = it->second;
  1271. // }else{
  1272. // pCard = new Card(pRow[1], atoi(pRow[2]), theApp.z_offset, map_offset_x, map_offset_y);
  1273. // mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  1274. // nRow++;
  1275. // }
  1276. // pCard->id = (pRow[0] == NULL) ? "" : pRow[0];
  1277. // pCard->name = (pRow[3] == NULL) ? "" : pRow[3];
  1278. // pCard->number = (pRow[4] == NULL) ? "" : pRow[4];
  1279. // pCard->department = (pRow[8] == NULL) ? "" : pRow[8];
  1280. // pCard->group = (pRow[9] == NULL) ? "" : pRow[9];
  1281. // pCard->worktype = (pRow[10] == NULL) ? "" : pRow[10];
  1282. // pCard->dept_id = atoi(pRow[11]);
  1283. // }
  1284. // mysql_free_result(pRes);
  1285. // CString strlog;
  1286. // strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
  1287. // show_log(strlog);
  1288. // return 0;
  1289. //}
  1290. void CYAServerDlg::ws_init()
  1291. {
  1292. is_websocket_ok = false;
  1293. is_websocket_login = false;
  1294. using std::placeholders::_1;
  1295. using std::placeholders::_2;
  1296. using std::placeholders::_3;
  1297. using std::placeholders::_4;
  1298. socket::ptr sock = _io->socket();
  1299. //default socket opened, also we have "set_open_listener" for monitoring physical connection opened.
  1300. //sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnLoginMessage,this,_1,_2,_3,_4)));
  1301. sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnLogin, this, _1,_2,_3,_4)));
  1302. sock->on(JSON_CMD_VALUE_CALL, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnCallMessage,this,_1,_2,_3,_4)));
  1303. sock->on(JSON_CMD_VALUE_PUSH, sio::socket::event_listener(std::bind(&CYAServerDlg::OnPushMessage, this)));
  1304. //sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener(std::bind(&CYAServerDlg::OnLoginCallBack, this, std::placeholders::_1)));
  1305. _io->set_socket_open_listener(std::bind(&CYAServerDlg::OnConnected, this));
  1306. //physical connection closed or drop.
  1307. _io->set_close_listener(std::bind(&CYAServerDlg::OnClosed,this, std::placeholders::_1));
  1308. //physical connection fail to establish.
  1309. _io->set_fail_listener(std::bind(&CYAServerDlg::OnFailed,this));
  1310. }
  1311. void CYAServerDlg::ws_close()
  1312. {
  1313. //_io->socket()->off_all();
  1314. //_io->socket()->off_error();
  1315. }
  1316. void CYAServerDlg::ws_login()
  1317. {
  1318. USES_CONVERSION;
  1319. CC2UTF8 conv = (char*)get_json_login().c_str();
  1320. string szlogin = conv.c_str();
  1321. _io->socket()->emit(JSON_CMD_VALUE_USER, szlogin, [&](sio::message::list const& msglist){
  1322. message::ptr msg_ptr = msglist[0];
  1323. int n =(int)msg_ptr->get_map()["code"]->get_int();
  1324. is_websocket_login = (0 == n) ? true : false;
  1325. if(is_websocket_login){
  1326. CString strlog;
  1327. strlog.Format(_T("%s: %s"), _T(LOG_LOGIN_WEB_SERVER), CFunctions::c2wc(m_ws_url.c_str()));
  1328. show_log(strlog);
  1329. }
  1330. });
  1331. }
  1332. void CYAServerDlg::ws_logout()
  1333. {
  1334. send_json_data(JSON_CMD_VALUE_USER, get_json_logout().c_str());
  1335. CString strlog;
  1336. strlog.Format(_T("%s: %s"), _T(LOG_LOGOUT_WEB_SERVER), CFunctions::c2wc(m_ws_url.c_str()));
  1337. show_log(strlog);
  1338. }
  1339. void CYAServerDlg::start_tcp_server()
  1340. {
  1341. set_app_state(ST_STARTING);
  1342. if(_server.Start(LOCAL_ADDRESS, PORT_SERVER_MASTER))
  1343. {
  1344. ::LogServerStart(LOCAL_ADDRESS, PORT_SERVER_MASTER);
  1345. set_app_state(ST_STARTED);
  1346. }
  1347. else
  1348. {
  1349. ::LogServerStartFail(_server.GetLastError(), _server.GetLastErrorDesc());
  1350. set_app_state(ST_STOPPED);
  1351. }
  1352. }
  1353. void CYAServerDlg::stop_tcp_server()
  1354. {
  1355. set_app_state(ST_STOPPING);
  1356. if(_server.Stop()){
  1357. ::LogServerStop();
  1358. set_app_state(ST_STOPPED);
  1359. }
  1360. else{
  1361. ASSERT(FALSE);
  1362. }
  1363. }
  1364. void CYAServerDlg::clear_listener()
  1365. {
  1366. //SocketMap::iterator it_sock = mp_socket_list.begin();
  1367. //for(; it_sock != mp_socket_list.end();){
  1368. // it_sock->second->Close();
  1369. // mp_socket_list.erase(it_sock++);
  1370. //}
  1371. }
  1372. void CYAServerDlg::clear_all_list()
  1373. {
  1374. // 清空创建的对象
  1375. //mp_card_list_all.clear();
  1376. //mp_reader_list.clear();
  1377. //mp_area_list.clear();
  1378. //mp_map_list.clear();
  1379. }
  1380. void CYAServerDlg::parse_data(const BYTE *pData, int nLen, DWORD dwConnID)
  1381. {
  1382. CString strBuf;
  1383. formatByteArray(strBuf, (BYTE*)pData, nLen);
  1384. writeErrorLog(_T("RAW_SS"), strBuf, false);
  1385. WORD tmplen = 0;
  1386. SocketBufferMap::iterator it = mp_socket_buffer_list.find(dwConnID);
  1387. if(it != mp_socket_buffer_list.end()){ // 有此socket数据
  1388. if(0 == it->second->wReadLen){ // 新的数据包
  1389. memset(it->second->pData, 0, LENGTH_MSG_4K);
  1390. tmplen = MAKEWORD(pData[1], pData[0]) + sizeof(WORD); // 加上描述长度的两字节
  1391. it->second->wLen = tmplen;
  1392. if(tmplen > nLen){
  1393. tmplen = nLen;
  1394. }
  1395. memcpy(it->second->pData, pData, tmplen);
  1396. }else{ // 接着上一次收取
  1397. tmplen = min(nLen, it->second->wLen - it->second->wReadLen);
  1398. memcpy(&it->second->pData[it->second->wReadLen], pData, tmplen);
  1399. }
  1400. it->second->wReadLen += tmplen;
  1401. if(it->second->wReadLen >= it->second->wLen){ // 接收完毕
  1402. parse_data_receive(it->second->pData, it->second->wLen, dwConnID);
  1403. it->second->wReadLen = 0; // 重置
  1404. }
  1405. }else{ // 无此socket数据
  1406. _SOCKET_BUFFER* _sockbuf = new _SOCKET_BUFFER;
  1407. _sockbuf->wReadLen = 0;
  1408. _sockbuf->dwConnID = dwConnID;
  1409. _sockbuf->wLen = MAKEWORD(pData[1], pData[0]) + sizeof(WORD); // 加上描述长度的两个字节
  1410. memset(_sockbuf->pData, 0, LENGTH_MSG_4K);
  1411. memcpy(_sockbuf->pData, pData, nLen);
  1412. _sockbuf->wReadLen += nLen;
  1413. mp_socket_buffer_list.insert(make_pair(dwConnID, _sockbuf));
  1414. if(_sockbuf->wReadLen >= _sockbuf->wLen){
  1415. parse_data_receive(_sockbuf->pData, nLen, dwConnID);
  1416. _sockbuf->wReadLen = 0;
  1417. }
  1418. }
  1419. }
  1420. void CYAServerDlg::parse_data_receive(BYTE *pData, int nLen, DWORD dwConnID )
  1421. {
  1422. CString strBuf;
  1423. formatByteArray(strBuf, (BYTE*)pData, nLen);
  1424. writeErrorLog(_T("RAW_S"), strBuf, false);
  1425. int total_pos = 0;
  1426. WORD pkg_len = 0;
  1427. while(total_pos < nLen){ // 处理粘包
  1428. if(total_pos + sizeof(WORD) >= nLen){
  1429. int aa = 20;
  1430. //break;
  1431. }
  1432. pkg_len = MAKEWORD(pData[total_pos+1], pData[total_pos]); // 单个数据包长度
  1433. if(total_pos + pkg_len> nLen)
  1434. {
  1435. int aa = 20;
  1436. }
  1437. BYTE* DataBuffer = new BYTE[pkg_len];
  1438. memset(DataBuffer, 0, pkg_len);
  1439. memcpy(DataBuffer, &pData[total_pos + sizeof(WORD)], pkg_len); // 一个数据包
  1440. parse_package_data(DataBuffer, pkg_len, dwConnID); // 解析数据包
  1441. delete[] DataBuffer;
  1442. total_pos += pkg_len + sizeof(WORD); // 数据包长度 + 长度自身两个字节
  1443. }
  1444. }
  1445. void CYAServerDlg::parse_package_data( BYTE* DataBuffer, int nLen, DWORD dwConnID )
  1446. {
  1447. WORD wCrc = CFunctions::getCRC(&DataBuffer[0], nLen - sizeof(WORD)); // CRC校验码
  1448. WORD w ;
  1449. CString strBuf;
  1450. CFunctions::getWord(DataBuffer, &w, nLen - sizeof(WORD));
  1451. if( w != wCrc ){ // 校验不对
  1452. if(theApp.log_raw_data){
  1453. strBuf = _T("CRC校验不通过");
  1454. writeErrorLog(_T("RAW_S"), strBuf);
  1455. }
  1456. return;
  1457. }
  1458. int nCurPos = 0;
  1459. WORD wChr = 0;
  1460. CFunctions::getWord(DataBuffer, &wChr, nCurPos);
  1461. nCurPos += sizeof(WORD);
  1462. int reader_id = 0;
  1463. int nTick = 0;
  1464. CString strtime;
  1465. switch (wChr){
  1466. case CHAR_LOCATEDATA: // 定位数据
  1467. {
  1468. parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id);
  1469. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1470. parse_data_locate_card(DataBuffer, nCurPos, reader_id, wChr);
  1471. }
  1472. break;
  1473. }
  1474. case CHAR_LOCATEDATA_TDOA:
  1475. {
  1476. parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id);
  1477. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1478. parse_data_locate_card(DataBuffer, nCurPos, reader_id, wChr);
  1479. }
  1480. break;
  1481. }
  1482. case CHAR_LOCATEDATAHIS:
  1483. {
  1484. parse_data_locate_reader_his(DataBuffer, nLen, nCurPos, reader_id, nTick, strtime, wChr);
  1485. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1486. parse_data_locate_card_his(DataBuffer, nCurPos, reader_id, nTick, strtime, wChr);
  1487. }
  1488. break;
  1489. }
  1490. case CHAR_LOCATEDATAHIS_TDOA:
  1491. {
  1492. parse_data_locate_reader_his(DataBuffer, nLen, nCurPos, reader_id, nTick, strtime, wChr);
  1493. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1494. parse_data_locate_card_his(DataBuffer, nCurPos, reader_id, nTick, strtime, wChr);
  1495. }
  1496. }
  1497. case CHAR_TIMESYNC:
  1498. {
  1499. parse_data_reader_synctime(DataBuffer ,nLen ,nCurPos);
  1500. break;
  1501. }
  1502. case CHAR_ADHOC:
  1503. {
  1504. parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id);
  1505. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1506. parse_data_adhoc(DataBuffer, nCurPos, reader_id);
  1507. }
  1508. }
  1509. default:
  1510. //WriteInfoFile("未能解析的命令!");
  1511. break;
  1512. }
  1513. }
  1514. void CYAServerDlg::parse_data_locate_reader(BYTE * DataBuffer, int& nCurPos, int nLen, DWORD dwConnID, int& reader_id )
  1515. {
  1516. // 分站号
  1517. DWORD dwReaderID;
  1518. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  1519. nCurPos += sizeof(DWORD);
  1520. reader_id = dwReaderID;
  1521. //_SOCK* sock = get_socket_by_count(dwConnID);
  1522. //if(NULL == sock){ // 列表中不存在
  1523. // if(_server.Disconnect(dwConnID))
  1524. // ::LogDisconnect(dwConnID);
  1525. // else
  1526. // ::LogDisconnectFail(dwConnID);
  1527. // return;
  1528. //}
  1529. ReaderMap::iterator itReader = mp_reader_list.find(dwReaderID);
  1530. Reader* pReader;
  1531. if(itReader != mp_reader_list.end()){
  1532. pReader = itReader->second;
  1533. add_socket_to_list(dwConnID, reader_id);
  1534. }else{
  1535. pReader = new Reader();
  1536. pReader->reader_id = dwReaderID;
  1537. //mp_reader_list.insert(make_pair(dwReaderID, pReader)); // 只处理在数据库中维护的
  1538. }
  1539. // 接收数据时间
  1540. pReader->rec_time = time(NULL); // COleDateTime::GetTickCount();
  1541. m_time_last_rec = pReader->rec_time; // 更新最后信号时间
  1542. // 分站时间戳
  1543. WORD wTickCount = 0;
  1544. CFunctions::getWord(DataBuffer, &wTickCount, nCurPos);
  1545. nCurPos += sizeof(WORD);
  1546. pReader->tick_count = wTickCount;
  1547. // 分站时间
  1548. // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年
  1549. BYTE btSec = 0;
  1550. memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE));
  1551. nCurPos += sizeof(BYTE);
  1552. BYTE btMin = 0;
  1553. memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE));
  1554. nCurPos += sizeof(BYTE);
  1555. BYTE btHour = 0;
  1556. memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE));
  1557. nCurPos += sizeof(BYTE);
  1558. BYTE btDay = 0;
  1559. memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE));
  1560. nCurPos += sizeof(BYTE);
  1561. BYTE btWeek = 0;
  1562. memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE));
  1563. nCurPos += sizeof(BYTE);
  1564. BYTE btMonth = 0;
  1565. memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE));
  1566. nCurPos += sizeof(BYTE);
  1567. BYTE btYear = 0;
  1568. memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE));
  1569. nCurPos += sizeof(BYTE);
  1570. struct tm reader_time;
  1571. reader_time.tm_sec = btSec;
  1572. reader_time.tm_min = btMin;
  1573. reader_time.tm_hour = btHour;
  1574. reader_time.tm_mday = btDay;
  1575. reader_time.tm_wday = btWeek;
  1576. reader_time.tm_mon = btMonth - 1;
  1577. reader_time.tm_year = btYear + 100; // + 2000 - 1900
  1578. pReader->reader_time = mktime(&reader_time);
  1579. // 温度
  1580. BYTE btTemperature = 0;
  1581. memcpy(&btTemperature, &DataBuffer[nCurPos], sizeof(BYTE));
  1582. nCurPos += sizeof(BYTE);
  1583. pReader->temperature = btTemperature;
  1584. // 状态
  1585. WORD wState = 0;
  1586. CFunctions::getWord(DataBuffer, &wState, sizeof(WORD));
  1587. nCurPos += sizeof(WORD);
  1588. // pReader->state = wState;
  1589. if(theApp.log_parse_data){
  1590. CString strLog;
  1591. strLog.Format(_T("id:%d, n:%d, %.2d-%.2d-%.2d %.2d:%.2d:%.2d, tep:%d, sta:%d"),
  1592. dwReaderID, wTickCount, btYear, btMonth, btDay, btHour, btMin, btSec, btTemperature, wState);
  1593. writeErrorLog(_T("PARSE_S"), strLog);
  1594. }
  1595. }
  1596. void CYAServerDlg::parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr)
  1597. {
  1598. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  1599. if(it != mp_reader_list.end()){
  1600. // 卡类型
  1601. BYTE btCardType = 0;
  1602. memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE));
  1603. nCurPos += sizeof(BYTE);
  1604. // 卡号
  1605. DWORD dwCardId = 0;
  1606. CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos);
  1607. nCurPos += sizeof(DWORD);
  1608. // 获取标识卡编号, 3位卡类型 + 10位卡号
  1609. string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10);
  1610. Card* card = NULL;
  1611. CardMap::iterator it_card = mp_card_list_all.find(str_card_id);
  1612. if(it_card != mp_card_list_all.end()){
  1613. card = it_card->second;
  1614. }else{
  1615. card = new Card(str_card_id, btCardType, theApp.z_offset);
  1616. mp_card_list_all.insert(make_pair(str_card_id, card));
  1617. }
  1618. // 设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图
  1619. card->set_reader(it->second);
  1620. #ifdef ALGORITHM_TYPE_TOF
  1621. card->set_reader_path(&mp_reader_path_list);
  1622. #elif defined ALGORITHM_TYPE_TDOA
  1623. card->set_reader_path(&mp_reader_path_list_tdoa);
  1624. #endif
  1625. card->reader_tickcount = it->second->tick_count;
  1626. card->is_hist = false;
  1627. switch(btCardType)
  1628. {
  1629. case CT_VEHICLE:
  1630. parse_data_locate_card_vehicle(DataBuffer, nCurPos, card, wChr);
  1631. deal_card(card);
  1632. break;
  1633. case CT_PERSON:
  1634. {
  1635. break;
  1636. }
  1637. default:
  1638. {
  1639. //strBuf = "";
  1640. //strBuf.Format(_T("无法识别的卡类型:%d\r\n"), btCardType);
  1641. //return ;
  1642. break;
  1643. }
  1644. }
  1645. }
  1646. }
  1647. void CYAServerDlg::parse_data_locate_card_vehicle(BYTE* DataBuffer, int& nCurPos, Card* card, unsigned short wChr )
  1648. {
  1649. if(LT_READER == theApp.locate_type){
  1650. card->isdealed = false;
  1651. card->isreceive = true;
  1652. card->issent = false;
  1653. }
  1654. // 报文时间
  1655. WORD wCardTickCount;
  1656. CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos);
  1657. nCurPos += sizeof(WORD);
  1658. if(wCardTickCount == 14){
  1659. int sss = 13;
  1660. sss = wCardTickCount;
  1661. }
  1662. BYTE btTypeAndPower;
  1663. memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE));
  1664. nCurPos += sizeof(BYTE);
  1665. //报文类型
  1666. BYTE btType;
  1667. btType = (btTypeAndPower >>4) & 0x0F;
  1668. //电池电量
  1669. BYTE btPower;
  1670. btPower = btTypeAndPower & 0x0F;
  1671. //保留
  1672. nCurPos += sizeof(BYTE);
  1673. //加速度
  1674. BYTE btAcceleration;
  1675. memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE));
  1676. nCurPos += sizeof(BYTE);
  1677. //定位时间戳Tsp // 字序
  1678. LONG64 lTime1 = 0;
  1679. BYTE btTemp = 0;
  1680. int nRangingPos = nCurPos;
  1681. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  1682. nCurPos += sizeof(BYTE);
  1683. DWORD dwTemp = 0;
  1684. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  1685. nCurPos += sizeof(DWORD);
  1686. lTime1 = btTemp;
  1687. lTime1 = lTime1 << 32;
  1688. lTime1 |= ((long long)dwTemp & 0xffffffff);
  1689. // 距离
  1690. double dldist = CFunctions::getDistance(lTime1);
  1691. //dldist *= card->map_scale;
  1692. // 天线
  1693. BYTE btAntenna;
  1694. memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE));
  1695. nCurPos += sizeof(BYTE);
  1696. WORD wSyncNum = 0;
  1697. WORD wStrength = 0;
  1698. if(CHAR_LOCATEDATA_TDOA == wChr){
  1699. // 分站时间同步序列号
  1700. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  1701. nCurPos += sizeof(WORD);
  1702. // 信号强度
  1703. CFunctions::getWord(DataBuffer, &wStrength, nCurPos);
  1704. nCurPos += sizeof(WORD);
  1705. }
  1706. if(LT_COORDINATE == theApp.locate_type){
  1707. card->time_stamp = wCardTickCount;
  1708. card->ranging_type = btType;
  1709. card->power_state = btPower;
  1710. card->accelerate_state = btAcceleration;
  1711. card->flying_time = lTime1;
  1712. card->sync_num = wSyncNum;
  1713. card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1;
  1714. card->distance = dldist;
  1715. if(theApp.log_parse_data){
  1716. CString strLog;
  1717. strLog.Format(_T("id:%s, n:%d, type:%d, power:%d, acc:%d, flytime:%I64u, d:%f, ant:%d, syncnum:%d, strength:%d"),
  1718. CFunctions::c2wc(card->card_id.c_str()), wCardTickCount, btType, btPower, btAcceleration, lTime1, dldist, btAntenna, wSyncNum, wStrength);
  1719. writeErrorLog(_T("PARSE_S"), strLog, true);
  1720. }
  1721. }else if(LT_READER == theApp.locate_type){
  1722. if(card->time_stamp < 0xFF && card->time_stamp < wCardTickCount){
  1723. card->time_stamp = wCardTickCount;
  1724. card->ranging_type = btType;
  1725. card->power_state = btPower;
  1726. card->accelerate_state = btAcceleration;
  1727. card->flying_time = lTime1;
  1728. card->sync_num = wSyncNum;
  1729. card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1;
  1730. card->distance = dldist;
  1731. }else if(0xFF == card->time_stamp && wCardTickCount == 0){
  1732. card->time_stamp = wCardTickCount;
  1733. card->ranging_type = btType;
  1734. card->power_state = btPower;
  1735. card->accelerate_state = btAcceleration;
  1736. card->flying_time = lTime1;
  1737. card->sync_num = wSyncNum;
  1738. card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1;
  1739. card->distance = dldist;
  1740. }
  1741. }
  1742. }
  1743. void CYAServerDlg::parse_data_adhoc( BYTE* DataBuffer, int& nCurPos, int reader_id )
  1744. {
  1745. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  1746. if(it != mp_reader_list.end()){
  1747. // BYTE nlen = 0, nDeal = nCurPos;
  1748. // memcpy(&nlen, &DataBuffer[nCurPos], sizeof(BYTE));
  1749. // nCurPos += sizeof(BYTE);
  1750. // while (nlen > nCurPos - nDeal){
  1751. BYTE btCmd = 0;
  1752. memcpy(&btCmd, &DataBuffer[nCurPos], sizeof(BYTE));
  1753. nCurPos += sizeof(BYTE);
  1754. BYTE btDiret = (btCmd >> 6);
  1755. if(btDiret == 0x02){ // 只处理上传数据,0x00、0x03 保留,0x01下发数据,0x02上传数据
  1756. btCmd &= 0x3F; // 高两位为命令传递方向,上位机无用
  1757. BYTE btId = 0;
  1758. memcpy(&btId, &DataBuffer[nCurPos], sizeof(BYTE));
  1759. nCurPos += sizeof(BYTE);
  1760. BYTE btTickcount = 0;
  1761. memcpy(&btTickcount, &DataBuffer[nCurPos], sizeof(BYTE));
  1762. nCurPos += sizeof(BYTE);
  1763. BYTE btIdx = 0;
  1764. memcpy(&btIdx, &DataBuffer[nCurPos], sizeof(BYTE));
  1765. nCurPos += sizeof(BYTE);
  1766. if(btId != 0){
  1767. string str_card_id = CFunctions::getstrwithzero(CT_ADHOC, 3) + CFunctions::getstrwithzero(btId, 10);
  1768. Card* card = NULL;
  1769. CardMap::iterator it_card = mp_card_list_all.find(str_card_id);
  1770. if(it_card != mp_card_list_all.end()){
  1771. card = it_card->second;
  1772. }else{
  1773. card = new Card(str_card_id, CT_ADHOC, theApp.z_offset);
  1774. mp_card_list_all.insert(make_pair(str_card_id, card));
  1775. }
  1776. //设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图
  1777. card->set_reader(it->second);
  1778. if(it->second->adhoc[btIdx]){
  1779. card->x = it->second->adhoc[btIdx]->x;
  1780. card->y = it->second->adhoc[btIdx]->y;
  1781. card->z = it->second->adhoc[btIdx]->z;
  1782. }
  1783. if(btCmd & 0x01){ // 呼救
  1784. }else if(btCmd & 0x02){ // 呼叫应答,即呼叫成功
  1785. if(STATUS_NORMAL == card->status_call){
  1786. }
  1787. }else {
  1788. card->status_call = STATUS_NORMAL;
  1789. card->status_help = STATUS_NORMAL;
  1790. }
  1791. card->issent = false;
  1792. //if(card->status_help != btCmd){
  1793. // card->status_help = btCmd;
  1794. //}
  1795. deal_card(card);
  1796. }
  1797. }else{
  1798. nCurPos += 3 * sizeof(BYTE);
  1799. }
  1800. // }.
  1801. }
  1802. }
  1803. void CYAServerDlg::add_socket_to_list(DWORD dwConnID, DWORD reader_id )
  1804. {
  1805. TCHAR szAddress[40];
  1806. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  1807. USHORT usPort;
  1808. _server.GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort);
  1809. SocketMap::iterator itSock = mp_socket_list.find(szAddress);
  1810. if(itSock != mp_socket_list.end()){
  1811. itSock->second->dwConnID = dwConnID;
  1812. itSock->second->state = 0;
  1813. itSock->second->reader_id = reader_id;
  1814. }else{
  1815. _SOCK *sock = new _SOCK();
  1816. sock->sip = szAddress;
  1817. sock->dwConnID = dwConnID;
  1818. sock->state = 0;
  1819. sock->reader_id = reader_id;
  1820. mp_socket_list.insert(make_pair(szAddress, sock));
  1821. ::PostMessage(this->GetSafeHwnd(), MSG_REFRESH_IP_LIST, 0, 0);
  1822. }
  1823. }
  1824. void CYAServerDlg::remove_socket(DWORD dwConnID )
  1825. {
  1826. EnterCriticalSection(&m_csRemoveSocket);
  1827. bool bNeedRefresh = false;
  1828. SocketMap::iterator _sock = mp_socket_list.begin();
  1829. while(_sock != mp_socket_list.end()){
  1830. if(_sock->second->dwConnID == dwConnID){
  1831. mp_socket_list.erase(_sock++);
  1832. bNeedRefresh = true;
  1833. }else{
  1834. ++_sock;
  1835. }
  1836. }
  1837. if(bNeedRefresh){
  1838. ::PostMessage(this->GetSafeHwnd(), MSG_REFRESH_IP_LIST, 0, 0);
  1839. }
  1840. LeaveCriticalSection(&m_csRemoveSocket);
  1841. }
  1842. // 获取设备状态信息, 分站、红绿灯、道岔、扩音器
  1843. std::string CYAServerDlg::get_json_device_state()
  1844. {
  1845. char _time[STR_LEN_TIME];
  1846. struct tm local_time;
  1847. Json::Value root;
  1848. Json::Value state_maps;
  1849. MapInfoMap::iterator it_map = mp_map_list.begin();
  1850. int nn = 0;
  1851. for(; it_map != mp_map_list.end(); ++it_map){
  1852. Json::Value state_map;
  1853. Json::Value state_devs;
  1854. int n = 0;
  1855. ReaderMap::iterator it = mp_reader_list.begin();
  1856. for(; it != mp_reader_list.end(); ++it){
  1857. if(it->second->map_id != it_map->second->map_id) continue;
  1858. //if(it->second->state != it->second->state_old){
  1859. Json::Value state_dev;
  1860. state_dev[JSON_KEY_DEV_STATE_DEVICE_ID] = it->second->reader_id;
  1861. state_dev[JSON_KEY_DEV_STATE_STATE_DESC] = it->second->get_state_text();
  1862. state_dev[JSON_KEY_DEV_STATE_STATE] = it->second->state;
  1863. state_dev[JSON_KEY_DEV_STATE_DEVICE_TYPE_ID] = it->second->device_type_id;
  1864. localtime_s(&local_time, &it->second->rec_time);
  1865. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  1866. state_dev[JSON_KEY_DEV_STATE_TIME] = _time;
  1867. n++;
  1868. state_devs.append(state_dev);
  1869. it->second->state_old = it->second->state;
  1870. //}
  1871. }
  1872. if(n >0){
  1873. state_map[JSON_KEY_DEV_STATE_MAP_ID] = it_map->second->map_id;
  1874. state_map[JSON_KEY_DEV_STATE_DEVICES] = state_devs;
  1875. nn++;
  1876. state_maps.append(state_map);
  1877. }
  1878. }
  1879. if(nn>0){
  1880. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_DEV_STATE;
  1881. root[JSON_ROOT_KEY_DATA] = state_maps;
  1882. return root.toFastString();
  1883. }
  1884. return "";
  1885. }
  1886. std::string CYAServerDlg::get_json_alarm()
  1887. {
  1888. Json::Value root;
  1889. Json::Value data;
  1890. Json::Value _global;
  1891. Json::Value _areas;
  1892. Json::Value _readers;
  1893. Json::Value _staff;
  1894. Json::Value _vehicle;
  1895. unsigned int alarm_count = 0;
  1896. char _time[STR_LEN_TIME];
  1897. struct tm local_time;
  1898. // global
  1899. // 人员超员
  1900. alarm_count = mp_card_list_down_person.size();
  1901. if(alarm_count > sls_setting.over_count_person){ // if(time_over_count_person >0)
  1902. Json::Value alarm;
  1903. Json::Value detail;
  1904. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_PERSON;
  1905. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_count_person;
  1906. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  1907. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1908. _global.append(alarm);
  1909. }
  1910. // 车辆超员
  1911. alarm_count = mp_card_list_down_vehicle.size();
  1912. if(alarm_count > sls_setting.over_count_vehicle){
  1913. Json::Value alarm;
  1914. Json::Value detail;
  1915. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_VEHICLE;
  1916. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_count_vehicle;
  1917. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  1918. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1919. _global.append(alarm);
  1920. }
  1921. // 人员超时
  1922. alarm_count = mp_card_list_over_time_person.size();
  1923. if(alarm_count > 0){
  1924. Json::Value alarm;
  1925. Json::Value detail;
  1926. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_PERSON;
  1927. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_time_person;
  1928. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  1929. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1930. _global.append(alarm);
  1931. }
  1932. // 车辆超时
  1933. alarm_count = mp_card_list_over_time_vehicle.size();
  1934. if(alarm_count > 0){
  1935. Json::Value alarm;
  1936. Json::Value detail;
  1937. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE;
  1938. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_time_vehicle;
  1939. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  1940. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1941. _global.append(alarm);
  1942. }
  1943. // 车辆超速
  1944. alarm_count = mp_card_list_over_speed_vehicle.size();
  1945. if(alarm_count > 0){
  1946. Json::Value alarm;
  1947. Json::Value detail;
  1948. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE;
  1949. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_speed;
  1950. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  1951. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1952. _global.append(alarm);
  1953. }
  1954. // areas
  1955. // 人员超员
  1956. AreaMap::iterator it_area = mp_area_list.begin();
  1957. bool is_alarm = false;
  1958. for(; it_area != mp_area_list.end(); ++it_area){
  1959. is_alarm = false;
  1960. Json::Value area;
  1961. Json::Value alarms;
  1962. if(it_area->second->count_area_over_count_person > 0){
  1963. is_alarm = true;
  1964. Json::Value alarm;
  1965. Json::Value detail;
  1966. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_PERSON;
  1967. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_count_person;
  1968. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_person;
  1969. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1970. alarms.append(alarm);
  1971. }
  1972. if(it_area->second->count_area_over_count_vehicle > 0){
  1973. is_alarm = true;
  1974. Json::Value alarm;
  1975. Json::Value detail;
  1976. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_VEHICLE;
  1977. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_count_vehicle;
  1978. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_vehicle;
  1979. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1980. alarms.append(alarm);
  1981. }
  1982. if(it_area->second->count_area_over_time_person > 0){
  1983. is_alarm = true;
  1984. Json::Value alarm;
  1985. Json::Value detail;
  1986. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_PERSON;
  1987. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_time_person;
  1988. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_area_over_time_person;
  1989. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  1990. alarms.append(alarm);
  1991. }
  1992. if(it_area->second->count_area_over_time_vehicle > 0){
  1993. is_alarm = true;
  1994. Json::Value alarm;
  1995. Json::Value detail;
  1996. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE;
  1997. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_time_vehicle;
  1998. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_area_over_time_vehicle;
  1999. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2000. alarms.append(alarm);
  2001. }
  2002. if(it_area->second->count_area_forbidden_person > 0 || it_area->second->count_area_forbidden_vehicle > 0){
  2003. is_alarm = true;
  2004. Json::Value alarm;
  2005. Json::Value detail;
  2006. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_AREA_FORBIDDEN;
  2007. detail[JSON_KEY_ALARM_PERSON] = it_area->second->count_area_forbidden_person;
  2008. detail[JSON_KEY_ALARM_VEHICLE] = it_area->second->count_area_forbidden_vehicle;
  2009. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2010. alarms.append(alarm);
  2011. }
  2012. if(is_alarm){
  2013. area[JSON_KEY_ALARM_AREA_ID] = it_area->second->area_id;
  2014. area[JSON_KEY_ALARM_ALARMS] = alarms;
  2015. _areas.append(area);
  2016. }
  2017. }
  2018. // 分站
  2019. ReaderMap::iterator it_reader = mp_reader_list.begin();
  2020. alarm_count = 0;
  2021. for(; it_reader != mp_reader_list.end(); ++it_reader){
  2022. if (it_reader->second->state == STATUS_DEVICE_ERROR){
  2023. Json::Value alarm;
  2024. alarm[JSON_KEY_ALARM_READER_ID] = it_reader->second->reader_id;
  2025. alarm[JSON_KEY_ALARM_TYPE_ID] = ATID_READER;
  2026. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_READER);
  2027. if(it_alarm != mp_alarm_type_list.end()){
  2028. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2029. }
  2030. localtime_s(&local_time, &it_reader->second->rec_time);
  2031. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2032. //strftime(_time, STR_LEN_TIME, "%m-%d %H:%M", &local_time);
  2033. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2034. _readers.append(alarm);
  2035. }
  2036. }
  2037. CardMap::iterator it_staff = mp_card_list_down_person.begin();
  2038. for(; it_staff != mp_card_list_down_person.end(); ++it_staff){
  2039. if(it_staff->second->status_area_over_time == STATUS_NORMAL &&
  2040. it_staff->second->status_area_forbidden == STATUS_NORMAL &&
  2041. it_staff->second->status_over_time == STATUS_NORMAL &&
  2042. it_staff->second->status_power == STATUS_NORMAL) {
  2043. continue;
  2044. }
  2045. Json::Value alarms;
  2046. Json::Value staff;
  2047. if(it_staff->second->status_area_forbidden == STATUS_ERROR){
  2048. Json::Value alarm;
  2049. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_FORBIDDEN_PERSON);
  2050. if(it_alarm != mp_alarm_type_list.end()){
  2051. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2052. }
  2053. localtime_s(&local_time, &it_staff->second->time_area_forbidden);
  2054. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2055. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2056. alarms.append(alarm);
  2057. }
  2058. if(it_staff->second->status_area_over_time == STATUS_ERROR){
  2059. Json::Value alarm;
  2060. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_OVER_TIME_PERSON);
  2061. if(it_alarm != mp_alarm_type_list.end()){
  2062. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2063. }
  2064. localtime_s(&local_time, &it_staff->second->time_area_over_time);
  2065. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2066. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2067. alarms.append(alarm);
  2068. }
  2069. if(it_staff->second->status_over_time == STATUS_ERROR){
  2070. Json::Value alarm;
  2071. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_TIME_PERSON);
  2072. if(it_alarm != mp_alarm_type_list.end()){
  2073. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2074. }
  2075. localtime_s(&local_time, &it_staff->second->time_over_time);
  2076. strftime(_time, STR_LEN_TIME, "%m-%d %H:%M", &local_time);
  2077. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2078. alarms.append(alarm);
  2079. }
  2080. if(it_staff->second->status_power == STATUS_ERROR){
  2081. Json::Value alarm;
  2082. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_POWER);
  2083. if(it_alarm != mp_alarm_type_list.end()){
  2084. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2085. }
  2086. localtime_s(&local_time, &it_staff->second->time_low_power);
  2087. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2088. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2089. alarms.append(alarm);
  2090. }
  2091. if(alarms != NULL){
  2092. staff[JSON_KEY_ALARM_STAFFER_ID] = it_staff->second->id;
  2093. staff[JSON_KEY_ALARM_ALARMS] = alarms;
  2094. _staff.append(staff);
  2095. }
  2096. }
  2097. CardMap::iterator it_vehicle = mp_card_list_down_vehicle.begin();
  2098. for(; it_vehicle != mp_card_list_down_vehicle.end(); ++it_vehicle){
  2099. if(it_vehicle->second->status_area_forbidden == STATUS_NORMAL &&
  2100. it_vehicle->second->status_area_over_time == STATUS_NORMAL &&
  2101. it_vehicle->second->status_over_speed == STATUS_NORMAL &&
  2102. it_vehicle->second->status_over_time == STATUS_NORMAL &&
  2103. it_vehicle->second->status_power == STATUS_NORMAL ){
  2104. continue;
  2105. }
  2106. Json::Value alarms;
  2107. Json::Value vehichle;
  2108. if(it_vehicle->second->status_area_forbidden == STATUS_ERROR){
  2109. Json::Value alarm;
  2110. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_FORBIDDEN_VEHICLE);
  2111. if(it_alarm != mp_alarm_type_list.end()){
  2112. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2113. }
  2114. localtime_s(&local_time, &it_vehicle->second->time_area_forbidden);
  2115. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2116. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2117. alarms.append(alarm);
  2118. }
  2119. if(it_vehicle->second->status_area_over_time == STATUS_ERROR){
  2120. Json::Value alarm;
  2121. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_OVER_TIME_VEHICLE);
  2122. if(it_alarm != mp_alarm_type_list.end()){
  2123. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2124. }
  2125. localtime_s(&local_time, &it_vehicle->second->time_area_over_time);
  2126. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2127. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2128. alarms.append(alarm);
  2129. }
  2130. if(it_vehicle->second->status_over_time == STATUS_ERROR){
  2131. Json::Value alarm;
  2132. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_TIME_VEHICLE);
  2133. if(it_alarm != mp_alarm_type_list.end()){
  2134. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2135. }
  2136. localtime_s(&local_time, &it_vehicle->second->time_over_time);
  2137. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2138. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2139. alarms.append(alarm);
  2140. }
  2141. if(it_vehicle->second->status_power == STATUS_ERROR){
  2142. Json::Value alarm;
  2143. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_POWER);
  2144. if(it_alarm != mp_alarm_type_list.end()){
  2145. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2146. }
  2147. localtime_s(&local_time, &it_vehicle->second->time_low_power);
  2148. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2149. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2150. alarms.append(alarm);
  2151. }
  2152. if(it_vehicle->second->status_over_speed == STATUS_ERROR){
  2153. Json::Value alarm;
  2154. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_SPEED);
  2155. if(it_alarm != mp_alarm_type_list.end()){
  2156. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2157. }
  2158. localtime_s(&local_time, &it_vehicle->second->time_over_speed);
  2159. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2160. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2161. alarms.append(alarm);
  2162. }
  2163. if(alarms != NULL){
  2164. vehichle[JSON_KEY_ALARM_STAFFER_ID] = it_vehicle->second->id;
  2165. vehichle[JSON_KEY_ALARM_ALARMS] = alarms;
  2166. _vehicle.append(vehichle);
  2167. }
  2168. }
  2169. if(_global != NULL){
  2170. data[JSON_KEY_ALARM_GLOBAL] = _global;
  2171. }
  2172. if(_areas != NULL){
  2173. data[JSON_KEY_ALARM_AREA] = _areas;
  2174. }
  2175. if(_readers != NULL){
  2176. data[JSON_KEY_ALARM_READER] = _readers;
  2177. }
  2178. if(_staff != NULL){
  2179. data[JSON_KEY_ALARM_STAFF] = _staff;
  2180. }
  2181. if(_vehicle != NULL){
  2182. data[JSON_KEY_ALARM_VEHICLE] = _vehicle;
  2183. }
  2184. if(data != NULL){
  2185. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_ALARM;
  2186. root[JSON_ROOT_KEY_DATA] = data;
  2187. return root.toFastString();
  2188. }
  2189. return "";
  2190. }
  2191. std::string CYAServerDlg::get_json_postion()
  2192. {
  2193. Json::Value root;
  2194. Json::Value pos_map;
  2195. Json::Value pos_maps;
  2196. char _time[STR_LEN_TIME];
  2197. struct tm local_time;
  2198. Json::Value pos_card;
  2199. MapInfoMap::iterator it_map = mp_map_list.begin();
  2200. for(; it_map != mp_map_list.end(); ++it_map){
  2201. Json::Value pos_cards;
  2202. CardMap::iterator it = mp_card_list_all.begin();
  2203. for(; it != mp_card_list_all.end(); ++it){
  2204. /*if(!it->second->is_hist){
  2205. if(it->second->pos_state != DT_DOWN){
  2206. continue;
  2207. }
  2208. if(it->second->issent) {
  2209. continue;
  2210. }
  2211. if(it->second->map_id != it_map->second->map_id){
  2212. continue;
  2213. }
  2214. if(!it->second->isdealed){
  2215. continue;
  2216. }
  2217. }*/
  2218. it->second->isdealed = false;
  2219. it->second->issent = true;
  2220. pos_card[JSON_KEY_CARD_ID] = it->second->card_id;
  2221. pos_card[JSON_KEY_CARD_TYPE_ID] = it->second->card_type;
  2222. pos_card[JSON_KEY_CARD_NUM] = it->second->number;
  2223. localtime_s(&local_time, &it->second->down_time);
  2224. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2225. pos_card[JSON_KEY_DOWN_TIME] = _time;
  2226. pos_card[JSON_KEY_WORK_TIME] = CFunctions::getworktimebysec((int)difftime(time(NULL), it->second->down_time));
  2227. localtime_s(&local_time, &it->second->enter_area_time);
  2228. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2229. pos_card[JSON_KEY_ENTER_AREA_TIME] = _time;
  2230. pos_card[JSON_KEY_AREA_ID] = it->second->area_id;
  2231. pos_card[JSON_KEY_STATE_DESC] = it->second->get_state_text();
  2232. pos_card[JSON_KEY_STATE] = it->second->state;
  2233. pos_card[JSON_KEY_MOVING_STATE] = it->second->get_acc_text();
  2234. //ctime_s(_time, 30, &(it->second->rev_time));
  2235. //struct tm *local_time = NULL;
  2236. localtime_s(&local_time, &it->second->rec_time);
  2237. //local_time = localtime(&it->second->rev_time);
  2238. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  2239. //strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", localtime(&it->second->rev_time));
  2240. pos_card[JSON_KEY_REC_TIME] = _time;
  2241. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2);
  2242. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2);
  2243. pos_card[JSON_KEY_CORDINATE_Z] = 0;// it->second->z;
  2244. pos_card[JSON_KEY_AREA_ID] = it->second->area_id;
  2245. pos_card[JSON_KEY_DEPT_ID] = it->second->dept_id;
  2246. pos_card[JSON_KEY_MAP_ID] = it->second->map_id;
  2247. pos_card[JSON_KEY_SPEED] = it->second->v;
  2248. //localtime_s(&local_time, &it->second->up_time);
  2249. //strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2250. //pos_card[JSON_KEY_UP_TIME] = _time;
  2251. //localtime_s(&local_time, &it->second->enter_reader_time);
  2252. //strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2253. //pos_card[JSON_KEY_ENTER_READER_TIME] = _time;
  2254. //pos_card[JSON_KEY_MAP_ID] = it->second->p_reader->map_id;
  2255. pos_cards.append(pos_card);
  2256. }
  2257. if(!pos_cards.isNull()){
  2258. pos_map[JSON_KEY_MAP_ID] = it_map->second->map_id;
  2259. pos_map[JSON_KEY_POS_CARD] = pos_cards;
  2260. pos_maps.append(pos_map);
  2261. }
  2262. }
  2263. std::string ret = "";
  2264. if(! pos_maps.isNull()){
  2265. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP;
  2266. root[JSON_ROOT_KEY_DATA] = pos_maps;
  2267. root[JSON_ROOT_KEY_DIFF_TICK_COUNT] = (int)g_diffTickCount;
  2268. ret = root.toFastString();
  2269. }
  2270. return ret;
  2271. }
  2272. std::string CYAServerDlg::get_json_postion_all()
  2273. {
  2274. Json::Value root;
  2275. Json::Value pos_map;
  2276. Json::Value pos_maps;
  2277. Json::Value pos_card;
  2278. char _time[STR_LEN_TIME];
  2279. struct tm local_time;
  2280. MapInfoMap::iterator it_map = mp_map_list.begin();
  2281. for(; it_map != mp_map_list.end(); ++it_map){
  2282. Json::Value pos_cards;
  2283. CardMap::iterator it = mp_card_list_all.begin();
  2284. for(; it != mp_card_list_all.end(); ++it){
  2285. if(it->second->map_id != it_map->second->map_id){
  2286. continue;
  2287. }
  2288. it->second->issent = true;
  2289. pos_card[JSON_KEY_CARD_ID] = it->second->card_id;
  2290. pos_card[JSON_KEY_CARD_TYPE_ID] = it->second->card_type;
  2291. pos_card[JSON_KEY_CARD_NUM] = it->second->id;
  2292. localtime_s(&local_time, &it->second->down_time);
  2293. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2294. pos_card[JSON_KEY_DOWN_TIME] = _time;
  2295. pos_card[JSON_KEY_WORK_TIME] = CFunctions::getworktimebysec((int)difftime(time(NULL), it->second->down_time));
  2296. localtime_s(&local_time, &it->second->enter_area_time);
  2297. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2298. pos_card[JSON_KEY_ENTER_AREA_TIME] = _time;
  2299. pos_card[JSON_KEY_AREA_ID] = it->second->area_id;
  2300. pos_card[JSON_KEY_STATE] = it->second->state;
  2301. localtime_s(&local_time, &it->second->rec_time);
  2302. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2303. pos_card[JSON_KEY_REC_TIME] = _time;
  2304. pos_card[JSON_KEY_CORDINATE_X] = it->second->x;
  2305. pos_card[JSON_KEY_CORDINATE_Y] = it->second->y;
  2306. pos_card[JSON_KEY_CORDINATE_Z] = 0; //it->second->z;
  2307. pos_card[JSON_KEY_AREA_ID] = it->second->area_id;
  2308. pos_card[JSON_KEY_DEPT_ID] = it->second->dept_id;
  2309. pos_card[JSON_KEY_MAP_ID] = it->second->map_id;
  2310. pos_card[JSON_KEY_SPEED] = it->second->v;
  2311. pos_cards.append(pos_card);
  2312. }
  2313. pos_map[JSON_KEY_MAP_ID] = it_map->second->map_id;
  2314. pos_map[JSON_KEY_POS_CARD] = pos_cards;
  2315. pos_maps.append(pos_map);
  2316. }
  2317. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP;
  2318. root[JSON_ROOT_KEY_DATA] = pos_maps;
  2319. return root.toFastString();
  2320. }
  2321. //std::string CYAServerDlg::get_json_postion_test()
  2322. //{
  2323. // Json::Value root;
  2324. // Json::Value valStaffer;
  2325. // Json::Value valStaffers;
  2326. // Json::Value valDist;
  2327. // Json::Value valDists;
  2328. // Json::Value valReaders;
  2329. // Json::Value valReader;
  2330. // int nCnt = 0;
  2331. // std::string strJson;
  2332. // for(CardMap::iterator it = mp_card_list_all.begin(); it != mp_card_list_all.end(); ++it){
  2333. // if(!it->second->isreceive) continue;
  2334. // it->second->isreceive = false;
  2335. // valStaffer["id"] = it->second->card_id;
  2336. // valStaffer["x"] = it->second->x;
  2337. // valStaffer["y"] = it->second->y;
  2338. // int n = it->second->get_effictive_dist_count();
  2339. // for(int i=0; i < n; i++){
  2340. // valDist["reader_id"] = it->second->p_dists[i]->reader_id;
  2341. // valDist["dist"] = (int)it->second->p_dists[i]->d;
  2342. // valDist["x"] = (int)it->second->p_dists[i]->x;
  2343. // valDist["y"] = (int)it->second->p_dists[i]->y;
  2344. // valDists.append(valDist);
  2345. // }
  2346. // valStaffer["dists"] = valDists;
  2347. // valStaffers.append(valStaffer);
  2348. // nCnt++;
  2349. // }
  2350. //
  2351. // root["staffer"] = valStaffers;
  2352. //
  2353. // ReaderMap::iterator itReader = mp_reader_list.begin();
  2354. // for(; itReader != mp_reader_list.end(); ++itReader)
  2355. // {
  2356. // valReader["id"] = itReader->second->reader_id;
  2357. // valReader["x"] = itReader->second->reader_x;
  2358. // valReader["y"] = itReader->second->reader_y;
  2359. // valReaders.append(valReader);
  2360. // }
  2361. //
  2362. // root["reader"] = valReaders;
  2363. //
  2364. // if(nCnt == 0)
  2365. // return "";
  2366. // strJson = root.toFastString();
  2367. // return strJson;
  2368. //}
  2369. std::string CYAServerDlg::get_json_login()
  2370. {
  2371. Json::Value root;
  2372. Json::Value data;
  2373. data[JSON_KEY_USERNAME] = JSON_VALUE_USERNAME;
  2374. data[JSON_KEY_PASSWORD] = JSON_VALUE_PASSWORD;
  2375. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_LOGIN;
  2376. root[JSON_ROOT_KEY_DATA] = data;
  2377. return root.toFastString();
  2378. }
  2379. std::string CYAServerDlg::get_json_logout()
  2380. {
  2381. Json::Value root;
  2382. Json::Value data;
  2383. //data[JSON_KEY_USERNAME] = JSON_VALUE_USERNAME;
  2384. data["name"] = JSON_VALUE_USERNAME;
  2385. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_LOGOUT;
  2386. //root[JSON_ROOT_KEY_DATA] = data;
  2387. root["user"] = data;
  2388. return root.toFastString();
  2389. }
  2390. //std::string CYAServerDlg::get_json_down_mine(Card* card)
  2391. //{
  2392. //
  2393. // return "";
  2394. //}
  2395. //
  2396. //std::string CYAServerDlg::get_json_up_mine(Card* card)
  2397. //{
  2398. // return "";
  2399. //}
  2400. void CYAServerDlg::send_json_data(string cmd, string data, bool is_login /* = false*/)
  2401. {
  2402. DWORD dw, dw1;
  2403. USES_CONVERSION;
  2404. CC2UTF8 conv = (char*)data.c_str();
  2405. string utf8_data = conv.c_str();
  2406. CString strlog;
  2407. if(is_login){
  2408. if(is_websocket_ok){
  2409. _io->socket()->emit(cmd, utf8_data);
  2410. is_websocket_login = true;
  2411. strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), _T("登录数据"));
  2412. show_log(strlog);
  2413. }
  2414. }else if(is_websocket_login){
  2415. strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), _T("常规数据"));
  2416. show_log(strlog);
  2417. _io->socket()->emit(cmd, utf8_data);
  2418. if(theApp.log_send_event){
  2419. writeErrorLog(L"JSON_S", CFunctions::c2wc(data.c_str()));
  2420. }
  2421. }
  2422. //strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), CFunctions::c2wc(cmd.c_str()));
  2423. //show_log(strlog);
  2424. dw = GetTickCount();
  2425. g_diffTickCount = dw - g_tickcount;
  2426. TRACE(_T("%d\r\n"), dw - g_tickcount );
  2427. g_tickcount = dw;
  2428. }
  2429. // 处理分站状态
  2430. void CYAServerDlg::deal_readers()
  2431. {
  2432. ReaderMap::iterator it = mp_reader_list.begin();
  2433. for(; it != mp_reader_list.end(); ++ it){
  2434. int ndiff = (int)difftime(time(NULL), it->second->rec_time);
  2435. if(STATUS_DEVICE_ERROR == it->second->state){ // 异常
  2436. if(ndiff < READER_TIMEOUT){ // 恢复正常
  2437. store_data_reader(it->second, ALARM_READER_LOST_END);
  2438. it->second->state = STATUS_DEVICE_NORMAL;
  2439. }
  2440. }else{
  2441. if(ndiff >= READER_TIMEOUT){ //异常
  2442. it->second->state = STATUS_DEVICE_ERROR;
  2443. it->second->lost_time = time(NULL);
  2444. store_data_reader(it->second, ALARM_READER_LOST_START);
  2445. }
  2446. }
  2447. }
  2448. }
  2449. void CYAServerDlg::deal_areas()
  2450. {
  2451. // 区域人数,区域超员数,区域超时数
  2452. int count_person, count_vehicle, count_total, count_over_time_person, count_over_time_vehicle;
  2453. int over_time_vehicle, over_time_person, over_time;
  2454. time_t current_time(time(NULL));
  2455. AreaMap::iterator it_Area = mp_area_list.begin();
  2456. bool is_true;
  2457. for(; it_Area != mp_area_list.end(); ++it_Area){
  2458. count_person = count_vehicle = count_total = count_over_time_vehicle = count_over_time_person = 0;
  2459. over_time_person = it_Area->second->over_time_person * 60; // 转为秒
  2460. over_time_vehicle = it_Area->second->over_time_vehicle * 60; // 转为秒
  2461. over_time = over_time_person;
  2462. // 遍历卡,计数
  2463. CardMap::iterator it_card_person = it_Area->second->area_card_list_person.begin();
  2464. for(; it_card_person != it_Area->second->area_card_list_person.end(); ++it_card_person){
  2465. // 计数
  2466. count_total++;
  2467. count_person++;
  2468. // 超时
  2469. is_true = difftime(current_time, it_card_person->second->enter_area_time) > over_time;
  2470. if(is_true){
  2471. if(!it_card_person->second->is_area_over_time){
  2472. it_card_person->second->is_area_over_time = true;
  2473. it_card_person->second->time_area_over_time = current_time;
  2474. store_data_card(it_card_person->second, ALARM_CARD_OVER_TIME_AREA_START);
  2475. deal_alarm_card(it_card_person->second, &mp_card_list_area_over_time_person, is_true, AF_CARD_AREA_OVER_TIME);
  2476. }
  2477. over_time_person++;
  2478. }else if(it_card_person->second->is_area_over_time){ // 理论上不会走这条分支,应该走cards_leave_area()
  2479. it_card_person->second->is_area_over_time = false;
  2480. deal_alarm_card(it_card_person->second, &mp_card_list_area_over_time_person, is_true, AF_CARD_AREA_OVER_TIME);
  2481. }
  2482. }
  2483. over_time = over_time_vehicle;
  2484. CardMap::iterator it_card_vehicle = it_Area->second->area_card_list_vehicle.begin();
  2485. for(;it_card_vehicle != it_Area->second->area_card_list_vehicle.end(); ++it_card_vehicle){
  2486. // 计数
  2487. count_total++;
  2488. // 区域超速,暂无此逻辑
  2489. count_vehicle++;
  2490. // 超时
  2491. if(difftime(current_time, it_card_vehicle->second->enter_area_time) > over_time){
  2492. if(!it_card_vehicle->second->is_area_over_time){
  2493. it_card_vehicle->second->is_area_over_time = true;
  2494. it_card_vehicle->second->time_area_over_time = current_time;
  2495. store_data_card(it_card_person->second, ALARM_CARD_OVER_TIME_AREA_START);
  2496. deal_alarm_card(it_card_vehicle->second, &mp_card_list_area_over_time_vehicle, is_true, AF_CARD_AREA_OVER_TIME);
  2497. }
  2498. over_time_vehicle++;
  2499. }else if(it_card_vehicle->second->is_area_over_time){ // 理论上不会走这条分支,应该走cards_leave_area()
  2500. it_card_vehicle->second->is_area_over_time = false;
  2501. deal_alarm_card(it_card_vehicle->second, &mp_card_list_area_over_time_vehicle, is_true, AF_CARD_AREA_OVER_TIME);
  2502. }
  2503. }
  2504. it_Area->second->count_person = count_person;
  2505. it_Area->second->count_vehicle = count_vehicle;
  2506. it_Area->second->count_area_over_time_person = count_over_time_person;
  2507. it_Area->second->count_area_over_time_vehicle = count_over_time_vehicle;
  2508. // 区域禁入 人员
  2509. if(it_Area->second->over_count_person == 0){
  2510. if(count_person > 0){
  2511. if(!it_Area->second->is_area_forbidden_person){
  2512. it_Area->second->is_area_forbidden_person = true;
  2513. it_Area->second->count_area_forbidden_person = count_person;
  2514. it_Area->second->time_forbidden_person = current_time;
  2515. store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_FORBIDDEN_PERSON_START);
  2516. deal_alarm_area(it_Area->second, &mp_area_forbidden_person, true, AF_AREA_FORBIDDEN);
  2517. }
  2518. }else{
  2519. if(it_Area->second->is_area_forbidden_person){
  2520. it_Area->second->is_area_forbidden_person = false; // 结束报警
  2521. store_data_area(it_Area->second, current_time, it_Area->second->time_forbidden_person, ALARM_AREA_FORBIDDEN_PERSON_END);
  2522. deal_alarm_area(it_Area->second, &mp_area_forbidden_person, false, AF_AREA_FORBIDDEN);
  2523. }
  2524. }
  2525. } else {
  2526. if(count_person > it_Area->second->over_count_person ){ // 区域人员超员
  2527. if(!it_Area->second->is_area_over_count_person){
  2528. it_Area->second->is_area_over_count_person = true;
  2529. it_Area->second->count_area_over_count_person = count_person - it_Area->second->over_count_person;
  2530. it_Area->second->time_over_count_person = current_time;
  2531. store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_OVER_COUNT_PERSON_START);
  2532. deal_alarm_area(it_Area->second, &mp_area_over_count_person, true, AF_AREA_OVER_COUNT);
  2533. }
  2534. }else{
  2535. if(it_Area->second->is_area_over_count_person){ // 结束超员
  2536. it_Area->second->is_area_over_count_person = false;
  2537. store_data_area(it_Area->second, current_time, it_Area->second->time_over_count_person, ALARM_AREA_OVER_COUNT_PERSON_END);
  2538. deal_alarm_area(it_Area->second, &mp_area_over_count_person, false, AF_AREA_OVER_COUNT);
  2539. }
  2540. }
  2541. // 区域人员超时
  2542. if(count_over_time_person > 0){
  2543. if(!it_Area->second->is_area_over_time_person){
  2544. it_Area->second->is_area_over_time_person = true;
  2545. it_Area->second->time_over_time_person = current_time;
  2546. deal_alarm_area(it_Area->second, &mp_area_over_time_person, true, AF_AREA_OVER_TIME);
  2547. }
  2548. }else{
  2549. if(it_Area->second->is_area_over_time_person){ // 结束
  2550. it_Area->second->is_area_over_time_person = false;
  2551. deal_alarm_area(it_Area->second, &mp_area_over_time_person, false, AF_AREA_OVER_TIME);
  2552. }
  2553. }
  2554. }
  2555. // 区域禁入 车辆
  2556. if(it_Area->second->over_count_vehicle == 0){
  2557. if(count_vehicle > 0){
  2558. if(!it_Area->second->is_area_forbidden_vehicle){
  2559. it_Area->second->is_area_forbidden_vehicle = true;
  2560. it_Area->second->count_area_forbidden_vehicle = count_vehicle;
  2561. it_Area->second->time_forbidden_vehicle = current_time;
  2562. store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_FORBIDDEN_VEHICLE_START);
  2563. deal_alarm_area(it_Area->second, &mp_area_forbidden_vehicle, true, AF_AREA_FORBIDDEN);
  2564. }
  2565. }else{
  2566. if(it_Area->second->is_area_forbidden_vehicle){
  2567. it_Area->second->is_area_forbidden_vehicle = false; // 结束报警
  2568. store_data_area(it_Area->second, current_time, it_Area->second->time_forbidden_vehicle, ALARM_AREA_FORBIDDEN_VEHICLE_END);
  2569. deal_alarm_area(it_Area->second, &mp_area_forbidden_vehicle, false, AF_AREA_FORBIDDEN);
  2570. }
  2571. }
  2572. }else {
  2573. if(count_vehicle > it_Area->second->over_count_vehicle){ // 区域车辆超员
  2574. if(!it_Area->second->is_area_over_count_vehicle){
  2575. it_Area->second->is_area_over_count_vehicle = true;
  2576. it_Area->second->count_area_over_count_vehicle = count_vehicle - it_Area->second->over_count_vehicle;
  2577. it_Area->second->time_over_count_vehicle = current_time;
  2578. store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_OVER_COUNT_VEHICLE_START);
  2579. deal_alarm_area(it_Area->second, &mp_area_over_count_vehicle, true, AF_AREA_OVER_COUNT);
  2580. }
  2581. }else{
  2582. it_Area->second->is_area_over_count_vehicle = false; // 结束
  2583. store_data_area(it_Area->second, current_time, it_Area->second->time_over_count_vehicle, ALARM_AREA_OVER_COUNT_VEHICLE_END);
  2584. deal_alarm_area(it_Area->second, &mp_area_over_count_vehicle, false, AF_AREA_OVER_COUNT);
  2585. }
  2586. // 区域车辆超时
  2587. if(count_over_time_vehicle > 0){
  2588. if(!it_Area->second->is_area_over_time_vehicle){
  2589. it_Area->second->is_area_over_time_vehicle = true;
  2590. it_Area->second->time_over_time_vehicle = current_time;
  2591. deal_alarm_area(it_Area->second, &mp_area_over_time_vehicle, true, AF_AREA_OVER_TIME);
  2592. }
  2593. }else{
  2594. if(it_Area->second->is_area_over_time_vehicle){ // 结束
  2595. it_Area->second->is_area_over_time_vehicle = false;
  2596. deal_alarm_area(it_Area->second, &mp_area_over_time_vehicle, false, AF_AREA_OVER_TIME);
  2597. // 写入数据库
  2598. }
  2599. }
  2600. }
  2601. }
  2602. }
  2603. void CYAServerDlg::deal_card( Card* card, bool is_hist )
  2604. {
  2605. if(!is_hist){
  2606. if(card->card_type == CT_ADHOC){ // 此处不需处理,已经在解析时计算了坐标位置
  2607. }else if( LT_READER == theApp.locate_type){
  2608. card->x = card->p_reader->ant[card->antenna_id]->antenna_x;
  2609. card->y = card->p_reader->ant[card->antenna_id]->antenna_y;
  2610. card->z = card->p_reader->ant[card->antenna_id]->antenna_z;
  2611. card->a = card->p_reader->ant[card->antenna_id]->antenna_angle;
  2612. card->reader_id = card->p_reader->reader_id;
  2613. }else{
  2614. // 将距离加入到距离列表
  2615. _coordinate* dist = new _coordinate;
  2616. dist->t = card->time_stamp;
  2617. dist->x = card->p_reader->ant[card->antenna_id]->antenna_x;
  2618. dist->y = card->p_reader->ant[card->antenna_id]->antenna_y;
  2619. dist->z = card->p_reader->ant[card->antenna_id]->antenna_z;
  2620. dist->a = card->p_reader->ant[card->antenna_id]->antenna_angle;
  2621. dist->reader_id = card->p_reader->reader_id;
  2622. dist->antenna_id = card->antenna_id;
  2623. dist->d = card->distance;
  2624. dist->v = 0;
  2625. dist->d_offset = 0;
  2626. HostServer::TagMsg tagMsg;
  2627. tagMsg.ReceiveTime = card->flying_time;
  2628. tagMsg.StationIdCode = HostServer::SyncHelper::parseId((unsigned long long)card->reader_id, (unsigned long long)(card->antenna_id + 1));
  2629. tagMsg.SyncNum = card->sync_num;
  2630. if(card->p_reader->sync_level == 0){
  2631. dist->tt = card->flying_time;
  2632. }else{
  2633. dist->tt = syncmanager.calTimeByLinar(tagMsg);
  2634. }
  2635. card->add_dist(dist);
  2636. CString strLog;
  2637. if(card->x != card->last_x || card->y != card->last_y){
  2638. strLog.Format(_T("cx: %f, cy: %f, cz: %f, clx: %f, cly: %f"), card->x, card->y, card->z, card->last_x, card->last_y);
  2639. writeErrorLog(_T("DIST_S"), strLog, true);
  2640. }
  2641. //strLog.Format(_T("r: %d-%d, t: %d, d: %f, x1: %f, y1: %f, z1: %f, rd: %f"),
  2642. // dist->reader_id, dist->antenna_id + 1, dist->t, dist->d, dist->x, dist->y, dist->z, dist->d /card->map_scale);
  2643. //writeErrorLog(_T("DIST_S"), strLog, false);
  2644. strLog.Format(_T("r: %d-%d, t: %d, l:%d, tt: %I64u, ft: %I64u, x1: %f, y1: %f, z1: %f, ct: %d"),
  2645. dist->reader_id, dist->antenna_id + 1, card->sync_num, card->p_reader->sync_level, dist->tt, card->flying_time, dist->x, dist->y, dist->z,card->time_stamp);
  2646. writeErrorLog(_T("DIST_S"), strLog, true);
  2647. //// 计算坐标
  2648. //int nCount = card->get_effictive_dist_count();
  2649. //if(nCount < 4) return;
  2650. //card->get_coordinate(nCount);
  2651. }
  2652. }
  2653. if(LT_READER == theApp.locate_type){
  2654. time_t cur_time = time(NULL);
  2655. if(difftime(cur_time, card->deal_time) <30){
  2656. return ;
  2657. }
  2658. }
  2659. card->deal_time = time(NULL);
  2660. //if(nCount > 1){
  2661. // CString strTemp, strLog;
  2662. // for(int i = 0; i < nCount; i++){
  2663. // strTemp.Format(_T("%.4f, %.4f, %.4f, %.4f, %.2f\n"), card->p_dists_locate[i]->x, card->p_dists_locate[i]->y,
  2664. // card->p_dists_locate[i]->z, card->p_dists_locate[i]->d, card->p_dists_locate[i]->a);
  2665. // strLog += strTemp;
  2666. // }
  2667. // strTemp.Format(_T("%.4f, %.4f"), card->x, card->y);
  2668. // strLog += strTemp;
  2669. // writeErrorLog(_T("D"), strLog);
  2670. //}
  2671. save_card_postion(card);
  2672. card_enter_map(card); // 切换地图
  2673. card_enter_area(card); //, card->deal_time);
  2674. deal_card_state(card);
  2675. card->isdealed = true;
  2676. if(LT_READER != theApp.locate_type){
  2677. card->issent = false;
  2678. }
  2679. }
  2680. void CYAServerDlg::card_enter_mine( Card* card )
  2681. {
  2682. if(!card->is_pos_state_changed(TEST_CONFIRM_COUNT)){ // 位置没有变化
  2683. if(DT_DOWN == card->pos_state){
  2684. if(CT_PERSON == card->card_type){
  2685. if(difftime(time(NULL), card->get_working_time()) > sls_setting.over_time_person){
  2686. store_data_card(card, ALARM_CARD_OVER_TIME_START);
  2687. deal_alarm_card(card, &mp_card_list_over_time_person, true, AF_CARD_OVER_TIME);
  2688. }
  2689. }else if(CT_VEHICLE == card->card_type){
  2690. if(difftime(time(NULL), card->get_working_time()) > sls_setting.over_time_vehicle){
  2691. store_data_card(card, ALARM_CARD_OVER_TIME_START);
  2692. deal_alarm_card(card, &mp_card_list_over_time_vehicle, true, AF_CARD_OVER_TIME);
  2693. }
  2694. if(card->get_speed() > sls_setting.over_speed){
  2695. store_data_card(card, ALARM_CARD_OVER_SPEED_START);
  2696. deal_alarm_card(card, &mp_card_list_over_speed_vehicle, true, AF_CARD_OVER_SPEED);
  2697. }
  2698. }
  2699. }
  2700. }else{
  2701. if(DT_UP == card->pos_state){ // 升井
  2702. card_up_mine(card);
  2703. // 升井,补全离开区域时间
  2704. store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  2705. }else if(DT_DOWN == card->pos_state){ // 入井
  2706. card_down_mine(card);
  2707. }
  2708. send_json_data(JSON_CMD_VALUE_PUSH, get_json_down_and_up(card));
  2709. }
  2710. }
  2711. void CYAServerDlg::card_enter_park( Card* card )
  2712. {
  2713. }
  2714. void CYAServerDlg::card_enter_map( Card* card )
  2715. {
  2716. if(card->map_id == card->map_id_old) return ;
  2717. // 离开原地图,进入新地图
  2718. MapInfoMap::iterator it_map_old = mp_map_list.find(card->map_id_old);
  2719. if(it_map_old != mp_map_list.end()){
  2720. if(CT_PERSON == card->card_type){
  2721. CardMap::iterator it_card = it_map_old->second->map_card_list_person.find(card->card_id);
  2722. if(it_card != it_map_old->second->map_card_list_person.end()){
  2723. it_map_old->second->map_card_list_person.erase(it_card);
  2724. }
  2725. }else if(CT_VEHICLE == card->card_type){
  2726. CardMap::iterator it_card = it_map_old->second->map_card_list_vehicle.find(card->card_id);
  2727. if(it_card != it_map_old->second->map_card_list_vehicle.end()){
  2728. it_map_old->second->map_card_list_vehicle.erase(it_card);
  2729. }
  2730. }
  2731. }
  2732. card->map_id_old = card->map_id;
  2733. MapInfoMap::iterator it_map = mp_map_list.find(card->map_id);
  2734. if(it_map != mp_map_list.end()){
  2735. card->map_scale = it_map->second->map_scale;
  2736. if(CT_PERSON == card->card_type){
  2737. it_map->second->map_card_list_person.insert(make_pair(card->card_id, card));
  2738. }else if(CT_VEHICLE == card->card_type){
  2739. it_map->second->map_card_list_vehicle.insert(make_pair(card->card_id, card));
  2740. }
  2741. }
  2742. }
  2743. void CYAServerDlg::card_enter_area( Card* card)
  2744. {
  2745. _point p1, p2;
  2746. double r, scale;
  2747. bool b_in_area = false;
  2748. p1.x = card->x, p1.y = card->y, p1.z = card->z;
  2749. AreaMap::iterator it_area_cur = mp_area_list.find(card->area_id);
  2750. if(it_area_cur != mp_area_list.end()){ // 在区域中
  2751. if(it_area_cur->second->is_in_polygon(p1)) { // 区域没有变化
  2752. return;
  2753. }
  2754. //else{
  2755. // // 离开区域
  2756. // store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  2757. // card_leave_area(card, it_area_cur->second);
  2758. //}
  2759. }
  2760. int old_area_id = card->area_id;
  2761. AreaMap::iterator it_area = mp_area_list.begin();
  2762. for(; it_area != mp_area_list.end(); ++it_area){
  2763. if(card->map_id == it_area->second->map_id){ // 必须在同一地图内
  2764. if(it_area->second->is_in_polygon(p1)){ // 在区域内
  2765. if(it_area_cur != mp_area_list.end()){ // 离开区域
  2766. store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  2767. card_leave_area(card, it_area_cur->second);
  2768. }
  2769. card->area_id = it_area->second->area_id;
  2770. card->enter_area_time = card->deal_time;
  2771. card->pos_state = (0 == it_area->second->area_type_id) ? DT_UP :DT_DOWN;
  2772. if(CT_PERSON == card->card_type){
  2773. it_area->second->area_card_list_person.insert(make_pair(card->card_id, card));
  2774. if(it_area->second->over_count_person == 0){
  2775. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  2776. deal_alarm_card(card, &mp_card_list_forbidden_person, true, AF_CARD_AREA_FORBIDDEN);
  2777. }
  2778. }else if(CT_VEHICLE == card->card_type){
  2779. it_area->second->area_card_list_vehicle.insert(make_pair(card->card_id, card));
  2780. if(it_area->second->over_count_vehicle == 0){
  2781. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  2782. deal_alarm_card(card, &mp_card_list_forbidden_vehicle, true, AF_CARD_AREA_FORBIDDEN);
  2783. }
  2784. }
  2785. b_in_area = true;
  2786. break;
  2787. }
  2788. }
  2789. }
  2790. if(!b_in_area){ // 找不到区域,使用分站所属区域
  2791. AreaMap::iterator it_area_reader = mp_area_list.find(card->p_reader->map_id);
  2792. if(it_area_reader != mp_area_list.end()){
  2793. if(card->area_id != it_area_reader->second->area_id){
  2794. if(it_area_cur != mp_area_list.end()){
  2795. store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  2796. card_leave_area(card, it_area_cur->second);
  2797. }
  2798. card->area_id = it_area_reader->second->area_id;
  2799. card->enter_area_time = card->deal_time;
  2800. card->pos_state = (0 == it_area_reader->second->area_type_id) ? DT_UP :DT_DOWN;
  2801. if(CT_PERSON == card->card_type){
  2802. it_area_reader->second->area_card_list_person.insert(make_pair(card->card_id, card));
  2803. if(it_area_reader->second->over_count_person == 0){
  2804. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  2805. deal_alarm_card(card, &mp_card_list_forbidden_person, true, AF_CARD_AREA_FORBIDDEN);
  2806. }
  2807. }else if(CT_VEHICLE == card->card_type){
  2808. it_area_reader->second->area_card_list_vehicle.insert(make_pair(card->card_id, card));
  2809. if(it_area_reader->second->over_count_vehicle == 0){
  2810. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  2811. deal_alarm_card(card, &mp_card_list_forbidden_vehicle, true, AF_CARD_AREA_FORBIDDEN);
  2812. }
  2813. }
  2814. }
  2815. }
  2816. }
  2817. // 保存区域信息
  2818. store_data_card(card, HIS_AREA_LOCATION_ENTER);
  2819. // 升入井判断
  2820. card_enter_mine(card);
  2821. }
  2822. void CYAServerDlg::card_leave_area( Card* card, Area* area)
  2823. {
  2824. // 从列表中删除
  2825. CardMap *card_map, *alarm_card_map, *alarm_forbidden_map;
  2826. if(CT_PERSON == card->card_type){
  2827. card_map = &area->area_card_list_person;
  2828. alarm_card_map = &mp_card_list_area_over_time_person;
  2829. alarm_forbidden_map = &mp_card_list_forbidden_person;
  2830. }else if(CT_VEHICLE == card->card_type){
  2831. card_map = &area->area_card_list_vehicle;
  2832. alarm_card_map = &mp_card_list_area_over_time_vehicle;
  2833. alarm_forbidden_map = &mp_card_list_forbidden_vehicle;
  2834. }
  2835. CardMap::iterator it_card = card_map->find(card->card_id);
  2836. if(it_card != card_map->end()){
  2837. // 如果区域超时
  2838. if(it_card->second->is_area_over_time){
  2839. it_card->second->is_area_over_time = false;
  2840. store_data_card(card, ALARM_CARD_OVER_TIME_AREA_END);
  2841. deal_alarm_card(card, alarm_card_map, false, AF_CARD_AREA_OVER_TIME);
  2842. }
  2843. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_END);
  2844. deal_alarm_card(card, alarm_forbidden_map, false, AF_CARD_AREA_FORBIDDEN);
  2845. // 先处理,后删除
  2846. card_map->erase(it_card);
  2847. }
  2848. }
  2849. void CYAServerDlg::reset_map_card()
  2850. {
  2851. MapInfoMap::iterator it_map = mp_map_list.begin();
  2852. for(; it_map != mp_map_list.end(); ++ it_map){
  2853. //用map.erase(map.begin(),map.end())比较好 清空元素
  2854. it_map->second->map_card_list_person.erase(it_map->second->map_card_list_person.begin(), it_map->second->map_card_list_person.end());
  2855. it_map->second->map_card_list_vehicle.erase(it_map->second->map_card_list_vehicle.begin(), it_map->second->map_card_list_vehicle.end());
  2856. //it_map->second->map_card_list.clear(); // 删除map
  2857. }
  2858. }
  2859. bool CYAServerDlg::is_in_rectangle( _point p, double dblleft, double dbltop, double dblright, double dblbottom )
  2860. {
  2861. return (p.x >= dblleft && p.x <= dblright && p.y >= dbltop && p.y <= dblbottom);
  2862. }
  2863. bool CYAServerDlg::is_in_circle( _point p1, _point p2, double r, double scale )
  2864. {
  2865. return sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y)) <= r * scale;
  2866. }
  2867. void CYAServerDlg::package_data()
  2868. {
  2869. string strJson = get_json_postion(); // get_json_postion_test();
  2870. // 定位数据
  2871. if(strJson == "") return ;
  2872. send_json_data(JSON_CMD_VALUE_PUSH, strJson);
  2873. dw_last_send_time = GetTickCount();
  2874. //ifstream
  2875. //json字符串输出到文件中
  2876. /*ofstream ofs;
  2877. ofs.open("result.js",ios::app);
  2878. Json::StyledWriter writer;
  2879. string res = writer.write(strJson);
  2880. ofs << res;
  2881. ofs.close();*/
  2882. }
  2883. void CYAServerDlg::package_data_test()
  2884. {
  2885. Json::Value root;
  2886. Json::Value valStaffer;
  2887. Json::Value valStaffers;
  2888. Json::Value valDistance;
  2889. Json::Value valDist;
  2890. Json::Value valReaders;
  2891. Json::Value valReader;
  2892. int nCnt = 0;
  2893. std::string strJson;
  2894. for(int i = 1; i < 4; i++){
  2895. valStaffer["id"] = i;
  2896. valStaffer["x"] = 50 * (m_nCountClick + i);
  2897. valStaffer["y"] = 50 * sin(20.0) * (m_nCountClick + i);
  2898. valStaffers.append(valStaffer);
  2899. nCnt++;
  2900. }
  2901. root["staffer"] = valStaffers;
  2902. //map<DWORD, READERINFO*>::iterator itReader = m_mpReaderInfo.begin();
  2903. //for(; itReader != m_mpReaderInfo.end(); ++itReader)
  2904. //{
  2905. // valReader["id"] = (unsigned int)itReader->second->readerid;
  2906. // valReader["x"] = itReader->second->X;
  2907. // valReader["y"] = itReader->second->Y;
  2908. // valReaders.append(valReader);
  2909. //}
  2910. root["reader"] = valReaders;
  2911. if(nCnt == 0){
  2912. return;
  2913. }
  2914. strJson = root.toFastString();
  2915. send_json_data(JSON_CMD_VALUE_PUSH, strJson.c_str());
  2916. }
  2917. void CYAServerDlg::formatByteArray( CString &strBuf, BYTE * buf, int nLen )
  2918. {
  2919. CString strBuf1 = _T("");
  2920. for(int i = 0; i < nLen; i++){
  2921. strBuf1.Format(_T("%.2X "),buf[i]);
  2922. strBuf += strBuf1;
  2923. if((i + 1) % 16 == 0){
  2924. strBuf += _T("\n");
  2925. }
  2926. }
  2927. }
  2928. void CYAServerDlg::writeErrorLog( const CString strFile, const CString strErr, bool bTime /*= true*/ )
  2929. {
  2930. EnterCriticalSection(&m_csWriteLog);
  2931. if(openLogFile(strFile)){
  2932. CString strTempInfo;
  2933. if(bTime){
  2934. COleDateTime t = COleDateTime::GetCurrentTime();
  2935. strTempInfo.Format(_T("%s\r\n%s\r\n"), t.Format(_T("%H:%M:%S")), strErr);
  2936. }else{
  2937. strTempInfo.Format(_T("%s\r\n"), strErr);
  2938. }
  2939. TRY{
  2940. cfErrorLog.SeekToEnd();
  2941. char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
  2942. setlocale( LC_CTYPE, "chs" );//设定
  2943. cfErrorLog.WriteString(strTempInfo);
  2944. setlocale( LC_CTYPE, old_locale );
  2945. free( old_locale );//还原区域设定
  2946. }
  2947. CATCH(CFileException, e){
  2948. if(cfErrorLog.m_pStream)
  2949. cfErrorLog.Close();
  2950. return;
  2951. }
  2952. END_CATCH
  2953. }
  2954. LeaveCriticalSection(&m_csWriteLog);
  2955. }
  2956. BOOL CYAServerDlg::openLogFile(CString strFile)
  2957. {
  2958. TCHAR lpstrCurDir[MAX_PATH] = _T("");
  2959. CString ctemp;
  2960. GetModuleFileName(NULL,lpstrCurDir,MAX_PATH);
  2961. ctemp = lpstrCurDir;
  2962. int index = ctemp.ReverseFind('\\');
  2963. CString strFilePath = ctemp.Left(index+1);
  2964. CString strFileName;
  2965. strFileName.Format(_T("%s_%s.log"), strFile, COleDateTime::GetCurrentTime().Format(_T("%Y%m%d")));
  2966. strFilePath += _T("error\\");
  2967. strFilePath += strFileName;
  2968. if (cfErrorLog == NULL){
  2969. return FALSE;
  2970. }
  2971. BOOL bOpenFile=FALSE;//是否需要重新打开文件
  2972. if(cfErrorLog.m_pStream==NULL){
  2973. bOpenFile=TRUE;
  2974. }else{
  2975. if(cfErrorLog.GetFilePath()!=strFilePath){
  2976. bOpenFile=TRUE;
  2977. cfErrorLog.Close();
  2978. }
  2979. }
  2980. if(bOpenFile){
  2981. return cfErrorLog.Open(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone);
  2982. }else{
  2983. return TRUE;
  2984. }
  2985. }
  2986. void CYAServerDlg::OnBnExit()
  2987. {
  2988. stop_tcp_server();
  2989. clear_all_list();
  2990. GetConnPool().CloseAllConn();
  2991. CDialogEx::OnCancel();
  2992. }
  2993. void CYAServerDlg::OnBnSyncTime()
  2994. {
  2995. send_sync_reader();
  2996. }
  2997. CYAServerDlg::~CYAServerDlg()
  2998. {
  2999. ws_close();
  3000. }
  3001. void CYAServerDlg::OnConnected()
  3002. {
  3003. is_websocket_ok = true;
  3004. //Sleep(50); // need delay
  3005. }
  3006. void CYAServerDlg::OnClosed( client::close_reason const& reason )
  3007. {
  3008. int i = -1;
  3009. if(reason == client::close_reason_drop){
  3010. i = (int) reason;
  3011. }else{
  3012. i = (int) reason;
  3013. }
  3014. }
  3015. void CYAServerDlg::OnFailed()
  3016. {
  3017. is_websocket_login = false;
  3018. is_websocket_ok = false;
  3019. }
  3020. void CYAServerDlg::ws_open()
  3021. {
  3022. _io->connect(m_ws_url);
  3023. CString strlog;
  3024. strlog.Format(_T("%s: %s"), _T(LOG_CONNECT_WEB_SERVER), CFunctions::c2wc(m_ws_url.c_str()));
  3025. show_log(strlog);
  3026. }
  3027. void CYAServerDlg::OnPushMessage()
  3028. {
  3029. string aa = "";
  3030. }
  3031. std::string CYAServerDlg::get_json_down_and_up( Card* card )
  3032. {
  3033. Json::Value root;
  3034. Json::Value val_map;
  3035. Json::Value val_maps;
  3036. Json::Value val_card;
  3037. Json::Value val_cards;
  3038. char _time[STR_LEN_TIME];
  3039. struct tm local_time;
  3040. val_card[JSON_KEY_CARD_ID] = card->card_id;
  3041. val_card[JSON_KEY_CARD_TYPE_ID] = card->card_type;
  3042. val_card[JSON_KEY_CARD_NUM] = card->id;
  3043. localtime_s(&local_time, &card->down_time);
  3044. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  3045. val_card[JSON_KEY_DOWN_TIME] = _time;
  3046. val_card[JSON_KEY_WORK_TIME] = CFunctions::getworktimebysec((int)difftime(time(NULL), card->down_time));
  3047. localtime_s(&local_time, &card->enter_area_time);
  3048. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  3049. val_card[JSON_KEY_ENTER_AREA_TIME] = _time;
  3050. val_card[JSON_KEY_AREA_ID] = card->area_id;
  3051. val_card[JSON_KEY_STATE] = card->state;
  3052. localtime_s(&local_time, &card->rec_time);
  3053. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  3054. val_card[JSON_KEY_REC_TIME] = _time;
  3055. val_card[JSON_KEY_CORDINATE_X] = card->x;
  3056. val_card[JSON_KEY_CORDINATE_Y] = card->y;
  3057. val_card[JSON_KEY_CORDINATE_Z] = 0; // card->z;
  3058. val_cards.append(val_card);
  3059. val_map[JSON_KEY_MAP_ID] = card->map_id;
  3060. val_map[JSON_KEY_POS_CARD] = val_cards;
  3061. val_maps.append(val_map);
  3062. root[JSON_ROOT_KEY_CMD] = (DT_DOWN == card->pos_state)? JSON_CMD_VALUE_DOWN_MINE : JSON_CMD_VALUE_UP_MINE;
  3063. root[JSON_ROOT_KEY_DATA] = val_maps;
  3064. string ss = root.toStyledString();
  3065. return root.toFastString();
  3066. }
  3067. void CYAServerDlg::store_data_card( Card* card, int tag )
  3068. {
  3069. //return;
  3070. char sql[LENGTH_SQL] = {0};
  3071. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  3072. struct tm local_time, local_time_ex;
  3073. localtime_s(&local_time, &card->deal_time);
  3074. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  3075. bool b_exec = false;
  3076. switch(tag){
  3077. case TEST_LOCATE_COMPARE:
  3078. {
  3079. b_exec = true;
  3080. sprintf_s(sql, LENGTH_SQL,
  3081. "INSERT INTO test_locate_compare(x, y, xx, yy, x1, x2, x3, x4, y1, y2, y3, y4, rec_time)\
  3082. VALUES(%.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, '%s');",
  3083. card->x, card->y, card->xx, card->yy, card->x1, card->x2, card->x3, card->x4,
  3084. card->y1, card->y2, card->y3, card->y4, _time);
  3085. break;
  3086. }
  3087. case TEST_LOCATE_DATA:
  3088. {
  3089. b_exec = true;
  3090. sprintf_s(sql, LENGTH_SQL,
  3091. "INSERT INTO test_locatedata(card_id, reader_id, antenna_id, \
  3092. reader_stamp, card_stamp, locatetime, distance, stamp_type, power_state,\
  3093. accelerate, rec_time, card_x, card_y) \
  3094. VALUES(%s, %d, %d, %d, %d, %lld, %f, %d, %d, %d, '%s', %.4f, %.4f);",
  3095. card->card_id.c_str(), card->reader_id, card->antenna_id, card->p_reader->tick_count, card->time_stamp,
  3096. card->flying_time, card->distance, card->ranging_type, card->power_state, card->accelerate_state,
  3097. _time, card->x, card->y);
  3098. break;
  3099. }
  3100. case HIS_LOCATION:
  3101. {
  3102. if(card->map_id != 0 && card->area_id != 0){
  3103. b_exec = true;
  3104. sprintf_s(sql, LENGTH_SQL,
  3105. "INSERT INTO his_location(card_id, cur_time, x, y, z, map_id, area_id, state) \
  3106. VALUES(%s, '%s', %4.f, %4.f, %4.f, %d, %d, %d);",
  3107. card->card_id.c_str(), _time, card->x, card->y, card->z, card->map_id, card->area_id, card->state);
  3108. }
  3109. break;
  3110. }
  3111. case HIS_RAW_DATA:
  3112. {
  3113. b_exec = true;
  3114. sprintf_s(sql, LENGTH_SQL,
  3115. "INSERT INTO his_raw_data(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \
  3116. fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time ) \
  3117. VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s');",
  3118. card->card_id.c_str(), card->reader_id, card->antenna_id, card->reader_tickcount, card->time_stamp,
  3119. card->flying_time, card->distance, card->ranging_type, card->power_state, card->accelerate_state,
  3120. card->str_his_time.c_str(), card->str_rec_time.c_str());
  3121. break;
  3122. }
  3123. case HIS_AREA_LOCATION_ENTER:
  3124. {
  3125. if(card->map_id != 0 && card->area_id != 0){
  3126. b_exec = true;
  3127. sprintf_s(sql, LENGTH_SQL,
  3128. "INSERT INTO his_location_area(card_id, area_id, map_id, enter_time) VALUES(%s, %d, %d, '%s')",
  3129. card->card_id.c_str() , card->area_id, card->map_id, _time);
  3130. }
  3131. break;
  3132. }
  3133. case HIS_AREA_LOCATION_LEAVE:
  3134. {
  3135. if(card->map_id != 0 && card->area_id != 0){
  3136. b_exec = true;
  3137. localtime_s(&local_time_ex, &card->enter_area_time);
  3138. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  3139. sprintf_s(sql, LENGTH_SQL,
  3140. "UPDATE his_location_area SET leave_time = '%s' WHERE card_id = %s AND area_id=%d AND enter_time = '%s';",
  3141. _time, card->card_id.c_str(), card->area_id, _time_ex);
  3142. }
  3143. break;
  3144. }
  3145. case RPT_ATTEND_DOWN:
  3146. {
  3147. if(card->map_id != 0 && card->area_id != 0){
  3148. b_exec = true;
  3149. sprintf_s(sql, LENGTH_SQL,
  3150. "INSERT INTO rpt_attendance(card_id, start_time, att_date) VALUES(%s, '%s', '%s')",
  3151. card->card_id.c_str(), _time, _time);
  3152. }
  3153. break;
  3154. }
  3155. case RPT_ATTEND_UP:
  3156. {
  3157. if(card->map_id != 0 && card->area_id != 0){
  3158. b_exec = true;
  3159. localtime_s(&local_time_ex, &card->down_time);
  3160. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  3161. sprintf_s(sql, LENGTH_SQL,
  3162. "UPDATE rpt_attendance SET end_time = '%s' WHERE card_id = %s AND start_time = '%s';",
  3163. _time, card->card_id.c_str(), _time_ex);
  3164. }
  3165. break;
  3166. }
  3167. case ALARM_CARD_LOW_POWER_START:
  3168. {
  3169. b_exec = true;
  3170. int alarm_type_id = ATID_POWER;
  3171. sprintf_s(sql, LENGTH_SQL,
  3172. "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \
  3173. VALUES(%s, %d, %d, '%s')",
  3174. card->card_id.c_str(), alarm_type_id, card->card_type, _time);
  3175. break;
  3176. }
  3177. case ALARM_CARD_LOW_POWER_END:
  3178. {
  3179. b_exec = true;
  3180. localtime_s(&local_time_ex, &card->low_power_time);
  3181. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  3182. int alarm_type_id = ATID_POWER;
  3183. sprintf_s(sql, LENGTH_SQL,
  3184. "UPDATE his_alarm_card SET end_time = '%s' WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';",
  3185. _time, card->card_id.c_str(), alarm_type_id, _time_ex);
  3186. break;
  3187. }
  3188. //case ALARM_CARD_OVER_TIME_AREA_START:
  3189. // {
  3190. // int alarm_type_id = ATID_AREA_OVER_TIME_PERSON;
  3191. // if(CT_VEHICLE == card->card_type){
  3192. // alarm_type_id = ATID_AREA_OVER_TIME_VEHICLE;
  3193. // }
  3194. // sprintf_s(sql, LENGTH_SQL,
  3195. // "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \
  3196. // VALUES(%s, %d, %d, '%s')",
  3197. // card->card_id.c_str(), alarm_type_id, card->card_type, _time);
  3198. // break;
  3199. // }
  3200. //case ALARM_CARD_OVER_TIME_AREA_END:
  3201. // {
  3202. // localtime_s(&local_time_ex, &card->time_area_over_time);
  3203. // strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  3204. // int alarm_type_id = ATID_AREA_OVER_TIME_PERSON;
  3205. // if(CT_VEHICLE == card->card_type){
  3206. // alarm_type_id = ATID_AREA_OVER_TIME_VEHICLE;
  3207. // }
  3208. // sprintf_s(sql, LENGTH_SQL,
  3209. // "UPDATE his_alarm_card SET end_time = '%s' \
  3210. // WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';",
  3211. // _time, card->card_id.c_str(), alarm_type_id, _time_ex);
  3212. // break;
  3213. // }
  3214. //case ALARM_CARD_OVER_TIME_START:
  3215. // {
  3216. // int alarm_type_id = ATID_OVER_TIME_PERSON;
  3217. // if(CT_VEHICLE == card->card_type){
  3218. // alarm_type_id = ATID_OVER_TIME_VEHICLE;
  3219. // }
  3220. // sprintf_s(sql, LENGTH_SQL,
  3221. // "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \
  3222. // VALUES(%s, %d, %d, '%s')",
  3223. // card->card_id.c_str(), alarm_type_id, card->card_type, _time);
  3224. // break;
  3225. // }
  3226. //case ALARM_CARD_OVER_TIME_END:
  3227. // {
  3228. // localtime_s(&local_time_ex, &card->time_over_time);
  3229. // strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  3230. // int alarm_type_id = ATID_OVER_TIME_PERSON;
  3231. // if(CT_VEHICLE == card->card_type){
  3232. // alarm_type_id = ATID_OVER_TIME_VEHICLE;
  3233. // }
  3234. // sprintf_s(sql, LENGTH_SQL,
  3235. // "UPDATE his_alarm_card SET end_time = '%s' \
  3236. // WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';",
  3237. // _time, card->card_id.c_str(), alarm_type_id, _time_ex);
  3238. // break;
  3239. // }
  3240. default:
  3241. return;
  3242. }
  3243. try
  3244. {
  3245. if(b_exec){
  3246. execute_sql(sql);
  3247. }
  3248. }
  3249. catch (...)
  3250. {
  3251. CString str;
  3252. str.Format(_T("%s\n"), CFunctions::c2wc(sql));
  3253. writeErrorLog(_T("SQL_S"), str);
  3254. }
  3255. }
  3256. std::string CYAServerDlg::get_json_counting()
  3257. {
  3258. Json::Value root;
  3259. Json::Value data;
  3260. Json::Value mapcounts;
  3261. int total_count = 0,total_count_vehicle = 0,total_count_person = 0;
  3262. int map_count_total, map_count_vehicle, map_count_person;
  3263. int area_count_total, area_count_vehicle, area_count_person;
  3264. MapInfoMap::iterator it_map = mp_map_list.begin();
  3265. for(; it_map != mp_map_list.end(); ++it_map){
  3266. Json::Value mapcount;
  3267. Json::Value areacounts;
  3268. // area
  3269. map_count_total = map_count_vehicle = map_count_person = 0;
  3270. AreaMap::iterator it_area = it_map->second->map_area_list.begin();
  3271. for(; it_area != it_map->second->map_area_list.end(); ++it_area){
  3272. area_count_total = area_count_vehicle = area_count_person = 0;
  3273. Json::Value areacount;
  3274. // person
  3275. CardMap::iterator it_card = it_area->second->area_card_list_person.begin();
  3276. for(; it_card != it_area->second->area_card_list_person.end(); ++ it_card){
  3277. if(DT_DOWN == it_card->second->pos_state){
  3278. area_count_person++;
  3279. area_count_total++;
  3280. } else {
  3281. continue;
  3282. }
  3283. }
  3284. // vehicle
  3285. it_card = it_area->second->area_card_list_vehicle.begin();
  3286. for(; it_card != it_area->second->area_card_list_vehicle.end(); ++ it_card){
  3287. if(DT_DOWN == it_card->second->pos_state){
  3288. area_count_vehicle++;
  3289. area_count_total++;
  3290. } else {
  3291. continue;
  3292. }
  3293. }
  3294. //if(area_count_total > 0){
  3295. areacount[JSON_KEY_COUNTING_AREA_COUNT_PERSON] = area_count_person;
  3296. areacount[JSON_KEY_COUNTING_AREA_COUNT_VEHICLE] = area_count_vehicle;
  3297. areacount[JSON_KEY_COUNTING_AREA_COUNT] = area_count_total;
  3298. areacount[JSON_KEY_COUNTING_AREA_ID] = it_area->second->area_id;
  3299. map_count_total += area_count_total;
  3300. map_count_person += area_count_person;
  3301. map_count_vehicle += area_count_vehicle;
  3302. areacounts.append(areacount);
  3303. //}
  3304. }
  3305. //if(map_count_total > 0){
  3306. mapcount[JSON_KEY_COUNTING_MAP_ID] = it_map->second->map_id;
  3307. mapcount[JSON_KEY_COUNTING_MAP_COUNT_PERSON] = map_count_person;
  3308. mapcount[JSON_KEY_COUNTING_MAP_COUNT_VEHICLE] = map_count_vehicle;
  3309. mapcount[JSON_KEY_COUNTING_MAP_COUNT_TOTAL] = map_count_total;
  3310. mapcount[JSON_KEY_COUNTING_AREA_COUNT] = areacounts;
  3311. total_count += map_count_total;
  3312. total_count_person += map_count_person;
  3313. total_count_vehicle += map_count_vehicle;
  3314. mapcounts.append(mapcount);
  3315. //}
  3316. }
  3317. // dept
  3318. Json::Value deptcounts;
  3319. Json::Value deptcount;
  3320. int dept_person_count, dept_vehicle_count, total_dept_count = 0;
  3321. DeptMap::iterator it_dept = mp_dept_list.begin();
  3322. for(; it_dept != mp_dept_list.end(); ++it_dept){
  3323. deptcount[JSON_KEY_COUNTING_DEPT_ID] = it_dept->second->dept_id;
  3324. //deptcount[JSON_KEY_COUNTING_DEPT_NAME] = it_dept->second->dept_name;
  3325. dept_person_count = it_dept->second->dept_card_list_person.size();
  3326. dept_vehicle_count = it_dept->second->dept_card_list_vehicle.size();
  3327. deptcount[JSON_KEY_COUNTING_DEPT_COUNT_TOTAL] = dept_person_count + dept_vehicle_count;
  3328. deptcount[JSON_KEY_COUNTING_DEPT_COUNT_PERSON] = dept_person_count;
  3329. deptcount[JSON_KEY_COUNTING_DEPT_COUNT_VEHICLE] = dept_vehicle_count;
  3330. //if(dept_vehicle_count + dept_person_count > 0){
  3331. // total_dept_count += dept_vehicle_count + dept_person_count;
  3332. deptcounts.append(deptcount);
  3333. //}
  3334. }
  3335. //if(total_dept_count>0){
  3336. data[JSON_KEY_COUNTING_DEPT_COUNT] = deptcounts;
  3337. //}
  3338. data[JSON_KEY_COUNTING_MAP_COUNT] = mapcounts;
  3339. data[JSON_KEY_COUNTING_COUNT_TOTAL] = total_count;
  3340. data[JSON_KEY_COUNTING_COUNT_VEHICLE] = total_count_vehicle;
  3341. data[JSON_KEY_COUNTING_COUNT_PERSON] = total_count_person;
  3342. root[JSON_ROOT_KEY_DATA] = data;
  3343. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_COUNTING;
  3344. string ss = root.toStyledString();
  3345. return root.toFastString();
  3346. }
  3347. void CYAServerDlg::OnTimer( UINT nIDEvent )
  3348. {
  3349. // 需要优化,如果数据没有变化,则不重复发送数据,数据变化后再发送
  3350. switch ( nIDEvent)
  3351. {
  3352. case TMR_SEND_COUNTING:
  3353. {
  3354. send_json_data(JSON_CMD_VALUE_PUSH, get_json_counting());
  3355. break;
  3356. }
  3357. case TMR_SEND_ALARM:
  3358. {
  3359. send_json_data(JSON_CMD_VALUE_PUSH, get_json_alarm());
  3360. break;
  3361. }
  3362. case TMR_SEND_DEVICE_STATE:
  3363. {
  3364. deal_readers();
  3365. send_json_data(JSON_CMD_VALUE_PUSH, get_json_device_state());
  3366. break;
  3367. }
  3368. case TMR_SEND_POSTION:
  3369. {
  3370. package_data();
  3371. break;
  3372. }
  3373. case TMR_SYNC_READER_TIME:
  3374. {
  3375. send_sync_reader();
  3376. break;
  3377. }
  3378. case TMR_CLEAR_CALL_TIMER:
  3379. {
  3380. clear_call_info();
  3381. break;
  3382. }
  3383. case TMR_SEND_CALL:
  3384. {
  3385. send_call_info();
  3386. break;
  3387. }
  3388. default:
  3389. break;
  3390. }
  3391. }
  3392. void CYAServerDlg::load_param_from_ini()
  3393. {
  3394. IniFile ini;
  3395. string strvalue;
  3396. int nTemp = 0;
  3397. show_log(_T(LOG_LOAD_CONFIG), FALSE);
  3398. if(ini.open(FILEPATH_SERVER_CONFIG)){
  3399. strvalue = ini.read(CONF_SECT_SERVER_SETTING, CONF_SERVER_WS_URL);
  3400. m_ws_url = strvalue;
  3401. m_db_setting.host = ini.read(CONF_SECT_DB, CONF_DB_KEY_HOST);
  3402. m_db_setting.user = ini.read(CONF_SECT_DB, CONF_DB_KEY_USER);
  3403. m_db_setting.password = ini.read(CONF_SECT_DB, CONF_DB_KEY_PWD);
  3404. m_db_setting.dbname = ini.read(CONF_SECT_DB, CONF_DB_KEY_DBNAME);
  3405. m_db_setting.encoding = ini.read(CONF_SECT_DB, CONF_DB_KEY_ENCODING);
  3406. m_db_setting.port = atoi(ini.read(CONF_SECT_DB, CONF_DB_KEY_PORT).c_str());
  3407. show_log(_T(LOG_LOAD_CONFIG_SUCCESS), FALSE);
  3408. }else{
  3409. show_log(_T(LOG_LOAD_CONFIG_FAIL));
  3410. }
  3411. }
  3412. int CYAServerDlg::init_dept()
  3413. {
  3414. CMysqlConn* pConn = NULL;
  3415. CDBConnGuard pDbGuard(pConn);
  3416. MYSQL_ROW pRow;
  3417. MYSQL_RES *pRes = NULL;
  3418. int err = 0;
  3419. pRes = pConn->Execute("select dept_id, name from dat_dept order by rank;", err);
  3420. Dept* dept = NULL;
  3421. int nRow = 0;
  3422. while(pRow = mysql_fetch_row(pRes)) {
  3423. DeptMap::iterator it = mp_dept_list.find(atoi(pRow[0]));
  3424. if(it != mp_dept_list.end()){
  3425. dept = it->second;
  3426. }else{
  3427. dept = new Dept(atoi(pRow[0]), pRow[1]);
  3428. mp_dept_list.insert(make_pair(dept->dept_id, dept));
  3429. nRow++;
  3430. }
  3431. }
  3432. mysql_free_result(pRes);
  3433. CString strlog;
  3434. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_DEPT), nRow, _T(LOG_RECORD_COUNT));
  3435. show_log(strlog);
  3436. return 0;
  3437. }
  3438. int CYAServerDlg::init_setting()
  3439. {
  3440. CMysqlConn* pConn = NULL;
  3441. CDBConnGuard pDbGuard(pConn);
  3442. MYSQL_ROW pRow;
  3443. MYSQL_RES *pRes = NULL;
  3444. int err = 0;
  3445. pRes = pConn->Execute("select setting_id, name, type, value from dat_setting;", err);
  3446. string name, val, type;
  3447. while(pRow = mysql_fetch_row(pRes)) {
  3448. name = pRow[1], type = pRow[2], val = pRow[3];
  3449. if("over_count_person" == name){
  3450. sls_setting.over_count_person = atoi(val.c_str());
  3451. }else if("over_count_vehicle" == name){
  3452. sls_setting.over_count_vehicle = atoi(val.c_str());
  3453. }else if("over_time_person" == name){
  3454. sls_setting.over_time_person = atoi(val.c_str());
  3455. }else if("over_time_vehicle" == name){
  3456. sls_setting.over_time_vehicle = atoi(val.c_str());
  3457. }else if("over_speed" == name){
  3458. sls_setting.over_speed = atof(val.c_str());
  3459. }
  3460. }
  3461. mysql_free_result(pRes);
  3462. show_log(_T(LOG_INIT_SETTING));
  3463. return 0;
  3464. }
  3465. void CYAServerDlg::deal_alarm_card(Card* card, CardMap* dest_card_list, bool is_alarm, ALARM_FLAG tag)
  3466. {
  3467. CardMap::iterator it_card = dest_card_list->find(card->card_id);
  3468. if(it_card != dest_card_list->end()){
  3469. if(!is_alarm){ // 取消报警
  3470. dest_card_list->erase(it_card);
  3471. }
  3472. }else {
  3473. if(is_alarm){
  3474. dest_card_list->insert(make_pair(card->card_id, card));
  3475. }
  3476. }
  3477. switch (tag) // savetodb
  3478. {
  3479. case AF_CARD_AREA_FORBIDDEN:
  3480. {
  3481. card->time_area_forbidden = is_alarm ? time(NULL) : 0;
  3482. card->status_area_forbidden = is_alarm ? 1 : 0;
  3483. break;
  3484. }
  3485. case AF_CARD_AREA_OVER_TIME:
  3486. {
  3487. card->time_area_over_time = is_alarm ? time(NULL) : 0;
  3488. card->status_area_over_time = is_alarm ? 1 : 0;
  3489. break;
  3490. }
  3491. case AF_AREA_OVER_TIME:
  3492. {
  3493. card->time_over_time = is_alarm ? time(NULL) : 0;
  3494. card->status_over_time = is_alarm ? 1 : 0;
  3495. break;
  3496. }
  3497. case AF_CARD_OVER_SPEED:
  3498. {
  3499. card->time_over_speed = is_alarm ? time(NULL) : 0;
  3500. card->status_over_speed = is_alarm ? 1 : 0;
  3501. break;
  3502. }
  3503. default:
  3504. break;
  3505. }
  3506. }
  3507. void CYAServerDlg::deal_alarm_area( Area* area, AreaMap* dest_area_list, bool is_alarm, ALARM_FLAG tag )
  3508. {
  3509. AreaMap::iterator it_area = dest_area_list->find(area->area_id);
  3510. if(it_area != dest_area_list->end()){
  3511. if(!is_alarm){
  3512. //savetodb
  3513. dest_area_list->erase(it_area);
  3514. }
  3515. }else{
  3516. if(is_alarm){
  3517. // savetodb
  3518. dest_area_list->insert(make_pair(area->area_id, area));
  3519. }
  3520. }
  3521. }
  3522. int CYAServerDlg::init_alarm_type()
  3523. {
  3524. CMysqlConn* pConn = NULL;
  3525. CDBConnGuard pDbGuard(pConn);
  3526. MYSQL_ROW pRow;
  3527. MYSQL_RES *pRes = NULL;
  3528. int err = 0;
  3529. pRes = pConn->Execute("select alarm_type_id, name from dat_alarm_type;", err);
  3530. while(pRow = mysql_fetch_row(pRes)) {
  3531. AlarmTypeMap::iterator it = mp_alarm_type_list.find(atoi(pRow[0]));
  3532. if(it != mp_alarm_type_list.end()){
  3533. it->second = pRow[1];
  3534. }else{
  3535. mp_alarm_type_list.insert(make_pair(atoi(pRow[0]), pRow[1]));
  3536. }
  3537. }
  3538. mysql_free_result(pRes);
  3539. show_log(_T(LOG_INIT_ALARM_TYPE));
  3540. return 0;
  3541. }
  3542. void CYAServerDlg::AddItem( CString strvalue, int readerid, BOOL is_closed /*= false*/ )
  3543. {
  3544. CString strRow;
  3545. int nRow = 0;
  3546. bool bFind = false;
  3547. for(int i = 0; i < m_listctrl_reader.GetItemCount(); i++){
  3548. if(strvalue == m_listctrl_reader.GetItemText(i, 1)){
  3549. nRow = i;
  3550. bFind = true;
  3551. break;
  3552. }
  3553. }
  3554. if(!bFind){
  3555. nRow = m_listctrl_reader.GetItemCount();
  3556. //strRow.Format(_T("%d"), nRow + 1);
  3557. nRow = m_listctrl_reader.InsertItem(nRow, CFunctions::formatInt(readerid));
  3558. }
  3559. m_listctrl_reader.SetItemText(nRow, 1, strvalue);
  3560. m_listctrl_reader.SetItemText(nRow, 2, is_closed ? _T("中断"): _T("已连接"));
  3561. }
  3562. void CYAServerDlg::show_log( LPCTSTR szlog, BOOL bSave )
  3563. {
  3564. CString sMsg, sLog;
  3565. CString sTime=COleDateTime::GetCurrentTime().Format(_T(LOG_TIME_FORMAT));
  3566. sMsg.Format(_T("%s %s\n"), sTime, szlog);
  3567. try{
  3568. ::LogMsg(sMsg);
  3569. }
  3570. catch(...){
  3571. }
  3572. if(bSave && theApp.log_status){
  3573. writeErrorLog(_T("LOG_S"), sMsg);
  3574. }
  3575. }
  3576. void CYAServerDlg::database_connect()
  3577. {
  3578. show_log(_T(LOG_CONNECT_DB), FALSE);
  3579. GetConnPool().Init(m_db_setting.encoding.c_str(), m_db_setting.host.c_str(), m_db_setting.user.c_str(),
  3580. m_db_setting.password.c_str(), m_db_setting.dbname.c_str(), m_db_setting.port, NULL, 0);
  3581. int nConn = GetConnPool().InitAllConn();
  3582. if(nConn > 0){
  3583. show_log(_T(LOG_CONNECT_DB_SUCCESS));
  3584. }else{
  3585. show_log(_T(LOG_CONNECT_DB_FAIL));
  3586. }
  3587. }
  3588. void CYAServerDlg::stop_timer()
  3589. {
  3590. KillTimer(TMR_SEND_COUNTING);
  3591. KillTimer(TMR_SEND_ALARM);
  3592. KillTimer(TMR_SEND_DEVICE_STATE);
  3593. KillTimer(TMR_SEND_POSTION);
  3594. }
  3595. void CYAServerDlg::OnMenuDb()
  3596. {
  3597. CDbSettingDlg dlg;
  3598. dlg.DoModal();
  3599. }
  3600. void CYAServerDlg::OnCallMessage( string const& name, message::ptr const& data, bool isAck,message::list &ack_resp )
  3601. {
  3602. if(data->get_flag() == message::flag_object){
  3603. string cmd = data->get_map()[JSON_ROOT_KEY_CMD]->get_string();
  3604. if(JSON_CMD_VALUE_META_DATA_CHANGED == cmd){
  3605. map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  3606. string name = data_map[JSON_KEY_NAME]->get_string();
  3607. string op_type = data_map[JSON_KEY_OP_TYPE]->get_string();
  3608. EDIT_TYPE_ID edit_type_id = (JSON_KEY_OP_TYPE_INSERT == op_type)? ET_INSERT: ((JSON_KEY_OP_TYPE_UPDATE == op_type)? ET_UPDATE: ET_DELETE);
  3609. if(JSON_KEY_NAME_VEHICLE == name){
  3610. string id = data_map[JSON_KEY_ID]->get_string();
  3611. deal_call_edit_vehicle(id, edit_type_id);
  3612. }else if(JSON_KEY_NAME_STAFF == name){
  3613. string id = data_map[JSON_KEY_ID]->get_string();
  3614. deal_call_edit_staff(id, edit_type_id);
  3615. }else if(JSON_KEY_NAME_READER == name){
  3616. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  3617. deal_call_edit_reader(id, edit_type_id);
  3618. }else if(JSON_KEY_NAME_CARD == name){
  3619. string id = data_map[JSON_KEY_ID]->get_string();
  3620. deal_call_edit_card(id, edit_type_id);
  3621. }else if(JSON_KEY_NAME_AREA == name){
  3622. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  3623. deal_call_edit_area(id, edit_type_id);
  3624. }else if(JSON_KEY_NAME_MAP == name){
  3625. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  3626. deal_call_edit_map(id, edit_type_id);
  3627. }else if(JSON_KEY_NAME_PATH == name){
  3628. //int id = data_map[JSON_KEY_ID]->get_int();
  3629. //deal_call_edit_path(id, edit_type_id);
  3630. }
  3631. }
  3632. //cmd = data->get_map()[JSON_ROOT_KEY_DATA]->get_map()["name"]->get_string();
  3633. //string json_data = data->get_map()[JSON_ROOT_KEY_DATA]->get_string();
  3634. //if(JSON_CMD_VALUE_CALL_CARD == cmd){
  3635. // parse_json_data_call_card(json_data.c_str());
  3636. //} else if(JSON_CMD_VALUE_SET_LIMIT_VALUE == cmd){
  3637. // parse_json_data_set_limit_value(json_data.c_str());
  3638. //} else if(JSON_CMD_VALUE_REQUEST_ALL_POSTION == cmd){
  3639. // send_json_data(JSON_CMD_VALUE_REQUEST_ALL_POSTION, get_json_postion_all());
  3640. //} else if(JSON_CMD_VALUE_EDIT_VEHICLE == cmd){
  3641. // parse_json_data_edit_vehicle(json_data.c_str());
  3642. //} else if(JSON_CMD_VALUE_EDIT_STAFFER == cmd){
  3643. // parse_json_data_edit_staffer(json_data.c_str());
  3644. //} else if(JSON_CMD_VALUE_EDIT_STATION == cmd){
  3645. // parse_json_data_edit_reader(json_data.c_str());
  3646. //} else if(JSON_CMD_VALUE_EDIT_AREA == cmd){
  3647. // parse_json_data_edit_area(json_data.c_str());
  3648. //} else if(JSON_CMD_VALUE_EDIT_CARD == cmd){
  3649. // parse_json_data_edit_card(json_data.c_str());
  3650. //} else if(JSON_CMD_VALUE_EDIT_PATH == cmd){
  3651. // //parse_json_data_edit_path(json_data.c_str());
  3652. //} else if(JSON_CMD_VALUE_EDIT_MAP == cmd){
  3653. // parse_json_data_edit_map(json_data.c_str());
  3654. //} else if(JSON_CMD_VALUE_DEAL_HELP == cmd){
  3655. // parse_json_data_deal_help(json_data.c_str());
  3656. //} else if(JSON_CMD_VALUE_CLEAR_CARD == cmd) {
  3657. // parse_json_data_clear_card(json_data.c_str());
  3658. //}
  3659. }
  3660. }
  3661. void CYAServerDlg::parse_json_data_set_limit_value( const char* sz )
  3662. {
  3663. //USES_CONVERSION;
  3664. //CUTF82C strJson(szJson);
  3665. Json::Value root;
  3666. Json::Reader reader;
  3667. CString strlog;
  3668. if (!reader.parse(sz,root)){
  3669. strlog.Format(_T("%s%s"), _T(LOG_SET_LIMIT_VALUE), _T(LOG_FAIL));
  3670. show_log(strlog);
  3671. return ;
  3672. }
  3673. sls_setting.over_count_person = root[JSON_KEY_ALARM_OVER_COUNT_PERSON].asInt();
  3674. sls_setting.over_count_vehicle = root[JSON_KEY_ALARM_OVER_COUNT_VEHICLE].asInt();
  3675. sls_setting.over_time_person = root[JSON_KEY_ALARM_OVER_TIME_PERSON].asInt();
  3676. sls_setting.over_time_vehicle = root[JSON_KEY_ALARM_OVER_TIME_VEHICLE].asInt();
  3677. sls_setting.over_speed = root[JSON_KEY_ALARM_OVER_SPEED_VEHICLE].asDouble();
  3678. strlog.Format(_T("%s%s"), _T(LOG_SET_LIMIT_VALUE), _T(LOG_SUCCESS));
  3679. show_log(strlog);
  3680. }
  3681. void CYAServerDlg::parse_json_data_call_card( const char* sz )
  3682. {
  3683. Json::Value root;
  3684. Json::Reader reader;
  3685. CString strlog;
  3686. if (!reader.parse(sz,root)){
  3687. strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_FAIL));
  3688. show_log(strlog);
  3689. return ;
  3690. }
  3691. Json::Value data;
  3692. Json::Value stations;
  3693. Json::Value cards;
  3694. int time_out, reader_count, card_count, call_type;
  3695. string user_name, call_time;
  3696. string cardid, readerid;
  3697. data = root[JSON_ROOT_KEY_DATA];
  3698. time_out = data[JSON_KEY_CALL_CARD_CALL_TIME_OUT].asInt();
  3699. user_name = data[JSON_KEY_CALL_CARD_USER_NAME].asString();
  3700. call_time = data[JSON_KEY_CALL_CARD_CALL_TIME].asString();
  3701. call_type = data[JSON_KEY_CALL_CARD_CALL_TYPE].asInt();
  3702. stations = data[JSON_KEY_CALL_CARD_STATIONS];
  3703. cards = data[JSON_KEY_CALL_CARD_CARDS];
  3704. if (stations.isNull() || !stations.isArray() || cards.isNull() || !cards.isArray()){
  3705. strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_FAIL));
  3706. show_log(strlog);
  3707. return ;
  3708. }
  3709. int reader_id, npos;
  3710. //SocketMap::iterator it_sock;
  3711. //BYTE buf[LENGTH_SEND_BUF];
  3712. _call_info_reader* call_reader;
  3713. _call_info_card* call_card;
  3714. for(unsigned int i = 0; i < stations.size(); i++){
  3715. reader_id = stations[i][JSON_KEY_CALL_CARD_STATION_ID].asInt();
  3716. CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
  3717. if(it_call_reader != mp_call_info.end()){
  3718. call_reader = it_call_reader->second;
  3719. if(call_reader->call_type > call_type){
  3720. call_reader->call_type = call_type;
  3721. }
  3722. }else{
  3723. call_reader = new _call_info_reader;
  3724. call_reader->call_type = call_type;
  3725. mp_call_info.insert(make_pair(reader_id, call_reader));
  3726. }
  3727. card_count = cards.size();
  3728. unsigned int j = 0;
  3729. if(/*card_count == 1 &&*/ 0 == cards[j][JSON_KEY_CALL_CARD_CARD_ID].asInt()){ // 卡号为0,全员呼叫
  3730. call_reader->cards_count = 0;
  3731. call_reader->is_call_all = true;
  3732. }else{
  3733. call_reader->cards_count = card_count;
  3734. call_reader->is_call_all = false;
  3735. for(j = 0; j < cards.size(); j++){ // 解析卡号
  3736. int card_id = cards[j][JSON_KEY_CALL_CARD_CARD_ID].asInt();
  3737. BYTE card_type = cards[j][JSON_KEY_CALL_CARD_CARD_TYPE_ID].asInt();
  3738. string str_card_id = CFunctions::getstrwithzero(card_type, 3) + CFunctions::getstrwithzero(card_id, 10);
  3739. CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(str_card_id);
  3740. if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
  3741. call_card = it_call_card->second;
  3742. if(call_card->call_type < call_type){ // 原呼叫优先级低
  3743. call_card->card_type = card_type;
  3744. call_card->call_type = call_type;
  3745. call_card->start_time = time(NULL);
  3746. call_card->time_out = time_out;
  3747. }else {
  3748. call_card->start_time = time(NULL);
  3749. call_card->time_out = time_out;
  3750. }
  3751. }else{ // 未在呼叫列表
  3752. call_card = new _call_info_card;
  3753. call_card->card_id = card_id;
  3754. call_card->card_type = card_type;
  3755. call_card->start_time = time(NULL);
  3756. call_card->time_out = time_out;
  3757. call_card->call_type = call_type;
  3758. call_reader->mpCard.insert(make_pair(str_card_id, call_card));
  3759. }
  3760. //int card_id = cards[j][JSON_KEY_CALL_CARD_CARD_ID].asInt();
  3761. //memcpy(&buf[npos], &card_type, sizeof(BYTE));
  3762. //npos += sizeof(BYTE);
  3763. //CFunctions::memcpyDWord(buf, card_id, npos);
  3764. //npos += sizeof(DWORD);
  3765. }
  3766. }
  3767. // it_sock = mp_socket_list.find(reader_id);
  3768. // if(it_sock != mp_socket_list.end()){ // 发送呼叫信息
  3769. // memset(buf, 0, LENGTH_SEND_BUF);
  3770. // npos = 0;
  3771. // int j = 0;
  3772. // if(card_count == 1){
  3773. // if(0 == cards[j][JSON_KEY_CALL_CARD_CARD_ID].asInt()){
  3774. // card_count = 0;
  3775. // memcpy(&buf[npos], &card_count, sizeof(BYTE));
  3776. // npos += sizeof(BYTE);
  3777. // CFunctions::memcpyWord(buf, time_out, npos);
  3778. // npos += sizeof(WORD);
  3779. // }
  3780. // }else{
  3781. // memcpy(&buf[npos], &card_count, sizeof(BYTE));
  3782. // npos += sizeof(BYTE);
  3783. // CFunctions::memcpyWord(buf, time_out, npos);
  3784. // npos += sizeof(WORD);
  3785. // for(j = 0; j < cards.size(); j++){
  3786. // BYTE card_type = cards[j][JSON_KEY_CALL_CARD_CARD_TYPE_ID].asInt();
  3787. // int card_id = cards[j][JSON_KEY_CALL_CARD_CARD_ID].asInt();
  3788. // memcpy(&buf[npos], &card_type, sizeof(BYTE));
  3789. // npos += sizeof(BYTE);
  3790. // CFunctions::memcpyDWord(buf, card_id, npos);
  3791. // npos += sizeof(DWORD);
  3792. // }
  3793. // }
  3794. // it_sock->second->SendData(CHAR_CALL, npos, buf);
  3795. // }
  3796. }
  3797. strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_SUCCESS));
  3798. show_log(strlog);
  3799. }
  3800. void CYAServerDlg::parse_json_data_clear_card( const char* sz )
  3801. {
  3802. Json::Value root;
  3803. Json::Reader reader;
  3804. CString strlog;
  3805. if (!reader.parse(sz,root)){
  3806. strlog.Format(_T("%s%s"), _T(LOG_CLEAR_CARD), _T(LOG_FAIL));
  3807. show_log(strlog);
  3808. return ;
  3809. }
  3810. if(root.isNull() || !root.isArray()){
  3811. return;
  3812. }
  3813. int card_type_id, edit_type_id;
  3814. string cardid = "";
  3815. for(unsigned int i = 0; i < root.size(); i++){
  3816. cardid = root[i][JSON_KEY_EDIT_CARD_ID].asString();
  3817. edit_type_id = root[i][JSON_KEY_EDIT_EDIT_TYPE_ID].asInt();
  3818. CardMap::iterator it_card = mp_card_list_all.find(cardid);
  3819. if(it_card != mp_card_list_all.end()){
  3820. if(STATUS_ERROR == it_card->second->status_lost){
  3821. // 升井
  3822. it_card->second->up_time = time(NULL);
  3823. it_card->second->pos_state = DT_UP;
  3824. card_enter_mine(it_card->second);
  3825. remove_card(cardid); // reset_card_status();
  3826. }
  3827. }
  3828. }
  3829. strlog.Format(_T("%s%s"), _T(LOG_CLEAR_CARD), _T(LOG_SUCCESS));
  3830. show_log(strlog);
  3831. }
  3832. void CYAServerDlg::parse_json_data_deal_help( const char* sz )
  3833. {
  3834. Json::Value root;
  3835. Json::Reader reader;
  3836. CString strlog;
  3837. if (!reader.parse(sz,root)){
  3838. strlog.Format(_T("%s%s"), _T(LOG_DEAL_HELP), _T(LOG_FAIL));
  3839. show_log(strlog);
  3840. return ;
  3841. }
  3842. int card_type_id, edit_type_id;
  3843. string cardid = root[JSON_KEY_EDIT_CARD_ID].asString();
  3844. card_type_id = root[JSON_KEY_CARD_TYPE_ID].asInt();
  3845. edit_type_id = root[JSON_KEY_EDIT_EDIT_TYPE_ID].asInt();
  3846. CardMap::iterator it_card = mp_card_list_help.find(cardid);
  3847. if(it_card != mp_card_list_help.end()){
  3848. it_card->second->status_help = STATUS_ERROR_DEALED;
  3849. }
  3850. strlog.Format(_T("%s%s"), _T(LOG_DEAL_HELP), _T(LOG_SUCCESS));
  3851. show_log(strlog);
  3852. }
  3853. void CYAServerDlg::deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id)
  3854. {
  3855. CString strlog;
  3856. switch (edit_type_id)
  3857. {
  3858. case ET_INSERT:
  3859. {
  3860. init_map(id);
  3861. break;
  3862. }
  3863. case ET_UPDATE:
  3864. {
  3865. init_map(id);
  3866. break;
  3867. }
  3868. case ET_DELETE:
  3869. {
  3870. MapInfoMap::iterator it_map = mp_map_list.find(id);
  3871. if(it_map != mp_map_list.end()){
  3872. mp_map_list.erase(it_map);
  3873. }
  3874. break;
  3875. }
  3876. default:
  3877. break;
  3878. }
  3879. strlog.Format(_T("%s%s"), _T(LOG_EDIT_MAP), _T(LOG_SUCCESS));
  3880. show_log(strlog);
  3881. }
  3882. void CYAServerDlg::deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id)
  3883. {
  3884. CString strlog;
  3885. switch (edit_type_id)
  3886. {
  3887. case ET_INSERT:
  3888. {
  3889. init_area(id);
  3890. break;
  3891. }
  3892. case ET_UPDATE:
  3893. {
  3894. init_area(id);
  3895. break;
  3896. }
  3897. case ET_DELETE:
  3898. {
  3899. AreaMap::iterator it_area = mp_area_list.find(id);
  3900. MapInfoMap::iterator it_map = mp_map_list.find(it_area->second->map_id);
  3901. if(it_map != mp_map_list.end()){
  3902. AreaMap::iterator it_map_area = it_map->second->map_area_list.find(id);
  3903. it_map->second->map_area_list.erase(it_map_area);
  3904. }
  3905. if(it_area != mp_area_list.end()){
  3906. mp_area_list.erase(it_area);
  3907. }
  3908. it_area = mp_area_over_count_person.find(id);
  3909. if(it_area != mp_area_over_count_person.end()){
  3910. mp_area_over_count_person.erase(it_area);
  3911. }
  3912. it_area = mp_area_over_time_person.find(id);
  3913. if(it_area != mp_area_over_time_person.end()){
  3914. mp_area_over_time_person.erase(it_area);
  3915. }
  3916. it_area = mp_area_forbidden_person.find(id);
  3917. if(it_area != mp_area_forbidden_person.end()){
  3918. mp_area_forbidden_person.erase(it_area);
  3919. }
  3920. it_area = mp_area_over_count_vehicle.find(id);
  3921. if(it_area != mp_area_over_count_vehicle.end()){
  3922. mp_area_over_count_vehicle.erase(it_area);
  3923. }
  3924. it_area = mp_area_over_time_vehicle.find(id);
  3925. if(it_area != mp_area_over_time_vehicle.end()){
  3926. mp_area_over_time_vehicle.erase(it_area);
  3927. }
  3928. it_area = mp_area_forbidden_vehicle.find(id);
  3929. if(it_area != mp_area_forbidden_vehicle.end()){
  3930. mp_area_forbidden_vehicle.erase(it_area);
  3931. }
  3932. break;
  3933. }
  3934. default:
  3935. break;
  3936. }
  3937. strlog.Format(_T("%s%s"), _T(LOG_EDIT_AREA), _T(LOG_SUCCESS));
  3938. show_log(strlog);
  3939. }
  3940. void CYAServerDlg::deal_call_edit_reader(int id, EDIT_TYPE_ID edit_type_id)
  3941. {
  3942. CString strlog;
  3943. switch (edit_type_id)
  3944. {
  3945. case ET_INSERT:
  3946. {
  3947. init_reader(id);
  3948. init_antenna(id);
  3949. init_all_readers_coverage(id);
  3950. break;
  3951. }
  3952. case ET_UPDATE:
  3953. {
  3954. init_reader(id);
  3955. init_reader(id);
  3956. init_all_readers_coverage(id);
  3957. break;
  3958. }
  3959. case ET_DELETE:
  3960. {
  3961. ReaderMap::iterator it_reader = mp_reader_list.find(id);
  3962. MapInfoMap::iterator it_map = mp_map_list.find(it_reader->second->map_id);
  3963. if(it_map != mp_map_list.end()){
  3964. ReaderMap::iterator it_map_reader = it_map->second->map_reader_list.find(id);
  3965. if(it_map_reader != it_map->second->map_reader_list.end()){
  3966. it_map->second->map_reader_list.erase(it_map_reader);
  3967. }
  3968. }
  3969. if(it_reader != mp_reader_list.end()){
  3970. mp_reader_list.erase(it_reader);
  3971. }
  3972. break;
  3973. }
  3974. default:
  3975. break;
  3976. }
  3977. strlog.Format(_T("%s%s"), _T(LOG_EDIT_READER), _T(LOG_SUCCESS));
  3978. show_log(strlog);
  3979. }
  3980. void CYAServerDlg::deal_call_edit_card(string id, EDIT_TYPE_ID edit_type_id)
  3981. {
  3982. CString strlog;
  3983. CardMap::iterator it_card = mp_card_list_all.find(id);
  3984. if(it_card == mp_card_list_all.end()){
  3985. return;
  3986. }
  3987. int card_type_id = it_card->second->card_type;
  3988. switch (edit_type_id)
  3989. {
  3990. case ET_INSERT:
  3991. {
  3992. if(CT_VEHICLE == card_type_id){
  3993. init_vehicle(id, true);
  3994. }else if(CT_PERSON == card_type_id) {
  3995. init_staffer(id, true);
  3996. }
  3997. break;
  3998. }
  3999. case ET_UPDATE:
  4000. {
  4001. if(CT_VEHICLE == card_type_id){
  4002. init_vehicle(id, true);
  4003. }else if(CT_PERSON == card_type_id) {
  4004. init_staffer(id, true);
  4005. }
  4006. break;
  4007. }
  4008. case ET_DELETE:
  4009. {
  4010. remove_card(id);
  4011. break;
  4012. }
  4013. default:
  4014. break;
  4015. }
  4016. strlog.Format(_T("%s%s"), _T(LOG_EDIT_CARD), _T(LOG_SUCCESS));
  4017. show_log(strlog);
  4018. }
  4019. void CYAServerDlg::deal_call_edit_staff(string id, EDIT_TYPE_ID edit_type_id)
  4020. {
  4021. CString strlog;
  4022. switch (edit_type_id)
  4023. {
  4024. case ET_INSERT:
  4025. {
  4026. init_staffer(id);
  4027. break;
  4028. }
  4029. case ET_UPDATE:
  4030. {
  4031. init_staffer(id);
  4032. break;
  4033. }
  4034. case ET_DELETE:
  4035. {
  4036. string cardid = "";
  4037. CardMap::iterator it_card = mp_card_list_down_person.begin();
  4038. for(; it_card != mp_card_list_down_person.end(); ++it_card){
  4039. if(it_card->second->id == id){
  4040. cardid = it_card->second->card_id;
  4041. break;
  4042. }
  4043. }
  4044. remove_card(cardid);
  4045. break;
  4046. }
  4047. default:
  4048. break;
  4049. }
  4050. strlog.Format(_T("%s%s"), _T(LOG_EDIT_STAFFER), _T(LOG_SUCCESS));
  4051. show_log(strlog);
  4052. }
  4053. void CYAServerDlg::deal_call_edit_vehicle(string id, EDIT_TYPE_ID edit_type_id)
  4054. {
  4055. CString strlog;
  4056. switch (edit_type_id)
  4057. {
  4058. case ET_INSERT:
  4059. {
  4060. init_vehicle(id);
  4061. break;
  4062. }
  4063. case ET_UPDATE:
  4064. {
  4065. init_vehicle(id);
  4066. break;
  4067. }
  4068. case ET_DELETE:
  4069. {
  4070. string cardid = "";
  4071. CardMap::iterator it_card = mp_card_list_down_vehicle.begin();
  4072. for(; it_card != mp_card_list_down_vehicle.end(); ++it_card){
  4073. if(it_card->second->id == id){
  4074. cardid = it_card->second->card_id;
  4075. break;
  4076. }
  4077. }
  4078. remove_card(cardid);
  4079. break;
  4080. }
  4081. default:
  4082. break;
  4083. }
  4084. strlog.Format(_T("%s%s"), _T(LOG_EDIT_VEHICLE), _T(LOG_SUCCESS));
  4085. show_log(strlog);
  4086. }
  4087. void CYAServerDlg::remove_card( string card_id )
  4088. {
  4089. if(card_id.length() == 0)
  4090. return;
  4091. int card_type_id = 0;
  4092. CardMap::iterator it_card = mp_card_list_all.find(card_id);
  4093. if(it_card == mp_card_list_all.end()){
  4094. return;
  4095. }
  4096. card_type_id = it_card->second->card_type;
  4097. mp_card_list_all.erase(it_card);
  4098. MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id);
  4099. if(it_map != mp_map_list.end()){
  4100. if(CT_VEHICLE == card_type_id){
  4101. CardMap::iterator it_map_card = it_map->second->map_card_list_vehicle.find(card_id);
  4102. if(it_map_card != it_map->second->map_card_list_vehicle.end()){
  4103. it_map->second->map_card_list_vehicle.erase(it_map_card);
  4104. }
  4105. }else if(CT_PERSON == card_type_id){
  4106. CardMap::iterator it_map_card = it_map->second->map_card_list_person.find(card_id);
  4107. if(it_map_card != it_map->second->map_card_list_person.end()){
  4108. it_map->second->map_card_list_person.erase(it_map_card);
  4109. }
  4110. }
  4111. }
  4112. AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id);
  4113. if(it_area != mp_area_list.end()){
  4114. if(CT_VEHICLE == card_type_id){
  4115. CardMap::iterator it_area_card = it_area->second->area_card_list_vehicle.find(card_id);
  4116. if(it_area_card != it_area->second->area_card_list_vehicle.end()){
  4117. it_area->second->area_card_list_vehicle.erase(it_area_card);
  4118. }
  4119. }else if(CT_PERSON == card_type_id){
  4120. CardMap::iterator it_area_card = it_area->second->area_card_list_person.find(card_id);
  4121. if(it_area_card != it_area->second->area_card_list_person.end()){
  4122. it_area->second->area_card_list_person.erase(it_area_card);
  4123. }
  4124. }
  4125. }
  4126. DeptMap::iterator it_dept = mp_dept_list.find(it_card->second->dept_id);
  4127. if(it_dept != mp_dept_list.end()){
  4128. if(CT_VEHICLE == card_type_id){
  4129. CardMap::iterator it_dept_card = it_dept->second->dept_card_list_vehicle.find(card_id);
  4130. if(it_dept_card != it_dept->second->dept_card_list_vehicle.end()){
  4131. it_dept->second->dept_card_list_vehicle.erase(it_dept_card);
  4132. }
  4133. }else if(CT_PERSON == card_type_id){
  4134. CardMap::iterator it_dept_card = it_dept->second->dept_card_list_person.find(card_id);
  4135. if(it_dept_card != it_dept->second->dept_card_list_person.end()){
  4136. it_dept->second->dept_card_list_person.erase(it_dept_card);
  4137. }
  4138. }
  4139. }
  4140. if(CT_VEHICLE == card_type_id){
  4141. it_card = mp_card_list_down_vehicle.find(card_id);
  4142. if(it_card != mp_card_list_down_vehicle.end()){
  4143. mp_card_list_down_vehicle.erase(it_card);
  4144. }
  4145. it_card = mp_card_list_forbidden_vehicle.find(card_id);
  4146. if(it_card != mp_card_list_forbidden_vehicle.end()){
  4147. mp_card_list_forbidden_vehicle.erase(it_card);
  4148. }
  4149. it_card = mp_card_list_over_time_vehicle.find(card_id);
  4150. if(it_card != mp_card_list_over_time_vehicle.end()){
  4151. mp_card_list_over_time_vehicle.erase(it_card);
  4152. }
  4153. it_card = mp_card_list_area_over_time_vehicle.find(card_id);
  4154. if(it_card != mp_card_list_area_over_time_vehicle.end()){
  4155. mp_card_list_area_over_time_vehicle.erase(it_card);
  4156. }
  4157. it_card = mp_card_list_over_speed_vehicle.find(card_id);
  4158. if(it_card != mp_card_list_over_speed_vehicle.end()){
  4159. mp_card_list_over_speed_vehicle.erase(it_card);
  4160. }
  4161. }else if(CT_PERSON == card_type_id) {
  4162. it_card = mp_card_list_down_person.find(card_id);
  4163. if(it_card != mp_card_list_down_person.end()){
  4164. mp_card_list_down_person.erase(it_card);
  4165. }
  4166. it_card = mp_card_list_over_time_person.find(card_id);
  4167. if(it_card != mp_card_list_over_time_person.end()){
  4168. mp_card_list_over_time_person.erase(it_card);
  4169. }
  4170. it_card = mp_card_list_forbidden_person.find(card_id);
  4171. if(it_card != mp_card_list_forbidden_person.end()){
  4172. mp_card_list_forbidden_person.erase(it_card);
  4173. }
  4174. it_card = mp_card_list_help.find(card_id);
  4175. if(it_card != mp_card_list_help.end()){
  4176. mp_card_list_help.erase(it_card);
  4177. }
  4178. it_card = mp_card_list_area_over_time_person.find(card_id);
  4179. if(it_card != mp_card_list_area_over_time_person.end()){
  4180. mp_card_list_area_over_time_person.erase(it_card);
  4181. }
  4182. }
  4183. }
  4184. void CYAServerDlg::save_card_postion( Card* card )
  4185. {
  4186. // 位置发生变化
  4187. double moved_dist = sqrt(pow(card->x - card->last_x, 2) + pow(card->y - card->last_y, 2) +
  4188. pow(card->z - card->last_z, 2));
  4189. //if( moved_dist < card->map_scale/2.0){
  4190. // return ;
  4191. //}
  4192. //if(moved_dist > CM_PIX * 20){ //移动距离大于20m,认为出错
  4193. // card->x = card->last_x;
  4194. // card->y = card->last_y;
  4195. // card->z = card->last_z;
  4196. // return;
  4197. //}
  4198. // 位置变化幅度大于1m
  4199. card->last_x = card->x;
  4200. card->last_y = card->y;
  4201. card->last_z = card->z;
  4202. card->is_first_location = false;
  4203. store_data_card(card, HIS_LOCATION);
  4204. }
  4205. void CYAServerDlg::store_data_area( Area* area, time_t cur_time, time_t start_time, int tag )
  4206. {
  4207. char sql[LENGTH_SQL] = {'\0'};
  4208. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  4209. struct tm local_time, local_time_ex;
  4210. localtime_s(&local_time, &cur_time);
  4211. localtime_s(&local_time_ex, &start_time);
  4212. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4213. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4214. switch(tag){
  4215. case ALARM_AREA_OVER_COUNT_PERSON_START:
  4216. {
  4217. int alarm_type_id = ATID_AREA_OVER_COUNT_PERSON;
  4218. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_area(area_id, alarm_type_id, start_time) VALUES(%d, %d, '%s');",
  4219. area->area_id, alarm_type_id, _time);
  4220. break;
  4221. }
  4222. case ALARM_AREA_OVER_COUNT_PERSON_END:
  4223. {
  4224. localtime_s(&local_time_ex, &area->time_over_count_person);
  4225. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4226. int alarm_type_id = ATID_AREA_OVER_COUNT_PERSON;
  4227. sprintf_s(sql, LENGTH_SQL,
  4228. "UPDATE his_alarm_area SET end_time = '%s' WHERE area_id=%d AND alarm_type_id=%d AND start_time = '%s';",
  4229. _time, area->area_id, alarm_type_id, _time_ex);
  4230. break;
  4231. }
  4232. default:
  4233. return;
  4234. }
  4235. execute_sql(sql);
  4236. }
  4237. void CYAServerDlg::store_data_reader( Reader* reader, int tag )
  4238. {
  4239. char sql[LENGTH_SQL] = {'\0'};
  4240. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  4241. struct tm local_time, local_time_ex;
  4242. localtime_s(&local_time, &reader->lost_time);
  4243. localtime_s(&local_time_ex, &reader->rec_time);
  4244. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4245. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4246. switch(tag){
  4247. case ALARM_READER_LOST_START:
  4248. {
  4249. int alarm_type_id = ATID_READER;
  4250. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_reader(reader_id, alarm_type_id, start_time, rec_time) VALUES(%d, %d, '%s', '%s');",
  4251. reader->reader_id, alarm_type_id, _time, _time_ex);
  4252. break;
  4253. }
  4254. case ALARM_READER_LOST_END:
  4255. {
  4256. int alarm_type_id = ATID_READER;
  4257. sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_reader set end_time='%s' where reader_id=%d and alarm_type_id=%d and start_time='%s';",
  4258. _time_ex, reader->reader_id, alarm_type_id, _time);
  4259. break;
  4260. }
  4261. default:
  4262. return;
  4263. }
  4264. execute_sql(sql);
  4265. }
  4266. void CYAServerDlg::execute_sql( const char* sql )
  4267. {
  4268. //return ;
  4269. //::AfxBeginThread(_ExecSql, (LPVOID)pSQLData);
  4270. CMysqlConn* pConn = NULL;
  4271. CDBConnGuard pDbGuard(pConn);
  4272. MYSQL_RES* pRes;
  4273. int err = 0;
  4274. pRes = pConn->Execute(sql, err);
  4275. if(err){
  4276. CString szLog;
  4277. szLog.Format(_T("%s:\n%s"), _T(LOG_EXEC_SQL_ERROR), CFunctions::c2wc(sql));
  4278. show_log(szLog);
  4279. }
  4280. mysql_free_result(pRes);
  4281. }
  4282. void CYAServerDlg::OnMenuLog()
  4283. {
  4284. CLogSetting dlg;
  4285. dlg.DoModal();
  4286. }
  4287. void CYAServerDlg::OnMenuParam()
  4288. {
  4289. CSysSetting dlg;
  4290. dlg.DoModal();
  4291. }
  4292. void CYAServerDlg::OnLogin( string const& name, message::ptr const& data, bool isAck, message::list &ack_resp )
  4293. {
  4294. // res_data ={
  4295. //code: -1,
  4296. //msg: '服务器错误,请联系系统管理员!',
  4297. //data: {
  4298. //name: user_name,
  4299. // }
  4300. // }
  4301. //_lock.lock();
  4302. int res_code = (int)data->get_map()["code"]->get_int();
  4303. switch (res_code)
  4304. {
  4305. case -1: // 用户未登录
  4306. {
  4307. ws_login();
  4308. break;
  4309. }
  4310. case 0:
  4311. {
  4312. if("" == data->get_map()["code"]->get_string()){ // 登录成功
  4313. is_websocket_login = true;
  4314. }else{ // 退出登录
  4315. is_websocket_login = false;
  4316. }
  4317. break;
  4318. }
  4319. default:
  4320. break;
  4321. }
  4322. is_websocket_login = true;
  4323. //bool plural = participants !=1;
  4324. //HIGHLIGHT("Welcome to Socket.IO Chat-\nthere"<<(plural?" are ":"'s ")<< participants<<(plural?" participants":" participant"));
  4325. //_cond.notify_all();
  4326. //_lock.unlock();
  4327. //current_socket->off("login");
  4328. }
  4329. void CYAServerDlg::OnLoginCallBack( message::list const& msglist /*= nullptr*/ )
  4330. {
  4331. message::ptr msg_ptr = msglist[0];
  4332. int n = (int)msg_ptr->get_map()["code"]->get_int();
  4333. is_websocket_login = (0 == n) ? true : false;
  4334. }
  4335. void CYAServerDlg::send_call_info()
  4336. {
  4337. BYTE buf[LENGTH_SEND_BUF];
  4338. //SocketMap::iterator it_sock;
  4339. //CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin();
  4340. //for(; it_call_reader != mp_call_info.end(); ++it_call_reader){
  4341. // it_sock = mp_socket_list.find(it_call_reader->first);
  4342. // if(it_sock != mp_socket_list.end()){
  4343. // memset(buf, 0, LENGTH_SEND_BUF);
  4344. // int npos = 0, card_count = 0;
  4345. // memcpy(&buf[npos], &card_count, sizeof(BYTE));
  4346. // npos += sizeof(BYTE);
  4347. // memcpy(&buf[npos], &it_call_reader->second->call_type, sizeof(BYTE));
  4348. // npos += sizeof(BYTE);
  4349. // if(!it_call_reader->second->is_call_all){ // 定员呼叫,加入卡列表
  4350. // CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin();
  4351. // for(; it_call_card != it_call_reader->second->mpCard.end(); ++it_call_card){
  4352. // memcpy(&buf[npos], &it_call_card->second->call_type, sizeof(BYTE));
  4353. // npos += sizeof(BYTE);
  4354. // memcpy(&buf[npos], &it_call_card->second->card_type, sizeof(BYTE));
  4355. // npos += sizeof(BYTE);
  4356. // BYTE id_len = (BYTE)get_card_id_len(it_call_card->second->card_type);
  4357. // memcpy(&buf[npos], &id_len, sizeof(BYTE));
  4358. // npos += sizeof(BYTE);
  4359. // if(id_len > 1){ // 标准卡id为4个字节,自组网卡为1个字节
  4360. // CFunctions::memcpyDWord(buf, it_call_card->second->card_id, npos);
  4361. // }else{
  4362. // memcpy(&buf[npos], &it_call_card->second->card_id, id_len);
  4363. // }
  4364. // npos += id_len;
  4365. // card_count++;
  4366. // }
  4367. // memcpy(&buf[0], &card_count, sizeof(BYTE));
  4368. // }
  4369. // it_sock->second->SendData(CHAR_CALL, npos, buf);
  4370. // }
  4371. //}
  4372. }
  4373. void CYAServerDlg::clear_call_info()
  4374. {
  4375. CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin();
  4376. time_t current_time = time_t(NULL);
  4377. for(; it_call_reader != mp_call_info.end(); ++it_call_reader){
  4378. if(it_call_reader->second->is_call_all){
  4379. }else{
  4380. CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin();
  4381. for(; it_call_card != it_call_reader->second->mpCard.end(); ++it_call_card){
  4382. if(difftime(current_time, it_call_card->second->start_time) > it_call_card->second->time_out * 60 ){
  4383. it_call_reader->second->mpCard.erase(it_call_card);
  4384. }
  4385. }
  4386. }
  4387. }
  4388. }
  4389. int CYAServerDlg::get_card_id_len( int card_type )
  4390. {
  4391. switch (card_type)
  4392. {
  4393. //case CT_PERSON:
  4394. // return 4;
  4395. //case CT_VEHICLE:
  4396. // return 4;
  4397. case CT_ADHOC:
  4398. return 1;
  4399. default:
  4400. return 4;
  4401. //break;
  4402. }
  4403. }
  4404. std::string CYAServerDlg::get_json_call_test()
  4405. {
  4406. Json::Value root;
  4407. Json::Value val_data;
  4408. Json::Value val_stations;
  4409. Json::Value val_station;
  4410. Json::Value val_cards;
  4411. Json::Value val_card;
  4412. char _time[STR_LEN_TIME];
  4413. struct tm local_time;
  4414. time_t tt = time(NULL);
  4415. localtime_s(&local_time, &tt);
  4416. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  4417. val_data[JSON_KEY_CALL_CARD_CALL_TIME] = _time;
  4418. val_data[JSON_KEY_CALL_CARD_CALL_TYPE] = 0;
  4419. val_data[JSON_KEY_CALL_CARD_USER_NAME] = "aaaaaa";
  4420. val_data[JSON_KEY_CALL_CARD_CALL_TIME_OUT] = 5;
  4421. val_station[JSON_KEY_CALL_CARD_STATION_ID] = 233;
  4422. val_stations.append(val_station);
  4423. val_station[JSON_KEY_CALL_CARD_STATION_ID] = 59;
  4424. val_stations.append(val_station);
  4425. val_card[JSON_KEY_CALL_CARD_CARD_TYPE_ID] = 3;
  4426. val_card[JSON_KEY_CALL_CARD_CARD_ID] = 5;
  4427. val_cards.append(val_card);
  4428. val_card[JSON_KEY_CALL_CARD_CARD_TYPE_ID] = 3;
  4429. val_card[JSON_KEY_CALL_CARD_CARD_ID] = 8;
  4430. val_cards.append(val_card);
  4431. val_data[JSON_KEY_CALL_CARD_STATIONS] = val_stations;
  4432. val_data[JSON_KEY_CALL_CARD_CARDS] = val_cards;
  4433. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_CALL_CARD_START;
  4434. root[JSON_ROOT_KEY_DATA] = val_data;
  4435. return root.toFastString();
  4436. }
  4437. void CYAServerDlg::init_base_data()
  4438. {
  4439. init_setting();
  4440. init_alarm_type();
  4441. init_dept();
  4442. init_card();
  4443. init_staffer();
  4444. init_vehicle();
  4445. init_map();
  4446. init_area();
  4447. init_reader();
  4448. init_antenna();
  4449. init_all_readers_coverage();
  4450. init_tdoa_all_readers_coverage();
  4451. init_dev_adhoc();
  4452. init_antenna_sync();
  4453. }
  4454. void CYAServerDlg::load_his_data()
  4455. {
  4456. //load_his_down(); // 入井状态
  4457. //load_his_area(); // 所在区域
  4458. load_his_reader(); // 分站状态
  4459. load_his_card_postion(); // 所在位置
  4460. load_his_card_state();
  4461. deal_hist_card_postion();
  4462. }
  4463. void CYAServerDlg::load_his_down()
  4464. {
  4465. }
  4466. void CYAServerDlg::load_his_area()
  4467. {
  4468. CMysqlConn* pConn = NULL;
  4469. CDBConnGuard pDbGuard(pConn);
  4470. MYSQL_RES* pRes;
  4471. MYSQL_ROW pRow;
  4472. int err = 0;
  4473. char buf[LENGTH_SQL] = {0};
  4474. sprintf_s(buf, "select la.card_id, la.area_id, la.map_id, la.enter_time from his_location_area la, \
  4475. (select card_id, max(enter_time) enter_time from his_location_area where leave_time is null group by(card_id)) lax \
  4476. where la.card_id = lax.card_id and la.enter_time = lax.enter_time;");
  4477. pRes = pConn->Execute(buf, err);
  4478. int nRow = 0;
  4479. std::string enter_time;
  4480. while(pRow = mysql_fetch_row(pRes)){
  4481. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  4482. if(it != mp_card_list_all.end()){
  4483. it->second->area_id = atoi(pRow[1]);
  4484. it->second->map_id = atoi(pRow[2]);
  4485. enter_time = pRow[3];
  4486. API_StringToTime(enter_time, it->second->enter_area_time);
  4487. nRow++;
  4488. }
  4489. }
  4490. mysql_free_result(pRes);
  4491. CString strlog;
  4492. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_AREA), nRow, _T(LOG_RECORD_COUNT));
  4493. show_log(strlog);
  4494. }
  4495. void CYAServerDlg::load_his_card_postion()
  4496. {
  4497. CMysqlConn* pConn = NULL;
  4498. CDBConnGuard pDbGuard(pConn);
  4499. MYSQL_RES* pRes;
  4500. MYSQL_ROW pRow;
  4501. int err = 0;
  4502. char buf[LENGTH_SQL] = {0};
  4503. sprintf_s(buf, "select l.card_id, l.cur_time, l.x, l.y, l.z, la.map_id, la.area_id, la.enter_time, att.start_time \
  4504. from his_location l, (select card_id, max(cur_time) cur_time from his_location group by card_id) lx, \
  4505. (select la.* from his_location_area la, (select card_id, max(enter_time) enter_time from his_location_area group by card_id) lax \
  4506. where la.card_id = lax.card_id and la.enter_time = lax.enter_time and la.leave_time is null) la, \
  4507. (select att.* from rpt_attendance att, (select card_id, max(start_time) start_time from rpt_attendance group by card_id) attx \
  4508. where att.card_id = attx.card_id and att.start_time = attx. start_time and att.end_time is null) att \
  4509. where l.card_id = lx.card_id and l.cur_time = lx.cur_time \
  4510. and l.card_id = la.card_id and l.area_id = la.area_id and l.cur_time >= la.enter_time \
  4511. and l.card_id = att.card_id and l.cur_time >= att.start_time;");
  4512. pRes = pConn->Execute(buf, err);
  4513. int nRow = 0;
  4514. std::string rec_time, enter_time, start_time;
  4515. while(pRow = mysql_fetch_row(pRes)){
  4516. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  4517. if(it != mp_card_list_all.end()){
  4518. rec_time = pRow[1];
  4519. API_StringToTime(rec_time, it->second->rec_time);
  4520. it->second->x = atof(pRow[2]);
  4521. it->second->y = atof(pRow[3]);
  4522. it->second->z = atof(pRow[4]);
  4523. it->second->area_id = atoi(pRow[5]);
  4524. it->second->map_id = atoi(pRow[6]);
  4525. enter_time = pRow[7];
  4526. API_StringToTime(enter_time, it->second->enter_area_time);
  4527. start_time = pRow[8];
  4528. API_StringToTime(start_time, it->second->down_time);
  4529. it->second->pos_state = DT_DOWN;
  4530. it->second->pos_state_old = DT_DOWN;
  4531. //it->second->deal_time = time(NULL);
  4532. it->second->is_hist = true;
  4533. //it->second->isdealed = true;
  4534. //it->second->issent = false;
  4535. nRow++;
  4536. //card_down_mine(it->second, true);
  4537. //card_enter_map(it->second, true);
  4538. //card_enter_area(it->second, true);
  4539. //if(it->second->card_type == CT_VEHICLE){
  4540. // mp_card_list_down_vehicle.insert(make_pair(it->second->card_id, it->second));
  4541. //}else if(it->second->card_type == CT_PERSON){
  4542. // mp_card_list_down_person.insert(make_pair(it->second->card_id, it->second));
  4543. //}
  4544. }
  4545. }
  4546. mysql_free_result(pRes);
  4547. CString strlog;
  4548. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_POSTION), nRow, _T(LOG_RECORD_COUNT));
  4549. show_log(strlog);
  4550. }
  4551. int CYAServerDlg::API_TimeToString( string &strDateStr,const time_t &timeData )
  4552. {
  4553. char chTmp[100] = {0};
  4554. memset(chTmp, 0, sizeof(chTmp));
  4555. struct tm *p = 0;
  4556. localtime_s(p, &timeData);
  4557. //p = localtime(&timeData);
  4558. p->tm_year = p->tm_year + 1900;
  4559. p->tm_mon = p->tm_mon + 1;
  4560. sprintf_s(chTmp,sizeof(chTmp),"%.4d-%.2d-%.2d %.2d:%.2d:%.2d",
  4561. p->tm_year, p->tm_mon, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
  4562. strDateStr = chTmp;
  4563. return 0;
  4564. }
  4565. int CYAServerDlg::API_StringToTime( const string &strDateStr,time_t &timeData )
  4566. {
  4567. char *pBeginPos = (char*) strDateStr.c_str();
  4568. char *pPos = strstr(pBeginPos,"-");
  4569. if(pPos == NULL){
  4570. //printf("strDateStr[%s] err /n", strDateStr.c_str());
  4571. return -1;
  4572. }
  4573. int iYear = atoi(pBeginPos);
  4574. int iMonth = atoi(pPos + 1);
  4575. pPos = strstr(pPos + 1,"-");
  4576. if(pPos == NULL){
  4577. //printf("strDateStr[%s] err /n", strDateStr.c_str());
  4578. return -1;
  4579. }
  4580. int iDay = atoi(pPos + 1);
  4581. int iHour=0;
  4582. int iMin=0;
  4583. int iSec=0;
  4584. pPos = strstr(pPos + 1," ");
  4585. //为了兼容有些没精确到时分秒的
  4586. if(pPos != NULL){
  4587. iHour=atoi(pPos + 1);
  4588. pPos = strstr(pPos + 1,":");
  4589. if(pPos != NULL){
  4590. iMin=atoi(pPos + 1);
  4591. pPos = strstr(pPos + 1,":");
  4592. if(pPos != NULL){
  4593. iSec=atoi(pPos + 1);
  4594. }
  4595. }
  4596. }
  4597. struct tm sourcedate;
  4598. memset((void*)&sourcedate, 0, sizeof(sourcedate));
  4599. sourcedate.tm_sec = iSec;
  4600. sourcedate.tm_min = iMin;
  4601. sourcedate.tm_hour = iHour;
  4602. sourcedate.tm_mday = iDay;
  4603. sourcedate.tm_mon = iMonth - 1;
  4604. sourcedate.tm_year = iYear - 1900;
  4605. timeData = mktime(&sourcedate);
  4606. return 0;
  4607. }
  4608. int CYAServerDlg::init_card( string card_id /*= ""*/ )
  4609. {
  4610. CMysqlConn* pConn = NULL;
  4611. CDBConnGuard pDbGuard(pConn);
  4612. MYSQL_RES* pRes;
  4613. MYSQL_ROW pRow;
  4614. int err = 0;
  4615. char buf[LENGTH_SQL] = {0};
  4616. if(card_id.length() == 0){
  4617. sprintf_s(buf, "select card_id, card_type_id, state, is_count, ident from dat_card where state = 0;");
  4618. }else{
  4619. sprintf_s(buf, "select card_id, card_type_id, state, is_count, ident from dat_card where state = 0 and card_id='%s';", card_id.c_str());
  4620. }
  4621. pRes = pConn->Execute(buf, err);
  4622. Card* pCard = NULL;
  4623. int nRow = 0;
  4624. while(pRow = mysql_fetch_row(pRes)){
  4625. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  4626. if(it != mp_card_list_all.end()){
  4627. pCard = it->second;
  4628. }else{
  4629. pCard = new Card(pRow[0], atoi(pRow[1]), theApp.z_offset);
  4630. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  4631. nRow++;
  4632. }
  4633. }
  4634. mysql_free_result(pRes);
  4635. CString strlog;
  4636. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_CARD), nRow, _T(LOG_RECORD_COUNT));
  4637. show_log(strlog);
  4638. return 0;
  4639. }
  4640. void CYAServerDlg::card_up_mine( Card* card )
  4641. {
  4642. card->up_time = card->deal_time;
  4643. store_data_card(card, RPT_ATTEND_UP);
  4644. if(CT_PERSON == card->card_type){
  4645. CardMap::iterator it_card = mp_card_list_down_person.find(card->card_id);
  4646. if(it_card != mp_card_list_down_person.end()){
  4647. mp_card_list_down_person.erase(it_card); // 从井下卡列表删除
  4648. }
  4649. if(mp_card_list_down_person.size() <= sls_setting.over_count_person && time_over_count_person >0){ // 取消报警
  4650. store_data_mine(ALARM_MINE_OVER_COUNT_PERSON_END);
  4651. time_over_count_person = 0;
  4652. }
  4653. }else if(CT_VEHICLE == card->card_type){
  4654. CardMap::iterator it_card = mp_card_list_down_vehicle.find(card->card_id);
  4655. if(it_card != mp_card_list_down_vehicle.end()){
  4656. mp_card_list_down_vehicle.erase(it_card); // 从井下卡列表删除
  4657. }
  4658. if(mp_card_list_down_vehicle.size() < sls_setting.over_count_vehicle && time_over_count_vehicle > 0){
  4659. store_data_mine(ALARM_MINE_OVER_COUNT_VEHICLE_END);
  4660. time_over_count_vehicle = 0;
  4661. }
  4662. }
  4663. DeptMap::iterator it_dept = mp_dept_list.find(card->dept_id);
  4664. if(it_dept != mp_dept_list.end()){
  4665. if(CT_PERSON == card->card_type){
  4666. CardMap::iterator it_card = it_dept->second->dept_card_list_person.find(card->card_id);
  4667. if(it_card != it_dept->second->dept_card_list_person.end()){
  4668. it_dept->second->dept_card_list_person.erase(it_card); // 从井下卡列表删除
  4669. }
  4670. store_data_card(card, ALARM_CARD_OVER_TIME_END);
  4671. deal_alarm_card(card, &mp_card_list_over_time_person, false, AF_CARD_OVER_TIME);
  4672. }else if(CT_VEHICLE == card->card_type){
  4673. CardMap::iterator it_card = it_dept->second->dept_card_list_vehicle.find(card->card_id);
  4674. if(it_card != it_dept->second->dept_card_list_vehicle.end()){
  4675. it_dept->second->dept_card_list_vehicle.erase(it_card); // 从井下卡列表删除
  4676. }
  4677. store_data_card(card, ALARM_CARD_OVER_TIME_END);
  4678. deal_alarm_card(card, &mp_card_list_over_time_vehicle, false, AF_CARD_OVER_TIME);
  4679. }
  4680. }
  4681. }
  4682. void CYAServerDlg::card_down_mine( Card* card )
  4683. {
  4684. card->down_time = card->deal_time;
  4685. if(CT_PERSON == card->card_type){
  4686. CardMap::iterator it_card = mp_card_list_down_person.find(card->card_id);
  4687. if(it_card == mp_card_list_down_person.end()){
  4688. mp_card_list_down_person.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  4689. }
  4690. if(time_over_count_person == 0 && mp_card_list_down_person.size() > sls_setting.over_count_person){
  4691. time_over_count_person = time(NULL);
  4692. store_data_mine(ALARM_MINE_OVER_COUNT_PERSON_START);
  4693. }
  4694. }else if(CT_VEHICLE == card->card_type){
  4695. CardMap::iterator it_card = mp_card_list_down_vehicle.find(card->card_id);
  4696. if(it_card == mp_card_list_down_vehicle.end()){
  4697. mp_card_list_down_vehicle.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  4698. }
  4699. if(time_over_count_vehicle == 0 && mp_card_list_down_vehicle.size() > sls_setting.over_count_vehicle){
  4700. time_over_count_vehicle = time(NULL);
  4701. store_data_mine(ALARM_MINE_OVER_COUNT_VEHICLE_START);
  4702. }
  4703. }
  4704. DeptMap::iterator it_dept = mp_dept_list.find(card->dept_id);
  4705. if(it_dept != mp_dept_list.end()){
  4706. if(CT_PERSON == card->card_type){
  4707. CardMap::iterator it_card = it_dept->second->dept_card_list_person.find(card->card_id);
  4708. if(it_card == it_dept->second->dept_card_list_person.end()){
  4709. it_dept->second->dept_card_list_person.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  4710. }
  4711. // 判断是否超员
  4712. }else if(CT_VEHICLE == card->card_type){
  4713. CardMap::iterator it_card = it_dept->second->dept_card_list_vehicle.find(card->card_id);
  4714. if(it_card == it_dept->second->dept_card_list_vehicle.end()){
  4715. it_dept->second->dept_card_list_vehicle.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  4716. }
  4717. // 判断是否超员
  4718. }
  4719. }
  4720. store_data_card(card, RPT_ATTEND_DOWN);
  4721. }
  4722. void CYAServerDlg::send_sync_reader()
  4723. {
  4724. time_t cur_time;
  4725. struct tm *local = 0;
  4726. int wlen = 0;
  4727. BYTE SendBuffer[LENGTH_SEND_BUF];
  4728. BYTE bt_tmp;
  4729. // 遍历发送数据
  4730. //SocketMap::iterator it_sock = mp_socket_list.begin();
  4731. //for(; it_sock != mp_socket_list.end(); ++it_sock){
  4732. // wlen = 0;
  4733. // cur_time = time(NULL);
  4734. // memset(SendBuffer, 0, LENGTH_SEND_BUF);
  4735. // localtime_s(local, &cur_time);
  4736. // //local=localtime(&cur_time);
  4737. // bt_tmp = local->tm_sec;
  4738. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4739. // wlen += sizeof(BYTE);
  4740. // bt_tmp = local->tm_min;
  4741. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4742. // wlen += sizeof(BYTE);
  4743. // bt_tmp = local->tm_hour;
  4744. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4745. // wlen += sizeof(BYTE);
  4746. // bt_tmp = local->tm_mday;
  4747. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4748. // wlen += sizeof(BYTE);
  4749. // bt_tmp = local->tm_wday;
  4750. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4751. // wlen += sizeof(BYTE);
  4752. // bt_tmp = local->tm_mon + 1;
  4753. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4754. // wlen += sizeof(BYTE);
  4755. // bt_tmp = (local->tm_year + 1900)%100;
  4756. // memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  4757. // wlen += sizeof(BYTE);
  4758. // it_sock->second->SendData(CHAR_SYNC_TIME, wlen, &SendBuffer[0]);
  4759. // Sleep(20);
  4760. //}
  4761. }
  4762. void CYAServerDlg::send_call_his_data()
  4763. {
  4764. if (MessageBox(_T("确定要接收历史数据吗?"), _T("接收历史数据"), MB_OKCANCEL) != IDOK){
  4765. return;
  4766. }
  4767. //SocketMap::iterator it_sock = mp_socket_list.begin();
  4768. //for(; it_sock != mp_socket_list.end(); ++it_sock){
  4769. // it_sock->second->SendData(CHAR_LOCATEDATAHIS, 0, NULL);
  4770. // Sleep(20);
  4771. //}
  4772. }
  4773. void CYAServerDlg::OnBnCallHisData()
  4774. {
  4775. send_call_his_data();
  4776. }
  4777. void CYAServerDlg::deal_hist_card_postion()
  4778. {
  4779. CardMap::iterator it_card = mp_card_list_all.begin();
  4780. for(; it_card != mp_card_list_all.end(); ++it_card){
  4781. if(it_card->second->is_hist){
  4782. if(CT_VEHICLE == it_card->second->card_type){
  4783. mp_card_list_down_vehicle.insert(make_pair(it_card->first, it_card->second));
  4784. AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id);
  4785. if(it_area != mp_area_list.end()){
  4786. it_area->second->area_card_list_vehicle.insert(make_pair(it_card->first, it_card->second));
  4787. if(0 == it_area->second->over_count_vehicle){
  4788. mp_card_list_forbidden_vehicle.insert(make_pair(it_card->first, it_card->second));
  4789. }
  4790. }
  4791. MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id);
  4792. if(it_map != mp_map_list.end()){
  4793. it_map->second->map_card_list_vehicle.insert(make_pair(it_card->first, it_card->second));
  4794. }
  4795. }else if(CT_PERSON == it_card->second->card_type){
  4796. mp_card_list_down_person.insert(make_pair(it_card->first, it_card->second));
  4797. AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id);
  4798. if(it_area != mp_area_list.end()){
  4799. it_area->second->area_card_list_person.insert(make_pair(it_card->first, it_card->second));
  4800. if(0 == it_area->second->over_count_person){
  4801. mp_card_list_forbidden_person.insert(make_pair(it_card->first, it_card->second));
  4802. }
  4803. }
  4804. MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id);
  4805. if(it_map != mp_map_list.end()){
  4806. it_map->second->map_card_list_person.insert(make_pair(it_card->first, it_card->second));
  4807. }
  4808. }
  4809. }
  4810. }
  4811. }
  4812. void CYAServerDlg::deal_hist_card_alarm()
  4813. {
  4814. //CardMap mp_card_list_forbidden_vehicle;
  4815. //CardMap mp_card_list_over_time_vehicle;
  4816. //CardMap mp_card_list_over_speed_vehicle;
  4817. //CardMap mp_card_list_area_over_time_vehicle;
  4818. //CardMap mp_card_list_over_time_person; //
  4819. //CardMap mp_card_list_forbidden_person;
  4820. //CardMap mp_card_list_help;
  4821. //CardMap mp_card_list_area_over_time_person;
  4822. }
  4823. void CYAServerDlg::deal_hist_area()
  4824. {
  4825. //AreaMap mp_area_over_count_person;
  4826. //AreaMap mp_area_over_time_person;
  4827. //AreaMap mp_area_forbidden_person;
  4828. //AreaMap mp_area_over_count_vehicle;
  4829. //AreaMap mp_area_over_time_vehicle;
  4830. //AreaMap mp_area_forbidden_vehicle;
  4831. }
  4832. void CYAServerDlg::load_his_reader()
  4833. {
  4834. CMysqlConn* pConn = NULL;
  4835. CDBConnGuard pDbGuard(pConn);
  4836. MYSQL_RES* pRes;
  4837. MYSQL_ROW pRow;
  4838. int err = 0;
  4839. char buf[LENGTH_SQL] = {0};
  4840. sprintf_s(buf, "select ar.reader_id, ar.start_time, ar.rec_time from his_alarm_reader ar,\
  4841. (select reader_id, max(start_time) as start_time from his_alarm_reader group by reader_id) arx \
  4842. where ar.reader_id = arx.reader_id and ar.start_time = arx.start_time and ar.end_time IS NULL");
  4843. pRes = pConn->Execute(buf, err);
  4844. int nRow = 0;
  4845. std::string rec_time, lost_time;
  4846. while(pRow = mysql_fetch_row(pRes)){
  4847. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[0]));
  4848. if(it != mp_reader_list.end()){
  4849. lost_time = pRow[1];
  4850. rec_time = pRow[2];
  4851. API_StringToTime(rec_time, it->second->rec_time);
  4852. API_StringToTime(lost_time, it->second->lost_time);
  4853. it->second->state = STATUS_DEVICE_ERROR;
  4854. nRow++;
  4855. }
  4856. }
  4857. mysql_free_result(pRes);
  4858. CString strlog;
  4859. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_READER), nRow, _T(LOG_RECORD_COUNT));
  4860. show_log(strlog);
  4861. }
  4862. void CYAServerDlg::store_data_mine( int tag )
  4863. {
  4864. char sql[LENGTH_SQL] = {'\0'};
  4865. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  4866. time_t cur_time = time(NULL);
  4867. struct tm local_time, local_time_ex;
  4868. switch(tag){
  4869. case ALARM_MINE_OVER_COUNT_PERSON_START:
  4870. {
  4871. localtime_s(&local_time, &time_over_count_person);
  4872. localtime_s(&local_time_ex, &cur_time);
  4873. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4874. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4875. int alarm_type_id = ATID_OVER_COUNT_PERSON;
  4876. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_info(alarm_type_id, start_time) VALUES(%d, '%s');",
  4877. alarm_type_id, _time);
  4878. break;
  4879. }
  4880. case ALARM_MINE_OVER_COUNT_PERSON_END:
  4881. {
  4882. localtime_s(&local_time, &time_over_count_person);
  4883. localtime_s(&local_time_ex, &cur_time);
  4884. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4885. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4886. int alarm_type_id = ATID_OVER_COUNT_PERSON;
  4887. sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_info set end_time='%s' where alarm_type_id=%d and start_time='%s';",
  4888. _time_ex, alarm_type_id, _time);
  4889. break;
  4890. }
  4891. case ALARM_MINE_OVER_COUNT_VEHICLE_START:
  4892. {
  4893. localtime_s(&local_time, &time_over_count_vehicle);
  4894. localtime_s(&local_time_ex, &cur_time);
  4895. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4896. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4897. int alarm_type_id = ATID_OVER_COUNT_VEHICLE;
  4898. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_info(alarm_type_id, start_time) VALUES(%d, '%s');",
  4899. alarm_type_id, _time);
  4900. break;
  4901. }
  4902. case ALARM_MINE_OVER_COUNT_VEHICLE_END:
  4903. {
  4904. localtime_s(&local_time, &time_over_count_vehicle);
  4905. localtime_s(&local_time_ex, &cur_time);
  4906. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4907. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4908. int alarm_type_id = ATID_OVER_COUNT_VEHICLE;
  4909. sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_info set end_time='%s' where alarm_type_id=%d and start_time='%s';",
  4910. _time_ex, alarm_type_id, _time);
  4911. break;
  4912. }
  4913. default:
  4914. return;
  4915. }
  4916. execute_sql(sql);
  4917. }
  4918. void CYAServerDlg::deal_card_state( Card* card )
  4919. {
  4920. // 电量
  4921. if(card->power_state == 0 && card->power_state_last != 0){
  4922. card->status_power = STATUS_NORMAL;
  4923. store_data_card(card, ALARM_CARD_LOW_POWER_END);
  4924. }
  4925. if(card->power_state_last == 0 && card->power_state != 0){
  4926. card->low_power_time = card->deal_time;
  4927. store_data_card(card, ALARM_CARD_LOW_POWER_START);
  4928. }
  4929. card->power_state_last = card->power_state;
  4930. }
  4931. void CYAServerDlg::load_his_card_state()
  4932. {
  4933. CMysqlConn* pConn = NULL;
  4934. CDBConnGuard pDbGuard(pConn);
  4935. MYSQL_RES* pRes;
  4936. MYSQL_ROW pRow;
  4937. int err = 0;
  4938. char buf[LENGTH_SQL] = {0};
  4939. sprintf_s(buf, "select ac.card_id, ac.alarm_type_id, ac.start_time from his_alarm_card ac, \
  4940. (select card_id, max(start_time) start_time, alarm_type_id from his_alarm_card group by card_id, alarm_type_id) acx \
  4941. where ac.card_id = acx.card_id and ac.alarm_type_id=acx.alarm_type_id and ac.start_time=acx.start_time and ac.end_time is NULL;");
  4942. pRes = pConn->Execute(buf, err);
  4943. int nRow = 0;
  4944. std::string start_time;
  4945. while(pRow = mysql_fetch_row(pRes)){
  4946. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  4947. if(it != mp_card_list_all.end()){
  4948. switch (atoi(pRow[1]))
  4949. {
  4950. case ATID_POWER:
  4951. it->second->power_state = 1;
  4952. it->second->power_state_last = 1;
  4953. it->second->status_power = STATUS_ERROR;
  4954. start_time = pRow[2];
  4955. API_StringToTime(start_time, it->second->low_power_time);
  4956. default:
  4957. break;
  4958. }
  4959. nRow++;
  4960. }
  4961. }
  4962. mysql_free_result(pRes);
  4963. CString strlog;
  4964. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_STATE), nRow, _T(LOG_RECORD_COUNT));
  4965. show_log(strlog);
  4966. }
  4967. EnHandleResult CYAServerDlg::OnPrepareListen( SOCKET soListen )
  4968. {
  4969. TCHAR szAddress[40];
  4970. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  4971. USHORT usPort;
  4972. _server.GetListenAddress(szAddress, iAddressLen, usPort);
  4973. ::PostOnPrepareListen(szAddress, usPort);
  4974. return HR_OK;
  4975. }
  4976. EnHandleResult CYAServerDlg::OnAccept( CONNID dwConnID, SOCKET soClient )
  4977. {
  4978. BOOL bPass = TRUE;
  4979. TCHAR szAddress[40];
  4980. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  4981. USHORT usPort;
  4982. _server.GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort);
  4983. ::PostOnAccept(dwConnID, szAddress, usPort, bPass);
  4984. return bPass ? HR_OK : HR_ERROR;
  4985. }
  4986. EnHandleResult CYAServerDlg::OnSend( CONNID dwConnID, const BYTE* pData, int iLength )
  4987. {
  4988. ::PostOnSend(dwConnID, pData, iLength);
  4989. return HR_OK;
  4990. }
  4991. EnHandleResult CYAServerDlg::OnReceive( CONNID dwConnID, const BYTE* pData, int iLength )
  4992. {
  4993. ::PostOnReceive(dwConnID, pData, iLength);
  4994. parse_data(pData, iLength, dwConnID);
  4995. return HR_OK;
  4996. }
  4997. EnHandleResult CYAServerDlg::OnClose( CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode )
  4998. {
  4999. remove_socket(dwConnID);
  5000. iErrorCode == SE_OK ? ::PostOnClose(dwConnID):
  5001. ::PostOnError(dwConnID, enOperation, iErrorCode);
  5002. return HR_OK;
  5003. }
  5004. EnHandleResult CYAServerDlg::OnShutdown()
  5005. {
  5006. ::PostOnShutdown();
  5007. return HR_OK;
  5008. }
  5009. _SOCK* CYAServerDlg::get_socket_by_count( DWORD dwConnID )
  5010. {
  5011. SocketMap::iterator _sock = mp_socket_list.begin();
  5012. for(; _sock != mp_socket_list.end(); ++_sock){
  5013. if(_sock->second->dwConnID == dwConnID){
  5014. return _sock->second;
  5015. }
  5016. }
  5017. return NULL;
  5018. }
  5019. afx_msg LRESULT CYAServerDlg::OnMsgRefreshIpList(WPARAM wParam, LPARAM lParam)
  5020. {
  5021. m_listctrl_reader.DeleteAllItems();
  5022. SocketMap::iterator it_sock = mp_socket_list.begin();
  5023. for(; it_sock != mp_socket_list.end(); ++it_sock){
  5024. AddItem(it_sock->second->sip, it_sock->second->reader_id, it_sock->second->state);
  5025. }
  5026. return 0;
  5027. }
  5028. void CYAServerDlg::parse_data_locate_card_his( BYTE* DataBuffer, int& nCurPos, int reader_id, DWORD wTickCount, CString strTime, unsigned short wChr)
  5029. {
  5030. // 按时间分组解析
  5031. // 组长度
  5032. WORD wframelen = 0;
  5033. CFunctions::getWord(DataBuffer, &wframelen, nCurPos);
  5034. nCurPos += sizeof(WORD);
  5035. int nframepos = nCurPos;
  5036. // 数据保存时间 7字节,年,月,周,日,时,分,秒
  5037. BYTE btSec = 0;
  5038. memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE));
  5039. nCurPos += sizeof(BYTE);
  5040. BYTE btMin = 0;
  5041. memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE));
  5042. nCurPos += sizeof(BYTE);
  5043. BYTE btHour = 0;
  5044. memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE));
  5045. nCurPos += sizeof(BYTE);
  5046. BYTE btDay = 0;
  5047. memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE));
  5048. nCurPos += sizeof(BYTE);
  5049. BYTE btWeek = 0;
  5050. memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE));
  5051. nCurPos += sizeof(BYTE);
  5052. BYTE btMonth = 0;
  5053. memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE));
  5054. nCurPos += sizeof(BYTE);
  5055. BYTE btYear = 0;
  5056. memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE));
  5057. nCurPos += sizeof(BYTE);
  5058. CString strhistime;
  5059. strhistime.Format(_T("20%.2d-%.2d-%.2d %.2d:%.2d:%.2d"), btYear%100, btMonth, btDay, btHour, btMin, btSec );
  5060. while(nCurPos - nframepos < wframelen){ // 一组数据
  5061. BYTE btCardType = 0;
  5062. memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE));
  5063. nCurPos += sizeof(BYTE);
  5064. DWORD dwCardId = 0;
  5065. CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos);
  5066. nCurPos += sizeof(DWORD);
  5067. string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10);
  5068. Card* pCard = new Card(str_card_id, btCardType, theApp.z_offset);
  5069. pCard->reader_id = reader_id;
  5070. pCard->str_his_time = CFunctions::wc2c(strhistime);
  5071. pCard->reader_tickcount = wTickCount;
  5072. pCard->str_rec_time = CFunctions::wc2c(strTime);
  5073. //LONG64 l64cardid = btCardType;
  5074. //l64cardid <<= 32;
  5075. //l64cardid |= dwCardId;
  5076. switch(btCardType)
  5077. {
  5078. case CT_VEHICLE:
  5079. {
  5080. //报文时间
  5081. WORD wCardTickCount = 0;
  5082. CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos);
  5083. nCurPos += sizeof(WORD);
  5084. pCard->time_stamp = wCardTickCount;
  5085. BYTE btTypeAndPower = 0;
  5086. memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE));
  5087. nCurPos += sizeof(BYTE);
  5088. //报文类型
  5089. BYTE btType = 0;
  5090. btType = (btTypeAndPower >>4) & 0x0F;
  5091. //电池电量
  5092. BYTE btPower = 0;
  5093. btPower = btTypeAndPower & 0x0F;
  5094. pCard->ranging_type = btType;
  5095. pCard->power_state = btPower;
  5096. //保留
  5097. nCurPos += sizeof(BYTE);
  5098. //加速度
  5099. BYTE btAcceleration = 0;
  5100. memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE));
  5101. nCurPos += sizeof(BYTE);
  5102. pCard->accelerate_state = btAcceleration;
  5103. //定位时间戳Tsp // 字序
  5104. LONG64 lTime1 = 0;
  5105. BYTE btTemp = 0;
  5106. int nRangingPos = nCurPos;
  5107. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  5108. nCurPos += sizeof(BYTE);
  5109. DWORD dwTemp = 0;
  5110. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  5111. nCurPos += sizeof(DWORD);
  5112. lTime1 = btTemp;
  5113. lTime1 = lTime1 << 32;
  5114. lTime1 |= dwTemp;
  5115. pCard->flying_time = lTime1;
  5116. double dbldist = CFunctions::getDistance(lTime1);
  5117. pCard->distance = dbldist;
  5118. BYTE btAntenna = 0;
  5119. memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE));
  5120. nCurPos += sizeof(BYTE);
  5121. btAntenna = btAntenna & 0xFF;
  5122. pCard->antenna_id = btAntenna;
  5123. if(CHAR_LOCATEDATAHIS_TDOA == wChr ){
  5124. // 分站时间同步序列号
  5125. WORD wSyncNum = 0;
  5126. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  5127. nCurPos += sizeof(WORD);
  5128. // 信号强度
  5129. WORD wStrength = 0;
  5130. CFunctions::getWord(DataBuffer, &wStrength, nCurPos);
  5131. nCurPos += sizeof(WORD);
  5132. }
  5133. break;
  5134. }
  5135. case CT_PERSON:
  5136. {
  5137. break;
  5138. }
  5139. default:
  5140. {
  5141. //strBuf.Format(_T("无法识别的卡类型:%d\r\n"), btCardType);
  5142. break;
  5143. }
  5144. }
  5145. store_data_card(pCard, HIS_RAW_DATA);
  5146. delete pCard;
  5147. }
  5148. }
  5149. void CYAServerDlg::parse_data_locate_reader_his( BYTE * DataBuffer, int nLen, int& nCurPos, int& reader_id, int& nTick, CString& strtime, unsigned short wChr)
  5150. {
  5151. //CString strTime;
  5152. strtime.Format(_T("%s"), COleDateTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S")));
  5153. DWORD dwReaderID = 0;
  5154. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  5155. nCurPos += sizeof(DWORD);
  5156. WORD wTickCount = 0;
  5157. CFunctions::getWord(DataBuffer, &wTickCount, nCurPos);
  5158. nCurPos += sizeof(WORD);
  5159. }
  5160. void CYAServerDlg::parse_data_reader_synctime(BYTE *DataBuffer, int nLen, int& nCurPos)
  5161. {
  5162. while(nCurPos < nLen - sizeof(WORD)){
  5163. DWORD dwReaderID = 0; // 本机分站号
  5164. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  5165. nCurPos += sizeof(DWORD);
  5166. BYTE btAnt = 0; // 本机发送天线
  5167. memcpy(&btAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  5168. nCurPos += sizeof(BYTE);
  5169. DWORD dwRootReaderID = 0; // root分站号
  5170. CFunctions::getDWord(DataBuffer, &dwRootReaderID, nCurPos);
  5171. nCurPos += sizeof(DWORD);
  5172. BYTE btRootAnt = 0; // root天线
  5173. memcpy(&btRootAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  5174. nCurPos += sizeof(BYTE);
  5175. WORD wSyncNum = 0; // 序列号
  5176. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  5177. nCurPos += sizeof(WORD);
  5178. WORD wSyncLevel = 0; // 同步等级
  5179. CFunctions::getWord(DataBuffer, &wSyncLevel, nCurPos);
  5180. nCurPos += sizeof(WORD);
  5181. LONG64 lTime1 = 0, lTime2 = 0;
  5182. BYTE btTemp = 0;
  5183. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  5184. nCurPos += sizeof(BYTE);
  5185. DWORD dwTemp = 0;
  5186. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  5187. nCurPos += sizeof(DWORD);
  5188. lTime1 = btTemp; // 本机发送时间戳
  5189. lTime1 = lTime1 << 32;
  5190. lTime1 |= dwTemp;
  5191. btTemp = 0;
  5192. dwTemp = 0;
  5193. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  5194. nCurPos += sizeof(BYTE);
  5195. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  5196. nCurPos += sizeof(DWORD);
  5197. lTime2 = btTemp; // 本机接收时间戳
  5198. lTime2 = lTime2 << 32;
  5199. lTime2 |= dwTemp;
  5200. CString strLog;
  5201. strLog.Format(_T("id1:%d, id2:%d, syncnum:%d, level:%d, send:%I64u, rec:%I64u"), dwReaderID, dwRootReaderID, wSyncNum, wSyncLevel, lTime1, lTime2);
  5202. writeErrorLog(_T("SYNC_S"), strLog, true);
  5203. HostServer::SyncTimeMsg msg;
  5204. msg.LocalIdCode(dwReaderID);
  5205. msg.LocalIdCode((msg.LocalIdCode() << 8) + btAnt);
  5206. msg.UpperIdCode(dwRootReaderID);
  5207. msg.UpperIdCode((msg.UpperIdCode() << 8) + btRootAnt);
  5208. msg.SyncNum(wSyncNum);
  5209. msg.SyncLevel(wSyncLevel);
  5210. msg.LocalStationSendTime(lTime1);
  5211. msg.LocalStationReceiveTime(lTime2);
  5212. syncmanager.analyzeSyncMsg(msg);
  5213. ReaderMap::iterator it = mp_reader_list.find(dwReaderID);
  5214. if(it != mp_reader_list.end()){
  5215. it->second->sync_level = wSyncLevel;
  5216. }
  5217. }
  5218. //CString strlog;
  5219. //strlog.Format(_T("syncnum:%d, readerid:%I64u, upperid:%I64u, rec_time:%I64u, real_rec_time:%I64u, send_time:%I64u, time_delay:%I64u"),
  5220. // wSyncNum,
  5221. // msg.LocalIdCode(),
  5222. // msg.UpperIdCode(),
  5223. // syncmanager._historySync[wSyncNum][msg.LocalIdCode()].ReceiveTime(),
  5224. // syncmanager._historySync[wSyncNum][msg.LocalIdCode()].RealReceiveTime(),
  5225. // syncmanager._historySync[wSyncNum][msg.LocalIdCode()].SendTime(),
  5226. // syncmanager._historySync[wSyncNum][msg.LocalIdCode()].TimeDelay()
  5227. // );
  5228. //if(28 == dwReaderID){
  5229. // writeErrorLog(_T("SYNC_S28"), strlog, false);
  5230. //}else if(27 == dwReaderID){
  5231. // writeErrorLog(_T("SYNC_S27"), strlog, false);
  5232. //}else if(66 == dwReaderID){
  5233. // writeErrorLog(_T("SYNC_S66"), strlog, false);
  5234. //}
  5235. }
  5236. int CYAServerDlg::init_antenna_sync()
  5237. {
  5238. ReaderMap::iterator itReader = mp_reader_list.begin();
  5239. // 初始化数组,将分站添加到列表,只有一个天线
  5240. for(; itReader != mp_reader_list.end(); ++itReader){
  5241. syncmanager.updateAnchor(itReader->second->reader_id, 1,
  5242. itReader->second->ant[0]->antenna_x * itReader->second->map_scale,
  5243. itReader->second->ant[0]->antenna_y * itReader->second->map_scale,
  5244. itReader->second->ant[0]->antenna_z * itReader->second->map_scale);
  5245. //syncmanager.updateAnchor(itReader->second->reader_id, 2, itReader->second->ant[1]->antenna_x, itReader->second->ant[1]->antenna_y, itReader->second->ant[1]->antenna_z);
  5246. }
  5247. // 根据坐标计算分站间距离
  5248. for (auto it = syncmanager._anchors.begin(); it != syncmanager._anchors.end(); it++)
  5249. {
  5250. for (auto it2 = syncmanager._anchors.begin(); it2 != syncmanager._anchors.end(); it2++)
  5251. {
  5252. if(it != it2)
  5253. {
  5254. double d = sqrt(pow((it->second.x - it2->second.x), 2)
  5255. + pow((it->second.y - it2->second.y), 2)
  5256. + pow((it->second.z - it2->second.z), 2)) * 10000 / (2.99702547 * 15.65);
  5257. syncmanager.updateDistance(it->first >>8, it->first & 0xFF, it2->first >> 8, it2->first & 0xFF,d);
  5258. }
  5259. }
  5260. }
  5261. return 0;
  5262. }
  5263. void CYAServerDlg::Test()
  5264. {
  5265. ReaderPath* prp = new ReaderPath();
  5266. /*prp->x[0] = -1;
  5267. prp->x[1] = 1;
  5268. prp->y[0] = 0;
  5269. prp->y[1] = 0;
  5270. prp->px[0] = -1;
  5271. prp->px[1] = 1;
  5272. prp->py[0] = 0;
  5273. prp->py[1] = 0;
  5274. //double dist = 0.5;
  5275. double dist = -0.5;*/
  5276. //2
  5277. /*prp->x[0] = 10;
  5278. prp->x[1] = 10;
  5279. prp->y[0] = 2;
  5280. prp->y[1] = 13.7;
  5281. prp->px[0] = 10;
  5282. prp->px[1] = 10;
  5283. prp->py[0] = 2;
  5284. prp->py[1] = 13.7;*/
  5285. //3
  5286. prp->x[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->x[0];
  5287. prp->x[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->x[1];
  5288. prp->y[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->y[0];
  5289. prp->y[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->y[1];
  5290. prp->px[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->px[0];
  5291. prp->px[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->px[1];
  5292. prp->py[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->py[0];
  5293. prp->py[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->py[1];
  5294. //double dist = 0.5;
  5295. double dist = -0.5;
  5296. RESULT* r = NULL;
  5297. r = LocateAlgorithm::GetPos(prp,dist,0);
  5298. //因为双曲线与分站之间第i条线段或者第j条线段分别有两焦点
  5299. //或者分站之间就一条直线,有两焦点
  5300. double xcross[2] = {0};
  5301. double ycross[2] = {0};
  5302. for(int j = 0; j < 2;j++){
  5303. xcross[j] = r->x[j];
  5304. ycross[j] = r->y[j];
  5305. }
  5306. double deltad[2] = {0};
  5307. for(int j = 0; j < 2;j ++){
  5308. double d[2] = {0};
  5309. double dx1 = r->x[j] - prp->x[0];
  5310. double dy1 = r->y[j] - prp->y[0];
  5311. d[0] = sqrt(pow(dx1,2) + pow(dy1,2));
  5312. double dx2 = r->x[j] - prp->x[1];
  5313. double dy2 = r->y[j] - prp->y[1];
  5314. d[1] = sqrt(pow(dx2,2) + pow(dy2,2));
  5315. deltad[j] = d[0] - d[1];
  5316. }
  5317. //解的索引
  5318. int idx = 0;
  5319. if(dist > 0){
  5320. for(int j = 0;j < 2;j++){
  5321. if(deltad[j] > 0){
  5322. idx = j;
  5323. break;
  5324. }
  5325. }
  5326. }else{
  5327. for(int j = 0;j < 2;j++){
  5328. if(deltad[j] < 0){
  5329. idx = j;
  5330. break;
  5331. }
  5332. }
  5333. }
  5334. bool bs = false;
  5335. _coordinate res;
  5336. if(!bs){
  5337. res.x = xcross[idx];
  5338. res.y = ycross[idx];
  5339. }else{
  5340. //例如当分站为B1B3,B2B3的情况下
  5341. double tempx = xcross[idx];
  5342. double tempy = ycross[idx];
  5343. res.x = (tempx + res.x)/2.0;
  5344. res.y = (tempy + res.y)/2.0;
  5345. }
  5346. }