YAServerDlg.cpp 276 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494
  1. // YAServerDlg.cpp : 实现文件
  2. //
  3. #include <stdio.h>
  4. #include <windows.h>
  5. #include <cstdio>
  6. #include <process.h>
  7. #include <exception>
  8. #include "stdafx.h"
  9. #include "YAServer.h"
  10. #include "YAServerDlg.h"
  11. #include "afxdialogex.h"
  12. #include <sio_client.h>
  13. #include <condition_variable>
  14. #include <string>
  15. #include "def.h"
  16. #include "socketdef.h"
  17. #include <Functions/Functions.h>
  18. //#include <json/json.h>
  19. #include "MysqlConnPool.h"
  20. #include "locate_algorithm.h"
  21. #include <strconv/strconv.h>
  22. #include <kalman/locate.h>
  23. #include "log_def.h"
  24. #include "DbSettingDlg.h"
  25. #include "LogSetting.h"
  26. #include "SysSetting.h"
  27. #include "ProcessRemodule.h"
  28. #include "log_process_module.h"
  29. #include "./system_basic_info/SystemAnalysis.h"
  30. #include "./debug_server/debug_server_socket.h"
  31. // 用来跟踪内存使用情况
  32. #define TRACE_MEMORY_WRITELOG
  33. #define TRACE_MEMORY_PARSE_PACKAGE
  34. #define TRACE_MEMORY_PARSE_SERVER
  35. #define TRACE_MEMORY_SYNCTIMEMSG
  36. #define TRACE_MEMORY_TAGMSG
  37. // -- 用来跟踪内存使用情况
  38. #define STR_LEN_TIME 30
  39. BOOL m_log_sys_status = false;
  40. #ifdef _DEBUG
  41. #ifndef DEBUG_NEW
  42. #define new DEBUG_NEW
  43. #endif
  44. #endif
  45. //typedef struct {
  46. // CYAServerDlg* handle;
  47. // int len;
  48. // DWORD dwConnID;
  49. // BYTE buf[LENGTH_MSG_4K];
  50. //}ParseData;
  51. //
  52. //typedef struct
  53. //{
  54. // CYAServerDlg* handle;
  55. // bool useTime;
  56. // char* path;
  57. // char* strLog;
  58. //}LogInfo;
  59. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  60. #include "ProcessRemodule.h"
  61. DWORD g_tickcount;
  62. DWORD g_diffTickCount = 0;
  63. DWORD g_send_tickout;
  64. DWORD g_last_send_time;
  65. DWORD g_testtick;
  66. bool g_is_rec_hist = false;
  67. #pragma warning(disable: 4244)
  68. #pragma warning(disable: 4018)
  69. class CAboutDlg : public CDialogEx
  70. {
  71. public:
  72. CAboutDlg();
  73. // 对话框数据
  74. enum { IDD = IDD_ABOUTBOX };
  75. protected:
  76. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  77. // 实现
  78. protected:
  79. DECLARE_MESSAGE_MAP()
  80. };
  81. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  82. {
  83. }
  84. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  85. {
  86. CDialogEx::DoDataExchange(pDX);
  87. }
  88. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  89. END_MESSAGE_MAP()
  90. // CYAServerDlg 对话框
  91. CYAServerDlg::CYAServerDlg(CWnd* pParent /*=NULL*/)
  92. : CDialogEx(CYAServerDlg::IDD, pParent),
  93. _server(this),
  94. _io(new client())
  95. , m_reader_id_hist(0)
  96. {
  97. ws_init();
  98. init_smart_pointer_var();
  99. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  100. }
  101. void CYAServerDlg::DoDataExchange(CDataExchange* pDX)
  102. {
  103. CDialogEx::DoDataExchange(pDX);
  104. DDX_Control(pDX, IDC_BTN_START, m_btStart);
  105. DDX_Control(pDX, IDC_BTN_STOP, m_btStop);
  106. DDX_Control(pDX, IDC_LIST_READER, m_listctrl_reader);
  107. DDX_Control(pDX, IDC_LIST_LOG, m_list_log);
  108. DDX_Text(pDX, IDC_EDIT_READERID, m_reader_id_hist);
  109. }
  110. BEGIN_MESSAGE_MAP(CYAServerDlg, CDialogEx)
  111. ON_WM_SYSCOMMAND()
  112. ON_WM_PAINT()
  113. ON_WM_QUERYDRAGICON()
  114. ON_BN_CLICKED(IDC_BTN_START, &CYAServerDlg::OnBnStart)
  115. ON_BN_CLICKED(IDC_BTN_STOP, &CYAServerDlg::OnBnStop)
  116. ON_BN_CLICKED(IDC_BTN_EXIT, &CYAServerDlg::OnBnExit)
  117. ON_BN_CLICKED(IDC_BTN_SYNCTIME, &CYAServerDlg::OnBnSyncTime)
  118. ON_MESSAGE(WM_ON_MONITOR, on_monitor)
  119. ON_COMMAND(ID_START, &CYAServerDlg::OnBnStart)
  120. ON_COMMAND(ID_STOP, &CYAServerDlg::OnBnStop)
  121. ON_COMMAND(ID_EXIT, &CYAServerDlg::OnBnExit)
  122. ON_COMMAND(ID_MENU_DB, &CYAServerDlg::OnMenuDb)
  123. ON_COMMAND(ID_MENU_LOG, &CYAServerDlg::OnMenuLog)
  124. ON_COMMAND(ID_MENU_PARAM, &CYAServerDlg::OnMenuParam)
  125. ON_BN_CLICKED(IDC_BTN_HIS, &CYAServerDlg::OnBnCallHisData)
  126. ON_MESSAGE(WM_REFRESH_IP_LIST, &CYAServerDlg::OnMsgRefreshIpList)
  127. ON_MESSAGE(WM_REMOVE_SOCKET, &CYAServerDlg::OnRemoveSocket)
  128. ON_EN_UPDATE(IDC_EDIT_READERID, &CYAServerDlg::OnEnUpdateEditReaderid)
  129. ON_COMMAND(ID_ABOUT, &CYAServerDlg::OnAbout)
  130. END_MESSAGE_MAP()
  131. // CYAServerDlg 消息处理程序
  132. UINT WaitForS(int nSecond,bool bSleep=false)//用于等待一段时间的函数,普通精度的,参数单位秒
  133. {
  134. COleDateTime start_time = COleDateTime::GetCurrentTime();
  135. COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;
  136. while(end_time.GetTotalSeconds() < nSecond){
  137. if(!bSleep){
  138. MSG msg;
  139. PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
  140. TranslateMessage(&msg);
  141. DispatchMessage(&msg);
  142. //以上四行是实现在延时或定时期间能处理其他的消息,降低CPU的占有率,但也降低延时或定时精度
  143. }
  144. Sleep(80);
  145. end_time = COleDateTime::GetCurrentTime()-start_time;
  146. }
  147. return 0;
  148. }
  149. UINT WaitForMS(int mSecond,bool bSleep=false)//高精度的等待函数,参数单位毫秒
  150. {
  151. double dfFreq;
  152. LARGE_INTEGER litmp;
  153. QueryPerformanceFrequency(&litmp);
  154. dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
  155. QueryPerformanceCounter(&litmp);
  156. LONGLONG QPart0 = litmp.QuadPart;// 获得初始值
  157. while((double)(litmp.QuadPart-QPart0)/dfFreq < double(mSecond/1000)){
  158. if(!bSleep){
  159. MSG msg;
  160. PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
  161. TranslateMessage(&msg);
  162. DispatchMessage(&msg);
  163. //以上四行是实现在延时或定时期间能处理其他的消息,降低CPU的占有率,但也降低延时或定时精度
  164. }
  165. QueryPerformanceCounter(&litmp);
  166. }
  167. return 0;
  168. }
  169. ULONGLONG time_send_json_counting;
  170. ULONGLONG time_send_json_device_state;
  171. ULONGLONG time_send_json_alarm;
  172. ULONGLONG time_send_json_postion;
  173. ULONGLONG time_sync_reader_time;
  174. ULONGLONG time_clear_call_time;
  175. ULONGLONG time_send_call;
  176. ULONGLONG time_send_help;
  177. ULONGLONG time_ws_connect;
  178. ULONGLONG time_send_heart;
  179. volatile LONG g_QueueItemCount = 0;
  180. bool g_exit=false;
  181. long giSqlCount=0;
  182. long giSqlThreadCount=0;
  183. long gSqlTimes=0;
  184. long giAllSqlCount=0;
  185. long giAllThreadCount=0;
  186. HANDLE hSemaHandle=NULL;
  187. DWORD WINAPI _exec_sql(LPVOID lparam)
  188. {
  189. ::InterlockedIncrement(&g_QueueItemCount);
  190. char *sql = (char*)lparam ;
  191. CMysqlConn* pConn = NULL;
  192. CDBConnGuard pDbGuard(pConn);
  193. if(pConn == NULL){
  194. if(sql){
  195. delete[] sql;
  196. sql = NULL;
  197. }
  198. ::InterlockedDecrement(&g_QueueItemCount);
  199. return 1;
  200. }
  201. int err = 0;
  202. pConn->MultiExecute(sql,err);
  203. if(err > 0){
  204. TRACE(_T("sql error \n"));
  205. }
  206. if(sql){
  207. delete[] sql;
  208. sql = NULL;
  209. }
  210. //Sleep(1);
  211. ::InterlockedDecrement(&g_QueueItemCount);
  212. return 0;
  213. }
  214. DWORD WINAPI _write_error_log(LPVOID lparam)
  215. {
  216. ::InterlockedIncrement(&g_QueueItemCount);
  217. LogInfo* err = (LogInfo*)lparam;
  218. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(err->handle);
  219. #ifdef TRACE_MEMORY_WRITELOG
  220. dlg->writeErrorLogEx(err->path, err->strLog, err->useTime);
  221. #endif // TRACE_MEMORY_WRITELOG
  222. if(err){
  223. free(err->path);
  224. err->path = NULL;
  225. free(err->strLog);
  226. err->strLog = NULL;
  227. delete err;
  228. err = NULL;
  229. }
  230. //Sleep(1);
  231. ::InterlockedDecrement(&g_QueueItemCount);
  232. return 0;
  233. }
  234. DWORD WINAPI _parse_package_data(LPVOID lparam)
  235. {
  236. ::InterlockedIncrement(&g_QueueItemCount);
  237. ParseData* data = (ParseData*)lparam;
  238. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(data->handle);
  239. #ifdef TRACE_MEMORY_PARSE_PACKAGE
  240. dlg->parse_package_data(data->buf, data->len, data->dwConnID);
  241. #endif // TRACE_MEMORY_PARSE_PACKAGE
  242. free(data);
  243. //Sleep(1);
  244. ::InterlockedDecrement(&g_QueueItemCount);
  245. return 0;
  246. }
  247. DWORD WINAPI _parse_data_server(LPVOID lparam)
  248. {
  249. ::InterlockedIncrement(&g_QueueItemCount);
  250. ParseData* data = (ParseData*)lparam;
  251. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(data->handle);
  252. #ifdef TRACE_MEMORY_PARSE_SERVER
  253. dlg->parse_data_server(data->buf, data->len, data->dwConnID);
  254. #endif
  255. data->handle->m_nMallocTimes--;
  256. delete data;
  257. data = NULL;
  258. Sleep(1);
  259. ::InterlockedDecrement(&g_QueueItemCount);
  260. return 0;
  261. }
  262. UINT _thread_timer(LPVOID lparam)
  263. {
  264. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(lparam);
  265. while(!g_exit){
  266. ULONGLONG cur_time =::GetTickCount();
  267. // send_json_counting
  268. if(cur_time - time_send_json_counting > theApp.send_json_counting ){
  269. //time_send_json_counting = cur_time;
  270. //dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_counting()); // web端统计
  271. }
  272. // send_json_alarm
  273. if(cur_time - time_send_json_alarm > theApp.send_json_alarm){
  274. time_send_json_alarm = cur_time;
  275. //dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_alarm());
  276. dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_event());
  277. }
  278. // send_json_device
  279. if(cur_time - time_send_json_device_state > theApp.send_json_alarm){
  280. time_send_json_device_state = cur_time;
  281. dlg->deal_readers();
  282. dlg->send_json_data(JSON_CMD_VALUE_PUSH, dlg->get_json_device_state());
  283. }
  284. // send_json_postion
  285. if(cur_time - time_send_json_postion > theApp.send_json_postion){
  286. time_send_json_postion = cur_time;
  287. DWORD dw = ::GetTickCount();
  288. dlg->package_data();
  289. }
  290. //send help
  291. if(cur_time - time_send_help > theApp.send_json_alarm){
  292. if(dlg->get_help_card_nums() > 0){
  293. time_send_help = cur_time;
  294. dlg->send_json_data(JSON_CMD_VALUE_PUSH,dlg->get_json_help());
  295. }
  296. }
  297. // send_call_data
  298. if(cur_time - time_send_call > theApp.send_json_alarm){
  299. time_send_call = cur_time;
  300. dlg->send_call_info();
  301. dlg->clear_call_info();
  302. }
  303. if(!dlg->is_websocket_login && cur_time - time_ws_connect > theApp.ws_connect_interval){
  304. time_ws_connect = cur_time;
  305. if(!dlg->is_websocket_ok){
  306. dlg->ws_open();
  307. }
  308. dlg->ws_login();
  309. }
  310. if (cur_time - time_send_heart > theApp.heart_interval)
  311. {
  312. time_send_heart = cur_time;
  313. dlg->send_heart_package();
  314. }
  315. WaitForMS(10);
  316. }
  317. return 0;
  318. }
  319. UINT _thread_monitor(LPVOID lparam)
  320. {
  321. CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(lparam);
  322. time_t time_end = time(NULL);
  323. while (!g_exit){
  324. time_t time_current = time(NULL);
  325. // 判断采集状态, 20s没有接收到数据认为采集中断
  326. dlg->is_server_ok = (difftime(time_current, dlg->m_time_last_rec) > 20) ? false : true;
  327. dlg->set_run_state(); // 更新采集运行状态
  328. if(!IsWindow(theApp.m_hwnd_monitor)){ // 监控程序没有打开
  329. theApp.m_hwnd_monitor = NULL;
  330. //// 启动监控程序
  331. //if(strlen(theApp.m_path_monitor)<=0){
  332. // strcpy(theApp.m_path_monitor, "YAMonitor.exe");//启动同目录下的monitor
  333. //}
  334. //WinExec(theApp.m_path_monitor, SW_HIDE);
  335. }
  336. // 发送给监控程序
  337. if(theApp.m_hwnd_monitor && dlg->m_bListen){
  338. WPARAM wpSERVERSTATE=WPARAM(dlg->m_uint_state);
  339. ::PostMessage(theApp.m_hwnd_monitor, WM_ON_MONITOR, wpSERVERSTATE, LPARAM(dlg->m_hWnd));
  340. }
  341. WaitForS(10);
  342. }
  343. return 0;
  344. }
  345. BOOL CYAServerDlg::OnInitDialog()
  346. {
  347. CDialogEx::OnInitDialog();
  348. // 将“关于...”菜单项添加到系统菜单中。
  349. // IDM_ABOUTBOX 必须在系统命令范围内。
  350. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  351. ASSERT(IDM_ABOUTBOX < 0xF000);
  352. CMenu* pSysMenu = GetSystemMenu(FALSE);
  353. if (pSysMenu != NULL)
  354. {
  355. BOOL bNameValid;
  356. CString strAboutMenu;
  357. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  358. ASSERT(bNameValid);
  359. if (!strAboutMenu.IsEmpty())
  360. {
  361. pSysMenu->AppendMenu(MF_SEPARATOR);
  362. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  363. }
  364. }
  365. //加载系统配置
  366. m_bUseFilter = theApp.use_filter;
  367. if(m_bUseFilter){
  368. m_nFilterType = FILTER_KALMAN;
  369. }else{
  370. m_nFilterType = NO_FILTER;
  371. }
  372. m_log_sys_status = theApp.log_sys_status;
  373. m_log_raw_data = theApp.log_raw_data;
  374. m_log_parse_data = theApp.log_parse_data;
  375. m_log_send_package = theApp.log_send_package;
  376. m_log_recv_package = theApp.log_recv_package;
  377. m_log_locate_data = theApp.log_locate_data;
  378. m_reader_interval_time = theApp.reader_interval_time * 1.0 / 1000.0;
  379. m_nMallocTimes = 0;
  380. //初始化线程池
  381. //m_LogThreadPool.Initialize((void*)100,THREADPOOL_SIZE);
  382. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  383. // 执行此操作
  384. SetIcon(m_hIcon, TRUE); // 设置大图标
  385. SetIcon(m_hIcon, FALSE); // 设置小图标
  386. init_queuestring();
  387. init_param();
  388. init_ui();
  389. init_base_data();
  390. //load_his_data();
  391. theApp.set_server_handle(this->m_hWnd);
  392. theApp.load_monitor_conf();
  393. RECT rc;
  394. GetWindowRect(&rc);
  395. rc.left=rc.right;
  396. rc.right+=250;
  397. //创建菜单
  398. m_mnMain.LoadMenu(IDR_MENUMAIN);
  399. SetMenu(&m_mnMain);
  400. CString strInfo;
  401. //// 将图标放入系统托盘
  402. //nd.cbSize = sizeof (NOTIFYICONDATA);
  403. //nd.hWnd = m_hWnd;
  404. //nd.uID = IDI_ICON;
  405. //nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
  406. //nd.uCallbackMessage= WM_NOTIFYICON;
  407. //nd.hIcon = m_hIcon;
  408. //strcpy(nd.szTip, "采集应用服务器");
  409. //Shell_NotifyIcon(NIM_ADD, &nd);
  410. m_thread_monitor = ::AfxBeginThread(_thread_monitor, this, THREAD_PRIORITY_HIGHEST);
  411. time_send_json_counting = time_send_json_device_state=time_send_json_alarm=time_send_json_postion=::GetTickCount();
  412. time_sync_reader_time=time_clear_call_time=time_send_call=time_send_help=::GetTickCount();
  413. m_thread_timer = ::AfxBeginThread(_thread_timer, this, THREAD_PRIORITY_HIGHEST);
  414. SetWindowText(_T("永安信通数据采集系统"));
  415. OnBnStart();
  416. UpdateData(FALSE);
  417. debug_print_syslog(0, "Server dialog init success.");
  418. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  419. }
  420. void CYAServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
  421. {
  422. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  423. {
  424. CAboutDlg dlgAbout;
  425. dlgAbout.DoModal();
  426. }
  427. else
  428. {
  429. CDialogEx::OnSysCommand(nID, lParam);
  430. }
  431. }
  432. // 如果向对话框添加最小化按钮,则需要下面的代码
  433. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  434. // 这将由框架自动完成。
  435. void CYAServerDlg::OnPaint()
  436. {
  437. if (IsIconic())
  438. {
  439. CPaintDC dc(this); // 用于绘制的设备上下文or
  440. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  441. // 使图标在工作区矩形中居中
  442. int cxIcon = GetSystemMetrics(SM_CXICON);
  443. int cyIcon = GetSystemMetrics(SM_CYICON);
  444. CRect rect;
  445. GetClientRect(&rect);
  446. int x = (rect.Width() - cxIcon + 1) / 2;
  447. int y = (rect.Height() - cyIcon + 1) / 2;
  448. // 绘制图标
  449. dc.DrawIcon(x, y, m_hIcon);
  450. }
  451. else
  452. {
  453. CDialogEx::OnPaint();
  454. }
  455. }
  456. //当用户拖动最小化窗口时系统调用此函数取得光标
  457. //显示。
  458. HCURSOR CYAServerDlg::OnQueryDragIcon()
  459. {
  460. return static_cast<HCURSOR>(m_hIcon);
  461. }
  462. /*
  463. * 点击启动按钮
  464. * 登录websocket服务器
  465. * 启动tcp server
  466. *
  467. * param
  468. * 无
  469. *
  470. * return
  471. * 无
  472. *
  473. */
  474. void CYAServerDlg::OnBnStart()
  475. {
  476. //Test();
  477. if(!is_websocket_login){
  478. ws_login();
  479. }
  480. start_tcp_server();
  481. }
  482. /*
  483. * 点击停止按钮
  484. * 退出websocket服务器
  485. * 停止tcp server
  486. *
  487. * param
  488. * 无
  489. *
  490. * return
  491. * 无
  492. *
  493. */
  494. void CYAServerDlg::OnBnStop()
  495. {
  496. //if(MessageBoxEx(m_hWnd, _T("确定停止吗?"), _T("询问"), MB_ICONQUESTION|MB_OKCANCEL|MB_DEFBUTTON2,NULL) == IDCANCEL){
  497. // return;
  498. //}
  499. stop_tcp_server();
  500. if(is_websocket_login){
  501. ws_logout();
  502. }
  503. }
  504. LRESULT CYAServerDlg::on_monitor(WPARAM wParam, LPARAM lParam)
  505. {
  506. if(m_bListen){
  507. m_uint_state = wParam ;
  508. }
  509. if(wParam == 0xFFFF){
  510. stop_and_exit();
  511. }
  512. return S_OK;
  513. }
  514. int CYAServerDlg::init_smart_pointer_var()
  515. {
  516. mp_reader_path_list_tdoa = std::make_shared<TDOAReaderPathMap>();
  517. mp_card_list_over_time_person = std::make_shared<CardMap>();
  518. mp_card_list_forbidden_person = std::make_shared<CardMap>();
  519. mp_card_list_help = std::make_shared<CardMap>();
  520. mp_card_list_area_over_time_person = std::make_shared<CardMap>();
  521. mp_card_list_forbidden_vehicle = std::make_shared<CardMap>();
  522. mp_card_list_over_time_vehicle = std::make_shared<CardMap>();
  523. mp_card_list_over_speed_vehicle = std::make_shared<CardMap>();
  524. mp_card_list_area_over_time_vehicle = std::make_shared<CardMap>();
  525. mp_area_over_count_person = std::make_shared<AreaMap>();
  526. mp_area_over_time_person = std::make_shared<AreaMap>();
  527. mp_area_forbidden_person = std::make_shared<AreaMap>();
  528. mp_area_over_count_vehicle = std::make_shared<AreaMap>();
  529. mp_area_over_time_vehicle = std::make_shared<AreaMap>();
  530. mp_area_forbidden_vehicle = std::make_shared<AreaMap>();
  531. mp_event_list = std::make_shared<EventMap>();
  532. return 0;
  533. }
  534. /*
  535. * 初始化对话框ui
  536. *
  537. * param
  538. * 无
  539. *
  540. * return
  541. * 无
  542. *
  543. */
  544. void CYAServerDlg::init_ui()
  545. {
  546. set_app_state(ST_STOPPED);
  547. m_listctrl_reader.SetColumnHeader(_T("分站号,60;分站地址,120;状态,60;"));
  548. m_listctrl_reader.SetGridLines(TRUE);
  549. m_listctrl_reader.SetEditable(FALSE);
  550. m_listctrl_reader.SetSortable(FALSE);
  551. Invalidate(FALSE);
  552. }
  553. void CYAServerDlg::set_app_state( EnAppState eas )
  554. {
  555. m_enState = eas;
  556. if(this->GetSafeHwnd() == nullptr)
  557. return;
  558. m_btStart.EnableWindow(m_enState == ST_STOPPED);
  559. m_btStop.EnableWindow(m_enState == ST_STARTED);
  560. GetDlgItem(IDC_BTN_HIS)->EnableWindow(m_enState == ST_STARTED);
  561. GetDlgItem(IDC_BTN_SYNCTIME)->EnableWindow(m_enState == ST_STARTED);
  562. CMenu* pMenu = GetMenu();
  563. ASSERT_VALID (pMenu);
  564. if(m_enState == ST_STOPPED){
  565. pMenu->EnableMenuItem(ID_START,MF_BYCOMMAND | MF_ENABLED);//启用
  566. pMenu->EnableMenuItem(ID_STOP,MF_BYCOMMAND | MF_GRAYED);//禁用
  567. }else if(m_enState == ST_STARTED){
  568. pMenu->EnableMenuItem(ID_START,MF_BYCOMMAND | MF_GRAYED);//禁用
  569. pMenu->EnableMenuItem(ID_STOP,MF_BYCOMMAND | MF_ENABLED);//启用
  570. }
  571. }
  572. void CYAServerDlg::init_param()
  573. {
  574. ::SetMainWnd(this);
  575. ::SetInfoList(&m_list_log);
  576. g_last_send_time = ::GetTickCount();
  577. m_time_last_rec = time(NULL);
  578. m_bListen = FALSE;
  579. m_nPort = PORT_SERVER_MASTER;
  580. m_nCountClick = 0;
  581. m_ws_url = TEST_WS_URL;
  582. m_tcp_host = LOCAL_ADDRESS;
  583. time_over_count_person = time_over_count_vehicle = 0;
  584. is_server_ok = true;
  585. is_start_tcp = false;
  586. g_exit = false;
  587. umpRootSyncNum.swap(unordered_map<unsigned long long, WORD>());
  588. InitializeCriticalSectionAndSpinCount(&m_csWriteLog, MAXCRITICALSECTIONSPINCOUNT);
  589. InitializeCriticalSectionAndSpinCount(&m_csRefreshList, MAXCRITICALSECTIONSPINCOUNT);
  590. InitializeCriticalSectionAndSpinCount(&m_csRemoveSocket, MAXCRITICALSECTIONSPINCOUNT);
  591. InitializeCriticalSectionAndSpinCount(&m_csParseDataServer, MAXCRITICALSECTIONSPINCOUNT);
  592. InitializeCriticalSectionAndSpinCount(&m_csSyncTime, MAXCRITICALSECTIONSPINCOUNT);
  593. InitializeCriticalSectionAndSpinCount(&m_csCallInfo, MAXCRITICALSECTIONSPINCOUNT);
  594. //从配置中读取(regedit)
  595. load_param_from_ini();
  596. database_connect();
  597. ws_open();
  598. //UpdateData(FALSE);
  599. }
  600. void CYAServerDlg::stop_and_exit()
  601. {
  602. if(is_start_tcp){
  603. stop_tcp_server();
  604. }
  605. if(is_websocket_login){
  606. ws_logout();
  607. }
  608. g_exit = true;
  609. if(m_thread_monitor){
  610. WaitForSingleObject(m_thread_monitor->m_hThread, 0);
  611. }
  612. m_thread_monitor = NULL;
  613. if(m_thread_timer){
  614. WaitForSingleObject(m_thread_timer->m_hThread, 0);
  615. }
  616. m_thread_timer = NULL;
  617. if(m_qsmSQL){
  618. m_qsmSQL->Execute();
  619. }
  620. CString strlog;
  621. while(g_QueueItemCount >0){
  622. strlog.Format(_T("%s: %d"), _T(LOG_LEFT_THREAD), g_QueueItemCount);
  623. show_log(strlog);
  624. WaitForMS(3000);
  625. }
  626. ::SetMainWnd(NULL);
  627. ::SetInfoList(NULL);
  628. clear_all_list();
  629. GetConnPool().CloseAllConn();
  630. DeleteCriticalSection(&m_csWriteLog);
  631. DeleteCriticalSection(&m_csParseDataServer);
  632. DeleteCriticalSection(&m_csRemoveSocket);
  633. DeleteCriticalSection(&m_csRefreshList);
  634. DeleteCriticalSection(&m_csSyncTime);
  635. DeleteCriticalSection(&m_csCallInfo);
  636. CDialogEx::OnCancel();
  637. exit(0);
  638. }
  639. void CYAServerDlg::set_run_state()
  640. {
  641. m_uint_state = 0;
  642. if(!is_server_ok){
  643. m_uint_state |= 0x10; // 长时间未接收到采集数据(网络故障,采集故障)
  644. }
  645. }
  646. int CYAServerDlg::init_staffer(string staff_id /* = "" */, bool is_card /*= false*/ )
  647. {
  648. CMysqlConn* pConn = NULL;
  649. CDBConnGuard pDbGuard(pConn);
  650. if(pConn == NULL){
  651. return 1;
  652. }
  653. MYSQL_RES* pRes;
  654. MYSQL_ROW pRow;
  655. int err = 0;
  656. char buf[LENGTH_SQL] = {0};
  657. if(staff_id.length() == 0){
  658. sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \
  659. s.dept_id, s.group_id, s.occupation_id, \
  660. d.name as dname, g.name as gname, o.name as oname \
  661. FROM dat_staff s \
  662. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  663. LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \
  664. LEFT JOIN dat_group g ON s.group_id = g.group_id \
  665. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  666. WHERE c.card_type_id = 1 and s.duty_id = 0;");
  667. }else if(is_card){
  668. sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \
  669. s.dept_id, s.group_id, s.occupation_id, \
  670. d.name as dname, g.name as gname, o.name as oname \
  671. FROM dat_staff s \
  672. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  673. LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \
  674. LEFT JOIN dat_group g ON s.group_id = g.group_id \
  675. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  676. WHERE c.card_type_id = 1 and s.duty_id = 0 AND s.card_id = '%s';", staff_id.c_str());
  677. }else{
  678. sprintf_s(buf, "SELECT staff_id, s.card_id, c.card_type_id, s.name, \
  679. s.dept_id, s.group_id, s.occupation_id, \
  680. d.name as dname, g.name as gname, o.name as oname \
  681. FROM dat_staff s \
  682. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  683. LEFT JOIN dat_dept d ON s.dept_id = d.dept_id \
  684. LEFT JOIN dat_group g ON s.group_id = g.group_id \
  685. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  686. WHERE c.card_type_id = 1 and s.duty_id = 0 AND staffer_id = '%s';", staff_id.c_str());
  687. }
  688. pRes = pConn->Execute(buf, err);
  689. std::shared_ptr<Card> pCard = nullptr;
  690. int nRow = 0;
  691. while(pRow = mysql_fetch_row(pRes)) {
  692. CardMap::iterator it = mp_card_list_all.find(pRow[1]);
  693. if(it != mp_card_list_all.end()){
  694. pCard = it->second;
  695. }else{
  696. pCard = std::make_shared<Card>(pRow[1], atoi(pRow[2]), theApp.z_offset);
  697. #ifdef ALGORITHM_TYPE_TOF
  698. pCard->set_reader_path_tof(&mp_reader_path_list);
  699. #elif defined ALGORITHM_TYPE_TDOA
  700. pCard->set_reader_path_tdoa(mp_reader_path_list_tdoa);
  701. #endif
  702. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  703. }
  704. nRow++;
  705. pCard->id = pRow[0];
  706. pCard->name = pRow[3];
  707. pCard->dept_id = atoi(pRow[4]);
  708. pCard->group_id = atoi(pRow[5]);
  709. pCard->department = (pRow[7] == NULL?"":pRow[7]);
  710. pCard->group = pRow[8];
  711. pCard->occupation = pRow[9];
  712. if(m_bUseFilter){
  713. if(theApp.use_filter_odd){
  714. std::string temp = pRow[1];
  715. int a = atoi(temp.substr(temp.length() - 1 , 1).c_str());
  716. if(0 == a%2){
  717. pCard->EnableFilter(m_nFilterType);
  718. }
  719. }else{
  720. pCard->EnableFilter(m_nFilterType);
  721. }
  722. }
  723. }
  724. mysql_free_result(pRes);
  725. CString strlog = _T("");
  726. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_STAFF), nRow, _T(LOG_RECORD_COUNT));
  727. show_log(strlog);
  728. return 0;
  729. }
  730. /*
  731. * 初始化所有车卡信息
  732. *
  733. * param
  734. * vehicle_id ------ 车卡id
  735. * is_card ------ 是否是卡
  736. *
  737. * return
  738. * 成功返回0,失败返回1
  739. *
  740. */
  741. int CYAServerDlg::init_vehicle(string vehicle_id /* = "" */, bool is_card /*= false*/)
  742. {
  743. CMysqlConn* pConn = NULL;
  744. CDBConnGuard pDbGuard(pConn);
  745. if(pConn == NULL){
  746. return 1;
  747. }
  748. MYSQL_RES* pRes;
  749. MYSQL_ROW pRow;
  750. int err = 0;
  751. char buf[LENGTH_SQL] = {0};
  752. if(vehicle_id.length() == 0){
  753. sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  754. v.dept_id, v.group_id, v.vehicle_type_id, \
  755. d.name as dname, g.name as gname, vt.name as vtname, vt.is_railroad as vt_is_railroad\
  756. FROM dat_vehicle v \
  757. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  758. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  759. LEFT JOIN dat_group g ON v.group_id = g.group_id \
  760. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  761. WHERE c.card_type_id = 2 and v.state = 0;");
  762. }else if(is_card){
  763. sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  764. v.dept_id, v.group_id, v.vehicle_type_id, \
  765. d.name as dname, g.name as gname, vt.name as vtname, vt.is_railroad as vt_is_railroad \
  766. FROM dat_vehicle v \
  767. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  768. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  769. LEFT JOIN dat_group g ON v.group_id = g.group_id \
  770. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  771. WHERE c.card_type_id = 2 and v.state = 0 AND v.card_id ='%s';", vehicle_id.c_str());
  772. }else{
  773. sprintf_s(buf, "SELECT vehicle_id, v.card_id, c.card_type_id, v.name, v.number, \
  774. v.dept_id, v.group_id, v.vehicle_type_id, \
  775. d.name as dname, g.name as gname, vt.name as vtname, vt.is_railroad as vt_is_railroad \
  776. FROM dat_vehicle v \
  777. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  778. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  779. LEFT JOIN dat_group g ON v.group_id = g.group_id \
  780. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  781. WHERE c.card_type_id = 2 and v.state = 0 AND vehicle_id='%s';", vehicle_id.c_str());
  782. }
  783. pRes = pConn->Execute(buf, err);
  784. std::shared_ptr<Card> pCard = nullptr;
  785. int nRow = 0;
  786. while(pRow = mysql_fetch_row(pRes)){
  787. CardMap::iterator it = mp_card_list_all.find(pRow[1]);
  788. if(it != mp_card_list_all.end()){
  789. pCard = it->second;
  790. }else{
  791. pCard = std::make_shared<Card>(pRow[1], atoi(pRow[2]), theApp.z_offset);
  792. #ifdef ALGORITHM_TYPE_TOF
  793. pCard->set_reader_path_tof(&mp_reader_path_list);
  794. #elif defined ALGORITHM_TYPE_TDOA
  795. pCard->set_reader_path_tdoa(mp_reader_path_list_tdoa);
  796. #endif
  797. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  798. }
  799. nRow++;
  800. pCard->id = (pRow[0] == NULL) ? "" : pRow[0];
  801. pCard->name = (pRow[3] == NULL) ? "" : pRow[3];
  802. pCard->number = (pRow[4] == NULL) ? "" : pRow[4];
  803. pCard->dept_id = atoi(pRow[5]);
  804. pCard->group_id = atoi(pRow[6]);
  805. pCard->department = (pRow[8] == NULL) ? "" : pRow[8];
  806. pCard->group = (pRow[9] == NULL) ? "" : pRow[9];
  807. pCard->worktype = (pRow[10] == NULL) ? "" : pRow[10];
  808. pCard->m_nIsRailroad = (pRow[11] == NULL)?0:atoi(pRow[11]);
  809. if(m_bUseFilter){
  810. if(theApp.use_filter_odd){
  811. std::string temp = pRow[1];
  812. int a = atoi(temp.substr(temp.length() - 1 , 1).c_str());
  813. if(0 == a%2){
  814. pCard->EnableFilter(m_nFilterType);
  815. }
  816. }else{
  817. pCard->EnableFilter(m_nFilterType);
  818. }
  819. }
  820. }
  821. mysql_free_result(pRes);
  822. CString strlog;
  823. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
  824. show_log(strlog);
  825. return 0;
  826. }
  827. /*
  828. * 初始化所有自组网卡信息
  829. *
  830. * param
  831. * adhoc_id ------ 自组网卡id
  832. * is_card ------ 是否是卡
  833. *
  834. * return
  835. * 成功返回0,失败返回1
  836. *
  837. */
  838. int CYAServerDlg::init_adhoc(string adhoc_id /*= ""*/,bool is_card /*= false*/)
  839. {
  840. CMysqlConn* pConn = NULL;
  841. CDBConnGuard pDbGuard(pConn);
  842. if(pConn == NULL){
  843. return 1;
  844. }
  845. MYSQL_ROW pRow;
  846. MYSQL_RES *pRes = NULL;
  847. int err = 0;
  848. char buf[LENGTH_SQL] = {0};
  849. if(adhoc_id.length() == 0){
  850. sprintf_s(buf,"select adhoc_id,v.card_id,v.dept_id, \
  851. d.name as dname \
  852. from dat_adhoc v \
  853. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  854. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  855. where c.card_type_id = 3 and v.state = 0 ;");
  856. }else if(is_card){
  857. sprintf_s(buf,"select adhoc_id,v.card_id,v.dept_id, \
  858. d.name as dname \
  859. from dat_adhoc v \
  860. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  861. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  862. where c.card_type_id = 3 and v.state = 0 and v.card_id ='%s';",adhoc_id.c_str());
  863. }else{
  864. sprintf_s(buf,"select adhoc_id,v.card_id,v.dept_id, \
  865. d.name as dname \
  866. from dat_adhoc v \
  867. LEFT JOIN dat_card c ON v.card_id = c.card_id \
  868. LEFT JOIN dat_dept d ON v.dept_id = d.dept_id \
  869. where c.card_type_id = 3 and v.state = 0 and v.adhoc_id ='%s';",adhoc_id.c_str());
  870. }
  871. pRes = pConn->Execute(buf, err);
  872. if(pRes == NULL){
  873. return 1;
  874. }
  875. std::shared_ptr<Card> pCard = nullptr;
  876. int nRow = 0;
  877. while(pRow = mysql_fetch_row(pRes)){
  878. CardMap::iterator it = mp_card_list_all.find(pRow[1]);
  879. if(it != mp_card_list_all.end()){
  880. pCard = it->second;
  881. }else{
  882. pCard = std::make_shared<Card>(pRow[1], CT_ADHOC, theApp.z_offset);
  883. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  884. }
  885. pCard->id = (pRow[0] == NULL) ? "" : pRow[0];
  886. pCard->card_id = (pRow[1] == NULL) ? "" : pRow[1];
  887. pCard->dept_id = (pRow[2] == NULL) ? 0:atoi(pRow[2]);
  888. pCard->department = (pRow[3] == NULL) ? "" : pRow[3];
  889. nRow++;
  890. }
  891. mysql_free_result(pRes);
  892. CString strlog;
  893. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ADHOC), nRow, _T(LOG_RECORD_COUNT));
  894. show_log(strlog);
  895. return 0;
  896. }
  897. int CYAServerDlg::init_map(int map_id /*= 0*/)
  898. {
  899. CMysqlConn* pConn = NULL;
  900. CDBConnGuard pDbGuard(pConn);
  901. if(pConn == NULL){
  902. return 1;
  903. }
  904. MYSQL_ROW pRow;
  905. MYSQL_RES *pRes = NULL;
  906. int err = 0;
  907. char strsql[LENGTH_SQL] = {0};
  908. if(map_id == 0){
  909. sprintf_s(strsql, "SELECT map_id, name, scale FROM dat_map;");
  910. }else{
  911. sprintf_s(strsql, "SELECT map_id, name, scale FROM dat_map WHERE map_id = %d; ", map_id);
  912. }
  913. pRes = pConn->Execute(strsql, err);
  914. //MapInfo* pMap = NULL;
  915. std::shared_ptr<MapInfo> pMap = nullptr;
  916. int nRow = 0;
  917. while(pRow = mysql_fetch_row(pRes)){
  918. MapInfoMap::iterator it = mp_map_list.find(atoi(pRow[0]));
  919. if(it != mp_map_list.end()){
  920. pMap = it->second;
  921. }else{
  922. pMap = std::make_shared<MapInfo>();
  923. pMap->map_id = atoi(pRow[0]);
  924. mp_map_list.insert(make_pair(pMap->map_id, pMap));
  925. nRow++;
  926. }
  927. pMap->map_name = pRow[1];
  928. pMap->map_scale = atof(pRow[2]);
  929. }
  930. mysql_free_result(pRes);
  931. CString strlog;
  932. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_MAP), nRow, _T(LOG_RECORD_COUNT));
  933. show_log(strlog);
  934. return 0;
  935. }
  936. int CYAServerDlg::init_area(int area_id /* = 0 */)
  937. {
  938. CMysqlConn* pConn = NULL;
  939. CDBConnGuard pDbGuard(pConn);
  940. if(pConn == NULL){
  941. return 1;
  942. }
  943. MYSQL_ROW pRow;
  944. MYSQL_RES *pRes = NULL;
  945. int err = 0;
  946. char strsql[LENGTH_SQL] = {0};
  947. if(area_id == 0){
  948. sprintf_s(strsql, "SELECT area_id, name, map_id, area_type_id, path, \
  949. over_count_person, over_count_vehicle, over_time_person, over_time_vehicle, is_attendance \
  950. FROM dat_area;");
  951. }else{
  952. sprintf_s(strsql, "SELECT area_id, name, map_id, area_type_id, path, \
  953. over_count_person, over_count_vehicle, over_time_person, over_time_vehicle, is_attendance \
  954. FROM dat_area WHERE area_id = %d; ", area_id);
  955. }
  956. pRes = pConn->Execute(strsql, err);
  957. std::shared_ptr<Area> pArea = nullptr;
  958. int nRow = 0;
  959. while(pRow = mysql_fetch_row(pRes)){
  960. AreaMap::iterator it = mp_area_list.find(atoi(pRow[0]));
  961. if(it != mp_area_list.end()){
  962. pArea = it->second;
  963. }else{
  964. pArea = std::make_shared<Area>();
  965. pArea->area_id = atoi(pRow[0]);
  966. mp_area_list.insert(make_pair(pArea->area_id, pArea));
  967. nRow++;
  968. }
  969. pArea->map_id = atoi(pRow[2]);
  970. MapInfoMap::iterator map_it = mp_map_list.find(pArea->map_id);
  971. if(map_it != mp_map_list.end()){
  972. AreaMap::iterator area_it = map_it->second->map_area_list.find(pArea->area_id);
  973. if(area_it == map_it->second->map_area_list.end()){
  974. map_it->second->map_area_list.insert(make_pair(pArea->area_id, pArea));
  975. }
  976. }
  977. pArea->area_name = pRow[1];
  978. pArea->area_type_id = atoi(pRow[3]);
  979. pArea->path = pRow[4]; // 多边形
  980. pArea->over_count_person = atoi(pRow[5]);
  981. pArea->over_count_vehicle = atoi(pRow[6]);
  982. pArea->over_time_person = atoi(pRow[7]);
  983. pArea->under_time_vehicle = atoi(pRow[8]);
  984. pArea->is_att = atoi(pRow[9]);
  985. pArea->init_border(pRow[4]);
  986. }
  987. mysql_free_result(pRes);
  988. CString strlog;
  989. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_AREA), nRow, _T(LOG_RECORD_COUNT));
  990. show_log(strlog);
  991. return 0;
  992. }
  993. int CYAServerDlg::init_reader(int reader_id /* = 0 */)
  994. {
  995. // 从数据库中读取
  996. CMysqlConn* pConn = NULL;
  997. CDBConnGuard pDbGuard(pConn);
  998. if(pConn == NULL){
  999. return 1;
  1000. }
  1001. MYSQL_ROW pRow;
  1002. MYSQL_RES *pRes = NULL;
  1003. int err = 0;
  1004. char strsql[LENGTH_SQL] = {0};
  1005. if(reader_id == 0){
  1006. sprintf_s(strsql, "SELECT reader_id, map_id, area_id, name, x, y, z, angle, \
  1007. state, ip, device_type_id, reader_type_id,isSpecial \
  1008. FROM dat_reader WHERE state=0;");
  1009. }else{
  1010. sprintf_s(strsql, "SELECT reader_id, map_id, area_id, name, x, y, z, angle, \
  1011. state, ip, device_type_id, reader_type_id,isSpecial \
  1012. FROM dat_reader WHERE state=0 AND reader_id = %d; ", reader_id);
  1013. }
  1014. pRes = pConn->Execute(strsql, err);
  1015. std::shared_ptr<Reader> pReader = nullptr;
  1016. int nRow = 0;
  1017. while(pRow = mysql_fetch_row(pRes)) {
  1018. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[0]));
  1019. if(it != mp_reader_list.end()){
  1020. pReader = it->second;
  1021. }else{
  1022. pReader = std::make_shared<Reader>();
  1023. pReader->reader_interval_time = m_reader_interval_time;
  1024. pReader->reader_id = atoi(pRow[0]);
  1025. mp_reader_list.insert(make_pair(pReader->reader_id, pReader));
  1026. nRow++;
  1027. }
  1028. pReader->map_id = atoi(pRow[1]);
  1029. MapInfoMap::iterator map_it = mp_map_list.find(pReader->map_id);
  1030. if(map_it != mp_map_list.end()){
  1031. ReaderMap::iterator reader_it = map_it->second->map_reader_list.find(pReader->reader_id);
  1032. if(reader_it == map_it->second->map_reader_list.end()){
  1033. map_it->second->map_reader_list.insert(make_pair(pReader->reader_id, pReader));
  1034. }
  1035. pReader->map_scale = map_it->second->map_scale;
  1036. }
  1037. pReader->area_id = atoi(pRow[2]);
  1038. pReader->reader_name = pRow[3];
  1039. pReader->reader_x = atof(pRow[4]);
  1040. pReader->reader_y = atof(pRow[5]);
  1041. pReader->reader_z = atof(pRow[6]);
  1042. pReader->reader_angle = atof(pRow[7]) * M_PI /180;
  1043. pReader->ip = pRow[9];
  1044. pReader->device_type_id = atoi(pRow[10]);
  1045. pReader->pos_state = atoi(pRow[11]);
  1046. pReader->m_nIsSpecial = atoi(pRow[12]);
  1047. //初始化天线
  1048. //分站天线赋值
  1049. std::shared_ptr<Antenna> ant = std::make_shared<Antenna>();
  1050. ant->antenna_id = 0;
  1051. ant->antenna_x = pReader->reader_x;
  1052. ant->antenna_y = pReader->reader_y;
  1053. ant->antenna_z = pReader->reader_z;
  1054. ant->antenna_angle = 0;
  1055. pReader->ant[0] = pReader->ant[1] = ant;
  1056. pReader->ant[1]->antenna_id = 1;
  1057. }
  1058. mysql_free_result(pRes);
  1059. CString strlog;
  1060. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_READER), nRow, _T(LOG_RECORD_COUNT));
  1061. show_log(strlog);
  1062. return 0;
  1063. }
  1064. //int CYAServerDlg::init_antenna(int reader_id /* = 0 */)
  1065. //{
  1066. // CMysqlConn* pConn = NULL;
  1067. // CDBConnGuard pDbGuard(pConn);
  1068. // if(pConn == NULL){
  1069. // return 1;
  1070. // }
  1071. // MYSQL_ROW pRow;
  1072. // MYSQL_RES *pRes = NULL;
  1073. // int err = 0;
  1074. // char strsql[LENGTH_SQL] = {0};
  1075. // if(reader_id == 0){
  1076. // sprintf_s(strsql, "SELECT antenna_id, a.reader_id, reader_idx, a.x, a.y, a.z, a.angle \
  1077. // FROM dat_antenna a, dat_reader r \
  1078. // WHERE a.reader_id = r.reader_id;");
  1079. // }else{
  1080. // sprintf_s(strsql, "SELECT antenna_id, a.reader_id, reader_idx, a.x, a.y, a.z, a.angle \
  1081. // FROM dat_antenna a, dat_reader r \
  1082. // WHERE a.reader_id = r.reader_id AND reader_id = %d; ", reader_id);
  1083. // }
  1084. // pRes = pConn->Execute(strsql,err);
  1085. //
  1086. // if (err)
  1087. // {
  1088. // return 1;
  1089. // }
  1090. //
  1091. // int nRow = 0;
  1092. // while(pRow = mysql_fetch_row(pRes)){
  1093. // ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[1]));
  1094. // if(it != mp_reader_list.end()){
  1095. // std::shared_ptr<Antenna> ant = std::make_shared<Antenna>();
  1096. // ant->antenna_id = atoi(pRow[0]);
  1097. // ant->antenna_x = atof(pRow[3]);
  1098. // ant->antenna_y = atof(pRow[4]);
  1099. // ant->antenna_z = atof(pRow[5]);
  1100. // ant->antenna_angle = atof(pRow[6]) * M_PI / 180.0;
  1101. // int idx = (atoi(pRow[2]) == 1) ? 0 : 1;
  1102. // std::shared_ptr<Reader> pReader = nullptr;
  1103. // pReader = it->second;
  1104. // pReader->ant[idx] = ant;
  1105. // //it->second->ant[idx] = ant;
  1106. // nRow++;
  1107. // }
  1108. // }
  1109. // mysql_free_result(pRes);
  1110. //
  1111. // CString strlog;
  1112. // strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ANTENNA), nRow, _T(LOG_RECORD_COUNT));
  1113. // show_log(strlog);
  1114. //
  1115. // return 0;
  1116. //}
  1117. int CYAServerDlg::init_dev_adhoc( int reader_id /*= 0*/ )
  1118. {
  1119. CMysqlConn* pConn = NULL;
  1120. CDBConnGuard pDbGuard(pConn);
  1121. if(pConn == NULL){
  1122. return 1;
  1123. }
  1124. MYSQL_ROW pRow;
  1125. MYSQL_RES *pRes = NULL;
  1126. int err = 0;
  1127. char strsql[LENGTH_SQL] = {0};
  1128. if(reader_id == 0){//dat_dev_adhoc
  1129. sprintf_s(strsql, "select ad.id, ad.reader_id, ad.level, ad.x, ad.y, ad.z from dat_dev_adhoc ad, dat_reader r \
  1130. where ad.reader_id = r.reader_id;");
  1131. }else{
  1132. sprintf_s(strsql, "select ad.id, ad.reader_id, ad.level, ad.x, ad.y, ad.z from dat_dev_adhoc ad, dat_reader r \
  1133. where ad.reader_id = r.reader_id and ad.reader_id = %d; ", reader_id);
  1134. }
  1135. pRes = pConn->Execute(strsql,err);
  1136. if(err){
  1137. return 1;
  1138. }
  1139. int nRow = 0;
  1140. int idx = 0;
  1141. while(pRow = mysql_fetch_row(pRes)){
  1142. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[1]));
  1143. if(it != mp_reader_list.end()){
  1144. std::shared_ptr<Adhoc> adhoc = std::make_shared<Adhoc>();
  1145. adhoc->adhoc_id = atoi(pRow[0]);
  1146. adhoc->idx = atoi(pRow[2]);
  1147. adhoc->x = atof(pRow[3]);
  1148. adhoc->y = atof(pRow[4]);
  1149. adhoc->z = atof(pRow[5]);
  1150. idx = (adhoc->idx < ADHOC_COUNT)?adhoc->idx:0;
  1151. it->second->adhoc[idx] = adhoc;
  1152. nRow++;
  1153. }
  1154. }
  1155. mysql_free_result(pRes);
  1156. CString strlog;
  1157. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_ADHOC_LOCATE), nRow, _T(LOG_RECORD_COUNT));
  1158. show_log(strlog);
  1159. return 0;
  1160. }
  1161. /*
  1162. * 函数名:init_all_readers_coverage
  1163. * 从数据库的dat_reader_path表中读取指定map_id和reader_id的地图范围集,
  1164. * 将此分站的地图范围集保存在分站类中的readerCoverage中;
  1165. * 如果指定了相同的地图范围集的reader_id,则直接将指定的reader_id的地图范围集赋值给此reader_id的地图范围集
  1166. * 然后将地图集赋值给station
  1167. *
  1168. *
  1169. * @param
  1170. * reader_id 分站id号
  1171. *
  1172. * @return
  1173. * -1,表示在分站map中未找到此分站信息或者未正常执行;0,表示正常执行
  1174. *
  1175. */
  1176. int CYAServerDlg::init_all_readers_coverage(int reader_id)
  1177. {
  1178. CMysqlConn* pConn = NULL;
  1179. CDBConnGuard pDbGuard(pConn);
  1180. //如果无可用数据库连接,不执行后续操作
  1181. if(pConn == NULL){
  1182. return 1;
  1183. }
  1184. char sql[LENGTH_SQL] = {0};
  1185. if(reader_id == 0){
  1186. 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;");
  1187. }else{
  1188. 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 = %d; ", reader_id);
  1189. }
  1190. MYSQL_RES* pRes = NULL;
  1191. MYSQL_ROW pRow;
  1192. int err = 0;
  1193. int nRow = 0;
  1194. //查询数据库
  1195. pRes = pConn->Execute(sql,err);
  1196. if (err)
  1197. {
  1198. return 1;
  1199. }
  1200. //从数据库获得信息赋给分站对象的地图集
  1201. while(pRow = mysql_fetch_row(pRes)){
  1202. int nReaderId = atoi(pRow[1]);
  1203. ReaderMap::iterator it = mp_reader_list.find(nReaderId);
  1204. int nSameConfigReader = atoi(pRow[0]);
  1205. int nIdx = atoi(pRow[2]);
  1206. //判断地图集信息是否可利用其它分站的覆盖范围,如果可用,则使用其它分站的覆盖范围
  1207. //-1表示不可用,否则表示可复用分站id号为nSameConfigReader的地图集覆盖范围
  1208. if(nSameConfigReader == -1){
  1209. _point p;
  1210. p.x = atof(pRow[3]);
  1211. p.y = atof(pRow[4]);
  1212. p.z = atof(pRow[5]);
  1213. it->second->readerCoveragePath.insert(make_pair(nIdx,p));
  1214. it->second->bIsInitCoverage = true;
  1215. nRow++;
  1216. }else{
  1217. it->second->readerCoveragePath = mp_reader_list.find(nSameConfigReader)->second->readerCoveragePath;
  1218. it->second->bIsInitCoverage = true;
  1219. nRow++;
  1220. }
  1221. }
  1222. mysql_free_result(pRes);
  1223. //输出操作数据库的日志信息
  1224. CString strlog;
  1225. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_READER_PATH), nRow, _T(LOG_RECORD_COUNT));
  1226. show_log(strlog);
  1227. //根据获得地图集将其赋给mp_reader_path_list
  1228. ReaderMap::iterator it = mp_reader_list.begin();
  1229. for(it;it!=mp_reader_list.end();it++){
  1230. if(it->second->bIsInitCoverage){
  1231. int nReaderId = it->second->reader_id - 1;
  1232. double dMapScale = mp_map_list.find(it->second->map_id)->second->map_scale;
  1233. std::shared_ptr<ReaderPath> pReaderPath = nullptr;
  1234. ReaderPathMap::iterator prpIt = mp_reader_path_list.find(nReaderId);
  1235. if(prpIt != mp_reader_path_list.end()){
  1236. pReaderPath = prpIt->second;
  1237. }else{
  1238. pReaderPath = std::make_shared<ReaderPath>();
  1239. mp_reader_path_list.insert(make_pair(nReaderId,pReaderPath));
  1240. }
  1241. pReaderPath->nRealCalcPoints = it->second->readerCoveragePath.size();
  1242. for(int i=0;i<2;i++){
  1243. pReaderPath->x[i] = it->second->ant[i]->antenna_x*dMapScale;
  1244. pReaderPath->y[i] = it->second->ant[i]->antenna_y*dMapScale;
  1245. pReaderPath->z[i] = it->second->ant[i]->antenna_z*dMapScale;
  1246. }
  1247. for(size_t j = 1;j <= it->second->readerCoveragePath.size(); j++){
  1248. pReaderPath->px[j - 1] = it->second->readerCoveragePath.find(j)->second.x*dMapScale;
  1249. pReaderPath->py[j - 1] = it->second->readerCoveragePath.find(j)->second.y*dMapScale;
  1250. pReaderPath->pz[j - 1] = it->second->readerCoveragePath.find(j)->second.z*dMapScale;
  1251. }
  1252. }
  1253. }
  1254. return 0;
  1255. }
  1256. /*
  1257. * 函数名:init_tdoa_all_readers_coverage
  1258. * 实现初始化TDOA方式的地图集描述,并存储冗余数据
  1259. * 冗余数据的主要作用在于:例如存在分站<B1,B2>之间的地图集描述,那么也存在<B2,B1>的对应关系
  1260. *
  1261. * param
  1262. * reader_id ------ 分站id号
  1263. *
  1264. * return
  1265. * 执行失败,返回1
  1266. * 正确执行,返回0
  1267. *
  1268. */
  1269. int CYAServerDlg::init_tdoa_all_readers_coverage(int reader_id)
  1270. {
  1271. CMysqlConn* pConn = NULL;
  1272. CDBConnGuard pDbGuard(pConn);
  1273. //无可用数据库连接
  1274. if(pConn == NULL){
  1275. return 1;
  1276. }
  1277. char sql[LENGTH_SQL] = {0};
  1278. if(reader_id == 0){
  1279. 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;");
  1280. }else{
  1281. sprintf_s(sql, "select start_reader_id,end_reader_id,idx,x,y,z,is_bezier from dat_reader_path_tdoa where p.start_reader_id =%d; ", reader_id);
  1282. }
  1283. MYSQL_RES* pRes = NULL;
  1284. MYSQL_ROW pRow;
  1285. int err = 0;
  1286. int nRow = 0;
  1287. //查询数据库
  1288. pRes = pConn->Execute(sql,err);
  1289. if (err)
  1290. {
  1291. return 1;
  1292. }
  1293. double mapScale = 0.0;
  1294. while(pRow = mysql_fetch_row(pRes)){
  1295. int start_reader_id = atoi(pRow[0]);
  1296. int end_reader_id = atoi(pRow[1]);
  1297. int ndx = atoi(pRow[2]);
  1298. int nTotal = get_map_path_nums(start_reader_id,end_reader_id);
  1299. //后缀_r都为冗余信息
  1300. std::shared_ptr<ReaderPath> prp = nullptr;
  1301. std::shared_ptr<ReaderPath> prp_r = nullptr;
  1302. TDOAReaderPathMap::iterator it = mp_reader_path_list_tdoa->find(start_reader_id);
  1303. if(it == mp_reader_path_list_tdoa->end()){
  1304. std::shared_ptr<ReaderPathMap> prpm = std::make_shared<ReaderPathMap>();
  1305. std::shared_ptr<ReaderPath> prp1 = std::make_shared<ReaderPath>();
  1306. prpm->insert(make_pair(end_reader_id,prp1));
  1307. mp_reader_path_list_tdoa->insert(make_pair(start_reader_id,prpm));
  1308. //冗余数据
  1309. std::shared_ptr<ReaderPathMap> prpm_r = std::make_shared<ReaderPathMap>();
  1310. std::shared_ptr<ReaderPath> prp1_r = std::make_shared<ReaderPath>();
  1311. prpm_r->insert(make_pair(start_reader_id,prp1_r));
  1312. mp_reader_path_list_tdoa->insert(make_pair(end_reader_id,prpm_r));
  1313. }else{
  1314. ReaderPathMap::iterator it2;
  1315. it2 = it->second->find(end_reader_id);
  1316. if(it2 == it->second->end()){
  1317. std::shared_ptr<ReaderPath> prp1 = std::make_shared<ReaderPath>();
  1318. it->second->insert(make_pair(end_reader_id,prp1));
  1319. }
  1320. }
  1321. TDOAReaderPathMap::iterator it_r = mp_reader_path_list_tdoa->find(end_reader_id);
  1322. if(it_r == mp_reader_path_list_tdoa->end()){
  1323. std::shared_ptr<ReaderPathMap> prpm = std::make_shared<ReaderPathMap>();
  1324. std::shared_ptr<ReaderPath> prp1 = std::make_shared<ReaderPath>();
  1325. prpm->insert(make_pair(start_reader_id,prp1));
  1326. mp_reader_path_list_tdoa->insert(make_pair(end_reader_id,prpm));
  1327. }else{
  1328. ReaderPathMap::iterator it2;
  1329. it2 = it_r->second->find(start_reader_id);
  1330. if(it2 == it_r->second->end()){
  1331. std::shared_ptr<ReaderPath> prp1 = std::make_shared<ReaderPath>();
  1332. it_r->second->insert(make_pair(start_reader_id,prp1));
  1333. }
  1334. }
  1335. ReaderPathMap::iterator it_rpm = mp_reader_path_list_tdoa->find(start_reader_id)->second->find(end_reader_id);
  1336. if(it_rpm!=mp_reader_path_list_tdoa->find(start_reader_id)->second->end()){
  1337. prp = it_rpm->second;
  1338. }else{
  1339. prp = std::make_shared<ReaderPath>();
  1340. mp_reader_path_list_tdoa->find(start_reader_id)->second->insert(make_pair(end_reader_id,prp));
  1341. }
  1342. //冗余信息
  1343. ReaderPathMap::iterator it_rpm_r = mp_reader_path_list_tdoa->find(end_reader_id)->second->find(start_reader_id);
  1344. if(it_rpm_r!=mp_reader_path_list_tdoa->find(end_reader_id)->second->end()){
  1345. prp_r = it_rpm_r->second;
  1346. }else{
  1347. prp_r = std::make_shared<ReaderPath>();
  1348. mp_reader_path_list_tdoa->find(end_reader_id)->second->insert(make_pair(start_reader_id,prp));
  1349. }
  1350. //获得地图比例
  1351. int map_id = mp_reader_list.find(start_reader_id)->second->map_id;
  1352. MapInfoMap::iterator mit = mp_map_list.find(map_id);
  1353. if(mit == mp_map_list.end()){
  1354. //没有相关地图信息,要输出错误日志
  1355. AfxMessageBox(_T("分站所在地图不存在!"));
  1356. break;
  1357. }
  1358. mapScale = mp_map_list.find(map_id)->second->map_scale;
  1359. if(prp->nRealCalcPoints < ndx){
  1360. prp->nRealCalcPoints = ndx;
  1361. }
  1362. if(prp_r->nRealCalcPoints < ndx){
  1363. prp_r->nRealCalcPoints = ndx;
  1364. }
  1365. if(!prp->bIsInit){
  1366. //获得分站坐标,其中索引0表示起始分站坐标,索引1表示结束分站坐标
  1367. prp->x[0] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale;
  1368. prp->y[0] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale;
  1369. prp->z[0] = 0;
  1370. prp->x[1] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale;
  1371. prp->y[1] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale;
  1372. prp->z[1] = 0;
  1373. prp->bIsInit = true;
  1374. }
  1375. if(prp->px[ndx-1] == 0){
  1376. prp->px[ndx-1] = atof(pRow[3])*mapScale;
  1377. prp->py[ndx-1] = atof(pRow[4])*mapScale;
  1378. }
  1379. if(!prp_r->bIsInit){
  1380. //冗余信息
  1381. prp_r->x[0] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale;
  1382. prp_r->y[0] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale;
  1383. prp_r->z[0] = 0;
  1384. prp_r->x[1] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale;
  1385. prp_r->y[1] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale;
  1386. prp_r->z[1] = 0;
  1387. prp_r->bIsInit = true;
  1388. }
  1389. if(prp_r->px[nTotal - ndx] == 0){
  1390. prp_r->px[nTotal - ndx] = atof(pRow[3])*mapScale;
  1391. prp_r->py[nTotal - ndx] = atof(pRow[4])*mapScale;
  1392. }
  1393. nRow++;
  1394. }
  1395. mysql_free_result(pRes);
  1396. //输出操作结果信息
  1397. CString strlog;
  1398. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_MAP_PATH), nRow, _T(LOG_RECORD_COUNT));
  1399. show_log(strlog);
  1400. return 0;
  1401. }
  1402. /*
  1403. * 初始化硐室表
  1404. *
  1405. * param
  1406. * 无
  1407. *
  1408. * return
  1409. * 成功返回0,失败返回1
  1410. *
  1411. */
  1412. int CYAServerDlg::init_chamber(int chamber_id)
  1413. {
  1414. CMysqlConn* pConn = NULL;
  1415. CDBConnGuard pDbGuard(pConn);
  1416. //无可用数据库连接
  1417. if(pConn == NULL){
  1418. return 1;
  1419. }
  1420. char sql[LENGTH_SQL] = {0};
  1421. if (chamber_id == 0)
  1422. {
  1423. sprintf_s(sql, "select chamber_id,path,name,is_used,section_id,map_id from dat_chamber;");
  1424. }
  1425. else
  1426. {
  1427. sprintf_s(sql, "select chamber_id,path,name,is_used,section_id,map_id from dat_chamber where chamber_id = %d;",chamber_id);
  1428. }
  1429. MYSQL_RES* pRes = NULL;
  1430. MYSQL_ROW pRow;
  1431. int err = 0;
  1432. int nRow = 0;
  1433. //查询数据库
  1434. pRes = pConn->Execute(sql,err);
  1435. if (err)
  1436. {
  1437. return 1;
  1438. }
  1439. while (pRow = mysql_fetch_row(pRes))
  1440. {
  1441. std::shared_ptr<Chamber> pChamber = nullptr;
  1442. int chamber_id = atoi(pRow[0]);
  1443. ChamberMap::iterator it_chamber = mp_chamber_list.find(chamber_id);
  1444. if (it_chamber != mp_chamber_list.end())
  1445. {
  1446. pChamber = it_chamber->second;
  1447. }else{
  1448. pChamber = std::make_shared<Chamber>();
  1449. mp_chamber_list.insert(make_pair(chamber_id,pChamber));
  1450. }
  1451. pChamber->m_nID = chamber_id;
  1452. pChamber->m_strPath = pRow[1];
  1453. pChamber->m_strName = pRow[2];
  1454. pChamber->m_nIsUsed = atoi(pRow[3]);
  1455. pChamber->m_nSectionID = atoi(pRow[4]);
  1456. pChamber->m_nMapID = atoi(pRow[5]);
  1457. if (pChamber->m_strPath!="")
  1458. {
  1459. pChamber->init_border(pChamber->m_strPath);
  1460. }
  1461. MapInfoMap::iterator it_map = mp_map_list.find(pChamber->m_nMapID);
  1462. if (it_map != mp_map_list.end())
  1463. {
  1464. ChamberMap::iterator it_chamber = it_map->second->map_chamber_list.find(pChamber->m_nID);
  1465. if (it_chamber == it_map->second->map_chamber_list.end())
  1466. {
  1467. it_map->second->map_chamber_list.insert(make_pair(pChamber->m_nID,pChamber));
  1468. }
  1469. }
  1470. nRow++;
  1471. }
  1472. mysql_free_result(pRes);
  1473. //输出操作结果信息
  1474. CString strlog;
  1475. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_CHAMBER), nRow, _T(LOG_RECORD_COUNT));
  1476. show_log(strlog);
  1477. return 0;
  1478. }
  1479. /*
  1480. * 初始化红绿灯表
  1481. *
  1482. * param
  1483. * 无
  1484. *
  1485. * return
  1486. * 成功返回0,失败返回1
  1487. *
  1488. */
  1489. int CYAServerDlg::init_traffic_lights(int light_id)
  1490. {
  1491. CMysqlConn* pConn = NULL;
  1492. CDBConnGuard pDbGuard(pConn);
  1493. //无可用数据库连接
  1494. if(pConn == NULL){
  1495. return 1;
  1496. }
  1497. char sql[LENGTH_SQL] = {0};
  1498. if (light_id == 0)
  1499. {
  1500. sprintf_s(sql, "select light_id,ip,x,y,z,name,label,map_id,area_id,section_id,reader_id,group_id,port from dat_traffic_lights where state = 0;");
  1501. }
  1502. else
  1503. {
  1504. sprintf_s(sql, "select light_id,ip,x,y,z,name,label,map_id,area_id,section_id,reader_id,group_id,port from dat_traffic_lights where state = 0 and light_id = %d;",light_id);
  1505. }
  1506. MYSQL_RES* pRes = NULL;
  1507. MYSQL_ROW pRow;
  1508. int err = 0;
  1509. int nRow = 0;
  1510. //查询数据库
  1511. pRes = pConn->Execute(sql,err);
  1512. if (err)
  1513. {
  1514. return 1;
  1515. }
  1516. while (pRow = mysql_fetch_row(pRes))
  1517. {
  1518. std::shared_ptr<Light> pLight = nullptr;
  1519. int light_id = atoi(pRow[0]);
  1520. LightMap::iterator it_light = mp_light_list.find(light_id);
  1521. if (it_light != mp_light_list.end())
  1522. {
  1523. pLight = it_light->second;
  1524. }else{
  1525. pLight = std::make_shared<Light>();
  1526. mp_light_list.insert(make_pair(light_id,pLight));
  1527. }
  1528. pLight->m_nID = light_id;
  1529. pLight->m_strIP = pRow[1];
  1530. pLight->x = atof(pRow[2]);
  1531. pLight->y = atof(pRow[3]);
  1532. pLight->z = atof(pRow[4]);
  1533. pLight->m_strName = pRow[4]!=NULL?pRow[5]:NULL;
  1534. pLight->m_strLabel= pRow[5]!=NULL?pRow[6]:NULL;
  1535. pLight->m_nMapID = atoi(pRow[7]);
  1536. pLight->m_nAreaID = atoi(pRow[8]);
  1537. pLight->m_nSectionID = atoi(pRow[9]);
  1538. pLight->m_nReaderID = atoi(pRow[10]);
  1539. pLight->m_nLightsGroupID = atoi(pRow[11]);
  1540. pLight->m_nPort = atoi(pRow[12]);
  1541. MapInfoMap::iterator it_map = mp_map_list.find(pLight->m_nMapID);
  1542. if (it_map != mp_map_list.end())
  1543. {
  1544. LightMap::iterator it_light = it_map->second->map_light_list.find(pLight->m_nID);
  1545. if (it_light == it_map->second->map_light_list.end())
  1546. {
  1547. it_map->second->map_light_list.insert(make_pair(pLight->m_nID,pLight));
  1548. }
  1549. }
  1550. nRow++;
  1551. }
  1552. mysql_free_result(pRes);
  1553. //输出操作结果信息
  1554. CString strlog;
  1555. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_LIGHTS), nRow, _T(LOG_RECORD_COUNT));
  1556. show_log(strlog);
  1557. return 0;
  1558. }
  1559. /*
  1560. * 初始化路段表
  1561. *
  1562. * param
  1563. * 无
  1564. *
  1565. * return
  1566. * 成功返回0,失败返回1
  1567. *
  1568. */
  1569. int CYAServerDlg::init_section(int section_id)
  1570. {
  1571. CMysqlConn* pConn = NULL;
  1572. CDBConnGuard pDbGuard(pConn);
  1573. //无可用数据库连接
  1574. if(pConn == NULL){
  1575. return 1;
  1576. }
  1577. char sql[LENGTH_SQL] = {0};
  1578. if (section_id == 0)
  1579. {
  1580. sprintf_s(sql, "select id,path,name,label,map_id,property from dat_section;");
  1581. }
  1582. else
  1583. {
  1584. sprintf_s(sql, "select id,path,name,label,map_id,property from dat_section where id = %d;",section_id);
  1585. }
  1586. MYSQL_RES* pRes = NULL;
  1587. MYSQL_ROW pRow;
  1588. int err = 0;
  1589. int nRow = 0;
  1590. //查询数据库
  1591. pRes = pConn->Execute(sql,err);
  1592. if (err)
  1593. {
  1594. return 1;
  1595. }
  1596. while (pRow = mysql_fetch_row(pRes))
  1597. {
  1598. std::shared_ptr<Section> pSection = nullptr;
  1599. int nSectionId = atoi(pRow[0]);
  1600. SectionMap::iterator it = mp_section_list.find(nSectionId);
  1601. if (it != mp_section_list.end())
  1602. {
  1603. pSection = it->second;
  1604. }
  1605. else
  1606. {
  1607. pSection = make_shared<Section>();
  1608. mp_section_list.insert(make_pair(nSectionId,pSection));
  1609. }
  1610. pSection->m_nID = atoi(pRow[0]);
  1611. pSection->m_strPath = pRow[1];
  1612. pSection->m_strName = pRow[2];
  1613. pSection->m_strLabel = pRow[3];
  1614. pSection->m_nMapId = atoi(pRow[4]);
  1615. if (pSection->m_strPath != "")
  1616. {
  1617. pSection->init_border(pSection->m_strPath);
  1618. }
  1619. MapInfoMap::iterator it_map = mp_map_list.find(pSection->m_nMapId);
  1620. if (it_map != mp_map_list.end())
  1621. {
  1622. SectionMap::iterator it_section = it_map->second->map_section_list.find(pSection->m_nID);
  1623. if (it_section == it_map->second->map_section_list.end())
  1624. {
  1625. it_map->second->map_section_list.insert(make_pair(pSection->m_nID,pSection));
  1626. }
  1627. }
  1628. ChamberMap::iterator it_chamber = mp_chamber_list.begin();
  1629. for (;it_chamber!=mp_chamber_list.end();++it_chamber)
  1630. {
  1631. if (it_chamber->second->m_nMapID == pSection->m_nMapId && it_chamber->second->m_nSectionID == pSection->m_nID)
  1632. {
  1633. //从硐室表找到和路段相同地图,且硐室信息中的路段id和此id相同的数据
  1634. ChamberMap::iterator it_section_chamber = pSection->mp_champer_list.find(it_chamber->second->m_nID);
  1635. if (it_section_chamber == pSection->mp_champer_list.end())
  1636. {
  1637. std::shared_ptr<Chamber> pChamber(it_chamber->second);
  1638. pSection->mp_champer_list.insert(make_pair(pChamber->m_nID,pChamber));
  1639. }
  1640. }
  1641. }
  1642. nRow++;
  1643. }
  1644. mysql_free_result(pRes);
  1645. //输出操作结果信息
  1646. CString strlog;
  1647. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_SECTIONS), nRow, _T(LOG_RECORD_COUNT));
  1648. show_log(strlog);
  1649. return 0;
  1650. }
  1651. /*
  1652. * 初始化红绿灯组
  1653. *
  1654. * param
  1655. * 无
  1656. *
  1657. * return
  1658. * 成功返回0,失败返回1
  1659. *
  1660. */
  1661. int CYAServerDlg::init_light_group(int group_id /*= 0*/)
  1662. {
  1663. CMysqlConn* pConn = NULL;
  1664. CDBConnGuard pDbGuard(pConn);
  1665. //无可用数据库连接
  1666. if(pConn == NULL){
  1667. return 1;
  1668. }
  1669. char sql[LENGTH_SQL] = {0};
  1670. if (group_id == 0)
  1671. {
  1672. sprintf_s(sql,"select group_id,name,label from dat_lights_group where state = 0;");
  1673. }
  1674. else
  1675. {
  1676. sprintf_s(sql,"select group_id,name,label from dat_lights_group where state = 0 and group_id = %d;",group_id);
  1677. }
  1678. MYSQL_RES* pRes = NULL;
  1679. MYSQL_ROW pRow;
  1680. int err = 0;
  1681. int nRow = 0;
  1682. //查询数据库
  1683. pRes = pConn->Execute(sql,err);
  1684. if (err)
  1685. {
  1686. return 1;
  1687. }
  1688. while (pRow = mysql_fetch_row(pRes))
  1689. {
  1690. std::shared_ptr<LightsGroup> pLightGroup = nullptr;
  1691. int nGroupId = atoi(pRow[0]);
  1692. LightGroupMap::iterator it = mp_light_group_list.find(nGroupId);
  1693. if (it!=mp_light_group_list.end())
  1694. {
  1695. pLightGroup = it->second;
  1696. }
  1697. else
  1698. {
  1699. pLightGroup = make_shared<LightsGroup>();
  1700. mp_light_group_list.insert(make_pair(nGroupId,pLightGroup));
  1701. }
  1702. pLightGroup->m_nID = nGroupId;
  1703. pLightGroup->m_nState = 0;
  1704. pLightGroup->m_strName = pRow[1];
  1705. pLightGroup->m_strLabel = pRow[2];
  1706. LightMap::iterator it_light = mp_light_list.begin();
  1707. for (;it_light != mp_light_list.end();++it_light)
  1708. {
  1709. if (it_light->second->m_nLightsGroupID == pLightGroup->m_nID)
  1710. {
  1711. std::shared_ptr<Light> pLight(it_light->second);
  1712. pLightGroup->mp_lights_list.insert(make_pair(pLight->m_nID,pLight));
  1713. }
  1714. }
  1715. nRow++;
  1716. }
  1717. mysql_free_result(pRes);
  1718. //输出操作结果信息
  1719. CString strlog;
  1720. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_LIGHTS_GROUP), nRow, _T(LOG_RECORD_COUNT));
  1721. show_log(strlog);
  1722. return 0;
  1723. }
  1724. void CYAServerDlg::ws_init()
  1725. {
  1726. is_websocket_ok = false;
  1727. is_websocket_login = false;
  1728. _io->set_reconnect_attempts(3);
  1729. using std::placeholders::_1;
  1730. using std::placeholders::_2;
  1731. using std::placeholders::_3;
  1732. using std::placeholders::_4;
  1733. socket::ptr sock = _io->socket();
  1734. sock->on(JSON_CMD_VALUE_USER, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnLogin, this, _1,_2,_3,_4)));
  1735. sock->on(JSON_CMD_VALUE_CALL, sio::socket::event_listener_aux(std::bind(&CYAServerDlg::OnCallMessage,this,_1,_2,_3,_4)));
  1736. sock->on(JSON_CMD_VALUE_PUSH, sio::socket::event_listener(std::bind(&CYAServerDlg::OnPushMessage, this)));
  1737. //default socket opened, also we have "set_open_listener" for monitoring physical connection opened.
  1738. _io->set_socket_open_listener(std::bind(&CYAServerDlg::OnConnected, this));
  1739. //_io->set_open_listener(std::bind(&CYAServerDlg::OnConnected, this));
  1740. //physical connection closed or drop.
  1741. _io->set_close_listener(std::bind(&CYAServerDlg::OnClosed,this, std::placeholders::_1));
  1742. _io->set_reconnect_listener(std::bind(&CYAServerDlg::OnReConnect, this, std::placeholders::_1, std::placeholders::_2));
  1743. //physical connection fail to establish.
  1744. _io->set_fail_listener(std::bind(&CYAServerDlg::OnFailed,this));
  1745. }
  1746. void CYAServerDlg::ws_close()
  1747. {
  1748. }
  1749. void CYAServerDlg::ws_login()
  1750. {
  1751. USES_CONVERSION;
  1752. CC2UTF8 conv = (char*)get_json_login().c_str();
  1753. string szlogin = conv.c_str();
  1754. _io->socket()->emit(JSON_CMD_VALUE_USER, szlogin, [&](sio::message::list const& msglist){
  1755. message::ptr msg_ptr = msglist[0];
  1756. int n =(int)msg_ptr->get_map()["code"]->get_int();
  1757. is_websocket_login = (0 == n) ? true : false;
  1758. CString strlog;
  1759. wchar_t* p_url = CFunctions::c2wc(m_ws_url.c_str());
  1760. if(is_websocket_login){
  1761. strlog.Format(_T("%s: %s"), _T(LOG_LOGIN_WEB_SERVER), p_url/*CFunctions::c2wc(m_ws_url.c_str())*/);
  1762. //show_log(strlog);
  1763. }else{
  1764. p_url = CFunctions::c2wc(m_ws_url.c_str());
  1765. strlog.Format(_T("%s: %s, err: %d"), _T(LOG_LOGIN_WEB_SERVER_FAILED), p_url, n/*CFunctions::c2wc(m_ws_url.c_str())*/);
  1766. }
  1767. show_log(strlog);
  1768. if(p_url){
  1769. free(p_url);
  1770. p_url = NULL;
  1771. }
  1772. });
  1773. }
  1774. void CYAServerDlg::ws_logout()
  1775. {
  1776. USES_CONVERSION;
  1777. CC2UTF8 conv = (char*)get_json_logout().c_str();
  1778. string szlogout = conv.c_str();
  1779. _io->socket()->emit(JSON_CMD_VALUE_USER, szlogout, [&](sio::message::list const& msglist){
  1780. message::ptr msg_ptr = msglist[0];
  1781. int n =(int)msg_ptr->get_map()["code"]->get_int();
  1782. CString strlog;
  1783. wchar_t* p_url = CFunctions::c2wc(m_ws_url.c_str());
  1784. if(n == 0){
  1785. strlog.Format(_T("%s: %s"), _T(LOG_LOGOUT_WEB_SERVER), p_url/*CFunctions::c2wc(m_ws_url.c_str())*/);
  1786. is_websocket_login = false;
  1787. //show_log(strlog);
  1788. }else{
  1789. p_url = CFunctions::c2wc(m_ws_url.c_str());
  1790. strlog.Format(_T("%s: %s, err: %d"), _T(LOG_LOGOUT_WEB_SERVER_FAILED), p_url, n/*CFunctions::c2wc(m_ws_url.c_str())*/);
  1791. }
  1792. show_log(strlog);
  1793. if(p_url){
  1794. free(p_url);
  1795. p_url = NULL;
  1796. }
  1797. });
  1798. }
  1799. void CYAServerDlg::start_tcp_server()
  1800. {
  1801. if(m_enState == ST_STARTED){
  1802. return;
  1803. }
  1804. set_app_state(ST_STARTING);
  1805. if(_server.Start(m_tcp_host, PORT_SERVER_MASTER))
  1806. {
  1807. ::LogServerStart(m_tcp_host, PORT_SERVER_MASTER);
  1808. set_app_state(ST_STARTED);
  1809. is_start_tcp = true;
  1810. }
  1811. else
  1812. {
  1813. ::LogServerStartFail(_server.GetLastError(), _server.GetLastErrorDesc());
  1814. set_app_state(ST_STOPPED);
  1815. }
  1816. }
  1817. void CYAServerDlg::stop_tcp_server()
  1818. {
  1819. if(m_enState == ST_STOPPED){
  1820. return;
  1821. }
  1822. set_app_state(ST_STOPPING);
  1823. if(_server.Stop()){
  1824. ::LogServerStop();
  1825. set_app_state(ST_STOPPED);
  1826. is_start_tcp = false;
  1827. }
  1828. else{
  1829. //ASSERT(FALSE);
  1830. }
  1831. }
  1832. void CYAServerDlg::clear_listener()
  1833. {
  1834. }
  1835. void CYAServerDlg::clear_all_list()
  1836. {
  1837. // 清空创建的对象
  1838. }
  1839. void CYAServerDlg::parse_package_data(BYTE* DataBuffer, int nLen, DWORD dwConnID )
  1840. {
  1841. if(DataBuffer == NULL){
  1842. return;
  1843. }
  1844. DWORD dw = ::GetTickCount();
  1845. CString strBuf = _T("");
  1846. if(m_log_raw_data){
  1847. formatByteArray(strBuf, DataBuffer, nLen);
  1848. writeErrorLog(_T("RAW_S"), strBuf, false);
  1849. strBuf.Empty();
  1850. }
  1851. int nCurPos = 0;
  1852. nCurPos += sizeof(WORD);
  1853. nLen -= sizeof(WORD); // 减去数据长度
  1854. WORD wCrc = CFunctions::getCRC(&DataBuffer[nCurPos], nLen - sizeof(WORD)); // CRC校验码
  1855. WORD w ;
  1856. CFunctions::getWord(&DataBuffer[nCurPos], &w, nLen - sizeof(WORD));
  1857. if( w != wCrc ){ // 校验不对
  1858. if(m_log_raw_data){
  1859. strBuf = _T("CRC校验不通过");
  1860. writeErrorLog(_T("RAW_S"), strBuf);
  1861. strBuf.Empty();
  1862. }
  1863. return;
  1864. }
  1865. WORD wChr = 0;
  1866. CFunctions::getWord(DataBuffer, &wChr, nCurPos);
  1867. nCurPos += sizeof(WORD);
  1868. int reader_id = 0;
  1869. int nTick = 0;
  1870. CString strtime = _T("");
  1871. INT codeType = wChr;
  1872. debug_print_syslog(0, "receive msg code: 0x%x", codeType);
  1873. switch (wChr){
  1874. case CHAR_LOCATEDATA: // 定位数据
  1875. {
  1876. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_0);
  1877. parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id);
  1878. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  1879. if(it != mp_reader_list.end()){
  1880. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1881. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_13);
  1882. parse_data_locate_card(DataBuffer, nCurPos, reader_id, wChr);
  1883. }
  1884. }
  1885. break;
  1886. }
  1887. case CHAR_LOCATEDATA_TDOA:
  1888. {
  1889. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_1);
  1890. parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id);
  1891. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  1892. if(it != mp_reader_list.end()){
  1893. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1894. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_14);
  1895. parse_data_locate_card(DataBuffer, nCurPos, reader_id, wChr);
  1896. }
  1897. }
  1898. else
  1899. {
  1900. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_35);
  1901. }
  1902. break;
  1903. }
  1904. case CHAR_LOCATEDATAHIS:
  1905. {
  1906. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_2);
  1907. g_is_rec_hist = true;
  1908. parse_data_locate_reader_his(DataBuffer, nLen, nCurPos, reader_id, nTick, strtime, wChr);
  1909. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1910. parse_data_locate_card_his(DataBuffer, nCurPos, reader_id, nTick, strtime, wChr);
  1911. }
  1912. break;
  1913. }
  1914. case CHAR_LOCATEDATAHIS_TDOA:
  1915. {
  1916. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_3);
  1917. g_is_rec_hist = true;
  1918. parse_data_locate_reader_his(DataBuffer, nLen, nCurPos, reader_id, nTick, strtime, wChr);
  1919. BYTE* bt = new BYTE[nLen];
  1920. TRACE(_T("new byte = %d \r\n"),nLen);
  1921. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1922. // 获取一条记录的长度
  1923. WORD wframelen = 0;
  1924. CFunctions::getWord(DataBuffer, &wframelen, nCurPos);
  1925. nCurPos += sizeof(WORD);
  1926. if(bt){
  1927. memset(bt, 0, nLen);
  1928. memcpy(bt, &DataBuffer[nCurPos], wframelen);
  1929. parse_data_locate_card_his_tdoa(bt, wframelen, reader_id, nTick, strtime);
  1930. }
  1931. nCurPos += nLen;
  1932. }
  1933. delete[] bt;
  1934. bt = NULL;
  1935. TRACE(_T("delete byte = %d \r\n"));
  1936. break;
  1937. }
  1938. case CHAR_HIST_DATA_FINISH:
  1939. {
  1940. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_4);
  1941. g_is_rec_hist = false;
  1942. // 完成历史数据上传,可点名下一分站
  1943. }
  1944. case CHAR_READER_SYNC_TIME:
  1945. {
  1946. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_5);
  1947. parse_data_reader_synctime(DataBuffer, nLen, nCurPos, CHAR_READER_SYNC_TIME);
  1948. break;
  1949. }
  1950. case CHAR_READER_SYNC_TIME_ROOT:
  1951. {
  1952. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_6);
  1953. parse_data_reader_synctime(DataBuffer, nLen, nCurPos, CHAR_READER_SYNC_TIME_ROOT);
  1954. break;
  1955. }
  1956. case CHAR_ADHOC:
  1957. {
  1958. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_7);
  1959. parse_data_locate_reader(DataBuffer, nCurPos, nLen, dwConnID, reader_id);
  1960. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  1961. if(it != mp_reader_list.end()){
  1962. while(nCurPos < nLen - (int)sizeof(WORD)){ // 减去crc
  1963. parse_data_adhoc(DataBuffer, nCurPos, reader_id);
  1964. }
  1965. }
  1966. break;
  1967. }
  1968. default:
  1969. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_8);
  1970. //WriteInfoFile("未能解析的命令!");
  1971. break;
  1972. }
  1973. strtime.ReleaseBuffer();
  1974. }
  1975. void CYAServerDlg::parse_data_locate_reader(BYTE * DataBuffer, int& nCurPos, int nLen, DWORD dwConnID, int& reader_id )
  1976. {
  1977. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_15);
  1978. //TRACE(_T("parse_data_locate_reader \r\n"));
  1979. // 分站号
  1980. DWORD dwReaderID;
  1981. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  1982. nCurPos += sizeof(DWORD);
  1983. reader_id = dwReaderID;
  1984. ReaderMap::iterator itReader = mp_reader_list.find(dwReaderID);
  1985. std::shared_ptr<Reader> pReader = nullptr;
  1986. bool isErrorReader = false;
  1987. if(itReader != mp_reader_list.end()){
  1988. pReader = itReader->second;
  1989. add_socket_to_list(dwConnID, reader_id);
  1990. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_16);
  1991. }else{
  1992. //return;
  1993. //isErrorReader = true;
  1994. TRACE(_T("new Reader,reader_id = %d . \r\n"),dwReaderID);
  1995. pReader = std::make_shared<Reader>();
  1996. pReader->reader_id = dwReaderID;
  1997. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_17);
  1998. }
  1999. // 接收数据时间
  2000. pReader->rec_time = time(NULL);
  2001. m_time_last_rec = pReader->rec_time; // 更新最后信号时间
  2002. // 分站时间戳
  2003. WORD wTickCount = 0;
  2004. CFunctions::getWord(DataBuffer, &wTickCount, nCurPos);
  2005. nCurPos += sizeof(WORD);
  2006. pReader->tick_count = wTickCount;
  2007. // 分站时间
  2008. // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年
  2009. BYTE btSec = 0;
  2010. memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE));
  2011. nCurPos += sizeof(BYTE);
  2012. BYTE btMin = 0;
  2013. memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE));
  2014. nCurPos += sizeof(BYTE);
  2015. BYTE btHour = 0;
  2016. memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE));
  2017. nCurPos += sizeof(BYTE);
  2018. BYTE btDay = 0;
  2019. memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE));
  2020. nCurPos += sizeof(BYTE);
  2021. BYTE btWeek = 0;
  2022. memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE));
  2023. nCurPos += sizeof(BYTE);
  2024. BYTE btMonth = 0;
  2025. memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE));
  2026. nCurPos += sizeof(BYTE);
  2027. BYTE btYear = 0;
  2028. memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE));
  2029. nCurPos += sizeof(BYTE);
  2030. struct tm reader_time;
  2031. reader_time.tm_sec = btSec;
  2032. reader_time.tm_min = btMin;
  2033. reader_time.tm_hour = btHour;
  2034. reader_time.tm_mday = btDay;
  2035. reader_time.tm_wday = btWeek;
  2036. reader_time.tm_mon = btMonth - 1;
  2037. reader_time.tm_year = btYear + 100; // + 2000 - 1900
  2038. pReader->reader_time = mktime(&reader_time);
  2039. // 温度
  2040. BYTE btTemperature = 0;
  2041. memcpy(&btTemperature, &DataBuffer[nCurPos], sizeof(BYTE));
  2042. nCurPos += sizeof(BYTE);
  2043. pReader->temperature = btTemperature;
  2044. // 状态
  2045. WORD wState = 0;
  2046. CFunctions::getWord(DataBuffer, &wState, sizeof(WORD));
  2047. nCurPos += sizeof(WORD);
  2048. if(m_log_parse_data){
  2049. CString strLog;
  2050. strLog.Format(_T("id:%d, n:%d, %.2d-%.2d-%.2d %.2d:%.2d:%.2d, tep:%d, sta:%d"),
  2051. dwReaderID, wTickCount, btYear, btMonth, btDay, btHour, btMin, btSec, btTemperature, wState);
  2052. writeErrorLog(_T("PARSE_S"), strLog);
  2053. strLog.Empty();
  2054. }
  2055. }
  2056. void CYAServerDlg::parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr)
  2057. {
  2058. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_18);
  2059. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  2060. if (it == mp_reader_list.end())
  2061. {
  2062. return;
  2063. }
  2064. // 卡类型
  2065. BYTE btCardType = 0;
  2066. memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE));
  2067. nCurPos += sizeof(BYTE);
  2068. // 卡号
  2069. DWORD dwCardId = 0;
  2070. CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos);
  2071. nCurPos += sizeof(DWORD);
  2072. // 获取标识卡编号, 3位卡类型 + 10位卡号
  2073. string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10);
  2074. std::shared_ptr<Card> card = nullptr;
  2075. bool isErrorCard = false;
  2076. CardMap::iterator it_card = mp_card_list_all.find(str_card_id);
  2077. if(it_card != mp_card_list_all.end()){
  2078. card = it_card->second;
  2079. }else{
  2080. isErrorCard = true;
  2081. card = std::make_shared<Card>(str_card_id, btCardType, theApp.z_offset);
  2082. #ifdef ALGORITHM_TYPE_TOF
  2083. card->set_reader_path_tof(&mp_reader_path_list);
  2084. #elif defined ALGORITHM_TYPE_TDOA
  2085. card->set_reader_path_tdoa(mp_reader_path_list_tdoa);
  2086. #endif
  2087. }
  2088. // 设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图
  2089. std::shared_ptr<Reader> pReader(it->second);
  2090. int n = it->second.use_count();
  2091. //std::weak_ptr<Reader> wpReader(pReader);
  2092. card->set_reader(pReader);
  2093. card->reader_tickcount = pReader->tick_count;
  2094. card->is_hist = false;
  2095. switch(btCardType)
  2096. {
  2097. case CT_VEHICLE:
  2098. {
  2099. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_19);
  2100. parse_data_locate_card_vehicle(DataBuffer, nCurPos, card, wChr);
  2101. deal_card_msg(card);
  2102. break;
  2103. }
  2104. case CT_PERSON:
  2105. {
  2106. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_20);
  2107. parse_data_locate_card_vehicle(DataBuffer, nCurPos, card, wChr);
  2108. deal_card_msg(card);
  2109. break;
  2110. }
  2111. default:
  2112. {
  2113. // 无法识别的数据
  2114. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_21);
  2115. break;
  2116. }
  2117. }
  2118. }
  2119. void CYAServerDlg::parse_data_locate_card_vehicle(BYTE* DataBuffer, int& nCurPos, std::shared_ptr<Card> card /*Card* card*/, unsigned short wChr )
  2120. {
  2121. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_22);
  2122. if(LT_READER == theApp.locate_type){
  2123. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_23);
  2124. card->isdealed = false;
  2125. card->isreceive = true;
  2126. card->issent = false;
  2127. }
  2128. // 报文时间
  2129. WORD wCardTickCount;
  2130. CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos);
  2131. nCurPos += sizeof(WORD);
  2132. BYTE btTypeAndPower;
  2133. memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE));
  2134. nCurPos += sizeof(BYTE);
  2135. //报文类型
  2136. BYTE btType;
  2137. btType = (btTypeAndPower >>4) & 0x0F;
  2138. //电池电量
  2139. BYTE btPower;
  2140. btPower = btTypeAndPower & 0x0F;
  2141. //保留
  2142. nCurPos += sizeof(BYTE);
  2143. //加速度
  2144. BYTE btAcceleration;
  2145. memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE));
  2146. nCurPos += sizeof(BYTE);
  2147. //定位时间戳Tsp // 字序
  2148. LONG64 lTime1 = 0;
  2149. BYTE btTemp = 0;
  2150. int nRangingPos = nCurPos;
  2151. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  2152. nCurPos += sizeof(BYTE);
  2153. DWORD dwTemp = 0;
  2154. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  2155. nCurPos += sizeof(DWORD);
  2156. lTime1 = btTemp;
  2157. lTime1 = lTime1 << 32;
  2158. lTime1 |= ((long long)dwTemp & 0xffffffff);
  2159. // 距离
  2160. double dldist = CFunctions::getDistance(lTime1);
  2161. // 天线
  2162. BYTE btAntenna;
  2163. memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE));
  2164. nCurPos += sizeof(BYTE);
  2165. WORD wSyncNum = 0;
  2166. WORD wStrength = 0;
  2167. if(CHAR_LOCATEDATA_TDOA == wChr){
  2168. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_24);
  2169. // 分站时间同步序列号
  2170. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  2171. nCurPos += sizeof(WORD);
  2172. // 信号强度
  2173. CFunctions::getWord(DataBuffer, &wStrength, nCurPos);
  2174. nCurPos += sizeof(WORD);
  2175. }
  2176. if(LT_COORDINATE == theApp.locate_type){
  2177. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_25);
  2178. card->time_stamp = wCardTickCount;
  2179. card->ranging_type = btType;
  2180. card->power_state = btPower;
  2181. card->accelerate_state = btAcceleration;
  2182. card->flying_time = lTime1;
  2183. card->sync_num = wSyncNum;
  2184. card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1;
  2185. card->distance = dldist;
  2186. if(m_log_parse_data){
  2187. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_26);
  2188. CString strLog;
  2189. wchar_t* p_card_id = CFunctions::c2wc(card->card_id.c_str());
  2190. strLog.Format(_T("id:%s, n:%d, type:%d, power:%d, acc:%d, flytime:%I64u, d:%f, ant:%d, syncnum:%d, strength:%d"),
  2191. p_card_id/*CFunctions::c2wc(card->card_id.c_str())*/, wCardTickCount, btType, btPower, btAcceleration, lTime1, dldist, btAntenna, wSyncNum, wStrength);
  2192. writeErrorLog(_T("PARSE_S"), strLog, true);
  2193. //strLog = _T("");
  2194. strLog.Empty();
  2195. if(p_card_id){
  2196. free(p_card_id);
  2197. p_card_id = NULL;
  2198. }
  2199. }
  2200. }else if(LT_READER == theApp.locate_type){
  2201. if(card->time_stamp < 0xFF && card->time_stamp < wCardTickCount){
  2202. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_27);
  2203. card->time_stamp = wCardTickCount;
  2204. card->ranging_type = btType;
  2205. card->power_state = btPower;
  2206. card->accelerate_state = btAcceleration;
  2207. card->flying_time = lTime1;
  2208. card->sync_num = wSyncNum;
  2209. card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1;
  2210. card->distance = dldist;
  2211. }else if(0xFF == card->time_stamp && wCardTickCount == 0){
  2212. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_28);
  2213. card->time_stamp = wCardTickCount;
  2214. card->ranging_type = btType;
  2215. card->power_state = btPower;
  2216. card->accelerate_state_last = card->accelerate_state;
  2217. card->accelerate_state = btAcceleration;
  2218. card->flying_time = lTime1;
  2219. card->sync_num = wSyncNum;
  2220. card->antenna_id = ((btAntenna & 0xFF) == 1) ? 0 : 1;
  2221. card->distance = dldist;
  2222. }
  2223. }
  2224. }
  2225. void CYAServerDlg::parse_data_adhoc( BYTE* DataBuffer, int& nCurPos, int reader_id )
  2226. {
  2227. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_29);
  2228. ReaderMap::iterator it = mp_reader_list.find(reader_id);
  2229. BYTE nlen = 0, nDeal = nCurPos;
  2230. //获取自组网数据长度,1字节
  2231. memcpy(&nlen, &DataBuffer[nCurPos], sizeof(BYTE));
  2232. nCurPos += sizeof(BYTE);
  2233. while (nlen > nCurPos - nDeal){
  2234. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_30);
  2235. //获取命令字,1字节
  2236. BYTE btCmd = 0;
  2237. memcpy(&btCmd, &DataBuffer[nCurPos], sizeof(BYTE));
  2238. nCurPos += sizeof(BYTE);
  2239. btCmd = btCmd&0x3F;
  2240. //获取源地址ID,1字节
  2241. BYTE btId = 0;
  2242. memcpy(&btId, &DataBuffer[nCurPos], sizeof(BYTE));
  2243. nCurPos += sizeof(BYTE);
  2244. //时间戳,1字节
  2245. BYTE btTickcount = 0;
  2246. memcpy(&btTickcount, &DataBuffer[nCurPos], sizeof(BYTE));
  2247. nCurPos += sizeof(BYTE);
  2248. //节点级别,1字节
  2249. BYTE btIdx = 0;
  2250. memcpy(&btIdx, &DataBuffer[nCurPos], sizeof(BYTE));
  2251. nCurPos += sizeof(BYTE);
  2252. if(btId != 0){
  2253. string str_card_id = CFunctions::getstrwithzero(CT_ADHOC, 3) + CFunctions::getstrwithzero(btId, 10);
  2254. std::shared_ptr<Card> card = nullptr;
  2255. CardMap::iterator it_card = mp_card_list_all.find(str_card_id);
  2256. if(it_card != mp_card_list_all.end()){
  2257. card = it_card->second;
  2258. }else{
  2259. card = std::make_shared<Card>(str_card_id, CT_ADHOC, theApp.z_offset);
  2260. mp_card_list_all.insert(make_pair(str_card_id, card));
  2261. }
  2262. CardMap::iterator it_adhoc_card = mp_card_list_down_adhoc.find(str_card_id);
  2263. if(it_adhoc_card==mp_card_list_down_adhoc.end()&&it_card!=mp_card_list_all.end()){
  2264. if(card == NULL){
  2265. mp_card_list_down_adhoc.insert(make_pair(str_card_id, it_card->second));
  2266. }else{
  2267. mp_card_list_down_adhoc.insert(make_pair(str_card_id, card));
  2268. }
  2269. }
  2270. //设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图
  2271. std::shared_ptr<Reader> pReader(it->second);
  2272. card->set_reader(pReader);
  2273. //card->set_reader(it->second);
  2274. if(btIdx < 0 || btIdx >= ADHOC_COUNT){
  2275. btIdx = 0;
  2276. }
  2277. if(it->second->adhoc[btIdx]){
  2278. card->x = it->second->adhoc[btIdx]->x;
  2279. card->y = it->second->adhoc[btIdx]->y;
  2280. card->z = it->second->adhoc[btIdx]->z;
  2281. }
  2282. if(btCmd & 0x01){ // 呼救
  2283. card->status_help = STATUS_ERROR;
  2284. }else if(btCmd & 0x02){ // 呼叫应答,即呼叫成功
  2285. if(STATUS_NORMAL == card->status_call){
  2286. card->state_biz = STATUS_NORMAL;
  2287. }
  2288. }else {
  2289. card->status_call = STATUS_NORMAL;
  2290. card->status_help = STATUS_NORMAL;
  2291. }
  2292. card->issent = false;
  2293. //if(card->status_help != btCmd){
  2294. // card->status_help = btCmd;
  2295. //}
  2296. deal_card_msg(card);
  2297. }
  2298. }
  2299. }
  2300. void CYAServerDlg::add_socket_to_list(DWORD dwConnID, DWORD reader_id )
  2301. {
  2302. if(m_enState != ST_STARTED){
  2303. return;
  2304. }
  2305. TCHAR szAddress[40];
  2306. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  2307. USHORT usPort;
  2308. if( _server.GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort)){
  2309. SocketMap::iterator itSock = mp_socket_list.find(szAddress);
  2310. if(itSock != mp_socket_list.end()){
  2311. itSock->second->dwConnID = dwConnID;
  2312. itSock->second->state = 0;
  2313. itSock->second->reader_id = reader_id;
  2314. }else{
  2315. std::shared_ptr<_SOCK> sock = std::make_shared<_SOCK>();
  2316. sock->sip = szAddress;
  2317. sock->dwConnID = dwConnID;
  2318. sock->state = 0;
  2319. sock->reader_id = reader_id;
  2320. mp_socket_list.insert(make_pair(sock->sip, sock));
  2321. ::PostMessage(this->GetSafeHwnd(), WM_REFRESH_IP_LIST, 1, 0);
  2322. }
  2323. }
  2324. }
  2325. void CYAServerDlg::remove_socket(DWORD dwConnID )
  2326. {
  2327. EnterCriticalSection(&m_csRemoveSocket);
  2328. bool bNeedRefresh = false;
  2329. SocketMap::iterator _sock = mp_socket_list.begin();
  2330. while(_sock != mp_socket_list.end()){
  2331. if(_sock->second->dwConnID == dwConnID){
  2332. _sock = mp_socket_list.erase(_sock);
  2333. bNeedRefresh = true;
  2334. }else{
  2335. ++_sock;
  2336. }
  2337. }
  2338. if(bNeedRefresh){
  2339. ::PostMessage(this->GetSafeHwnd(), WM_REFRESH_IP_LIST, 0, 0);
  2340. }
  2341. LeaveCriticalSection(&m_csRemoveSocket);
  2342. }
  2343. // 获取设备状态信息, 分站、红绿灯、道岔、扩音器
  2344. std::string CYAServerDlg::get_json_device_state()
  2345. {
  2346. char _time[STR_LEN_TIME];
  2347. struct tm local_time;
  2348. Json::Value root;
  2349. Json::Value state_maps;
  2350. MapInfoMap::iterator it_map = mp_map_list.begin();
  2351. int nn = 0;
  2352. for(; it_map != mp_map_list.end(); ++it_map){
  2353. Json::Value state_map;
  2354. Json::Value state_devs;
  2355. int n = 0;
  2356. ReaderMap::iterator it = mp_reader_list.begin();
  2357. for(; it != mp_reader_list.end(); ++it){
  2358. if(it->second->map_id != it_map->second->map_id) continue;
  2359. //if(it->second->state != it->second->state_old){
  2360. Json::Value state_dev;
  2361. state_dev[JSON_KEY_DEV_STATE_DEVICE_ID] = it->second->reader_id;
  2362. state_dev[JSON_KEY_DEV_STATE_STATE_DESC] = it->second->get_state_text();
  2363. state_dev[JSON_KEY_DEV_STATE_STATE] = it->second->state;
  2364. state_dev[JSON_KEY_DEV_STATE_DEVICE_TYPE_ID] = it->second->device_type_id;
  2365. localtime_s(&local_time, &it->second->rec_time);
  2366. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2367. state_dev[JSON_KEY_DEV_STATE_TIME] = _time;
  2368. n++;
  2369. state_devs.append(state_dev);
  2370. it->second->state_old = it->second->state;
  2371. //}
  2372. }
  2373. if(n >0){
  2374. state_map[JSON_KEY_DEV_STATE_MAP_ID] = it_map->second->map_id;
  2375. state_map[JSON_KEY_DEV_STATE_DEVICES] = state_devs;
  2376. nn++;
  2377. state_maps.append(state_map);
  2378. }
  2379. }
  2380. if(nn>0){
  2381. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_DEV_STATE;
  2382. root[JSON_ROOT_KEY_DATA] = state_maps;
  2383. return root.toFastString();
  2384. }
  2385. return "";
  2386. }
  2387. std::string CYAServerDlg::get_json_alarm()
  2388. {
  2389. Json::Value root;
  2390. Json::Value data;
  2391. Json::Value _global;
  2392. Json::Value _areas;
  2393. Json::Value _readers;
  2394. Json::Value _staff;
  2395. Json::Value _vehicle;
  2396. Json::Value _adhoc;
  2397. Json::Value _section;
  2398. Json::Value _light;
  2399. Json::Value _redLight;
  2400. unsigned int alarm_count = 0;
  2401. char _time[STR_LEN_TIME];
  2402. struct tm local_time;
  2403. // global
  2404. // 人员超员
  2405. alarm_count = mp_card_list_down_person.size();
  2406. if(alarm_count > sls_setting.over_count_person){ // if(time_over_count_person >0)
  2407. Json::Value alarm;
  2408. Json::Value detail;
  2409. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_PERSON;
  2410. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_count_person;
  2411. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  2412. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2413. _global.append(alarm);
  2414. }
  2415. // 车辆超员
  2416. alarm_count = mp_card_list_down_vehicle.size();
  2417. if(alarm_count > sls_setting.over_count_vehicle){
  2418. Json::Value alarm;
  2419. Json::Value detail;
  2420. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_VEHICLE;
  2421. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_count_vehicle;
  2422. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  2423. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2424. _global.append(alarm);
  2425. }
  2426. // 人员超时
  2427. alarm_count = mp_card_list_over_time_person->size();
  2428. if(alarm_count > 0){
  2429. Json::Value alarm;
  2430. Json::Value detail;
  2431. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_PERSON;
  2432. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_time_person;
  2433. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  2434. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2435. _global.append(alarm);
  2436. }
  2437. // 车辆超时
  2438. alarm_count = mp_card_list_over_time_vehicle->size();
  2439. if(alarm_count > 0){
  2440. Json::Value alarm;
  2441. Json::Value detail;
  2442. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE;
  2443. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_time_vehicle;
  2444. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  2445. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2446. _global.append(alarm);
  2447. }
  2448. // 车辆超速
  2449. alarm_count = mp_card_list_over_speed_vehicle->size();
  2450. if(alarm_count > 0){
  2451. Json::Value alarm;
  2452. Json::Value detail;
  2453. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE;
  2454. detail[JSON_KEY_ALARM_MAX] = sls_setting.over_speed;
  2455. detail[JSON_KEY_ALARM_CURRENT] = alarm_count;
  2456. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2457. _global.append(alarm);
  2458. }
  2459. // areas
  2460. // 人员超员
  2461. AreaMap::iterator it_area = mp_area_list.begin();
  2462. bool is_alarm = false;
  2463. for(; it_area != mp_area_list.end(); ++it_area){
  2464. is_alarm = false;
  2465. Json::Value area;
  2466. Json::Value alarms;
  2467. if(it_area->second->count_area_over_count_person > 0){
  2468. is_alarm = true;
  2469. Json::Value alarm;
  2470. Json::Value detail;
  2471. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_PERSON;
  2472. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_count_person;
  2473. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_person;
  2474. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2475. alarms.append(alarm);
  2476. }
  2477. if(it_area->second->count_area_over_count_vehicle > 0){
  2478. is_alarm = true;
  2479. Json::Value alarm;
  2480. Json::Value detail;
  2481. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_COUNT_VEHICLE;
  2482. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_count_vehicle;
  2483. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_vehicle;
  2484. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2485. alarms.append(alarm);
  2486. }
  2487. if(it_area->second->count_area_over_time_person > 0){
  2488. is_alarm = true;
  2489. Json::Value alarm;
  2490. Json::Value detail;
  2491. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_PERSON;
  2492. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_time_person;
  2493. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_area_over_time_person;
  2494. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2495. alarms.append(alarm);
  2496. }
  2497. if(it_area->second->count_area_over_time_vehicle > 0){
  2498. is_alarm = true;
  2499. Json::Value alarm;
  2500. Json::Value detail;
  2501. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_OVER_TIME_VEHICLE;
  2502. detail[JSON_KEY_ALARM_MAX] = it_area->second->over_time_vehicle;
  2503. detail[JSON_KEY_ALARM_CURRENT] = it_area->second->count_area_over_time_vehicle;
  2504. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2505. alarms.append(alarm);
  2506. }
  2507. if(it_area->second->count_area_forbidden_person > 0 || it_area->second->count_area_forbidden_vehicle > 0){
  2508. is_alarm = true;
  2509. Json::Value alarm;
  2510. Json::Value detail;
  2511. alarm[JSON_KEY_ALARM_ITEM] = JSON_KEY_ALARM_AREA_FORBIDDEN;
  2512. detail[JSON_KEY_ALARM_PERSON] = it_area->second->count_area_forbidden_person;
  2513. detail[JSON_KEY_ALARM_VEHICLE] = it_area->second->count_area_forbidden_vehicle;
  2514. alarm[JSON_KEY_ALARM_DETAIL] = detail;
  2515. alarms.append(alarm);
  2516. }
  2517. if(is_alarm){
  2518. area[JSON_KEY_ALARM_AREA_ID] = it_area->first;//it_area->second->area_id;
  2519. area[JSON_KEY_ALARM_ALARMS] = alarms;
  2520. _areas.append(area);
  2521. }
  2522. }
  2523. // 分站
  2524. ReaderMap::iterator it_reader = mp_reader_list.begin();
  2525. alarm_count = 0;
  2526. for(; it_reader != mp_reader_list.end(); ++it_reader){
  2527. if (it_reader->second->state == STATUS_DEVICE_ERROR){
  2528. Json::Value alarm;
  2529. int r_id = it_reader->second->reader_id;
  2530. alarm[JSON_KEY_ALARM_READER_ID] = it_reader->second->reader_id;
  2531. alarm[JSON_KEY_ALARM_TYPE_ID] = ATID_READER;
  2532. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_READER);
  2533. if(it_alarm != mp_alarm_type_list.end()){
  2534. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2535. }
  2536. localtime_s(&local_time, &it_reader->second->rec_time);
  2537. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2538. //strftime(_time, STR_LEN_TIME, "%m-%d %H:%M", &local_time);
  2539. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2540. _readers.append(alarm);
  2541. }
  2542. }
  2543. CardMap::iterator it_staff = mp_card_list_down_person.begin();
  2544. for(; it_staff != mp_card_list_down_person.end(); ++it_staff){
  2545. if(it_staff->second->status_area_over_time == STATUS_NORMAL &&
  2546. it_staff->second->status_area_forbidden == STATUS_NORMAL &&
  2547. it_staff->second->status_over_time == STATUS_NORMAL &&
  2548. it_staff->second->status_power == STATUS_NORMAL) {
  2549. continue;
  2550. }
  2551. Json::Value alarms;
  2552. Json::Value staff;
  2553. if(it_staff->second->status_area_forbidden == STATUS_ERROR){
  2554. time_t tt = it_staff->second->time_area_forbidden;
  2555. Json::Value alarm;
  2556. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_FORBIDDEN_PERSON);
  2557. if(it_alarm != mp_alarm_type_list.end()){
  2558. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2559. }
  2560. localtime_s(&local_time, &tt);
  2561. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2562. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2563. alarms.append(alarm);
  2564. }
  2565. if(it_staff->second->status_area_over_time == STATUS_ERROR){
  2566. Json::Value alarm;
  2567. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_OVER_TIME_PERSON);
  2568. if(it_alarm != mp_alarm_type_list.end()){
  2569. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2570. }
  2571. localtime_s(&local_time, &it_staff->second->time_area_over_time);
  2572. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2573. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2574. alarms.append(alarm);
  2575. }
  2576. if(it_staff->second->status_over_time == STATUS_ERROR){
  2577. Json::Value alarm;
  2578. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_TIME_PERSON);
  2579. if(it_alarm != mp_alarm_type_list.end()){
  2580. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2581. }
  2582. localtime_s(&local_time, &it_staff->second->time_over_time);
  2583. strftime(_time, STR_LEN_TIME, "%m-%d %H:%M", &local_time);
  2584. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2585. alarms.append(alarm);
  2586. }
  2587. if(it_staff->second->status_power == STATUS_ERROR){
  2588. Json::Value alarm;
  2589. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_POWER);
  2590. if(it_alarm != mp_alarm_type_list.end()){
  2591. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2592. }
  2593. localtime_s(&local_time, &it_staff->second->time_low_power);
  2594. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2595. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2596. alarms.append(alarm);
  2597. }
  2598. if(alarms != NULL){
  2599. staff[JSON_KEY_ALARM_STAFFER_ID] = it_staff->first;//it_staff->second->id;
  2600. staff[JSON_KEY_ALARM_ALARMS] = alarms;
  2601. _staff.append(staff);
  2602. }
  2603. }
  2604. CardMap::iterator it_vehicle = mp_card_list_down_vehicle.begin();
  2605. for(; it_vehicle != mp_card_list_down_vehicle.end(); ++it_vehicle){
  2606. if(it_vehicle->second->status_area_forbidden == STATUS_NORMAL &&
  2607. it_vehicle->second->status_area_over_time == STATUS_NORMAL &&
  2608. it_vehicle->second->status_over_speed == STATUS_NORMAL &&
  2609. it_vehicle->second->status_over_time == STATUS_NORMAL &&
  2610. it_vehicle->second->status_power == STATUS_NORMAL ){
  2611. continue;
  2612. }
  2613. Json::Value alarms;
  2614. Json::Value vehichle;
  2615. if(it_vehicle->second->status_area_forbidden == STATUS_ERROR){
  2616. Json::Value alarm;
  2617. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_FORBIDDEN_VEHICLE);
  2618. if(it_alarm != mp_alarm_type_list.end()){
  2619. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2620. }
  2621. localtime_s(&local_time, &it_vehicle->second->time_area_forbidden);
  2622. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2623. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2624. alarms.append(alarm);
  2625. }
  2626. if(it_vehicle->second->status_area_over_time == STATUS_ERROR){
  2627. Json::Value alarm;
  2628. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_AREA_OVER_TIME_VEHICLE);
  2629. if(it_alarm != mp_alarm_type_list.end()){
  2630. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2631. }
  2632. localtime_s(&local_time, &it_vehicle->second->time_area_over_time);
  2633. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2634. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2635. alarms.append(alarm);
  2636. }
  2637. if(it_vehicle->second->status_over_time == STATUS_ERROR){
  2638. Json::Value alarm;
  2639. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_TIME_VEHICLE);
  2640. if(it_alarm != mp_alarm_type_list.end()){
  2641. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2642. }
  2643. localtime_s(&local_time, &it_vehicle->second->time_over_time);
  2644. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2645. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2646. alarms.append(alarm);
  2647. }
  2648. if(it_vehicle->second->status_power == STATUS_ERROR){
  2649. Json::Value alarm;
  2650. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_POWER);
  2651. if(it_alarm != mp_alarm_type_list.end()){
  2652. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2653. }
  2654. localtime_s(&local_time, &it_vehicle->second->time_low_power);
  2655. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2656. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2657. alarms.append(alarm);
  2658. }
  2659. if(it_vehicle->second->status_over_speed == STATUS_ERROR){
  2660. Json::Value alarm;
  2661. AlarmTypeMap::iterator it_alarm = mp_alarm_type_list.find(ATID_OVER_SPEED);
  2662. if(it_alarm != mp_alarm_type_list.end()){
  2663. alarm[JSON_KEY_ALARM_TYPE_NAME] = it_alarm->second;
  2664. }
  2665. localtime_s(&local_time, &it_vehicle->second->time_over_speed);
  2666. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2667. alarm[JSON_KEY_ALARM_START_TIME] = _time;
  2668. alarms.append(alarm);
  2669. }
  2670. if(alarms != NULL){
  2671. vehichle[JSON_KEY_ALARM_STAFFER_ID] = it_vehicle->first;
  2672. vehichle[JSON_KEY_ALARM_ALARMS] = alarms;
  2673. _vehicle.append(vehichle);
  2674. }
  2675. }
  2676. if(_global != NULL){
  2677. data[JSON_KEY_ALARM_GLOBAL] = _global;
  2678. }
  2679. if(_areas != NULL){
  2680. data[JSON_KEY_ALARM_AREA] = _areas;
  2681. }
  2682. if(_readers != NULL){
  2683. data[JSON_KEY_ALARM_READER] = _readers;
  2684. }
  2685. if(_staff != NULL){
  2686. data[JSON_KEY_ALARM_STAFF] = _staff;
  2687. }
  2688. if(_vehicle != NULL){
  2689. data[JSON_KEY_ALARM_VEHICLE] = _vehicle;
  2690. }
  2691. //路段告警json字符串
  2692. _section = get_section_json_alarm();
  2693. if (_section != NULL)
  2694. {
  2695. data[JSON_KEY_ALARM_SECTION] = _section;
  2696. }
  2697. //灯异常告警json字符串
  2698. _light = get_light_json_alarm();
  2699. if (_light != NULL)
  2700. {
  2701. data[JSON_KEY_ALARM_LIGHT] = _light;
  2702. }
  2703. //闯红灯告警json字符串
  2704. _redLight = get_red_light_json_alarm();
  2705. if (_redLight != NULL)
  2706. {
  2707. data[JSON_KEY_ALARM_TRAFFIC_RED_LIGHT] = _redLight;
  2708. }
  2709. if(data != NULL){
  2710. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_ALARM;
  2711. root[JSON_ROOT_KEY_DATA] = data;
  2712. return root.toFastString();
  2713. }
  2714. return "";
  2715. }
  2716. int CYAServerDlg::get_help_card_nums()
  2717. {
  2718. if (mp_card_list_down_adhoc.size() == 0)
  2719. {
  2720. return 0;
  2721. }
  2722. int nRet = 0;
  2723. CardMap::iterator it = mp_card_list_down_adhoc.begin();
  2724. for(it;it!=mp_card_list_down_adhoc.end();++it){
  2725. if(it->second->status_help == STATUS_ERROR){
  2726. nRet++;
  2727. }
  2728. }
  2729. return nRet;
  2730. }
  2731. int CYAServerDlg::get_map_path_nums(const int& start_reader_id,const int& end_reader_id)
  2732. {
  2733. CMysqlConn* pConn = NULL;
  2734. CDBConnGuard pDbGuard(pConn);
  2735. //无可用数据库连接
  2736. if(pConn == NULL){
  2737. return 1;
  2738. }
  2739. int nRet = 0;
  2740. char sql[LENGTH_SQL] = {0};
  2741. sprintf_s(sql,"select count(idx) from dat_reader_path_tdoa where start_reader_id = %d and end_reader_id = %d;",start_reader_id,end_reader_id);
  2742. MYSQL_RES* pRes = NULL;
  2743. MYSQL_ROW pRow;
  2744. int err = 0;
  2745. int nRow = 0;
  2746. //查询数据库
  2747. pRes = pConn->Execute(sql,err);
  2748. if (err)
  2749. {
  2750. return 0;
  2751. }
  2752. while(pRow = mysql_fetch_row(pRes)){
  2753. nRet = atoi(pRow[0]);
  2754. }
  2755. mysql_free_result(pRes);
  2756. return nRet;
  2757. }
  2758. std::string CYAServerDlg::get_json_help()
  2759. {
  2760. Json::Value root;
  2761. Json::Value alarms;
  2762. Json::Value adhoc;
  2763. char _time[STR_LEN_TIME];
  2764. struct tm local_time;
  2765. CardMap::iterator it_adhoc = mp_card_list_down_adhoc.begin();
  2766. for(;it_adhoc!=mp_card_list_down_adhoc.end();++it_adhoc){
  2767. if(it_adhoc->second->status_help == STATUS_NORMAL){
  2768. continue;
  2769. }
  2770. Json::Value alarm;
  2771. if(it_adhoc->second->status_help == STATUS_ERROR){
  2772. alarm[JSON_KEY_CARD_ID] = it_adhoc->second->card_id;
  2773. alarm[JSON_KEY_CARD_TYPE_ID] = it_adhoc->second->card_type;
  2774. localtime_s(&local_time, &it_adhoc->second->enter_reader_time);
  2775. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  2776. alarm["start_time"] = _time;
  2777. }
  2778. if(!alarm.isNull()){
  2779. alarms.append(alarm);
  2780. }
  2781. }
  2782. if(!alarms.isNull()){
  2783. root[JSON_ROOT_KEY_CMD] = "helpme_req";
  2784. root[JSON_ROOT_KEY_DATA] = alarms;
  2785. }
  2786. return root.toFastString();
  2787. }
  2788. Json::Value CYAServerDlg::get_section_json_alarm()
  2789. {
  2790. int nTotals = 0;
  2791. Json::Value sections;
  2792. Json::Value data;
  2793. sections[JSON_ROOT_KEY_CMD] = JSON_KEY_ALARM_SECTION;
  2794. SectionMap::iterator it = mp_section_list.begin();
  2795. for (;it != mp_section_list.end(); ++it)
  2796. {
  2797. //正常路段不报警
  2798. if (it->second->get_section_state() == SECTION_STATE_NORMAL)
  2799. {
  2800. continue;
  2801. }
  2802. Json::Value tmp;
  2803. Json::Value section;
  2804. //路段id
  2805. tmp[JSON_KEY_ALARM_SECTION_ID] = it->second->m_nID;
  2806. section.append(tmp[JSON_KEY_ALARM_SECTION_ID]);
  2807. //地图id
  2808. tmp[JSON_KEY_MAP_ID] = it->second->m_nMapId;
  2809. section.append(tmp[JSON_KEY_MAP_ID]);
  2810. //路段内车辆总数
  2811. tmp[JSON_KEY_ALARM_SECTION_VEHICLE_COUNTS] = it->second->get_section_vehicle_counts();
  2812. section.append(tmp[JSON_KEY_ALARM_SECTION_VEHICLE_COUNTS]);
  2813. //路段内人员总数
  2814. tmp[JSON_KEY_ALARM_SECTION_STAFFER_COUNTS] = it->second->get_section_staffer_counts();
  2815. section.append(tmp[JSON_KEY_ALARM_SECTION_STAFFER_COUNTS]);
  2816. //路段状态
  2817. tmp[JSON_KEY_ALARM_SECTION_STATE] = it->second->get_section_state();
  2818. section.append(tmp[JSON_KEY_ALARM_SECTION_STATE]);
  2819. //路段开始报警时间
  2820. int ms = 1000; //转为ms
  2821. double t = *((int64_t*)&it->second->alarm_start_time)*ms;
  2822. tmp[JSON_KEY_ALARM_START_TIME] = t;
  2823. section.append(tmp[JSON_KEY_ALARM_START_TIME]);
  2824. if (!section.isNull())
  2825. {
  2826. data.append(section);
  2827. }
  2828. nTotals++;
  2829. }
  2830. sections[JSON_ROOT_KEY_TOTAL] = nTotals;
  2831. if (data != NULL)
  2832. {
  2833. sections[JSON_ROOT_KEY_DATA] = data;
  2834. }
  2835. return sections;
  2836. }
  2837. Json::Value CYAServerDlg::get_light_json_alarm()
  2838. {
  2839. Json::Value lights;
  2840. Json::Value data;
  2841. //cmd
  2842. lights[JSON_ROOT_KEY_CMD] = JSON_KEY_ALARM_LIGHT;
  2843. //data
  2844. LightMap::iterator it = mp_light_list.begin();
  2845. for (;it != mp_light_list.end();++it)
  2846. {
  2847. if (it->second->m_nState == STATUS_NORMAL && it->second->m_nStateBiz == STATUS_NORMAL)
  2848. {
  2849. //continue;
  2850. }
  2851. Json::Value tmp;
  2852. Json::Value light;
  2853. //light_id
  2854. tmp[JSON_KEY_ALARM_LIGHT_ID] = it->second->m_nID;
  2855. light.append(tmp[JSON_KEY_ALARM_LIGHT_ID]);
  2856. //light_group_id,light_group_name,vehicle_id(控制此灯组id)
  2857. LightGroupMap::iterator lgm = mp_light_group_list.find(it->second->m_nLightsGroupID);
  2858. if (lgm != mp_light_group_list.end())
  2859. {
  2860. tmp[JSON_KEY_ALARM_LIGHT_GROUP_ID] = lgm->second->m_nID;
  2861. light.append(tmp[JSON_KEY_ALARM_LIGHT_GROUP_ID]);
  2862. tmp[JSON_KEY_ALARM_LIGHT_GROUP_NAME] = lgm->second->m_strName;
  2863. light.append(tmp[JSON_KEY_ALARM_LIGHT_GROUP_NAME]);
  2864. tmp[JSON_KEY_ALARM_VEHICLE_ID] = lgm->second->m_strVechileId;
  2865. light.append(tmp[JSON_KEY_ALARM_VEHICLE_ID]);
  2866. }else{
  2867. tmp[JSON_KEY_ALARM_LIGHT_GROUP_ID] = 0;
  2868. light.append(tmp[JSON_KEY_ALARM_LIGHT_GROUP_ID]);
  2869. tmp[JSON_KEY_ALARM_LIGHT_GROUP_NAME] = "";
  2870. light.append(tmp[JSON_KEY_ALARM_LIGHT_GROUP_NAME]);
  2871. tmp[JSON_KEY_ALARM_VEHICLE_ID] = "";
  2872. light.append(tmp[JSON_KEY_ALARM_VEHICLE_ID]);
  2873. }
  2874. if (it->second->m_nState == STATUS_NORMAL)
  2875. {
  2876. tmp[JSON_KEY_STATE] = STATUS_NORMAL;
  2877. tmp[JSON_KEY_STATE_BIZ] = STATUS_NORMAL;
  2878. }else{
  2879. tmp[JSON_KEY_STATE] = it->second->m_nState;
  2880. tmp[JSON_KEY_STATE_BIZ] = it->second->m_nStateBiz;
  2881. }
  2882. light.append(tmp[JSON_KEY_STATE]);
  2883. light.append(tmp[JSON_KEY_STATE_BIZ]);
  2884. //路段开始报警时间
  2885. int ms = 1000; //转为ms
  2886. double t = *((int64_t*)&it->second->alarm_start_time)*ms;
  2887. tmp[JSON_KEY_ALARM_START_TIME] = t;
  2888. light.append(tmp[JSON_KEY_ALARM_START_TIME]);
  2889. if (!light.isNull())
  2890. {
  2891. data.append(light);
  2892. }
  2893. }
  2894. if (!data.isNull())
  2895. {
  2896. lights[JSON_ROOT_KEY_DATA] = data;
  2897. }
  2898. return lights;
  2899. }
  2900. /*
  2901. * 闯红灯告警json
  2902. *
  2903. * param
  2904. * 无
  2905. *
  2906. * return
  2907. * json对象
  2908. *
  2909. */
  2910. Json::Value CYAServerDlg::get_red_light_json_alarm()
  2911. {
  2912. Json::Value redLightEvent;
  2913. Json::Value data;
  2914. redLightEvent[JSON_ROOT_KEY_CMD] = JSON_KEY_ALARM_TRAFFIC_RED_LIGHT;
  2915. CardMap::iterator it = mp_card_list_all.begin();
  2916. for (;it != mp_card_list_all.end();++it)
  2917. {
  2918. //如果此卡闯红灯了
  2919. if (!it->second->is_red_light)
  2920. {
  2921. Json::Value redLight;
  2922. Json::Value record;
  2923. //闯红灯车辆id,被闯灯id,闯红灯时间,司机id
  2924. redLight[JSON_KEY_ALARM_VEHICLE_ID] = it->second->card_id;
  2925. record.append(redLight[JSON_KEY_ALARM_VEHICLE_ID]);
  2926. redLight[JSON_KEY_ALARM_LIGHT_ID] = it->second->light_id;
  2927. record.append(redLight[JSON_KEY_ALARM_LIGHT_ID]);
  2928. int ms = 1000; //转为ms
  2929. double t = *((int64_t*)&it->second->time_red_light)*ms;
  2930. redLight[JSON_KEY_ALARM_START_TIME] = t;
  2931. record.append(redLight[JSON_KEY_ALARM_START_TIME]);
  2932. redLight[JSON_KEY_ALARM_STAFFER_ID] = it->second->driver_id;
  2933. record.append(redLight[JSON_KEY_ALARM_STAFFER_ID]);
  2934. if (!record.isNull())
  2935. {
  2936. data.append(record);
  2937. }
  2938. }
  2939. }
  2940. if (!data.isNull())
  2941. {
  2942. redLightEvent[JSON_ROOT_KEY_DATA] = data;
  2943. }
  2944. return redLightEvent;
  2945. }
  2946. std::string CYAServerDlg::get_json_down_and_up(std::shared_ptr<Card> card /*Card* card*/ )
  2947. {
  2948. //新json格式
  2949. Json::Value root;
  2950. Json::Value val_card;
  2951. Json::Value val_cards;
  2952. //卡号
  2953. val_card[JSON_KEY_CARD_ID] = card->card_id;
  2954. val_cards.append(val_card[JSON_KEY_CARD_ID]);
  2955. if(card->pos_state == DT_DOWN){
  2956. //x,y坐标
  2957. val_card[JSON_KEY_CORDINATE_X] = CFunctions::round(card->x,2);
  2958. val_cards.append(val_card[JSON_KEY_CORDINATE_X]);
  2959. val_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(card->y,2);
  2960. val_cards.append(val_card[JSON_KEY_CORDINATE_Y]);
  2961. }else{
  2962. val_card[JSON_KEY_CORDINATE_X] = 0;
  2963. val_cards.append(val_card[JSON_KEY_CORDINATE_X]);
  2964. val_card[JSON_KEY_CORDINATE_Y] = 0;
  2965. val_cards.append(val_card[JSON_KEY_CORDINATE_Y]);
  2966. }
  2967. int ms = 1000;
  2968. //入井时间戳
  2969. double t = *((int64_t*)&card->down_time)*ms; //转为ms
  2970. val_card[JSON_KEY_DOWN_TIME] = t;
  2971. val_cards.append(val_card[JSON_KEY_DOWN_TIME]);
  2972. //进入区域时间戳
  2973. t = *((int64_t*)&card->enter_area_time)*ms;
  2974. val_card[JSON_KEY_ENTER_AREA_TIME] = t;
  2975. val_cards.append(val_card[JSON_KEY_ENTER_AREA_TIME]);
  2976. if(card->pos_state == DT_DOWN){
  2977. //接收时间戳
  2978. t = *((int64_t*)&card->rec_time)*ms;
  2979. val_card[JSON_KEY_REC_TIME] = t;
  2980. val_cards.append(val_card[JSON_KEY_REC_TIME]);
  2981. //工作时长
  2982. t = (int)(difftime(time(NULL), card->down_time))*ms;
  2983. val_card[JSON_KEY_WORK_TIME] = t;
  2984. val_cards.append(val_card[JSON_KEY_WORK_TIME]);
  2985. }else{
  2986. val_card[JSON_KEY_REC_TIME] = 0;
  2987. val_cards.append(val_card[JSON_KEY_REC_TIME]);
  2988. //工作时长
  2989. //t = (int)(difftime(time(NULL), card->down_time));
  2990. val_card[JSON_KEY_WORK_TIME] = 0;
  2991. val_cards.append(val_card[JSON_KEY_WORK_TIME]);
  2992. }
  2993. //地图编号
  2994. val_card[JSON_KEY_MAP_ID] = card->map_id;
  2995. val_cards.append(val_card[JSON_KEY_MAP_ID]);
  2996. //区域编号
  2997. val_card[JSON_KEY_AREA_ID] = card->area_id;
  2998. val_cards.append(val_card[JSON_KEY_AREA_ID]);
  2999. //部门编号
  3000. val_card[JSON_KEY_DEPT_ID] = card->dept_id;
  3001. val_cards.append(val_card[JSON_KEY_DEPT_ID]);
  3002. if(card->pos_state == DT_DOWN){
  3003. card->get_state_text();
  3004. //状态
  3005. val_card[JSON_KEY_STATE] = card->state;
  3006. val_cards.append(val_card[JSON_KEY_STATE]);
  3007. //运行状态
  3008. val_card[JSON_KEY_STATE_MOVING] = card->state_moving;
  3009. val_cards.append(val_card[JSON_KEY_STATE_MOVING]);
  3010. //业务状态
  3011. val_card[JSON_KEY_STATE_BIZ] = card->state_biz;
  3012. val_cards.append(val_card[JSON_KEY_STATE_BIZ]);
  3013. //速度
  3014. val_card[JSON_KEY_SPEED] = CFunctions::round(card->v,2);
  3015. val_cards.append(val_card[JSON_KEY_SPEED]);
  3016. }else{
  3017. //状态
  3018. val_card[JSON_KEY_STATE] = 0;
  3019. val_cards.append(val_card[JSON_KEY_STATE]);
  3020. //运行状态
  3021. val_card[JSON_KEY_STATE_MOVING] = 0;
  3022. val_cards.append(val_card[JSON_KEY_STATE_MOVING]);
  3023. //业务状态
  3024. val_card[JSON_KEY_STATE_BIZ] = 0;
  3025. val_cards.append(val_card[JSON_KEY_STATE_BIZ]);
  3026. //速度
  3027. val_card[JSON_KEY_SPEED] = 0;
  3028. val_cards.append(val_card[JSON_KEY_SPEED]);
  3029. }
  3030. root[JSON_ROOT_KEY_CMD] = (DT_DOWN == card->pos_state)? JSON_CMD_VALUE_DOWN_MINE : JSON_CMD_VALUE_UP_MINE;
  3031. root[JSON_ROOT_KEY_DATA].append(val_cards);
  3032. return root.toFastString();
  3033. }
  3034. std::string CYAServerDlg::get_json_position()
  3035. {
  3036. Json::Value root;
  3037. int cnt = 0;
  3038. MapInfoMap::iterator it_map = mp_map_list.begin();
  3039. for(; it_map != mp_map_list.end(); ++it_map){
  3040. CardMap::iterator it = mp_card_list_all.begin();
  3041. for(; it != mp_card_list_all.end(); ++it){
  3042. /*if(it->second->pos_state != DT_DOWN){
  3043. continue;
  3044. }*/
  3045. if(it->second->issent) {
  3046. continue;
  3047. }
  3048. if(it->second->map_id != it_map->second->map_id){
  3049. continue;
  3050. }
  3051. if(!it->second->isdealed){
  3052. continue;
  3053. }
  3054. if (!it->second->isoutput)
  3055. {
  3056. continue;
  3057. }
  3058. if(_isnan(it->second->x) || _isnan(it->second->y) || _isnan(it->second->v)){
  3059. continue;
  3060. }
  3061. Json::Value pos_cards;
  3062. Json::Value pos_card;
  3063. it->second->isdealed = false;
  3064. it->second->issent = true;
  3065. it->second->isoutput = false;
  3066. //卡号
  3067. pos_card[JSON_KEY_CARD_ID] = it->second->card_id;
  3068. pos_cards.append(pos_card[JSON_KEY_CARD_ID]);
  3069. //x,y坐标
  3070. switch(it->second->m_nOutputPosState){
  3071. case 0:
  3072. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2);
  3073. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3074. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2);
  3075. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);
  3076. break;
  3077. case 1:
  3078. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->left_x, 2);
  3079. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3080. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->left_y, 2);
  3081. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);
  3082. break;
  3083. case 2:
  3084. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->right_x, 2);
  3085. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3086. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->right_y, 2);
  3087. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);
  3088. break;
  3089. default:
  3090. break;
  3091. }
  3092. /*pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2);
  3093. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3094. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2);
  3095. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);*/
  3096. int ms = 1000; //转为ms
  3097. //入井时间戳
  3098. double t = *((int64_t*)&it->second->down_time)*ms;
  3099. pos_card[JSON_KEY_DOWN_TIME] = t;
  3100. pos_cards.append(pos_card[JSON_KEY_DOWN_TIME]);
  3101. //进入区域时间戳
  3102. t = *((int64_t*)&it->second->enter_area_time)*ms;
  3103. pos_card[JSON_KEY_ENTER_AREA_TIME] = t;
  3104. pos_cards.append(pos_card[JSON_KEY_ENTER_AREA_TIME]);
  3105. //最后接收时间戳
  3106. t = *((int64_t*)&it->second->rec_time)*ms;
  3107. pos_card[JSON_KEY_REC_TIME] = t;
  3108. pos_cards.append(pos_card[JSON_KEY_REC_TIME]);
  3109. //工作时长
  3110. t = (int)difftime(time(NULL), it->second->down_time)*ms;
  3111. pos_card[JSON_KEY_WORK_TIME] = t;
  3112. pos_cards.append(pos_card[JSON_KEY_WORK_TIME]);
  3113. //地图编号
  3114. pos_card[JSON_KEY_MAP_ID] = it->second->map_id;
  3115. pos_cards.append(pos_card[JSON_KEY_MAP_ID]);
  3116. //区域编号
  3117. pos_card[JSON_KEY_AREA_ID] = it->second->area_id;
  3118. pos_cards.append(pos_card[JSON_KEY_AREA_ID]);
  3119. //部门编号
  3120. pos_card[JSON_KEY_DEPT_ID] = it->second->dept_id;
  3121. pos_cards.append(pos_card[JSON_KEY_DEPT_ID]);
  3122. it->second->get_state_text();
  3123. //状态
  3124. pos_card[JSON_KEY_STATE] = it->second->state;
  3125. pos_cards.append(pos_card[JSON_KEY_STATE]);
  3126. //运行状态
  3127. pos_card[JSON_KEY_STATE_MOVING] = it->second->state_moving;
  3128. pos_cards.append(pos_card[JSON_KEY_STATE_MOVING]);
  3129. //业务状态
  3130. pos_card[JSON_KEY_STATE_BIZ] = it->second->state_biz;
  3131. pos_cards.append(pos_card[JSON_KEY_STATE_BIZ]);
  3132. //速度
  3133. pos_card[JSON_KEY_SPEED] = CFunctions::round(it->second->v,2);
  3134. pos_cards.append(pos_card[JSON_KEY_SPEED]);
  3135. if(!pos_cards.isNull()){
  3136. root[JSON_ROOT_KEY_DATA].append(pos_cards);
  3137. cnt++;
  3138. }
  3139. }
  3140. }
  3141. std::string ret = "";
  3142. if(cnt > 0){
  3143. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP;
  3144. ret = root.toFastString().c_str();
  3145. }
  3146. return ret;
  3147. }
  3148. std::string CYAServerDlg::get_json_position_all()
  3149. {
  3150. Json::Value root;
  3151. int cnt = 0;
  3152. MapInfoMap::iterator it_map = mp_map_list.begin();
  3153. for(; it_map != mp_map_list.end(); ++it_map){
  3154. CardMap::iterator it = mp_card_list_all.begin();
  3155. for(; it != mp_card_list_all.end(); ++it){
  3156. if(it->second->map_id != it_map->second->map_id){
  3157. continue;
  3158. }
  3159. if(_isnan(it->second->x) || _isnan(it->second->y) || _isnan(it->second->v)){
  3160. continue;
  3161. }
  3162. it->second->issent = true;
  3163. Json::Value pos_cards;
  3164. Json::Value pos_card;
  3165. //卡号
  3166. pos_card[JSON_KEY_CARD_ID] = it->second->card_id;
  3167. pos_cards.append(pos_card[JSON_KEY_CARD_ID]);
  3168. //x,y坐标
  3169. switch(it->second->m_nOutputPosState){
  3170. case 0:
  3171. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2);
  3172. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3173. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2);
  3174. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);
  3175. break;
  3176. case 1:
  3177. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->left_x, 2);
  3178. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3179. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->left_y, 2);
  3180. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);
  3181. break;
  3182. case 2:
  3183. pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->right_x, 2);
  3184. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3185. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->right_y, 2);
  3186. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);
  3187. break;
  3188. default:
  3189. break;
  3190. }
  3191. /*pos_card[JSON_KEY_CORDINATE_X] = CFunctions::round(it->second->x, 2);
  3192. pos_cards.append(pos_card[JSON_KEY_CORDINATE_X]);
  3193. pos_card[JSON_KEY_CORDINATE_Y] = CFunctions::round(it->second->y, 2);
  3194. pos_cards.append(pos_card[JSON_KEY_CORDINATE_Y]);*/
  3195. int ms = 1000; //转为ms
  3196. //入井时间戳
  3197. double t = *((int64_t*)&it->second->down_time)*ms;
  3198. pos_card[JSON_KEY_DOWN_TIME] = t;
  3199. pos_cards.append(pos_card[JSON_KEY_DOWN_TIME]);
  3200. //进入区域时间戳
  3201. t = *((int64_t*)&it->second->enter_area_time)*ms;
  3202. pos_card[JSON_KEY_ENTER_AREA_TIME] = t;
  3203. pos_cards.append(pos_card[JSON_KEY_ENTER_AREA_TIME]);
  3204. //最后接收时间戳
  3205. t = *((int64_t*)&it->second->rec_time)*ms;
  3206. pos_card[JSON_KEY_REC_TIME] = t;
  3207. pos_cards.append(pos_card[JSON_KEY_REC_TIME]);
  3208. //工作时长
  3209. t = (int)difftime(time(NULL), it->second->down_time)*ms;
  3210. pos_card[JSON_KEY_WORK_TIME] = t;
  3211. pos_cards.append(pos_card[JSON_KEY_WORK_TIME]);
  3212. //地图编号
  3213. pos_card[JSON_KEY_MAP_ID] = it->second->map_id;
  3214. pos_cards.append(pos_card[JSON_KEY_MAP_ID]);
  3215. //区域编号
  3216. pos_card[JSON_KEY_AREA_ID] = it->second->area_id;
  3217. pos_cards.append(pos_card[JSON_KEY_AREA_ID]);
  3218. //部门编号
  3219. pos_card[JSON_KEY_DEPT_ID] = it->second->dept_id;
  3220. pos_cards.append(pos_card[JSON_KEY_DEPT_ID]);
  3221. it->second->get_state_text();
  3222. //状态
  3223. pos_card[JSON_KEY_STATE] = it->second->state;
  3224. pos_cards.append(pos_card[JSON_KEY_STATE]);
  3225. //运行状态
  3226. pos_card[JSON_KEY_STATE_MOVING] = it->second->state_moving;
  3227. pos_cards.append(pos_card[JSON_KEY_STATE_MOVING]);
  3228. //业务状态
  3229. pos_card[JSON_KEY_STATE_BIZ] = it->second->state_biz;
  3230. pos_cards.append(pos_card[JSON_KEY_STATE_BIZ]);
  3231. //速度
  3232. pos_card[JSON_KEY_SPEED] = CFunctions::round(it->second->v,2);
  3233. pos_cards.append(pos_card[JSON_KEY_SPEED]);
  3234. if(!pos_cards.isNull()){
  3235. root[JSON_ROOT_KEY_DATA].append(pos_cards);
  3236. cnt++;
  3237. }
  3238. }
  3239. }
  3240. std::string ret = "";
  3241. if(cnt > 0){
  3242. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP;
  3243. ret = root.toFastString().c_str();
  3244. }
  3245. return ret;
  3246. }
  3247. std::string CYAServerDlg::get_json_login()
  3248. {
  3249. Json::Value root;
  3250. Json::Value data;
  3251. data[JSON_KEY_USERNAME] = JSON_VALUE_USERNAME;
  3252. data[JSON_KEY_PASSWORD] = JSON_VALUE_PASSWORD;
  3253. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_LOGIN;
  3254. root[JSON_ROOT_KEY_DATA] = data;
  3255. return root.toFastString();
  3256. }
  3257. std::string CYAServerDlg::get_json_logout()
  3258. {
  3259. Json::Value root;
  3260. Json::Value data;
  3261. //data[JSON_KEY_USERNAME] = JSON_VALUE_USERNAME;
  3262. data["name"] = JSON_VALUE_USERNAME;
  3263. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_LOGOUT;
  3264. //root[JSON_ROOT_KEY_DATA] = data;
  3265. root["user"] = data;
  3266. return root.toFastString();
  3267. }
  3268. void CYAServerDlg::send_json_data(string cmd, string data, bool is_login /* = false*/)
  3269. {
  3270. USES_CONVERSION;
  3271. CC2UTF8 conv = (char*)data.c_str();
  3272. string utf8_data = conv.c_str();
  3273. CString strlog;
  3274. if(is_login){
  3275. if(is_websocket_ok){
  3276. _io->socket()->emit(cmd, utf8_data);
  3277. is_websocket_login = true;
  3278. strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), _T("登录数据"));
  3279. show_log(strlog);
  3280. }
  3281. }else if(is_websocket_login){
  3282. strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), _T("常规数据"));
  3283. _io->socket()->emit(cmd, utf8_data);
  3284. if(m_log_send_package){
  3285. wchar_t* p_data = CFunctions::c2wc(data.c_str());
  3286. writeErrorLog(L"JSON_S", p_data/*CFunctions::c2wc(data.c_str())*/,false);
  3287. if(p_data){
  3288. free(p_data);
  3289. p_data = NULL;
  3290. }
  3291. }
  3292. }
  3293. //strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), CFunctions::c2wc(cmd.c_str()));
  3294. //show_log(strlog);
  3295. }
  3296. // 处理分站状态
  3297. void CYAServerDlg::deal_readers()
  3298. {
  3299. ReaderMap::iterator it = mp_reader_list.begin();
  3300. for(; it != mp_reader_list.end(); ++ it){
  3301. int ndiff = (int)difftime(time(NULL), it->second->rec_time);
  3302. if(STATUS_DEVICE_ERROR == it->second->state){ // 异常
  3303. if(ndiff < READER_TIMEOUT){ // 恢复正常
  3304. INT64 ev_id = it->second->m_event_list[ET_READER_ERROR];
  3305. if(ev_id > 0){
  3306. EventMap::iterator it_ev = mp_event_list->find(ev_id);
  3307. if(it_ev != mp_event_list->end()){
  3308. it_ev->second->status = ES_END;
  3309. it_ev->second->cur_time = time_t(NULL);
  3310. it_ev->second->cur_value = ndiff;
  3311. it_ev->second->is_sent = false;
  3312. store_data_event(it_ev->second);
  3313. add_event(it_ev->second);
  3314. }
  3315. }
  3316. it->second->m_event_list[ET_READER_ERROR] = 0;
  3317. //store_data_reader(it->second, ALARM_READER_LOST_END);
  3318. it->second->state = STATUS_DEVICE_NORMAL;
  3319. }
  3320. }else{
  3321. if(ndiff >= READER_TIMEOUT){ //异常
  3322. it->second->state = STATUS_DEVICE_ERROR;
  3323. it->second->lost_time = time(NULL);
  3324. //store_data_reader(it->second, ALARM_READER_LOST_START);
  3325. INT64 ev_id = CFunctions::GetMicroSecond();
  3326. std::shared_ptr<YaEvent> ev = std::make_shared<YaEvent>(ev_id);
  3327. ev->status = ES_START;
  3328. ev->ev_type = ET_READER_ERROR;
  3329. ev->obj_type = OT_DEVICE_READER;
  3330. ev->obj_id = it->second->reader_id;
  3331. ev->cur_time = time_t(NULL);
  3332. ev->map_id = it->second->map_id;
  3333. ev->area_id = it->second->area_id;
  3334. ev->x = it->second->reader_x;
  3335. ev->y = it->second->reader_y;
  3336. ev->limit_value = READER_TIMEOUT;
  3337. ev->cur_value = ndiff;
  3338. ev->is_sent = false;
  3339. it->second->m_event_list[ET_READER_ERROR] = ev_id;
  3340. store_data_event(ev);
  3341. add_event(ev);
  3342. }
  3343. }
  3344. }
  3345. }
  3346. /*
  3347. * 处理区域内业务逻辑:包含区域人员超员,人员超时,车辆超员,车辆超时,车辆超速等
  3348. *
  3349. * param
  3350. * 无
  3351. *
  3352. * return
  3353. * 无
  3354. *
  3355. */
  3356. void CYAServerDlg::deal_areas()
  3357. {
  3358. // 区域人数,区域超员数,区域超时数
  3359. int count_person, count_vehicle, count_total, count_over_time_person, count_over_time_vehicle;
  3360. int over_time_vehicle, over_time_person, over_time;
  3361. bool is_true = false;
  3362. time_t current_time(time(NULL));
  3363. AreaMap::iterator it_Area = mp_area_list.begin();
  3364. for(; it_Area != mp_area_list.end(); ++it_Area){
  3365. count_person = count_vehicle = count_total = count_over_time_vehicle = count_over_time_person = 0;
  3366. over_time_person = it_Area->second->over_time_person * 60; // 转为秒
  3367. over_time_vehicle = it_Area->second->over_time_vehicle * 60; // 转为秒
  3368. over_time = over_time_person;
  3369. // 遍历卡,计数
  3370. CardMap::iterator it_card_person = it_Area->second->area_card_list_person->begin();
  3371. for(; it_card_person != it_Area->second->area_card_list_person->end(); ++it_card_person){
  3372. // 计数
  3373. count_total++;
  3374. count_person++;
  3375. // 超时
  3376. is_true = difftime(current_time, it_card_person->second->enter_area_time) > over_time;
  3377. if(is_true){
  3378. if(!it_card_person->second->is_area_over_time){
  3379. it_card_person->second->is_area_over_time = true;
  3380. it_card_person->second->time_area_over_time = current_time;
  3381. //store_data_card(it_card_person->second, ALARM_CARD_OVER_TIME_AREA_START);
  3382. deal_alarm_card(it_card_person->second, mp_card_list_area_over_time_person, is_true, AF_CARD_AREA_OVER_TIME);
  3383. }
  3384. over_time_person++;
  3385. }else if(it_card_person->second->is_area_over_time){ // 理论上不会走这条分支,应该走cards_leave_area()
  3386. it_card_person->second->is_area_over_time = false;
  3387. deal_alarm_card(it_card_person->second, mp_card_list_area_over_time_person, is_true, AF_CARD_AREA_OVER_TIME);
  3388. }
  3389. }
  3390. over_time = over_time_vehicle;
  3391. CardMap::iterator it_card_vehicle = it_Area->second->area_card_list_vehicle->begin();
  3392. for(;it_card_vehicle != it_Area->second->area_card_list_vehicle->end(); ++it_card_vehicle){
  3393. // 计数
  3394. count_total++;
  3395. // 区域超速,实现
  3396. if(it_card_vehicle->second->v > it_Area->second->over_speed_vehicle){
  3397. is_true = true;
  3398. it_card_vehicle->second->is_area_over_speed = true;
  3399. it_card_vehicle->second->time_over_speed = current_time;
  3400. //store_data_card(it_card_vehicle->second,ALARM_CARD_OVER_SPEED_AREA_START);
  3401. //deal_alarm_card(it_card_vehicle->second,it_Area->second->area_card_list_vehicle,is_true,AF_CARD_OVER_SPEED);
  3402. }
  3403. count_vehicle++;
  3404. // 超时
  3405. if(difftime(current_time, it_card_vehicle->second->enter_area_time) > over_time){
  3406. is_true = true;
  3407. if(!it_card_vehicle->second->is_area_over_time){
  3408. it_card_vehicle->second->is_area_over_time = true;
  3409. it_card_vehicle->second->time_area_over_time = current_time;
  3410. //store_data_card(it_card_vehicle->second, ALARM_CARD_OVER_TIME_AREA_START);
  3411. //deal_alarm_card(it_card_vehicle->second, mp_card_list_area_over_time_vehicle, is_true, AF_CARD_AREA_OVER_TIME);
  3412. }
  3413. over_time_vehicle++;
  3414. }else if(it_card_vehicle->second->is_area_over_time){ // 理论上不会走这条分支,应该走cards_leave_area()
  3415. is_true = false;
  3416. it_card_vehicle->second->is_area_over_time = false;
  3417. deal_alarm_card(it_card_vehicle->second, mp_card_list_area_over_time_vehicle, is_true, AF_CARD_AREA_OVER_TIME);
  3418. }
  3419. }
  3420. it_Area->second->count_person = count_person;
  3421. it_Area->second->count_vehicle = count_vehicle;
  3422. it_Area->second->count_area_over_time_person = count_over_time_person;
  3423. it_Area->second->count_area_over_time_vehicle = count_over_time_vehicle;
  3424. // 区域禁入 人员
  3425. //if(it_Area->second->over_count_person == 0){
  3426. if(it_Area->second->area_type_id == 3){
  3427. if(count_person > 0){
  3428. if(!it_Area->second->is_area_forbidden_person){
  3429. it_Area->second->is_area_forbidden_person = true;
  3430. it_Area->second->count_area_forbidden_person = count_person;
  3431. it_Area->second->time_forbidden_person = current_time;
  3432. store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_FORBIDDEN_PERSON_START);
  3433. deal_alarm_area(it_Area->second, mp_area_forbidden_person, true, AF_AREA_FORBIDDEN);
  3434. }
  3435. }else{
  3436. if(it_Area->second->is_area_forbidden_person){
  3437. it_Area->second->is_area_forbidden_person = false; // 结束报警
  3438. store_data_area(it_Area->second, current_time, it_Area->second->time_forbidden_person, ALARM_AREA_FORBIDDEN_PERSON_END);
  3439. deal_alarm_area(it_Area->second, mp_area_forbidden_person, false, AF_AREA_FORBIDDEN);
  3440. }
  3441. }
  3442. } else {
  3443. if(count_person > it_Area->second->over_count_person ){ // 区域人员超员
  3444. if(!it_Area->second->is_area_over_count_person){
  3445. it_Area->second->is_area_over_count_person = true;
  3446. it_Area->second->count_area_over_count_person = count_person - it_Area->second->over_count_person;
  3447. it_Area->second->time_over_count_person = current_time;
  3448. //store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_OVER_COUNT_PERSON_START);
  3449. INT64 ev_id = CFunctions::GetMicroSecond();
  3450. std::shared_ptr<YaEvent> ev = std::make_shared<YaEvent>(ev_id);
  3451. ev->status = ES_START;
  3452. ev->ev_type = ET_AREA_OVER_COUNT_PERSON;
  3453. ev->obj_type = OT_AREA;
  3454. ev->obj_id = it_Area->second->area_id;
  3455. ev->cur_time = time_t(NULL);
  3456. ev->map_id = it_Area->second->map_id;
  3457. ev->area_id = it_Area->second->area_id;
  3458. ev->x = 0;
  3459. ev->y = 0;
  3460. ev->limit_value = it_Area->second->over_count_person;
  3461. ev->cur_value = count_person;
  3462. ev->is_sent = false;
  3463. it_Area->second->m_event_list[ET_AREA_OVER_COUNT_PERSON] = ev_id;
  3464. store_data_event(ev);
  3465. add_event(ev);
  3466. deal_alarm_area(it_Area->second, mp_area_over_count_person, true, AF_AREA_OVER_COUNT);
  3467. }
  3468. }else{
  3469. if(it_Area->second->is_area_over_count_person){ // 结束超员
  3470. it_Area->second->is_area_over_count_person = false;
  3471. //store_data_area(it_Area->second, current_time, it_Area->second->time_over_count_person, ALARM_AREA_OVER_COUNT_PERSON_END);
  3472. INT64 ev_id = it_Area->second->m_event_list[ET_AREA_OVER_COUNT_PERSON];
  3473. if(ev_id > 0){
  3474. EventMap::iterator it_ev = mp_event_list->find(ev_id);
  3475. if(it_ev != mp_event_list->end()){
  3476. it_ev->second->status = ES_END;
  3477. it_ev->second->cur_time = time_t(NULL);
  3478. it_ev->second->cur_value = count_person;
  3479. it_ev->second->is_sent = false;
  3480. store_data_event(it_ev->second);
  3481. add_event(it_ev->second);
  3482. }
  3483. }
  3484. it_Area->second->m_event_list[ET_AREA_OVER_COUNT_PERSON] = 0;
  3485. deal_alarm_area(it_Area->second, mp_area_over_count_person, false, AF_AREA_OVER_COUNT);
  3486. }
  3487. }
  3488. // 区域人员超时
  3489. if(count_over_time_person > 0){
  3490. if(!it_Area->second->is_area_over_time_person){
  3491. it_Area->second->is_area_over_time_person = true;
  3492. it_Area->second->time_over_time_person = current_time;
  3493. deal_alarm_area(it_Area->second, mp_area_over_time_person, true, AF_AREA_OVER_TIME);
  3494. }
  3495. }else{
  3496. if(it_Area->second->is_area_over_time_person){ // 结束
  3497. it_Area->second->is_area_over_time_person = false;
  3498. deal_alarm_area(it_Area->second, mp_area_over_time_person, false, AF_AREA_OVER_TIME);
  3499. }
  3500. }
  3501. }
  3502. // 区域禁入 车辆
  3503. //if(it_Area->second->over_count_vehicle == 0){
  3504. if(it_Area->second->area_type_id == 3){
  3505. if(count_vehicle > 0){
  3506. if(!it_Area->second->is_area_forbidden_vehicle){
  3507. it_Area->second->is_area_forbidden_vehicle = true;
  3508. it_Area->second->count_area_forbidden_vehicle = count_vehicle;
  3509. it_Area->second->time_forbidden_vehicle = current_time;
  3510. store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_FORBIDDEN_VEHICLE_START);
  3511. deal_alarm_area(it_Area->second, mp_area_forbidden_vehicle, true, AF_AREA_FORBIDDEN);
  3512. }
  3513. }else{
  3514. if(it_Area->second->is_area_forbidden_vehicle){
  3515. it_Area->second->is_area_forbidden_vehicle = false; // 结束报警
  3516. store_data_area(it_Area->second, current_time, it_Area->second->time_forbidden_vehicle, ALARM_AREA_FORBIDDEN_VEHICLE_END);
  3517. deal_alarm_area(it_Area->second, mp_area_forbidden_vehicle, false, AF_AREA_FORBIDDEN);
  3518. }
  3519. }
  3520. }else {
  3521. if(count_vehicle > it_Area->second->over_count_vehicle){ // 区域车辆超员
  3522. if(!it_Area->second->is_area_over_count_vehicle){
  3523. it_Area->second->is_area_over_count_vehicle = true;
  3524. it_Area->second->count_area_over_count_vehicle = count_vehicle - it_Area->second->over_count_vehicle;
  3525. it_Area->second->time_over_count_vehicle = current_time;
  3526. INT64 ev_id = CFunctions::GetMicroSecond();
  3527. std::shared_ptr<YaEvent> ev = std::make_shared<YaEvent>(ev_id);
  3528. ev->status = ES_START;
  3529. ev->ev_type = ET_AREA_OVER_COUNT_VEHICLE;
  3530. ev->obj_type = OT_AREA;
  3531. ev->obj_id = it_Area->second->area_id;
  3532. ev->cur_time = time_t(NULL);
  3533. ev->map_id = it_Area->second->map_id;
  3534. ev->area_id = it_Area->second->area_id;
  3535. ev->x = 0;
  3536. ev->y = 0;
  3537. ev->limit_value = it_Area->second->over_count_person;
  3538. ev->cur_value = count_vehicle;
  3539. ev->is_sent = false;
  3540. it_Area->second->m_event_list[ET_AREA_OVER_COUNT_VEHICLE] = ev_id;
  3541. store_data_event(ev);
  3542. add_event(ev);
  3543. //store_data_area(it_Area->second, current_time, current_time, ALARM_AREA_OVER_COUNT_VEHICLE_START);
  3544. deal_alarm_area(it_Area->second, mp_area_over_count_vehicle, true, AF_AREA_OVER_COUNT);
  3545. }
  3546. }else{
  3547. it_Area->second->is_area_over_count_vehicle = false; // 结束
  3548. //store_data_area(it_Area->second, current_time, it_Area->second->time_over_count_vehicle, ALARM_AREA_OVER_COUNT_VEHICLE_END);
  3549. INT64 ev_id = it_Area->second->m_event_list[ET_AREA_OVER_COUNT_VEHICLE];
  3550. if(ev_id > 0){
  3551. EventMap::iterator it_ev = mp_event_list->find(ev_id);
  3552. if(it_ev != mp_event_list->end()){
  3553. it_ev->second->status = ES_END;
  3554. it_ev->second->cur_time = time_t(NULL);
  3555. it_ev->second->cur_value = count_vehicle;
  3556. it_ev->second->is_sent = false;
  3557. store_data_event(it_ev->second);
  3558. add_event(it_ev->second);
  3559. }
  3560. }
  3561. it_Area->second->m_event_list[ET_AREA_OVER_COUNT_VEHICLE] = 0;
  3562. deal_alarm_area(it_Area->second, mp_area_over_count_vehicle, false, AF_AREA_OVER_COUNT);
  3563. }
  3564. // 区域车辆超时
  3565. if(count_over_time_vehicle > 0){
  3566. if(!it_Area->second->is_area_over_time_vehicle){
  3567. it_Area->second->is_area_over_time_vehicle = true;
  3568. it_Area->second->time_over_time_vehicle = current_time;
  3569. deal_alarm_area(it_Area->second, mp_area_over_time_vehicle, true, AF_AREA_OVER_TIME);
  3570. }
  3571. }else{
  3572. if(it_Area->second->is_area_over_time_vehicle){ // 结束
  3573. it_Area->second->is_area_over_time_vehicle = false;
  3574. deal_alarm_area(it_Area->second, mp_area_over_time_vehicle, false, AF_AREA_OVER_TIME);
  3575. // 写入数据库
  3576. }
  3577. }
  3578. }
  3579. }
  3580. }
  3581. void CYAServerDlg::card_enter_mine(std::shared_ptr<Card> card /*Card* card*/)
  3582. {
  3583. if(!card->is_pos_state_changed(TEST_CONFIRM_COUNT)){ // 位置没有变化
  3584. if(DT_DOWN == card->pos_state){
  3585. if(CT_PERSON == card->card_type){
  3586. if(difftime(time(NULL), card->get_working_time()) > sls_setting.over_time_person){
  3587. store_data_card(card, ALARM_CARD_OVER_TIME_START);
  3588. //deal_alarm_card(card, &mp_card_list_over_time_person, true, AF_CARD_OVER_TIME);
  3589. deal_alarm_card(card, mp_card_list_over_time_person, true, AF_CARD_OVER_TIME);
  3590. }
  3591. }else if(CT_VEHICLE == card->card_type){
  3592. if(difftime(time(NULL), card->get_working_time()) > sls_setting.over_time_vehicle){
  3593. store_data_card(card, ALARM_CARD_OVER_TIME_START);
  3594. //deal_alarm_card(card, &mp_card_list_over_time_vehicle, true, AF_CARD_OVER_TIME);
  3595. deal_alarm_card(card, mp_card_list_over_time_vehicle, true, AF_CARD_OVER_TIME);
  3596. }
  3597. if(card->get_speed() > sls_setting.over_speed){
  3598. store_data_card(card, ALARM_CARD_OVER_SPEED_START);
  3599. //deal_alarm_card(card, &mp_card_list_over_speed_vehicle, true, AF_CARD_OVER_SPEED);
  3600. deal_alarm_card(card, mp_card_list_over_speed_vehicle, true, AF_CARD_OVER_SPEED);
  3601. }
  3602. }
  3603. }
  3604. }else{
  3605. if(DT_UP == card->pos_state){ // 升井
  3606. // 升井,补全离开区域时间
  3607. store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  3608. if(card->occupation == "安检员"){
  3609. delete_patrol_info(card->card_id);
  3610. }
  3611. card_up_mine(card);
  3612. }else if(DT_DOWN == card->pos_state){ // 入井
  3613. card_down_mine(card);
  3614. if(card->occupation == "安检员"){
  3615. init_patrol_info(card->card_id);
  3616. }
  3617. }
  3618. send_json_data(JSON_CMD_VALUE_PUSH, get_json_down_and_up(card));
  3619. }
  3620. }
  3621. void CYAServerDlg::card_enter_park(std::shared_ptr<Card> card /*Card* card*/ )
  3622. {
  3623. if(card->is_pos_state_pack_changed(TEST_CONFIRM_COUNT)){ // 位置没有变化
  3624. if(AAT_ENTER == card->pos_state_park){ //
  3625. card->up_time = CFunctions::systime_to_timet(card->deal_time);
  3626. store_data_card(card, RPT_ATTEND_UP);
  3627. }else if(AAT_LEAVE == card->pos_state_park){ // 入井
  3628. card->down_time = CFunctions::systime_to_timet(card->deal_time);
  3629. store_data_card(card, RPT_ATTEND_DOWN);
  3630. }
  3631. }
  3632. }
  3633. void CYAServerDlg::card_enter_map(std::shared_ptr<Card> card /*Card* card*/ )
  3634. {
  3635. if(card->map_id == card->map_id_old) return ;
  3636. // 离开原地图,进入新地图
  3637. MapInfoMap::iterator it_map_old = mp_map_list.find(card->map_id_old);
  3638. if(it_map_old != mp_map_list.end()){
  3639. if(CT_PERSON == card->card_type){
  3640. CardMap::iterator it_card = it_map_old->second->map_card_list_person.find(card->card_id);
  3641. if(it_card != it_map_old->second->map_card_list_person.end()){
  3642. it_map_old->second->map_card_list_person.erase(it_card);
  3643. }
  3644. }else if(CT_VEHICLE == card->card_type){
  3645. CardMap::iterator it_card = it_map_old->second->map_card_list_vehicle.find(card->card_id);
  3646. if(it_card != it_map_old->second->map_card_list_vehicle.end()){
  3647. it_map_old->second->map_card_list_vehicle.erase(it_card);
  3648. }
  3649. }
  3650. }
  3651. card->map_id_old = card->map_id;
  3652. MapInfoMap::iterator it_map = mp_map_list.find(card->map_id);
  3653. if(it_map != mp_map_list.end()){
  3654. card->map_scale = it_map->second->map_scale;
  3655. if(CT_PERSON == card->card_type){
  3656. it_map->second->map_card_list_person.insert(make_pair(card->card_id, card));
  3657. }else if(CT_VEHICLE == card->card_type){
  3658. it_map->second->map_card_list_vehicle.insert(make_pair(card->card_id, card));
  3659. }
  3660. }
  3661. }
  3662. //卡card进入区域
  3663. void CYAServerDlg::card_enter_area(std::shared_ptr<Card> card /* Card* card*/)
  3664. {
  3665. if (card.use_count() == 0)
  3666. {
  3667. //TRACE(_T("use count = 0 \r\n"));
  3668. return;
  3669. }
  3670. if(!card->b_pos_change){
  3671. //如果坐标无变化,不需要进区域判断逻辑
  3672. return;
  3673. }
  3674. _point p1, p2;
  3675. double r, scale;
  3676. bool b_in_area = false;
  3677. p1.x = card->x, p1.y = card->y, p1.z = card->z;
  3678. AreaMap::iterator it_area_cur = mp_area_list.find(card->area_id);
  3679. if(it_area_cur != mp_area_list.end()){ // 在区域中
  3680. if(it_area_cur->second->is_in_polygon(p1)) { // 区域没有变化
  3681. return;
  3682. }
  3683. }
  3684. int old_area_id = card->area_id;
  3685. AreaMap::iterator it_area = mp_area_list.begin();
  3686. for(; it_area != mp_area_list.end(); ++it_area){
  3687. if(card->map_id == it_area->second->map_id){ // 必须在同一地图内
  3688. if(it_area->second->is_in_polygon(p1)){ // 在区域内
  3689. if(it_area->second->area_id == old_area_id){
  3690. return;
  3691. }
  3692. if(it_area_cur != mp_area_list.end()){ // 离开区域
  3693. store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  3694. card_leave_area(card, it_area_cur->second);
  3695. }
  3696. card->area_id = it_area->second->area_id;
  3697. card->enter_area_time = CFunctions::systime_to_timet(card->deal_time);
  3698. card->pos_state = (0 == it_area->second->area_type_id) ? DT_UP :DT_DOWN;
  3699. card->pos_state_park = it_area->second->is_att;
  3700. if(CT_PERSON == card->card_type){
  3701. it_area->second->area_card_list_person->insert(make_pair(card->card_id, card));
  3702. if(it_area->second->area_type_id == 3){
  3703. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  3704. deal_alarm_card(card, mp_card_list_forbidden_person, true, AF_CARD_AREA_FORBIDDEN);
  3705. }
  3706. }else if(CT_VEHICLE == card->card_type){
  3707. it_area->second->area_card_list_vehicle->insert(make_pair(card->card_id, card));
  3708. if(it_area->second->area_type_id == 3){
  3709. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  3710. deal_alarm_card(card, mp_card_list_forbidden_vehicle, true, AF_CARD_AREA_FORBIDDEN);
  3711. }
  3712. }
  3713. b_in_area = true;
  3714. break;
  3715. }
  3716. }
  3717. }
  3718. if(!b_in_area){
  3719. // 找不到区域,使用分站所属区域
  3720. //从区域列表中查找卡所属分站的区域ID
  3721. AreaMap::iterator it_area_reader = mp_area_list.find(card->p_reader->area_id);
  3722. if(it_area_reader == mp_area_list.end()){
  3723. return;
  3724. }
  3725. if(card->area_id == it_area_reader->second->area_id){
  3726. return;
  3727. }
  3728. if(it_area_cur != mp_area_list.end()){
  3729. store_data_card(card, HIS_AREA_LOCATION_LEAVE);
  3730. card_leave_area(card, it_area_cur->second);
  3731. }
  3732. card->area_id = it_area_reader->second->area_id;
  3733. card->enter_area_time = CFunctions::systime_to_timet(card->deal_time);
  3734. card->pos_state = (0 == it_area_reader->second->area_type_id) ? DT_UP :DT_DOWN;
  3735. card->pos_state_park = it_area_reader->second->is_att;
  3736. if(CT_PERSON == card->card_type){
  3737. it_area_reader->second->area_card_list_person->insert(make_pair(card->card_id, card));
  3738. if(it_area_reader->second->area_type_id == 3){
  3739. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  3740. deal_alarm_card(card, mp_card_list_forbidden_person, true, AF_CARD_AREA_FORBIDDEN);
  3741. }
  3742. }else if(CT_VEHICLE == card->card_type){
  3743. it_area_reader->second->area_card_list_vehicle->insert(make_pair(card->card_id, card));
  3744. if(it_area_reader->second->area_type_id == 3){
  3745. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_START);
  3746. deal_alarm_card(card, mp_card_list_forbidden_vehicle, true, AF_CARD_AREA_FORBIDDEN);
  3747. }
  3748. }
  3749. }
  3750. TRACE(_T("x: %f, y: %f, lx: %f,ly: %f,area_id: %d \r\n"),card->x,card->y,card->last_x,card->last_y,card->area_id);
  3751. //deal_areas();
  3752. deal_area_over_speed(card);
  3753. // 保存区域信息
  3754. store_data_card(card, HIS_AREA_LOCATION_ENTER);
  3755. // 升入井判断
  3756. card_enter_mine(card);
  3757. if(CT_VEHICLE == card->card_type){
  3758. card_enter_park(card);
  3759. }
  3760. }
  3761. void CYAServerDlg::card_leave_area(std::shared_ptr<Card> card, std::shared_ptr<Area> area /*Card* card, Area* area*/)
  3762. {
  3763. // 从列表中删除
  3764. std::shared_ptr<CardMap> card_map = nullptr;
  3765. std::shared_ptr<CardMap> alarm_card_map = nullptr;
  3766. std::shared_ptr<CardMap> alarm_forbidden_map = nullptr;
  3767. if(CT_PERSON == card->card_type){
  3768. card_map = area->area_card_list_person;
  3769. alarm_card_map = mp_card_list_area_over_time_person;
  3770. alarm_forbidden_map = mp_card_list_forbidden_person;
  3771. }else if(CT_VEHICLE == card->card_type){
  3772. card_map = area->area_card_list_vehicle;
  3773. alarm_card_map = mp_card_list_area_over_time_vehicle;
  3774. alarm_forbidden_map = mp_card_list_forbidden_vehicle;
  3775. }
  3776. CardMap::iterator it_card = card_map->find(card->card_id);
  3777. if(it_card != card_map->end()){
  3778. // 如果区域超时
  3779. if(it_card->second->is_area_over_time){
  3780. it_card->second->is_area_over_time = false;
  3781. store_data_card(card, ALARM_CARD_OVER_TIME_AREA_END);
  3782. deal_alarm_card(card, alarm_card_map, false, AF_CARD_AREA_OVER_TIME);
  3783. }
  3784. store_data_card(card, ALARM_CARD_AREA_FORBIDDEN_END);
  3785. // 先处理,后删除
  3786. deal_alarm_card(card, alarm_forbidden_map, false, AF_CARD_AREA_FORBIDDEN);
  3787. card_map->erase(it_card);
  3788. }
  3789. }
  3790. void CYAServerDlg::reset_map_card()
  3791. {
  3792. MapInfoMap::iterator it_map = mp_map_list.begin();
  3793. for(; it_map != mp_map_list.end(); ++ it_map){
  3794. it_map->second->map_card_list_person.erase(it_map->second->map_card_list_person.begin(), it_map->second->map_card_list_person.end());
  3795. it_map->second->map_card_list_vehicle.erase(it_map->second->map_card_list_vehicle.begin(), it_map->second->map_card_list_vehicle.end());
  3796. }
  3797. }
  3798. bool CYAServerDlg::is_in_rectangle( _point p, double dblleft, double dbltop, double dblright, double dblbottom )
  3799. {
  3800. return (p.x >= dblleft && p.x <= dblright && p.y >= dbltop && p.y <= dblbottom);
  3801. }
  3802. bool CYAServerDlg::is_in_circle( _point p1, _point p2, double r, double scale )
  3803. {
  3804. return sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y)) <= r * scale;
  3805. }
  3806. void CYAServerDlg::package_data()
  3807. {
  3808. string strJson = get_json_position();
  3809. // 定位数据
  3810. if(strJson == ""){
  3811. return ;
  3812. }
  3813. send_json_data(JSON_CMD_VALUE_PUSH, strJson);
  3814. g_last_send_time = ::GetTickCount();
  3815. }
  3816. void CYAServerDlg::package_data_test()
  3817. {
  3818. Json::Value root;
  3819. Json::Value valStaffer;
  3820. Json::Value valStaffers;
  3821. Json::Value valDistance;
  3822. Json::Value valDist;
  3823. Json::Value valReaders;
  3824. Json::Value valReader;
  3825. int nCnt = 0;
  3826. std::string strJson;
  3827. for(int i = 1; i < 4; i++){
  3828. valStaffer["id"] = i;
  3829. valStaffer["x"] = 50 * (m_nCountClick + i);
  3830. valStaffer["y"] = 50 * sin(20.0) * (m_nCountClick + i);
  3831. valStaffers.append(valStaffer);
  3832. nCnt++;
  3833. }
  3834. root["staffer"] = valStaffers;
  3835. root["reader"] = valReaders;
  3836. if(nCnt == 0){
  3837. return;
  3838. }
  3839. strJson = root.toFastString();
  3840. send_json_data(JSON_CMD_VALUE_PUSH, strJson.c_str());
  3841. }
  3842. void CYAServerDlg::formatByteArray( CString &strBuf, BYTE * buf, int nLen )
  3843. {
  3844. CString strBuf1 = _T("");
  3845. for(int i = 0; i < nLen; i++){
  3846. strBuf1.Format(_T("%.2X "),buf[i]);
  3847. strBuf += strBuf1;
  3848. if((i + 1) % 16 == 0){
  3849. strBuf += _T("\n");
  3850. }
  3851. }
  3852. }
  3853. void CYAServerDlg::writeErrorLog( const CString strFile, const CString strErr, bool bTime /*= true*/ )
  3854. {
  3855. LogInfo* err = new LogInfo;
  3856. err->handle = NULL;
  3857. err->useTime = false;
  3858. err->path = NULL;
  3859. err->strLog = NULL;
  3860. err->handle = this;
  3861. err->useTime = bTime;
  3862. err->path = CFunctions::wc2c(strFile);
  3863. err->strLog = CFunctions::wc2c(strErr);
  3864. //QueueUserWorkItem(_write_error_log, (LPVOID)err, WT_EXECUTEDEFAULT);
  3865. send_err_log_message((char *)err);
  3866. }
  3867. BOOL CYAServerDlg::openLogFile(CString strFile)
  3868. {
  3869. TCHAR lpstrCurDir[MAX_PATH] = _T("");
  3870. CString ctemp;
  3871. GetModuleFileName(NULL,lpstrCurDir,MAX_PATH);
  3872. ctemp = lpstrCurDir;
  3873. int index = ctemp.ReverseFind('\\');
  3874. CString strFilePath = ctemp.Left(index+1);
  3875. CString strFileName;
  3876. strFileName.Format(_T("%s_%s.log"), strFile, COleDateTime::GetCurrentTime().Format(_T("%Y%m%d")));
  3877. strFilePath += _T("error\\");
  3878. strFilePath += strFileName;
  3879. if (cfErrorLog == NULL){
  3880. return FALSE;
  3881. }
  3882. BOOL bOpenFile=FALSE;//是否需要重新打开文件
  3883. if(cfErrorLog.m_pStream==NULL){
  3884. bOpenFile=TRUE;
  3885. }else{
  3886. if(cfErrorLog.GetFilePath()!=strFilePath){
  3887. bOpenFile=TRUE;
  3888. cfErrorLog.Close();
  3889. }
  3890. }
  3891. if(bOpenFile){
  3892. return cfErrorLog.Open(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone);
  3893. }else{
  3894. return TRUE;
  3895. }
  3896. }
  3897. BOOL CYAServerDlg::openLogFile(const char* strFile)
  3898. {
  3899. TCHAR lpstrCurDir[MAX_PATH] = _T("");
  3900. CString ctemp;
  3901. GetModuleFileName(NULL,lpstrCurDir,MAX_PATH);
  3902. ctemp = lpstrCurDir;
  3903. int index = ctemp.ReverseFind('\\');
  3904. CString strFilePath = ctemp.Left(index+1);
  3905. CString strFileName;
  3906. //CString strTemp;
  3907. //strTemp.Format(_T("%S"),strFile);
  3908. strFileName.Format(_T("%s_%s.log"), CFunctions::c2wc(strFile), COleDateTime::GetCurrentTime().Format(_T("%Y%m%d")));
  3909. strFilePath += _T("error\\");
  3910. strFilePath += strFileName;
  3911. if (cfErrorLog == NULL){
  3912. return FALSE;
  3913. }
  3914. BOOL bOpenFile=FALSE;//是否需要重新打开文件
  3915. if(cfErrorLog.m_pStream==NULL){
  3916. bOpenFile=TRUE;
  3917. }else{
  3918. if(cfErrorLog.GetFilePath()!=strFilePath){
  3919. bOpenFile=TRUE;
  3920. cfErrorLog.Close();
  3921. }
  3922. }
  3923. if(bOpenFile){
  3924. return cfErrorLog.Open(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone);
  3925. }else{
  3926. return TRUE;
  3927. }
  3928. }
  3929. void CYAServerDlg::OnBnExit()
  3930. {
  3931. stop_and_exit();
  3932. }
  3933. void CYAServerDlg::OnBnSyncTime()
  3934. {
  3935. send_sync_reader();
  3936. }
  3937. CYAServerDlg::~CYAServerDlg()
  3938. {
  3939. ws_close();
  3940. }
  3941. void CYAServerDlg::OnConnected()
  3942. {
  3943. is_websocket_ok = true;
  3944. //Sleep(50); // need delay
  3945. time_ws_connect = ::GetTickCount();
  3946. }
  3947. void CYAServerDlg::OnClosed( client::close_reason const& reason )
  3948. {
  3949. int i = -1;
  3950. if(reason == client::close_reason_drop){
  3951. i = (int) reason;
  3952. }else{
  3953. i = (int) reason;
  3954. }
  3955. is_websocket_login = false;
  3956. is_websocket_ok = false;
  3957. }
  3958. void CYAServerDlg::OnFailed()
  3959. {
  3960. is_websocket_login = false;
  3961. is_websocket_ok = false;
  3962. _io->close();
  3963. }
  3964. void CYAServerDlg::ws_open()
  3965. {
  3966. //m_ws_url="ws://localhost:8086/";
  3967. _io->connect(m_ws_url);
  3968. CString strlog = _T("");
  3969. //strlog.Format(_T("%s: %s"), _T(LOG_CONNECT_WEB_SERVER), CFunctions::c2wc(m_ws_url.c_str()));
  3970. wchar_t* p = CFunctions::c2wc(m_ws_url.c_str());
  3971. strlog.Format(_T("%s: %s"), _T(LOG_CONNECT_WEB_SERVER), p);
  3972. if(p){
  3973. free(p);
  3974. p = NULL;
  3975. }
  3976. show_log(strlog);
  3977. }
  3978. void CYAServerDlg::OnPushMessage()
  3979. {
  3980. string aa = "";
  3981. }
  3982. void CYAServerDlg::store_data_card(std::shared_ptr<Card> card /*Card* card*/, int tag )
  3983. {
  3984. char sql[LENGTH_SQL] = {0};
  3985. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  3986. struct tm local_time, local_time_ex;
  3987. time_t t = time_t(NULL);
  3988. bool b_exec = false;
  3989. switch(tag){
  3990. case TEST_LOCATE_COMPARE:
  3991. case TEST_LOCATE_DATA:
  3992. case HIS_RAW_DATA:
  3993. case HIS_AREA_LOCATION_ENTER:
  3994. case HIS_AREA_LOCATION_LEAVE:
  3995. case ALARM_CARD_LOW_POWER_START:
  3996. case ALARM_CARD_LOW_POWER_END:
  3997. case RPT_ATTEND_DOWN:
  3998. case RPT_ATTEND_UP:
  3999. t = CFunctions::systime_to_timet(card->deal_time);
  4000. localtime_s(&local_time, &t);
  4001. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  4002. break;
  4003. case HIS_LOCATION:
  4004. sprintf_s(_time,
  4005. STR_LEN_TIME,
  4006. "%u-%u-%u %u:%u:%u.%u",
  4007. card->deal_time.wYear,card->deal_time.wMonth,card->deal_time.wDay,
  4008. card->deal_time.wHour + 8,card->deal_time.wMinute,card->deal_time.wSecond,card->deal_time.wMilliseconds);
  4009. break;
  4010. }
  4011. switch(tag){
  4012. case TEST_LOCATE_COMPARE:
  4013. {
  4014. b_exec = true;
  4015. sprintf_s(sql, LENGTH_SQL,
  4016. "INSERT INTO test_locate_compare(x, y, xx, yy, x1, x2, x3, x4, y1, y2, y3, y4, rec_time)\
  4017. VALUES(%.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f, '%s');",
  4018. card->x, card->y, card->xx, card->yy, card->x1, card->x2, card->x3, card->x4,
  4019. card->y1, card->y2, card->y3, card->y4, _time);
  4020. break;
  4021. }
  4022. case TEST_LOCATE_DATA:
  4023. {
  4024. b_exec = true;
  4025. sprintf_s(sql, LENGTH_SQL,
  4026. "INSERT INTO test_locatedata(card_id, reader_id, antenna_id, \
  4027. reader_stamp, card_stamp, locatetime, distance, stamp_type, power_state,\
  4028. accelerate, rec_time, card_x, card_y) \
  4029. VALUES(%s, %d, %d, %d, %d, %lld, %f, %d, %d, %d, '%s', %.4f, %.4f);",
  4030. card->card_id.c_str(), card->reader_id, card->antenna_id, card->p_reader->tick_count, card->time_stamp,
  4031. card->flying_time, card->distance, card->ranging_type, card->power_state, card->accelerate_state,
  4032. _time, card->x, card->y);
  4033. break;
  4034. }
  4035. case HIS_LOCATION:
  4036. {
  4037. if(card->map_id != 0 && card->area_id != 0){
  4038. b_exec = true;
  4039. sprintf_s(sql, LENGTH_SQL,
  4040. "INSERT INTO his_location(card_id, cur_time, x, y, z, map_id, area_id, state) VALUES(%s, '%s', %.3f, %.3f, %.3f, %d, %d, %d);",
  4041. card->card_id.c_str(), _time, card->x, card->y, card->z, card->map_id, card->area_id, card->state);
  4042. }
  4043. break;
  4044. }
  4045. case HIS_RAW_DATA:
  4046. {
  4047. b_exec = true;
  4048. sprintf_s(sql, LENGTH_SQL,
  4049. "INSERT INTO his_raw_data(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \
  4050. fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time ) \
  4051. VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s');",
  4052. card->card_id.c_str(), card->reader_id, card->antenna_id, card->reader_tickcount, card->time_stamp,
  4053. card->flying_time, card->distance, card->ranging_type, card->power_state, card->accelerate_state,
  4054. card->str_his_time.c_str(), card->str_rec_time.c_str());
  4055. break;
  4056. }
  4057. case HIS_AREA_LOCATION_ENTER:
  4058. {
  4059. if(card->map_id != 0 && card->area_id != 0){
  4060. b_exec = true;
  4061. /*sprintf_s(sql, LENGTH_SQL,
  4062. "INSERT INTO his_location_area(card_id, area_id, map_id, enter_time) VALUES(%s, %d, %d, '%s');",
  4063. card->card_id.c_str() , card->area_id, card->map_id, _time);*/
  4064. sprintf_s(sql, LENGTH_SQL,
  4065. "call add_area(%s, %d, %d, '%s','%s');",
  4066. card->card_id.c_str() , card->area_id, card->map_id, _time,_time);
  4067. /*CString str_log = _T("");
  4068. CString str_tmp = _T("");
  4069. str_tmp.Format(_T("%d"),HIS_AREA_LOCATION_ENTER);
  4070. str_log += str_tmp + _T(",");
  4071. str_tmp = sql;
  4072. str_log += str_tmp + _T("\r\n");
  4073. writeErrorLog(_T("SQL_S"),str_log,false);*/
  4074. }
  4075. break;
  4076. }
  4077. case HIS_AREA_LOCATION_LEAVE:
  4078. {
  4079. if(card->map_id != 0 && card->area_id != 0){
  4080. b_exec = true;
  4081. localtime_s(&local_time_ex, &card->enter_area_time);
  4082. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4083. /*sprintf_s(sql, LENGTH_SQL,
  4084. "UPDATE his_location_area SET leave_time = '%s' WHERE card_id = %s AND area_id=%d AND enter_time = '%s';",
  4085. _time, card->card_id.c_str(), card->area_id, _time_ex);*/
  4086. sprintf_s(sql, LENGTH_SQL,
  4087. "call add_area(%s, %d, %d, '%s','%s');",
  4088. card->card_id.c_str() , card->area_id, card->map_id, _time_ex,_time);
  4089. /*CString str_log = _T("");
  4090. CString str_tmp = _T("");
  4091. str_tmp.Format(_T("%d"),HIS_AREA_LOCATION_LEAVE);
  4092. str_log += str_tmp + _T(",");
  4093. str_tmp = sql;
  4094. str_log += str_tmp + _T("\r\n");
  4095. writeErrorLog(_T("SQL_S"),str_log,false);*/
  4096. }
  4097. break;
  4098. }
  4099. case RPT_ATTEND_DOWN:
  4100. {
  4101. if(card->map_id != 0 && card->area_id != 0){
  4102. TRACE(_T("att down \r\n"));
  4103. b_exec = true;
  4104. sprintf_s(sql, LENGTH_SQL,
  4105. "CALL add_att(%s, '%s', '%s');", card->card_id.c_str(), _time, _time);
  4106. CString str_log = _T("");
  4107. CString str_tmp = _T("");
  4108. str_tmp.Format(_T("%d"),RPT_ATTEND_DOWN);
  4109. str_log += str_tmp + _T(",");
  4110. str_tmp = sql;
  4111. str_log += str_tmp + _T("\r\n");
  4112. writeErrorLog(_T("SQL_S"),str_log,false);
  4113. }
  4114. break;
  4115. }
  4116. case RPT_ATTEND_UP:
  4117. {
  4118. if(card->map_id != 0 && card->area_id != 0){
  4119. TRACE(_T("att up \r\n"));
  4120. b_exec = true;
  4121. string str_down_time = CFunctions::time_t2string(card->down_time);
  4122. sprintf_s(sql, LENGTH_SQL,
  4123. "CALL add_att(%s, '%s', '%s');", card->card_id.c_str(), str_down_time.c_str(), _time);
  4124. CString str_log = _T("");
  4125. CString str_tmp = _T("");
  4126. str_tmp.Format(_T("%d"),RPT_ATTEND_UP);
  4127. str_log += str_tmp + _T(",");
  4128. str_tmp = sql;
  4129. str_log += str_tmp + _T("\r\n");
  4130. writeErrorLog(_T("SQL_S"),str_log,false);
  4131. }
  4132. break;
  4133. }
  4134. case ALARM_CARD_LOW_POWER_START:
  4135. {
  4136. b_exec = true;
  4137. int alarm_type_id = ATID_POWER;
  4138. sprintf_s(sql, LENGTH_SQL,
  4139. "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \
  4140. VALUES(%s, %d, %d, '%s');",
  4141. card->card_id.c_str(), alarm_type_id, card->card_type, _time);
  4142. break;
  4143. }
  4144. case ALARM_CARD_LOW_POWER_END:
  4145. {
  4146. b_exec = true;
  4147. localtime_s(&local_time_ex, &card->low_power_time);
  4148. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4149. int alarm_type_id = ATID_POWER;
  4150. sprintf_s(sql, LENGTH_SQL,
  4151. "UPDATE his_alarm_card SET end_time = '%s' WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';",
  4152. _time, card->card_id.c_str(), alarm_type_id, _time_ex);
  4153. break;
  4154. }
  4155. //case ALARM_CARD_OVER_TIME_AREA_START:
  4156. // {
  4157. // int alarm_type_id = ATID_AREA_OVER_TIME_PERSON;
  4158. // if(CT_VEHICLE == card->card_type){
  4159. // alarm_type_id = ATID_AREA_OVER_TIME_VEHICLE;
  4160. // }
  4161. // sprintf_s(sql, LENGTH_SQL,
  4162. // "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \
  4163. // VALUES(%s, %d, %d, '%s')",
  4164. // card->card_id.c_str(), alarm_type_id, card->card_type, _time);
  4165. // break;
  4166. // }
  4167. //case ALARM_CARD_OVER_TIME_AREA_END:
  4168. // {
  4169. // localtime_s(&local_time_ex, &card->time_area_over_time);
  4170. // strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4171. // int alarm_type_id = ATID_AREA_OVER_TIME_PERSON;
  4172. // if(CT_VEHICLE == card->card_type){
  4173. // alarm_type_id = ATID_AREA_OVER_TIME_VEHICLE;
  4174. // }
  4175. // sprintf_s(sql, LENGTH_SQL,
  4176. // "UPDATE his_alarm_card SET end_time = '%s' \
  4177. // WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';",
  4178. // _time, card->card_id.c_str(), alarm_type_id, _time_ex);
  4179. // break;
  4180. // }
  4181. //case ALARM_CARD_OVER_TIME_START:
  4182. // {
  4183. // int alarm_type_id = ATID_OVER_TIME_PERSON;
  4184. // if(CT_VEHICLE == card->card_type){
  4185. // alarm_type_id = ATID_OVER_TIME_VEHICLE;
  4186. // }
  4187. // sprintf_s(sql, LENGTH_SQL,
  4188. // "INSERT INTO his_alarm_card(card_id, alarm_type_id, card_type_id, start_time) \
  4189. // VALUES(%s, %d, %d, '%s')",
  4190. // card->card_id.c_str(), alarm_type_id, card->card_type, _time);
  4191. // break;
  4192. // }
  4193. //case ALARM_CARD_OVER_TIME_END:
  4194. // {
  4195. // localtime_s(&local_time_ex, &card->time_over_time);
  4196. // strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  4197. // int alarm_type_id = ATID_OVER_TIME_PERSON;
  4198. // if(CT_VEHICLE == card->card_type){
  4199. // alarm_type_id = ATID_OVER_TIME_VEHICLE;
  4200. // }
  4201. // sprintf_s(sql, LENGTH_SQL,
  4202. // "UPDATE his_alarm_card SET end_time = '%s' \
  4203. // WHERE card_id=%s AND alarm_type_id=%d AND start_time = '%s';",
  4204. // _time, card->card_id.c_str(), alarm_type_id, _time_ex);
  4205. // break;
  4206. // }
  4207. default:
  4208. return;
  4209. }
  4210. try
  4211. {
  4212. if(b_exec){
  4213. execute_sql(sql);
  4214. }
  4215. }
  4216. catch (...)
  4217. {
  4218. //CString str = _T("");
  4219. //wchar_t* p = CFunctions::c2wc(sql);
  4220. //str.Format(_T("%s\n"), p);
  4221. //writeErrorLog(_T("SQL_S"), str);
  4222. ////str = _T("");
  4223. //str.Empty();
  4224. //if(p){
  4225. // free(p);
  4226. // p = NULL;
  4227. //}
  4228. }
  4229. }
  4230. std::string CYAServerDlg::get_json_counting()
  4231. {
  4232. Json::Value root;
  4233. Json::Value data;
  4234. Json::Value mapcounts;
  4235. int total_count = 0,total_count_vehicle = 0,total_count_person = 0;
  4236. int map_count_total, map_count_vehicle, map_count_person;
  4237. int area_count_total, area_count_vehicle, area_count_person;
  4238. MapInfoMap::iterator it_map = mp_map_list.begin();
  4239. for(; it_map != mp_map_list.end(); ++it_map){
  4240. Json::Value mapcount;
  4241. Json::Value areacounts;
  4242. // area
  4243. map_count_total = map_count_vehicle = map_count_person = 0;
  4244. AreaMap::iterator it_area = it_map->second->map_area_list.begin();
  4245. for(; it_area != it_map->second->map_area_list.end(); ++it_area){
  4246. area_count_total = area_count_vehicle = area_count_person = 0;
  4247. Json::Value areacount;
  4248. // person
  4249. CardMap::iterator it_card = it_area->second->area_card_list_person->begin();
  4250. for(; it_card != it_area->second->area_card_list_person->end(); ++ it_card){
  4251. if(DT_DOWN == it_card->second->pos_state){
  4252. area_count_person++;
  4253. area_count_total++;
  4254. } else {
  4255. continue;
  4256. }
  4257. }
  4258. // vehicle
  4259. it_card = it_area->second->area_card_list_vehicle->begin();
  4260. for(; it_card != it_area->second->area_card_list_vehicle->end(); ++ it_card){
  4261. if(DT_DOWN == it_card->second->pos_state){
  4262. area_count_vehicle++;
  4263. area_count_total++;
  4264. } else {
  4265. continue;
  4266. }
  4267. }
  4268. //if(area_count_total > 0){
  4269. areacount[JSON_KEY_COUNTING_AREA_COUNT_PERSON] = area_count_person;
  4270. areacount[JSON_KEY_COUNTING_AREA_COUNT_VEHICLE] = area_count_vehicle;
  4271. areacount[JSON_KEY_COUNTING_AREA_COUNT] = area_count_total;
  4272. areacount[JSON_KEY_COUNTING_AREA_ID] = it_area->second->area_id;
  4273. map_count_total += area_count_total;
  4274. map_count_person += area_count_person;
  4275. map_count_vehicle += area_count_vehicle;
  4276. areacounts.append(areacount);
  4277. //}
  4278. }
  4279. //if(map_count_total > 0){
  4280. mapcount[JSON_KEY_COUNTING_MAP_ID] = it_map->second->map_id;
  4281. mapcount[JSON_KEY_COUNTING_MAP_COUNT_PERSON] = map_count_person;
  4282. mapcount[JSON_KEY_COUNTING_MAP_COUNT_VEHICLE] = map_count_vehicle;
  4283. mapcount[JSON_KEY_COUNTING_MAP_COUNT_TOTAL] = map_count_total;
  4284. mapcount[JSON_KEY_COUNTING_AREA_COUNT] = areacounts;
  4285. total_count += map_count_total;
  4286. total_count_person += map_count_person;
  4287. total_count_vehicle += map_count_vehicle;
  4288. mapcounts.append(mapcount);
  4289. //}
  4290. }
  4291. // dept
  4292. Json::Value deptcounts;
  4293. Json::Value deptcount;
  4294. int dept_person_count, dept_vehicle_count, total_dept_count = 0;
  4295. DeptMap::iterator it_dept = mp_dept_list.begin();
  4296. for(; it_dept != mp_dept_list.end(); ++it_dept){
  4297. deptcount[JSON_KEY_COUNTING_DEPT_ID] = it_dept->second->dept_id;
  4298. //deptcount[JSON_KEY_COUNTING_DEPT_NAME] = it_dept->second->dept_name;
  4299. dept_person_count = it_dept->second->dept_card_list_person.size();
  4300. dept_vehicle_count = it_dept->second->dept_card_list_vehicle.size();
  4301. deptcount[JSON_KEY_COUNTING_DEPT_COUNT_TOTAL] = dept_person_count + dept_vehicle_count;
  4302. deptcount[JSON_KEY_COUNTING_DEPT_COUNT_PERSON] = dept_person_count;
  4303. deptcount[JSON_KEY_COUNTING_DEPT_COUNT_VEHICLE] = dept_vehicle_count;
  4304. //if(dept_vehicle_count + dept_person_count > 0){
  4305. // total_dept_count += dept_vehicle_count + dept_person_count;
  4306. deptcounts.append(deptcount);
  4307. //}
  4308. }
  4309. //if(total_dept_count>0){
  4310. data[JSON_KEY_COUNTING_DEPT_COUNT] = deptcounts;
  4311. //}
  4312. data[JSON_KEY_COUNTING_MAP_COUNT] = mapcounts;
  4313. data[JSON_KEY_COUNTING_COUNT_TOTAL] = total_count;
  4314. data[JSON_KEY_COUNTING_COUNT_VEHICLE] = total_count_vehicle;
  4315. data[JSON_KEY_COUNTING_COUNT_PERSON] = total_count_person;
  4316. root[JSON_ROOT_KEY_DATA] = data;
  4317. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_COUNTING;
  4318. return root.toFastString();
  4319. }
  4320. /*
  4321. * 从配置文件中载入数据库配置
  4322. *
  4323. * param
  4324. * 无
  4325. *
  4326. * return
  4327. * 无
  4328. */
  4329. void CYAServerDlg::load_param_from_ini()
  4330. {
  4331. m_tcp_host = CFunctions::c2wc(theApp.tcp_host.c_str());
  4332. m_ws_url = theApp.ws_url;
  4333. int nBackup = atoi(theApp.dbbackup.c_str());
  4334. switch(nBackup){
  4335. case 0:
  4336. m_db_setting.host = theApp.dbhost;
  4337. m_db_setting.user = theApp.dbuser;
  4338. m_db_setting.password = theApp.dbpwd;
  4339. m_db_setting.dbname = theApp.dbname;
  4340. m_db_setting.encoding = theApp.dbencoding;
  4341. m_db_setting.port = theApp.dbport;
  4342. break;
  4343. case 1:
  4344. m_db_setting.host = theApp.dbhost_bk;
  4345. m_db_setting.user = theApp.dbuser_bk;
  4346. m_db_setting.password = theApp.dbpwd_bk;
  4347. m_db_setting.dbname = theApp.dbname_bk;
  4348. m_db_setting.encoding = theApp.dbencoding_bk;
  4349. m_db_setting.port = theApp.dbport_bk;
  4350. break;
  4351. }
  4352. }
  4353. int CYAServerDlg::init_dept()
  4354. {
  4355. CMysqlConn* pConn = NULL;
  4356. CDBConnGuard pDbGuard(pConn);
  4357. if(pConn == NULL){
  4358. return 1;
  4359. }
  4360. MYSQL_ROW pRow;
  4361. MYSQL_RES *pRes = NULL;
  4362. int err = 0;
  4363. pRes = pConn->Execute("select dept_id, name from dat_dept order by rank;", err);
  4364. std::shared_ptr<Dept> dept = nullptr;
  4365. int nRow = 0;
  4366. while(pRow = mysql_fetch_row(pRes)) {
  4367. DeptMap::iterator it = mp_dept_list.find(atoi(pRow[0]));
  4368. if(it != mp_dept_list.end()){
  4369. dept = it->second;
  4370. }else{
  4371. dept = std::make_shared<Dept>(atoi(pRow[0]), pRow[1]);
  4372. mp_dept_list.insert(make_pair(dept->dept_id, dept));
  4373. nRow++;
  4374. }
  4375. }
  4376. mysql_free_result(pRes);
  4377. CString strlog;
  4378. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_DEPT), nRow, _T(LOG_RECORD_COUNT));
  4379. show_log(strlog);
  4380. return 0;
  4381. }
  4382. /*
  4383. * 从数据库的dat_setting表初始化系统阈值,
  4384. * 包括:井下人员阈值,井下车辆阈值,人员超时阈值,车辆超时阈值,车辆超速阈值
  4385. *
  4386. * param
  4387. * 无
  4388. *
  4389. * return
  4390. * 无
  4391. */
  4392. int CYAServerDlg::init_setting()
  4393. {
  4394. CMysqlConn* pConn = NULL;
  4395. CDBConnGuard pDbGuard(pConn);
  4396. if(pConn == NULL){
  4397. return 1;
  4398. }
  4399. MYSQL_ROW pRow;
  4400. MYSQL_RES *pRes = NULL;
  4401. int err = 0;
  4402. pRes = pConn->Execute("select setting_id, name, type, value from dat_setting;", err);
  4403. string name, val, type;
  4404. while(pRow = mysql_fetch_row(pRes)) {
  4405. name = pRow[1], type = pRow[2], val = pRow[3];
  4406. if("over_count_person" == name){
  4407. sls_setting.over_count_person = atoi(val.c_str());
  4408. }else if("over_count_vehicle" == name){
  4409. sls_setting.over_count_vehicle = atoi(val.c_str());
  4410. }else if("over_time_person" == name){
  4411. sls_setting.over_time_person = atoi(val.c_str());
  4412. }else if("over_time_vehicle" == name){
  4413. sls_setting.over_time_vehicle = atoi(val.c_str());
  4414. }else if("over_speed" == name){
  4415. sls_setting.over_speed = atof(val.c_str());
  4416. }
  4417. }
  4418. mysql_free_result(pRes);
  4419. show_log(_T(LOG_INIT_SETTING));
  4420. return 0;
  4421. }
  4422. void CYAServerDlg::deal_alarm_card(std::shared_ptr<Card> card, std::shared_ptr<CardMap> dest_card_list/*Card* card, CardMap* dest_card_list*/, bool is_alarm, ALARM_FLAG tag)
  4423. {
  4424. CardMap::iterator it_card = dest_card_list->find(card->card_id);
  4425. if(it_card != dest_card_list->end()){
  4426. if(!is_alarm){ // 取消报警
  4427. dest_card_list->erase(it_card);
  4428. }
  4429. }else {
  4430. if(is_alarm){
  4431. dest_card_list->insert(make_pair(card->card_id, card));
  4432. }
  4433. }
  4434. AreaMap::iterator it_area = mp_area_list.find(card->area_id);
  4435. if(it_area != mp_area_list.end()){
  4436. if(is_alarm){
  4437. INT64 ev_id = CFunctions::GetMicroSecond();
  4438. std::shared_ptr<YaEvent> ev = std::make_shared<YaEvent>(ev_id);
  4439. ev->status = ES_START;
  4440. ev->obj_type = OT_CARD;
  4441. ev->obj_id = card->card_id;
  4442. ev->cur_time = time_t(NULL);
  4443. ev->map_id = card->map_id;
  4444. ev->area_id = card->area_id;
  4445. ev->x = card->x;
  4446. ev->y = card->y;
  4447. switch (tag)
  4448. {
  4449. case AF_CARD_OVER_TIME:
  4450. {
  4451. ev->ev_type = (card->card_type == CT_VEHICLE)? ET_CARD_OVER_TIME_VEHICLE:ET_CARD_OVER_TIME_PERSON;
  4452. ev->limit_value = (card->card_type == CT_VEHICLE)? sls_setting.over_time_vehicle : sls_setting.over_time_person;
  4453. ev->cur_value = difftime(time(NULL), card->get_working_time());
  4454. break;
  4455. }
  4456. case AF_CARD_AREA_FORBIDDEN:
  4457. {
  4458. ev->ev_type = (card->card_type == CT_VEHICLE)? ET_CARD_AREA_FORBIDDEN_VEHICLE:ET_CARD_AREA_FORBIDDEN_PERSON;
  4459. ev->limit_value = (card->card_type == CT_VEHICLE)? it_area->second->count_area_forbidden_vehicle : it_area->second->count_area_forbidden_person;
  4460. ev->cur_value = (card->card_type == CT_VEHICLE)? it_area->second->count_vehicle:it_area->second->count_person;
  4461. card->time_area_forbidden = is_alarm ? time(NULL) : 0;
  4462. card->status_area_forbidden = is_alarm ? 1 : 0;
  4463. break;
  4464. }
  4465. case AF_CARD_AREA_OVER_TIME:
  4466. {
  4467. ev->ev_type = (card->card_type == CT_VEHICLE)? ET_CARD_AREA_OVER_TIME_VEHICLE:ET_CARD_AREA_OVER_TIME_PERSON;
  4468. ev->limit_value = (card->card_type == CT_VEHICLE)? it_area->second->count_area_over_time_vehicle : it_area->second->count_area_over_time_person;
  4469. ev->cur_value = difftime(card->time_over_time, card->down_time);
  4470. card->time_area_over_time = is_alarm ? time(NULL) : 0;
  4471. card->status_area_over_time = is_alarm ? 1 : 0;
  4472. break;
  4473. }
  4474. case AF_AREA_OVER_TIME:
  4475. {
  4476. card->time_over_time = is_alarm ? time(NULL) : 0;
  4477. card->status_over_time = is_alarm ? 1 : 0;
  4478. break;
  4479. }
  4480. case AF_CARD_OVER_SPEED:
  4481. {
  4482. ev->ev_type = ET_CARD_OVER_SPEED;
  4483. ev->limit_value = sls_setting.over_speed;
  4484. ev->cur_value = card->get_speed();
  4485. card->time_over_speed = is_alarm ? time(NULL) : 0;
  4486. card->status_over_speed = is_alarm ? 1 : 0;
  4487. break;
  4488. }
  4489. case AF_CARD_AREA_OVER_SPEED:
  4490. {
  4491. ev->ev_type = ET_CARD_AREA_OVER_SPEED;
  4492. ev->limit_value = it_area->second->over_speed_vehicle;
  4493. ev->cur_value = card->get_speed();
  4494. card->time_area_over_speed = is_alarm ? time(NULL) : 0;
  4495. card->status_area_over_speed = is_alarm ? 1 : 0;
  4496. break;
  4497. }
  4498. default:
  4499. break;
  4500. }
  4501. ev->is_sent = false;
  4502. card->m_event_list[ev->ev_type] = ev_id;
  4503. store_data_event(ev);
  4504. add_event(ev);
  4505. }else{
  4506. EVENT_TYPE et = ET_CARD_AREA_OVER_SPEED;
  4507. double cur_value = 0;
  4508. switch (tag)
  4509. {
  4510. case AF_CARD_OVER_TIME:
  4511. {
  4512. et = (card->card_type == CT_VEHICLE)? ET_CARD_OVER_TIME_VEHICLE:ET_CARD_OVER_TIME_PERSON;
  4513. cur_value = difftime(time(NULL), card->get_working_time());
  4514. break;
  4515. }
  4516. case AF_CARD_AREA_FORBIDDEN:
  4517. {
  4518. et = (card->card_type == CT_VEHICLE)? ET_CARD_AREA_FORBIDDEN_VEHICLE:ET_CARD_AREA_FORBIDDEN_PERSON;
  4519. cur_value = (card->card_type == CT_VEHICLE)? it_area->second->count_vehicle : it_area->second->count_vehicle;
  4520. card->time_area_forbidden = is_alarm ? time(NULL) : 0;
  4521. card->status_area_forbidden = is_alarm ? 1 : 0;
  4522. break;
  4523. }
  4524. case AF_CARD_AREA_OVER_TIME:
  4525. {
  4526. et = (card->card_type == CT_VEHICLE)? ET_CARD_AREA_OVER_TIME_VEHICLE:ET_CARD_AREA_OVER_TIME_PERSON;
  4527. cur_value = difftime(card->time_area_over_time, card->enter_area_time);
  4528. card->time_area_over_time = is_alarm ? time(NULL) : 0;
  4529. card->status_area_over_time = is_alarm ? 1 : 0;
  4530. break;
  4531. }
  4532. case AF_AREA_OVER_TIME:
  4533. {
  4534. //et = (card->card_type == CT_VEHICLE)? ET_CARD_AREA_OVER_TIME_VEHICLE:ET_CARD_AREA_OVER_TIME_PERSON;
  4535. //cur_value = difftime(card->time_area_over_time, card->enter_area_time);
  4536. card->time_over_time = is_alarm ? time(NULL) : 0;
  4537. card->status_over_time = is_alarm ? 1 : 0;
  4538. break;
  4539. }
  4540. case AF_CARD_OVER_SPEED:
  4541. {
  4542. et = ET_CARD_OVER_SPEED;
  4543. cur_value = card->get_speed();
  4544. card->time_over_speed = is_alarm ? time(NULL) : 0;
  4545. card->status_over_speed = is_alarm ? 1 : 0;
  4546. break;
  4547. }
  4548. case AF_CARD_AREA_OVER_SPEED:
  4549. {
  4550. et = ET_CARD_AREA_OVER_SPEED;
  4551. cur_value = card->get_speed();
  4552. card->time_area_over_speed = is_alarm ? time(NULL) : 0;
  4553. card->status_area_over_speed = is_alarm ? 1 : 0;
  4554. break;
  4555. }
  4556. default:
  4557. break;
  4558. }
  4559. INT64 ev_id = card->m_event_list[et];
  4560. if(ev_id > 0){
  4561. EventMap::iterator it_ev = mp_event_list->find(ev_id);
  4562. if(it_ev != mp_event_list->end()){
  4563. it_ev->second->status = ES_END;
  4564. it_ev->second->cur_time = time_t(NULL);
  4565. it_ev->second->cur_value = cur_value;
  4566. it_ev->second->is_sent = false;
  4567. store_data_event(it_ev->second);
  4568. add_event(it_ev->second);
  4569. }
  4570. }
  4571. card->m_event_list[et] = 0;
  4572. }
  4573. }
  4574. }
  4575. void CYAServerDlg::deal_alarm_area(std::shared_ptr<Area> area, std::shared_ptr<AreaMap> dest_area_list /*Area* area, AreaMap* dest_area_list*/, bool is_alarm, ALARM_FLAG tag )
  4576. {
  4577. AreaMap::iterator it_area = dest_area_list->find(area->area_id);
  4578. if(it_area != dest_area_list->end()){
  4579. if(!is_alarm){
  4580. //savetodb
  4581. dest_area_list->erase(it_area);
  4582. }
  4583. }else{
  4584. if(is_alarm){
  4585. // savetodb
  4586. dest_area_list->insert(make_pair(area->area_id, area));
  4587. }
  4588. }
  4589. }
  4590. /*
  4591. * 根据车卡位置来实行红绿灯策略
  4592. *
  4593. * param
  4594. * card 卡信息
  4595. *
  4596. * return
  4597. * 成功返回0,失败返回1
  4598. */
  4599. int CYAServerDlg::deal_traffic_lights(std::shared_ptr<Card> card)
  4600. {
  4601. int nMapId = 0;
  4602. nMapId = card->map_id;
  4603. MapInfoMap::iterator it_map = mp_map_list.find(nMapId);
  4604. if (it_map != mp_map_list.end())
  4605. {
  4606. //车辆位置
  4607. _point p;
  4608. p.x = card->x;
  4609. p.y = card->y;
  4610. p.z = card->z;
  4611. std::shared_ptr<Section> pSection = nullptr;
  4612. //将车辆加入到车辆所在的路段表中
  4613. SectionMap::iterator it_section ;
  4614. it_section = it_map->second->map_section_list.begin();
  4615. for (;it_section != it_map->second->map_section_list.end();++it_section)
  4616. {
  4617. //获得车辆所在的路段
  4618. if (it_section->second->IsInPolygon(p))
  4619. {
  4620. pSection = it_section->second;
  4621. //车辆在此路段内,将其保存到路段数据中
  4622. CardMap::iterator it_card = pSection->mp_vehicle_list.find(card->card_id);
  4623. if (it_card == pSection->mp_vehicle_list.end())
  4624. {
  4625. pSection->mp_vehicle_list.insert(make_pair(card->card_id,card));
  4626. }
  4627. //如果路段内车辆数大于正常数则记录报警时间
  4628. //当路段之前是报警状态,当恢复正常状态,更新报警结束时间
  4629. if (pSection->mp_vehicle_list.size() > 1)
  4630. {
  4631. int nSize = pSection->mp_vehicle_list.size();
  4632. switch (nSize)
  4633. {
  4634. case 0:
  4635. pSection->m_nState = SECTION_STATE_NORMAL;
  4636. break;
  4637. case 1:
  4638. pSection->m_nState = SECTION_STATE_BUSY;
  4639. break;
  4640. case 2:
  4641. pSection->m_nState = SECTION_STATE_CONGESTION;
  4642. break;
  4643. default:
  4644. break;
  4645. }
  4646. //记录告警开始时间
  4647. pSection->alarm_start_time = time(NULL);
  4648. store_data_section(pSection,time(NULL),ALARM_SECTION_START);
  4649. }else{
  4650. if (pSection->m_nState != SECTION_STATE_NORMAL)
  4651. {
  4652. pSection->m_nState = SECTION_STATE_NORMAL;
  4653. time_t cur_time(time(NULL));
  4654. store_data_section(pSection,cur_time,ALARM_SECTION_END);
  4655. }
  4656. }
  4657. //此路段内有有轨车
  4658. //退出
  4659. break;
  4660. }
  4661. }
  4662. //车辆离开路口区域,将红绿灯组的所有灯设置为绿灯
  4663. int nGroupId = 0;
  4664. LightGroupMap::iterator it_lg = it_map->second->map_light_group_list.find(card->m_nLightGroupId);
  4665. if (it_lg != it_map->second->map_light_group_list.end())
  4666. {
  4667. //红绿灯组所在区域即为路口区域
  4668. it_section = it_map->second->map_section_list.find(it_lg->second->m_nSectionId);
  4669. if (!it_section->second->IsInPolygon(p))
  4670. {
  4671. if (card->b_enter_intersection)
  4672. {
  4673. //离开路口区域,将此路口所有红绿灯改为绿色
  4674. for (LightMap::iterator it_ll = it_lg->second->mp_lights_list.begin();it_ll != it_lg->second->mp_lights_list.end();++it_ll)
  4675. {
  4676. it_ll->second->m_nColor = COLOR_GREEN;
  4677. }
  4678. card->b_enter_intersection = false;
  4679. //释放红绿灯组的控制权
  4680. card->m_nLightGroupId = -1;
  4681. //发送控制消息给红绿灯组,
  4682. //控制成功,退出;控制失败,报警并退出
  4683. //需要代码实现
  4684. }
  4685. }else{
  4686. card->b_enter_intersection = true;
  4687. //车辆进入路口区域,要判断车辆是否有此红绿灯组控制权,如没有,其即为闯红灯行为
  4688. if (card->m_nLightGroupId != it_lg->second->m_nID)
  4689. {
  4690. LightMap::iterator it_light = it_map->second->map_light_list.find(card->light_id);
  4691. if (it_light != it_map->second->map_light_list.end())
  4692. {
  4693. //记录车辆闯红灯了,将报警发到前端,发完即重置闯红灯状态
  4694. card->is_red_light = true;
  4695. store_data_traffic_red_light(it_light->second,card);
  4696. }
  4697. }
  4698. }
  4699. }
  4700. //找到路段
  4701. if (pSection != nullptr)
  4702. {
  4703. //从路段中根据车辆上行/下行方向,获得路段中的上行灯/下行灯
  4704. LightMap::iterator it_light = pSection->mp_light_list.begin();
  4705. bool bFind = false;
  4706. for (;it_light!=pSection->mp_light_list.end();++it_light)
  4707. {
  4708. //灯方向和车方向一致
  4709. if (card->m_nStream == it_light->second->m_nStream)
  4710. {
  4711. bFind = true;
  4712. card->light_id = it_light->second->m_nID;
  4713. break;
  4714. }
  4715. }
  4716. //如果没找到此灯,退出
  4717. if (it_light == pSection->mp_light_list.end())
  4718. {
  4719. return 1;
  4720. }
  4721. //判断灯是否正常,不正常,放弃此灯组的控制权
  4722. if (it_light->second->get_light_state() != STATUS_NORMAL)
  4723. {
  4724. it_light->second->m_nState = STATUS_ERROR;
  4725. store_data_light(it_light->second,ALARM_LIGHT_FAULT_START);
  4726. return 1;
  4727. }
  4728. //根据灯ID获取灯组id
  4729. LightGroupMap::iterator it_group = it_map->second->map_light_group_list.end();
  4730. if (it_light != pSection->mp_light_list.end() && bFind)
  4731. {
  4732. bFind = false;
  4733. for (it_group = it_map->second->map_light_group_list.begin();it_group != it_map->second->map_light_group_list.end();++it_group)
  4734. {
  4735. if (it_group->second->isExist(it_light->second))
  4736. {
  4737. bFind = true;
  4738. }
  4739. }
  4740. }
  4741. if (it_group == it_map->second->map_light_group_list.end())
  4742. {
  4743. return 1;
  4744. }
  4745. if (it_group->second->isAllLightColor(COLOR_GREEN))
  4746. {
  4747. //灯组中的灯全是绿灯,获得此灯组的控制权
  4748. //控制的是否为自己
  4749. if (it_group->second->m_strVechileId == card->card_id)
  4750. {
  4751. //判断车是否长时间不动
  4752. //如果是,则报警,并修改此车不能控制红绿灯功能
  4753. }
  4754. }else{
  4755. //是否找到红绿灯所在的灯组
  4756. if (it_group != it_map->second->map_light_group_list.end() && bFind)
  4757. {
  4758. if (it_group->second->m_bIsUsed)
  4759. {
  4760. //如果灯组在使用,
  4761. //判断当前卡的级别是否大于控制灯组卡的级别,如果是,获得控制权
  4762. bool bChangeAuthority = false;
  4763. CardMap::iterator it_card = mp_card_list_all.find(it_group->second->m_strVechileId);
  4764. if (it_card != mp_card_list_all.end())
  4765. {
  4766. //可以更改红绿灯组控制权的条件如下
  4767. //1.存在此卡,车辆级别更高,
  4768. //2.此车在主巷道,被控制的红绿灯组的车在非主巷道
  4769. //3.车辆为上行且原车辆车辆为下行
  4770. bool bRet = false;
  4771. if (card->level > it_card->second->level)
  4772. {
  4773. bRet = true;
  4774. }
  4775. else if (card->level == it_card->second->level
  4776. && (isInMainTunel(card)&&!isInMainTunel(it_card->second)))
  4777. {
  4778. bRet = true;
  4779. }else if (card->level == it_card->second->level
  4780. && (getTunelProperty(card)==getTunelProperty(it_card->second)&&(getTunelProperty(card)!=0))
  4781. && (card->direction == UP_STREAM && it_card->second->direction == DOWN_STREAM))
  4782. {
  4783. bRet = true;
  4784. }
  4785. if (bRet)
  4786. {
  4787. bChangeAuthority = true;
  4788. it_group->second->m_strVechileId = card->card_id;
  4789. }
  4790. }
  4791. if (!bChangeAuthority)
  4792. {
  4793. //说明此灯组被控制了,当前车辆无法控制红绿灯组,
  4794. return 1;
  4795. //那么车辆需要进硐室躲避
  4796. card_enter_chamber(card,pSection);
  4797. }
  4798. }
  4799. }else{
  4800. return 1;
  4801. }
  4802. }
  4803. it_group->second->m_bIsUsed = true;
  4804. it_group->second->m_strVechileId = card->card_id;
  4805. card->m_nLightGroupId = it_group->second->m_nID;
  4806. //控制灯的颜色,将当前灯设置为绿色,其他为红色
  4807. for (LightMap::iterator it_glight = it_group->second->mp_lights_list.begin();it_glight != it_group->second->mp_lights_list.end();++it_glight)
  4808. {
  4809. if (it_glight->second->m_nID == it_light->second->m_nID
  4810. && it_glight->second->m_nMapID == it_light->second->m_nMapID )
  4811. {
  4812. it_glight->second->m_nColor = COLOR_GREEN;
  4813. }else{
  4814. it_glight->second->m_nColor = COLOR_RED;
  4815. }
  4816. }
  4817. //下发控制消息给红绿灯,如果控制失败,则报警
  4818. }
  4819. }
  4820. return 0;
  4821. }
  4822. /*
  4823. * 处理区域超速
  4824. *
  4825. * param
  4826. * card 车卡信息
  4827. *
  4828. * return
  4829. * 成功返回0,失败返回1
  4830. *
  4831. */
  4832. int CYAServerDlg::deal_area_over_speed(std::shared_ptr<Card> card)
  4833. {
  4834. int nAreaId = 0;
  4835. nAreaId = card->area_id;
  4836. AreaMap::iterator it_area = mp_area_list.find(nAreaId);
  4837. if (it_area != mp_area_list.end())
  4838. {
  4839. if (card->v > it_area->second->over_speed_vehicle)
  4840. {
  4841. time_t current_time(time(NULL));
  4842. card->is_area_over_speed = true;
  4843. card->time_over_speed = current_time;
  4844. store_data_card(card,ALARM_CARD_OVER_SPEED_AREA_START);
  4845. deal_alarm_card(card,it_area->second->area_card_list_vehicle,true,AF_CARD_OVER_SPEED);
  4846. }
  4847. }
  4848. return 0;
  4849. }
  4850. /*
  4851. * 车辆进入硐室
  4852. *
  4853. * param
  4854. * card 车卡信息
  4855. *
  4856. * return
  4857. * 成功返回0,失败返回1
  4858. *
  4859. */
  4860. int CYAServerDlg::card_enter_chamber(std::shared_ptr<Card> card,std::shared_ptr<Section> section)
  4861. {
  4862. return 1;
  4863. ChamberMap::iterator it_chamber = section->mp_champer_list.begin();
  4864. for (;it_chamber != section->mp_champer_list.end();++it_chamber)
  4865. {
  4866. //在路段中查找和车辆位置最近的可用硐室
  4867. double dDistance = 0.0;
  4868. //dDistance = sqrt(card->x);
  4869. if (!it_chamber->second->m_nIsUsed)
  4870. {
  4871. }
  4872. }
  4873. return 0;
  4874. }
  4875. /*
  4876. * 判断坐标输出需不需要选择坐标左边偏移位置
  4877. *
  4878. * param
  4879. * card 卡信息
  4880. *
  4881. * return
  4882. * 成功返回0,执行失败返回1
  4883. *
  4884. */
  4885. int CYAServerDlg::select_pos_output(std::shared_ptr<Card> card)
  4886. {
  4887. int nMapId = 0;
  4888. nMapId = card->map_id;
  4889. MapInfoMap::iterator it_map = mp_map_list.find(nMapId);
  4890. for (;it_map != mp_map_list.end();++it_map)
  4891. {
  4892. CardMap::iterator it_vehicle = it_map->second->map_card_list_vehicle.begin();
  4893. for (;it_vehicle != it_map->second->map_card_list_vehicle.end();++it_vehicle)
  4894. {
  4895. if (it_vehicle->second->card_id != card->card_id)
  4896. {
  4897. double distance = 0.0;
  4898. distance = sqrt(pow(it_vehicle->second->x - card->x,2) + pow(it_vehicle->second->y - card->y,2));
  4899. //会车距离
  4900. if (distance <= VEHICLE_WIDTH )
  4901. {
  4902. //不同方向都靠右
  4903. if (card->m_nMoveDirection != it_vehicle->second->m_nMoveDirection)
  4904. {
  4905. card->m_nOutputPosState = RIGHT_POS;
  4906. it_vehicle->second->m_nOutputPosState = RIGHT_POS;
  4907. }else{
  4908. //相同方向一左一右
  4909. card->m_nOutputPosState = LEFT_POS;
  4910. it_vehicle->second->m_nOutputPosState = RIGHT_POS;
  4911. }
  4912. }else{
  4913. card->m_nOutputPosState = CENTRAL_POS;
  4914. it_vehicle->second->m_nOutputPosState = CENTRAL_POS;
  4915. }
  4916. }
  4917. }
  4918. //SectionMap::iterator it_section = it_map->second->map_section_list.begin();
  4919. //for (;it_section != it_map->second->map_section_list.end();++it_section)
  4920. //{
  4921. // _point p;
  4922. // p.x = card->x;
  4923. // p.y = card->y;
  4924. // p.z = card->z;
  4925. // if (it_section->second->IsInPolygon(p));
  4926. // {
  4927. // //判断路段内是否有反向运动的车辆,如果有,则最终要输出坐标靠左偏移的坐标
  4928. // CardMap::iterator it_vehicle = it_section->second->mp_vehicle_list.begin();
  4929. // for (;it_vehicle != it_section->second->mp_vehicle_list.end();++it_vehicle)
  4930. // {
  4931. // if (card->m_nMoveDirection != it_vehicle->second->m_nMoveDirection)
  4932. // {
  4933. // card->is_output_left_pos = true;
  4934. // }else{
  4935. // card->is_output_left_pos = false;
  4936. // }
  4937. // }
  4938. // }
  4939. }
  4940. return 0;
  4941. }
  4942. /*
  4943. * 从数据库的dat_alarm_type表初始化告警类型和名称
  4944. *
  4945. * param
  4946. * 无
  4947. *
  4948. * return
  4949. * 无
  4950. */
  4951. int CYAServerDlg::init_alarm_type()
  4952. {
  4953. CMysqlConn* pConn = NULL;
  4954. CDBConnGuard pDbGuard(pConn);
  4955. if(pConn == NULL){
  4956. return 1;
  4957. }
  4958. MYSQL_ROW pRow;
  4959. MYSQL_RES *pRes = NULL;
  4960. int err = 0;
  4961. pRes = pConn->Execute("select event_type_id, name from dat_event_type;", err);
  4962. while(pRow = mysql_fetch_row(pRes)) {
  4963. AlarmTypeMap::iterator it = mp_alarm_type_list.find(atoi(pRow[0]));
  4964. if(it != mp_alarm_type_list.end()){
  4965. it->second = pRow[1];
  4966. }else{
  4967. mp_alarm_type_list.insert(make_pair(atoi(pRow[0]), pRow[1]));
  4968. }
  4969. }
  4970. mysql_free_result(pRes);
  4971. show_log(_T(LOG_INIT_ALARM_TYPE));
  4972. return 0;
  4973. }
  4974. void CYAServerDlg::AddItem( CString strvalue, int readerid, BOOL is_closed /*= false*/ )
  4975. {
  4976. CString strRow;
  4977. int nRow = 0;
  4978. bool bFind = false;
  4979. for(int i = 0; i < m_listctrl_reader.GetItemCount(); i++){
  4980. if(strvalue == m_listctrl_reader.GetItemText(i, 1)){
  4981. nRow = i;
  4982. bFind = true;
  4983. break;
  4984. }
  4985. }
  4986. if(!bFind){
  4987. nRow = m_listctrl_reader.GetItemCount();
  4988. //strRow.Format(_T("%d"), nRow + 1);
  4989. nRow = m_listctrl_reader.InsertItem(nRow, CFunctions::formatInt(readerid));
  4990. }
  4991. m_listctrl_reader.SetItemText(nRow, 1, strvalue);
  4992. m_listctrl_reader.SetItemText(nRow, 2, is_closed ? _T("中断"): _T("已连接"));
  4993. }
  4994. void CYAServerDlg::show_log( LPCTSTR szlog, BOOL bSave )
  4995. {
  4996. CString sMsg, sLog;
  4997. CString sTime=COleDateTime::GetCurrentTime().Format(_T(LOG_TIME_FORMAT));
  4998. sMsg.Format(_T("%s %s\n"), sTime, szlog);
  4999. try{
  5000. ::LogMsg(sMsg);
  5001. }
  5002. catch(...){
  5003. }
  5004. /*if(bSave && theApp.log_sys_status){
  5005. writeErrorLog(_T("LOG_S"), sMsg);
  5006. }*/
  5007. //if(m_log_sys_status){
  5008. // writeErrorLog(_T("LOG_S"), sMsg,false);
  5009. // //sMsg = _T("");
  5010. // sMsg.Empty();
  5011. //}
  5012. }
  5013. /*
  5014. * 初始化数据库连接
  5015. *
  5016. * param
  5017. * 无
  5018. *
  5019. * return
  5020. * 无
  5021. *
  5022. */
  5023. void CYAServerDlg::database_connect()
  5024. {
  5025. //show_log(_T(LOG_CONNECT_DB), FALSE);
  5026. show_log(_T(LOG_CONNECT_DB));
  5027. GetConnPool().Init(m_db_setting.encoding.c_str(), m_db_setting.host.c_str(), m_db_setting.user.c_str(),
  5028. m_db_setting.password.c_str(), m_db_setting.dbname.c_str(), m_db_setting.port, NULL, 0);
  5029. int nConn = GetConnPool().InitAllConn();
  5030. if(nConn > 0){
  5031. show_log(_T(LOG_CONNECT_DB_SUCCESS));
  5032. }else{
  5033. show_log(_T(LOG_CONNECT_DB_FAIL));
  5034. }
  5035. }
  5036. void CYAServerDlg::OnMenuDb()
  5037. {
  5038. CDbSettingDlg dlg;
  5039. dlg.DoModal();
  5040. }
  5041. void CYAServerDlg::OnCallMessage(string const& name, message::ptr const& data, bool isAck,message::list &ack_resp )
  5042. {
  5043. if(data->get_flag() == message::flag_object){
  5044. /*string jsonString = name;
  5045. if(m_log_recv_package){
  5046. CString strlog = _T("");
  5047. strlog.Format(_T("1%s"),CFunctions::c2wc(jsonString.c_str()));
  5048. writeErrorLog(_T("JSON_R"),strlog,false);
  5049. }*/
  5050. string cmd = data->get_map()[JSON_ROOT_KEY_CMD]->get_string();
  5051. if(JSON_CMD_VALUE_META_DATA_CHANGED == cmd){
  5052. map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  5053. string name = data_map[JSON_KEY_NAME]->get_string().c_str();
  5054. string op_type = data_map[JSON_KEY_OP_TYPE]->get_string().c_str();
  5055. 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);
  5056. if(JSON_KEY_NAME_VEHICLE == name){
  5057. string id = data_map[JSON_KEY_ID]->get_string().c_str();
  5058. deal_call_edit_vehicle(id, edit_type_id);
  5059. }else if(JSON_KEY_NAME_STAFF == name){
  5060. string id = data_map[JSON_KEY_ID]->get_string().c_str();
  5061. deal_call_edit_staff(id, edit_type_id);
  5062. }else if(JSON_KEY_NAME_READER == name){
  5063. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  5064. deal_call_edit_reader(id, edit_type_id);
  5065. }else if(JSON_KEY_NAME_CARD == name){
  5066. string id = data_map[JSON_KEY_ID]->get_string().c_str();
  5067. deal_call_edit_card(id, edit_type_id);
  5068. }else if(JSON_KEY_NAME_AREA == name){
  5069. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  5070. deal_call_edit_area(id, edit_type_id);
  5071. }else if(JSON_KEY_NAME_MAP == name){
  5072. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  5073. deal_call_edit_map(id, edit_type_id);
  5074. }else if(JSON_KEY_NAME_PATROL_TASK == name){
  5075. std::string id = data_map[JSON_KEY_ID]->get_string().c_str();
  5076. deal_call_edit_patrol_task(id, edit_type_id);
  5077. }else if(JSON_KEY_NAME_PATH == name){
  5078. //int id = data_map[JSON_KEY_ID]->get_int();
  5079. //deal_call_edit_path(id, edit_type_id);
  5080. }else if (JSON_KEY_NAME_SECTION == name)
  5081. {
  5082. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  5083. deal_call_edit_section(id,edit_type_id);
  5084. }else if (JSON_KEY_NAME_LIGHT == name)
  5085. {
  5086. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  5087. deal_call_edit_light(id,edit_type_id);
  5088. }else if (JSON_KEY_NAME_CHAMBER == name)
  5089. {
  5090. int id = atoi(data_map[JSON_KEY_ID]->get_string().c_str());
  5091. deal_call_edit_chamber(id,edit_type_id);
  5092. }
  5093. }else if(JSON_CMD_VALUE_SET_LIMIT_VALUE == cmd){
  5094. //阈值限制接口
  5095. string json_data = data->get_map()[JSON_ROOT_KEY_DATA]->get_string();
  5096. parse_json_data_set_limit_value(json_data.c_str());
  5097. } else if(JSON_CMD_VALUE_REQUEST_ALL_POSTION == cmd){
  5098. //请求全部位置信息
  5099. send_json_data(JSON_CMD_VALUE_REQUEST_ALL_POSTION, get_json_position_all());
  5100. } else if(JSON_CMD_VALUE_DEAL_HELP == cmd){
  5101. // 处理呼救信息
  5102. string json_data = data->get_map()[JSON_ROOT_KEY_DATA]->get_string();
  5103. parse_json_data_deal_help(json_data.c_str());
  5104. } else if(JSON_CMD_VALUE_CALL_CARD_START == cmd){
  5105. //呼叫
  5106. parse_json_data_call_card(data);
  5107. } else if(JSON_CMD_VALUE_CALL_CARD_CANCEL == cmd){
  5108. //取消呼叫
  5109. parse_json_data_call_card_cancel(data);
  5110. } else if(JSON_CMD_VALUE_CLEAR_CARD == cmd) {
  5111. // 清楚盲区卡
  5112. //map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  5113. //parse_json_data_clear_card(data_map);
  5114. }else if (JSON_CMD_VALUE_SET_LIGHT_COLOR == cmd)
  5115. {
  5116. parse_json_data_set_light_color(data);
  5117. }
  5118. }
  5119. }
  5120. void CYAServerDlg::parse_json_data_set_limit_value( const char* sz )
  5121. {
  5122. //USES_CONVERSION;
  5123. //CUTF82C strJson(szJson);
  5124. Json::Value root;
  5125. Json::Reader reader;
  5126. CString strlog;
  5127. if (!reader.parse(sz,root)){
  5128. strlog.Format(_T("%s%s"), _T(LOG_SET_LIMIT_VALUE), _T(LOG_FAIL));
  5129. show_log(strlog);
  5130. return ;
  5131. }
  5132. sls_setting.over_count_person = root[JSON_KEY_ALARM_OVER_COUNT_PERSON].asInt();
  5133. sls_setting.over_count_vehicle = root[JSON_KEY_ALARM_OVER_COUNT_VEHICLE].asInt();
  5134. sls_setting.over_time_person = root[JSON_KEY_ALARM_OVER_TIME_PERSON].asInt();
  5135. sls_setting.over_time_vehicle = root[JSON_KEY_ALARM_OVER_TIME_VEHICLE].asInt();
  5136. sls_setting.over_speed = root[JSON_KEY_ALARM_OVER_SPEED_VEHICLE].asDouble();
  5137. strlog.Format(_T("%s%s"), _T(LOG_SET_LIMIT_VALUE), _T(LOG_SUCCESS));
  5138. show_log(strlog);
  5139. if(m_log_recv_package){
  5140. strlog = _T("");
  5141. strlog.Format(_T("%s"),sz);
  5142. writeErrorLog(_T("JSON_R"),strlog,false);
  5143. //strlog = _T("");
  5144. strlog.Empty();
  5145. }
  5146. }
  5147. void CYAServerDlg::parse_json_data_call_card(message::ptr const& data /*const char* sz*/ )
  5148. {
  5149. CString strlog;
  5150. string call_id, user_name, call_time;
  5151. string cardid, readerid;
  5152. int call_time_out, reader_count, card_count, call_type_id;
  5153. map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  5154. call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string();
  5155. call_time_out = data_map[JSON_KEY_CALL_CARD_CALL_TIME_OUT]->get_int();
  5156. call_type_id = data_map[JSON_KEY_CALL_CARD_CALL_TYPE]->get_int();
  5157. user_name = data_map[JSON_KEY_CALL_CARD_USER_NAME]->get_string();
  5158. call_time = data_map[JSON_KEY_CALL_CARD_CALL_TIME]->get_string();
  5159. vector<message::ptr> reader_vec = data_map[JSON_KEY_CALL_CARD_STATIONS]->get_vector();
  5160. vector<message::ptr> card_vec = data_map[JSON_KEY_CALL_CARD_CARDS]->get_vector();
  5161. if(reader_vec.size() == 0 && card_vec.size() == 0)
  5162. {
  5163. return;
  5164. }
  5165. int reader_id, npos;
  5166. SocketMap::iterator it_sock;
  5167. BYTE buf[LENGTH_SEND_BUF];
  5168. //_call_info_reader* call_reader;
  5169. //_call_info_card* call_card;
  5170. shared_ptr<_call_info_reader> call_reader;
  5171. std::shared_ptr<_call_info_card> call_card;
  5172. //呼叫发起有两种,
  5173. //一种通过分站发起呼叫即为对此分站下的所有自组网卡全员呼叫
  5174. //一种是对单卡发起的呼叫
  5175. vector<message::ptr>::const_iterator it_reader = reader_vec.begin();
  5176. if(reader_vec.size() > 0){
  5177. for(; it_reader != reader_vec.end(); ++it_reader){
  5178. string s_reader_id = "";
  5179. s_reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_string();
  5180. reader_id = atoi(s_reader_id.c_str());
  5181. CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
  5182. if(it_call_reader != mp_call_info.end()){
  5183. call_reader = it_call_reader->second;
  5184. if(call_reader->call_type > call_type_id){
  5185. call_reader->call_type = call_type_id;
  5186. }
  5187. }else{
  5188. call_reader = std::make_shared<_call_info_reader>();
  5189. call_reader->call_type = call_type_id;
  5190. mp_call_info.insert(make_pair(reader_id, call_reader));
  5191. }
  5192. vector<message::ptr>::const_iterator it_card = card_vec.begin();
  5193. if(card_vec.size() == 0 || "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){
  5194. call_reader->cards_count = 0;
  5195. call_reader->is_call_all = true;
  5196. call_reader->is_start_call = true;
  5197. }else{
  5198. call_reader->cards_count = card_vec.size();
  5199. call_reader->is_call_all = false;
  5200. call_reader->is_start_call = true;
  5201. BYTE card_type = 0;
  5202. for(; it_card != card_vec.end(); ++it_card){
  5203. if( "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){
  5204. call_reader->cards_count = 0;
  5205. call_reader->is_call_all = true;
  5206. }else{
  5207. string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
  5208. string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
  5209. //string str_card_id = CFunctions::getstrwithzero(card_type, 3) + CFunctions::getstrwithzero(card_id, 10);
  5210. CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
  5211. int card_id = atoi(s_card_id.c_str());
  5212. int card_type = atoi(s_card_type.c_str());
  5213. if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
  5214. call_card = it_call_card->second;
  5215. if(call_card->call_type < call_type_id){ // 原呼叫优先级低
  5216. call_card->card_type = card_type;
  5217. call_card->call_type = call_type_id;
  5218. call_card->start_time = time(NULL);
  5219. call_card->time_out = call_time_out;
  5220. }else {
  5221. call_card->start_time = time(NULL);
  5222. call_card->time_out = call_time_out;
  5223. }
  5224. }else{ // 未在呼叫列表
  5225. call_card = std::make_shared<_call_info_card>();
  5226. call_card->card_type = card_type;
  5227. call_card->start_time = time(NULL);
  5228. call_card->time_out = call_time_out;
  5229. call_card->call_type = call_type_id;
  5230. call_reader->mpCard.insert(make_pair(s_card_id, call_card));
  5231. }
  5232. }
  5233. }
  5234. }
  5235. }
  5236. }
  5237. //单卡发送呼叫
  5238. it_reader = reader_vec.begin();
  5239. if(it_reader == reader_vec.end() && card_vec.size() > 0 ){
  5240. int nCounts = 0;
  5241. int card_id = 0;
  5242. BYTE card_type = 0;
  5243. string s_card_id = "";
  5244. string s_card_type = "";
  5245. vector<message::ptr>::const_iterator it_card = card_vec.begin();
  5246. for(; it_card != card_vec.end(); ++it_card){
  5247. card_type = 0;
  5248. s_card_id = "";
  5249. s_card_type = "";
  5250. call_type_id = 0;
  5251. nCounts++;
  5252. s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
  5253. s_card_type =(*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
  5254. string new_card_id = s_card_id.substr(3,s_card_id.length());
  5255. card_id = atoi(new_card_id.c_str());
  5256. card_type = CT_ADHOC;
  5257. CardMap::iterator it_card = mp_card_list_all.find(s_card_id);
  5258. if (it_card== mp_card_list_all.end())
  5259. {
  5260. continue;
  5261. }
  5262. //reader_id = mp_card_list_down_adhoc.find(s_card_id)->second->reader_id;
  5263. reader_id = it_card->second->reader_id;
  5264. CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
  5265. if(it_call_reader != mp_call_info.end()){
  5266. call_reader = it_call_reader->second;
  5267. call_reader->is_start_call = true;
  5268. call_reader->is_call_all = false;
  5269. call_reader->cards_count = 1;
  5270. if(call_reader->call_type > call_type_id){
  5271. call_reader->call_type = call_type_id;
  5272. }
  5273. }else{
  5274. call_reader = std::make_shared<_call_info_reader>();
  5275. call_reader->call_type = call_type_id;
  5276. call_reader->is_call_all = false;
  5277. call_reader->cards_count = 1;
  5278. call_reader->is_start_call = true;
  5279. mp_call_info.insert(make_pair(reader_id, call_reader));
  5280. }
  5281. CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
  5282. if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
  5283. call_card = it_call_card->second;
  5284. if(call_card->call_type < call_type_id){ // 原呼叫优先级低
  5285. call_card->card_type = card_type;
  5286. call_card->card_id = 1;
  5287. call_card->call_type = call_type_id;
  5288. call_card->start_time = time(NULL);
  5289. call_card->time_out = call_time_out;
  5290. }else {
  5291. call_card->start_time = time(NULL);
  5292. call_card->time_out = call_time_out;
  5293. }
  5294. }else{ // 未在呼叫列表
  5295. call_card = std::make_shared<_call_info_card>();
  5296. call_card->card_id = card_id;
  5297. call_card->card_type = card_type;
  5298. call_card->start_time = time(NULL);
  5299. call_card->time_out = call_time_out;
  5300. call_card->call_type = call_type_id;
  5301. call_reader->mpCard.insert(make_pair(s_card_id, call_card));
  5302. }
  5303. }
  5304. }
  5305. strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_SUCCESS));
  5306. show_log(strlog);
  5307. }
  5308. void CYAServerDlg::parse_json_data_clear_card( const char* sz )
  5309. {
  5310. Json::Value root;
  5311. Json::Reader reader;
  5312. CString strlog = _T("");
  5313. if (!reader.parse(sz,root)){
  5314. strlog.Format(_T("%s%s"), _T(LOG_CLEAR_CARD), _T(LOG_FAIL));
  5315. show_log(strlog);
  5316. return ;
  5317. }
  5318. if(root.isNull() || !root.isArray()){
  5319. return;
  5320. }
  5321. int card_type_id, edit_type_id;
  5322. string cardid = "";
  5323. for(unsigned int i = 0; i < root.size(); i++){
  5324. cardid = root[i][JSON_KEY_EDIT_CARD_ID].asString();
  5325. edit_type_id = root[i][JSON_KEY_EDIT_EDIT_TYPE_ID].asInt();
  5326. CardMap::iterator it_card = mp_card_list_all.find(cardid);
  5327. if(it_card != mp_card_list_all.end()){
  5328. if(STATUS_ERROR == it_card->second->status_lost){
  5329. // 升井
  5330. it_card->second->up_time = time(NULL);
  5331. it_card->second->pos_state = DT_UP;
  5332. card_enter_mine(it_card->second);
  5333. remove_card(cardid);
  5334. }
  5335. }
  5336. }
  5337. strlog.Format(_T("%s%s"), _T(LOG_CLEAR_CARD), _T(LOG_SUCCESS));
  5338. show_log(strlog);
  5339. if(m_log_recv_package){
  5340. strlog = _T("");
  5341. strlog.Format(_T("%s"),sz);
  5342. writeErrorLog(_T("JSON_R"),strlog,false);
  5343. }
  5344. }
  5345. void CYAServerDlg::parse_json_data_deal_help( const char* sz )
  5346. {
  5347. Json::Value root;
  5348. Json::Reader reader;
  5349. CString strlog;
  5350. if (!reader.parse(sz,root)){
  5351. strlog.Format(_T("%s%s"), _T(LOG_DEAL_HELP), _T(LOG_FAIL));
  5352. show_log(strlog);
  5353. return ;
  5354. }
  5355. int card_type_id, edit_type_id;
  5356. string cardid = root[JSON_KEY_EDIT_CARD_ID].asString();
  5357. card_type_id = root[JSON_KEY_CARD_TYPE_ID].asInt();
  5358. edit_type_id = root[JSON_KEY_EDIT_EDIT_TYPE_ID].asInt();
  5359. CardMap::iterator it_card = mp_card_list_help->find(cardid);
  5360. if(it_card != mp_card_list_help->end()){
  5361. it_card->second->status_help = STATUS_HELP_DEALED;
  5362. }
  5363. strlog.Format(_T("%s%s"), _T(LOG_DEAL_HELP), _T(LOG_SUCCESS));
  5364. show_log(strlog);
  5365. if(m_log_recv_package){
  5366. strlog = _T("");
  5367. strlog.Format(_T("%s"),sz);
  5368. writeErrorLog(_T("JSON_R"),strlog,false);
  5369. strlog.Empty();
  5370. }
  5371. }
  5372. /*
  5373. * 处理web端发送的修改红绿灯颜色功能
  5374. *
  5375. * param
  5376. * data --- 前端json
  5377. *
  5378. * return
  5379. * 成功执行返回0,失败返回1
  5380. */
  5381. int CYAServerDlg::parse_json_data_set_light_color(message::ptr const& data)
  5382. {
  5383. //解析字符串后,对红绿灯进行控制
  5384. //如果控制失败,则报警
  5385. std::string strUserId = "";
  5386. std::string strUserName = "";
  5387. std::string strDealTime = "";
  5388. map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  5389. strUserId = data_map[JSON_KEY_CALL_LIGHT_USER_ID]->get_string();
  5390. strUserName = data_map[JSON_KEY_CALL_LIGHT_USER_NAME]->get_string();
  5391. strDealTime = data_map[JSON_KEY_CALL_LIGHT_DEAL_TIME]->get_string();
  5392. vector<message::ptr> lights = data_map[JSON_KEY_CALL_LIGHT_LIGHTS]->get_vector();
  5393. if (lights.size() > 0)
  5394. {
  5395. //获取每个灯进行控制
  5396. vector<message::ptr>::const_iterator it_light = lights.begin();
  5397. for (;it_light != lights.end();++it_light)
  5398. {
  5399. int nLightId = 0;
  5400. string strLightId = "";
  5401. //获得灯id
  5402. strLightId = (*it_light)->get_map()[JSON_KEY_CALL_LIGHT_ID]->get_string();
  5403. nLightId = atoi(strLightId.c_str());
  5404. }
  5405. }
  5406. return 0;
  5407. }
  5408. void CYAServerDlg::deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id)
  5409. {
  5410. CString strlog = _T("");
  5411. switch (edit_type_id)
  5412. {
  5413. case ET_INSERT:
  5414. {
  5415. init_map(id);
  5416. break;
  5417. }
  5418. case ET_UPDATE:
  5419. {
  5420. init_map(id);
  5421. break;
  5422. }
  5423. case ET_DELETE:
  5424. {
  5425. MapInfoMap::iterator it_map = mp_map_list.find(id);
  5426. if(it_map != mp_map_list.end()){
  5427. mp_map_list.erase(it_map);
  5428. }
  5429. break;
  5430. }
  5431. default:
  5432. break;
  5433. }
  5434. strlog.Format(_T("%s%s"), _T(LOG_EDIT_MAP), _T(LOG_SUCCESS));
  5435. show_log(strlog);
  5436. }
  5437. void CYAServerDlg::deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id)
  5438. {
  5439. CString strlog;
  5440. switch (edit_type_id)
  5441. {
  5442. case ET_INSERT:
  5443. {
  5444. init_area(id);
  5445. break;
  5446. }
  5447. case ET_UPDATE:
  5448. {
  5449. init_area(id);
  5450. break;
  5451. }
  5452. case ET_DELETE:
  5453. {
  5454. AreaMap::iterator it_area = mp_area_list.find(id);
  5455. MapInfoMap::iterator it_map = mp_map_list.find(it_area->second->map_id);
  5456. if(it_map != mp_map_list.end()){
  5457. AreaMap::iterator it_map_area = it_map->second->map_area_list.find(id);
  5458. it_map->second->map_area_list.erase(it_map_area);
  5459. }
  5460. if(it_area != mp_area_list.end()){
  5461. mp_area_list.erase(it_area);
  5462. }
  5463. it_area = mp_area_over_count_person->find(id);
  5464. if(it_area != mp_area_over_count_person->end()){
  5465. mp_area_over_count_person->erase(it_area);
  5466. }
  5467. it_area = mp_area_over_time_person->find(id);
  5468. if(it_area != mp_area_over_time_person->end()){
  5469. mp_area_over_time_person->erase(it_area);
  5470. }
  5471. it_area = mp_area_forbidden_person->find(id);
  5472. if(it_area != mp_area_forbidden_person->end()){
  5473. mp_area_forbidden_person->erase(it_area);
  5474. }
  5475. it_area = mp_area_over_count_vehicle->find(id);
  5476. if(it_area != mp_area_over_count_vehicle->end()){
  5477. mp_area_over_count_vehicle->erase(it_area);
  5478. }
  5479. it_area = mp_area_over_time_vehicle->find(id);
  5480. if(it_area != mp_area_over_time_vehicle->end()){
  5481. mp_area_over_time_vehicle->erase(it_area);
  5482. }
  5483. it_area = mp_area_forbidden_vehicle->find(id);
  5484. if(it_area != mp_area_forbidden_vehicle->end()){
  5485. mp_area_forbidden_vehicle->erase(it_area);
  5486. }
  5487. break;
  5488. }
  5489. default:
  5490. break;
  5491. }
  5492. strlog.Format(_T("%s%s"), _T(LOG_EDIT_AREA), _T(LOG_SUCCESS));
  5493. show_log(strlog);
  5494. }
  5495. void CYAServerDlg::deal_call_edit_reader(int id, EDIT_TYPE_ID edit_type_id)
  5496. {
  5497. CString strlog;
  5498. switch (edit_type_id)
  5499. {
  5500. case ET_INSERT:
  5501. {
  5502. init_reader(id);
  5503. #ifdef ALGORITHM_TYPE_TOF
  5504. init_all_readers_coverage();
  5505. #elif defined ALGORITHM_TYPE_TDOA
  5506. init_tdoa_all_readers_coverage(id);
  5507. #endif
  5508. break;
  5509. }
  5510. case ET_UPDATE:
  5511. {
  5512. init_reader(id);
  5513. #ifdef ALGORITHM_TYPE_TOF
  5514. init_all_readers_coverage();
  5515. #elif defined ALGORITHM_TYPE_TDOA
  5516. init_tdoa_all_readers_coverage(id);
  5517. #endif
  5518. break;
  5519. }
  5520. case ET_DELETE:
  5521. {
  5522. TRACE(_T("delete reader. \r\n"));
  5523. ReaderMap::iterator it_reader = mp_reader_list.find(id);
  5524. MapInfoMap::iterator it_map = mp_map_list.find(it_reader->second->map_id);
  5525. if(it_map != mp_map_list.end()){
  5526. ReaderMap::iterator it_map_reader = it_map->second->map_reader_list.find(id);
  5527. if(it_map_reader != it_map->second->map_reader_list.end()){
  5528. it_map->second->map_reader_list.erase(it_map_reader);
  5529. }
  5530. }
  5531. if(it_reader != mp_reader_list.end()){
  5532. mp_reader_list.erase(it_reader);
  5533. }
  5534. break;
  5535. }
  5536. default:
  5537. break;
  5538. }
  5539. strlog.Format(_T("%s%s"), _T(LOG_EDIT_READER), _T(LOG_SUCCESS));
  5540. show_log(strlog);
  5541. }
  5542. void CYAServerDlg::deal_call_edit_card(string id, EDIT_TYPE_ID edit_type_id)
  5543. {
  5544. CString strlog;
  5545. CardMap::iterator it_card = mp_card_list_all.find(id);
  5546. if(it_card == mp_card_list_all.end()){
  5547. return;
  5548. }
  5549. int card_type_id = it_card->second->card_type;
  5550. switch (edit_type_id)
  5551. {
  5552. case ET_INSERT:
  5553. {
  5554. if(CT_VEHICLE == card_type_id){
  5555. init_vehicle(id, true);
  5556. }else if(CT_PERSON == card_type_id) {
  5557. init_staffer(id, true);
  5558. }else if(CT_ADHOC == card_type_id){
  5559. init_adhoc(id, true);
  5560. }
  5561. break;
  5562. }
  5563. case ET_UPDATE:
  5564. {
  5565. if(CT_VEHICLE == card_type_id){
  5566. init_vehicle(id, true);
  5567. }else if(CT_PERSON == card_type_id) {
  5568. init_staffer(id, true);
  5569. }else if(CT_ADHOC == card_type_id){
  5570. init_adhoc(id, true);
  5571. }
  5572. break;
  5573. }
  5574. case ET_DELETE:
  5575. {
  5576. remove_card(id);
  5577. break;
  5578. }
  5579. default:
  5580. break;
  5581. }
  5582. strlog.Format(_T("%s%s"), _T(LOG_EDIT_CARD), _T(LOG_SUCCESS));
  5583. show_log(strlog);
  5584. }
  5585. void CYAServerDlg::deal_call_edit_staff(string id, EDIT_TYPE_ID edit_type_id)
  5586. {
  5587. CString strlog;
  5588. switch (edit_type_id)
  5589. {
  5590. case ET_INSERT:
  5591. {
  5592. init_staffer(id);
  5593. break;
  5594. }
  5595. case ET_UPDATE:
  5596. {
  5597. init_staffer(id);
  5598. break;
  5599. }
  5600. case ET_DELETE:
  5601. {
  5602. string cardid = "";
  5603. CardMap::iterator it_card = mp_card_list_down_person.begin();
  5604. for(; it_card != mp_card_list_down_person.end(); ++it_card){
  5605. if(it_card->second->id == id){
  5606. cardid = it_card->second->card_id;
  5607. break;
  5608. }
  5609. }
  5610. remove_card(cardid);
  5611. break;
  5612. }
  5613. default:
  5614. break;
  5615. }
  5616. strlog.Format(_T("%s%s"), _T(LOG_EDIT_STAFFER), _T(LOG_SUCCESS));
  5617. show_log(strlog);
  5618. }
  5619. void CYAServerDlg::deal_call_edit_vehicle(string id, EDIT_TYPE_ID edit_type_id)
  5620. {
  5621. CString strlog;
  5622. switch (edit_type_id)
  5623. {
  5624. case ET_INSERT:
  5625. {
  5626. init_vehicle(id);
  5627. break;
  5628. }
  5629. case ET_UPDATE:
  5630. {
  5631. init_vehicle(id);
  5632. break;
  5633. }
  5634. case ET_DELETE:
  5635. {
  5636. string cardid = "";
  5637. CardMap::iterator it_card = mp_card_list_down_vehicle.begin();
  5638. for(; it_card != mp_card_list_down_vehicle.end(); ++it_card){
  5639. if(it_card->second->id == id){
  5640. cardid = it_card->second->card_id;
  5641. break;
  5642. }
  5643. }
  5644. remove_card(cardid);
  5645. break;
  5646. }
  5647. default:
  5648. break;
  5649. }
  5650. strlog.Format(_T("%s%s"), _T(LOG_EDIT_VEHICLE), _T(LOG_SUCCESS));
  5651. show_log(strlog);
  5652. }
  5653. void CYAServerDlg::deal_call_edit_adhoc(string id, EDIT_TYPE_ID edit_type_id)
  5654. {
  5655. CString strlog;
  5656. switch (edit_type_id)
  5657. {
  5658. case ET_INSERT:
  5659. {
  5660. init_adhoc(id);
  5661. break;
  5662. }
  5663. case ET_UPDATE:
  5664. {
  5665. init_adhoc(id);
  5666. break;
  5667. }
  5668. case ET_DELETE:
  5669. {
  5670. string cardid = "";
  5671. CardMap::iterator it_card = mp_card_list_down_adhoc.begin();
  5672. for(; it_card != mp_card_list_down_adhoc.end(); ++it_card){
  5673. if(it_card->second->id == id){
  5674. cardid = it_card->second->card_id;
  5675. break;
  5676. }
  5677. }
  5678. remove_card(cardid);
  5679. break;
  5680. }
  5681. default:
  5682. break;
  5683. }
  5684. strlog.Format(_T("%s%s"), _T(LOG_EDIT_ADHOC), _T(LOG_SUCCESS));
  5685. show_log(strlog);
  5686. }
  5687. int CYAServerDlg::deal_call_edit_section(int id,EDIT_TYPE_ID edit_type_id)
  5688. {
  5689. switch (edit_type_id)
  5690. {
  5691. case ET_INSERT:
  5692. {
  5693. init_section(id);
  5694. break;
  5695. }
  5696. case ET_UPDATE:
  5697. {
  5698. init_section(id);
  5699. break;
  5700. }
  5701. case ET_DELETE:
  5702. {
  5703. //删除路段后要将硐室表和灯组表中灯的路段信息改写
  5704. ChamberMap::iterator it_chamber = mp_chamber_list.begin();
  5705. for (;it_chamber != mp_chamber_list.end();++it_chamber)
  5706. {
  5707. if (it_chamber->second->m_nSectionID == id)
  5708. {
  5709. it_chamber->second->m_nSectionID = 0;
  5710. break;
  5711. }
  5712. }
  5713. LightGroupMap::iterator it_light_group = mp_light_group_list.begin();
  5714. for (;it_light_group != mp_light_group_list.end();++it_light_group)
  5715. {
  5716. if (it_light_group->second->m_nSectionId == id)
  5717. {
  5718. it_light_group->second->m_nSectionId = 0;
  5719. break;
  5720. }
  5721. }
  5722. //删除路段信息
  5723. SectionMap::iterator it_section = mp_section_list.find(id);
  5724. if (it_section != mp_section_list.end())
  5725. {
  5726. mp_section_list.erase(it_section);
  5727. }
  5728. break;
  5729. }
  5730. default:
  5731. break;
  5732. }
  5733. CString cstrLog = _T("");
  5734. cstrLog.Format(_T("%s%s"), _T(LOG_EDIT_SECTION), _T(LOG_SUCCESS));
  5735. show_log(cstrLog);
  5736. return 0;
  5737. }
  5738. int CYAServerDlg::deal_call_edit_light(int id,EDIT_TYPE_ID edit_type_id)
  5739. {
  5740. switch (edit_type_id)
  5741. {
  5742. case ET_INSERT:
  5743. {
  5744. init_traffic_lights(id);
  5745. break;
  5746. }
  5747. case ET_UPDATE:
  5748. {
  5749. init_traffic_lights(id);
  5750. break;
  5751. }
  5752. case ET_DELETE:
  5753. {
  5754. bool bFind = false;
  5755. //灯组中删除
  5756. LightGroupMap::iterator it_light_group = mp_light_group_list.begin();
  5757. for (;it_light_group != mp_light_group_list.end();++it_light_group)
  5758. {
  5759. LightMap::iterator it_light = it_light_group->second->mp_lights_list.find(id);
  5760. if (it_light != it_light_group->second->mp_lights_list.end())
  5761. {
  5762. it_light_group->second->mp_lights_list.erase(it_light);
  5763. break;
  5764. }
  5765. }
  5766. bFind = false;
  5767. //路段中删除
  5768. SectionMap::iterator it_section = mp_section_list.begin();
  5769. for (;it_section != mp_section_list.end();++it_section)
  5770. {
  5771. LightMap::iterator it_light = it_section->second->mp_light_list.begin();
  5772. for (;it_light != it_section->second->mp_light_list.end();++it_light)
  5773. {
  5774. if (it_light->second->m_nID == id)
  5775. {
  5776. bFind = true;
  5777. it_section->second->mp_light_list.erase(it_light);
  5778. break;
  5779. }
  5780. }
  5781. if (bFind)
  5782. {
  5783. break;
  5784. }
  5785. }
  5786. //从灯表中删除
  5787. LightMap::iterator it = mp_light_list.find(id);
  5788. if (it != mp_light_list.end())
  5789. {
  5790. mp_light_list.erase(it);
  5791. }
  5792. break;
  5793. }
  5794. default:
  5795. break;
  5796. }
  5797. CString cstrLog = _T("");
  5798. cstrLog.Format(_T("%s%s"), _T(LOG_EDIT_LIGHT), _T(LOG_SUCCESS));
  5799. show_log(cstrLog);
  5800. return 0;
  5801. }
  5802. int CYAServerDlg::deal_call_edit_chamber(int id,EDIT_TYPE_ID edit_type_id)
  5803. {
  5804. switch (edit_type_id)
  5805. {
  5806. case ET_INSERT:
  5807. {
  5808. init_chamber(id);
  5809. break;
  5810. }
  5811. case ET_UPDATE:
  5812. {
  5813. init_chamber(id);
  5814. break;
  5815. }
  5816. case ET_DELETE:
  5817. {
  5818. //路段中删除硐室
  5819. SectionMap::iterator it_section = mp_section_list.begin();
  5820. for (;it_section != mp_section_list.end();++it_section)
  5821. {
  5822. ChamberMap::iterator it_chamber = mp_chamber_list.begin();
  5823. for (;it_chamber != mp_chamber_list.end();++it_chamber)
  5824. {
  5825. if (it_chamber->second->m_nID == id)
  5826. {
  5827. mp_chamber_list.erase(it_chamber);
  5828. break;
  5829. }
  5830. }
  5831. }
  5832. //硐室表中删除
  5833. ChamberMap::iterator it = mp_chamber_list.find(id);
  5834. if (it != mp_chamber_list.end())
  5835. {
  5836. mp_chamber_list.erase(it);
  5837. }
  5838. break;
  5839. }
  5840. default:
  5841. break;
  5842. }
  5843. CString cstrLog = _T("");
  5844. cstrLog.Format(_T("%s%s"), _T(LOG_EDIT_CHAMBER), _T(LOG_SUCCESS));
  5845. show_log(cstrLog);
  5846. return 0;
  5847. }
  5848. void CYAServerDlg::remove_card( string card_id )
  5849. {
  5850. if(card_id.length() == 0)
  5851. return;
  5852. int card_type_id = 0;
  5853. CardMap::iterator it_card = mp_card_list_all.find(card_id);
  5854. if(it_card == mp_card_list_all.end()){
  5855. return;
  5856. }
  5857. card_type_id = it_card->second->card_type;
  5858. mp_card_list_all.erase(it_card);
  5859. MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id);
  5860. if(it_map != mp_map_list.end()){
  5861. if(CT_VEHICLE == card_type_id){
  5862. CardMap::iterator it_map_card = it_map->second->map_card_list_vehicle.find(card_id);
  5863. if(it_map_card != it_map->second->map_card_list_vehicle.end()){
  5864. it_map->second->map_card_list_vehicle.erase(it_map_card);
  5865. }
  5866. }else if(CT_PERSON == card_type_id){
  5867. CardMap::iterator it_map_card = it_map->second->map_card_list_person.find(card_id);
  5868. if(it_map_card != it_map->second->map_card_list_person.end()){
  5869. it_map->second->map_card_list_person.erase(it_map_card);
  5870. }
  5871. }
  5872. }
  5873. AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id);
  5874. if(it_area != mp_area_list.end()){
  5875. if(CT_VEHICLE == card_type_id){
  5876. CardMap::iterator it_area_card = it_area->second->area_card_list_vehicle->find(card_id);
  5877. if(it_area_card != it_area->second->area_card_list_vehicle->end()){
  5878. it_area->second->area_card_list_vehicle->erase(it_area_card);
  5879. }
  5880. }else if(CT_PERSON == card_type_id){
  5881. CardMap::iterator it_area_card = it_area->second->area_card_list_person->find(card_id);
  5882. if(it_area_card != it_area->second->area_card_list_person->end()){
  5883. it_area->second->area_card_list_person->erase(it_area_card);
  5884. }
  5885. }
  5886. }
  5887. DeptMap::iterator it_dept = mp_dept_list.find(it_card->second->dept_id);
  5888. if(it_dept != mp_dept_list.end()){
  5889. if(CT_VEHICLE == card_type_id){
  5890. CardMap::iterator it_dept_card = it_dept->second->dept_card_list_vehicle.find(card_id);
  5891. if(it_dept_card != it_dept->second->dept_card_list_vehicle.end()){
  5892. it_dept->second->dept_card_list_vehicle.erase(it_dept_card);
  5893. }
  5894. }else if(CT_PERSON == card_type_id){
  5895. CardMap::iterator it_dept_card = it_dept->second->dept_card_list_person.find(card_id);
  5896. if(it_dept_card != it_dept->second->dept_card_list_person.end()){
  5897. it_dept->second->dept_card_list_person.erase(it_dept_card);
  5898. }
  5899. }
  5900. }
  5901. if(CT_VEHICLE == card_type_id){
  5902. it_card = mp_card_list_down_vehicle.find(card_id);
  5903. if(it_card != mp_card_list_down_vehicle.end()){
  5904. mp_card_list_down_vehicle.erase(it_card);
  5905. }
  5906. it_card = mp_card_list_forbidden_vehicle->find(card_id);
  5907. if(it_card != mp_card_list_forbidden_vehicle->end()){
  5908. mp_card_list_forbidden_vehicle->erase(it_card);
  5909. }
  5910. it_card = mp_card_list_over_time_vehicle->find(card_id);
  5911. if(it_card != mp_card_list_over_time_vehicle->end()){
  5912. mp_card_list_over_time_vehicle->erase(it_card);
  5913. }
  5914. it_card = mp_card_list_area_over_time_vehicle->find(card_id);
  5915. if(it_card != mp_card_list_area_over_time_vehicle->end()){
  5916. mp_card_list_area_over_time_vehicle->erase(it_card);
  5917. }
  5918. it_card = mp_card_list_over_speed_vehicle->find(card_id);
  5919. if(it_card != mp_card_list_over_speed_vehicle->end()){
  5920. mp_card_list_over_speed_vehicle->erase(it_card);
  5921. }
  5922. }else if(CT_PERSON == card_type_id) {
  5923. it_card = mp_card_list_down_person.find(card_id);
  5924. if(it_card != mp_card_list_down_person.end()){
  5925. mp_card_list_down_person.erase(it_card);
  5926. }
  5927. it_card = mp_card_list_over_time_person->find(card_id);
  5928. if(it_card != mp_card_list_over_time_person->end()){
  5929. mp_card_list_over_time_person->erase(it_card);
  5930. }
  5931. it_card = mp_card_list_forbidden_person->find(card_id);
  5932. if(it_card != mp_card_list_forbidden_person->end()){
  5933. mp_card_list_forbidden_person->erase(it_card);
  5934. }
  5935. it_card = mp_card_list_help->find(card_id);
  5936. if(it_card != mp_card_list_help->end()){
  5937. mp_card_list_help->erase(it_card);
  5938. }
  5939. it_card = mp_card_list_area_over_time_person->find(card_id);
  5940. if(it_card != mp_card_list_area_over_time_person->end()){
  5941. mp_card_list_area_over_time_person->erase(it_card);
  5942. }
  5943. }
  5944. }
  5945. void CYAServerDlg::save_card_postion(std::shared_ptr<Card> card /* Card* card*/ )
  5946. {
  5947. if (abs(card->x - INVALID_COORDINATE) < 1E-4 && abs(card->x - INVALID_COORDINATE) <1E-4 && abs(card->z - INVALID_COORDINATE) < 1E-4)
  5948. {
  5949. //如果回到错误点
  5950. return;
  5951. }
  5952. // 位置发生变化
  5953. double moved_dist = sqrt(pow(card->x - card->stored_x, 2) + pow(card->y - card->stored_y, 2) +
  5954. pow(card->z - card->stored_z, 2));
  5955. //double moved_dist = sqrt(pow(card->x - card->stored_x, 2) + pow(card->y - card->stored_y, 2));
  5956. //if(moved_dist > card->map_scale * 20){ //移动距离大于20m,认为出错
  5957. // card->x = card->last_x;
  5958. // card->y = card->last_y;
  5959. // card->z = card->last_z;
  5960. // return;
  5961. //}
  5962. // 位置变化幅度大于1m
  5963. if( moved_dist * card->map_scale < 1.0/2.0){ // 移动位置小于半米,不记录数据
  5964. return ;
  5965. }
  5966. card->stored_x = card->x;
  5967. card->stored_y = card->y;
  5968. card->stored_z = card->z;
  5969. //card->is_first_location = false;
  5970. store_data_card(card, HIS_LOCATION);
  5971. }
  5972. void CYAServerDlg::store_data_area(std::shared_ptr<Area> area /*Area* area*/, time_t cur_time, time_t start_time, int tag )
  5973. {
  5974. char sql[LENGTH_SQL] = {'\0'};
  5975. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  5976. struct tm local_time, local_time_ex;
  5977. localtime_s(&local_time, &cur_time);
  5978. localtime_s(&local_time_ex, &start_time);
  5979. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  5980. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  5981. switch(tag){
  5982. case ALARM_AREA_OVER_COUNT_PERSON_START:
  5983. {
  5984. int alarm_type_id = ATID_AREA_OVER_COUNT_PERSON;
  5985. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_area(area_id, alarm_type_id, start_time) VALUES(%d, %d, '%s');",
  5986. area->area_id, alarm_type_id, _time);
  5987. break;
  5988. }
  5989. case ALARM_AREA_OVER_COUNT_PERSON_END:
  5990. {
  5991. localtime_s(&local_time_ex, &area->time_over_count_person);
  5992. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  5993. int alarm_type_id = ATID_AREA_OVER_COUNT_PERSON;
  5994. sprintf_s(sql, LENGTH_SQL,
  5995. "UPDATE his_alarm_area SET end_time = '%s' WHERE area_id=%d AND alarm_type_id=%d AND start_time = '%s';",
  5996. _time, area->area_id, alarm_type_id, _time_ex);
  5997. break;
  5998. }
  5999. default:
  6000. return;
  6001. }
  6002. execute_sql(sql);
  6003. }
  6004. void CYAServerDlg::store_data_reader(std::shared_ptr<Reader> reader /*Reader* reader*/, int tag )
  6005. {
  6006. char sql[LENGTH_SQL] = {'\0'};
  6007. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  6008. struct tm local_time, local_time_ex;
  6009. localtime_s(&local_time, &reader->lost_time);
  6010. localtime_s(&local_time_ex, &reader->rec_time);
  6011. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  6012. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  6013. switch(tag){
  6014. case ALARM_READER_LOST_START:
  6015. {
  6016. int alarm_type_id = ATID_READER;
  6017. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_reader(reader_id, alarm_type_id, start_time, rec_time) VALUES(%d, %d, '%s', '%s');",
  6018. reader->reader_id, alarm_type_id, _time, _time_ex);
  6019. break;
  6020. }
  6021. case ALARM_READER_LOST_END:
  6022. {
  6023. int alarm_type_id = ATID_READER;
  6024. 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';",
  6025. _time_ex, reader->reader_id, alarm_type_id, _time);
  6026. break;
  6027. }
  6028. default:
  6029. return;
  6030. }
  6031. execute_sql(sql);
  6032. }
  6033. /*
  6034. * 存储红绿灯信息到数据库
  6035. *
  6036. * param
  6037. * light --- 红绿灯对象
  6038. * tag --- 事件类型
  6039. *
  6040. * return
  6041. * 函数正常执行返回0,否则返回1
  6042. */
  6043. int CYAServerDlg::store_data_light(std::shared_ptr<Light> light,int tag)
  6044. {
  6045. char sql[LENGTH_SQL] = {'\0'};
  6046. time_t tCurTime;
  6047. std::string strCurTime = "";
  6048. std::string strStartTime = "";
  6049. tCurTime = time(NULL);
  6050. strCurTime = CFunctions::time_t2string(tCurTime);
  6051. //1为网络故障,2为控制失败,3为灯故障
  6052. int nAlarmTypeId = 0;
  6053. switch (tag)
  6054. {
  6055. case ALARM_LIGHT_NETWORK_START:
  6056. case ALARM_LIGHT_NETWORK_END:
  6057. nAlarmTypeId = 1;
  6058. break;
  6059. case ALARM_LIGHT_CONTROL_FAILE:
  6060. nAlarmTypeId = 2;
  6061. break;
  6062. case ALARM_LIGHT_FAULT_START:
  6063. case ALARM_LIGHT_FAULT_END:
  6064. nAlarmTypeId = 2;
  6065. break;
  6066. }
  6067. switch (tag)
  6068. {
  6069. case ALARM_LIGHT_NETWORK_START://insert
  6070. case ALARM_LIGHT_CONTROL_FAILE:
  6071. case ALARM_LIGHT_FAULT_START:
  6072. sprintf_s(
  6073. sql,
  6074. LENGTH_SQL,
  6075. "insert into his_alarm_light(light_id,alarm_type_id,start_time) values(%d,%d,'%s');",
  6076. light->m_nID,
  6077. nAlarmTypeId,
  6078. strCurTime.c_str());
  6079. break;
  6080. case ALARM_LIGHT_NETWORK_END://update
  6081. case ALARM_LIGHT_FAULT_END:
  6082. strStartTime = CFunctions::time_t2string(light->alarm_start_time);
  6083. sprintf_s(
  6084. sql,
  6085. LENGTH_SQL,
  6086. "UPDATE his_alarm_light SET end_time = '%s' WHERE light_id=%d AND alarm_type_id=%d AND start_time = '%s';",
  6087. strCurTime.c_str(),
  6088. light->m_nID,
  6089. nAlarmTypeId,
  6090. strStartTime.c_str());
  6091. break;
  6092. }
  6093. execute_sql(sql);
  6094. return 0;
  6095. }
  6096. int CYAServerDlg::store_data_traffic_red_light(std::shared_ptr<Light> light,std::shared_ptr<Card> card)
  6097. {
  6098. char sql[LENGTH_SQL] = {'\0'};
  6099. time_t tCurTime;
  6100. tCurTime = time(NULL);
  6101. std::string s = CFunctions::time_t2string(tCurTime);
  6102. sprintf_s(
  6103. sql,
  6104. LENGTH_SQL,
  6105. "insert into his_traffic_red_light (vehicle_id,cur_time,light_id,driver_id) values('%s','%s',%d,'%s');",
  6106. card->card_id.c_str(),
  6107. s.c_str(),
  6108. light->m_nID,
  6109. card->driver_id.c_str());
  6110. execute_sql(sql);
  6111. return 0;
  6112. }
  6113. /*
  6114. * 存储路段信息
  6115. *
  6116. */
  6117. int CYAServerDlg::store_data_section(std::shared_ptr<Section> section,time_t cur_time,int tag)
  6118. {
  6119. char sql[LENGTH_SQL] = {'\0'};
  6120. std::string strStartTime = CFunctions::time_t2string(section->alarm_start_time);
  6121. std::string strEndTime = "";
  6122. switch (tag)
  6123. {
  6124. case ALARM_SECTION_START:
  6125. sprintf_s(
  6126. sql,
  6127. LENGTH_SQL,
  6128. "insert into his_alarm_section(section_id,alarm_type_id,start_time) values(%d,%d,'%s');",
  6129. section->m_nID,
  6130. section->get_section_state(),
  6131. strStartTime.c_str());
  6132. break;
  6133. case ALARM_SECTION_END:
  6134. strEndTime = CFunctions::time_t2string(cur_time);
  6135. sprintf_s(
  6136. sql,
  6137. LENGTH_SQL,
  6138. "update his_alarm_section set end_time='%s' where section_id = %d and alarm_type_id = %d and start_time = '%s';",
  6139. strEndTime.c_str(),
  6140. section->m_nID,
  6141. section->get_section_state(),
  6142. strStartTime.c_str()
  6143. );
  6144. break;
  6145. default:
  6146. break;
  6147. }
  6148. execute_sql(sql);
  6149. return 0;
  6150. }
  6151. void CYAServerDlg::execute_sql( const char* sql )
  6152. {
  6153. m_qsmSQL->AddString(sql);
  6154. }
  6155. /*
  6156. * 日志菜单设置
  6157. * 将日志菜单设置内容同步更新到主对话框中的相应变量
  6158. *
  6159. * param
  6160. * 无
  6161. *
  6162. * return
  6163. * 无
  6164. */
  6165. void CYAServerDlg::OnMenuLog()
  6166. {
  6167. CLogSetting dlg;
  6168. dlg.DoModal();
  6169. //m_log_sys_status = dlg.m_log_sys_status;
  6170. m_log_raw_data = dlg.m_log_raw_data;
  6171. m_log_parse_data = dlg.m_log_parse_data;
  6172. m_log_recv_package = dlg.m_log_recv_package;
  6173. m_log_send_package = dlg.m_log_send_package;
  6174. m_log_locate_data = dlg.m_log_locate_data;
  6175. }
  6176. void CYAServerDlg::OnMenuParam()
  6177. {
  6178. CSysSetting dlg;
  6179. dlg.DoModal();
  6180. m_bUseFilter = dlg.m_use_filter;
  6181. if(m_bUseFilter){
  6182. m_nFilterType = FILTER_KALMAN;
  6183. }else{
  6184. m_nFilterType = NO_FILTER;
  6185. }
  6186. CardMap::iterator it = mp_card_list_all.begin();
  6187. for(it;it!=mp_card_list_all.end();it++){
  6188. it->second->m_nFilterType = m_nFilterType;
  6189. if(it->second->m_pKalmanFilter == NULL && m_nFilterType != NO_FILTER){
  6190. if(theApp.use_filter_odd){
  6191. std::string temp = it->second->card_id;
  6192. int a = atoi(temp.substr(temp.length() - 1 , 1).c_str());
  6193. if(0 == a%2){
  6194. it->second->EnableFilter(m_nFilterType);
  6195. }
  6196. }else{
  6197. it->second->EnableFilter(m_nFilterType);
  6198. }
  6199. }
  6200. }
  6201. }
  6202. void CYAServerDlg::OnLogin(string const& name, message::ptr const& data, bool isAck, message::list &ack_resp)
  6203. {
  6204. int res_code = (int)data->get_map()["code"]->get_int();
  6205. switch (res_code)
  6206. {
  6207. case -100: // 用户未登录
  6208. {
  6209. //ws_login();
  6210. is_websocket_login = false;
  6211. break;
  6212. }
  6213. case 0:
  6214. {
  6215. if("" == data->get_map()["code"]->get_string()){ // 登录成功
  6216. is_websocket_login = true;
  6217. }else{ // 退出登录
  6218. is_websocket_login = false;
  6219. }
  6220. break;
  6221. }
  6222. default:
  6223. break;
  6224. }
  6225. }
  6226. void CYAServerDlg::OnLoginCallBack( message::list const& msglist /*= nullptr*/ )
  6227. {
  6228. message::ptr msg_ptr = msglist[0];
  6229. int n = (int)msg_ptr->get_map()["code"]->get_int();
  6230. is_websocket_login = (0 == n) ? true : false;
  6231. }
  6232. void CYAServerDlg::send_call_info()
  6233. {
  6234. EnterCriticalSection(&m_csCallInfo);
  6235. BYTE buf[LENGTH_SEND_BUF];
  6236. SocketMap::iterator it_sock;
  6237. CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin();
  6238. if(it_call_reader == mp_call_info.end()){
  6239. LeaveCriticalSection(&m_csCallInfo);
  6240. return;
  6241. }
  6242. if(!it_call_reader->second->is_start_call){
  6243. LeaveCriticalSection(&m_csCallInfo);
  6244. return;
  6245. }
  6246. for(; it_call_reader != mp_call_info.end(); ++it_call_reader){
  6247. it_sock = mp_socket_list.begin();
  6248. for(it_sock;it_sock!=mp_socket_list.end();++it_sock){
  6249. if(it_sock->second->reader_id == it_call_reader->first){
  6250. break;
  6251. }
  6252. }
  6253. if(it_sock != mp_socket_list.end()){
  6254. memset(buf, 0, LENGTH_SEND_BUF);
  6255. int npos = 0, card_count = 0;
  6256. //卡数
  6257. card_count = it_call_reader->second->cards_count;
  6258. memcpy(&buf[npos], &card_count, sizeof(BYTE));
  6259. npos += sizeof(BYTE);
  6260. //呼叫类型
  6261. memcpy(&buf[npos], &it_call_reader->second->call_type, sizeof(BYTE));
  6262. npos += sizeof(BYTE);
  6263. if(!it_call_reader->second->is_call_all){ // 定员呼叫,加入卡列表
  6264. //循环添加卡信息
  6265. CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin();
  6266. for(; it_call_card != it_call_reader->second->mpCard.end(); ++it_call_card){
  6267. //呼叫类型
  6268. memcpy(&buf[npos], &it_call_card->second->call_type, sizeof(BYTE));
  6269. npos += sizeof(BYTE);
  6270. //卡类型
  6271. memcpy(&buf[npos], &it_call_card->second->card_type, sizeof(BYTE));
  6272. npos += sizeof(BYTE);
  6273. //卡ID长度
  6274. BYTE id_len = (BYTE)get_card_id_len(it_call_card->second->card_type);
  6275. memcpy(&buf[npos], &id_len, sizeof(BYTE));
  6276. npos += sizeof(BYTE);
  6277. //卡ID
  6278. if(id_len > 1){ // 标准卡id为4个字节,自组网卡为1个字节
  6279. CFunctions::memcpyDWord(buf, it_call_card->second->card_id, npos);
  6280. }else{
  6281. memcpy(&buf[npos], &it_call_card->second->card_id, id_len);
  6282. }
  6283. npos += id_len;
  6284. }
  6285. memcpy(&buf[0], &card_count, sizeof(BYTE));
  6286. }
  6287. SendData(it_sock->second->dwConnID,CHAR_CALL, npos, buf);
  6288. }
  6289. }
  6290. LeaveCriticalSection(&m_csCallInfo);
  6291. }
  6292. void CYAServerDlg::clear_call_info()
  6293. {
  6294. EnterCriticalSection(&m_csCallInfo);
  6295. CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin();
  6296. time_t current_time = time(NULL);
  6297. for(; it_call_reader != mp_call_info.end(); ++it_call_reader){
  6298. if(it_call_reader->second->is_call_all){
  6299. }else{
  6300. CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin();
  6301. for(; it_call_card != it_call_reader->second->mpCard.end();){
  6302. if(difftime(current_time, it_call_card->second->start_time) > it_call_card->second->time_out * 60 ){
  6303. it_call_reader->second->mpCard.erase(it_call_card++);
  6304. it_call_reader->second->is_start_call = false;
  6305. }
  6306. }
  6307. }
  6308. }
  6309. LeaveCriticalSection(&m_csCallInfo);
  6310. }
  6311. int CYAServerDlg::get_card_id_len( int card_type )
  6312. {
  6313. switch (card_type)
  6314. {
  6315. //case CT_PERSON:
  6316. // return 4;
  6317. //case CT_VEHICLE:
  6318. // return 4;
  6319. case CT_ADHOC:
  6320. return 1;
  6321. default:
  6322. return 4;
  6323. //break;
  6324. }
  6325. }
  6326. std::string CYAServerDlg::get_json_call_test()
  6327. {
  6328. Json::Value root;
  6329. Json::Value val_data;
  6330. Json::Value val_stations;
  6331. Json::Value val_station;
  6332. Json::Value val_cards;
  6333. Json::Value val_card;
  6334. char _time[STR_LEN_TIME];
  6335. struct tm local_time;
  6336. //TRACE(_T("time memcpy 7\n"));
  6337. time_t tt = time(NULL);
  6338. localtime_s(&local_time, &tt);
  6339. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  6340. val_data[JSON_KEY_CALL_CARD_CALL_TIME] = _time;
  6341. val_data[JSON_KEY_CALL_CARD_CALL_TYPE] = 0;
  6342. val_data[JSON_KEY_CALL_CARD_USER_NAME] = "aaaaaa";
  6343. val_data[JSON_KEY_CALL_CARD_CALL_TIME_OUT] = 5;
  6344. val_station[JSON_KEY_CALL_CARD_STATION_ID] = 233;
  6345. val_stations.append(val_station);
  6346. val_station[JSON_KEY_CALL_CARD_STATION_ID] = 59;
  6347. val_stations.append(val_station);
  6348. val_card[JSON_KEY_CALL_CARD_CARD_TYPE_ID] = 3;
  6349. val_card[JSON_KEY_CALL_CARD_CARD_ID] = 5;
  6350. val_cards.append(val_card);
  6351. val_card[JSON_KEY_CALL_CARD_CARD_TYPE_ID] = 3;
  6352. val_card[JSON_KEY_CALL_CARD_CARD_ID] = 8;
  6353. val_cards.append(val_card);
  6354. val_data[JSON_KEY_CALL_CARD_STATIONS] = val_stations;
  6355. val_data[JSON_KEY_CALL_CARD_CARDS] = val_cards;
  6356. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_CALL_CARD_START;
  6357. root[JSON_ROOT_KEY_DATA] = val_data;
  6358. return root.toFastString();
  6359. }
  6360. void CYAServerDlg::init_base_data()
  6361. {
  6362. init_setting();
  6363. init_alarm_type();
  6364. init_dept();
  6365. init_map();
  6366. init_area();
  6367. init_reader();
  6368. #ifdef ALGORITHM_TYPE_TOF
  6369. init_all_readers_coverage();
  6370. #elif defined ALGORITHM_TYPE_TDOA
  6371. init_tdoa_all_readers_coverage();
  6372. #endif
  6373. init_dev_adhoc();
  6374. init_antenna_sync();
  6375. init_card();
  6376. init_staffer();
  6377. init_vehicle();
  6378. init_adhoc();
  6379. init_chamber();
  6380. init_traffic_lights();
  6381. init_section();
  6382. init_light_group();
  6383. //init_patrol_info();
  6384. debug_print_syslog(0, "Base data init success.");
  6385. }
  6386. void CYAServerDlg::load_his_data()
  6387. {
  6388. //load_his_reader(); // 分站状态
  6389. //load_his_card_postion(); // 所在位置
  6390. //load_his_card_state();
  6391. //deal_hist_card_postion();
  6392. }
  6393. void CYAServerDlg::load_his_area()
  6394. {
  6395. CMysqlConn* pConn = NULL;
  6396. CDBConnGuard pDbGuard(pConn);
  6397. if(pConn == NULL){
  6398. return;
  6399. }
  6400. MYSQL_RES* pRes;
  6401. MYSQL_ROW pRow;
  6402. int err = 0;
  6403. char buf[LENGTH_SQL] = {0};
  6404. sprintf_s(buf, "select la.card_id, la.area_id, la.map_id, la.enter_time from his_location_area la \
  6405. where not exists(select 1 from his_location_area where card_id=la.card_id and enter_time> la.enter_time) \
  6406. and la.leave_time is null;");
  6407. pRes = pConn->Execute(buf, err);
  6408. int nRow = 0;
  6409. std::string enter_time;
  6410. while(pRow = mysql_fetch_row(pRes)){
  6411. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  6412. if(it != mp_card_list_all.end()){
  6413. it->second->area_id = atoi(pRow[1]);
  6414. it->second->map_id = atoi(pRow[2]);
  6415. enter_time = pRow[3];
  6416. API_StringToTime(enter_time, it->second->enter_area_time);
  6417. nRow++;
  6418. }
  6419. }
  6420. mysql_free_result(pRes);
  6421. CString strlog;
  6422. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_AREA), nRow, _T(LOG_RECORD_COUNT));
  6423. show_log(strlog);
  6424. }
  6425. void CYAServerDlg::load_his_card_postion()
  6426. {
  6427. CMysqlConn* pConn = NULL;
  6428. CDBConnGuard pDbGuard(pConn);
  6429. if(pConn == NULL){
  6430. return;
  6431. }
  6432. MYSQL_RES* pRes;
  6433. MYSQL_ROW pRow;
  6434. int err = 0;
  6435. char buf[LENGTH_SQL] = {0};
  6436. 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 \
  6437. from his_location l \
  6438. ,(select l.card_id, l.cur_time from his_location l where not exists(select 1 from his_location where card_id=l.card_id and cur_time>l.cur_time) and cur_time>= date_sub(now(), interval 2 hour)) lx \
  6439. ,(select la.card_id, la.map_id, la.area_id, la.enter_time from his_location_area la where not exists(select 1 from his_location_area where card_id=la.card_id and enter_time > la.enter_time) and la.leave_time is null) la \
  6440. ,(select att.card_id, att.start_time from rpt_attendance att where not exists(select 1 from rpt_attendance where card_id=att.card_id and start_time>att.start_time) and att.end_time is null) att \
  6441. where l.cur_time >= date_sub(now(), interval 2 hour) and l.card_id = lx.card_id and l.cur_time = lx.cur_time \
  6442. and l.card_id = la.card_id and l.area_id = la.area_id and l.cur_time >= la.enter_time \
  6443. and l.card_id = att.card_id and l.cur_time >= att.start_time;");
  6444. pRes = pConn->Execute(buf, err);
  6445. int nRow = 0;
  6446. std::string rec_time, enter_time, start_time;
  6447. while(pRow = mysql_fetch_row(pRes)){
  6448. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  6449. if(it != mp_card_list_all.end()){
  6450. rec_time = pRow[1];
  6451. API_StringToTime(rec_time, it->second->rec_time);
  6452. it->second->x = atof(pRow[2]);
  6453. it->second->y = atof(pRow[3]);
  6454. it->second->z = atof(pRow[4]);
  6455. it->second->last_x = it->second->x;
  6456. it->second->last_y = it->second->y;
  6457. it->second->last_z = it->second->z;
  6458. it->second->area_id = atoi(pRow[5]);
  6459. it->second->map_id = atoi(pRow[6]);
  6460. enter_time = pRow[7];
  6461. API_StringToTime(enter_time, it->second->enter_area_time);
  6462. start_time = pRow[8];
  6463. API_StringToTime(start_time, it->second->down_time);
  6464. it->second->pos_state = DT_DOWN;
  6465. it->second->pos_state_old = DT_DOWN;
  6466. //it->second->deal_time = time(NULL);
  6467. it->second->is_hist = true;
  6468. it->second->isdealed = true;
  6469. it->second->issent = false;
  6470. nRow++;
  6471. //card_down_mine(it->second, true);
  6472. //card_enter_map(it->second, true);
  6473. //card_enter_area(it->second, true);
  6474. //if(it->second->card_type == CT_VEHICLE){
  6475. // mp_card_list_down_vehicle.insert(make_pair(it->second->card_id, it->second));
  6476. //}else if(it->second->card_type == CT_PERSON){
  6477. // mp_card_list_down_person.insert(make_pair(it->second->card_id, it->second));
  6478. //}
  6479. }
  6480. }
  6481. mysql_free_result(pRes);
  6482. CString strlog;
  6483. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_POSTION), nRow, _T(LOG_RECORD_COUNT));
  6484. show_log(strlog);
  6485. }
  6486. int CYAServerDlg::API_TimeToString( string &strDateStr,const time_t &timeData )
  6487. {
  6488. char chTmp[100] = {0};
  6489. memset(chTmp, 0, sizeof(chTmp));
  6490. struct tm *p = 0;
  6491. localtime_s(p, &timeData);
  6492. //p = localtime(&timeData);
  6493. p->tm_year = p->tm_year + 1900;
  6494. p->tm_mon = p->tm_mon + 1;
  6495. sprintf_s(chTmp,sizeof(chTmp),"%.4d-%.2d-%.2d %.2d:%.2d:%.2d",
  6496. p->tm_year, p->tm_mon, p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
  6497. strDateStr = chTmp;
  6498. return 0;
  6499. }
  6500. int CYAServerDlg::API_StringToTime( const string &strDateStr,time_t &timeData )
  6501. {
  6502. char *pBeginPos = (char*) strDateStr.c_str();
  6503. char *pPos = strstr(pBeginPos,"-");
  6504. if(pPos == NULL){
  6505. //printf("strDateStr[%s] err /n", strDateStr.c_str());
  6506. return -1;
  6507. }
  6508. int iYear = atoi(pBeginPos);
  6509. int iMonth = atoi(pPos + 1);
  6510. pPos = strstr(pPos + 1,"-");
  6511. if(pPos == NULL){
  6512. //printf("strDateStr[%s] err /n", strDateStr.c_str());
  6513. return -1;
  6514. }
  6515. int iDay = atoi(pPos + 1);
  6516. int iHour=0;
  6517. int iMin=0;
  6518. int iSec=0;
  6519. pPos = strstr(pPos + 1," ");
  6520. //为了兼容有些没精确到时分秒的
  6521. if(pPos != NULL){
  6522. iHour=atoi(pPos + 1);
  6523. pPos = strstr(pPos + 1,":");
  6524. if(pPos != NULL){
  6525. iMin=atoi(pPos + 1);
  6526. pPos = strstr(pPos + 1,":");
  6527. if(pPos != NULL){
  6528. iSec=atoi(pPos + 1);
  6529. }
  6530. }
  6531. }
  6532. struct tm sourcedate;
  6533. memset((void*)&sourcedate, 0, sizeof(sourcedate));
  6534. sourcedate.tm_sec = iSec;
  6535. sourcedate.tm_min = iMin;
  6536. sourcedate.tm_hour = iHour;
  6537. sourcedate.tm_mday = iDay;
  6538. sourcedate.tm_mon = iMonth - 1;
  6539. sourcedate.tm_year = iYear - 1900;
  6540. timeData = mktime(&sourcedate);
  6541. return 0;
  6542. }
  6543. int CYAServerDlg::init_card( string card_id /*= ""*/ )
  6544. {
  6545. CMysqlConn* pConn = NULL;
  6546. CDBConnGuard pDbGuard(pConn);
  6547. if(pConn == NULL){
  6548. return 1;
  6549. }
  6550. MYSQL_RES* pRes;
  6551. MYSQL_ROW pRow;
  6552. int err = 0;
  6553. char buf[LENGTH_SQL] = {0};
  6554. if(card_id.length() == 0){
  6555. sprintf_s(buf, "select card_id, card_type_id, state, is_count, ident from dat_card where state = 0;");
  6556. }else{
  6557. 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());
  6558. }
  6559. pRes = pConn->Execute(buf, err);
  6560. if (err)
  6561. {
  6562. return 1;
  6563. }
  6564. std::shared_ptr<Card> pCard = nullptr;
  6565. int nRow = 0;
  6566. while(pRow = mysql_fetch_row(pRes)){
  6567. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  6568. if(it != mp_card_list_all.end()){
  6569. pCard = it->second;
  6570. }else{
  6571. pCard = std::make_shared<Card>(pRow[0], atoi(pRow[1]), theApp.z_offset);
  6572. #ifdef ALGORITHM_TYPE_TOF
  6573. pCard->set_reader_path(&mp_reader_path_list);
  6574. #elif defined ALGORITHM_TYPE_TDOA
  6575. pCard->set_reader_path_tdoa(mp_reader_path_list_tdoa);
  6576. #endif
  6577. mp_card_list_all.insert(make_pair(pCard->card_id, pCard));
  6578. nRow++;
  6579. //TRACE(_T("pCard.use_count() = %d \r\n"),pCard.use_count());
  6580. if(m_bUseFilter){
  6581. if(theApp.use_filter_odd){
  6582. std::string temp = pRow[1];
  6583. int a = atoi(temp.substr(temp.length() - 1 , 1).c_str());
  6584. if(0 == a%2){
  6585. pCard->EnableFilter(m_nFilterType);
  6586. }
  6587. }else{
  6588. pCard->EnableFilter(m_nFilterType);
  6589. }
  6590. }
  6591. }
  6592. }
  6593. mysql_free_result(pRes);
  6594. CString strlog;
  6595. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_CARD), nRow, _T(LOG_RECORD_COUNT));
  6596. show_log(strlog);
  6597. return 0;
  6598. }
  6599. void CYAServerDlg::card_up_mine(std::shared_ptr<Card> card /*Card* card*/)
  6600. {
  6601. card->up_time = CFunctions::systime_to_timet(card->deal_time);
  6602. store_data_card(card, RPT_ATTEND_UP);
  6603. if(CT_PERSON == card->card_type){
  6604. CardMap::iterator it_card = mp_card_list_down_person.find(card->card_id);
  6605. if(it_card != mp_card_list_down_person.end()){
  6606. mp_card_list_down_person.erase(it_card); // 从井下卡列表删除
  6607. }
  6608. if(mp_card_list_down_person.size() <= sls_setting.over_count_person && time_over_count_person >0){ // 取消报警
  6609. store_data_mine(ALARM_MINE_OVER_COUNT_PERSON_END);
  6610. time_over_count_person = 0;
  6611. }
  6612. }else if(CT_VEHICLE == card->card_type){
  6613. CardMap::iterator it_card = mp_card_list_down_vehicle.find(card->card_id);
  6614. if(it_card != mp_card_list_down_vehicle.end()){
  6615. mp_card_list_down_vehicle.erase(it_card); // 从井下卡列表删除
  6616. }
  6617. if(mp_card_list_down_vehicle.size() < sls_setting.over_count_vehicle && time_over_count_vehicle > 0){
  6618. store_data_mine(ALARM_MINE_OVER_COUNT_VEHICLE_END);
  6619. time_over_count_vehicle = 0;
  6620. }
  6621. }
  6622. DeptMap::iterator it_dept = mp_dept_list.find(card->dept_id);
  6623. if(it_dept != mp_dept_list.end()){
  6624. if(CT_PERSON == card->card_type){
  6625. CardMap::iterator it_card = it_dept->second->dept_card_list_person.find(card->card_id);
  6626. if(it_card != it_dept->second->dept_card_list_person.end()){
  6627. it_dept->second->dept_card_list_person.erase(it_card); // 从井下卡列表删除
  6628. }
  6629. store_data_card(card, ALARM_CARD_OVER_TIME_END);
  6630. //deal_alarm_card(card, &mp_card_list_over_time_person, false, AF_CARD_OVER_TIME);
  6631. deal_alarm_card(card, mp_card_list_over_time_person, false, AF_CARD_OVER_TIME);
  6632. }else if(CT_VEHICLE == card->card_type){
  6633. CardMap::iterator it_card = it_dept->second->dept_card_list_vehicle.find(card->card_id);
  6634. if(it_card != it_dept->second->dept_card_list_vehicle.end()){
  6635. it_dept->second->dept_card_list_vehicle.erase(it_card); // 从井下卡列表删除
  6636. }
  6637. store_data_card(card, ALARM_CARD_OVER_TIME_END);
  6638. //deal_alarm_card(card, &mp_card_list_over_time_vehicle, false, AF_CARD_OVER_TIME);
  6639. deal_alarm_card(card, mp_card_list_over_time_vehicle, false, AF_CARD_OVER_TIME);
  6640. }
  6641. }
  6642. }
  6643. void CYAServerDlg::card_down_mine(std::shared_ptr<Card> card /*Card* card*/ )
  6644. {
  6645. card->down_time = CFunctions::systime_to_timet(card->deal_time);
  6646. if(CT_PERSON == card->card_type){
  6647. CardMap::iterator it_card = mp_card_list_down_person.find(card->card_id);
  6648. if(it_card == mp_card_list_down_person.end()){
  6649. mp_card_list_down_person.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  6650. }
  6651. if(time_over_count_person == 0 && mp_card_list_down_person.size() > sls_setting.over_count_person){
  6652. time_over_count_person = time(NULL);
  6653. store_data_mine(ALARM_MINE_OVER_COUNT_PERSON_START);
  6654. }
  6655. }else if(CT_VEHICLE == card->card_type){
  6656. CardMap::iterator it_card = mp_card_list_down_vehicle.find(card->card_id);
  6657. if(it_card == mp_card_list_down_vehicle.end()){
  6658. mp_card_list_down_vehicle.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  6659. }
  6660. //如果井下车辆总数超过系统设置的车辆阈值,则存储车辆超员告警信息
  6661. if(time_over_count_vehicle == 0 && mp_card_list_down_vehicle.size() > sls_setting.over_count_vehicle){
  6662. time_over_count_vehicle = time(NULL);
  6663. store_data_mine(ALARM_MINE_OVER_COUNT_VEHICLE_START);
  6664. }
  6665. }
  6666. DeptMap::iterator it_dept = mp_dept_list.find(card->dept_id);
  6667. if(it_dept != mp_dept_list.end()){
  6668. if(CT_PERSON == card->card_type){
  6669. CardMap::iterator it_card = it_dept->second->dept_card_list_person.find(card->card_id);
  6670. if(it_card == it_dept->second->dept_card_list_person.end()){
  6671. it_dept->second->dept_card_list_person.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  6672. }
  6673. // 判断是否超员
  6674. }else if(CT_VEHICLE == card->card_type){
  6675. CardMap::iterator it_card = it_dept->second->dept_card_list_vehicle.find(card->card_id);
  6676. if(it_card == it_dept->second->dept_card_list_vehicle.end()){
  6677. it_dept->second->dept_card_list_vehicle.insert(make_pair(card->card_id, card)); // 添加到井下卡列表
  6678. }
  6679. // 判断是否超员
  6680. }
  6681. }
  6682. store_data_card(card, RPT_ATTEND_DOWN);
  6683. }
  6684. void CYAServerDlg::send_sync_reader()
  6685. {
  6686. time_t cur_time;
  6687. struct tm local;
  6688. int wlen = 0;
  6689. BYTE SendBuffer[LENGTH_SEND_BUF];
  6690. BYTE bt_tmp;
  6691. // 遍历发送数据
  6692. int nPos = 0;
  6693. SocketMap::iterator it_sock = mp_socket_list.begin();
  6694. for(; it_sock != mp_socket_list.end(); ++it_sock){
  6695. wlen = 0;
  6696. cur_time = time(NULL);
  6697. memset(SendBuffer, 0, LENGTH_SEND_BUF);
  6698. localtime_s(&local, &cur_time);
  6699. bt_tmp = local.tm_sec;
  6700. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6701. wlen += sizeof(BYTE);
  6702. bt_tmp = local.tm_min;
  6703. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6704. wlen += sizeof(BYTE);
  6705. bt_tmp = local.tm_hour;
  6706. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6707. wlen += sizeof(BYTE);
  6708. bt_tmp = local.tm_mday;
  6709. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6710. wlen += sizeof(BYTE);
  6711. bt_tmp = local.tm_wday;
  6712. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6713. wlen += sizeof(BYTE);
  6714. bt_tmp = local.tm_mon + 1;
  6715. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6716. wlen += sizeof(BYTE);
  6717. bt_tmp = (local.tm_year + 1900)%100;
  6718. memcpy(&SendBuffer[wlen], &bt_tmp, sizeof(BYTE));
  6719. wlen += sizeof(BYTE);
  6720. SendData(it_sock->second->dwConnID , CHAR_SYNC_TIME, wlen, SendBuffer);
  6721. Sleep(20);
  6722. //TRACE(_T("dwConnID: %d"),it_sock->second->dwConnID);
  6723. }
  6724. }
  6725. /*
  6726. * 向红绿灯发送心跳包
  6727. *
  6728. * param
  6729. * 无
  6730. *
  6731. * return
  6732. * 成功返回0,失败返回1
  6733. *
  6734. */
  6735. int CYAServerDlg::send_heart_package()
  6736. {
  6737. BYTE sendBuffer[1];
  6738. for (LightMap::iterator it = mp_light_list.begin();it != mp_light_list.end();++it)
  6739. {
  6740. memset(sendBuffer,0,1);
  6741. string strIp = it->second->m_strIP;
  6742. TCHAR* tcIp = CFunctions::c2wc(strIp.c_str());
  6743. DWORD dwConnID = 0;
  6744. SocketMap::iterator it_sock = mp_socket_list.find(tcIp);
  6745. if (it_sock != mp_socket_list.end())
  6746. {
  6747. SendData(it_sock->second->dwConnID,CHAR_HEART_BEAT,0,sendBuffer);
  6748. }
  6749. }
  6750. return 0;
  6751. }
  6752. void CYAServerDlg::send_call_his_data()
  6753. {
  6754. if(g_is_rec_hist){
  6755. if(MessageBox(_T("正在接受收历史数据,请稍后再试"), _T("接收历史数据"), MB_OK) == IDOK){
  6756. return;
  6757. }
  6758. }
  6759. if (MessageBox(_T("确定要接收历史数据吗?"), _T("接收历史数据"), MB_OKCANCEL) != IDOK){
  6760. return;
  6761. }
  6762. UpdateData(FALSE);
  6763. bool bExit = false;
  6764. SocketMap::iterator it_sock = mp_socket_list.begin();
  6765. for(; it_sock != mp_socket_list.end(); ++it_sock){
  6766. if(it_sock->second->reader_id == m_reader_id_hist){
  6767. int wlen = 0;
  6768. WORD wchr = CHAR_LOCATEDATAHIS_TDOA;
  6769. BYTE SendBuffer[LENGTH_SEND_BUF];
  6770. memset(SendBuffer, 0, LENGTH_SEND_BUF);
  6771. SendData(it_sock->second->dwConnID, wchr, wlen, SendBuffer);
  6772. bExit = true;
  6773. break;
  6774. }
  6775. }
  6776. if(!bExit){
  6777. //if (MessageBox(_T("此分站未连接"), _T("请求历史数据"), MB_OK) == IDOK){
  6778. //
  6779. //}
  6780. }
  6781. }
  6782. void CYAServerDlg::OnBnCallHisData()
  6783. {
  6784. send_call_his_data();
  6785. }
  6786. void CYAServerDlg::deal_hist_card_postion()
  6787. {
  6788. CardMap::iterator it_card = mp_card_list_all.begin();
  6789. for(; it_card != mp_card_list_all.end(); ++it_card){
  6790. if(it_card->second->is_hist){
  6791. if(CT_VEHICLE == it_card->second->card_type){
  6792. MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id);
  6793. if(it_map != mp_map_list.end()){
  6794. it_map->second->map_card_list_vehicle.insert(make_pair(it_card->first, it_card->second));
  6795. it_card->second->map_scale = it_map->second->map_scale;
  6796. }
  6797. mp_card_list_down_vehicle.insert(make_pair(it_card->first, it_card->second));
  6798. AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id);
  6799. if(it_area != mp_area_list.end()){
  6800. it_area->second->area_card_list_vehicle->insert(make_pair(it_card->first, it_card->second));
  6801. if(0 == it_area->second->over_count_vehicle){
  6802. mp_card_list_forbidden_vehicle->insert(make_pair(it_card->first, it_card->second));
  6803. }
  6804. }
  6805. }else if(CT_PERSON == it_card->second->card_type){
  6806. MapInfoMap::iterator it_map = mp_map_list.find(it_card->second->map_id);
  6807. if(it_map != mp_map_list.end()){
  6808. it_map->second->map_card_list_person.insert(make_pair(it_card->first, it_card->second));
  6809. it_card->second->map_scale = it_map->second->map_scale;
  6810. }
  6811. mp_card_list_down_person.insert(make_pair(it_card->first, it_card->second));
  6812. AreaMap::iterator it_area = mp_area_list.find(it_card->second->area_id);
  6813. if(it_area != mp_area_list.end()){
  6814. it_area->second->area_card_list_person->insert(make_pair(it_card->first, it_card->second));
  6815. if(0 == it_area->second->over_count_person){
  6816. mp_card_list_forbidden_person->insert(make_pair(it_card->first, it_card->second));
  6817. }
  6818. }
  6819. }
  6820. }
  6821. }
  6822. }
  6823. void CYAServerDlg::load_his_reader()
  6824. {
  6825. CMysqlConn* pConn = NULL;
  6826. CDBConnGuard pDbGuard(pConn);
  6827. if(pConn == NULL){
  6828. return;
  6829. }
  6830. MYSQL_RES* pRes;
  6831. MYSQL_ROW pRow;
  6832. int err = 0;
  6833. char buf[LENGTH_SQL] = {0};
  6834. sprintf_s(buf, "select ar.reader_id, ar.start_time, ar.rec_time from his_alarm_reader ar \
  6835. where not exists(select 1 from his_alarm_reader where reader_id=ar.reader_id and start_time> ar.start_time) \
  6836. and ar.end_time IS NULL;");
  6837. pRes = pConn->Execute(buf, err);
  6838. int nRow = 0;
  6839. std::string rec_time, lost_time;
  6840. while(pRow = mysql_fetch_row(pRes)){
  6841. ReaderMap::iterator it = mp_reader_list.find(atoi(pRow[0]));
  6842. if(it != mp_reader_list.end()){
  6843. lost_time = pRow[1];
  6844. rec_time = pRow[2];
  6845. API_StringToTime(rec_time, it->second->rec_time);
  6846. API_StringToTime(lost_time, it->second->lost_time);
  6847. it->second->state = STATUS_DEVICE_ERROR;
  6848. nRow++;
  6849. }
  6850. }
  6851. mysql_free_result(pRes);
  6852. CString strlog;
  6853. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_READER), nRow, _T(LOG_RECORD_COUNT));
  6854. show_log(strlog);
  6855. }
  6856. void CYAServerDlg::store_data_mine( int tag )
  6857. {
  6858. char sql[LENGTH_SQL] = {'\0'};
  6859. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  6860. //TRACE(_T("time memcpy 3\n"));
  6861. time_t cur_time = time(NULL);
  6862. struct tm local_time, local_time_ex;
  6863. switch(tag){
  6864. case ALARM_MINE_OVER_COUNT_PERSON_START:
  6865. {
  6866. localtime_s(&local_time, &time_over_count_person);
  6867. localtime_s(&local_time_ex, &cur_time);
  6868. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  6869. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  6870. int alarm_type_id = ATID_OVER_COUNT_PERSON;
  6871. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_info(alarm_type_id, start_time) VALUES(%d, '%s');",
  6872. alarm_type_id, _time);
  6873. break;
  6874. }
  6875. case ALARM_MINE_OVER_COUNT_PERSON_END:
  6876. {
  6877. localtime_s(&local_time, &time_over_count_person);
  6878. localtime_s(&local_time_ex, &cur_time);
  6879. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  6880. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  6881. int alarm_type_id = ATID_OVER_COUNT_PERSON;
  6882. sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_info set end_time='%s' where alarm_type_id=%d and start_time='%s';",
  6883. _time_ex, alarm_type_id, _time);
  6884. break;
  6885. }
  6886. case ALARM_MINE_OVER_COUNT_VEHICLE_START:
  6887. {
  6888. localtime_s(&local_time, &time_over_count_vehicle);
  6889. localtime_s(&local_time_ex, &cur_time);
  6890. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  6891. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  6892. int alarm_type_id = ATID_OVER_COUNT_VEHICLE;
  6893. sprintf_s(sql, LENGTH_SQL, "INSERT INTO his_alarm_info(alarm_type_id, start_time) VALUES(%d, '%s');",
  6894. alarm_type_id, _time);
  6895. break;
  6896. }
  6897. case ALARM_MINE_OVER_COUNT_VEHICLE_END:
  6898. {
  6899. localtime_s(&local_time, &time_over_count_vehicle);
  6900. localtime_s(&local_time_ex, &cur_time);
  6901. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  6902. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  6903. int alarm_type_id = ATID_OVER_COUNT_VEHICLE;
  6904. sprintf_s(sql, LENGTH_SQL, "UPDATE his_alarm_info set end_time='%s' where alarm_type_id=%d and start_time='%s';",
  6905. _time_ex, alarm_type_id, _time);
  6906. break;
  6907. }
  6908. default:
  6909. return;
  6910. }
  6911. execute_sql(sql);
  6912. }
  6913. void CYAServerDlg::deal_card_state(std::shared_ptr<Card> card /*Card* card */)
  6914. {
  6915. // 电量
  6916. if(card->power_state == 0 && card->power_state_last != 0){
  6917. card->status_power = STATUS_NORMAL;
  6918. store_data_card(card, ALARM_CARD_LOW_POWER_END);
  6919. }
  6920. if(card->power_state_last == 0 && card->power_state != 0){
  6921. //card->low_power_time = card->deal_time;CFunctions::systime_to_timet(card->deal_time)
  6922. card->low_power_time = CFunctions::systime_to_timet(card->deal_time);
  6923. store_data_card(card, ALARM_CARD_LOW_POWER_START);
  6924. }
  6925. card->power_state_last = card->power_state;
  6926. }
  6927. void CYAServerDlg::load_his_card_state()
  6928. {
  6929. CMysqlConn* pConn = NULL;
  6930. CDBConnGuard pDbGuard(pConn);
  6931. if(pConn == NULL){
  6932. return ;
  6933. }
  6934. MYSQL_RES* pRes;
  6935. MYSQL_ROW pRow;
  6936. int err = 0;
  6937. char buf[LENGTH_SQL] = {0};
  6938. sprintf_s(buf, "select ac.card_id, ac.alarm_type_id, ac.start_time from his_alarm_card ac \
  6939. where not exists(select 1 from his_alarm_card where card_id=ac.card_id and alarm_type_id=ac.alarm_type_id and start_time> ac.start_time) \
  6940. and ac.end_time is NULL;");
  6941. pRes = pConn->Execute(buf, err);
  6942. int nRow = 0;
  6943. std::string start_time;
  6944. while(pRow = mysql_fetch_row(pRes)){
  6945. CardMap::iterator it = mp_card_list_all.find(pRow[0]);
  6946. if(it != mp_card_list_all.end()){
  6947. switch (atoi(pRow[1]))
  6948. {
  6949. case ATID_POWER:
  6950. it->second->power_state = 1;
  6951. it->second->power_state_last = 1;
  6952. it->second->status_power = STATUS_ERROR;
  6953. start_time = pRow[2];
  6954. API_StringToTime(start_time, it->second->low_power_time);
  6955. default:
  6956. break;
  6957. }
  6958. nRow++;
  6959. }
  6960. }
  6961. mysql_free_result(pRes);
  6962. CString strlog;
  6963. strlog.Format(_T("%s%d%s"), _T(LOG_LOAD_HIS_STATE), nRow, _T(LOG_RECORD_COUNT));
  6964. show_log(strlog);
  6965. }
  6966. EnHandleResult CYAServerDlg::OnPrepareListen( ITcpServer* pSender, SOCKET soListen )
  6967. {
  6968. TCHAR szAddress[40];
  6969. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  6970. USHORT usPort;
  6971. pSender->GetListenAddress(szAddress, iAddressLen, usPort);
  6972. //::PostOnPrepareListen(szAddress, usPort);
  6973. return HR_OK;
  6974. }
  6975. EnHandleResult CYAServerDlg::OnAccept( ITcpServer* pSender, CONNID dwConnID, SOCKET soClient )
  6976. {
  6977. BOOL bPass = TRUE;
  6978. TCHAR szAddress[40];
  6979. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  6980. USHORT usPort;
  6981. pSender->GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort);
  6982. //::PostOnAccept(dwConnID, szAddress, usPort, bPass);
  6983. return HR_OK;
  6984. }
  6985. EnHandleResult CYAServerDlg::OnSend( ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength )
  6986. {
  6987. //::PostOnSend(dwConnID, pData, iLength);
  6988. return HR_OK;
  6989. }
  6990. EnHandleResult CYAServerDlg::OnReceive( ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength )
  6991. {
  6992. ParseData *data = BufferUtility::getInstance()->getItem();
  6993. if(data)
  6994. {
  6995. data->handle = this;
  6996. data->dwConnID = dwConnID;
  6997. data->len = iLength;
  6998. memset(data->buf, 0, LENGTH_MSG_4K);
  6999. memcpy(data->buf, pData, iLength);
  7000. //WT_EXECUTELONGFUNCTION 线程间跳转 WT_EXECUTEDEFAULT 执行完一个再执行另一个
  7001. //QueueUserWorkItem(_parse_data_server, (LPVOID)data, WT_EXECUTEDEFAULT);
  7002. this->parse_data_server(data->buf, data->len, data->dwConnID);
  7003. BufferUtility::getInstance()->releaseItem(data);
  7004. }
  7005. return HR_OK;
  7006. }
  7007. EnHandleResult CYAServerDlg::OnClose( ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode )
  7008. {
  7009. ::PostMessage(this->GetSafeHwnd(), WM_REMOVE_SOCKET, NULL, (LPARAM)dwConnID);
  7010. return HR_OK;
  7011. }
  7012. EnHandleResult CYAServerDlg::OnShutdown( ITcpServer* pSender )
  7013. {
  7014. return HR_OK;
  7015. }
  7016. //_SOCK* CYAServerDlg::get_socket_by_count( DWORD dwConnID )
  7017. std::shared_ptr<_SOCK> CYAServerDlg::get_socket_by_count( DWORD dwConnID )
  7018. {
  7019. SocketMap::iterator _sock = mp_socket_list.begin();
  7020. for(; _sock != mp_socket_list.end(); ++_sock){
  7021. if(_sock->second->dwConnID == dwConnID){
  7022. return _sock->second;
  7023. }
  7024. }
  7025. return NULL;
  7026. }
  7027. afx_msg LRESULT CYAServerDlg::OnMsgRefreshIpList(WPARAM wParam, LPARAM lParam)
  7028. {
  7029. EnterCriticalSection(&m_csRefreshList);
  7030. m_listctrl_reader.SetRedraw(FALSE);
  7031. m_listctrl_reader.DeleteAllItems();
  7032. SocketMap::reverse_iterator it_sock = mp_socket_list.rbegin();
  7033. for(; it_sock != mp_socket_list.rend(); ++it_sock){
  7034. AddItem(it_sock->second->sip, it_sock->second->reader_id, it_sock->second->state);
  7035. }
  7036. m_listctrl_reader.SetRedraw(TRUE);
  7037. LeaveCriticalSection(&m_csRefreshList);
  7038. return 0;
  7039. }
  7040. void CYAServerDlg::parse_data_locate_card_his( BYTE* DataBuffer, int& nCurPos, int reader_id, DWORD wTickCount, CString strTime, unsigned short wChr)
  7041. {
  7042. // 按时间分组解析
  7043. // 组长度
  7044. WORD wframelen = 0;
  7045. CFunctions::getWord(DataBuffer, &wframelen, nCurPos);
  7046. nCurPos += sizeof(WORD);
  7047. int nframepos = nCurPos;
  7048. // 数据保存时间 7字节,年,月,周,日,时,分,秒
  7049. BYTE btSec = 0;
  7050. //TRACE(_T("10 \n"));
  7051. memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE));
  7052. nCurPos += sizeof(BYTE);
  7053. BYTE btMin = 0;
  7054. memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE));
  7055. nCurPos += sizeof(BYTE);
  7056. BYTE btHour = 0;
  7057. memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE));
  7058. nCurPos += sizeof(BYTE);
  7059. BYTE btDay = 0;
  7060. memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE));
  7061. nCurPos += sizeof(BYTE);
  7062. BYTE btWeek = 0;
  7063. memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE));
  7064. nCurPos += sizeof(BYTE);
  7065. BYTE btMonth = 0;
  7066. memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE));
  7067. nCurPos += sizeof(BYTE);
  7068. BYTE btYear = 0;
  7069. memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE));
  7070. nCurPos += sizeof(BYTE);
  7071. CString strhistime;
  7072. strhistime.Format(_T("20%.2d-%.2d-%.2d %.2d:%.2d:%.2d"), btYear%100, btMonth, btDay, btHour, btMin, btSec );
  7073. while(nCurPos - nframepos < wframelen){ // 一组数据
  7074. BYTE btCardType = 0;
  7075. memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE));
  7076. nCurPos += sizeof(BYTE);
  7077. DWORD dwCardId = 0;
  7078. CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos);
  7079. nCurPos += sizeof(DWORD);
  7080. string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10);
  7081. std::shared_ptr<Card> pCard = std::make_shared<Card>(str_card_id, btCardType, theApp.z_offset);
  7082. pCard->reader_id = reader_id;
  7083. pCard->str_his_time = CFunctions::wc2c(strhistime);
  7084. pCard->reader_tickcount = wTickCount;
  7085. pCard->str_rec_time = CFunctions::wc2c(strTime);
  7086. //LONG64 l64cardid = btCardType;
  7087. //l64cardid <<= 32;
  7088. //l64cardid |= dwCardId;
  7089. switch(btCardType)
  7090. {
  7091. case CT_VEHICLE:
  7092. {
  7093. //报文时间
  7094. WORD wCardTickCount = 0;
  7095. CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos);
  7096. nCurPos += sizeof(WORD);
  7097. pCard->time_stamp = wCardTickCount;
  7098. BYTE btTypeAndPower = 0;
  7099. memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE));
  7100. nCurPos += sizeof(BYTE);
  7101. //报文类型
  7102. BYTE btType = 0;
  7103. btType = (btTypeAndPower >>4) & 0x0F;
  7104. //电池电量
  7105. BYTE btPower = 0;
  7106. btPower = btTypeAndPower & 0x0F;
  7107. pCard->ranging_type = btType;
  7108. pCard->power_state = btPower;
  7109. //保留
  7110. nCurPos += sizeof(BYTE);
  7111. //加速度
  7112. BYTE btAcceleration = 0;
  7113. memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE));
  7114. nCurPos += sizeof(BYTE);
  7115. pCard->accelerate_state = btAcceleration;
  7116. //定位时间戳Tsp // 字序
  7117. LONG64 lTime1 = 0;
  7118. BYTE btTemp = 0;
  7119. int nRangingPos = nCurPos;
  7120. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  7121. nCurPos += sizeof(BYTE);
  7122. DWORD dwTemp = 0;
  7123. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  7124. nCurPos += sizeof(DWORD);
  7125. lTime1 = btTemp;
  7126. lTime1 = lTime1 << 32;
  7127. lTime1 |= dwTemp;
  7128. pCard->flying_time = lTime1;
  7129. double dbldist = CFunctions::getDistance(lTime1);
  7130. pCard->distance = dbldist;
  7131. BYTE btAntenna = 0;
  7132. memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE));
  7133. nCurPos += sizeof(BYTE);
  7134. btAntenna = btAntenna & 0xFF;
  7135. pCard->antenna_id = btAntenna;
  7136. if(CHAR_LOCATEDATAHIS_TDOA == wChr ){
  7137. // 分站时间同步序列号
  7138. WORD wSyncNum = 0;
  7139. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  7140. nCurPos += sizeof(WORD);
  7141. // 信号强度
  7142. WORD wStrength = 0;
  7143. CFunctions::getWord(DataBuffer, &wStrength, nCurPos);
  7144. nCurPos += sizeof(WORD);
  7145. }
  7146. break;
  7147. }
  7148. case CT_PERSON:
  7149. {
  7150. break;
  7151. }
  7152. default:
  7153. {
  7154. //strBuf.Format(_T("无法识别的卡类型:%d\r\n"), btCardType);
  7155. break;
  7156. }
  7157. }
  7158. store_data_card(pCard, HIS_RAW_DATA);
  7159. }
  7160. }
  7161. void CYAServerDlg::parse_data_locate_reader_his( BYTE * DataBuffer, int nLen, int& nCurPos, int& reader_id, int& nTick, CString& strtime, unsigned short wChr)
  7162. {
  7163. //CString strTime;
  7164. strtime.Format(_T("%s"), COleDateTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S")));
  7165. DWORD dwReaderID = 0;
  7166. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  7167. nCurPos += sizeof(DWORD);
  7168. WORD wTickCount = 0;
  7169. CFunctions::getWord(DataBuffer, &wTickCount, nCurPos);
  7170. nCurPos += sizeof(WORD);
  7171. }
  7172. void CYAServerDlg::parse_data_reader_synctime(BYTE *DataBuffer, int nLen, int& nCurPos, WORD wChr)
  7173. {
  7174. while(nCurPos < nLen - sizeof(WORD)){
  7175. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_9);
  7176. DWORD dwReaderID = 0; // 本机分站号
  7177. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  7178. nCurPos += sizeof(DWORD);
  7179. BYTE btAnt = 0; // 本机发送天线
  7180. //TRACE(_T("11 \n"));
  7181. memcpy(&btAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  7182. nCurPos += sizeof(BYTE);
  7183. DWORD dwUpperReaderID = 0; // 上级分站号
  7184. CFunctions::getDWord(DataBuffer, &dwUpperReaderID, nCurPos);
  7185. nCurPos += sizeof(DWORD);
  7186. BYTE btUpperAnt = 0; // 上级天线
  7187. memcpy(&btUpperAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  7188. nCurPos += sizeof(BYTE);
  7189. WORD wSyncNum = 0; // 序列号
  7190. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  7191. nCurPos += sizeof(WORD);
  7192. WORD wSyncLevel = 0; // 同步等级
  7193. CFunctions::getWord(DataBuffer, &wSyncLevel, nCurPos);
  7194. nCurPos += sizeof(WORD);
  7195. LONG64 lTime1 = 0, lTime2 = 0;
  7196. BYTE btTemp = 0;
  7197. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  7198. nCurPos += sizeof(BYTE);
  7199. DWORD dwTemp = 0;
  7200. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  7201. nCurPos += sizeof(DWORD);
  7202. lTime1 = btTemp; // 本机发送时间戳
  7203. lTime1 = lTime1 << 32;
  7204. lTime1 |= dwTemp;
  7205. btTemp = 0;
  7206. dwTemp = 0;
  7207. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  7208. nCurPos += sizeof(BYTE);
  7209. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  7210. nCurPos += sizeof(DWORD);
  7211. lTime2 = btTemp; // 本机接收时间戳
  7212. lTime2 = lTime2 << 32;
  7213. lTime2 |= dwTemp;
  7214. DWORD dwRootReaderID = 0; // root分站号
  7215. BYTE btRootAnt = 0; // root天线
  7216. unsigned long long syncRootId = 0;
  7217. if(CHAR_READER_SYNC_TIME_ROOT == wChr){
  7218. CFunctions::getDWord(DataBuffer, &dwRootReaderID, nCurPos);
  7219. nCurPos += sizeof(DWORD);
  7220. memcpy(&btRootAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  7221. nCurPos += sizeof(BYTE);
  7222. syncRootId = dwRootReaderID;
  7223. syncRootId = (syncRootId << 8) + btRootAnt;
  7224. }
  7225. /*CString strLog;
  7226. strLog.Format(_T("id1:%d, id2:%d, syncnum:%d, level:%d, send:%I64u, rec:%I64u"), dwReaderID, dwRootReaderID, wSyncNum, wSyncLevel, lTime1, lTime2);
  7227. writeErrorLog(_T("SYNC_S"), strLog, true);*/
  7228. #ifdef TRACE_MEMORY_SYNCTIMEMSG
  7229. debug_print_syslog(0, "Local station id:%d, root station id:%d, syncnum:%d, level:%d, send:%I64u, rec:%I64u",
  7230. dwReaderID, dwRootReaderID, wSyncNum, wSyncLevel, lTime1, lTime2);
  7231. HostServer::SyncTimeMsg msg;
  7232. msg.LocalIdCode(dwReaderID);
  7233. msg.LocalIdCode((msg.LocalIdCode() << 8) + btAnt);
  7234. msg.UpperIdCode(dwUpperReaderID);
  7235. msg.UpperIdCode((msg.UpperIdCode() << 8) + btUpperAnt);
  7236. msg.RootIdCode(dwRootReaderID);
  7237. msg.RootIdCode((msg.RootIdCode() << 8) + btRootAnt);
  7238. msg.SyncNum(wSyncNum);
  7239. msg.SyncLevel(wSyncLevel);
  7240. msg.LocalStationSendTime(lTime1);
  7241. msg.LocalStationReceiveTime(lTime2);
  7242. syncmanager.analyzeSyncMsg(msg);
  7243. #endif // TRACE_MEMORY_SYNCTIMEMSG
  7244. if(wSyncLevel == 0){
  7245. EnterCriticalSection(&m_csSyncTime);
  7246. umpRootSyncNum[syncRootId] = wSyncNum;
  7247. LeaveCriticalSection(&m_csSyncTime);
  7248. }
  7249. ReaderMap::iterator it = mp_reader_list.find(dwReaderID);
  7250. if(it != mp_reader_list.end()){
  7251. it->second->sync_level = wSyncLevel;
  7252. it->second->sync_rootId = syncRootId;
  7253. }
  7254. if(m_log_parse_data){
  7255. CString strLog;
  7256. strLog.Format(_T("id1:%d, id2:%d, root:%d, syncnum:%d, level:%d, send:%I64u, rec:%I64u"), dwReaderID, dwUpperReaderID, dwRootReaderID, wSyncNum, wSyncLevel, lTime1, lTime2);
  7257. writeErrorLog(_T("SYNC_S"), strLog, true);
  7258. strLog.Empty();
  7259. }
  7260. }
  7261. }
  7262. int CYAServerDlg::init_antenna_sync()
  7263. {
  7264. ReaderMap::iterator itReader = mp_reader_list.begin();
  7265. // 初始化数组,将分站添加到列表,只有一个天线
  7266. for(; itReader != mp_reader_list.end(); ++itReader){
  7267. syncmanager.updateAnchor(itReader->second->reader_id, 1,
  7268. itReader->second->ant[0]->antenna_x * itReader->second->map_scale,
  7269. itReader->second->ant[0]->antenna_y * itReader->second->map_scale,
  7270. itReader->second->ant[0]->antenna_z * itReader->second->map_scale);
  7271. }
  7272. // 根据坐标计算分站间距离
  7273. for (auto it = syncmanager._anchors.begin(); it != syncmanager._anchors.end(); it++)
  7274. {
  7275. for (auto it2 = syncmanager._anchors.begin(); it2 != syncmanager._anchors.end(); it2++)
  7276. {
  7277. if(it != it2)
  7278. {
  7279. double d = sqrt(pow((it->second.x - it2->second.x), 2)
  7280. + pow((it->second.y - it2->second.y), 2)
  7281. + pow((it->second.z - it2->second.z), 2)) * 10000 / (2.99702547 * 15.65);
  7282. syncmanager.updateDistance(it->first >>8, it->first & 0xFF, it2->first >> 8, it2->first & 0xFF,d);
  7283. }
  7284. }
  7285. }
  7286. return 0;
  7287. }
  7288. /*
  7289. * 此卡是否在主巷道内
  7290. *
  7291. * param
  7292. * pCard 卡对象
  7293. *
  7294. * return
  7295. * 在主巷道返回true,否则返回false
  7296. *
  7297. */
  7298. bool CYAServerDlg::isInMainTunel(std::shared_ptr<Card> pCard)
  7299. {
  7300. bool bRet = false;
  7301. int nMapId = 0;
  7302. nMapId = pCard->map_id;
  7303. MapInfoMap::iterator it_map = mp_map_list.find(nMapId);
  7304. if (it_map == mp_map_list.end())
  7305. {
  7306. return bRet;
  7307. }
  7308. _point p;
  7309. p.x = pCard->x;
  7310. p.y = pCard->y;
  7311. p.z = pCard->z;
  7312. for (SectionMap::iterator it_section = it_map->second->map_section_list.begin();it_section != it_map->second->map_section_list.end();++it_section)
  7313. {
  7314. if (it_section->second->IsInPolygon(p))
  7315. {
  7316. bRet = true;
  7317. break;
  7318. }
  7319. }
  7320. return bRet;
  7321. }
  7322. int CYAServerDlg::getTunelProperty(std::shared_ptr<Card> pCard)
  7323. {
  7324. bool bRet = false;
  7325. int nMapId = 0;
  7326. nMapId = pCard->map_id;
  7327. MapInfoMap::iterator it_map = mp_map_list.find(nMapId);
  7328. if (it_map == mp_map_list.end())
  7329. {
  7330. return bRet;
  7331. }
  7332. _point p;
  7333. p.x = pCard->x;
  7334. p.y = pCard->y;
  7335. p.z = pCard->z;
  7336. SectionMap::iterator it_section = it_map->second->map_section_list.begin();
  7337. for (;it_section != it_map->second->map_section_list.end();++it_section)
  7338. {
  7339. if (it_section->second->IsInPolygon(p))
  7340. {
  7341. bRet = true;
  7342. break;
  7343. }
  7344. }
  7345. int nProperty = 0;
  7346. if (it_section != it_map->second->map_section_list.end())
  7347. {
  7348. nProperty = it_section->second->m_nProperty;
  7349. }
  7350. return nProperty;
  7351. }
  7352. void CYAServerDlg::Test()
  7353. {
  7354. time_t tCurTime;
  7355. tCurTime = time(NULL);
  7356. std::string s = CFunctions::time_t2string(tCurTime);
  7357. std::shared_ptr<ReceiveDataMap> pRdm = std::make_shared<ReceiveDataMap>();
  7358. //pRdm->clear();
  7359. double dMapScale = 0.01;
  7360. std::shared_ptr<ReceiveData> prd1 = std::make_shared<ReceiveData>();
  7361. prd1->reader_id = 35;
  7362. prd1->antenna_id = 1;
  7363. prd1->rec_time_stamp = 984080348577;
  7364. prd1->x = 430.*dMapScale;
  7365. prd1->y = 800.0*dMapScale;
  7366. prd1->z = 0;
  7367. prd1->special = 1;
  7368. //pRdm.insert(ReceiveDataMap::value_type(prd1->reader_id,*prd1));
  7369. //pRdm[prd1->rec_time_stamp] = *prd1;
  7370. pRdm->insert(ReceiveDataMap::value_type(prd1->rec_time_stamp,prd1));
  7371. std::shared_ptr<ReceiveData> prd3 = std::make_shared<ReceiveData>();
  7372. prd3->reader_id = 36;
  7373. prd3->antenna_id = 1;
  7374. prd3->rec_time_stamp = 984080348750;
  7375. prd3->x = 800*dMapScale;
  7376. prd3->y = 400.00*dMapScale;
  7377. prd3->z = 0;
  7378. prd3->special = 1;
  7379. //pRdm.insert(ReceiveDataMap::value_type(prd3->reader_id,*prd3));
  7380. //pRdm[prd3->rec_time_stamp] = *prd3;
  7381. pRdm->insert(ReceiveDataMap::value_type(prd3->rec_time_stamp,prd3));
  7382. //34
  7383. /*std::shared_ptr<ReceiveData> prd2 = std::make_shared<ReceiveData>();
  7384. prd2->reader_id = 104;
  7385. prd2->antenna_id = 1;
  7386. prd2->rec_time_stamp = 959905943690;
  7387. prd2->x = 897.0*dMapScale;
  7388. prd2->y = 341*dMapScale;
  7389. prd2->z = 0;
  7390. prd2->special = 0;*/
  7391. //pRdm.insert(ReceiveDataMap::value_type(prd2->reader_id,*prd2));
  7392. //pRdm[prd2->rec_time_stamp] = *prd2;
  7393. //pRdm->insert(ReceiveDataMap::value_type(prd2->rec_time_stamp,prd2));
  7394. //pRdm.get()[prd2->rec_time_stamp] = prd2.get();
  7395. /*DWORD dwStart = ::GetTickCount();
  7396. SYSTEMTIME stStart;
  7397. GetSystemTime(&stStart);
  7398. bool bRet = false;*/
  7399. std::unique_ptr<POS> p;
  7400. p = LocateAlgorithm::Pos(pRdm,mp_reader_path_list_tdoa);
  7401. /*SYSTEMTIME stEnd;
  7402. GetSystemTime(&stEnd);
  7403. int nDiff = stEnd.wMilliseconds - stStart.wMilliseconds;
  7404. DWORD dwEnd = ::GetTickCount();
  7405. DWORD diff = dwEnd - dwStart;
  7406. if(bRet){
  7407. p->posx = INVALID_COORDINATE ;
  7408. p->posy = INVALID_COORDINATE ;
  7409. p->posz = -2 ;
  7410. }*/
  7411. double x = p->posx / dMapScale;
  7412. double y = p->posy / dMapScale;
  7413. }
  7414. afx_msg LRESULT CYAServerDlg::OnWriteErrorLog(WPARAM wParam, LPARAM lParam)
  7415. {
  7416. LogMsg* pMsg = (LogMsg*)wParam;
  7417. CString strFile = pMsg->strFile;
  7418. bool bTime = pMsg->isNeedTime;
  7419. CString strErr = pMsg->strLog;
  7420. writeErrorLogEx(strFile, strErr, bTime);
  7421. strErr.Empty();
  7422. strFile.Empty();
  7423. delete pMsg;
  7424. return 0;
  7425. }
  7426. void CYAServerDlg::parse_data_server( const BYTE * pData, int nLen, DWORD dwConnId )
  7427. {
  7428. EnterCriticalSection(&m_csParseDataServer);
  7429. int read_length = 0;
  7430. int pkg_len = 0;
  7431. std::shared_ptr<BYTE> Buf(new BYTE[LENGTH_MSG_1M],[](BYTE* Buf){delete[] Buf;});
  7432. BYTE* buf = Buf.get();
  7433. if(buf == nullptr){
  7434. LeaveCriticalSection(&m_csParseDataServer);
  7435. return;
  7436. }
  7437. memset(buf, 0, LENGTH_MSG_1M);
  7438. TCHAR szAddress[40];
  7439. int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
  7440. USHORT usPort;
  7441. if( _server.GetRemoteAddress(dwConnId, szAddress, iAddressLen, usPort)){
  7442. SocketBufferMap::iterator it = mp_socket_buffer_list.find(szAddress);
  7443. if(it != mp_socket_buffer_list.end()){ // 有此socket数据
  7444. if(nLen + it->second->wReadLen > LENGTH_MSG_1M){
  7445. // 删除此元素
  7446. it->second->wLen = 0;
  7447. it->second->wReadLen = 0;
  7448. it->second->dwConnID = dwConnId;
  7449. mp_socket_buffer_list.erase(it);
  7450. LeaveCriticalSection(&m_csParseDataServer);
  7451. return ;
  7452. }
  7453. if(it->second->wReadLen > 0){
  7454. memcpy(buf, it->second->pData, it->second->wReadLen);
  7455. }
  7456. memcpy(buf + it->second->wReadLen, pData, nLen);
  7457. it->second->wReadLen += nLen;
  7458. nLen = it->second->wReadLen;
  7459. }else{
  7460. memcpy(buf, pData, nLen);
  7461. }
  7462. while (read_length < nLen){
  7463. pkg_len = MAKEWORD(buf[read_length + 1], buf[read_length]);
  7464. pkg_len += sizeof(WORD); // 长度
  7465. if(read_length + pkg_len > nLen){
  7466. break; // 有半个包,溢出,保留与下个包合并
  7467. }
  7468. //将完整包送出
  7469. //ParseData *data = (ParseData*)malloc(sizeof(ParseData));
  7470. ParseData *data = (ParseData *)(BufferUtility::getInstance()->getItem());
  7471. if(data){
  7472. data->handle = this;
  7473. data->dwConnID = dwConnId;
  7474. data->len = pkg_len;
  7475. memset(data->buf, 0, LENGTH_MSG_4K);
  7476. //由于存在pkg_len大于LENGTH_MSG_4K的情况,导致memcpy出错的问题;
  7477. //原因猜测可能是第三方库缓存过大再发送过来的原因
  7478. if(pkg_len > LENGTH_MSG_4K){
  7479. if(it != mp_socket_buffer_list.end()){ // 应从列表删除
  7480. it->second->wLen = 0;
  7481. it->second->wReadLen = 0;
  7482. it->second->dwConnID = dwConnId;
  7483. mp_socket_buffer_list.erase(it);
  7484. }
  7485. //free(data);
  7486. //data = NULL;
  7487. BufferUtility::getInstance()->releaseItem(data);
  7488. LeaveCriticalSection(&m_csParseDataServer);
  7489. return;
  7490. }
  7491. memcpy(data->buf, buf + read_length, pkg_len);
  7492. //QueueUserWorkItem(_parse_package_data, (LPVOID)data, WT_EXECUTEDEFAULT);
  7493. //send thread message
  7494. send_tcp_thread_message(data);
  7495. }
  7496. read_length += pkg_len;
  7497. }
  7498. if(read_length >= nLen){ //没剩下数据, 直接解析
  7499. if(it != mp_socket_buffer_list.end()){
  7500. it->second->wLen = 0;
  7501. it->second->wReadLen = 0;
  7502. it->second->dwConnID = dwConnId;
  7503. mp_socket_buffer_list.erase(it);
  7504. }
  7505. }else{ // 有剩余数据,保存起来
  7506. if(it != mp_socket_buffer_list.end()){
  7507. try{
  7508. if(it->second->wReadLen > 0){
  7509. memset(&it->second->pData[it->second->wReadLen], 0, LENGTH_MSG_1M - it->second->wReadLen);
  7510. }
  7511. }catch(...){
  7512. int tt = it->second->wReadLen;
  7513. }
  7514. try{
  7515. memcpy(&it->second->pData[it->second->wReadLen], buf + read_length, nLen - read_length);
  7516. }catch(...){
  7517. int tt = it->second->wReadLen;
  7518. }
  7519. it->second->wReadLen += nLen - read_length;
  7520. }else{
  7521. std::shared_ptr<_SOCKET_BUFFER> _sockbuf = std::make_shared<_SOCKET_BUFFER>();
  7522. if(_sockbuf){
  7523. TRACE(_T("allocate a 1M memory.\r\n"));
  7524. _sockbuf->wReadLen = 0;
  7525. _sockbuf->dwConnID = dwConnId;
  7526. _sockbuf->wLen = pkg_len;
  7527. memset(_sockbuf->pData, 0, LENGTH_MSG_1M);
  7528. memcpy(_sockbuf->pData, buf + read_length, nLen - read_length);
  7529. _sockbuf->wReadLen += nLen - read_length;
  7530. mp_socket_buffer_list.insert(make_pair(szAddress, _sockbuf));
  7531. }
  7532. }
  7533. }
  7534. }
  7535. LeaveCriticalSection(&m_csParseDataServer);
  7536. }
  7537. //int g_t = 0;
  7538. void CYAServerDlg::deal_card_msg( std::shared_ptr<Card> card/*Card* card*/, bool is_hist /*= false*/ )
  7539. {
  7540. DWORD dw;
  7541. if(!is_hist){
  7542. if(card->card_type == CT_ADHOC){ // 此处不需处理,已经在解析时计算了坐标位置
  7543. }else if( LT_READER == theApp.locate_type){
  7544. card->x = card->p_reader->ant[card->antenna_id]->antenna_x;
  7545. card->y = card->p_reader->ant[card->antenna_id]->antenna_y;
  7546. card->z = card->p_reader->ant[card->antenna_id]->antenna_z;
  7547. card->a = card->p_reader->ant[card->antenna_id]->antenna_angle;
  7548. card->reader_id = card->p_reader->reader_id;
  7549. }else{
  7550. // 将距离加入到距离列表
  7551. std::shared_ptr<_coordinate> dist = std::make_shared<_coordinate>();
  7552. //int n = card.use_count();
  7553. //int m = card->p_reader.use_count();
  7554. //TRACE(_T("g_t = %d , p_reader.use_count() = %d. \r\n"),g_t++,n);
  7555. dist->t = card->time_stamp;
  7556. dist->x = card->p_reader->ant[card->antenna_id]->antenna_x;
  7557. dist->y = card->p_reader->ant[card->antenna_id]->antenna_y;
  7558. dist->z = card->p_reader->ant[card->antenna_id]->antenna_z;
  7559. dist->a = card->p_reader->ant[card->antenna_id]->antenna_angle;
  7560. dist->reader_id = card->p_reader->reader_id;
  7561. dist->syncRootId = card->p_reader->sync_rootId;
  7562. dist->antenna_id = card->antenna_id;
  7563. dist->d = card->distance;
  7564. dist->v = 0;
  7565. dist->d_offset = 0;
  7566. dist->special = card->p_reader->m_nIsSpecial;
  7567. dist->st = card->sync_num;
  7568. dist->acce_state = card->accelerate_state;
  7569. dist->acce_state_last = card->accelerate_state_last;
  7570. dist->ins_direction = card->ins_direction;
  7571. unsigned short root_sync_num = dist->syncRootId;
  7572. bool bUseAlgo = false;
  7573. if(umpRootSyncNum.count(root_sync_num) > 0){
  7574. root_sync_num = umpRootSyncNum[root_sync_num];
  7575. if(root_sync_num >= dist->st){
  7576. if(root_sync_num - dist->st <= 5){
  7577. bUseAlgo = true;
  7578. }
  7579. }else{
  7580. if(dist->st - root_sync_num >= 65530){
  7581. bUseAlgo = true;
  7582. }
  7583. }
  7584. }
  7585. if(card->p_reader->sync_level == 0){
  7586. bUseAlgo = true;
  7587. }
  7588. if(bUseAlgo){
  7589. #ifdef TRACE_MEMORY_TAGMSG
  7590. HostServer::TagMsg tagMsg;
  7591. tagMsg.ReceiveTime = card->flying_time;
  7592. tagMsg.StationIdCode = HostServer::SyncHelper::parseId((unsigned long long)card->reader_id, (unsigned long long)(card->antenna_id + 1));
  7593. tagMsg.SyncNum = card->sync_num;
  7594. tagMsg.SyncRootIdCode = card->p_reader->sync_rootId;
  7595. if(card->p_reader->sync_level == 0){
  7596. dist->tt = card->flying_time;
  7597. }else{
  7598. dist->tt = syncmanager.calTimeByLinar(tagMsg);
  7599. }
  7600. #endif // TRACE_MEMORY_TAGMSG
  7601. card->is_deal_by_algo = false;
  7602. card->add_dist(dist);
  7603. }
  7604. if(m_log_locate_data){
  7605. CString strLog = _T("");
  7606. wchar_t* p_card_id = CFunctions::c2wc(card->card_id.c_str());
  7607. strLog.Format(_T("r: %d-%d, t: %d, l:%d, tt: %I64u, ft: %I64u, x1: %f, y1: %f, z1: %f, ct: %d, cardid:%s"),
  7608. dist->reader_id, dist->antenna_id + 1, dist->st, card->p_reader->sync_level, dist->tt, card->flying_time, dist->x, dist->y, dist->z, dist->t, p_card_id/*CFunctions::c2wc(card->card_id.c_str())*/);
  7609. writeErrorLog(_T("DIST_S"), strLog, true);
  7610. strLog.Empty();
  7611. //此处和save_card_msg消息存在不一致
  7612. if(card->x != card->last_x || card->y != card->last_y){
  7613. card->last_x = card->x;
  7614. card->last_y = card->y;
  7615. card->last_z = card->z;
  7616. strLog.Format(_T("cardid:%s, cx: %f, cy: %f, cz: %f, clx: %f, cly: %f, v: %f, ct: %d"), p_card_id /*CFunctions::c2wc(card->card_id.c_str())*/, card->x, card->y, card->z, card->last_locate.x, card->last_locate.y, card->v, card->time_stamp_cal);
  7617. writeErrorLog(_T("DIST_S"), strLog, false);
  7618. strLog.Empty();
  7619. strLog = _T("");
  7620. strLog.Format(_T("%d,%f,%f,%f,%f,%f,iw: %f,uw: %f,as: %d,asl: %d,ct: %d, ov: %f,cv: %f,av: %f, lsn: %d,cardid: %s"),card->m_nCalcSyncNum,card->origin_locate.x,card->origin_locate.y,card->x, card->y,card->z,card->ins_weight,card->uwb_weight,card->accelerate_state,card->accelerate_state_last,card->time_stamp_cal,card->origin_locate.v,card->v,card->last_locate.acceleration,card->m_nSyncNumInList,p_card_id);
  7621. writeErrorLog(_T("KALMAN_S"),strLog,false);
  7622. }else{
  7623. if(card->is_deal_by_algo){
  7624. strLog = _T("");
  7625. strLog.Format(_T("%d,%f,%f,%f,%f,%f,iw: %f,uw: %f,as: %d,asl: %d,ct: %d, ov: %f,cv: %f,av: %f, lsn: %d,cardid: %s"),card->m_nCalcSyncNum,card->origin_locate.x,card->origin_locate.y,card->x, card->y,card->z,card->ins_weight,card->uwb_weight,card->accelerate_state,card->accelerate_state_last,card->time_stamp_cal,card->origin_locate.v,card->v,card->last_locate.acceleration,card->m_nSyncNumInList,p_card_id);
  7626. writeErrorLog(_T("KALMAN_S"),strLog,false);
  7627. card->is_deal_by_algo = false;
  7628. }
  7629. }
  7630. if(p_card_id){
  7631. free(p_card_id);
  7632. p_card_id = NULL;
  7633. }
  7634. }
  7635. }
  7636. }
  7637. if(LT_READER == theApp.locate_type){
  7638. time_t cur_time = time(NULL);
  7639. time_t c_time = CFunctions::systime_to_timet(card->deal_time);
  7640. if(difftime(cur_time, c_time) <30){
  7641. return ;
  7642. }
  7643. }
  7644. GetSystemTime(&card->deal_time);
  7645. dw = ::GetTickCount();
  7646. save_card_postion(card);
  7647. card_enter_map(card); // 切换地图
  7648. card_enter_area(card); //, card->deal_time);
  7649. deal_card_state(card);
  7650. if (card->card_type == CT_VEHICLE)
  7651. {
  7652. deal_traffic_lights(card);
  7653. select_pos_output(card);
  7654. }
  7655. card->isdealed = true;
  7656. if(LT_READER != theApp.locate_type){
  7657. card->issent = false;
  7658. }
  7659. }
  7660. afx_msg LRESULT CYAServerDlg::OnRemoveSocket(WPARAM wParam, LPARAM lParam)
  7661. {
  7662. DWORD dwConnID = (DWORD)lParam;
  7663. remove_socket(dwConnID);
  7664. return 0;
  7665. }
  7666. void CYAServerDlg::writeErrorLogEx( const CString strFile, const CString strErr ,bool bTime /*= true*/ )
  7667. {
  7668. EnterCriticalSection(&m_csWriteLog);
  7669. if(openLogFile(strFile)){
  7670. CString strTempInfo;
  7671. if(bTime){
  7672. COleDateTime t = COleDateTime::GetCurrentTime();
  7673. strTempInfo.Format(_T("%s\r\n%s\r\n"), t.Format(_T("%H:%M:%S")), strErr);
  7674. }else{
  7675. strTempInfo.Format(_T("%s\r\n"), strErr);
  7676. }
  7677. TRY{
  7678. cfErrorLog.SeekToEnd();
  7679. char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
  7680. setlocale( LC_CTYPE, "chs" );//设定
  7681. cfErrorLog.WriteString(strTempInfo);
  7682. setlocale( LC_CTYPE, old_locale );
  7683. free( old_locale );//还原区域设定
  7684. }
  7685. CATCH(CFileException, e){
  7686. if(cfErrorLog.m_pStream)
  7687. cfErrorLog.Close();
  7688. }
  7689. END_CATCH
  7690. }
  7691. LeaveCriticalSection(&m_csWriteLog);
  7692. }
  7693. void CYAServerDlg::writeErrorLogEx( const char* strFile, const char* strErr ,bool bTime /*= true*/ )
  7694. {
  7695. EnterCriticalSection(&m_csWriteLog);
  7696. if(openLogFile(strFile)){
  7697. CString strTempInfo;
  7698. if(bTime){
  7699. COleDateTime t = COleDateTime::GetCurrentTime();
  7700. strTempInfo.Format(_T("%s\r\n"), t.Format(_T("%H:%M:%S")));
  7701. USES_CONVERSION;
  7702. CString tmp = A2T(strErr);
  7703. strTempInfo += tmp + _T("\r\n");
  7704. }else{
  7705. USES_CONVERSION;
  7706. strTempInfo = CFunctions::c2wc(strErr);
  7707. strTempInfo += _T("\r\n");
  7708. }
  7709. TRY{
  7710. cfErrorLog.SeekToEnd();
  7711. char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
  7712. setlocale( LC_CTYPE, "chs" );//设定
  7713. cfErrorLog.WriteString(strTempInfo);
  7714. setlocale( LC_CTYPE, old_locale );
  7715. free( old_locale );//还原区域设定
  7716. }
  7717. CATCH(CFileException, e){
  7718. if(cfErrorLog.m_pStream)
  7719. cfErrorLog.Close();
  7720. LeaveCriticalSection(&m_csWriteLog);
  7721. }
  7722. END_CATCH
  7723. }
  7724. LeaveCriticalSection(&m_csWriteLog);
  7725. }
  7726. void CYAServerDlg::init_queuestring()
  7727. {
  7728. m_qsmSQL = new QueueStrManager(50, 7500, _exec_sql);//50,7500
  7729. }
  7730. void CYAServerDlg::SendData( DWORD dwConnID, WORD wCharacterWord, int wLength, BYTE* DataBuffer )
  7731. {
  7732. BYTE SendBuffer[LENGTH_MSG_2K];
  7733. WORD nlength = wLength + sizeof(WORD) + sizeof(WORD); //socket的数据长度 数据的长度(n) + 特征字(2) + 校验码(2)
  7734. memset(SendBuffer, 0, LENGTH_MSG_2K);
  7735. int nPos = 0;
  7736. CFunctions::memcpyWord(SendBuffer, nlength, nPos);//长度
  7737. nPos += sizeof(WORD);
  7738. CFunctions::memcpyWord(SendBuffer, wCharacterWord, nPos);
  7739. nPos += sizeof(WORD);
  7740. memcpy(&SendBuffer[nPos], &DataBuffer[0], wLength);
  7741. nPos += wLength;
  7742. WORD wCrc = CFunctions::getCRC(&SendBuffer[sizeof(WORD)], wLength + sizeof(WORD)); // 数据长度 + 特征字
  7743. CFunctions::memcpyWord(SendBuffer, wCrc, nPos);
  7744. nPos += sizeof(WORD);
  7745. _server.Send(dwConnID, &SendBuffer[0], nPos);
  7746. Sleep(20);
  7747. }
  7748. void CYAServerDlg::parse_data_locate_card_his_tdoa( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime)
  7749. {
  7750. // 按时间分组解析
  7751. // 组长度
  7752. int nCurPos = 0;
  7753. // 数据保存时间 7字节,年,月,周,日,时,分,秒
  7754. BYTE btSec = 0;
  7755. memcpy(&btSec, &DataBuffer[nCurPos], sizeof(BYTE));
  7756. nCurPos += sizeof(BYTE);
  7757. BYTE btMin = 0;
  7758. memcpy(&btMin, &DataBuffer[nCurPos], sizeof(BYTE));
  7759. nCurPos += sizeof(BYTE);
  7760. BYTE btHour = 0;
  7761. memcpy(&btHour, &DataBuffer[nCurPos], sizeof(BYTE));
  7762. nCurPos += sizeof(BYTE);
  7763. BYTE btDay = 0;
  7764. memcpy(&btDay, &DataBuffer[nCurPos], sizeof(BYTE));
  7765. nCurPos += sizeof(BYTE);
  7766. BYTE btWeek = 0;
  7767. memcpy(&btWeek, &DataBuffer[nCurPos], sizeof(BYTE));
  7768. nCurPos += sizeof(BYTE);
  7769. BYTE btMonth = 0;
  7770. memcpy(&btMonth, &DataBuffer[nCurPos], sizeof(BYTE));
  7771. nCurPos += sizeof(BYTE);
  7772. BYTE btYear = 0;
  7773. memcpy(&btYear, &DataBuffer[nCurPos], sizeof(BYTE));
  7774. nCurPos += sizeof(BYTE);
  7775. CString strhistime;
  7776. strhistime.Format(_T("20%.2d-%.2d-%.2d %.2d:%.2d:%.2d"), btYear%100, btMonth, btDay, btHour, btMin, btSec );
  7777. std::shared_ptr<BYTE> sp_bt(new BYTE[nLen],[](BYTE* bt){
  7778. delete[] bt;
  7779. });
  7780. BYTE* bt = sp_bt.get();
  7781. while(nCurPos < nLen){ // 一组数据
  7782. // 一个数据包
  7783. WORD wPkgLen = 0;
  7784. CFunctions::getWord(DataBuffer, &wPkgLen, nCurPos);
  7785. nCurPos += sizeof(WORD);
  7786. if(bt){
  7787. memset(bt, 0, nLen);
  7788. memcpy(bt, &DataBuffer[nCurPos], wPkgLen);
  7789. parse_data_locate_card_his_tdoa_package(bt, wPkgLen, reader_id, wTickCount, strTime, strhistime);
  7790. }
  7791. nCurPos += wPkgLen;
  7792. }
  7793. //delete[] bt;
  7794. }
  7795. void CYAServerDlg::parse_data_locate_card_his_tdoa_package( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime )
  7796. {
  7797. // 命令字
  7798. int nCurPos = 0;
  7799. WORD wChr = 0;
  7800. CFunctions::getWord(DataBuffer, &wChr, nCurPos);
  7801. nCurPos += sizeof(WORD);
  7802. BYTE* bt = new BYTE[LENGTH_RECORD_MAX];
  7803. if(NULL == bt){
  7804. return;
  7805. }
  7806. while(nCurPos < nLen){
  7807. switch (wChr)
  7808. {
  7809. case CHAR_LOCATEDATA:
  7810. {
  7811. memset(bt, 0, LENGTH_RECORD_MAX);
  7812. memcpy(bt, &DataBuffer[nCurPos], LENGTH_TOF_VEHICLE);
  7813. parse_data_locate_card_his_tof_card(bt, LENGTH_TOF_VEHICLE, reader_id, wTickCount, strTime, strHistTime);
  7814. nCurPos += LENGTH_TOF_VEHICLE;
  7815. break;
  7816. }
  7817. case CHAR_LOCATEDATA_TDOA:
  7818. {
  7819. memset(bt, 0, LENGTH_RECORD_MAX);
  7820. memcpy(bt, &DataBuffer[nCurPos], LENGTH_TDOA_VEHICLE);
  7821. parse_data_locate_card_his_tdoa_card(bt, LENGTH_TOF_VEHICLE, reader_id, wTickCount, strTime, strHistTime);
  7822. nCurPos += LENGTH_TDOA_VEHICLE;
  7823. break;
  7824. }
  7825. case CHAR_READER_SYNC_TIME:
  7826. {
  7827. memset(bt, 0, LENGTH_RECORD_MAX);
  7828. memcpy(bt, &DataBuffer[nCurPos], LENGTH_SYNC_TIME);
  7829. parse_data_locate_card_his_sync_time(bt, LENGTH_TOF_VEHICLE, strTime, strHistTime, CHAR_READER_SYNC_TIME);
  7830. nCurPos += LENGTH_SYNC_TIME;
  7831. break;
  7832. }
  7833. case CHAR_READER_SYNC_TIME_ROOT:
  7834. {
  7835. memset(bt, 0, LENGTH_RECORD_MAX);
  7836. memcpy(bt, &DataBuffer[nCurPos], LENGTH_SYNC_TIME_ROOT);
  7837. parse_data_locate_card_his_sync_time(bt, LENGTH_TOF_VEHICLE, strTime, strHistTime, CHAR_READER_SYNC_TIME_ROOT);
  7838. nCurPos += LENGTH_SYNC_TIME;
  7839. break;
  7840. }
  7841. default:
  7842. break;
  7843. }
  7844. }
  7845. delete[] bt;
  7846. bt = NULL;
  7847. }
  7848. void CYAServerDlg::parse_data_locate_card_his_tof_card( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime )
  7849. {
  7850. int nCurPos = 0;
  7851. BYTE btCardType = 0;
  7852. memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE));
  7853. nCurPos += sizeof(BYTE);
  7854. DWORD dwCardId = 0;
  7855. CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos);
  7856. nCurPos += sizeof(DWORD);
  7857. string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10);
  7858. char sql[LENGTH_SQL] = {0};
  7859. bool b_exec = false;
  7860. switch(btCardType)
  7861. {
  7862. case CT_VEHICLE:
  7863. {
  7864. //报文时间
  7865. WORD wCardTickCount = 0;
  7866. CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos);
  7867. nCurPos += sizeof(WORD);
  7868. BYTE btTypeAndPower = 0;
  7869. memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE));
  7870. nCurPos += sizeof(BYTE);
  7871. //报文类型
  7872. BYTE btType = 0;
  7873. btType = (btTypeAndPower >>4) & 0x0F;
  7874. //电池电量
  7875. BYTE btPower = 0;
  7876. btPower = btTypeAndPower & 0x0F;
  7877. //保留
  7878. nCurPos += sizeof(BYTE);
  7879. //加速度
  7880. BYTE btAcceleration = 0;
  7881. memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE));
  7882. nCurPos += sizeof(BYTE);
  7883. //定位时间戳Tsp // 字序
  7884. LONG64 lTime1 = 0;
  7885. BYTE btTemp = 0;
  7886. int nRangingPos = nCurPos;
  7887. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  7888. nCurPos += sizeof(BYTE);
  7889. DWORD dwTemp = 0;
  7890. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  7891. nCurPos += sizeof(DWORD);
  7892. lTime1 = btTemp;
  7893. lTime1 = lTime1 << 32;
  7894. lTime1 |= dwTemp;
  7895. double dbldist = CFunctions::getDistance(lTime1);
  7896. BYTE btAntenna = 0;
  7897. memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE));
  7898. nCurPos += sizeof(BYTE);
  7899. btAntenna = btAntenna & 0xFF;
  7900. b_exec = true;
  7901. sprintf_s(sql, LENGTH_SQL,
  7902. "INSERT INTO his_raw_data(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \
  7903. fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time ) \
  7904. VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s');",
  7905. str_card_id.c_str(), reader_id, btAntenna, wTickCount, wCardTickCount, lTime1, dbldist, btType,
  7906. btPower,btAcceleration, CFunctions::wc2c(strHistTime), CFunctions::wc2c(strTime));
  7907. //if(CHAR_LOCATEDATAHIS_TDOA == wChr ){
  7908. // // 分站时间同步序列号
  7909. // WORD wSyncNum = 0;
  7910. // CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  7911. // nCurPos += sizeof(WORD);
  7912. // // 信号强度
  7913. // WORD wStrength = 0;
  7914. // CFunctions::getWord(DataBuffer, &wStrength, nCurPos);
  7915. // nCurPos += sizeof(WORD);
  7916. //}
  7917. break;
  7918. }
  7919. case CT_PERSON:
  7920. {
  7921. break;
  7922. }
  7923. default:
  7924. {
  7925. break;
  7926. }
  7927. }
  7928. try
  7929. {
  7930. if(b_exec){
  7931. execute_sql(sql);
  7932. }
  7933. }
  7934. catch (...)
  7935. {
  7936. }
  7937. }
  7938. void CYAServerDlg::parse_data_locate_card_his_tdoa_card( BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime )
  7939. {
  7940. int nCurPos = 0;
  7941. BYTE btCardType = 0;
  7942. memcpy(&btCardType, &DataBuffer[nCurPos], sizeof(BYTE));
  7943. nCurPos += sizeof(BYTE);
  7944. DWORD dwCardId = 0;
  7945. CFunctions::getDWord(DataBuffer, &dwCardId, nCurPos);
  7946. nCurPos += sizeof(DWORD);
  7947. string str_card_id = CFunctions::getstrwithzero(btCardType, 3) + CFunctions::getstrwithzero(dwCardId, 10);
  7948. char sql[LENGTH_SQL] = {0};
  7949. bool b_exec = false;
  7950. switch(btCardType)
  7951. {
  7952. case CT_VEHICLE:
  7953. {
  7954. //报文时间
  7955. WORD wCardTickCount = 0;
  7956. CFunctions::getWord(DataBuffer, &wCardTickCount, nCurPos);
  7957. nCurPos += sizeof(WORD);
  7958. BYTE btTypeAndPower = 0;
  7959. memcpy(&btTypeAndPower, &DataBuffer[nCurPos], sizeof(BYTE));
  7960. nCurPos += sizeof(BYTE);
  7961. //报文类型
  7962. BYTE btType = 0;
  7963. btType = (btTypeAndPower >>4) & 0x0F;
  7964. //电池电量
  7965. BYTE btPower = 0;
  7966. btPower = btTypeAndPower & 0x0F;
  7967. //保留
  7968. nCurPos += sizeof(BYTE);
  7969. //加速度
  7970. BYTE btAcceleration = 0;
  7971. memcpy(&btAcceleration, &DataBuffer[nCurPos], sizeof(BYTE));
  7972. nCurPos += sizeof(BYTE);
  7973. //定位时间戳Tsp // 字序
  7974. LONG64 lTime1 = 0;
  7975. BYTE btTemp = 0;
  7976. int nRangingPos = nCurPos;
  7977. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  7978. nCurPos += sizeof(BYTE);
  7979. DWORD dwTemp = 0;
  7980. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  7981. nCurPos += sizeof(DWORD);
  7982. lTime1 = btTemp;
  7983. lTime1 = lTime1 << 32;
  7984. lTime1 |= dwTemp;
  7985. double dbldist = 0;
  7986. BYTE btAntenna = 0;
  7987. memcpy(&btAntenna, &DataBuffer[nCurPos], sizeof(BYTE));
  7988. nCurPos += sizeof(BYTE);
  7989. btAntenna = btAntenna & 0xFF;
  7990. // 分站时间同步序列号
  7991. WORD wSyncNum = 0;
  7992. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  7993. nCurPos += sizeof(WORD);
  7994. // 信号强度
  7995. WORD wStrength = 0;
  7996. CFunctions::getWord(DataBuffer, &wStrength, nCurPos);
  7997. nCurPos += sizeof(WORD);
  7998. double dblaccx, dblaccy, dblaccz;
  7999. dblaccx = dblaccy = dblaccz = 0;
  8000. b_exec = true;
  8001. sprintf_s(sql, LENGTH_SQL,
  8002. "INSERT INTO his_raw_data_tdoa(card_id, reader_id, antenna_id, reader_stamp, card_stamp, \
  8003. fly_time, distance, ranging_type, power_state, accelerate, his_time, rec_time, sync_num, strength, acc_x, acc_y, acc_z) \
  8004. VALUES(%s, %d, %d, %d, %d, %lld, %4.f, %d, %d, %d, '%s', '%s', %d, %d, %4.f, %4.f, %4.f);",
  8005. str_card_id.c_str(), reader_id, btAntenna, wTickCount, wCardTickCount, lTime1, dbldist, btType,
  8006. btPower,btAcceleration, CFunctions::wc2c(strHistTime), CFunctions::wc2c(strTime), wSyncNum, wStrength, dblaccx, dblaccy, dblaccz);
  8007. break;
  8008. }
  8009. case CT_PERSON:
  8010. {
  8011. break;
  8012. }
  8013. default:
  8014. {
  8015. break;
  8016. }
  8017. }
  8018. try
  8019. {
  8020. if(b_exec){
  8021. execute_sql(sql);
  8022. }
  8023. }
  8024. catch (...)
  8025. {
  8026. }
  8027. }
  8028. void CYAServerDlg::parse_data_locate_card_his_sync_time( BYTE* DataBuffer, int nLen, CString strTime, CString strHistTime, WORD wChr )
  8029. {
  8030. char sql[LENGTH_SQL] = {0};
  8031. bool b_exec = false;
  8032. int nCurPos = 0;
  8033. DWORD dwReaderID = 0; // 本机分站号
  8034. CFunctions::getDWord(DataBuffer, &dwReaderID, nCurPos);
  8035. nCurPos += sizeof(DWORD);
  8036. BYTE btAnt = 0; // 本机发送天线
  8037. memcpy(&btAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  8038. nCurPos += sizeof(BYTE);
  8039. DWORD dwUpperReaderID = 0; // root分站号
  8040. CFunctions::getDWord(DataBuffer, &dwUpperReaderID, nCurPos);
  8041. nCurPos += sizeof(DWORD);
  8042. BYTE btUpperAnt = 0; // root天线
  8043. memcpy(&btUpperAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  8044. nCurPos += sizeof(BYTE);
  8045. WORD wSyncNum = 0; // 序列号
  8046. CFunctions::getWord(DataBuffer, &wSyncNum, nCurPos);
  8047. nCurPos += sizeof(WORD);
  8048. WORD wSyncLevel = 0; // 同步等级
  8049. CFunctions::getWord(DataBuffer, &wSyncLevel, nCurPos);
  8050. nCurPos += sizeof(WORD);
  8051. LONG64 lTime1 = 0, lTime2 = 0;
  8052. BYTE btTemp = 0;
  8053. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  8054. nCurPos += sizeof(BYTE);
  8055. DWORD dwTemp = 0;
  8056. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  8057. nCurPos += sizeof(DWORD);
  8058. lTime1 = btTemp; // 本机发送时间戳
  8059. lTime1 = lTime1 << 32;
  8060. lTime1 |= dwTemp;
  8061. btTemp = 0;
  8062. dwTemp = 0;
  8063. memcpy(&btTemp, &DataBuffer[nCurPos], sizeof(BYTE));
  8064. nCurPos += sizeof(BYTE);
  8065. CFunctions::getDWord(DataBuffer, &dwTemp, nCurPos);
  8066. nCurPos += sizeof(DWORD);
  8067. lTime2 = btTemp; // 本机接收时间戳
  8068. lTime2 = lTime2 << 32;
  8069. lTime2 |= dwTemp;
  8070. DWORD dwRootReaderID = 0; // root分站号
  8071. BYTE btRootAnt = 0; // root天线
  8072. if(CHAR_READER_SYNC_TIME_ROOT == wChr){
  8073. CFunctions::getDWord(DataBuffer, &dwRootReaderID, nCurPos);
  8074. nCurPos += sizeof(DWORD);
  8075. memcpy(&btRootAnt, &DataBuffer[nCurPos], sizeof(BYTE));
  8076. nCurPos += sizeof(BYTE);
  8077. }
  8078. sprintf_s(sql, LENGTH_SQL,
  8079. "INSERT INTO his_raw_data_tdoa(reader_id, ant_id, parent_reader_id, parent_ant_id, sync_num, sync_level,\
  8080. send_timestamp, rec_timestamp, his_time, rec_time, root_reader_id, root_ant_id) \
  8081. VALUES(%d, %d, %d, %d, %d, %d, %lld, %lld, '%s', '%s', %d, %d);",
  8082. dwReaderID, btAnt, dwUpperReaderID, btUpperAnt , wSyncNum, wSyncLevel, lTime1, lTime2,
  8083. CFunctions::wc2c(strHistTime), CFunctions::wc2c(strTime), dwRootReaderID, btRootAnt);
  8084. try
  8085. {
  8086. execute_sql(sql);
  8087. }
  8088. catch (...)
  8089. {
  8090. }
  8091. }
  8092. void CYAServerDlg::OnEnUpdateEditReaderid()
  8093. {
  8094. // TODO: 在此添加控件通知处理程序代码
  8095. UpdateData(TRUE);
  8096. }
  8097. void CYAServerDlg::parse_json_data_call_card_cancel(message::ptr const& data )
  8098. {
  8099. EnterCriticalSection(&m_csCallInfo);
  8100. CString strlog;
  8101. string call_id, user_name, call_time;
  8102. string cardid, readerid;
  8103. int call_time_out, reader_count, card_count;
  8104. map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  8105. /*if(m_log_recv_package){
  8106. string s_log = "";
  8107. AfxMessageBox(CFunctions::c2wc(s_log.c_str()));
  8108. writeErrorLog(_T("JSON_R"),CFunctions::c2wc(s_log.c_str()),false);
  8109. } */
  8110. call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string();
  8111. user_name = data_map[JSON_KEY_CALL_CARD_USER_NAME]->get_string();
  8112. call_time = data_map[JSON_KEY_CALL_CARD_CALL_TIME]->get_string();
  8113. vector<message::ptr> reader_vec = data_map[JSON_KEY_CALL_CARD_STATIONS]->get_vector();
  8114. vector<message::ptr> card_vec = data_map[JSON_KEY_CALL_CARD_CARDS]->get_vector();
  8115. if(reader_vec.size() == 0 && card_vec.size() == 0)
  8116. {
  8117. return;
  8118. }
  8119. int reader_id, npos;
  8120. SocketMap::iterator it_sock;
  8121. BYTE buf[LENGTH_SEND_BUF];
  8122. std::shared_ptr<_call_info_reader> call_reader;
  8123. _call_info_card* call_card;
  8124. //取消呼叫有两种:
  8125. //从分站取消呼叫,即取消全员呼叫
  8126. //对指定卡取消呼叫
  8127. vector<message::ptr>::const_iterator it_reader = reader_vec.begin();
  8128. if(reader_vec.size() > 0){
  8129. for(; it_reader != reader_vec.end(); ++it_reader){
  8130. string s_reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_string();
  8131. reader_id = atoi(s_reader_id.c_str());
  8132. CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
  8133. if(it_call_reader != mp_call_info.end()){
  8134. call_reader = it_call_reader->second;
  8135. call_reader->is_start_call = false;
  8136. call_reader->is_call_all = false;
  8137. vector<message::ptr>::const_iterator it_card = card_vec.begin();
  8138. if(card_vec.size() == 0 || "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){
  8139. if(call_reader->cards_count){
  8140. CallInfoCardMap::iterator it_reader_card = call_reader->mpCard.begin();
  8141. for(; it_reader_card != call_reader->mpCard.end();){
  8142. call_reader->mpCard.erase(++it_reader_card);
  8143. }
  8144. }
  8145. call_reader->mpCard.clear();
  8146. mp_call_info.erase(it_call_reader);
  8147. call_reader->cards_count = 0;
  8148. }else{
  8149. BYTE card_type = 0;
  8150. for(; it_card != card_vec.end(); ++it_card){
  8151. string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
  8152. string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
  8153. CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
  8154. if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
  8155. call_reader->mpCard.erase(it_call_card);
  8156. }
  8157. }
  8158. if(call_reader->mpCard.size() == 0){
  8159. call_reader->mpCard.clear();
  8160. mp_call_info.erase(it_call_reader);
  8161. }
  8162. }
  8163. call_reader->cards_count = 0;
  8164. }
  8165. }
  8166. }
  8167. it_reader = reader_vec.begin();
  8168. if(it_reader == reader_vec.end() && card_vec.size() > 0){
  8169. vector<message::ptr>::const_iterator it_card = card_vec.begin();
  8170. BYTE card_type = 0;
  8171. for(; it_card != card_vec.end(); ++it_card){
  8172. string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
  8173. string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
  8174. int reader_id = mp_card_list_down_adhoc.find(s_card_id)->second->reader_id;
  8175. call_reader = mp_call_info.find(reader_id)->second;
  8176. call_reader->is_start_call = false;
  8177. CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
  8178. if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
  8179. call_reader->mpCard.erase(it_call_card);
  8180. }
  8181. }
  8182. }
  8183. LeaveCriticalSection(&m_csCallInfo);
  8184. strlog.Format(_T("%s%s"), _T(LOG_CANCEL_CALL_CARD), _T(LOG_SUCCESS));
  8185. show_log(strlog);
  8186. }
  8187. void CYAServerDlg::OnAbout()
  8188. {
  8189. // TODO: 在此添加命令处理程序代码
  8190. CAboutDlg dlg;
  8191. dlg.DoModal();
  8192. }
  8193. void CYAServerDlg::OnReConnect( unsigned, unsigned )
  8194. {
  8195. is_websocket_login = false;
  8196. is_websocket_ok = false;
  8197. }
  8198. int CYAServerDlg::init_patrol_info(std::string card_id) //int task_id)
  8199. {
  8200. CMysqlConn* pConn = NULL;
  8201. CDBConnGuard pDbGuard(pConn);
  8202. if(pConn == NULL){
  8203. return 1;
  8204. }
  8205. MYSQL_RES* pRes;
  8206. MYSQL_ROW pRow;
  8207. int err = 0;
  8208. char buf[LENGTH_SQL] = {0};
  8209. if(card_id == ""){
  8210. sprintf_s(buf, "select pt.patrol_task_id, s.card_id, pt.staff_id, pt.start_time, pt.end_time,\
  8211. ppd.patrol_point_id, ppd.idx, ppd.duration_last, ppd.duration_stay_min, ppd.duration_stay_max,\
  8212. ppd.duration_ranging, ps.x, ps.y, ps.z, ps.map_id, ps.ranging, pt.patrol_path_id\
  8213. from dat_patrol_task pt, dat_patrol_path_detail ppd, dat_patrol_point ps, dat_staff s\
  8214. where pt.patrol_path_id = ppd.patrol_path_id and ppd.patrol_point_id = ps.patrol_point_id\
  8215. and pt.card_id = s.card_id -- and pt.end_time >= curtime()\
  8216. and not exists(select 1 from dat_patrol_task where staff_id = pt.staff_id and start_time < pt.start_time)\
  8217. order by pt.patrol_task_id, ppd.idx");
  8218. }else{
  8219. sprintf_s(buf, "select pt.patrol_task_id, pt.card_id, s.staff_id, pt.start_time, pt.end_time,\
  8220. ppd.patrol_point_id, ppd.idx, ppd.duration_last, ppd.duration_stay_min, ppd.duration_stay_max,\
  8221. ppd.duration_ranging, ps.x, ps.y, ps.z, ps.map_id, ps.ranging, pt.patrol_path_id\
  8222. from dat_patrol_task pt, dat_patrol_path_detail ppd, dat_patrol_point ps, dat_staff s\
  8223. where pt.card_id = %s and pt.patrol_path_id = ppd.patrol_path_id and ppd.patrol_point_id = ps.patrol_point_id\
  8224. and pt.card_id = s.card_id -- and pt.end_time >= curtime()\
  8225. and not exists(select 1 from dat_patrol_task where staff_id = pt.staff_id and start_time < pt.start_time)\
  8226. order by pt.patrol_task_id, ppd.idx;", card_id.c_str());
  8227. }
  8228. pRes = pConn->Execute(buf, err);
  8229. std::shared_ptr<PatrolTask> pTask = nullptr;
  8230. std::shared_ptr<PatrolPoint> pPatrolPoint = nullptr;
  8231. int nRow = 0;
  8232. int tmp_task_id = 0, last_task_id = 0;
  8233. int tmp_duration = 0;
  8234. std::string tmp_time;
  8235. while(pRow = mysql_fetch_row(pRes)){
  8236. tmp_task_id = atoi(pRow[0]);
  8237. if(tmp_task_id != last_task_id){
  8238. last_task_id = tmp_task_id;
  8239. nRow++;
  8240. PatrolTaskCheckMap::iterator it_card_task = mp_card_task_list.find(pRow[1]); // 卡的任务列表
  8241. if(it_card_task != mp_card_task_list.end()){
  8242. pTask = it_card_task->second; // 查找到本条任务
  8243. }else{
  8244. pTask = std::make_shared<PatrolTask>();
  8245. pTask->patrol_task_id = atoi(pRow[0]);
  8246. pTask->card_id = pRow[1];
  8247. pTask->starffer_id = pRow[2];
  8248. pTask->patrol_path_id = atoi(pRow[16]);
  8249. //tmp_time = pRow[3];
  8250. API_StringToTime(pRow[3], pTask->start_time);
  8251. API_StringToTime(pRow[4], pTask->end_time);
  8252. mp_card_task_list.insert(make_pair(pRow[1], pTask));
  8253. }
  8254. tmp_duration = 0;
  8255. }
  8256. tmp_duration += atoi(pRow[12]);
  8257. PatrolPointMap::iterator it_point = pTask->mpPoint.find(atoi(pRow[5]));
  8258. if(it_point != pTask->mpPoint.end()){
  8259. pPatrolPoint = it_point->second;
  8260. }else{
  8261. pPatrolPoint = std::make_shared<PatrolPoint>();
  8262. pPatrolPoint->idx = atoi(pRow[5]);
  8263. }
  8264. pPatrolPoint->patrol_point_id = atoi(pRow[6]);
  8265. pPatrolPoint->x = atof(pRow[7]);
  8266. pPatrolPoint->y = atof(pRow[8]);
  8267. pPatrolPoint->z = atof(pRow[9]);
  8268. pPatrolPoint->map_id = atoi(pRow[10]);
  8269. pPatrolPoint->ranging = atof(pRow[11]);
  8270. pPatrolPoint->duration_last = tmp_duration; //atoi(pRow[12]);
  8271. pPatrolPoint->duration_stay_min = atoi(pRow[13]);
  8272. pPatrolPoint->duration_stay_max = atoi(pRow[14]);
  8273. pPatrolPoint->duration_ranging = atoi(pRow[15]);
  8274. }
  8275. mysql_free_result(pRes);
  8276. CString strlog;
  8277. strlog.Format(_T("%s%d%s"), _T(LOG_INIT_PATROL), nRow, _T(LOG_RECORD_COUNT));
  8278. show_log(strlog);
  8279. return 0;
  8280. }
  8281. void CYAServerDlg::deal_call_edit_patrol_task( string id, EDIT_TYPE_ID edit_type_id )
  8282. {
  8283. CString strlog = _T("");
  8284. switch (edit_type_id)
  8285. {
  8286. case ET_INSERT:
  8287. {
  8288. init_patrol_info(id);
  8289. break;
  8290. }
  8291. case ET_UPDATE:
  8292. {
  8293. init_patrol_info(id);
  8294. break;
  8295. }
  8296. case ET_DELETE:
  8297. {
  8298. PatrolTaskCheckMap::iterator it_task = mp_card_task_list.begin();
  8299. for(; it_task != mp_card_task_list.end(); ++it_task){
  8300. if(it_task->second->card_id == id){
  8301. mp_card_task_list.erase(it_task);
  8302. break;
  8303. }
  8304. }
  8305. break;
  8306. }
  8307. default:
  8308. break;
  8309. }
  8310. strlog.Format(_T("%s%s"), _T(LOG_EDIT_PATROL_TASK), _T(LOG_SUCCESS));
  8311. show_log(strlog);
  8312. }
  8313. void CYAServerDlg::check_patrol()
  8314. {
  8315. std::shared_ptr<PatrolTask> pTask = nullptr;
  8316. std::shared_ptr<Card> pCard = nullptr;
  8317. std::shared_ptr<PatrolPoint> pPoint, pNextPoint = nullptr;
  8318. double cur_point_dist = 0;
  8319. time_t tmp_time = time(NULL);
  8320. PatrolTaskCheckMap::iterator it_card_task = mp_card_task_list.begin();
  8321. for(; it_card_task != mp_card_task_list.end(); ++it_card_task){
  8322. pTask = it_card_task->second;
  8323. CardMap::iterator it_card = mp_card_list_down_person.find(pTask->card_id);
  8324. if(it_card != mp_card_list_down_person.end()){
  8325. pCard = it_card->second;
  8326. PatrolPointMap::iterator it_point = pTask->mpPoint.find(pTask->cur_point_idx); //
  8327. if(it_point != pTask->mpPoint.end()){
  8328. pPoint = it_point->second;
  8329. pNextPoint = (++it_point)->second;
  8330. cur_point_dist = sqrt(pow(pCard->x - pPoint->x, 2) + pow(pCard->y - pPoint->y, 2) + pow(pCard->z - pPoint->z, 2));
  8331. if(!pTask->is_in_cur_point){ // 未进入当前节点区域
  8332. if(cur_point_dist < pPoint->ranging){ // 在合法范围内
  8333. pTask->is_in_cur_point = true;
  8334. pTask->enter_time = tmp_time;
  8335. // 当前时间小于应到时间
  8336. if(difftime(pTask->start_time, tmp_time) < (pPoint->duration_last - pPoint->duration_ranging) * 60){
  8337. // 早到
  8338. pTask->state = PS_EARLY;
  8339. }else if(difftime(pTask->start_time, tmp_time) <= (pPoint->duration_last + pPoint->duration_ranging ) * 60 && // 在合理时间范围
  8340. difftime(pTask->end_time, tmp_time) >= (pPoint->duration_last - pPoint->duration_ranging) * 60){
  8341. // 正常
  8342. pTask->state = PS_NORMAL;
  8343. }else if(difftime(pTask->start_time, tmp_time) > (pPoint->duration_last + pPoint->duration_ranging) * 60){ // 超过最晚应到时间
  8344. // 迟到
  8345. pTask->state = PS_LATE;
  8346. }
  8347. }else{ // 不再范围内,判断是否超过最晚应到时间,超过,直接按未到计算(即按照下一节点计算)
  8348. if(difftime(pTask->start_time, tmp_time) > (pPoint->duration_last + pPoint->duration_ranging) * 60){
  8349. pTask->state = PS_NON_ARRIVAL;
  8350. //保存数据本节点数据
  8351. save_patrol_data(pTask, pPoint);
  8352. pTask->cur_point_idx++;
  8353. }
  8354. }
  8355. }else{ // 已进入当前节点区域
  8356. if(cur_point_dist > pPoint->ranging){ // 在合法范围外,即离开合法范围
  8357. pTask->is_in_cur_point = false;
  8358. pTask->leave_time = tmp_time;
  8359. pTask->duration_stay = difftime(pTask->leave_time, pTask->enter_time);
  8360. if(pTask->duration_stay < pPoint->duration_stay_min){
  8361. pTask->stay_state = PSS_TOO_SHORT;
  8362. }else if(pTask->duration_stay <= pPoint->duration_stay_max){
  8363. pTask->stay_state = PSS_NORMAL;
  8364. }else{
  8365. pTask->stay_state = PSS_TOO_LONG;
  8366. }
  8367. // 保存本节点数据
  8368. save_patrol_data(pTask, pPoint);
  8369. pTask->cur_point_idx++;
  8370. }
  8371. }
  8372. }
  8373. }
  8374. }
  8375. }
  8376. void CYAServerDlg::save_patrol_data( std::shared_ptr<PatrolTask> pTask, std::shared_ptr<PatrolPoint> pPoint )
  8377. {
  8378. char sql[LENGTH_SQL] = {'\0'};
  8379. char _time[STR_LEN_TIME], _time_ex[STR_LEN_TIME];
  8380. struct tm local_time, local_time_ex;
  8381. localtime_s(&local_time, &pTask->enter_time);
  8382. localtime_s(&local_time_ex, &pTask->leave_time);
  8383. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  8384. strftime(_time_ex, 30, "%Y-%m-%d %H:%M:%S", &local_time_ex);
  8385. sprintf_s(sql, LENGTH_SQL,
  8386. "INSERT INTO his_patrol_data(patrol_task_id, patrol_path_id, patrol_point_id, idx, enter_time, leave_time, patrol_state_id, patrol_stay_state_id, card_id)\
  8387. values(%d, %d, %d, %d, '%s', '%s', %d, %d, '%s')",
  8388. pTask->patrol_task_id, pTask->patrol_path_id, pPoint->patrol_point_id, pPoint->idx, _time, _time_ex, pTask->card_id);
  8389. execute_sql(sql);
  8390. }
  8391. int CYAServerDlg::delete_patrol_info( std::string card_id )
  8392. {
  8393. return 0;
  8394. PatrolTaskCheckMap::iterator it_card_task = mp_card_task_list.find(card_id); // 卡的任务列表
  8395. if(it_card_task != mp_card_task_list.end()){
  8396. mp_card_task_list.erase(it_card_task);
  8397. }
  8398. return 0;
  8399. }
  8400. void CYAServerDlg::deal_card_lost_state()
  8401. {
  8402. CardMap::iterator it_staff = mp_card_list_down_person.begin();
  8403. time_t time_current = time(NULL);
  8404. STATUS_CARD nLost = STATUS_NORMAL;
  8405. for(; it_staff != mp_card_list_down_person.end(); ++it_staff){
  8406. nLost = difftime(time_current, it_staff->second->rec_time) > CARD_LOST_TIME_OUT ? STATUS_NORMAL :STATUS_LOST;
  8407. if(it_staff->second->status_lost != nLost){
  8408. it_staff->second->status_lost = nLost;
  8409. if(nLost == STATUS_LOST){
  8410. INT64 ev_id = CFunctions::GetMicroSecond();
  8411. std::shared_ptr<YaEvent> ev = std::make_shared<YaEvent>(ev_id);
  8412. ev->status = ES_START;
  8413. ev->ev_type = ET_CARD_LOST;
  8414. ev->obj_type = OT_CARD;
  8415. ev->obj_id = it_staff->second->card_id;
  8416. ev->cur_time = time_t(NULL);
  8417. ev->map_id = it_staff->second->map_id;
  8418. ev->area_id = it_staff->second->area_id;
  8419. ev->x = it_staff->second->x;
  8420. ev->y = it_staff->second->y;
  8421. ev->limit_value = CARD_LOST_TIME_OUT;
  8422. ev->cur_value = difftime(time_current, it_staff->second->rec_time);
  8423. ev->is_sent = false;
  8424. it_staff->second->m_event_list[ET_CARD_LOST] = ev_id;
  8425. store_data_event(ev);
  8426. add_event(ev);
  8427. }else{
  8428. INT64 ev_id = it_staff->second->m_event_list[ET_CARD_LOST];
  8429. if(ev_id > 0){
  8430. EventMap::iterator it_ev = mp_event_list->find(ev_id);
  8431. if(it_ev != mp_event_list->end()){
  8432. it_ev->second->status = ES_END;
  8433. it_ev->second->cur_time = time_t(NULL);
  8434. it_ev->second->cur_value = difftime(time_current, it_staff->second->rec_time);
  8435. it_ev->second->is_sent = false;
  8436. store_data_event(it_ev->second);
  8437. add_event(it_ev->second);
  8438. }
  8439. }
  8440. it_staff->second->m_event_list[ET_CARD_LOST] = 0;
  8441. }
  8442. }
  8443. }
  8444. nLost = STATUS_NORMAL;
  8445. CardMap::iterator it_vehicle = mp_card_list_down_vehicle.begin();
  8446. for(; it_vehicle != mp_card_list_down_vehicle.end(); ++it_vehicle){
  8447. if(it_vehicle->second->status_lost != nLost){
  8448. it_vehicle->second->status_lost = nLost;
  8449. if(nLost == STATUS_LOST){
  8450. INT64 ev_id = CFunctions::GetMicroSecond();
  8451. std::shared_ptr<YaEvent> ev = std::make_shared<YaEvent>(ev_id);
  8452. ev->status = ES_START;
  8453. ev->ev_type = ET_CARD_LOST;
  8454. ev->obj_type = OT_CARD;
  8455. ev->obj_id = it_vehicle->second->card_id;
  8456. ev->cur_time = time_t(NULL);
  8457. ev->map_id = it_vehicle->second->map_id;
  8458. ev->area_id = it_vehicle->second->area_id;
  8459. ev->x = it_vehicle->second->x;
  8460. ev->y = it_vehicle->second->y;
  8461. ev->limit_value = CARD_LOST_TIME_OUT;
  8462. ev->cur_value = difftime(time_current, it_vehicle->second->rec_time);
  8463. ev->is_sent = false;
  8464. it_vehicle->second->m_event_list[ET_CARD_LOST] = ev_id;
  8465. store_data_event(ev);
  8466. add_event(ev);
  8467. }else{
  8468. INT64 ev_id = it_vehicle->second->m_event_list[ET_CARD_LOST];
  8469. if(ev_id > 0){
  8470. EventMap::iterator it_ev = mp_event_list->find(ev_id);
  8471. if(it_ev != mp_event_list->end()){
  8472. it_ev->second->status = ES_END;
  8473. it_ev->second->cur_time = time_t(NULL);
  8474. it_ev->second->cur_value = difftime(time_current, it_vehicle->second->rec_time);
  8475. it_ev->second->is_sent = false;
  8476. store_data_event(it_ev->second);
  8477. add_event(it_ev->second);
  8478. }
  8479. }
  8480. it_vehicle->second->m_event_list[ET_CARD_LOST] = 0;
  8481. }
  8482. }
  8483. }
  8484. }
  8485. void CYAServerDlg::store_data_event( std::shared_ptr<YaEvent> ev )
  8486. {
  8487. char sql[LENGTH_SQL] = {'\0'};
  8488. char _time[STR_LEN_TIME];
  8489. struct tm local_time;
  8490. localtime_s(&local_time, &ev->cur_time);
  8491. strftime(_time, 30, "%Y-%m-%d %H:%M:%S", &local_time);
  8492. sprintf_s(sql, LENGTH_SQL,
  8493. "INSERT INTO his_event_data(event_id, status, event_type_id, obj_type_id, obj_id, \
  8494. map_id, area_id, limit_value, cur_value, x, y, cur_time, desc)\
  8495. VALUES(%lld, %d, %d, %d, %d, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s');",
  8496. ev->get_id(), ev->status, ev->ev_type, ev->obj_type, ev->obj_id.c_str(),
  8497. ev->map_id, ev->area_id, ev->limit_value, ev->cur_value, ev->x, ev->y, _time, ev->desc.c_str());
  8498. execute_sql(sql);
  8499. }
  8500. void CYAServerDlg::add_event( std::shared_ptr<YaEvent> ev )
  8501. {
  8502. EventMap::iterator it_ev = mp_event_list->find(ev->get_id());
  8503. if(it_ev != mp_event_list->end()){
  8504. it_ev->second->status = ev->status ;
  8505. it_ev->second->ev_type = ev->ev_type;
  8506. it_ev->second->obj_type = ev->obj_type;
  8507. it_ev->second->obj_id = ev->obj_id;
  8508. it_ev->second->cur_time = ev->cur_time;
  8509. it_ev->second->map_id = ev->map_id;
  8510. it_ev->second->area_id = ev->area_id;
  8511. it_ev->second->x = ev->x;
  8512. it_ev->second->y = ev->y;
  8513. it_ev->second->limit_value = ev->limit_value;
  8514. it_ev->second->cur_value = ev->cur_value;
  8515. it_ev->second->is_sent = ev->is_sent;
  8516. }else{
  8517. mp_event_list->insert(make_pair(ev->get_id(), ev));
  8518. }
  8519. }
  8520. std::string CYAServerDlg::get_json_event()
  8521. {
  8522. Json::Value root;
  8523. Json::Value data;
  8524. char _time[STR_LEN_TIME];
  8525. struct tm local_time;
  8526. char ev_id[STR_LEN_TIME];
  8527. EventMap::iterator it_ev = mp_event_list->begin();
  8528. for(; it_ev != mp_event_list->end(); ++it_ev){
  8529. if(!it_ev->second->is_sent){
  8530. Json::Value ev;
  8531. sprintf_s(ev_id, "%lld", it_ev->second->get_id());
  8532. ev[JSON_KEY_EVENT_EVENT_ID] = ev_id;
  8533. ev[JSON_KEY_EVENT_STATUS] = it_ev->second->status;
  8534. ev[JSON_KEY_EVENT_TYPE_ID] = it_ev->second->ev_type;
  8535. ev[JSON_KEY_EVENT_OBJ_TYPE_ID] = it_ev->second->obj_type;
  8536. ev[JSON_KEY_EVENT_OBJ_ID] = it_ev->second->obj_id;
  8537. ev[JSON_KEY_EVENT_MAP_ID] = it_ev->second->map_id;
  8538. ev[JSON_KEY_EVENT_AREA_ID] = it_ev->second->area_id;
  8539. ev[JSON_KEY_EVENT_X] = it_ev->second->x;
  8540. ev[JSON_KEY_EVENT_Y] = it_ev->second->y;
  8541. ev[JSON_KEY_EVENT_LIMIT_VALUE] = it_ev->second->limit_value;
  8542. ev[JSON_KEY_EVENT_CUR_VALUE] = it_ev->second->cur_value;
  8543. localtime_s(&local_time, &it_ev->second->cur_time);
  8544. strftime(_time, STR_LEN_TIME, "%Y-%m-%d %H:%M:%S", &local_time);
  8545. ev[JSON_KEY_EVENT_CUR_TIME] = _time;
  8546. data.append(ev);
  8547. it_ev->second->is_sent = true;
  8548. }else{
  8549. if(it_ev->second->status == ES_END){ // 删除
  8550. }
  8551. }
  8552. }
  8553. std::string ret = "";
  8554. if(data != NULL){
  8555. root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_EVENT;
  8556. root[JSON_ROOT_KEY_VERSION] = INTERFACE_VERSION;
  8557. root[JSON_ROOT_KEY_DATA] = data;
  8558. ret = root.toFastString();
  8559. }
  8560. return ret;
  8561. }