YAServerDlg.cpp 286 KB

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