YAServerDlg.cpp 180 KB

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