CardIssuerFSM.cpp 214 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpHelper.h"
  4. #include "CardIssuerFSM.h"
  5. #include "GetDevInfoHelper.h"
  6. #include "EventCode.h"
  7. #include "RVCComm.h"
  8. //oilyang@20200522 go on using
  9. // deprecated!! [4/17/2020 16:15 @Gifur]
  10. #include "CardIssuer_UserErrorCode.h" //后续替代EventCode.h,暂时混合使用,时间太紧
  11. #include "CommDevEntityErrorCode.h"
  12. #include "CardIssuer_msg_g.h"
  13. #include "ModuleMix.h"
  14. #include "fileutil.h"
  15. #include <algorithm>
  16. //CSimpleStringA<T> ambigulous
  17. //#include <atltime.h>
  18. char tmpxx[1024];
  19. char testIC[1024];
  20. #include "CardIssuerClass.h"
  21. #include "mod_cardissuer.h"
  22. #include "stdafx.h"
  23. //oiltest@20200915 temp for GetTickCount
  24. #ifdef RVC_OS_WIN
  25. #define _ATL_NO_AUTOMATIC_NAMESPACE
  26. #include <winsock2.h>
  27. #include <Ws2bth.h>
  28. // Link to Bthprops.lib
  29. #include <BluetoothAPIs.h>
  30. #pragma comment (lib, "Ws2_32.lib")
  31. #pragma comment (lib, "Bthprops.lib")
  32. #else
  33. #include<sys/time.h>
  34. #include <dlfcn.h>
  35. #endif //RVC_OS_WIN
  36. unsigned long long GetTickCountRVC() {
  37. #ifdef RVC_OS_WIN
  38. return GetTickCount64();
  39. #else
  40. struct timespec ts;
  41. clock_gettime(CLOCK_MONOTONIC, &ts);
  42. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  43. #endif //RVC_OS_WIN
  44. }
  45. #define CARDREADER_INIT_COUNT 3
  46. #define GET_DEV_STATUS_COUNT 1//oilyang@20180104 change from 3 to 1,no need to test 3 times
  47. const int TIMER1 = 1;
  48. const int TIMER_EJECT = 2;
  49. const int INSERT_INTERVAL = 300;
  50. const int EJECT_INTERVAL = 300;
  51. const int INSERT_TRY_NUM = 200;
  52. const int READ_TRY_NUM = 1;//oiltmp
  53. const int RESET_TRY_NUM = 3;
  54. const int WAIT_TRY_NUM = 120;
  55. const int WAIT_INTERVAL = 500;
  56. const int MAX_RESET_TIMEROUT = 5000;
  57. const int MAX_RESET_TIMES_PERIOD = 0;//oiltmp configure to ini file?
  58. const int READ_TRY_INTERVAL = 300;
  59. const int INIT_TRY_NUM = 3;
  60. const int ACCEPT_TRY_INTERVAL = 500;
  61. const int ACCEPT_TRY_NUM = 110;
  62. //const int MAX_TEST_SHOW = 1024;
  63. CRITICAL_SECTION g_sciRecord;
  64. const unsigned char hextable[] = { "0123456789ABCDEF" };
  65. void ConvAscii(unsigned char* Hex, char* Ascii, unsigned int len)
  66. {
  67. unsigned int i;
  68. for (i = 0; i < len; i++)
  69. {
  70. Ascii[2 * i] = hextable[Hex[i] >> 4];
  71. Ascii[2 * i + 1] = hextable[Hex[i] & 0xf];
  72. }
  73. Ascii[2 * len] = 0;
  74. }
  75. //*******************************************************************************
  76. void AsciiToHex(char* Ascii, unsigned char* Hex, int len)
  77. {
  78. int i;
  79. unsigned char ch;
  80. for (i = 0; i < len; i = i + 2)
  81. {
  82. ch = (Ascii[i] & 0xf);
  83. if (Ascii[i] > '9')
  84. ch += 9;
  85. Hex[i / 2] = ch << 4;
  86. ch = Ascii[i + 1] & 0xf;
  87. if (Ascii[i + 1] > '9')
  88. ch += 9;
  89. Hex[i / 2] += ch;
  90. }
  91. }
  92. class CCardIssuerEntity;
  93. void CCardIssuerFSM::s0_on_entry()
  94. {
  95. LOG_FUNCTION();
  96. m_currentFSMState = 0;
  97. SetDevStateAndSendMsg(DEVICE_STATUS_NOT_READY);
  98. FSMEvent *e;
  99. //经典大机 或者卡库
  100. //oilyang@20200426 add "Desk2S 2.1","Desk1S 1.0"
  101. if (!_strnicmp("RVC.Stand2S", m_csMachineType, strlen("RVC.Stand2S"))
  102. || !_strnicmp("RVC.CardStore", m_csMachineType, strlen("RVC.CardStore"))
  103. || (_strnicmp("RVC.Desk2S", m_csMachineType, strlen("RVC.Desk2S")) == 0 && m_majorVerion == 2 && m_minorVerion == 1)
  104. || (_strnicmp("RVC.Desk1S", m_csMachineType, strlen("RVC.Desk1S")) == 0 && m_majorVerion == 1 && m_minorVerion == 0))
  105. {
  106. e = new FSMEvent(USER_EVT_INIT);
  107. }
  108. //如果配置了便携发卡机
  109. else if (QueryIfCfgSCI() >= 1)
  110. {
  111. m_machineType = 2;//oiltmp
  112. e = new FSMEvent(USER_EVT_CONNECT);
  113. }
  114. //不是经典大机,又没有配置便携发卡机,转到NoCfgDev状态
  115. else
  116. {
  117. m_machineType = 3;//oiltmp
  118. e = new FSMEvent(USER_EVT_TRANSFER_TO_NOCFGDEV);
  119. }
  120. PostEventFIFO(e);
  121. }
  122. void CCardIssuerFSM::s0_on_exit()
  123. {
  124. LOG_FUNCTION();
  125. }
  126. unsigned int CCardIssuerFSM::s0_on_event(FSMEvent* pEvt)
  127. {
  128. LOG_FUNCTION();
  129. Dbg("s0 evt %d",pEvt->iEvt);
  130. switch (pEvt->iEvt)
  131. {
  132. case USER_EVT_INIT:
  133. {
  134. InitTask* task = new InitTask(this);
  135. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  136. pEvt->SetHandled();
  137. return 0;
  138. }
  139. break;
  140. case USER_EVT_CONNECT:
  141. break;
  142. case USER_EVT_TRANSFER_TO_NOCFGDEV:
  143. break;
  144. case USER_EVT_QUIT:
  145. break;
  146. case USER_EVT_TEST:
  147. break;
  148. default:
  149. break;
  150. }
  151. return 0;
  152. }
  153. //Initializing
  154. void CCardIssuerFSM::s1_on_entry()
  155. {
  156. LOG_FUNCTION();
  157. m_currentFSMState = 1;
  158. GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "N");
  159. }
  160. void CCardIssuerFSM::s1_on_exit()
  161. {
  162. LOG_FUNCTION();
  163. }
  164. unsigned int CCardIssuerFSM::s1_on_event(FSMEvent* event)
  165. {
  166. LOG_FUNCTION();
  167. if (event->iEvt == USER_EVT_INITFINISHED) {
  168. event->SetHandled();
  169. int err = event->param1;
  170. if (err == 0) {
  171. return 0;
  172. } else {
  173. return 1;
  174. }
  175. }else if (event->iEvt == USER_EVT_QUIT) {
  176. event->SetHandled();
  177. return 0;
  178. }
  179. return 0;
  180. }
  181. //Idle
  182. void CCardIssuerFSM::s2_on_entry()
  183. {
  184. LOG_FUNCTION();
  185. m_currentFSMState = 2;
  186. GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_IDLE);
  187. SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL, false);
  188. m_resetTimes = 0;
  189. m_testResult = Error_Succeed;
  190. m_bIssuingExit = false;
  191. m_scanCount = 0;
  192. if (m_connectType == DEV_OPEN_TYPE_BLUETOOTH && 0 == m_bBTChecking)
  193. {
  194. BluetoothCheckTask* task = new BluetoothCheckTask(this);
  195. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  196. Dbg("post bluetooth checking thread.");
  197. }
  198. else if(m_connectType != DEV_OPEN_TYPE_BLUETOOTH && 2 == m_bBTChecking)
  199. {
  200. m_bBTChecking = 1;
  201. Dbg("cancel bluetooth checking thread.");
  202. }
  203. //bool bret = FSMSetIssueFlag(8);
  204. //Dbg("oiltest20171219 %d",bret);
  205. //oiltmp 测试便携厂商发卡
  206. //m_pCardIssuer->SetIssuerCounter(0, 1);
  207. //m_pCardIssuer->MoveCard(CI_MOVECARD_FROM_HOPPER);
  208. //MagTracks magTracks;
  209. //magTracks.eRange = CI_TRACK_RANGE_2_3;
  210. //m_pCardIssuer->MagRead(magTracks);
  211. //Dbg("%s,%d,%d", magTracks.track[1].data, magTracks.track[1].dwSize, magTracks.track[1].eStatus);
  212. //m_pCardIssuer->MoveCard(CI_MOVECARD_FRONT_GATE);
  213. //ErrorCodeEnum err = m_pIDCard->SetCardInType(CARD_IN_TYPE_ALL);
  214. //Dbg("accept[%d]",err);
  215. //Sleep(WAIT_INTERVAL*10);
  216. //LPCardAccount* ppCardAccount;
  217. ////err = m_pIDCard->GetCardAccount(IDC_TRACK_1|IDC_TRACK_2|IDC_TRACK_3,&ppCardAccount);
  218. ////Dbg("read[%d]",err);
  219. ////Dbg("%d,%d,%d",ppCardAccount[0]->dataStatus,(ppCardAccount[1])->dataStatus,(ppCardAccount[2])->dataStatus);//,pCardAccount->data);
  220. ////Dbg("%d,%d,%d",ppCardAccount[0]->length,(ppCardAccount[1])->length,(ppCardAccount[2])->length);//,pCardAccount->data);
  221. ////Dbg("read data[%s][%s][%s]",(char*)(ppCardAccount[0]->data),(char*)(ppCardAccount[1]->data),(char*)(ppCardAccount[2]->data));
  222. //err = m_pIDCard->DectectCardType(m_cardType);
  223. //Dbg("detectcardtyp[%d][%d]",err,m_cardType);
  224. //err = m_pIDCard->ActiveCard();
  225. //Dbg("activecard[%d]",err);
  226. //vector<AIDData> vAIDs;
  227. //MessageBoxA(0,0,0,0);
  228. //if (m_cardType == CARDTYPE_CPU_T0 || m_cardType == CARDTYPE_CPU_T1)
  229. //{
  230. // BuildSupportedAppList(vAIDs);
  231. // Dbg("[%s]",testIC);
  232. // AppSelected(m_vADFRec.at(0).name,m_vADFRec.at(0).nameLen);
  233. //}
  234. }
  235. void CCardIssuerFSM::s2_on_exit()
  236. {
  237. LOG_FUNCTION();
  238. }
  239. unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
  240. {
  241. Dbg("s2 evt(%d)",pEvt->iEvt);
  242. int ret = 0;
  243. switch (pEvt->iEvt)
  244. {
  245. case USER_EVT_ACCEPT:
  246. {
  247. CardAcceptEvent *cae = dynamic_cast<CardAcceptEvent*>(pEvt);
  248. m_bCancelAccept = false;
  249. AcceptTask* task = new AcceptTask(this);
  250. task->ctx = cae->ctx;
  251. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  252. pEvt->SetHandled();
  253. }
  254. break;
  255. case USER_EVT_ISSUE:
  256. case USER_EVT_ISSUE_EX:
  257. {
  258. IssueTask* task = new IssueTask(this);
  259. CardIssueEvent *cie = NULL;
  260. CardIssueExEvent *ciee = NULL;
  261. if (pEvt->iEvt == USER_EVT_ISSUE)
  262. {
  263. cie = dynamic_cast<CardIssueEvent*>(pEvt);
  264. task->ctx = cie->ctx;
  265. task->ctxEx = NULL;
  266. }
  267. else
  268. {
  269. ciee = dynamic_cast<CardIssueExEvent*>(pEvt);
  270. task->ctxEx = ciee->ctx;
  271. task->ctx = NULL;
  272. }
  273. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  274. pEvt->SetHandled();
  275. }
  276. break;
  277. case USER_EVT_EXIT:
  278. {
  279. m_captureReason = "4001";
  280. m_bExit = true;
  281. pEvt->SetHandled();
  282. DoExitWhenIdleTask *task = new DoExitWhenIdleTask(this);
  283. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  284. }
  285. break;
  286. case USER_EVT_QUIT:
  287. pEvt->SetHandled();
  288. break;
  289. case USER_EVT_GET_MATERIAL:
  290. {
  291. pEvt->SetHandled();
  292. GetMaterialEvent *pGME = dynamic_cast<GetMaterialEvent*>(pEvt);
  293. pGME->ctx->Ans.captured = m_CardCaptured;
  294. pGME->ctx->Ans.remains = m_remainsEx[0];
  295. pGME->ctx->Ans.issued = m_issuedEx[0];
  296. pGME->ctx->Ans.mixed = m_mixedEx[0];
  297. Dbg("to answer get material suc.");
  298. pGME->ctx->Answer(Error_Succeed);
  299. }
  300. break;
  301. case USER_EVT_SET_MATERIAL:
  302. {
  303. m_bSettingMaterial = true;
  304. pEvt->SetHandled();
  305. bool bR, bC, bI, bM;
  306. bR = bC = bI = bM = true;
  307. SetMaterialEvent *pSME = dynamic_cast<SetMaterialEvent*>(pEvt);
  308. if (pSME->ctx->Req.bRemains)
  309. {
  310. m_CardInitEx[0] = m_remainsEx[0] = pSME->ctx->Req.remains;
  311. bR = SetCardRemains(pSME->ctx->Req.remains, 1, true);
  312. }
  313. if (pSME->ctx->Req.bCaptured)
  314. {
  315. m_CardCaptured = pSME->ctx->Req.captured;
  316. bC = SetCardCaptured(pSME->ctx->Req.captured);
  317. }
  318. if (pSME->ctx->Req.bIssued)
  319. {
  320. m_issuedEx[0] = pSME->ctx->Req.issued;
  321. bI = SetCardIssued(pSME->ctx->Req.issued, 1);
  322. }
  323. if (pSME->ctx->Req.bMixed)
  324. {
  325. m_mixedEx[0] = pSME->ctx->Req.mixed;
  326. bM = SetCardMixed(pSME->ctx->Req.mixed, 1);
  327. }
  328. if (bR && bC && bI && bM)
  329. pSME->ctx->Answer(Error_Succeed);
  330. else
  331. {
  332. Dbg("set material failed.r(%d),c(%d),i(%d),m(%d)", bR, bC, bI, bM);
  333. pSME->ctx->Answer(Error_Unexpect);
  334. }
  335. m_bSettingMaterial = false;
  336. }
  337. break;
  338. case USER_EVT_GET_MATERIAL_EX:
  339. {
  340. pEvt->SetHandled();
  341. GetMaterialExEvent *pGMEE = dynamic_cast<GetMaterialExEvent*>(pEvt);
  342. pGMEE->ctx->Ans.captured = m_CardCaptured;
  343. pGMEE->ctx->Ans.hasHopper.Init(3);
  344. pGMEE->ctx->Ans.CardBoxNo.Init(3);
  345. pGMEE->ctx->Ans.PsbCode.Init(3);
  346. pGMEE->ctx->Ans.PsbName.Init(3);
  347. pGMEE->ctx->Ans.Maintainer.Init(3);
  348. pGMEE->ctx->Ans.CardInit.Init(3);
  349. pGMEE->ctx->Ans.CardPercent.Init(3);
  350. pGMEE->ctx->Ans.remains.Init(3);
  351. pGMEE->ctx->Ans.issued.Init(3);
  352. pGMEE->ctx->Ans.mixed.Init(3);
  353. pGMEE->ctx->Ans.MaintainTime.Init(3);
  354. pGMEE->ctx->Ans.reserved1.Init(3);
  355. pGMEE->ctx->Ans.reserved2.Init(3);
  356. for (int i = 0; i < 3; ++i)
  357. {
  358. pGMEE->ctx->Ans.hasHopper[i] = m_bHasHopper[i];
  359. if (m_bHasHopper[i])
  360. {
  361. pGMEE->ctx->Ans.CardBoxNo[i] = m_CardBoxNoEx[i];
  362. pGMEE->ctx->Ans.PsbCode[i] = m_PsbCodeEx[i];
  363. pGMEE->ctx->Ans.PsbName[i] = m_PsbNameEx[i];
  364. pGMEE->ctx->Ans.Maintainer[i] = m_MaintainerEx[i];
  365. pGMEE->ctx->Ans.CardInit[i] = m_CardInitEx[i];
  366. pGMEE->ctx->Ans.CardPercent[i] = m_CardPercentEx[i];
  367. pGMEE->ctx->Ans.remains[i] = m_remainsEx[i];
  368. pGMEE->ctx->Ans.issued[i] = m_issuedEx[i];
  369. pGMEE->ctx->Ans.mixed[i] = m_mixedEx[i];
  370. //to be added maintain time oiltmp
  371. pGMEE->ctx->Ans.MaintainTime[i] = "";
  372. pGMEE->ctx->Ans.reserved1[i] = 0;
  373. pGMEE->ctx->Ans.reserved2[i] = "";
  374. }
  375. else
  376. {
  377. pGMEE->ctx->Ans.CardBoxNo[i] = "";
  378. pGMEE->ctx->Ans.PsbCode[i] = "";
  379. pGMEE->ctx->Ans.PsbName[i] = "";
  380. pGMEE->ctx->Ans.Maintainer[i] = "";
  381. pGMEE->ctx->Ans.CardInit[i] = 0;
  382. pGMEE->ctx->Ans.CardPercent[i] = 0;
  383. pGMEE->ctx->Ans.remains[i] = 0;
  384. pGMEE->ctx->Ans.issued[i] = 0;
  385. pGMEE->ctx->Ans.mixed[i] = 0;
  386. pGMEE->ctx->Ans.MaintainTime[i] = "";
  387. pGMEE->ctx->Ans.reserved1[i] = 0;
  388. pGMEE->ctx->Ans.reserved2[i] = "";
  389. }
  390. Dbg("%s,%d,%d,%d", (const char*)pGMEE->ctx->Ans.CardBoxNo[i],
  391. pGMEE->ctx->Ans.CardInit[i],
  392. pGMEE->ctx->Ans.mixed[i],
  393. pGMEE->ctx->Ans.remains[i]);
  394. }
  395. pGMEE->ctx->Answer(Error_Succeed);
  396. }
  397. break;
  398. case USER_EVT_SET_MATERIAL_EX:
  399. {
  400. m_bSettingMaterial = true;
  401. pEvt->SetHandled();
  402. //SetCardRemains???oiltmp
  403. CSmallDateTime currTime = CSmallDateTime::GetNow();
  404. SetMaterialExEvent *pSMEE = dynamic_cast<SetMaterialExEvent*>(pEvt);
  405. if (pSMEE->ctx->Req.SetCaptured == 1)
  406. {
  407. m_CardCaptured = pSMEE->ctx->Req.captured;
  408. m_MaintainerEx[0] = pSMEE->ctx->Req.Maintainer[0];
  409. m_MaintainTimeEx[0] = (DWORD)currTime;
  410. SetCardCaptured(pSMEE->ctx->Req.captured,true);
  411. }
  412. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[0]);
  413. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[1]);
  414. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[2]);
  415. Dbg("%s",(const char*)pSMEE->ctx->Req.CardBoxNo[0]);
  416. Dbg("%s",(const char*)pSMEE->ctx->Req.CardBoxNo[1]);
  417. Dbg("%s",(const char*)pSMEE->ctx->Req.CardBoxNo[2]);
  418. bool bSetHopper[3];
  419. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  420. for (int i = 0; i < 3; ++i)
  421. {
  422. if (pSMEE->ctx->Req.SetHopper[i] == 1)
  423. {
  424. Dbg("do %d",i);
  425. bSetHopper[i] = true;
  426. m_CardBoxNoEx[i] = pSMEE->ctx->Req.CardBoxNo[i];
  427. m_PsbCodeEx[i] = pSMEE->ctx->Req.PsbCode[i];
  428. m_PsbNameEx[i] = pSMEE->ctx->Req.PsbName[i];
  429. m_MaintainerEx[i] = pSMEE->ctx->Req.Maintainer[i];
  430. m_CardInitEx[i] = pSMEE->ctx->Req.CardInit[i];
  431. m_CardPercentEx[i] = pSMEE->ctx->Req.CardPercent[i];
  432. m_remainsEx[i] = pSMEE->ctx->Req.remains[i];
  433. m_issuedEx[i] = pSMEE->ctx->Req.issued[i];
  434. m_mixedEx[i] = pSMEE->ctx->Req.mixed[i];
  435. m_MaintainTimeEx[i] = (DWORD)currTime;
  436. m_csMaintainTimeEx[i] = currTime.GetNow().ToTimeString();
  437. }
  438. }
  439. Dbg("set set result.");
  440. pSMEE->ctx->Ans.reserved1.Init(1);
  441. pSMEE->ctx->Ans.reserved2.Init(1);
  442. pSMEE->ctx->Ans.reserved1[0] = 1;
  443. pSMEE->ctx->Ans.reserved2[0] = "";
  444. UpdateLocalRunCfg(pSMEE->ctx->Req.SetHopper[0], pSMEE->ctx->Req.SetHopper[1], pSMEE->ctx->Req.SetHopper[2]);
  445. pSMEE->ctx->Answer(Error_Succeed);
  446. m_bSettingMaterial = false;
  447. if (pSMEE->ctx->Req.SetHopper[0] == 1 || pSMEE->ctx->Req.SetHopper[1] == 1 || pSMEE->ctx->Req.SetHopper[2] == 1)
  448. {
  449. if (pSMEE->ctx->Req.SetCaptured == 1)
  450. SyncDataToDB(bSetHopper);
  451. else
  452. SyncDataToDB(bSetHopper, false);
  453. }
  454. }
  455. break;
  456. case USER_EVT_OPEN_SAFELOCK:
  457. {
  458. pEvt->SetHandled();
  459. OpenSafeLockEvent *osle = dynamic_cast<OpenSafeLockEvent*>(pEvt);
  460. OpenSafeLockTask* task = new OpenSafeLockTask(this);
  461. task->ctx = osle->ctx;
  462. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  463. }
  464. break;
  465. case USER_EVT_BLUETOOTH_DISCONNECT:
  466. pEvt->SetHandled();
  467. ret = 0;
  468. break;
  469. case USER_EVT_QUERY_SCI_LIST:
  470. {
  471. pEvt->SetHandled();
  472. QuerySCIListEvent *qsl = dynamic_cast<QuerySCIListEvent*>(pEvt);
  473. QuerySCIListTask *pTask = new QuerySCIListTask(this);
  474. pTask->ctx = qsl->ctx;
  475. pTask->fsmState = 2;
  476. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  477. }
  478. break;
  479. case USER_EVT_BIND_SCI:
  480. {
  481. pEvt->SetHandled();
  482. BindSCIEvent *bsl = dynamic_cast<BindSCIEvent*>(pEvt);
  483. BindSCITask *pTask = new BindSCITask(this);
  484. pTask->ctx = bsl->ctx;
  485. pTask->fsmState = 2;
  486. ErrorCodeEnum ec = GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  487. Dbg("post thread task returned: %d", ec);
  488. }
  489. break;
  490. case USER_EVT_PREONLINE:
  491. {
  492. pEvt->SetHandled();
  493. PreOnlineEvent* poe = dynamic_cast<PreOnlineEvent*>(pEvt);
  494. if (poe->ctx->Req.reserved1.GetLength() > 0 && _strnicmp("kaku#", (const char*)poe->ctx->Req.reserved1, 5) == 0)
  495. {
  496. PreOnlineTask* task = new PreOnlineTask(this);
  497. task->ctx = poe->ctx;
  498. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  499. ret = 16;
  500. }
  501. break;
  502. }
  503. case USER_EVT_PREONLINE_ON_STORE:
  504. {
  505. pEvt->SetHandled();
  506. PreOnlineOnStoreEvent *bsl = dynamic_cast<PreOnlineOnStoreEvent*>(pEvt);
  507. PreOnlineOnStoreTask *pTask = new PreOnlineOnStoreTask(this);
  508. pTask->ctx = bsl->ctx;
  509. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  510. }
  511. break;
  512. case USER_EVT_QUERYCARDINFO_ON_STORE:
  513. {
  514. pEvt->SetHandled();
  515. QueryCardInfoOnStoreEvent* qce = dynamic_cast<QueryCardInfoOnStoreEvent*>(pEvt);
  516. QueryCardInfoOnStoreTask* qTask = new QueryCardInfoOnStoreTask(this);
  517. qTask->ctx = qce->ctx;
  518. GetEntityBase()->GetFunction()->PostThreadPoolTask(qTask);
  519. }
  520. break;
  521. default:
  522. break;
  523. }
  524. return ret;
  525. }
  526. //Accepting
  527. void CCardIssuerFSM::s3_on_entry()
  528. {
  529. LOG_FUNCTION();
  530. m_currentFSMState = 3;
  531. }
  532. void CCardIssuerFSM::s3_on_exit()
  533. {
  534. LOG_FUNCTION();
  535. }
  536. unsigned int CCardIssuerFSM::s3_on_event(FSMEvent* pEvt)
  537. {
  538. Dbg("s3 evt(%d,%d)", pEvt->iEvt, pEvt->param1);
  539. int ret = 0;
  540. switch(pEvt->iEvt)
  541. {
  542. case USER_EVT_ACCEPTFINISHED:
  543. {
  544. pEvt->SetHandled();
  545. switch(pEvt->param1)
  546. {
  547. case 0:
  548. case 1:
  549. case 2:
  550. case 3:
  551. case 4:
  552. ret = pEvt->param1;
  553. break;
  554. default:
  555. ret = 1;
  556. break;
  557. }
  558. }
  559. break;
  560. case USER_EVT_ACCEPT_CANCEL:
  561. m_bCancelAccept = true;
  562. m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  563. pEvt->SetHandled();
  564. ret = 3;
  565. break;
  566. case USER_EVT_EXIT:
  567. m_captureReason = "4001";
  568. m_bExit = true;
  569. pEvt->SetHandled();
  570. break;
  571. case USER_EVT_QUIT:
  572. pEvt->SetHandled();
  573. break;
  574. default:
  575. break;
  576. }
  577. return ret;
  578. }
  579. //Hold
  580. void CCardIssuerFSM::s4_on_entry()
  581. {
  582. LOG_FUNCTION();
  583. m_currentFSMState = 4;
  584. GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_HOLD);
  585. }
  586. void CCardIssuerFSM::s4_on_exit()
  587. {
  588. LOG_FUNCTION();
  589. }
  590. unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
  591. {
  592. Dbg("s4 evt(%d,%d)",pEvt->iEvt,pEvt->param1);
  593. switch(pEvt->iEvt){
  594. //case USER_EVT_READ:
  595. // {
  596. // CardReadEvent* cre = dynamic_cast<CardReadEvent*>(pEvt);
  597. // ReadTask* task = new ReadTask(this);
  598. // task->ctx = cre->ctx;
  599. // GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  600. // pEvt->SetHandled();
  601. // return 0;
  602. // }
  603. case USER_EVT_READEX:
  604. {
  605. CardReadExEvent* cre = dynamic_cast<CardReadExEvent*>(pEvt);
  606. ReadExTask* task = new ReadExTask(this);
  607. task->ctx = cre->ctx;
  608. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  609. pEvt->SetHandled();
  610. return 0;
  611. }
  612. case USER_EVT_READ_NEW:
  613. {
  614. CardReadEvent* crne = dynamic_cast<CardReadEvent*>(pEvt);
  615. ReadTask* task = new ReadTask(this);
  616. task->ctx = crne->ctx;
  617. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  618. pEvt->SetHandled();
  619. return 0;
  620. }
  621. case USER_EVT_PREONLINE:
  622. {
  623. PreOnlineEvent* poe = dynamic_cast<PreOnlineEvent*>(pEvt);
  624. PreOnlineTask* task = new PreOnlineTask(this);
  625. task->ctx = poe->ctx;
  626. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  627. pEvt->SetHandled();
  628. return 0;
  629. }
  630. case USER_EVT_POSTONLINE:
  631. {
  632. PostOnlineEvent* poe = dynamic_cast<PostOnlineEvent*>(pEvt);
  633. PostOnlineTask* task = new PostOnlineTask(this);
  634. task->ctx = poe->ctx;
  635. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  636. pEvt->SetHandled();
  637. return 0;
  638. }
  639. case USER_EVT_CAPTURE:
  640. {
  641. CardCaptureEvent *cce = dynamic_cast<CardCaptureEvent*>(pEvt);
  642. CaptureTask *task= new CaptureTask(this);
  643. task->ctx = cce->ctx;
  644. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  645. pEvt->SetHandled();
  646. //oilyang@20171215 经与郭丹汪磊东宋锐讨论,目前不存在4022的情况,暂时以4019代替
  647. //m_captureReason = "4022";
  648. m_captureReason = "4019";
  649. return 0;
  650. }
  651. case USER_EVT_EXIT:
  652. case USER_EVT_EJECT:
  653. case USER_EVT_ACCEPT:
  654. case USER_EVT_ACCEPT_CANCEL:
  655. {
  656. if (pEvt->iEvt == USER_EVT_ACCEPT)
  657. {
  658. Dbg("call insert card in holding state.capture it");
  659. CardAcceptEvent *cae = dynamic_cast<CardAcceptEvent*>(pEvt);
  660. CaptureTask *task= new CaptureTask(this);
  661. task->ctx = NULL;
  662. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  663. pEvt->SetHandled();
  664. cae->ctx->Answer(Error_Duplication);
  665. return 0;
  666. }
  667. if ((pEvt->iEvt == USER_EVT_EXIT) && m_issueStatus)
  668. {
  669. m_captureReason = "4001";
  670. CardCaptureEvent *cce = dynamic_cast<CardCaptureEvent*>(pEvt);
  671. CaptureTask *task= new CaptureTask(this);
  672. task->ctx = NULL;
  673. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  674. pEvt->SetHandled();
  675. return 1;
  676. }
  677. CardEjectEvent *cee;
  678. if (pEvt->iEvt == USER_EVT_EJECT)
  679. cee = dynamic_cast<CardEjectEvent*>(pEvt);
  680. EjectTask *task= new EjectTask(this);
  681. if (pEvt->iEvt == USER_EVT_EJECT)
  682. task->ctx = cee->ctx;
  683. else
  684. task->ctx = NULL;
  685. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  686. pEvt->SetHandled();
  687. return 0;
  688. }
  689. case USER_EVT_QUIT:
  690. {
  691. pEvt->SetHandled();
  692. return 0;
  693. }
  694. case USER_EVT_GET_MATERIAL:
  695. {
  696. pEvt->SetHandled();
  697. GetMaterialEvent *pGME = dynamic_cast<GetMaterialEvent*>(pEvt);
  698. pGME->ctx->Ans.captured = m_CardCaptured;
  699. pGME->ctx->Ans.remains = m_remainsEx[0];
  700. pGME->ctx->Ans.issued = m_issuedEx[0];
  701. pGME->ctx->Ans.mixed = m_mixedEx[0];
  702. pGME->ctx->Answer(Error_Succeed);
  703. }
  704. break;
  705. case USER_EVT_SET_MATERIAL:
  706. {
  707. m_bSettingMaterial = true;
  708. pEvt->SetHandled();
  709. bool bR, bC, bI, bM;
  710. bR = bC = bI = bM = true;
  711. SetMaterialEvent *pSME = dynamic_cast<SetMaterialEvent*>(pEvt);
  712. if (pSME->ctx->Req.bRemains)
  713. {
  714. m_CardInitEx[0] = m_remainsEx[0] = pSME->ctx->Req.remains;
  715. bR = SetCardRemains(pSME->ctx->Req.remains, 1, true);
  716. }
  717. if (pSME->ctx->Req.bCaptured)
  718. {
  719. m_CardCaptured = pSME->ctx->Req.captured;
  720. bC = SetCardCaptured(pSME->ctx->Req.captured);
  721. }
  722. if (pSME->ctx->Req.bIssued)
  723. {
  724. m_issuedEx[0] = pSME->ctx->Req.issued;
  725. bI = SetCardIssued(pSME->ctx->Req.issued, 1);
  726. }
  727. if (pSME->ctx->Req.bMixed)
  728. {
  729. m_mixedEx[0] = pSME->ctx->Req.mixed;
  730. bM = SetCardMixed(pSME->ctx->Req.mixed, 1);
  731. }
  732. if (bR && bC && bI && bM)
  733. pSME->ctx->Answer(Error_Succeed);
  734. else
  735. {
  736. Dbg("set material failed.r(%d),c(%d),i(%d),m(%d)", bR, bC, bI, bM);
  737. pSME->ctx->Answer(Error_Unexpect);
  738. }
  739. m_bSettingMaterial = false;
  740. }
  741. break;
  742. case USER_EVT_GET_MATERIAL_EX:
  743. {
  744. pEvt->SetHandled();
  745. GetMaterialExEvent *pGMEE = dynamic_cast<GetMaterialExEvent*>(pEvt);
  746. pGMEE->ctx->Ans.captured = m_CardCaptured;
  747. pGMEE->ctx->Ans.hasHopper.Init(3);
  748. pGMEE->ctx->Ans.CardBoxNo.Init(3);
  749. pGMEE->ctx->Ans.PsbCode.Init(3);
  750. pGMEE->ctx->Ans.PsbName.Init(3);
  751. pGMEE->ctx->Ans.Maintainer.Init(3);
  752. pGMEE->ctx->Ans.CardInit.Init(3);
  753. pGMEE->ctx->Ans.CardPercent.Init(3);
  754. pGMEE->ctx->Ans.remains.Init(3);
  755. pGMEE->ctx->Ans.issued.Init(3);
  756. pGMEE->ctx->Ans.mixed.Init(3);
  757. pGMEE->ctx->Ans.MaintainTime.Init(3);
  758. pGMEE->ctx->Ans.reserved1.Init(3);
  759. pGMEE->ctx->Ans.reserved2.Init(3);
  760. for (int i = 0; i < 3; ++i)
  761. {
  762. pGMEE->ctx->Ans.hasHopper[i] = m_bHasHopper[i];
  763. if (m_bHasHopper[i])
  764. {
  765. pGMEE->ctx->Ans.CardBoxNo[i] = m_CardBoxNoEx[i];
  766. pGMEE->ctx->Ans.PsbCode[i] = m_PsbCodeEx[i];
  767. pGMEE->ctx->Ans.PsbName[i] = m_PsbNameEx[i];
  768. pGMEE->ctx->Ans.Maintainer[i] = m_MaintainerEx[i];
  769. pGMEE->ctx->Ans.CardInit[i] = m_CardInitEx[i];
  770. pGMEE->ctx->Ans.CardPercent[i] = m_CardPercentEx[i];
  771. pGMEE->ctx->Ans.remains[i] = m_remainsEx[i];
  772. pGMEE->ctx->Ans.issued[i] = m_issuedEx[i];
  773. pGMEE->ctx->Ans.mixed[i] = m_mixedEx[i];
  774. //to be added maintain time oiltmp
  775. pGMEE->ctx->Ans.MaintainTime[i] = "";
  776. pGMEE->ctx->Ans.reserved1[i] = 0;
  777. pGMEE->ctx->Ans.reserved2[i] = "";
  778. }
  779. else
  780. {
  781. pGMEE->ctx->Ans.CardBoxNo[i] = "";
  782. pGMEE->ctx->Ans.PsbCode[i] = "";
  783. pGMEE->ctx->Ans.PsbName[i] = "";
  784. pGMEE->ctx->Ans.Maintainer[i] = "";
  785. pGMEE->ctx->Ans.CardInit[i] = 0;
  786. pGMEE->ctx->Ans.CardPercent[i] = 0;
  787. pGMEE->ctx->Ans.remains[i] = 0;
  788. pGMEE->ctx->Ans.issued[i] = 0;
  789. pGMEE->ctx->Ans.mixed[i] = 0;
  790. pGMEE->ctx->Ans.MaintainTime[i] = "";
  791. pGMEE->ctx->Ans.reserved1[i] = 0;
  792. pGMEE->ctx->Ans.reserved2[i] = "";
  793. }
  794. }
  795. pGMEE->ctx->Answer(Error_Succeed);
  796. }
  797. break;
  798. case USER_EVT_SET_MATERIAL_EX:
  799. {
  800. m_bSettingMaterial = true;
  801. pEvt->SetHandled();
  802. //SetCardRemains???oiltmp
  803. CSmallDateTime currTime = CSmallDateTime::GetNow();
  804. SetMaterialExEvent *pSMEE = dynamic_cast<SetMaterialExEvent*>(pEvt);
  805. if (pSMEE->ctx->Req.SetCaptured == 1)
  806. {
  807. m_CardCaptured = pSMEE->ctx->Req.captured;
  808. m_MaintainerEx[0] = pSMEE->ctx->Req.Maintainer[0];
  809. m_MaintainTimeEx[0] = (DWORD)currTime;
  810. SetCardCaptured(pSMEE->ctx->Req.captured,true);
  811. }
  812. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[0]);
  813. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[1]);
  814. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[2]);
  815. Dbg("%s", (const char*)pSMEE->ctx->Req.CardBoxNo[0]);
  816. Dbg("%s", (const char*)pSMEE->ctx->Req.CardBoxNo[1]);
  817. Dbg("%s", (const char*)pSMEE->ctx->Req.CardBoxNo[2]);
  818. bool bSetHopper[3];
  819. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  820. for (int i = 0; i < 3; ++i)
  821. {
  822. if (pSMEE->ctx->Req.SetHopper[i] == 1)
  823. {
  824. bSetHopper[i] = true;
  825. m_CardBoxNoEx[i] = pSMEE->ctx->Req.CardBoxNo[i];
  826. m_PsbCodeEx[i] = pSMEE->ctx->Req.PsbCode[i];
  827. m_PsbNameEx[i] = pSMEE->ctx->Req.PsbName[i];
  828. m_MaintainerEx[i] = pSMEE->ctx->Req.Maintainer[i];
  829. m_CardInitEx[i] = pSMEE->ctx->Req.CardInit[i];
  830. m_CardPercentEx[i] = pSMEE->ctx->Req.CardPercent[i];
  831. m_remainsEx[i] = pSMEE->ctx->Req.remains[i];
  832. m_issuedEx[i] = pSMEE->ctx->Req.issued[i];
  833. m_mixedEx[i] = pSMEE->ctx->Req.mixed[i];
  834. m_MaintainTimeEx[i] = (DWORD)currTime;
  835. m_csMaintainTimeEx[i] = currTime.GetNow().ToTimeString();
  836. }
  837. }
  838. pSMEE->ctx->Ans.reserved1.Init(1);
  839. pSMEE->ctx->Ans.reserved2.Init(1);
  840. pSMEE->ctx->Ans.reserved1[0] = 0;
  841. pSMEE->ctx->Ans.reserved2[0] = "";
  842. UpdateLocalRunCfg(pSMEE->ctx->Req.SetHopper[0], pSMEE->ctx->Req.SetHopper[1], pSMEE->ctx->Req.SetHopper[2]);
  843. pSMEE->ctx->Answer(Error_Succeed);
  844. m_bSettingMaterial = false;
  845. if (pSMEE->ctx->Req.SetHopper[0] == 1 || pSMEE->ctx->Req.SetHopper[1] == 1 || pSMEE->ctx->Req.SetHopper[2] == 1)
  846. {
  847. if (pSMEE->ctx->Req.SetCaptured == 1)
  848. SyncDataToDB(bSetHopper);
  849. else
  850. SyncDataToDB(bSetHopper, false);
  851. }
  852. }
  853. break;
  854. case USER_EVT_WRITE:
  855. {
  856. CardWriteEvent* cwe = dynamic_cast<CardWriteEvent*>(pEvt);
  857. WriteTask* task = new WriteTask(this);
  858. task->ctx = cwe->ctx;
  859. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  860. pEvt->SetHandled();
  861. }
  862. break;
  863. case USER_EVT_BLUETOOTH_DISCONNECT:
  864. pEvt->SetHandled();
  865. break;
  866. case USER_EVT_SAM_IC:
  867. {
  868. SAMICCommandEvent* sice = dynamic_cast<SAMICCommandEvent*>(pEvt);
  869. SAMICCommandTask* task = new SAMICCommandTask(this);
  870. task->ctx = sice->ctx;
  871. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  872. pEvt->SetHandled();
  873. }
  874. break;
  875. case USER_EVT_PRINT:
  876. {
  877. pEvt->SetHandled();
  878. PrintEvent* pe = dynamic_cast<PrintEvent*>(pEvt);
  879. PrintTask* task = new PrintTask(this);
  880. task->ctx = pe->ctx;
  881. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  882. }
  883. break;
  884. case USER_EVT_PRINT_FINISHED:
  885. {
  886. pEvt->SetHandled();
  887. }
  888. break;
  889. case USER_EVT_ISSUE_EX:
  890. {
  891. IssueTask* task = new IssueTask(this);
  892. CardIssueExEvent *ciee = NULL;
  893. ciee = dynamic_cast<CardIssueExEvent*>(pEvt);
  894. task->ctxEx = ciee->ctx;
  895. task->ctx = NULL;
  896. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  897. pEvt->SetHandled();
  898. return pEvt->param1;
  899. }
  900. break;
  901. case USER_EVT_ISSUE_EX_FINISHED:
  902. pEvt->SetHandled();
  903. return pEvt->param1;
  904. default:
  905. break;
  906. }
  907. return 0;
  908. }
  909. //Reading
  910. void CCardIssuerFSM::s5_on_entry()
  911. {
  912. LOG_FUNCTION();
  913. m_currentFSMState = 5;
  914. GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_READING);
  915. }
  916. void CCardIssuerFSM::s5_on_exit()
  917. {
  918. LOG_FUNCTION();
  919. }
  920. unsigned int CCardIssuerFSM::s5_on_event(FSMEvent* pEvt)
  921. {
  922. Dbg("s5 event(%d)",pEvt->iEvt);
  923. switch(pEvt->iEvt)
  924. {
  925. //case USER_EVT_READFINISHED:
  926. // {
  927. // pEvt->SetHandled();
  928. // CardReadFinishedEvent *pCRFE = dynamic_cast<CardReadFinishedEvent *>(pEvt);
  929. // int err = pCRFE->param1;
  930. // Dbg("readfinish(%d)",err);
  931. // if (err == 0)
  932. // {
  933. // pCRFE->ctx->Answer(Error_Succeed);
  934. // return 0;
  935. // }else if (err == 2)
  936. // return 2;
  937. // else
  938. // return 1;
  939. // }
  940. // break;
  941. case USER_EVT_READEX_FINISHED:
  942. {
  943. pEvt->SetHandled();
  944. CardReadExFinishedEvent *pCRFE = dynamic_cast<CardReadExFinishedEvent *>(pEvt);
  945. int err = pCRFE->param1;
  946. Dbg("read ex finish(%d)",err);
  947. if (err == 0)
  948. {
  949. pCRFE->ctx->Answer(Error_Succeed);
  950. return 0;
  951. }else if (err == 2)
  952. return 2;
  953. else
  954. {
  955. pCRFE->ctx->Answer(Error_Unexpect);
  956. return 1;
  957. }
  958. }
  959. break;
  960. case USER_EVT_READ_NEW_FINISHED:
  961. {
  962. pEvt->SetHandled();
  963. CardReadFinishedEvent *pCRNFE = dynamic_cast<CardReadFinishedEvent *>(pEvt);
  964. int err = pCRNFE->param1;
  965. Dbg("read new finish(%d)",err);
  966. if (err == 0)
  967. {
  968. pCRNFE->ctx->Answer(Error_Succeed);
  969. return 0;
  970. }else if (err == 2)
  971. {
  972. pCRNFE->ctx->Answer(Error_Unexpect);
  973. return 2;
  974. }
  975. else
  976. {
  977. pCRNFE->ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_GetDevStatus));
  978. return 1;
  979. }
  980. }
  981. break;
  982. case USER_EVT_EXIT:
  983. {
  984. pEvt->SetHandled();
  985. m_captureReason = "4001";
  986. //CardEjectEvent *cee = dynamic_cast<CardEjectEvent*>(pEvt);
  987. //EjectTask *task= new EjectTask(this);
  988. //task->ctx = NULL;
  989. //GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  990. //pEvt->SetHandled();
  991. //return 0;
  992. }
  993. break;
  994. case USER_EVT_QUIT:
  995. {
  996. pEvt->SetHandled();
  997. return 0;
  998. }
  999. default:
  1000. break;
  1001. }
  1002. return 0;
  1003. }
  1004. //Ejecting
  1005. void CCardIssuerFSM::s6_on_entry()
  1006. {
  1007. LOG_FUNCTION();
  1008. m_currentFSMState = 6;
  1009. }
  1010. void CCardIssuerFSM::s6_on_exit()
  1011. {
  1012. LOG_FUNCTION();
  1013. }
  1014. unsigned int CCardIssuerFSM::s6_on_event(FSMEvent* pEvt)
  1015. {
  1016. Dbg("s6 evt(%d)",pEvt->iEvt);
  1017. if (pEvt->iEvt == USER_EVT_EJECTFINISHED){
  1018. pEvt->SetHandled();
  1019. int err = pEvt->param1;
  1020. if (err == 0)
  1021. return 0;
  1022. else
  1023. return 1;
  1024. }else if (pEvt->iEvt == USER_EVT_QUIT) {
  1025. pEvt->SetHandled();
  1026. return 0;
  1027. }
  1028. return 0;
  1029. }
  1030. //Waiting fetch
  1031. void CCardIssuerFSM::s7_on_entry()
  1032. {
  1033. LOG_FUNCTION();
  1034. m_currentFSMState = 7;
  1035. GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_WAITFETCHING);
  1036. WaitFetchingTask* task = new WaitFetchingTask(this);
  1037. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1038. }
  1039. void CCardIssuerFSM::s7_on_exit()
  1040. {
  1041. LOG_FUNCTION();
  1042. }
  1043. unsigned int CCardIssuerFSM::s7_on_event(FSMEvent* pEvt)
  1044. {
  1045. Dbg("s7 evt(%d)", pEvt->iEvt);
  1046. switch (pEvt->iEvt)
  1047. {
  1048. case USER_EVT_WAITFINISHED:
  1049. {
  1050. pEvt->SetHandled();
  1051. if (pEvt->param1 == 0) {
  1052. FetchCard evt;
  1053. evt.status = 0;
  1054. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt);
  1055. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op.");
  1056. m_currCardNo = "";
  1057. Dbg("客户取走卡片msg发送");
  1058. return 0;
  1059. }
  1060. else if (pEvt->param1 == 1) {
  1061. FetchCard evt;
  1062. evt.status = 1;
  1063. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt);
  1064. Dbg("取卡时设备故障");
  1065. return 1;
  1066. }
  1067. else {
  1068. FetchCard evt;
  1069. evt.status = 2;
  1070. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt);
  1071. Dbg("客户未取卡超时msg发送");
  1072. m_captureReason = "4019";
  1073. LogWarn(Severity_Low, Error_NotInit, CardIssuer_UserErrorCode_Customer_Forget_Fectch_Card, "Customer forget fetch card.");
  1074. CaptureTask *task = new CaptureTask(this);
  1075. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1076. return 2;
  1077. }
  1078. }
  1079. case USER_EVT_QUIT:
  1080. {
  1081. pEvt->SetHandled();
  1082. return 0;
  1083. }
  1084. case USER_EVT_GET_MATERIAL:
  1085. {
  1086. pEvt->SetHandled();
  1087. GetMaterialEvent *pGME = dynamic_cast<GetMaterialEvent*>(pEvt);
  1088. pGME->ctx->Ans.captured = m_CardCaptured;
  1089. pGME->ctx->Ans.remains = m_remainsEx[0];
  1090. pGME->ctx->Ans.issued = m_issuedEx[0];
  1091. pGME->ctx->Ans.mixed = m_mixedEx[0];
  1092. pGME->ctx->Answer(Error_Succeed);
  1093. }
  1094. break;
  1095. case USER_EVT_GET_MATERIAL_EX:
  1096. {
  1097. pEvt->SetHandled();
  1098. GetMaterialExEvent *pGMEE = dynamic_cast<GetMaterialExEvent*>(pEvt);
  1099. pGMEE->ctx->Ans.captured = m_CardCaptured;
  1100. pGMEE->ctx->Ans.hasHopper.Init(3);
  1101. pGMEE->ctx->Ans.CardBoxNo.Init(3);
  1102. pGMEE->ctx->Ans.PsbCode.Init(3);
  1103. pGMEE->ctx->Ans.PsbName.Init(3);
  1104. pGMEE->ctx->Ans.Maintainer.Init(3);
  1105. pGMEE->ctx->Ans.CardInit.Init(3);
  1106. pGMEE->ctx->Ans.CardPercent.Init(3);
  1107. pGMEE->ctx->Ans.remains.Init(3);
  1108. pGMEE->ctx->Ans.issued.Init(3);
  1109. pGMEE->ctx->Ans.mixed.Init(3);
  1110. pGMEE->ctx->Ans.MaintainTime.Init(3);
  1111. pGMEE->ctx->Ans.reserved1.Init(3);
  1112. pGMEE->ctx->Ans.reserved2.Init(3);
  1113. for (int i = 0; i < 3; ++i)
  1114. {
  1115. pGMEE->ctx->Ans.hasHopper[i] = m_bHasHopper[i];
  1116. if (m_bHasHopper[i])
  1117. {
  1118. pGMEE->ctx->Ans.CardBoxNo[i] = m_CardBoxNoEx[i];
  1119. pGMEE->ctx->Ans.PsbCode[i] = m_PsbCodeEx[i];
  1120. pGMEE->ctx->Ans.PsbName[i] = m_PsbNameEx[i];
  1121. pGMEE->ctx->Ans.Maintainer[i] = m_MaintainerEx[i];
  1122. pGMEE->ctx->Ans.CardInit[i] = m_CardInitEx[i];
  1123. pGMEE->ctx->Ans.CardPercent[i] = m_CardPercentEx[i];
  1124. pGMEE->ctx->Ans.remains[i] = m_remainsEx[i];
  1125. pGMEE->ctx->Ans.issued[i] = m_issuedEx[i];
  1126. pGMEE->ctx->Ans.mixed[i] = m_mixedEx[i];
  1127. //to be added maintain time oiltmp
  1128. pGMEE->ctx->Ans.MaintainTime[i] = "";
  1129. pGMEE->ctx->Ans.reserved1[i] = 0;
  1130. pGMEE->ctx->Ans.reserved2[i] = "";
  1131. }
  1132. else
  1133. {
  1134. pGMEE->ctx->Ans.CardBoxNo[i] = "";
  1135. pGMEE->ctx->Ans.PsbCode[i] = "";
  1136. pGMEE->ctx->Ans.PsbName[i] = "";
  1137. pGMEE->ctx->Ans.Maintainer[i] = "";
  1138. pGMEE->ctx->Ans.CardInit[i] = 0;
  1139. pGMEE->ctx->Ans.CardPercent[i] = 0;
  1140. pGMEE->ctx->Ans.remains[i] = 0;
  1141. pGMEE->ctx->Ans.issued[i] = 0;
  1142. pGMEE->ctx->Ans.mixed[i] = 0;
  1143. pGMEE->ctx->Ans.MaintainTime[i] = "";
  1144. pGMEE->ctx->Ans.reserved1[i] = 0;
  1145. pGMEE->ctx->Ans.reserved2[i] = "";
  1146. }
  1147. }
  1148. pGMEE->ctx->Answer(Error_Succeed);
  1149. }
  1150. break;
  1151. case USER_EVT_SET_MATERIAL_EX:
  1152. {
  1153. m_bSettingMaterial = true;
  1154. pEvt->SetHandled();
  1155. //SetCardRemains???oiltmp
  1156. CSmallDateTime currTime = CSmallDateTime::GetNow();
  1157. SetMaterialExEvent *pSMEE = dynamic_cast<SetMaterialExEvent*>(pEvt);
  1158. if (pSMEE->ctx->Req.SetCaptured == 1)
  1159. {
  1160. m_CardCaptured = pSMEE->ctx->Req.captured;
  1161. m_MaintainerEx[0] = pSMEE->ctx->Req.Maintainer[0];
  1162. m_MaintainTimeEx[0] = (DWORD)currTime;
  1163. SetCardCaptured(pSMEE->ctx->Req.captured,true);
  1164. }
  1165. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[0]);
  1166. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[1]);
  1167. Dbg("SetHopper %d", pSMEE->ctx->Req.SetHopper[2]);
  1168. Dbg("%s", (const char*)pSMEE->ctx->Req.CardBoxNo[0]);
  1169. Dbg("%s", (const char*)pSMEE->ctx->Req.CardBoxNo[1]);
  1170. Dbg("%s", (const char*)pSMEE->ctx->Req.CardBoxNo[2]);
  1171. bool bSetHopper[3];
  1172. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  1173. for (int i = 0; i < 3; ++i)
  1174. {
  1175. if (pSMEE->ctx->Req.SetHopper[i] == 1)
  1176. {
  1177. bSetHopper[i] = true;
  1178. m_CardBoxNoEx[i] = pSMEE->ctx->Req.CardBoxNo[i];
  1179. m_PsbCodeEx[i] = pSMEE->ctx->Req.PsbCode[i];
  1180. m_PsbNameEx[i] = pSMEE->ctx->Req.PsbName[i];
  1181. m_MaintainerEx[i] = pSMEE->ctx->Req.Maintainer[i];
  1182. m_CardInitEx[i] = pSMEE->ctx->Req.CardInit[i];
  1183. m_CardPercentEx[i] = pSMEE->ctx->Req.CardPercent[i];
  1184. m_remainsEx[i] = pSMEE->ctx->Req.remains[i];
  1185. m_issuedEx[i] = pSMEE->ctx->Req.issued[i];
  1186. m_mixedEx[i] = pSMEE->ctx->Req.mixed[i];
  1187. m_MaintainTimeEx[i] = (DWORD)currTime;
  1188. m_csMaintainTimeEx[i] = currTime.GetNow().ToTimeString();
  1189. }
  1190. }
  1191. pSMEE->ctx->Ans.reserved1.Init(1);
  1192. pSMEE->ctx->Ans.reserved2.Init(1);
  1193. pSMEE->ctx->Ans.reserved1[0] = 0;
  1194. pSMEE->ctx->Ans.reserved2[0] = "";
  1195. UpdateLocalRunCfg(pSMEE->ctx->Req.SetHopper[0], pSMEE->ctx->Req.SetHopper[1], pSMEE->ctx->Req.SetHopper[2]);
  1196. pSMEE->ctx->Answer(Error_Succeed);
  1197. m_bSettingMaterial = false;
  1198. if (pSMEE->ctx->Req.SetHopper[0] == 1 || pSMEE->ctx->Req.SetHopper[1] == 1 || pSMEE->ctx->Req.SetHopper[2] == 1)
  1199. {
  1200. if (pSMEE->ctx->Req.SetCaptured == 1)
  1201. SyncDataToDB(bSetHopper);
  1202. else
  1203. SyncDataToDB(bSetHopper, false);
  1204. }
  1205. }
  1206. break;
  1207. default:
  1208. break;
  1209. }
  1210. return 0;
  1211. }
  1212. void CCardIssuerFSM::s8_on_entry()
  1213. {
  1214. LOG_FUNCTION();
  1215. m_currentFSMState = 8;
  1216. }
  1217. void CCardIssuerFSM::s8_on_exit()
  1218. {
  1219. LOG_FUNCTION();
  1220. }
  1221. unsigned int CCardIssuerFSM::s8_on_event(FSMEvent* pEvt)
  1222. {
  1223. Dbg("s8 evt(%d)",pEvt->iEvt);
  1224. if (pEvt->iEvt == USER_EVT_CAPTUREFINISHED){
  1225. pEvt->SetHandled();
  1226. int err = pEvt->param1;
  1227. if (err == 0)
  1228. return 0;
  1229. else
  1230. return 1;
  1231. }else if (pEvt->iEvt == USER_EVT_QUIT) {
  1232. pEvt->SetHandled();
  1233. return 0;
  1234. }
  1235. return 0;
  1236. }
  1237. //Failed
  1238. void CCardIssuerFSM::s9_on_entry()
  1239. {
  1240. LOG_FUNCTION();
  1241. m_currentFSMState = 9;
  1242. GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDSWIPER_FAILED);
  1243. SetDevStateAndSendMsg(DEVICE_STATUS_FAULT);
  1244. FSMEvent *e = new FSMEvent(USER_EVT_RESET);
  1245. PostEventFIFO(e);
  1246. }
  1247. void CCardIssuerFSM::s9_on_exit()
  1248. {
  1249. LOG_FUNCTION();
  1250. }
  1251. unsigned int CCardIssuerFSM::s9_on_event(FSMEvent* pEvt)
  1252. {
  1253. Dbg("s9 evt(%d)",pEvt->iEvt);
  1254. switch(pEvt->iEvt)
  1255. {
  1256. case USER_EVT_RESET:
  1257. {
  1258. pEvt->SetHandled();
  1259. m_resetTimes++;
  1260. if (_strnicmp("RVC.Stand2S", m_csMachineType, strlen("RVC.Stand2S")) == 0 && m_resetTimes > MAX_RESET_TIMES_PERIOD)
  1261. {
  1262. Dbg("restart tried %d times,give up",m_resetTimes);
  1263. m_testResult = Error_InvalidState;
  1264. return 0;
  1265. }
  1266. ResetDeviceEvent* rde = dynamic_cast<ResetDeviceEvent*>(pEvt);
  1267. ResetTask* task = new ResetTask(this);
  1268. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1269. return 0;
  1270. }
  1271. break;
  1272. case USER_EVT_RESETFINISHED:
  1273. {
  1274. ResetFinishedEvent *rfe = dynamic_cast<ResetFinishedEvent*>(pEvt);
  1275. Dbg("err,reset result %d",rfe->param1);
  1276. if (rfe->param1 == 0)
  1277. return 0;
  1278. else
  1279. {
  1280. m_testResult = Error_InvalidState;
  1281. return 1;
  1282. }
  1283. }
  1284. case USER_EVT_QUIT:
  1285. pEvt->SetHandled();
  1286. return 0;
  1287. case USER_EVT_ACCEPT_CANCEL:
  1288. m_bCancelAccept = true;
  1289. pEvt->SetHandled();
  1290. break;
  1291. case USER_EVT_BLUETOOTH_DISCONNECT:
  1292. pEvt->SetHandled();
  1293. return 0;
  1294. break;
  1295. default:
  1296. break;
  1297. }
  1298. return 0;
  1299. }
  1300. //Issuing
  1301. void CCardIssuerFSM::s10_on_entry()
  1302. {
  1303. LOG_FUNCTION();
  1304. m_currentFSMState = 10;
  1305. }
  1306. void CCardIssuerFSM::s10_on_exit()
  1307. {
  1308. LOG_FUNCTION();
  1309. }
  1310. unsigned int CCardIssuerFSM::s10_on_event(FSMEvent* pEvt)
  1311. {
  1312. Dbg("s10 evt(%d,%d)", pEvt->iEvt, pEvt->param1);
  1313. int ret = 0;
  1314. switch(pEvt->iEvt)
  1315. {
  1316. case USER_EVT_ISSUE_FINISHED:
  1317. pEvt->SetHandled();
  1318. ret = pEvt->param1;
  1319. break;
  1320. case USER_EVT_ISSUE_EX_FINISHED:
  1321. pEvt->SetHandled();
  1322. ret = pEvt->param1;
  1323. break;
  1324. case USER_EVT_EXIT:
  1325. pEvt->SetHandled();
  1326. m_captureReason = "4001";
  1327. m_bIssuingExit = true;
  1328. break;
  1329. case USER_EVT_ACCEPT_CANCEL:
  1330. pEvt->SetHandled();
  1331. m_bForHangzhouSongruiMenjinka = true;
  1332. break;
  1333. default:
  1334. break;
  1335. }
  1336. return ret;
  1337. }
  1338. //Writing
  1339. void CCardIssuerFSM::s11_on_entry()
  1340. {
  1341. LOG_FUNCTION();
  1342. m_currentFSMState = 11;
  1343. }
  1344. void CCardIssuerFSM::s11_on_exit()
  1345. {
  1346. LOG_FUNCTION();
  1347. }
  1348. unsigned int CCardIssuerFSM::s11_on_event(FSMEvent* pEvt)
  1349. {
  1350. Dbg("s11(writing) evt(%d)",pEvt->iEvt);
  1351. int ret = 0;
  1352. switch(pEvt->iEvt)
  1353. {
  1354. case USER_EVT_WRITE_FINISHED:
  1355. pEvt->SetHandled();
  1356. ret = pEvt->param1;
  1357. break;
  1358. case USER_EVT_EXIT:
  1359. pEvt->SetHandled();
  1360. m_captureReason = "4001";
  1361. m_bIssuingExit = true;
  1362. break;
  1363. default:
  1364. break;
  1365. }
  1366. return ret;
  1367. }
  1368. //Connecting
  1369. void CCardIssuerFSM::s12_on_entry()
  1370. {
  1371. LOG_FUNCTION();
  1372. m_currentFSMState = 12;
  1373. SetDevStateAndSendMsg(DEVICE_STATUS_CONNECTING, false);
  1374. if (!m_bBTConnected && !m_bBTConncting)
  1375. {
  1376. ConnectTask *task = new ConnectTask(this);
  1377. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1378. }
  1379. else {
  1380. Dbg("do nothing to connect sci: btconnected: %d, btconnecting: %d", m_bBTConnected, m_bBTConncting);
  1381. }
  1382. }
  1383. void CCardIssuerFSM::s12_on_exit()
  1384. {
  1385. LOG_FUNCTION();
  1386. }
  1387. unsigned int CCardIssuerFSM::s12_on_event(FSMEvent* pEvt)
  1388. {
  1389. int ret = 0;
  1390. switch (pEvt->iEvt)
  1391. {
  1392. case USER_EVT_CONNECT_FINISHED:
  1393. {
  1394. pEvt->SetHandled();
  1395. if (QueryIfCfgSCI() == 0)//if remove bind relation
  1396. {
  1397. FSMEvent *e = new FSMEvent(USER_EVT_BACK_TO_INIT);
  1398. PostEventFIFO(e);
  1399. ret = 2;
  1400. }
  1401. else
  1402. {
  1403. if (pEvt->param1 != 0)
  1404. {
  1405. m_scanCount++;
  1406. if (m_scanCount > 4)
  1407. {
  1408. SetDevStateAndSendMsg(DEVICE_STATUS_CONNECTING);
  1409. m_scanCount = 0;
  1410. }
  1411. PeirodConnectTask *task = new PeirodConnectTask(this);
  1412. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1413. ret = 1;
  1414. }
  1415. }
  1416. }
  1417. break;
  1418. case USER_EVT_QUERY_SCI_LIST:
  1419. {
  1420. pEvt->SetHandled();
  1421. QuerySCIListEvent *qsl = dynamic_cast<QuerySCIListEvent*>(pEvt);
  1422. QuerySCIListTask *pTask = new QuerySCIListTask(this);
  1423. pTask->ctx = qsl->ctx;
  1424. pTask->fsmState = 12;
  1425. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1426. }
  1427. break;
  1428. case USER_EVT_BIND_SCI:
  1429. {
  1430. pEvt->SetHandled();
  1431. BindSCIEvent *bsl = dynamic_cast<BindSCIEvent*>(pEvt);
  1432. BindSCITask *pTask = new BindSCITask(this);
  1433. pTask->ctx = bsl->ctx;
  1434. pTask->fsmState = 12;
  1435. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1436. }
  1437. case USER_EVT_BACK_TO_INIT:
  1438. pEvt->SetHandled();
  1439. break;
  1440. default:
  1441. break;
  1442. }
  1443. return ret;
  1444. }
  1445. //NoCfgDev
  1446. void CCardIssuerFSM::s13_on_entry()
  1447. {
  1448. LOG_FUNCTION();
  1449. m_currentFSMState = 13;
  1450. SetDevStateAndSendMsg(DEVICE_STATUS_NOCFG);
  1451. }
  1452. void CCardIssuerFSM::s13_on_exit()
  1453. {
  1454. LOG_FUNCTION();
  1455. }
  1456. unsigned int CCardIssuerFSM::s13_on_event(FSMEvent* pEvt)
  1457. {
  1458. int ret = 0;
  1459. switch (pEvt->iEvt)
  1460. {
  1461. case USER_EVT_CONNECT:
  1462. {
  1463. m_scanCount = 0;
  1464. PeirodConnectTask *task = new PeirodConnectTask(this);
  1465. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1466. }
  1467. break;
  1468. case USER_EVT_QUERY_SCI_LIST:
  1469. {
  1470. pEvt->SetHandled();
  1471. QuerySCIListEvent *qsl = dynamic_cast<QuerySCIListEvent*>(pEvt);
  1472. QuerySCIListTask *pTask = new QuerySCIListTask(this);
  1473. pTask->ctx = qsl->ctx;
  1474. pTask->fsmState = 13;
  1475. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1476. }
  1477. break;
  1478. case USER_EVT_BIND_SCI:
  1479. {
  1480. pEvt->SetHandled();
  1481. BindSCIEvent *bsl = dynamic_cast<BindSCIEvent*>(pEvt);
  1482. BindSCITask *pTask = new BindSCITask(this);
  1483. pTask->ctx = bsl->ctx;
  1484. pTask->fsmState = 13;
  1485. ErrorCodeEnum ec = GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1486. Dbg("post thread task returned: %d", ec);
  1487. }
  1488. break;
  1489. case USER_EVT_PREONLINE_ON_STORE:
  1490. {
  1491. pEvt->SetHandled();
  1492. PreOnlineOnStoreEvent *bsl = dynamic_cast<PreOnlineOnStoreEvent*>(pEvt);
  1493. PreOnlineOnStoreTask *pTask = new PreOnlineOnStoreTask(this);
  1494. pTask->ctx = bsl->ctx;
  1495. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1496. }
  1497. break;
  1498. default:
  1499. break;
  1500. }
  1501. return ret;
  1502. }
  1503. //SAMIC
  1504. void CCardIssuerFSM::s14_on_entry()
  1505. {
  1506. LOG_FUNCTION();
  1507. m_currentFSMState = 14;
  1508. }
  1509. void CCardIssuerFSM::s14_on_exit()
  1510. {
  1511. LOG_FUNCTION();
  1512. }
  1513. unsigned int CCardIssuerFSM::s14_on_event(FSMEvent* pEvt)
  1514. {
  1515. int ret = 0;
  1516. switch (pEvt->iEvt)
  1517. {
  1518. case USER_EVT_SAM_IC_FINISHED:
  1519. pEvt->SetHandled();
  1520. break;
  1521. default:
  1522. break;
  1523. }
  1524. return ret;
  1525. }
  1526. //Other
  1527. void CCardIssuerFSM::s15_on_entry()
  1528. {
  1529. m_currentFSMState = 15;
  1530. }
  1531. void CCardIssuerFSM::s15_on_exit()
  1532. {
  1533. }
  1534. unsigned int CCardIssuerFSM::s15_on_event(FSMEvent* pEvt)
  1535. {
  1536. Dbg("s15 %d,%d",pEvt->iEvt,pEvt->param1);
  1537. switch (pEvt->iEvt)
  1538. {
  1539. case USER_EVT_QUERY_SCI_LIST_FINISHED:
  1540. {
  1541. pEvt->SetHandled();
  1542. return pEvt->param1;
  1543. }
  1544. break;
  1545. case USER_EVT_BIND_SCI_FINISHED:
  1546. {
  1547. pEvt->SetHandled();
  1548. return pEvt->param1;
  1549. }
  1550. break;
  1551. default:
  1552. break;
  1553. }
  1554. return 0;
  1555. }
  1556. //PreOnlineOnStore
  1557. void CCardIssuerFSM::s16_on_entry()
  1558. {
  1559. m_currentFSMState = 16;
  1560. }
  1561. void CCardIssuerFSM::s16_on_exit()
  1562. {
  1563. }
  1564. unsigned int CCardIssuerFSM::s16_on_event(FSMEvent* pEvt)
  1565. {
  1566. Dbg("s16 %d,%d", pEvt->iEvt, pEvt->param1);
  1567. switch (pEvt->iEvt)
  1568. {
  1569. case USER_EVT_PREONLINE_ON_STORE_FINISHED:
  1570. {
  1571. pEvt->SetHandled();
  1572. return pEvt->param1;
  1573. }
  1574. break;
  1575. default:
  1576. break;
  1577. }
  1578. return 0;
  1579. }
  1580. void CCardIssuerFSM::s17_on_entry()
  1581. {
  1582. LOG_FUNCTION();
  1583. m_currentFSMState = 17;
  1584. }
  1585. void CCardIssuerFSM::s17_on_exit()
  1586. {
  1587. LOG_FUNCTION();
  1588. }
  1589. unsigned int CCardIssuerFSM::s17_on_event(FSMEvent* pEvt)
  1590. {
  1591. Dbg("s17 evt(%d)", pEvt->iEvt);
  1592. int ret = 0;
  1593. switch(pEvt->iEvt)
  1594. {
  1595. case USER_EVT_QUERYCARDINFO_ON_STORE_FINISHED:
  1596. pEvt->SetHandled();
  1597. ret = pEvt->param1;
  1598. break;
  1599. default:
  1600. break;
  1601. }
  1602. return ret;
  1603. }
  1604. ErrorCodeEnum CCardIssuerFSM::OnInit()
  1605. {
  1606. LOG_FUNCTION();
  1607. GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
  1608. #ifdef TWINKLE_LOCAL_DEBUG
  1609. LOG_CARDISSUER_ERROR_MSG_MACRO(Error_Unexpect, QuerySlotsStatus);
  1610. #endif
  1611. //MessageBoxA(0, 0, 0, 0);
  1612. m_pCardProcess = new CCardProcess();
  1613. if (m_pCardProcess == NULL)//almost no use...
  1614. {
  1615. Dbg("create card process failed.");
  1616. return Error_Resource;
  1617. }
  1618. Load();
  1619. CSystemStaticInfo sysInfo;
  1620. //oilyang 20160331
  1621. //so many function always return Error_Succeed,so is useless to process it.
  1622. m_csMachineType = m_csSite = m_terminalNo = "";
  1623. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  1624. m_csMachineType = sysInfo.strMachineType;
  1625. m_csSite = sysInfo.strSite;
  1626. m_terminalNo = sysInfo.strTerminalID;
  1627. m_majorVerion = sysInfo.MachineVersion.GetMajor();
  1628. m_minorVerion = sysInfo.MachineVersion.GetMinor();
  1629. Dbg("machineType:%s,site:%s,terminalNo:%s,machineVersion:%d.%d", (const char*)m_csMachineType, (const char*)m_csSite
  1630. , (const char*)m_terminalNo, m_majorVerion, m_minorVerion);
  1631. m_devStatus.eMedia = CI_MEDIA_NOTPRESENT;
  1632. m_bHasHopper[0] = false;
  1633. m_bHasHopper[1] = false;
  1634. m_bHasHopper[2] = false;
  1635. InitializeCriticalSectionAndSpinCount(&g_sciRecord, 100);
  1636. return Error_Succeed;
  1637. }
  1638. ErrorCodeEnum CCardIssuerFSM::OnExit()
  1639. {
  1640. LOG_FUNCTION();
  1641. ErrorCodeEnum eExit;
  1642. if (m_pCardIssuer != NULL)
  1643. {
  1644. eExit = m_pCardIssuer->GetDevStatus(m_devStatus);
  1645. if (eExit == Error_Succeed)
  1646. {
  1647. if (m_devStatus.eMedia == CI_MEDIA_PRESENT){
  1648. if (m_issueStatus)
  1649. {
  1650. eExit = MachineMoveCardBackNotHold();
  1651. m_CardCaptured++;
  1652. SetCardCaptured(m_CardCaptured);
  1653. Dbg("entity quit to capture card(%d).",eExit);
  1654. }
  1655. else
  1656. {
  1657. eExit = MachineMoveCardFrontGate();
  1658. Dbg("entity quit to eject card(%d).",eExit);
  1659. }
  1660. }
  1661. }
  1662. eExit = m_pCardIssuer->DevClose();
  1663. if (eExit == Error_Succeed)
  1664. Dbg("读卡器关闭成功");
  1665. else
  1666. Dbg("读卡器关闭失败(%d)",eExit);
  1667. }
  1668. FSMImpl<CCardIssuerFSM>::OnExit();
  1669. return Error_Succeed;
  1670. }
  1671. void TestShowRecvData(PBYTE hexBuf,DWORD len)
  1672. {
  1673. char* show = new char[MAX_TEST_SHOW];
  1674. ZeroMemory(show,MAX_TEST_SHOW);
  1675. HexBuf2StrBuf(hexBuf,&show,len);
  1676. delete[] show;
  1677. }
  1678. int FindHexCharPosition(LPBYTE data, BYTE hexChar, int len)
  1679. {
  1680. int notExist = -1,ret = 1,pos = 0;
  1681. for (; pos < len; ++pos)
  1682. {
  1683. BYTE high = (*(data+pos))&0xf0;
  1684. BYTE low = (*(data+pos))&0x0f;
  1685. if ((high>>4) != hexChar)
  1686. ret++;
  1687. else
  1688. return ret;
  1689. if (low != hexChar)
  1690. ret++;
  1691. else
  1692. return ret;
  1693. }
  1694. ret = notExist;
  1695. return ret;
  1696. }
  1697. bool CCardIssuerFSM::GetDevStatus()
  1698. {
  1699. //LOG_FUNCTION();
  1700. int getDevInfoCount = 0;
  1701. static unsigned int lightStatus = 0;
  1702. ErrorCodeEnum err;
  1703. do{
  1704. err = m_pCardIssuer->GetDevStatus(m_devStatus);
  1705. if (Error_Succeed == err)
  1706. {
  1707. Dbg("GetDevStatus::eMedia: %d", m_devStatus.eMedia);
  1708. if(m_devStatus.eMedia == CI_MEDIA_ENTERING) {
  1709. }
  1710. return true;
  1711. }
  1712. else
  1713. {
  1714. //LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_GetDevStatus_Failed,
  1715. // "GetDevStatus获取设备状态失败");
  1716. //DevErrorInfo devErrInfo;
  1717. //m_pCardIssuer->GetLastErr(devErrInfo);
  1718. //Dbg("GetDevStatus:[%s]",devErrInfo.szErrMsg);
  1719. LogErrMsg("GetDevStatus::GetDevStatus", err, MEC_DEVAPI_CARDISSUER_GetDevStatus, TRUE);
  1720. getDevInfoCount++;
  1721. Sleep(3000);
  1722. }
  1723. } while (getDevInfoCount < GET_DEV_STATUS_COUNT);
  1724. //Dbg("getdevstatus to reset");
  1725. //err = m_pCardIssuer->Reset();
  1726. //Sleep(MAX_RESET_TIMEROUT);
  1727. //if (err == Error_Succeed)
  1728. //{
  1729. // err = m_pCardIssuer->GetDevStatus(devStatus);
  1730. // if (err == Error_Succeed)
  1731. // return true;
  1732. //}
  1733. return false;
  1734. }
  1735. int CCardIssuerFSM::Reset()
  1736. {
  1737. LOG_FUNCTION();
  1738. ErrorCodeEnum ec = m_pCardIssuer->Reset();
  1739. if (ec == Error_Succeed)
  1740. {
  1741. //if (Error_Succeed == m_pCardIssuer->GetDevStatus(m_devStatus))
  1742. if(GetDevStatus())
  1743. {
  1744. Dbg("media pos:%d", m_devStatus.eMedia);
  1745. if (m_devStatus.eMedia == CI_MEDIA_PRESENT || m_devStatus.eMedia == CI_MEDIA_ENTERING)
  1746. {
  1747. ErrorCodeEnum eMoveErr;
  1748. if (m_issueStatus)
  1749. {
  1750. //oiltmp to add 20131212
  1751. eMoveErr = MachineMoveCardBackNotHold();
  1752. Dbg("fsm reset capture card.");
  1753. m_CardCaptured++;
  1754. if (!SetCardCaptured(m_CardCaptured))
  1755. Dbg("set card captured failed.");
  1756. }
  1757. else
  1758. {
  1759. //oiltmp to add 20131212
  1760. eMoveErr = MachineMoveCardFrontGate();
  1761. }
  1762. if (eMoveErr == Error_Succeed)
  1763. {
  1764. return 0;
  1765. }
  1766. else {
  1767. Dbg("after reset,move front failed(%d).",eMoveErr);
  1768. }
  1769. }
  1770. else if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT) {
  1771. return 0;
  1772. }
  1773. else
  1774. {
  1775. Dbg("media position %d",m_devStatus.eMedia);
  1776. return 1;
  1777. }
  1778. }
  1779. else
  1780. {
  1781. return 1;
  1782. }
  1783. }
  1784. else {
  1785. LOG_CARDISSUER_ERROR_MSG_MACRO(ec, Reset);
  1786. return 1;
  1787. }
  1788. return 0;
  1789. }
  1790. bool isnostr(const char *str)
  1791. {
  1792. int len = strlen(str);
  1793. if (len == 0)
  1794. return true;
  1795. for (int i = 0; i < len; ++i)
  1796. {
  1797. if (*(str+i) != ' ')
  1798. return false;
  1799. }
  1800. return true;
  1801. }
  1802. bool CCardIssuerFSM::LoadCMBPrint(CSimpleStringA csBinPath)
  1803. {
  1804. if (cmdDecodeEx == NULL) {
  1805. CSimpleStringA csCMBPrint("");
  1806. #ifdef RVC_OS_LINUX
  1807. csCMBPrint = "CMBPrint.so";
  1808. csCMBPrint = csBinPath + "/" + csCMBPrint;
  1809. Dbg("cmbpath %s", (const char*)csCMBPrint);
  1810. void* hr = NULL;
  1811. hr = dlopen(csCMBPrint, RTLD_LAZY);
  1812. if (hr == NULL)
  1813. {
  1814. Dbg("Load CMBPrint failed(%d)(%s).", errno,strerror(errno));
  1815. return false;
  1816. }
  1817. //pfunc_unpack = (PF_unpack)dlsym(hLib, "_Z6unpackPcS_i");
  1818. if ((cmdDecodeMag2 = (lpCMBdecodeMag2)dlsym(hr, "CMBdecodeMag2")) == NULL)
  1819. {
  1820. Dbg("Get Mag2 address failed.");
  1821. return false;
  1822. }
  1823. if ((cmdDecodeEx = (lpCMBdecodeEx)dlsym(hr, "CMBdecodeEx")) == NULL)
  1824. {
  1825. Dbg("Get Mag23Ex address failed.");
  1826. cmdDecodeMag2 = NULL;
  1827. return false;
  1828. }
  1829. #else
  1830. csCMBPrint = "CMBPrint.dll";
  1831. csCMBPrint = csBinPath + SPLIT_SLASH_STR + csCMBPrint;
  1832. Dbg("cmbpath %s", (const char*)csCMBPrint);
  1833. HMODULE hr = LoadLibraryA(csCMBPrint);
  1834. if (hr == NULL)
  1835. {
  1836. Dbg("Load CMBPrint failed(%d).", hr);
  1837. return false;
  1838. }
  1839. if ((cmdDecodeMag2 = (lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL)
  1840. {
  1841. Dbg("Get Mag2 address failed.");
  1842. return false;
  1843. }
  1844. if ((cmdDecodeEx = (lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL)
  1845. {
  1846. Dbg("Get Mag23Ex address failed.");
  1847. cmdDecodeMag2 = NULL;
  1848. return false;
  1849. }
  1850. #endif
  1851. Dbg("Load %s suc.", (const char*)csCMBPrint);
  1852. }
  1853. return true;
  1854. }
  1855. ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char *pDevSN)
  1856. {
  1857. LOG_FUNCTION();
  1858. m_devOpenFailedCount++;
  1859. ErrorCodeEnum eErrDev;
  1860. //HRESULT hr;
  1861. int initTries = 0;
  1862. CSimpleStringA dllName;
  1863. GetVendorDllName(dllName);
  1864. Dbg("to load:%s",(const char*)dllName);
  1865. #ifdef RVC_OS_WIN
  1866. // [9/29/2019 14:13 @Gifur]
  1867. CloseAndClearDevObj(false);
  1868. m_hVerdorDll = LoadLibraryA(dllName);
  1869. Dbg("load vendor dll %s", (const char*)dllName);
  1870. if (m_hVerdorDll == NULL)
  1871. {
  1872. Dbg("Load dll failed.%d", GetLastError());
  1873. GetEntityBase()->GetFunction()->ShowFatalError("加载厂商适配器失败!请检查root.ini配置是否正确。");
  1874. return Error_DevLoadFileFailed;
  1875. }
  1876. if ((CreateDevComponent = (lpCreateDevCom)GetProcAddress(m_hVerdorDll, "CreateDevComponent")) == NULL)
  1877. {
  1878. Dbg("Get CreateDevComponent failed.");
  1879. return Error_DevLoadFileFailed;
  1880. }
  1881. if ((ReleaseDevComponent = (lpReleaseDevCom)GetProcAddress(m_hVerdorDll, "ReleaseDevComponent")) == NULL)
  1882. {
  1883. Dbg("Get ReleaseDevComponent failed.");
  1884. return Error_DevLoadFileFailed;
  1885. }
  1886. Dbg("Get vendor function suc.");
  1887. #else
  1888. Dbg("To test CardIssuer");
  1889. m_hVerdorDll = dlopen(dllName, RTLD_LAZY);
  1890. if (m_hVerdorDll == NULL)
  1891. {
  1892. Dbg("load failed:%s,%d,%s",(const char*)dllName,errno,strerror(errno));
  1893. return Error_DevLoadFileFailed;
  1894. }
  1895. CreateDevComponent = (lpCreateDevCom)dlsym(m_hVerdorDll, "CreateDevComponent");
  1896. if (CreateDevComponent == NULL)
  1897. {
  1898. Dbg("load CreateDevCom failed:");
  1899. return Error_DevLoadFileFailed;
  1900. }
  1901. ReleaseDevComponent = (lpReleaseDevCom)dlsym(m_hVerdorDll, "ReleaseDevComponent");
  1902. if (ReleaseDevComponent == NULL)
  1903. {
  1904. Dbg("load ReleaseDevComponent failed:");
  1905. return Error_DevLoadFileFailed;
  1906. }
  1907. Dbg("Get vendor function suc.");
  1908. #endif
  1909. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1910. CSmartPointer<IConfigInfo> spConfig;
  1911. CSimpleStringA csBinPath, csBackslash("\\");
  1912. ErrorCodeEnum eErrPath = GetEntityBase()->GetFunction()->GetPath("Bin", csBinPath);
  1913. if (eErrPath != Error_Succeed)
  1914. {
  1915. Dbg("GetBasePath failed (%d).", eErrPath);
  1916. return Error_Param;
  1917. }
  1918. for (int i = 0; i < 3; ++i)
  1919. {
  1920. m_CardBoxNoEx[i] = "";
  1921. m_PsbCodeEx[i] = "";
  1922. m_PsbNameEx[i] = "";
  1923. m_MaintainerEx[i] = "";
  1924. m_CardInitEx[i] = 0;
  1925. m_CardPercentEx[i] = 0;
  1926. m_remainsEx[i] = 0;
  1927. m_issuedEx[i] = 0;
  1928. m_mixedEx[i] = 0;
  1929. m_csMaintainTimeEx[i] = "";
  1930. m_MaintainTimeEx[i] = 0;
  1931. }
  1932. m_pCardIssuer = NULL;
  1933. do{
  1934. if (m_pCardIssuer == NULL)
  1935. {
  1936. if ((eErrDev = CreateDevComponent((DeviceBaseClass*&)m_pCardIssuer)) != Error_Succeed)
  1937. {
  1938. LogErrMsg("OpenDevice:CreateDevComponent", eErrDev, MEC_DEV_OBJECT_CREATE_FAILED, TRUE);
  1939. initTries++;
  1940. m_pCardIssuer = NULL;
  1941. continue;
  1942. }
  1943. else
  1944. Dbg("CreateDevComponent suc.");
  1945. }
  1946. if(m_bUnbindType3) {
  1947. Dbg("Detect unbind type is true, return previously");
  1948. return Error_Cancel;
  1949. }
  1950. Dbg("Start to invoke DevOpenEx func with %d, %d, %s...", m_port, m_baudRate, pDevSN);
  1951. eErrDev = m_pCardIssuer->DevOpenEx(m_port, m_baudRate, btOpenType, pDevSN, m_connectType);
  1952. Dbg("DevOpenEx returned hr[%d], %d, connectType[%d]", eErrDev, btOpenType, m_connectType);
  1953. if (eErrDev == Error_Succeed)
  1954. {
  1955. m_bOpened = true;
  1956. m_devOpenFailedCount = 0;
  1957. LOG_TRACE("读卡器打开成功");
  1958. //DevCategoryInfo devCat;
  1959. ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
  1960. ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
  1961. ZeroMemory(m_devCat.szVendor, sizeof(m_devCat.szVendor));
  1962. eErrDev = m_pCardIssuer->GetDevCategory(m_devCat);
  1963. if (eErrDev == Error_Succeed)
  1964. {
  1965. Dbg("szVendor:%s", m_devCat.szVendor);
  1966. Dbg("szType:%s", m_devCat.szType);
  1967. Dbg("szModel:%s", m_devCat.szModel);
  1968. Dbg("version:%d.%d.%d.%d", m_devCat.version.wMajor, m_devCat.version.wMinor, m_devCat.version.wRevision, m_devCat.version.wBuild);
  1969. int ret = SplitDevModelInfo();
  1970. Dbg("SplitDevModelInfo ret:%d",ret);
  1971. }
  1972. else
  1973. {
  1974. LOG_CARDISSUER_ERROR_MSG_MACRO(eErrDev, GetDevCategory);
  1975. //LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_GetDevCategory_Failed, "获取设备信息失败");
  1976. //Dbg("GetDevCategory failed.%d",eErrDev);
  1977. //LogDevErrorInfo();
  1978. return Error_Unexpect;
  1979. }
  1980. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  1981. {
  1982. eErrDev = m_pCardIssuer->GetSlotSum(m_maxSlot);
  1983. if (m_maxSlot < 0)
  1984. {
  1985. Dbg("Get slot num failed.%d,%d",eErrDev,m_maxSlot);
  1986. m_maxSlot = 0;
  1987. }
  1988. Dbg("max slot num:%d",m_maxSlot);
  1989. }
  1990. else
  1991. {
  1992. char *pDevSN = new char[128];
  1993. ZeroMemory(pDevSN, 128);
  1994. ErrorCodeEnum eErr;
  1995. eErr = m_pCardIssuer->GetDeviceSN(pDevSN);
  1996. if (eErr == Error_Succeed)
  1997. {
  1998. m_csDevSN = pDevSN;
  1999. Dbg("GetDeviceSN:%s", pDevSN);
  2000. if (pDevSN != NULL)
  2001. delete[]pDevSN;
  2002. }
  2003. else
  2004. {
  2005. LogErrMsg("获取设备唯一号失败", eErr, MEC_DEVAPI_CARDISSUER_GetDeviceSN, TRUE);
  2006. //LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_GetDeviceSN_Failed, "获取设备唯一号失败");
  2007. //Dbg("GetDeviceSN failed.%d", eErr);
  2008. if (pDevSN != NULL)
  2009. {
  2010. delete[]pDevSN;
  2011. }
  2012. return Error_Unexpect;
  2013. }
  2014. }
  2015. if (!LoadCMBPrint(csBinPath))
  2016. {
  2017. Dbg("load CMBPrint failed.");
  2018. LogErrMsg("OpenDevice::DevOpenEx", Error_DevLoadFileFailed, CardIssuer_UserErrorCode_Load_CMBPrint_Failed, TRUE);
  2019. return Error_DevLoadFileFailed;
  2020. }
  2021. initTries = 0;
  2022. break;
  2023. }
  2024. else {
  2025. //LogDevErrorInfo();
  2026. LogErrMsg("OpenDevice::DevOpenEx", eErrDev, MEC_DEVAPI_CARDISSUER_DevOpenEx, TRUE);
  2027. initTries++;
  2028. }
  2029. }while(initTries < INIT_TRY_NUM);
  2030. Dbg("inittries[%d]",initTries);
  2031. if (initTries != 0)
  2032. {
  2033. return Error_DevCommFailed;
  2034. }
  2035. else
  2036. {
  2037. LoadCMBBin();//load cmb bin for detect card type info
  2038. eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  2039. if (eErrDev != Error_Succeed) {
  2040. Dbg("open run cfg file failed!");
  2041. CloseAndClearDevObj(false);
  2042. return eErrDev;
  2043. }
  2044. int ret = 0,isIssue = 99;
  2045. spConfig->ReadConfigValueInt("all", "IsIssue", isIssue);
  2046. spConfig->ReadConfigValueInt("all", "HopperNum", m_hopperNum);
  2047. spConfig->ReadConfigValueInt("all", "CardCaptured", m_CardCaptured);
  2048. //Dbg("IssueFlag:%d,HopperNum:%d,CardCaptured:%d",isIssue,m_hopperNum,m_CardCaptured);
  2049. //if (m_hopperNum == 0)
  2050. {
  2051. if (btOpenType == DEV_OPEN_TYPE_COM)
  2052. {
  2053. if (m_connectType >= 1 && m_connectType <= 3)
  2054. m_hopperNum = m_connectType;
  2055. else
  2056. m_hopperNum = 3;
  2057. for (int i = 0; i < m_hopperNum; ++i)
  2058. m_bHasHopper[i] = true;
  2059. }
  2060. else
  2061. {
  2062. if(IsValidSCIName(pDevSN, strlen(pDevSN)) == 2) {
  2063. m_hopperNum = 1;
  2064. m_bHasHopper[0] = true;
  2065. } else {
  2066. //oiltmp 便携发卡目前都为2个
  2067. m_hopperNum = 2;
  2068. m_bHasHopper[0] = true;
  2069. m_bHasHopper[1] = true;
  2070. }
  2071. }
  2072. }
  2073. char sec[2];
  2074. for (int i = 0; i < 3; ++i)
  2075. {
  2076. ZeroMemory(sec, 2);
  2077. _itoa(i + 1, (char*)sec, 10);
  2078. Dbg("sec:%s",sec);
  2079. spConfig->ReadConfigValue(sec, "CardBoxNo", m_CardBoxNoEx[i]);
  2080. spConfig->ReadConfigValue(sec, "PsbCode", m_PsbCodeEx[i]);
  2081. spConfig->ReadConfigValue(sec, "PsbName", m_PsbNameEx[i]);
  2082. spConfig->ReadConfigValueInt(sec, "CardInit", m_CardInitEx[i]);
  2083. spConfig->ReadConfigValueInt(sec, "CardRemains", m_remainsEx[i]);
  2084. spConfig->ReadConfigValueInt(sec, "CardIssued", m_issuedEx[i]);
  2085. spConfig->ReadConfigValueInt(sec, "CardMixed", m_mixedEx[i]);
  2086. spConfig->ReadConfigValueInt(sec, "CardPercent", m_CardPercentEx[i]);
  2087. spConfig->ReadConfigValue(sec, "Maintainer", m_MaintainerEx[i]);
  2088. spConfig->ReadConfigValue(sec, "MaintainTime", m_csMaintainTimeEx[i]);
  2089. }
  2090. if (m_hopperNum == 1 && btOpenType == DEV_OPEN_TYPE_COM)//oilyang 如果没有配置,使用原来的配置
  2091. {
  2092. Dbg("use old record.");
  2093. spConfig->ReadConfigValueInt("RunInfo", "CardRemains", m_remainsEx[0]);
  2094. spConfig->ReadConfigValueInt("RunInfo", "CardIssued", m_issuedEx[0]);
  2095. spConfig->ReadConfigValueInt("RunInfo", "CardCaptured", m_CardCaptured);
  2096. spConfig->ReadConfigValueInt("RunInfo", "IsIssue", isIssue);
  2097. spConfig->ReadConfigValueInt("RunInfo", "CardMixed", m_mixedEx[0]);
  2098. spConfig->ReadConfigValueInt("RunInfo", "CardInit", m_CardInitEx[0]);
  2099. spConfig->ReadConfigValueInt("RunInfo", "CardPercent", m_CardPercentEx[0]);
  2100. }
  2101. //oilyang 回写卡机配置
  2102. spConfig->WriteConfigValueInt("all", "IsIssue", isIssue);
  2103. spConfig->WriteConfigValueInt("all", "HopperNum", m_hopperNum);
  2104. spConfig->WriteConfigValueInt("1", "CardPercent", m_CardPercentEx[0]);
  2105. spEntityFunction->OpenConfig(Config_CenterSetting, spConfig);
  2106. {
  2107. int tmpValue = 0;
  2108. //oilyang 20160520
  2109. //no need now according to Song Rui & xkm
  2110. m_bCaptureCfgFlag = true;
  2111. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ScanSlot", tmpValue);
  2112. if (tmpValue > 0 && tmpValue <= 60)
  2113. {
  2114. Dbg("ScanSlot:%d", m_scanSlot);
  2115. m_scanSlot = tmpValue;
  2116. }
  2117. }
  2118. {
  2119. if (btOpenType != DEV_OPEN_TYPE_COM)
  2120. {
  2121. int rt = -1;
  2122. if (m_csCM.GetLength() > 3 && _strnicmp(m_csCM, "V2.0", strlen("V2.0")) == 0)
  2123. {
  2124. rt = DataTransferInitEx();
  2125. }
  2126. Dbg("DataTransferInit(Ex) rt:%d", rt);
  2127. if (rt == 0)
  2128. {
  2129. Dbg("安全通道建立成功。");
  2130. m_bChannelOK = true;
  2131. }
  2132. else
  2133. {
  2134. Dbg("安全通道建立失败。");
  2135. return Error_Unexpect;
  2136. }
  2137. }
  2138. LoadSafeLockDll();
  2139. Dbg("in %d cycle",isIssue);
  2140. m_issueStatusFromFile = m_issueStatus = isIssue;
  2141. ret = UnAcceptCard();
  2142. }
  2143. if (ret == 0)
  2144. {
  2145. if (m_hasCardWhileDevOpen && m_issueStatusFromFile > 0)
  2146. {
  2147. //oilyang@20171220 遗留卡片已经被吞,重置数据
  2148. Dbg("left card have been processed,to reset data.");
  2149. m_issueStatusFromFile = 0;
  2150. m_currCardNo = m_addCardNo = "";
  2151. FSMSetIssueFlag(0);
  2152. }
  2153. if (m_connectType == DEV_OPEN_TYPE_BLUETOOTH)
  2154. {
  2155. m_bBTConnected = true;
  2156. }
  2157. //oilyang@20191219 获取吞卡箱容量,目前有便携卡机,大机
  2158. //超过5,认为是脏数据,用默认值3
  2159. CardIssuerStatus cis;
  2160. if ((eErrDev = m_pCardIssuer->GetDevStatus(cis)) != Error_Succeed) {
  2161. LogErrMsg("GetDevStatus(OpenDevice)", eErrDev, MEC_DEVAPI_CARDISSUER_GetDevStatus, TRUE);
  2162. }
  2163. else
  2164. {
  2165. Dbg("max retain count:%d",cis.dwRetainCount);
  2166. if (cis.dwRetainCount > 0 && cis.dwRetainCount <= 5)
  2167. m_maxRetainCount = cis.dwRetainCount;
  2168. else
  2169. m_maxRetainCount = 3;
  2170. if (cis.eRetainBin == CI_RETAINBIN_FULL)
  2171. {
  2172. Dbg("(sensor)retain bin is full!回收箱满了,请及时清理!");
  2173. LogWarn(Severity_Middle, Error_Unexpect, LOG_ERR_CARDISSUER_RETAIN_BIN_IS_FULL_SENSOR, "(sensor)retain bin is full!回收箱满了,请及时清理!");
  2174. }
  2175. }
  2176. return Error_Succeed;
  2177. }
  2178. else
  2179. {
  2180. return Error_Unexpect;
  2181. }
  2182. }
  2183. }
  2184. void CCardIssuerFSM::LoadCMBBin()
  2185. {
  2186. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  2187. CSmartPointer<IConfigInfo> spConfig;
  2188. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Software, spConfig);
  2189. if (eErrDev != Error_Succeed) {
  2190. Dbg("open module cfg file failed!");
  2191. return;
  2192. }
  2193. int dmCount,diCount,cmCount,ciCount;
  2194. dmCount=diCount=cmCount=ciCount=0;
  2195. spConfig->ReadConfigValueInt("CMBDebitMag","count",dmCount);
  2196. spConfig->ReadConfigValueInt("CMBDebitIC","count",diCount);
  2197. spConfig->ReadConfigValueInt("CMBCreditMag","count",cmCount);
  2198. spConfig->ReadConfigValueInt("CMBCreditIC","count",ciCount);
  2199. for (int i = 1; i <= dmCount; ++i)
  2200. {
  2201. CMBBin bin;
  2202. char tmp[64] = {0};
  2203. _itoa(i,tmp,10);
  2204. spConfig->ReadConfigValue("CMBDebitMag",tmp,bin.bin);
  2205. bin.bDC = true;
  2206. bin.bIC = false;
  2207. m_vBin.push_back(bin);
  2208. }
  2209. for (int i = 1; i <= diCount; ++i)
  2210. {
  2211. CMBBin bin;
  2212. char tmp[64] = {0};
  2213. _itoa(i,tmp,10);
  2214. spConfig->ReadConfigValue("CMBDebitIC",tmp,bin.bin);
  2215. bin.bDC = true;
  2216. bin.bIC = true;
  2217. m_vBin.push_back(bin);
  2218. }
  2219. for (int i = 1; i <= cmCount; ++i)
  2220. {
  2221. CMBBin bin;
  2222. char tmp[64] = {0};
  2223. _itoa(i,tmp,10);
  2224. spConfig->ReadConfigValue("CMBCreditMag",tmp,bin.bin);
  2225. bin.bDC = false;
  2226. bin.bIC = false;
  2227. m_vBin.push_back(bin);
  2228. }
  2229. for (int i = 1; i <= ciCount; ++i)
  2230. {
  2231. CMBBin bin;
  2232. char tmp[64] = {0};
  2233. _itoa(i,tmp,10);
  2234. spConfig->ReadConfigValue("CMBCreditIC",tmp,bin.bin);
  2235. bin.bDC = false;
  2236. bin.bIC = true;
  2237. m_vBin.push_back(bin);
  2238. }
  2239. }
  2240. void CCardIssuerFSM::Load()
  2241. {
  2242. LOG_FUNCTION();
  2243. CSmartPointer<IConfigInfo> spConfig;
  2244. ErrorCodeEnum eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfig);
  2245. if (spConfig == NULL)
  2246. {
  2247. Dbg("open root.ini failed.");
  2248. return;
  2249. }
  2250. int smflag, onlineOnly;
  2251. CSimpleStringA csVendor("");
  2252. spConfig->ReadConfigValueInt("Device.CardIssuer", "Baudrate", m_baudRate);
  2253. spConfig->ReadConfigValueInt("Device.CardIssuer", "Port", m_port);
  2254. spConfig->ReadConfigValue("Device.CardIssuer", "Vendor", csVendor);
  2255. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, csVendor);
  2256. //oiltmp 20161116 余下两项有必要迁移到运行时配置?
  2257. spConfig->ReadConfigValueInt("Device.Utility", "SMSupport", smflag);
  2258. spConfig->ReadConfigValueInt("Device.Utility", "OnlineOnly", onlineOnly);
  2259. m_bSM = smflag;
  2260. //oiltmp 20160506 no offline business now
  2261. //m_bOnlineOnly = onlineOnly;
  2262. m_bOnlineOnly = true;
  2263. m_csDevSN = "";
  2264. //for data migrate after dynamic bind SCI
  2265. CSmartPointer<IConfigInfo> spConfigRun;
  2266. eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2267. if (eErrDev != Error_Succeed) {
  2268. Dbg("(set sci name)open cfg file failed!");
  2269. }
  2270. else
  2271. {
  2272. CSimpleStringA tmpNameRun(""), tmpNameRoot(""), tmpVendor("");
  2273. spConfigRun->ReadConfigValue("SCI", "name", tmpNameRun);
  2274. spConfig->ReadConfigValue("Terminal", "DevSN", tmpNameRoot);
  2275. Dbg("runcfg:%s,root.ini:%s", (const char*)tmpNameRun, (const char*)tmpNameRoot);
  2276. spConfigRun->ReadConfigValue("SCI", "Vendor", tmpVendor);
  2277. // 如果运行时没有厂商名称,则将Root配置的厂商名称写到运行时,后面应该会改变?
  2278. if (tmpVendor.IsNullOrEmpty())
  2279. {
  2280. if (!csVendor.IsNullOrEmpty())
  2281. spConfigRun->WriteConfigValue("SCI", "Vendor", csVendor);
  2282. }
  2283. // 处理设备序列号,只有运行时有设备名称才赋值
  2284. if (tmpNameRun.GetLength() > 2)//runcfg has sci name
  2285. {
  2286. Dbg("runcfg has sci name");
  2287. m_csDevSN = tmpNameRun;
  2288. //after migrate from root.ini to runcfg,clear the setting in root.ini
  2289. //no privilege,hehe
  2290. if (tmpNameRoot.GetLength() > 2)
  2291. spConfig->WriteConfigValue("Terminal", "DevSN", ""); //清空掉配置?
  2292. }
  2293. else
  2294. {
  2295. //oilyang@20181129 no need to move data to RunCfg now...
  2296. //if (IsValidSCIName(tmpNameRoot,tmpNameRoot.GetLength()))//root.ini has DevSN
  2297. //{
  2298. // m_csDevSN = tmpNameRoot;
  2299. // spConfigRun->WriteConfigValue("SCI", "name", m_csDevSN);
  2300. //}
  2301. }
  2302. }
  2303. }
  2304. int CCardIssuerFSM::Initial()
  2305. {
  2306. Dbg("to open RVC.Stand2S...");
  2307. ErrorCodeEnum errCode = OpenDevice(DEV_OPEN_TYPE_COM,"");
  2308. if (errCode != Error_Succeed)
  2309. {
  2310. Dbg("Load failed(%d).", errCode);
  2311. CloseAndClearDevObj(false);
  2312. return errCode;
  2313. }
  2314. return 0;
  2315. }
  2316. int CCardIssuerFSM::UnAcceptCard()
  2317. {
  2318. LOG_FUNCTION();
  2319. ErrorCodeEnum eErr;
  2320. if (GetDevStatus()){
  2321. if (m_devStatus.eMedia == CI_MEDIA_PRESENT){
  2322. m_hasCardWhileDevOpen = true;
  2323. Dbg("读卡器有卡(%d)",m_issueStatus);
  2324. JustReadCardNo();
  2325. if (m_currCardNo.GetLength() > 1)
  2326. m_captureReason = "4014";
  2327. else
  2328. m_captureReason = "0000";
  2329. if (m_issueStatus)
  2330. return CaptureCard(NULL);
  2331. else
  2332. return EjectCard(NULL);
  2333. }
  2334. else{
  2335. //hr = m_pIDCard->IDC_CloseShutter();
  2336. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  2337. if (Error_Succeed == eErr){
  2338. //Dbg("CloseShutter(%d)",hr);
  2339. //close shutter successful process.
  2340. }
  2341. else{
  2342. LogErrMsg("after open,close shutter", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2343. //close shutter failed process.
  2344. }
  2345. if (GetDevStatus())
  2346. return 0;
  2347. else
  2348. return 1;
  2349. }
  2350. }
  2351. else
  2352. {
  2353. //Dbg("获取读卡器设备状态失败(%d)",m_devStatus.eMedia);
  2354. }
  2355. return 1;
  2356. }
  2357. int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx, SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctxEx)
  2358. {
  2359. LOG_FUNCTION();
  2360. //#ifdef TWINKLE_LOCAL_DEBUG
  2361. //oiltest@20190725 便携卡机压力测试,仅供开发环境测试
  2362. if (ctxEx != NULL)
  2363. {
  2364. if (ctxEx->Req.hopper == 199)
  2365. {
  2366. Dbg("issue card no-stop begin");
  2367. oiltestSCI(false);
  2368. Dbg("issue card no-stop end");
  2369. return 0;
  2370. }
  2371. }
  2372. //#endif
  2373. if ((_strnicmp("RVC.PAD", m_csMachineType, strlen("RVC.PAD")) == 0
  2374. || (_strnicmp("RVC.Desk2S", m_csMachineType, strlen("RVC.Desk2S")) == 0 && m_majorVerion == 1 && m_minorVerion == 0))
  2375. && !m_bChannelOK)
  2376. {
  2377. Dbg("未建立安全通道。");
  2378. if (ctxEx != NULL)
  2379. ctxEx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_No_Encryted_Channel);
  2380. else if (ctx != NULL)
  2381. ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_No_Encryted_Channel);
  2382. return 2;
  2383. }
  2384. //如果有盘库记录则清理掉(@zjw20190809)
  2385. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  2386. {
  2387. ErrorCodeEnum eErr = Error_Succeed;
  2388. CSmartPointer<IConfigInfo> spConfigRun;
  2389. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2390. if(eErr != Error_Succeed)
  2391. {
  2392. Dbg("Open runcfg failed(%d).", eErr);
  2393. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_CFG_RUN_POINTER_FAILED));
  2394. return 2;
  2395. }
  2396. if(CheckHasPanKuRecord(spConfigRun))
  2397. {
  2398. ClearLocalRecord(spConfigRun);
  2399. }
  2400. }
  2401. if (ctxEx != NULL)
  2402. {
  2403. Dbg("issue type:%d", ctxEx->Req.hopper);
  2404. ctxEx->Ans.reserved1.Init(2);
  2405. //oiltmp@20180521
  2406. //from 宋锐:存储门禁卡
  2407. if (ctxEx->Req.hopper == 86)
  2408. {
  2409. ErrorCodeEnum eGateForbid = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_ALL);
  2410. if (eGateForbid != Error_Succeed)
  2411. {
  2412. LogErrMsg("SetCardInType(CI_CARD_IN_TYPE_ALL)", eGateForbid, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2413. ctxEx->Answer(Error_Unexpect);
  2414. m_bForHangzhouSongruiMenjinka = false;
  2415. return 2;
  2416. }
  2417. INT64 start = GetTickCountRVC();
  2418. while (1)
  2419. {
  2420. if (m_bForHangzhouSongruiMenjinka)
  2421. {
  2422. Dbg("front cancel insert card.");
  2423. m_bForHangzhouSongruiMenjinka = false;
  2424. ctxEx->Answer(Error_Cancel);
  2425. return 2;
  2426. }
  2427. if (QueryCardInfo() == 2)
  2428. {
  2429. //oiltest@20180704 for songrui
  2430. CardNo cardtmp;
  2431. m_pCardIssuer->ReadAccount(cardtmp);
  2432. ctxEx->Ans.reserved1[1] = 0;
  2433. ctxEx->Answer(Error_Succeed);
  2434. Dbg("add gate forbid card suc.");
  2435. m_bForHangzhouSongruiMenjinka = false;
  2436. return 0;
  2437. }
  2438. Sleep(1000);
  2439. INT64 end = GetTickCountRVC();
  2440. if ((end - start) > 60 * 1000)
  2441. {
  2442. Dbg("time elapsed,but can't find card.");
  2443. m_bForHangzhouSongruiMenjinka = false;
  2444. ctxEx->Answer(Error_TimeOut);
  2445. return 2;
  2446. }
  2447. }
  2448. }
  2449. m_bForHangzhouSongruiMenjinka = false;
  2450. if (ctxEx->Req.hopper == 100 || ctxEx->Req.hopper == 99 || ctxEx->Req.hopper == 98 ||ctxEx->Req.hopper == 97)//卡库
  2451. {
  2452. if (!IsValidSlotNum(ctxEx->Req.reserved1[0]))
  2453. {
  2454. Dbg("Issue card invalid slot.");
  2455. ctxEx->Ans.reserved1[0] = 1;
  2456. ctxEx->Answer(Error_Succeed);
  2457. return 2;
  2458. }
  2459. if (!IsSlotHasCard(ctxEx->Req.reserved1[0]))
  2460. {
  2461. Dbg("Issue card the slot has no card");
  2462. ctxEx->Ans.reserved1[0] = 2;
  2463. ctxEx->Answer(Error_Succeed);
  2464. return 2;
  2465. }
  2466. FSMSetIssueFlag(1);
  2467. bool bSpec = false;
  2468. if (ctxEx->Req.hopper == 98 || ctxEx->Req.hopper == 100)
  2469. bSpec = true;
  2470. return IssueCardFromStore(ctxEx,bSpec);
  2471. }
  2472. else if (ctxEx->Req.hopper == 89)//加卡步骤一
  2473. {
  2474. FSMSetIssueFlag(1);
  2475. return AddCardToStoreStepFirst(ctxEx);
  2476. }
  2477. else if (ctxEx->Req.hopper == 88)//加卡步骤二
  2478. {
  2479. return AddCardToStoreStepLast(ctxEx);
  2480. }
  2481. else if (ctxEx->Req.hopper == 87)//签发失败,吞卡
  2482. {
  2483. RegistCardWhileCaptureCard();
  2484. MachineMoveCardBackNotHold();
  2485. ctxEx->Answer(Error_Succeed);
  2486. return 2;
  2487. }
  2488. Dbg("IssueCard from the %d hopper[%d].", ctxEx->Req.hopper,m_currentHopper);
  2489. //param Req.hopper is wrong
  2490. if (ctxEx->Req.hopper < 1 || ctxEx->Req.hopper > 3)
  2491. return Error_Param;
  2492. if (!m_bHasHopper[ctxEx->Req.hopper - 1])
  2493. {
  2494. if (ctxEx->Req.hopper == 1)
  2495. {
  2496. ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper1);
  2497. }
  2498. else if (ctxEx->Req.hopper == 2)
  2499. {
  2500. ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper2);
  2501. }
  2502. else if (ctxEx->Req.hopper == 3)
  2503. {
  2504. ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper3);
  2505. }
  2506. return 2;
  2507. }
  2508. m_currentHopper = ctxEx->Req.hopper;
  2509. }
  2510. else
  2511. m_currentHopper = 1;
  2512. m_pCardProcess->DataInit();
  2513. if (m_mixedEx[m_currentHopper-1] >= 3)
  2514. {
  2515. //all of the hoppers are wrong
  2516. if (((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0])
  2517. && ((m_bHasHopper[1] && m_mixedEx[1] >= 3) || !m_bHasHopper[1])
  2518. && ((m_bHasHopper[2] && m_mixedEx[2] >= 3) || !m_bHasHopper[2]))
  2519. SetDevStateAndSendMsg(DEVICE_STATUS_MAINTAINCE);
  2520. Dbg("%d,%d,%d;%d,%d,%d", m_bHasHopper[0], m_bHasHopper[1], m_bHasHopper[2],m_mixedEx[0],m_mixedEx[1],m_mixedEx[2]);
  2521. Dbg("the current card hopper may be wrong.");
  2522. if (ctx != NULL)
  2523. ctx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_Hopper_Mixed_Too_Much);
  2524. else
  2525. ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_Hopper_Mixed_Too_Much);
  2526. return 2;
  2527. }
  2528. ErrorCodeEnum errCode;
  2529. CardIssuerStatus cis;
  2530. bool bEmpty = false;
  2531. if ((errCode = m_pCardIssuer->GetDevStatus(cis)) != Error_Succeed) {
  2532. LogErrMsg("IssueCard::GetDevStatus", errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, TRUE);
  2533. }
  2534. else
  2535. {
  2536. if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY || cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP)
  2537. bEmpty = true;
  2538. }
  2539. if (bEmpty || m_remainsEx[m_currentHopper - 1] <= 0)
  2540. {
  2541. Dbg("hopper %d no more cards to issue(%d),has Issuer bin:(%d),remains:(%d),(%d)", m_currentHopper,bEmpty, cis.eIssuerBin[m_currentHopper - 1], m_remainsEx[m_currentHopper - 1], cis.dwIssuerCount[m_currentHopper - 1]);
  2542. DWORD dwUsrErrCode = 0;
  2543. if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP)
  2544. {
  2545. if (m_currentHopper == 1)
  2546. dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper1;
  2547. else if (m_currentHopper == 2)
  2548. dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper2;
  2549. else if (m_currentHopper == 3)
  2550. dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper3;
  2551. }
  2552. else if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY)
  2553. {
  2554. if (m_currentHopper == 1)
  2555. dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper1;
  2556. else if (m_currentHopper == 2)
  2557. dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper2;
  2558. else if (m_currentHopper == 3)
  2559. dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper3;
  2560. }
  2561. else if (m_remainsEx[m_currentHopper - 1] <= 0)
  2562. {
  2563. if (m_currentHopper == 1)
  2564. dwUsrErrCode = CardIssuer_UserErrorCode_NoCardRemains_Hopper1;
  2565. else if (m_currentHopper == 2)
  2566. dwUsrErrCode = CardIssuer_UserErrorCode_NoCardRemains_Hopper2;
  2567. else if (m_currentHopper == 3)
  2568. dwUsrErrCode = CardIssuer_UserErrorCode_NoCardRemains_Hopper3;
  2569. }
  2570. if (ctx != NULL)
  2571. ctx->Answer(Error_Unexpect, dwUsrErrCode);
  2572. else
  2573. ctxEx->Answer(Error_Unexpect, dwUsrErrCode);
  2574. return 2;
  2575. }
  2576. //forbid front enter
  2577. Dbg("forbid front enter");
  2578. errCode = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  2579. if (errCode != Error_Succeed)
  2580. {
  2581. LogErrMsg("before issue,close shutter", errCode, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2582. if (ctx != NULL)
  2583. ctx->Answer(Error_Unexpect,AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_SetCardInType));
  2584. else
  2585. ctxEx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_SetCardInType));
  2586. return 1;
  2587. }
  2588. Dbg("move card to holder");
  2589. FSMSetIssueFlag(1);
  2590. //move card to holder
  2591. errCode = m_pCardIssuer->MoveCard(CI_MOVECARD_FROM_HOPPER,m_currentHopper);
  2592. Dbg("move card result %d.",errCode);
  2593. if (errCode != Error_Succeed)
  2594. {
  2595. LogErrMsg("Move card from hopper to position", errCode, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER, TRUE);
  2596. //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MoveCardFromHopper_Failed, "从卡槽发卡失败");
  2597. //DevErrorInfo errMove;
  2598. //m_pCardIssuer->GetLastErr(errMove);
  2599. //Dbg("Move card from hopper to position failed(%d),(%s).",errCode,errMove.szErrMsg);
  2600. FSMSetIssueFlag(2);
  2601. if (ctx != NULL)
  2602. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER));
  2603. else
  2604. ctxEx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER));
  2605. return 1;
  2606. }
  2607. Dbg("set issue data");
  2608. m_issuedEx[m_currentHopper - 1]++;
  2609. m_remainsEx[m_currentHopper - 1]--;
  2610. //oilyang@20180809 增加对单卡槽多卡槽机器的使用及闲置的适配
  2611. if ((!m_bHasHopper[0] || m_CardPercentEx[0] == 0 || m_CardInitEx[0] == 0 || (100 * m_remainsEx[0] < m_CardPercentEx[0] * m_CardInitEx[0]))
  2612. && (!m_bHasHopper[1] || m_CardPercentEx[1] == 0 || m_CardInitEx[1] == 0 || (100 * m_remainsEx[1] < m_CardPercentEx[1] * m_CardInitEx[1]))
  2613. && (!m_bHasHopper[2] || m_CardPercentEx[2] == 0 || m_CardInitEx[2] == 0 || (100 * m_remainsEx[2] < m_CardPercentEx[2] * m_CardInitEx[2])))
  2614. {
  2615. Dbg("few card remains.");
  2616. LogWarn(Severity_Low, Error_Unexpect, LOG_ERR_CARDISSUER_FEW_CARD_REMAINS, "Few card remains.");
  2617. }
  2618. m_bSettingMaterial = true;//oilyang 借用于延迟同步,紧接着设置remains时更新到后台数据库
  2619. if (!SetCardIssued(m_issuedEx[m_currentHopper - 1], m_currentHopper))
  2620. Dbg("Set card issued failed.");
  2621. m_bSettingMaterial = false;
  2622. if (!SetCardRemains(m_remainsEx[m_currentHopper - 1], m_currentHopper))
  2623. Dbg("Set card remains failed.");
  2624. Dbg("issue suc.");
  2625. ctxEx->Ans.reserved1[0] = ctxEx->Ans.reserved1[1] = 0;
  2626. //oilyang@20170929 根据讨论结果,去掉调用
  2627. //GUIConsoleService_ClientBase *pGuiConsoleClient = NULL;
  2628. //errCode = Error_Unexpect;
  2629. //pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
  2630. //if (pGuiConsoleClient != NULL)
  2631. // errCode = pGuiConsoleClient->Connect();
  2632. //else
  2633. // Dbg("pGuiConsoleClient is null?");
  2634. //if (errCode == Error_Succeed)
  2635. //{
  2636. // if (pGuiConsoleClient)
  2637. // {
  2638. // GUIConsoleService_AddMaterialCounter_Req req;
  2639. // GUIConsoleService_AddMaterialCounter_Ans ans;
  2640. // req.strMaterialCode = "DebitCard";
  2641. // errCode = pGuiConsoleClient->AddMaterialCounter(req, ans, 10000);
  2642. // Dbg("%d",errCode);
  2643. // if (pGuiConsoleClient != NULL)
  2644. // {
  2645. // pGuiConsoleClient->GetFunction()->CloseSession();
  2646. // pGuiConsoleClient->SafeDelete();
  2647. // pGuiConsoleClient = NULL;
  2648. // }
  2649. // }
  2650. //}
  2651. if (m_bIssuingExit)
  2652. {
  2653. Dbg("Issuing exit.");
  2654. CaptureCard(NULL);
  2655. }
  2656. if (ctx != NULL)
  2657. ctx->Answer(Error_Succeed);
  2658. else
  2659. ctxEx->Answer(Error_Succeed);
  2660. return 0;
  2661. }
  2662. int CCardIssuerFSM::CaptureCard(SpReqAnsContext<CardIssuerService_Capture_Req,CardIssuerService_Capture_Ans>::Pointer ctx)
  2663. {
  2664. LOG_FUNCTION();
  2665. ErrorCodeEnum eErr;
  2666. int ret = 0;
  2667. //hr = m_pIDCard->IDC_Capture();
  2668. eErr = MachineMoveCardBackNotHold();
  2669. Dbg("asked to capture %d",eErr);
  2670. if (eErr == Error_Succeed)
  2671. {
  2672. bool bCaptured = RegistCardWhileCaptureCard();
  2673. Dbg("to capture card.regist %d", bCaptured);
  2674. m_currCardNo = m_addCardNo = "";
  2675. }
  2676. else
  2677. ret = 1;
  2678. m_CardCaptured++;
  2679. if (!SetCardCaptured(m_CardCaptured))
  2680. Dbg("set card captured failed.");
  2681. m_pCardProcess->DataInit();
  2682. if (Error_Succeed == eErr){
  2683. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  2684. if (eErr != Error_Succeed) {
  2685. LogErrMsg("after capture,close shutter", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2686. }
  2687. if (ctx != NULL)
  2688. ctx->Answer(Error_Succeed);
  2689. }
  2690. else {
  2691. //DevErrorInfo devErrInfo;
  2692. //m_pCardIssuer->GetLastErr(devErrInfo);
  2693. //Dbg("capture err %s",devErrInfo.szErrMsg);
  2694. if (ctx != NULL)
  2695. ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_Failed);
  2696. }
  2697. return ret;
  2698. //if (GetDevStatus()){
  2699. // //device ok
  2700. // return 0;
  2701. //}
  2702. //else {
  2703. // //device error
  2704. // return 1 ;
  2705. //}
  2706. }
  2707. int CCardIssuerFSM::EjectCard(SpReqAnsContext<CardIssuerService_Eject_Req,CardIssuerService_Eject_Ans>::Pointer ctx)
  2708. {
  2709. LOG_FUNCTION();
  2710. ErrorCodeEnum eErr;
  2711. eErr = MachineMoveCardFrontGate();
  2712. m_pCardProcess->DataInit();
  2713. if (Error_Succeed == eErr){
  2714. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  2715. if (eErr != Error_Succeed) {
  2716. LogErrMsg("EjectCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2717. }
  2718. if (ctx != NULL)
  2719. ctx->Answer(Error_Succeed);
  2720. return 0;
  2721. }
  2722. else {
  2723. //DevErrorInfo devErrInfo;
  2724. //m_pCardIssuer->GetLastErr(devErrInfo);
  2725. //Dbg("ejectcard err:%s",devErrInfo.szErrMsg);
  2726. if (ctx != NULL)
  2727. ctx->Answer(Error_Exception, CardIssuer_UserErrorCode_MoveCardToGate_Failed);
  2728. //if (GetDevStatus())
  2729. // return 0;
  2730. //else
  2731. return 1;
  2732. }
  2733. }
  2734. int CCardIssuerFSM::WaitFetchingCard()
  2735. {
  2736. LOG_FUNCTION();
  2737. //int waitTries = 0;
  2738. DWORD dwStart, dwEnd;
  2739. dwStart = GetTickCountRVC();
  2740. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON,"CardReader(fetch) warning on");
  2741. do {
  2742. if (GetDevStatus()){
  2743. dwEnd = GetTickCountRVC();
  2744. if (m_devStatus.eMedia == CI_MEDIA_ENTERING){
  2745. Sleep(WAIT_INTERVAL);
  2746. //waitTries++;
  2747. }
  2748. else{
  2749. //waitTries = 0;
  2750. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off");
  2751. return 0;
  2752. }
  2753. }else
  2754. {
  2755. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off");
  2756. return 1;
  2757. }
  2758. }while ((dwEnd-dwStart) < 60*1000);
  2759. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off");
  2760. return 2;
  2761. }
  2762. int CCardIssuerFSM::InternalAcceptCard()
  2763. {
  2764. LOG_FUNCTION();
  2765. ErrorCodeEnum eErr = Error_Unexpect;
  2766. int acceptTries = 0, err = 0;
  2767. DWORD64 dwStart = GetTickCountRVC();
  2768. DWORD64 dwEnd = dwStart;
  2769. m_bWaitingAccept = true;
  2770. //if (Error_Succeed == hr){
  2771. do {
  2772. if (m_bExit)
  2773. {
  2774. m_bCancelAccept = true;
  2775. break;
  2776. }
  2777. if (m_bCancelAccept)
  2778. {
  2779. err = 3;
  2780. goto Err;
  2781. }
  2782. if (m_bWaitAccepteMore)
  2783. {
  2784. acceptTries = 0;
  2785. dwEnd = dwStart = GetTickCountRVC();
  2786. m_bWaitAccepteMore = false;
  2787. }
  2788. if (GetDevStatus())
  2789. {
  2790. if (m_devStatus.eMedia == CI_MEDIA_PRESENT)
  2791. {
  2792. LogEvent(Severity_Middle,LOG_EVT_CARDISSUER_OP,"CardIssuer op.");
  2793. acceptTries = 0;
  2794. goto Err;
  2795. }
  2796. if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT)
  2797. {
  2798. acceptTries++;
  2799. Sleep(ACCEPT_TRY_INTERVAL);
  2800. //hr = m_pIDCard->IDC_Accept(IDC_ALL_CARD,&lpCardData);
  2801. if (!m_bCancelAccept)
  2802. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_ALL);
  2803. if (Error_Succeed != eErr) {
  2804. LogErrMsg("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_ALL)", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2805. }
  2806. //LogErrInfo("err while accepting card,open shutter");
  2807. }
  2808. }
  2809. else
  2810. {
  2811. err = 1;
  2812. goto Err;
  2813. }
  2814. dwEnd = GetTickCountRVC();
  2815. }while ((dwEnd - dwStart) < 58*1000);
  2816. err = 2;
  2817. Err:
  2818. m_bExit = false;
  2819. m_bWaitingAccept = false;
  2820. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  2821. if (Error_Succeed != eErr)
  2822. {
  2823. LogErrMsg("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2824. //LogErrInfo("after accept,close shutter");
  2825. //LOG_TRACE("Close shuttle");
  2826. //err = 2;
  2827. }
  2828. if (m_bCancelAccept && err != 1)
  2829. {
  2830. //oilyang@20181210 add "if (!m_bCancelByRFIC)"
  2831. //oilyang@20170612
  2832. if (!m_bCancelByRFIC)
  2833. Sleep(500);
  2834. if (GetDevStatus())
  2835. {
  2836. if (m_devStatus.eMedia == CI_MEDIA_PRESENT)
  2837. {
  2838. err = 4;
  2839. Dbg("cancel eject......");
  2840. eErr = MachineMoveCardFrontGate();
  2841. Dbg("cancel eject.result[%d].....",eErr);
  2842. if (Error_Succeed == eErr){
  2843. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  2844. if (eErr != Error_Succeed) {
  2845. LogErrMsg("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  2846. }
  2847. //LogErrInfo("cancel&else eject,close shutter");
  2848. }
  2849. else
  2850. err = 2;
  2851. }
  2852. }
  2853. else
  2854. err = 2;
  2855. }
  2856. return err;
  2857. }
  2858. int CCardIssuerFSM::AcceptCard(SpReqAnsContext<CardIssuerService_Insert_Req, CardIssuerService_Insert_Ans>::Pointer ctx)
  2859. {
  2860. LOG_FUNCTION();
  2861. m_pCardProcess->DataInit();
  2862. m_bCancelByRFIC = false;
  2863. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON,"CardReader warning on");
  2864. m_bWaitAccepteMore = false;
  2865. //GpioService_Set_Req Req;
  2866. //GpioService_Set_Ans Ans;
  2867. //Req.devseq = CARDREADER;
  2868. //Req.mode = 1;
  2869. //Req.close = 0;
  2870. //CCardReaderEntity* pEntity = dynamic_cast<CCardReaderEntity*>(m_pEntity);
  2871. //pEntity->SetGpio(Req,Ans);
  2872. int rc = InternalAcceptCard();
  2873. //Req.devseq = CARDREADER;
  2874. //Req.mode = 1;
  2875. //Req.close = 1;
  2876. //pEntity->SetGpio(Req,Ans);
  2877. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader warning off");
  2878. if (rc == 0) {
  2879. FSMSetIssueFlag(0);
  2880. if (ctx != NULL)
  2881. {
  2882. Dbg("insert error_succeed");
  2883. ctx->Answer(Error_Succeed);
  2884. }
  2885. }
  2886. else if(rc == 2)
  2887. {
  2888. if (ctx != NULL)
  2889. ctx->Answer(Error_TimeOut);
  2890. }
  2891. else if(rc == 3 || rc == 4)
  2892. {
  2893. if (ctx != NULL)
  2894. {
  2895. Dbg("insert cancel (%d)",rc);
  2896. ctx->Answer(Error_Cancel);
  2897. }
  2898. }else
  2899. {
  2900. if (ctx != NULL)
  2901. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_GetDevStatus));
  2902. }
  2903. return rc;
  2904. }
  2905. static CSimpleStringA GetStrData(TrackInfo trackInfo)
  2906. {
  2907. //LOG_FUNCTION();
  2908. CSimpleStringA strRet;
  2909. switch (trackInfo.eStatus) {
  2910. case CI_DATA_OK:
  2911. strRet = (char*)trackInfo.data;
  2912. break;
  2913. case CI_DATA_INVALID:
  2914. strRet = "无效数据";
  2915. break;
  2916. //case CI_DATA_MISSING:
  2917. default:
  2918. strRet = "数据丢失";
  2919. }
  2920. return strRet;
  2921. }
  2922. int CCardIssuerFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
  2923. {
  2924. LOG_FUNCTION();
  2925. if (pTrack2.GetLength() == 0)
  2926. return -1;
  2927. int dataLen = strlen(pTrack2);
  2928. Dbg("pT2.len:%d",dataLen);
  2929. switch(dataLen)
  2930. {
  2931. case 28:
  2932. decodeData.t2Region = CSimpleString(pTrack2,4);
  2933. decodeData.t2Account = pTrack2.SubString(4,8);
  2934. decodeData.t2CardSerial = pTrack2.SubString(14,8);//oilyang for 8 onecard
  2935. decodeData.t2CVC = pTrack2.SubString(22,6);
  2936. decodeData.t2ExpireDate = "";
  2937. break;
  2938. case 31:
  2939. decodeData.t2Account = CSimpleString(pTrack2,16);
  2940. decodeData.t2CardSerial = pTrack2.SubString(16,1);
  2941. decodeData.t2CVC = pTrack2.SubString(17,6);
  2942. decodeData.t2Region = pTrack2.SubString(23,4);
  2943. decodeData.t2ExpireDate = pTrack2.SubString(27,4);
  2944. break;
  2945. case 38:
  2946. break;
  2947. default:
  2948. return -1;
  2949. }
  2950. decodeData.status = 0;
  2951. return 0;
  2952. }
  2953. int SplitUnionPayTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
  2954. {
  2955. if (strlen(pTrack2) != 37)
  2956. {
  2957. Dbg("wrong track2 len %d[%s]",strlen(pTrack2),(LPCTSTR)pTrack2);
  2958. return -1;
  2959. }
  2960. //“16位卡号(19A)” + “=” + “expiry_date YYMM(4N)” +
  2961. //“106(3N,服务代码)” + “PVV(5N)” + “00(2N)” + “CVV(3A)”
  2962. //6225885710172339=49121200541300175361
  2963. //oiltmp
  2964. //decodeData.t2Account = CSimpleString(pTrack2,16);
  2965. //decodeData.t2CardSerial = pTrack2.SubString(16,1);
  2966. //decodeData.t2CVC = pTrack2.SubString(17,6);
  2967. //decodeData.t2Region = pTrack2.SubString(23,4);
  2968. //decodeData.t2ExpireDate = pTrack2.SubString(27,4);
  2969. return 0;
  2970. }
  2971. //0:unknown 1:本行借记磁卡;2 本行借记IC;3 本行贷记磁卡;4 本行贷记IC;5 他行卡
  2972. int CCardIssuerFSM::DetectCardTypeInfoByAccount(char *pAccount, int len, char *pT3, int t3Len)
  2973. {
  2974. if (len < 6)
  2975. return 0;
  2976. if (!memcmp(pAccount,"95555",5))
  2977. return 1;
  2978. if (pT3 != NULL)
  2979. {
  2980. char tmpMag2_3[512] = {0},tmpMag2[256] = {0};
  2981. memcpy(tmpMag2_3,pAccount,len);
  2982. memcpy(tmpMag2_3+len,"A",1);
  2983. memcpy(tmpMag2_3+len+1,pT3,t3Len);
  2984. char cardType[8] = {0};
  2985. cmdDecodeEx(tmpMag2_3,cardType,tmpMag2);
  2986. if (_strnicmp(cardType,"ODCD",4) == 0)
  2987. {
  2988. Dbg("old one card tong...");
  2989. return 1;
  2990. }
  2991. }
  2992. char bin[7] = {0};
  2993. memcpy(bin,pAccount,6);
  2994. vector<CMBBin>::iterator it;
  2995. for (it = m_vBin.begin(); it != m_vBin.end(); ++it)
  2996. {
  2997. if (!memcmp(bin,it->bin,6))
  2998. {
  2999. if (it->bDC)
  3000. {
  3001. if (it->bIC)
  3002. return 2;
  3003. else
  3004. return 1;
  3005. }
  3006. else
  3007. {
  3008. if (it->bIC)
  3009. return 4;
  3010. else
  3011. return 3;
  3012. }
  3013. }
  3014. }
  3015. return 5;//all the other cards
  3016. }
  3017. //ReadCardEx 废弃不用 oilyang
  3018. int CCardIssuerFSM::ReadCardEx(SpReqAnsContext<CardIssuerService_ReadEx_Req,CardIssuerService_ReadEx_Ans>::Pointer ctx)
  3019. {
  3020. return 0;
  3021. }
  3022. int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssuerService_Read_Ans>::Pointer ctx)
  3023. {
  3024. LOG_FUNCTION();
  3025. m_currCardNo = "";
  3026. ctx->Ans.ICType = 0;
  3027. ErrorCodeEnum eErr;
  3028. int activeCardType;
  3029. bool bIC(false), bICSuc(false), bReadCardInfo(false);
  3030. Dbg("reserved1 for lightPos:%d", ctx->Req.reserved1);
  3031. if ((ctx->Req.reserved1&0x32) == 0x32)//只需要磁条
  3032. {
  3033. }
  3034. else
  3035. {
  3036. bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
  3037. if (bIC)
  3038. {
  3039. m_pCardIssuer->DeactivateICCard();
  3040. m_pCardIssuer->ReleaseIC();
  3041. }
  3042. }
  3043. DWORD dwStart = GetTickCountRVC();
  3044. MagTracks magTracks;
  3045. int readTries = 0;
  3046. {
  3047. magTracks.eRange = CI_TRACK_RANGE_2_3;
  3048. do {
  3049. eErr = m_pCardIssuer->MagRead(magTracks);
  3050. Dbg("MAGread(%d)...",eErr);
  3051. ctx->Ans.t2Account = ctx->Ans.ICData = "";
  3052. //DevErrorInfo devErrInfo;
  3053. //m_pCardIssuer->GetLastErr(devErrInfo);
  3054. readTries++;
  3055. Dbg("t2,t3:%d,%d",magTracks.track[1].eStatus,magTracks.track[2].eStatus);
  3056. if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data))
  3057. {
  3058. Dbg("Wrong dwSize %d,%d",magTracks.track[1].dwSize,magTracks.track[2].dwSize);
  3059. break;
  3060. }
  3061. //if (bIC)
  3062. //{
  3063. // //read card no 20140625
  3064. // int activeCardType;
  3065. // m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
  3066. // m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER,m_pCardIssuer,"A000000333");
  3067. // ICData track2(false,0x57,0x00);
  3068. // string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType;
  3069. // if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1)
  3070. // {
  3071. // Dbg("no track2 data (ic only)");
  3072. // }
  3073. // else
  3074. // {
  3075. // int pos = FindHexCharPosition(track2.value,0x0d,track2.lenth);
  3076. // char *pICTrack2 = new char[128];
  3077. // ZeroMemory(pICTrack2,128);
  3078. // HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
  3079. // pICTrack2[37] = '\0';
  3080. // {
  3081. // char *ddd = new char[128];
  3082. // memset(ddd,0,128);
  3083. // memcpy(ddd,pICTrack2,pos-1);
  3084. // t2ICTrack2 = pICTrack2;
  3085. // t2ICAccount = (char*)ddd;
  3086. // Dbg("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
  3087. // ctx->Ans.t2Account = t2ICAccount.c_str();
  3088. // ctx->Ans.ICData = t2ICAccount.c_str();
  3089. // delete []ddd;
  3090. // }
  3091. // delete []pICTrack2;
  3092. // }
  3093. // m_pCardIssuer->DeactivateICCard();
  3094. // m_pCardIssuer->ReleaseIC();
  3095. // ctx->Ans.status = 0;
  3096. // bReadCardInfo = true;
  3097. // if (magTracks.track[1].eStatus == CI_DATA_INVALID)
  3098. // {
  3099. // Dbg("may be ic only...");
  3100. // ctx->Ans.ICType = 3;
  3101. // break;
  3102. // }
  3103. //}
  3104. if (Error_Succeed == eErr && magTracks.track[1].eStatus == CI_DATA_OK)
  3105. {
  3106. if (bIC)
  3107. ctx->Ans.ICType = 1;
  3108. else
  3109. ctx->Ans.ICType = 2;
  3110. LogEvent(Severity_Middle,LOG_EVT_CARDISSUER_OP,"CardIssuer op.");
  3111. if (magTracks.track[1].dwSize > 40)
  3112. {
  3113. Dbg("mag track 2 length wrong.");
  3114. ctx->Ans.status = 1;
  3115. break;
  3116. }
  3117. ctx->Ans.track2 = (char*)magTracks.track[1].data;
  3118. bool bT3OK = false;
  3119. if (magTracks.track[2].eStatus == CI_DATA_OK)
  3120. {
  3121. bT3OK = true;
  3122. ctx->Ans.track3 = (char*)magTracks.track[2].data;
  3123. }
  3124. Track2Data track2Data;
  3125. track2Data.status = 0;
  3126. track2Data.t2Account = "";
  3127. char *tmpMag2 = new char[256];
  3128. ZeroMemory(tmpMag2, 256);
  3129. DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2,true,bT3OK);
  3130. //char tmpMag2_3[512] = {0},tmpMag2[256] = {0};
  3131. //memcpy(tmpMag2_3,GetStrData(magTracks.track[1]).GetData(),magTracks.track[1].dwSize);
  3132. //char cardType[8];
  3133. //ZeroMemory(cardType, 8);
  3134. //if (magTracks.track[2].eStatus == CI_DATA_OK)
  3135. //{
  3136. // Dbg("do track 3");
  3137. // ctx->Ans.track3 = (char*)magTracks.track[2].data;
  3138. // memcpy(tmpMag2_3+magTracks.track[1].dwSize,"A",1);
  3139. // memcpy(tmpMag2_3+magTracks.track[1].dwSize+1,GetStrData(magTracks.track[2]).GetData(),magTracks.track[2].dwSize);
  3140. // cmdDecodeEx(tmpMag2_3,cardType,tmpMag2);
  3141. //}
  3142. //if (magTracks.track[2].eStatus != CI_DATA_OK || strlen(cardType) < 4)
  3143. //{
  3144. // Dbg("no or wrong track 3.%d,%s", magTracks.track[2].eStatus,cardType);
  3145. // cmdDecodeMag2(tmpMag2_3,tmpMag2);
  3146. //}
  3147. //decode account from track 2
  3148. int pos = 0;
  3149. for (int i = 0; i < magTracks.track[1].dwSize; ++i,++pos)
  3150. {
  3151. if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e)
  3152. break;
  3153. }
  3154. Dbg("pos:%d,%d",pos,magTracks.track[1].dwSize);
  3155. if (pos <= 0 || pos == magTracks.track[1].dwSize)
  3156. {
  3157. ctx->Ans.status = 1;
  3158. if (tmpMag2 != NULL)
  3159. {
  3160. delete[]tmpMag2;
  3161. tmpMag2 = NULL;
  3162. }
  3163. break;
  3164. }
  3165. char *ddd = new char[40];
  3166. memset(ddd,0,40);
  3167. memcpy(ddd,magTracks.track[1].data,pos);
  3168. if (SplitTrack2(tmpMag2,track2Data) == 0)
  3169. {
  3170. ctx->Ans.status = track2Data.status;
  3171. ctx->Ans.t2Account = track2Data.t2Account;
  3172. ctx->Ans.t2Region = track2Data.t2Region;
  3173. ctx->Ans.t2CardSerial = track2Data.t2CardSerial;
  3174. ctx->Ans.t2CVC = track2Data.t2CVC;
  3175. ctx->Ans.t2ExpireDate = track2Data.t2ExpireDate;
  3176. Dbg("done.");
  3177. bReadCardInfo = true;
  3178. if (m_issueStatus)
  3179. {
  3180. m_mixedEx[m_currentHopper - 1] = 0;
  3181. bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
  3182. Dbg("set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
  3183. }
  3184. //break;
  3185. }
  3186. if (_strnicmp(track2Data.t2Account,ddd,strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))
  3187. {
  3188. ctx->Ans.status = 0;
  3189. ctx->Ans.t2Account = (char*)ddd;
  3190. ctx->Ans.t2Region = "";
  3191. ctx->Ans.t2CardSerial = "";
  3192. ctx->Ans.t2CVC = "";
  3193. ctx->Ans.t2ExpireDate = "";
  3194. //Dbg("%s,%s",(LPCTSTR)track2Data.t2Account,ctx->Ans.t2Account);
  3195. bReadCardInfo = true;
  3196. delete []ddd;
  3197. }
  3198. if (tmpMag2 != NULL)
  3199. {
  3200. delete[]tmpMag2;
  3201. tmpMag2 = NULL;
  3202. }
  3203. Dbg("%s,%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4));
  3204. break;
  3205. }
  3206. else
  3207. {
  3208. if (bIC)
  3209. {
  3210. bReadCardInfo = true;
  3211. ctx->Ans.ICType = 3;
  3212. Dbg("maybe ic only.");
  3213. }
  3214. else
  3215. {
  3216. LogErrMsg("ReadCard::MagRead", eErr, MEC_DEVAPI_CARDISSUER_MagRead, TRUE);
  3217. //LogWarn(Severity_Low, Error_DevCommFailed, CardIssuer_UserErrorCode_ReadMagTrack_Failed, "CardIssuer read failed.");
  3218. /*DevErrorInfo devErrInfo;
  3219. m_pCardIssuer->GetLastErr(devErrInfo);*/
  3220. Dbg("idc_read [%d][%d]", magTracks.track[1].eStatus, magTracks.track[2].eStatus);
  3221. }
  3222. }
  3223. }while(readTries < READ_TRY_NUM);
  3224. }
  3225. Dbg("ic type %d",ctx->Ans.ICType);
  3226. m_currCardNo = ctx->Ans.t2Account;
  3227. DWORD dwEnd = GetTickCountRVC();
  3228. DWORD dwCollapse = dwEnd-dwStart;
  3229. if ((dwCollapse < 8000) && (!bReadCardInfo))
  3230. {
  3231. bReadCardInfo = true;
  3232. ctx->Ans.status = 1;
  3233. //maybe cannot read mag
  3234. if (m_issueStatus)
  3235. {
  3236. m_mixedEx[m_currentHopper - 1]++;
  3237. bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
  3238. Dbg("set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
  3239. }
  3240. }
  3241. bool bEjectSelf = false;
  3242. if (!bReadCardInfo)
  3243. {
  3244. ctx->Ans.status = 1;
  3245. if (!m_issueStatus)
  3246. {
  3247. ErrorCodeEnum errEject = MachineMoveCardFrontGate();
  3248. if (errEject == Error_Succeed)
  3249. {
  3250. Dbg("read failed.eject self");
  3251. bEjectSelf = true;
  3252. }
  3253. }
  3254. }
  3255. if (GetDevStatus())
  3256. {
  3257. if (bEjectSelf)
  3258. return 2;
  3259. else
  3260. return 0;
  3261. }else
  3262. return 1;
  3263. }
  3264. int CCardIssuerFSM::WriteCard(SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>::Pointer ctx)
  3265. {
  3266. LOG_FUNCTION();
  3267. ErrorCodeEnum eErr;
  3268. int ret = 0;
  3269. if (ctx->Req.track1.GetLength() <= 0 && ctx->Req.track2.GetLength() <= 0 && ctx->Req.track3.GetLength() <= 0)
  3270. {
  3271. Dbg("write card param is null.");
  3272. ctx->Answer(Error_Param);
  3273. return ret;
  3274. }
  3275. else
  3276. {
  3277. eErr = m_pCardIssuer->MoveCard(CI_MOVECARD_MAG_POSITION);
  3278. if (eErr != Error_Succeed)
  3279. {
  3280. LogErrMsg("WriteCard::MoveCard", eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_MAG_POSITION, TRUE);
  3281. //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MoveCardToMagPosition_Failed, "移动卡片到磁卡位失败");
  3282. //Dbg("move card to mag position failed.");
  3283. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  3284. return ret;
  3285. }
  3286. }
  3287. MagTracks magTrack;
  3288. ZeroMemory(magTrack.track[0].data,MAX_MAG_TRACK_SIZE);
  3289. ZeroMemory(magTrack.track[1].data,MAX_MAG_TRACK_SIZE);
  3290. ZeroMemory(magTrack.track[2].data,MAX_MAG_TRACK_SIZE);
  3291. magTrack.track[0].dwSize = magTrack.track[1].dwSize = magTrack.track[2].dwSize = 0;
  3292. magTrack.track[0].eStatus = magTrack.track[1].eStatus = magTrack.track[2].eStatus = CI_DATA_INVALID;
  3293. TrackRange iT1,iT2,iT3;
  3294. iT1 = iT2 = iT3 = CI_TRACK_RANGE_START;
  3295. if (ctx->Req.track1.GetLength() > 0)
  3296. {
  3297. iT1 = CI_TRACK_RANGE_1;
  3298. CSimpleStringA csT1 = CSimpleStringW2A(ctx->Req.track1);
  3299. strncpy((char*)magTrack.track[0].data,csT1,csT1.GetLength());
  3300. magTrack.track[0].eSource = CI_TRACK_SOURCE_1;
  3301. magTrack.track[0].eStatus = CI_DATA_OK;
  3302. magTrack.track[0].dwSize = csT1.GetLength();
  3303. }
  3304. if (ctx->Req.track2.GetLength() > 0)
  3305. {
  3306. iT2 = CI_TRACK_RANGE_2;
  3307. CSimpleStringA csT2 = CSimpleStringW2A(ctx->Req.track2);
  3308. strncpy((char*)magTrack.track[1].data,csT2,csT2.GetLength());
  3309. magTrack.track[1].eSource = CI_TRACK_SOURCE_2;
  3310. magTrack.track[1].eStatus = CI_DATA_OK;
  3311. magTrack.track[1].dwSize = csT2.GetLength();
  3312. }
  3313. if (ctx->Req.track3.GetLength() > 0)
  3314. {
  3315. iT3 = CI_TRACK_RANGE_3;
  3316. CSimpleStringA csT3 = CSimpleStringW2A(ctx->Req.track3);
  3317. strncpy((char*)magTrack.track[2].data,csT3,csT3.GetLength());
  3318. magTrack.track[2].eSource = CI_TRACK_SOURCE_3;
  3319. magTrack.track[2].eStatus = CI_DATA_OK;
  3320. magTrack.track[2].dwSize = csT3.GetLength();
  3321. }
  3322. //TrackRange eAll = iT2 | iT2;
  3323. magTrack.eRange = TrackRange(iT1|iT2|iT3);
  3324. Dbg("to write...(%d)",magTrack.eRange);
  3325. eErr = m_pCardIssuer->MagWrite(magTrack,AUTO_CO);
  3326. Dbg("after write %d",eErr);
  3327. if (eErr != Error_Succeed)
  3328. {
  3329. LogErrMsg("WriteCard::MagWrite", eErr, MEC_DEVAPI_CARDISSUER_MagWrite, TRUE);
  3330. //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_WriteMagTrack_Failed, "写磁卡失败");
  3331. //Dbg("MagWrite failed(%d).",eErr);
  3332. //LogDevErrorInfo();
  3333. ret = 1;
  3334. }
  3335. ctx->Ans.result = ret;
  3336. ctx->Answer(Error_Succeed);
  3337. return ret;
  3338. }
  3339. int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,CardIssuerService_PreOnline_Ans>::Pointer ctx)
  3340. {
  3341. LOG_FUNCTION();
  3342. m_findCard = m_cardPos = 0;//just for RVC.CardStore
  3343. //如果有盘库记录则清理掉(@zjw20190809)
  3344. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  3345. {
  3346. ErrorCodeEnum eErr = Error_Succeed;
  3347. CSmartPointer<IConfigInfo> spConfigRun;
  3348. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  3349. if(eErr != Error_Succeed)
  3350. {
  3351. Dbg("Open runcfg failed(%d).", eErr);
  3352. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_CFG_RUN_POINTER_FAILED));
  3353. return 2;
  3354. }
  3355. if(CheckHasPanKuRecord(spConfigRun))
  3356. {
  3357. ClearLocalRecord(spConfigRun);
  3358. }
  3359. }
  3360. Dbg("bus data[%s]",(LPCTSTR)ctx->Req.businessData);
  3361. CSimpleStringA csMagT2Track(""), csMagT3Track(""), csMagAccout(""), csMagRegion(""), csMagCardSerial(""), csMagCVC(""), csMagExpireDate("");
  3362. int slot = 0;
  3363. if (ctx->Req.reserved1.GetLength() > 0 && _strnicmp("kaku#",(const char*)ctx->Req.reserved1,5) == 0)
  3364. {
  3365. GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "Y");
  3366. CSimpleStringA csSlot("");
  3367. csSlot = ctx->Req.reserved1.SubString(5, ctx->Req.reserved1.GetLength() - 5);
  3368. slot = atoi((const char*)csSlot);
  3369. Dbg("slot:%d,%s", slot, (const char*)ctx->Req.reserved1);
  3370. if (!IsValidSlotNum(slot))
  3371. {
  3372. Dbg("invalid slot.");
  3373. m_findCard = 1;
  3374. GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "N");
  3375. ctx->Answer(Error_Succeed);
  3376. return 0;
  3377. }
  3378. if (!IsSlotHasCard(slot))
  3379. {
  3380. Dbg("the slot has no card");
  3381. m_findCard = 2;
  3382. GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "N");
  3383. ctx->Answer(Error_Succeed);
  3384. return 0;
  3385. }
  3386. ErrorCodeEnum eErr = Error_Unexpect;
  3387. eErr = m_pCardIssuer->MoveCardFromSlot(slot);
  3388. CardNo card;
  3389. ZeroMemory(card.account, sizeof(card.account));
  3390. ZeroMemory(card.track2, sizeof(card.track2));
  3391. ZeroMemory(card.track3, sizeof(card.track3));
  3392. if (eErr == Error_Succeed && m_pCardIssuer->ReadAccount(card) == Error_Succeed)
  3393. {
  3394. Dbg("move card from slot to cardreader and ReadAccount suc.magT2.size:%d(%d),magT3.size:%d(%d)"
  3395. ,card.dwTrack2Size,strlen(card.track2),card.dwTrack3Size, strlen(card.track3));
  3396. if (ctx->Req.reserved2.GetLength() > 0 && ctx->Req.reserved2.Compare(card.account) != 0)
  3397. {
  3398. m_findCard = 3;
  3399. AfterPreOnlineOnStore(Error_Unexpect, slot);
  3400. ctx->Answer(Error_Succeed);
  3401. return 0;
  3402. }
  3403. if (card.dwTrack2Size > 0 && card.dwTrack2Size < 41)
  3404. {
  3405. if (card.track2[card.dwTrack2Size - 1] == 'F')
  3406. card.track2[card.dwTrack2Size - 1] = '\0';
  3407. csMagT2Track = card.track2;
  3408. }
  3409. if (card.dwTrack3Size > 0 && card.dwTrack3Size < 108)
  3410. {
  3411. if (card.track3[card.dwTrack3Size - 1] == 'F')
  3412. card.track3[card.dwTrack3Size - 1] = '\0';
  3413. csMagT3Track = card.track3;
  3414. }
  3415. //oilyang@20180516 add for kaku
  3416. //split track 2&3 data
  3417. char *pTmpMag2 = new char[128];
  3418. ZeroMemory(pTmpMag2, 128);
  3419. Track2Data track2Data;
  3420. bool bT2OK, bT3OK;
  3421. bT2OK = bT3OK = false;
  3422. if (card.dwTrack2Size > 8 && strlen(card.track2) > 8)
  3423. bT2OK = true;
  3424. if (card.dwTrack3Size > 8 && strlen(card.track3) > 8)
  3425. bT3OK = true;
  3426. DecodeTracksData((const char*)csMagT2Track, card.dwTrack2Size, (const char*)csMagT3Track, card.dwTrack3Size, pTmpMag2, bT2OK, bT3OK);
  3427. if ((SplitTrack2(pTmpMag2, track2Data) == 0))
  3428. {
  3429. csMagAccout = track2Data.t2Account;
  3430. csMagRegion = track2Data.t2Region;
  3431. csMagCardSerial = track2Data.t2CardSerial;
  3432. csMagCVC = track2Data.t2CVC;
  3433. csMagExpireDate = track2Data.t2ExpireDate;
  3434. Dbg("done track 2(/&)3.");
  3435. }
  3436. delete[]pTmpMag2;
  3437. m_pCardProcess->DataInit();
  3438. }
  3439. else
  3440. {
  3441. LogErrMsg("PreOnline::MoveCardFromSlot", eErr, MEC_DEVAPI_CARDISSUER_MoveCardFromSlot, TRUE);
  3442. //Dbg("move card from slot failed.ret:%d",eErr);
  3443. m_findCard = 4;
  3444. AfterPreOnlineOnStore(Error_Unexpect, slot);
  3445. ctx->Answer(Error_Succeed);
  3446. return 0;
  3447. }
  3448. }
  3449. m_pCardProcess->SplitBusinessData(ctx->Req.businessData,ctx->Req.businessData.GetLength());
  3450. if (m_bSM)
  3451. {
  3452. Dbg("We support sm.");
  3453. m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101"));
  3454. }
  3455. int activeCardType;
  3456. //oilyang@20201014 add emv card support
  3457. int retDetectAndRead = -1;
  3458. retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333", activeCardType);
  3459. if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
  3460. {
  3461. Dbg("Can't read pboc record,to try emv...");
  3462. retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888", activeCardType);
  3463. }
  3464. if (retDetectAndRead < 0)
  3465. {
  3466. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  3467. AfterPreOnlineOnStore(Error_Unexpect, slot);
  3468. if (retDetectAndRead == -1)
  3469. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_ActiveICCard));
  3470. else if (retDetectAndRead == -2)
  3471. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_ICCommand));
  3472. return 0;
  3473. }
  3474. //if (m_cardType == CI_CARDTYPE_IC)
  3475. //{
  3476. // ProcessRestrict();
  3477. // CardholderVerify();
  3478. m_pCardProcess->TermRiskManage();
  3479. CSimpleStringA taaResult;
  3480. BYTE bt9f27 = 0;
  3481. int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER,m_pCardIssuer,taaResult,m_bOnlineOnly,m_bCDA,bt9f27);
  3482. Dbg("TermActionAnalyze %d",retTAA);
  3483. switch(retTAA)
  3484. {//to be added oiltmp 20140929
  3485. case -1: //some data may be wrong
  3486. break;
  3487. case 1: //terminal trans
  3488. break;
  3489. case 2: //to do trans end "TransEnd"
  3490. break;
  3491. default:
  3492. break;
  3493. }
  3494. ctx->Ans.result = taaResult;
  3495. // Dbg("[%d,%d,%d,%d]",m_TVR[0],m_TVR[1],m_TVR[2],m_TVR[3]);
  3496. //}
  3497. if (ctx->Ans.result.GetLength() == 0)
  3498. {
  3499. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  3500. AfterPreOnlineOnStore(Error_Unexpect, slot);
  3501. ctx->Answer(Error_Succeed);
  3502. return 0;
  3503. }
  3504. Dbg("term action analyze result[%s]", (const char*)ctx->Ans.result);
  3505. //char tmpResult[1024,]result[1024];
  3506. //ZeroMemory(tmpResult,sizeof(tmpResult));
  3507. //ZeroMemory(result,sizeof(result));
  3508. //memcpy(tmpResult,ctx->Ans.result,ctx->Ans.result.GetLength());
  3509. string tmpResult,actionType,result = "",baseICData = "";
  3510. tmpResult = ctx->Ans.result;
  3511. char *pSomeICData = new char[ONE_K];
  3512. ZeroMemory(pSomeICData, ONE_K);
  3513. int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6,4).c_str(),m_pDataToARQC,pSomeICData);
  3514. baseICData = pSomeICData;
  3515. if (pSomeICData != NULL)
  3516. delete []pSomeICData;
  3517. char arqcLen[8];
  3518. ZeroMemory(arqcLen,sizeof(arqcLen));
  3519. _itoa(lenRet,arqcLen,10);
  3520. ICData appExpiryDate(false,0x5f,0x24);
  3521. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,appExpiryDate,false,0) == -1)
  3522. {
  3523. Dbg("can't find expire date");
  3524. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  3525. AfterPreOnlineOnStore(Error_Unexpect, slot);
  3526. return 0;
  3527. }
  3528. char *pExpireDate = new char[12];
  3529. ZeroMemory(pExpireDate,12);
  3530. HexBuf2StrBuf(appExpiryDate.value,&pExpireDate,appExpiryDate.lenth);
  3531. ICData track2(false,0x57,0x00),ICCardSerial(false,0x5f,0x34);
  3532. ErrorCodeEnum eErr = Error_Unexpect;
  3533. string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType("0");
  3534. char *pICCardSerial = new char[4];
  3535. ZeroMemory(pICCardSerial,4);
  3536. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,ICCardSerial,false) == -1)
  3537. {
  3538. Dbg("can't find card serial.");
  3539. }
  3540. else
  3541. {
  3542. HexBuf2StrBuf(ICCardSerial.value,&pICCardSerial,ICCardSerial.lenth);
  3543. }
  3544. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1)
  3545. {
  3546. Dbg("[ic]no track2 data");
  3547. eErr = m_pCardIssuer->ReleaseIC();
  3548. Dbg("ic failed,release it %d",eErr);
  3549. }
  3550. else
  3551. {
  3552. int pos = FindHexCharPosition(track2.value,0x0d,track2.lenth);
  3553. char *pICTrack2 = new char[128];
  3554. ZeroMemory(pICTrack2,128);
  3555. HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
  3556. pICTrack2[37] = '\0';
  3557. Dbg("ic.track2,pos:%d",pos);
  3558. Dbg("pos:%d",pos);
  3559. char *ddd = new char[40];
  3560. memset(ddd,0,40);
  3561. memcpy(ddd,pICTrack2,pos-1);
  3562. //int cardCat = DetectCardTypeInfoByAccount(pICTrack2,strlen(pICTrack2));
  3563. //Dbg("card category %d",cardCat);
  3564. //char chCat = cardCat + '0';
  3565. //cardType = chCat;
  3566. //if (cardCat == 2 || cardCat == 4)
  3567. //{
  3568. char icTrack2Data[128];
  3569. ZeroMemory(icTrack2Data,sizeof(icTrack2Data));
  3570. Track2Data track2Data;
  3571. track2Data.status = 0;
  3572. track2Data.t2Account = "";
  3573. cmdDecodeMag2(pICTrack2,icTrack2Data);
  3574. if (SplitTrack2(icTrack2Data,track2Data) == 0)
  3575. {
  3576. t2ICAccount = track2Data.t2Account;
  3577. //t2ICCardSerial = track2Data.t2CardSerial;
  3578. t2ICCVC = track2Data.t2CVC;
  3579. t2ICTrack2 = pICTrack2;
  3580. Dbg("done(ic).");
  3581. if (m_issueStatus)
  3582. {
  3583. m_mixedEx[m_currentHopper - 1] = 0;
  3584. bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
  3585. Dbg("set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
  3586. }
  3587. }
  3588. if (_strnicmp(track2Data.t2Account,ddd,strlen(ddd)))
  3589. {
  3590. t2ICCVC = "";
  3591. t2ICTrack2 = pICTrack2;
  3592. t2ICAccount = (char*)ddd;
  3593. Dbg("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length()-4, 4).c_str());
  3594. }
  3595. t2ICCardSerial = pICCardSerial;
  3596. delete []ddd;
  3597. delete []pICTrack2;
  3598. }
  3599. //80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
  3600. if (m_pCardProcess->GetP1() == 0x1)
  3601. actionType = "ARQC";
  3602. else
  3603. actionType = "";
  3604. //【55域】
  3605. // 基本域:
  3606. // 9F26 8b 应用密文AC
  3607. // 9F27 1b 密文信息数据
  3608. // 9F10 max.32b 发卡行应用数据IAD
  3609. // 9F37 4b 不可预知数
  3610. // 9F36 2b 应用交易计数器ATC
  3611. // 95 5b 终端验证结果TVR
  3612. // 9A 3cn 交易日期(6位有效数字,YYMMDD)
  3613. // 9C 1cn 交易类型(2位有效数字)
  3614. // 9F02 6cn 授权金额(12位有效数字)
  3615. // 5F2A 2cn 交易货币代码(3位有效数字)
  3616. // 82 2b 应用交互特征AIP
  3617. // 9F1A 2cn 终端国家代码(3位有效数字)
  3618. // 9F03 6cn 其他金额(12位有效数字)
  3619. // 9F33 3b 终端性能 "E0C900"
  3620. // 可选域:
  3621. //添加9F26,9F27,9F10,9F33的数据
  3622. char *pCID = new char[4];
  3623. ZeroMemory(pCID, 4);
  3624. HexBuf2StrBuf(&bt9f27, &pCID, 1);
  3625. char *pIssueBankLen = new char[4];
  3626. ZeroMemory(pIssueBankLen, 4);
  3627. int len9f10 = tmpResult.length() - 26 - 4;
  3628. int lenHigh, lenLow;
  3629. len9f10 = len9f10 / 2;
  3630. lenHigh = len9f10 / 16;
  3631. lenLow = len9f10 % 16;
  3632. BYTE bt9f10;
  3633. bt9f10 = (lenHigh<<4) + lenLow;
  3634. HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1);
  3635. baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID +"9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900";
  3636. result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6,4) + "|" + "ARQCCODE," + tmpResult.substr(10,16) + "|"
  3637. + "MAC," + tmpResult.substr(26,tmpResult.length()-26-4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
  3638. + "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial
  3639. + "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData + "|MAGT2," + (const char*)csMagT2Track
  3640. + "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion
  3641. + "|MAGCARDSERIAL," + (const char*)csMagCardSerial+ "|MAGCVC," + (const char*)csMagCVC+ "|MAGEXPIREDATAE," + (const char*)csMagExpireDate;
  3642. ctx->Ans.result = result.c_str();
  3643. string txtresult = "";
  3644. txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6,4) + "|" + "ARQCCODE," + tmpResult.substr(10,16) + "|"
  3645. + "MAC," + tmpResult.substr(26,tmpResult.length()-26-4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
  3646. + "ARQCDATA," + m_pDataToARQC + "|T2ACCOUNT(F6)," + t2ICAccount.substr(0, 6) + "|T2ACCOUNT(L4)," + t2ICAccount.substr(t2ICAccount.length()-4, 4)
  3647. + "|T2CARDSERIAL(len)," + t2ICCardSerial + "|CARDCAT," + cardType;
  3648. m_currCardNo = t2ICAccount.c_str();
  3649. Dbg("data to host(less)[%s],baseICData length:%d",txtresult.c_str(),baseICData.length());
  3650. if (pCID != NULL)
  3651. delete[]pCID;
  3652. if (pIssueBankLen != NULL)
  3653. delete[]pIssueBankLen;
  3654. if (pExpireDate != NULL)
  3655. delete []pExpireDate;
  3656. if (m_pDataToARQC != NULL)
  3657. {
  3658. delete []m_pDataToARQC;
  3659. m_pDataToARQC = NULL;
  3660. }
  3661. if (m_csMachineType.Compare("RVC.CardStore") == 0)
  3662. AfterPreOnlineOnStore(Error_Succeed, slot);
  3663. ctx->Answer(Error_Succeed);
  3664. return 0;
  3665. }
  3666. int CCardIssuerFSM::PostOnline(SpReqAnsContext<CardIssuerService_PostOnline_Req,CardIssuerService_PostOnline_Ans>::Pointer ctx)
  3667. {
  3668. LOG_FUNCTION();
  3669. m_pCardProcess->DataInit();
  3670. Dbg("post online data[%s]",(LPCTSTR)ctx->Req.data);
  3671. m_pCardProcess->SplitOnlineReplyData(ctx->Req.data,strlen(ctx->Req.data));
  3672. int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER,m_pCardIssuer);
  3673. CSimpleStringA csTransEnd;
  3674. if (issBnkAuth == 0)
  3675. {
  3676. int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER,m_pCardIssuer,m_bCDA);
  3677. if (transEnd == 0)
  3678. csTransEnd = "TRANSEND,0";
  3679. else if (transEnd == 1)
  3680. csTransEnd = "TRANSEND,1";
  3681. }
  3682. else
  3683. csTransEnd = "TRANSEND,1";
  3684. ctx->Ans.result = csTransEnd;
  3685. //PBYTE pData = new BYTE[MAX_IC_BUFFER_SIZE];
  3686. //ZeroMemory(pData,MAX_IC_BUFFER_SIZE);
  3687. //int size = StrBuf2HexBuf(ctx->Req.data,&pData);
  3688. //if (size > 0)
  3689. //m_pCardProcess->ExecuteIssuerScript(CARD_MACHINE_ISSUER,m_pCardIssuer);
  3690. //else
  3691. //{
  3692. // Dbg("Wrong post on line data[%s]",ctx->Req.data);
  3693. // ctx->Answer(Error_Unexpect);
  3694. //}
  3695. ctx->Answer(Error_Succeed);
  3696. return 0;
  3697. }
  3698. void CCardIssuerFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  3699. {
  3700. //for simple
  3701. pTransactionContext->SendAnswer(m_testResult);
  3702. }
  3703. //void CCardIssuerFSM::LogErrInfo(const char* msgHead)
  3704. //{
  3705. // DevErrorInfo errInfo;
  3706. // ErrorCodeEnum eErr = m_pCardIssuer->GetLastErr(errInfo);
  3707. // if (eErr == Error_Succeed)
  3708. // Dbg("%s,%s",msgHead,errInfo.szErrMsg);
  3709. //}
  3710. bool CCardIssuerFSM::FSMSetIssueFlag(int value)
  3711. {
  3712. Dbg("to set issue flag,value:%d,from file:%d", value, m_issueStatusFromFile);
  3713. if (value == 0 && m_issueStatusFromFile >1)
  3714. {
  3715. //oilyang@20171220 如果曾经卡片卡住,但启动时没有发现卡片,则更新本次发卡方向但不写文件,以防后续卡片被移动到卡槽
  3716. if (!m_hasCardWhileDevOpen)
  3717. {
  3718. Dbg("card jamed havn't been process.");
  3719. m_issueStatus = 0;
  3720. }
  3721. else
  3722. Dbg("insert succeed,but there maybe some card jamed...");
  3723. return true;
  3724. }
  3725. m_issueStatus = value;
  3726. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  3727. CSmartPointer<IConfigInfo> spConfig;
  3728. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  3729. if (eErrDev != Error_Succeed) {
  3730. Dbg("(set issue)open cfg file failed!");
  3731. return false;
  3732. }
  3733. if (spConfig->WriteConfigValueInt("RunInfo", "IsIssue", value) == Error_Succeed && spConfig->WriteConfigValueInt("all", "IsIssue", value) == Error_Succeed)
  3734. return true;
  3735. else
  3736. return false;
  3737. }
  3738. bool CCardIssuerFSM::SetCardCaptured(const int num,bool bClear)
  3739. {
  3740. Dbg("set captured:%d,(bClear)%d",num,bClear);
  3741. if (num < 0)
  3742. {
  3743. Dbg("wrong reset card captured %d",num);
  3744. return false;
  3745. }
  3746. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  3747. CSmartPointer<IConfigInfo> spConfig;
  3748. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  3749. if (eErrDev != Error_Succeed) {
  3750. Dbg("(set captured)open cfg file failed!");
  3751. return false;
  3752. }
  3753. m_CardCaptured = num;
  3754. if (num >= m_maxRetainCount)
  3755. {
  3756. Dbg("retain bin is full!回收箱满了,请及时清理!");
  3757. LogWarn(Severity_Middle, Error_Unexpect, LOG_ERR_CARDISSUER_RETAIN_BIN_IS_FULL, "retain bin is full!回收箱满了,请及时清理!");
  3758. }
  3759. if (spConfig->WriteConfigValueInt("RunInfo", "CardCaptured", num) == Error_Succeed
  3760. && spConfig->WriteConfigValueInt("all", "CardCaptured", num) == Error_Succeed)
  3761. {
  3762. if (bClear && !m_bSettingMaterial)
  3763. {
  3764. bool bSetHopper[3];
  3765. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  3766. SyncDataToDB(bSetHopper);
  3767. }
  3768. return true;
  3769. }
  3770. else
  3771. return false;
  3772. }
  3773. bool CCardIssuerFSM::SetCardIssued(const int num, const int hopper)
  3774. {
  3775. Dbg("set issued:%d,(hopper)%d",num,hopper);
  3776. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  3777. CSmartPointer<IConfigInfo> spConfig;
  3778. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  3779. if (eErrDev != Error_Succeed) {
  3780. Dbg("(set issued)open cfg file failed!");
  3781. return false;
  3782. }
  3783. CSimpleStringA section = "1";
  3784. if (hopper == 2)
  3785. section = "2";
  3786. else if (hopper == 3)
  3787. section = "3";
  3788. if (spConfig->WriteConfigValueInt(section, "CardIssued", num) == Error_Succeed)
  3789. {
  3790. if (section.Compare("1") == 0)
  3791. spConfig->WriteConfigValueInt("RunInfo", "CardIssued", num);
  3792. //oilyang 回写新section
  3793. if (hopper == 1)
  3794. {
  3795. int xNum = 0;
  3796. spConfig->ReadConfigValueInt("all", "HopperNum", xNum);
  3797. if (xNum == 0)
  3798. spConfig->WriteConfigValueInt("all", "HopperNum", 1);
  3799. }
  3800. //oilyang@20170428 汪磊东要求单卡箱也要同步数据
  3801. //if (m_hopperNum != 1 && !m_bSettingMaterial)
  3802. if (!m_bSettingMaterial)
  3803. {
  3804. bool bSetHopper[3];
  3805. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  3806. //bSetHopper[hopper - 1] = true;
  3807. SyncDataToDB(bSetHopper,false);
  3808. }
  3809. return true;
  3810. }
  3811. else
  3812. {
  3813. Dbg("write CardIssued err:%d", eErrDev);
  3814. return false;
  3815. }
  3816. }
  3817. bool CCardIssuerFSM::SetCardRemains(const int num, const int hopper,bool bInit)
  3818. {
  3819. Dbg("remains:num %d,%d,(hopper)%d",num,bInit,hopper);
  3820. if (num == 0)
  3821. {
  3822. Dbg("hopper %d no card remains.",m_currentHopper);
  3823. switch (hopper)
  3824. {
  3825. case 1:
  3826. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper1, "Hopper 1 No card remains.");
  3827. break;
  3828. case 2:
  3829. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper2, "Hopper 2 No card remains.");
  3830. break;
  3831. case 3:
  3832. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper3, "Hopper 3 No card remains.");
  3833. break;
  3834. default:
  3835. break;
  3836. }
  3837. }
  3838. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  3839. CSmartPointer<IConfigInfo> spConfig;
  3840. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  3841. if (eErrDev != Error_Succeed) {
  3842. Dbg("(set remains)open cfg file failed!");
  3843. return false;
  3844. }
  3845. CSimpleStringA section = "1";
  3846. if (hopper == 2)
  3847. section = "2";
  3848. else if (hopper == 3)
  3849. section = "3";
  3850. if ((eErrDev = spConfig->WriteConfigValueInt(section, "CardRemains", num)) == Error_Succeed)
  3851. {
  3852. if (bInit)
  3853. {
  3854. if (section.Compare("1") == 0)
  3855. spConfig->WriteConfigValueInt("RunInfo", "CardInit", num);
  3856. eErrDev = spConfig->WriteConfigValueInt(section, "CardInit", num);
  3857. }
  3858. if (section.Compare("1") == 0)
  3859. spConfig->WriteConfigValueInt("RunInfo", "CardRemains", num);
  3860. if (eErrDev != Error_Succeed)
  3861. {
  3862. Dbg("write CardInit err:%d", eErrDev);
  3863. return false;
  3864. }
  3865. //oilyang@20170428 汪磊东要求单卡箱也要同步数据
  3866. //if (m_hopperNum != 1 && !m_bSettingMaterial)
  3867. if (!m_bSettingMaterial)
  3868. {
  3869. bool bSetHopper[3];
  3870. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  3871. //bSetHopper[hopper - 1] = true;
  3872. SyncDataToDB(bSetHopper,false);
  3873. }
  3874. }
  3875. else
  3876. {
  3877. Dbg("write CardRemains err:%d",eErrDev);
  3878. return false;
  3879. }
  3880. return true;
  3881. }
  3882. bool CCardIssuerFSM::SetCardMixed(const int num, const int hopper)
  3883. {
  3884. Dbg("set mixed:%d,(hopper)%d",num,hopper);
  3885. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  3886. CSmartPointer<IConfigInfo> spConfig;
  3887. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  3888. if (eErrDev != Error_Succeed) {
  3889. Dbg("(set mixed)open cfg file failed!");
  3890. return false;
  3891. }
  3892. if (num == 0)
  3893. SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
  3894. CSimpleStringA section = "1";
  3895. if (hopper == 2)
  3896. section = "2";
  3897. else if (hopper == 3)
  3898. section = "3";
  3899. eErrDev = spConfig->WriteConfigValueInt(section, "CardMixed", num);
  3900. if (section.Compare("1") == 0)
  3901. spConfig->WriteConfigValueInt("RunInfo", "CardMixed", num);
  3902. if (eErrDev != Error_Succeed)
  3903. {
  3904. Dbg("write CardMixed err:%d", eErrDev);
  3905. return false;
  3906. }
  3907. //oilyang@20170428 汪磊东要求单卡箱也要同步数据
  3908. //if (m_hopperNum != 1 && !m_bSettingMaterial)
  3909. if (!m_bSettingMaterial)
  3910. {
  3911. bool bSetHopper[3];
  3912. bSetHopper[0] = bSetHopper[1] = bSetHopper[2] = false;
  3913. //bSetHopper[hopper - 1] = true;
  3914. SyncDataToDB(bSetHopper,false);
  3915. }
  3916. return true;
  3917. }
  3918. ErrorCodeEnum CCardIssuerFSM::MachineMoveCardBackNotHold()
  3919. {
  3920. LOG_FUNCTION();
  3921. ErrorCodeEnum eMoveNotHold = m_pCardIssuer->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
  3922. Dbg("capture card:%d",eMoveNotHold);
  3923. //2016-11-10 14:30:54 joseph
  3924. if (eMoveNotHold != Error_Succeed)
  3925. {
  3926. LogErrMsg("MachineMoveCardBackNotHold", eMoveNotHold, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, TRUE);
  3927. //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_Failed, "吞卡失败");
  3928. //DevErrorInfo devErrInfo;
  3929. //ErrorCodeEnum err = m_pCardIssuer->GetLastErr(devErrInfo);
  3930. //if (err == Error_Succeed)
  3931. //{
  3932. // Dbg("MoveCard back not hold failed [%s].", devErrInfo.szErrMsg);
  3933. //}
  3934. //else
  3935. //{
  3936. // Dbg("MoveCard back not hold failed, get lastErr failed.");
  3937. //}
  3938. return eMoveNotHold;
  3939. }
  3940. //oilyang@20170929 根据讨论结果,去掉调用
  3941. //2016-11-10 14:34:44 joseph
  3942. //GUIConsoleService_ClientBase *pGuiConsoleClient = NULL;
  3943. //pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
  3944. //ErrorCodeEnum eAddMaterial = pGuiConsoleClient->Connect();
  3945. //if (eAddMaterial == Error_Succeed)
  3946. //{
  3947. // if (pGuiConsoleClient)
  3948. // {
  3949. // Dbg("to add material counter.");
  3950. // GUIConsoleService_AddMaterialCounter_Req req;
  3951. // GUIConsoleService_AddMaterialCounter_Ans ans;
  3952. // req.strMaterialCode = "RetainCard";
  3953. // eAddMaterial = pGuiConsoleClient->AddMaterialCounter(req, ans, 10000);
  3954. // Dbg("%d", eAddMaterial);
  3955. // if (pGuiConsoleClient != NULL)
  3956. // {
  3957. // pGuiConsoleClient->GetFunction()->CloseSession();
  3958. // pGuiConsoleClient->SafeDelete();
  3959. // pGuiConsoleClient = NULL;
  3960. // }
  3961. // }
  3962. //}
  3963. return eMoveNotHold;
  3964. }
  3965. ErrorCodeEnum CCardIssuerFSM::MachineMoveCardFrontGate()
  3966. {
  3967. LOG_FUNCTION();
  3968. ErrorCodeEnum eMoveFrontGate = m_pCardIssuer->MoveCard(CI_MOVECARD_FRONT_GATE);
  3969. if (eMoveFrontGate != Error_Succeed)
  3970. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MoveCardToGate_Failed, "吐卡失败");
  3971. return eMoveFrontGate;
  3972. }
  3973. int CCardIssuerFSM::QueryCardInfo()
  3974. {
  3975. if (m_pCardIssuer == NULL)
  3976. return 1;
  3977. //ErrorCodeEnum eErr = m_pCardIssuer->GetDevStatus(m_devStatus);
  3978. //if (eErr == Error_Succeed)
  3979. if(GetDevStatus())
  3980. {
  3981. Dbg("m_devStatus.eMedia %d",m_devStatus.eMedia);
  3982. if (m_devStatus.eMedia == CI_MEDIA_PRESENT) {
  3983. return 2;
  3984. } else {
  3985. return 0;
  3986. }
  3987. }
  3988. else {
  3989. return 1;
  3990. }
  3991. }
  3992. //void CCardIssuerFSM::LogDevErrorInfo()
  3993. //{
  3994. // WORD wdErrCode = 0;
  3995. // CSimpleStringA csErrMsg(true);
  3996. // ErrorCodeEnum ec = DeviceBaseHelper::GetAndSplitDevErrInfo(m_pCardIssuer, csErrMsg, wdErrCode);
  3997. //}
  3998. int CCardIssuerFSM::ConnectSCI()
  3999. {
  4000. LOG_FUNCTION();
  4001. if (m_bDoingQueryListOrBindSCI || m_bUnbindType3)
  4002. {
  4003. //while doing QuerySCIList or BindSCI,we pretend to doing sth and return
  4004. Dbg("in doing query list or bind sci or have unbind:(doingOrBind)%d,(unbind)%d", m_bDoingQueryListOrBindSCI,m_bUnbindType3);
  4005. return Error_InvalidState;
  4006. }
  4007. ErrorCodeEnum errCode = Error_Unexpect;
  4008. BYTE btOpenType = DEV_OPEN_TYPE_BLUETOOTH | DEV_OPEN_TYPE_USB;//oiltmp for change
  4009. if ((btOpenType & DEV_OPEN_TYPE_BLUETOOTH) == DEV_OPEN_TYPE_BLUETOOTH) {
  4010. m_bBTConncting = true;
  4011. }
  4012. if (IsValidSCIName(m_csDevSN, m_csDevSN.GetLength()))
  4013. {
  4014. errCode = OpenDevice(btOpenType, m_csDevSN);
  4015. if (errCode != Error_Succeed) {
  4016. Dbg("OpenDevice failed(%d).", errCode);
  4017. CloseAndClearDevObj(false);
  4018. }
  4019. } else {
  4020. Dbg("invalid device sn name!! %s", m_csDevSN.GetData());
  4021. errCode = Error_DataCheck;
  4022. }
  4023. m_bBTConncting = false;
  4024. return errCode;
  4025. }
  4026. //判断是否配置了便携发卡机
  4027. int CCardIssuerFSM::QueryIfCfgSCI()
  4028. {
  4029. if (m_csDevSN.GetLength() > 2)
  4030. return 1;
  4031. else
  4032. return 0;
  4033. }
  4034. int CCardIssuerFSM::SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend)
  4035. {
  4036. if(m_eDevState != eState || bForceSend) {
  4037. SCIConnect evt;
  4038. evt.status = m_eDevState = eState;
  4039. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(SCIConnect), SP_MSG_SIG_OF(SCIConnect), evt);
  4040. Dbg("dev state changed: %d", eState);
  4041. }
  4042. return 0;
  4043. }
  4044. int CCardIssuerFSM::DataTransferInitEx()
  4045. {
  4046. LOG_FUNCTION();
  4047. AccessAuthService_ClientBase *pAccessAuthClient = new AccessAuthService_ClientBase(GetEntityBase());
  4048. if (pAccessAuthClient == NULL)
  4049. {
  4050. Dbg("new AccessAuthService_ClientBase failed.");
  4051. return -1;
  4052. }
  4053. ErrorCodeEnum eErr = pAccessAuthClient->Connect();
  4054. if (eErr != Error_Succeed)
  4055. {
  4056. Dbg("connect to Entity AccessAuth failed.%d", eErr);
  4057. return -1;
  4058. }
  4059. Dbg("Connect to AccessAuth ok.");
  4060. ZeroMemory(m_priKey, ONE_K / 2);
  4061. //AsciiToHex("16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45", m_priKey, strlen("16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45"));
  4062. memcpy(m_priKey, "16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45", strlen("16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45"));
  4063. int iStatus;
  4064. BYTE *Cr1, *Cr3, *dKey;
  4065. Cr1 = new BYTE[ONE_K / 4];
  4066. Cr3 = new BYTE[ONE_K / 4];
  4067. dKey = new BYTE[ONE_K / 4];
  4068. ZeroMemory(Cr1, ONE_K / 4);
  4069. ZeroMemory(Cr3, ONE_K / 4);
  4070. ZeroMemory(dKey, ONE_K / 4);
  4071. int lenCr1, lenCr3, lenDKey;
  4072. bool bFirstFailed = false;
  4073. Dbg("TransferEnInit start...");
  4074. eErr = m_pCardIssuer->TransferEnInit(iStatus, Cr1, lenCr1, Cr3, lenCr3, dKey, lenDKey);
  4075. if (eErr != Error_Succeed)
  4076. {
  4077. Dbg("TransferEnInit failed:%d,%d", eErr, iStatus);
  4078. return 1;
  4079. }
  4080. Dbg("TransferEnInit ok.");
  4081. ZeroMemory(m_r1, ONE_K / 8);
  4082. char tmpCr1[2048], tmpCr3[2048], tmpDKey[2048];
  4083. ZeroMemory(tmpCr1, ONE_K * 2);
  4084. ConvAscii(Cr1, tmpCr1, lenCr1);
  4085. ZeroMemory(tmpCr3, ONE_K * 2);
  4086. ConvAscii(Cr3, tmpCr3, lenCr3);
  4087. ZeroMemory(tmpDKey, ONE_K * 2);
  4088. ConvAscii(dKey, tmpDKey, lenDKey);
  4089. char random_key[128];
  4090. unsigned char tbuf[4096];
  4091. char encrnd[1024];
  4092. int encdatalen;
  4093. int iloop;
  4094. //取随机因子
  4095. srand((int)time(NULL));
  4096. for (iloop = 0; iloop < 32; iloop++)
  4097. tbuf[iloop] = rand() % 256;
  4098. ConvAscii(tbuf, random_key, 32);
  4099. //随机数2
  4100. BYTE r2[16];
  4101. ZeroMemory(r2, 16);
  4102. for (int i = 0; i < 15; ++i)
  4103. {
  4104. srand((int)time(NULL));
  4105. unsigned int ram = rand();
  4106. r2[i] = ram % 256;
  4107. r2[15] ^= r2[i];
  4108. m_r2[i] = r2[i];
  4109. }
  4110. m_r2[15] = r2[15];
  4111. char *xxxR2 = new char[256];
  4112. ZeroMemory(xxxR2, 256);
  4113. ConvAscii(r2, xxxR2, 16);
  4114. AccessAuthService_InitDev_Req req;
  4115. AccessAuthService_InitDev_Ans ans;
  4116. req.EncR1 = tmpCr1;
  4117. req.EncR3 = tmpCr3;
  4118. req.EncDevPubKey = tmpDKey;
  4119. req.R2 = xxxR2;
  4120. req.Vendor = m_devCat.szVendor;
  4121. Dbg("to InitDev(%s).", m_devCat.szVendor);
  4122. eErr = pAccessAuthClient->InitDev(req, ans, 5000);
  4123. if (eErr != Error_Succeed)
  4124. {
  4125. Dbg("InitDev from AccessAuth returned failed. %d", eErr);
  4126. if (Cr1 != NULL)
  4127. delete[]Cr1;
  4128. if (Cr3 != NULL)
  4129. delete[]Cr3;
  4130. if (dKey != NULL)
  4131. delete[]dKey;
  4132. return -1;
  4133. }
  4134. Dbg("InitDev ok.");
  4135. if (Cr1 != NULL)
  4136. delete[]Cr1;
  4137. if (Cr3 != NULL)
  4138. delete[]Cr3;
  4139. if (dKey != NULL)
  4140. delete[]dKey;
  4141. //Dbg("Cr2:%d,%s",ans.EncR2.GetLength(),(const char*)ans.EncR2);
  4142. //Dbg("oiltest %s,%s",(const char*)ans.R1,(const char*)ans.R3);
  4143. unsigned char *xxxCR2 = new unsigned char[512];
  4144. ZeroMemory(xxxCR2, 512);
  4145. AsciiToHex(const_cast<char*>(ans.EncR2.GetData()), xxxCR2, ans.EncR2.GetLength());
  4146. eErr = m_pCardIssuer->SetR2(iStatus, xxxCR2, ans.EncR2.GetLength() / 2);
  4147. if (eErr != Error_Succeed)
  4148. {
  4149. Dbg("SetR2 failed:%d, %d", eErr, iStatus);
  4150. return 3;
  4151. }
  4152. Dbg("Set R2 ok.");
  4153. AsciiToHex(const_cast<char*>(ans.R1.GetData()), m_r1, ans.R1.GetLength());
  4154. AsciiToHex(const_cast<char*>(ans.R3.GetData()), m_r3, ans.R3.GetLength());
  4155. int lenrandom1, lenrandom2, lenrandom3;
  4156. lenrandom1 = lenrandom2 = lenrandom3 = 16;
  4157. int ilen = 0;
  4158. char databuf[2048];
  4159. char key[128];
  4160. memset(databuf, 0, sizeof(databuf));
  4161. memset(tbuf, 0, sizeof(tbuf));
  4162. memcpy(databuf, m_r2, lenrandom2);
  4163. for (iloop = 0; iloop < 64; iloop++)
  4164. databuf[iloop] ^= 0x5C;
  4165. memcpy(tbuf, m_r2, lenrandom2);
  4166. for (iloop = 0; iloop < 64; iloop++)
  4167. tbuf[iloop] ^= 0x36;
  4168. ilen = 64;
  4169. memcpy(tbuf + ilen, "KEY", strlen("KEY"));
  4170. ilen += strlen("KEY");
  4171. memcpy(tbuf + ilen, m_r1, lenrandom1);
  4172. ilen += lenrandom1;
  4173. memcpy(tbuf + ilen, m_r3, lenrandom3);
  4174. ilen += lenrandom3;
  4175. SM3Hash((unsigned char *)tbuf, ilen, (unsigned char *)(databuf + 64));
  4176. SM3Hash((unsigned char *)databuf, 96, (unsigned char *)key);
  4177. char *sessionKey = new char[1024];
  4178. ZeroMemory(sessionKey, 1024);
  4179. HexBuf2StrBuf((unsigned char *)key, &sessionKey, 16);
  4180. //Dbg("oiltest key[%s]", sessionKey);
  4181. eErr = m_pCardIssuer->SendWorkingKey(sessionKey);
  4182. if (eErr != Error_Succeed)
  4183. {
  4184. Dbg("SendWorkingKey failed:%d,iStatus", eErr, iStatus);
  4185. return 4;
  4186. }
  4187. return 0;
  4188. }
  4189. int CCardIssuerFSM::LoadSafeLockDll()
  4190. {
  4191. #ifdef RVC_OS_WIN
  4192. CSimpleStringA csDepPath, csBackslash("\\"), csSafelockDll, csSafelockDllDukpt;
  4193. ErrorCodeEnum eErrPath = GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath);
  4194. csSafelockDll = csDepPath + csBackslash + "JNIDUKPT.dll";
  4195. csSafelockDllDukpt = csDepPath + csBackslash + "Dukpt.dll";
  4196. HMODULE m_hModule = LoadLibraryA(csSafelockDll);
  4197. if (m_hModule == NULL)
  4198. {
  4199. Dbg("load JNIDUKPT.dll failed.%d", GetLastError());
  4200. }
  4201. if ((EncypteDukptHSM = (pfEncryptDukptHSM)GetProcAddress(m_hModule, "EncryptDukptHSM")) == NULL)
  4202. {
  4203. Dbg("Get function EncryptDukptHSM failed.%d", GetLastError());
  4204. }
  4205. HMODULE m_hModuleDukpt = LoadLibraryA(csSafelockDllDukpt);
  4206. if (m_hModuleDukpt == NULL)
  4207. {
  4208. Dbg("load Dukpt.dll failed.%d", GetLastError());
  4209. }
  4210. if ((GetEncrypedData = (pfGetEncrypedData)GetProcAddress(m_hModuleDukpt, "GetEncrypedData")) == NULL)
  4211. {
  4212. Dbg("Get function GetEncrypedData failed.%d", GetLastError());
  4213. }
  4214. Dbg("Load SafeLock dll ok.");
  4215. #endif //RVC_OS_WIN
  4216. return 0;
  4217. }
  4218. void two_one(unsigned char *in, int in_len, unsigned char *out) {
  4219. unsigned char tmpc;
  4220. int i;
  4221. for (i = 0; i<in_len; i += 2) {
  4222. tmpc = in[i];
  4223. tmpc = toupper(tmpc);
  4224. if ((tmpc < '0' || tmpc > '9') && (tmpc < 'A' || tmpc > 'F'))
  4225. tmpc = 'F';
  4226. if (tmpc > '9')
  4227. tmpc = toupper(tmpc) - 'A' + 0x0A;
  4228. else
  4229. tmpc -= '0';
  4230. tmpc <<= 4;
  4231. out[i / 2] = tmpc;
  4232. tmpc = in[i + 1];
  4233. tmpc = toupper(tmpc);
  4234. if ((tmpc < '0' || tmpc > '9') && (tmpc < 'A' || tmpc > 'F'))
  4235. tmpc = 'F';
  4236. if (tmpc > '9')
  4237. tmpc = toupper(tmpc) - 'A' + 0x0A;
  4238. else
  4239. tmpc -= '0';
  4240. out[i / 2] |= tmpc;
  4241. }
  4242. }
  4243. void one_two(unsigned char *in, int in_len, unsigned char *out) {
  4244. unsigned char i;
  4245. static unsigned char TAB[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  4246. for (i = 0; i < in_len; i++) {
  4247. out[i * 2] = TAB[in[i] >> 4];
  4248. out[i * 2 + 1] = TAB[in[i] & 0x0f];
  4249. }
  4250. }
  4251. static char DecCh2HexCh(BYTE c)
  4252. {
  4253. if (c >= 0x0 && c <= 0x9)
  4254. return c + '0';
  4255. else if (c >= 0xa && c <= 0xf)
  4256. return c + 'a' - 10;
  4257. else
  4258. return 0;
  4259. }
  4260. int CCardIssuerFSM::EncryptData(SCITempData ramData, SCITempData bdk, SCITempData curksn, SCITempData &encryptedData)
  4261. {
  4262. BYTE ram[64];
  4263. ZeroMemory(ram, 64);
  4264. Dbg("size ram:%d,bdk:%d,curksn:%d", ramData.dwSize, bdk.dwSize,curksn.dwSize);
  4265. for (int i = 0, j = 0; i < ramData.dwSize; ++i)
  4266. {
  4267. ram[j++] = DecCh2HexCh((ramData.data[i] & 0xf0) >> 4);
  4268. ram[j++] = DecCh2HexCh(ramData.data[i] & 0x0f);
  4269. }
  4270. //PBYTE pTmpBDK = new BYTE[64];
  4271. //PBYTE pTmpKSN = new BYTE[64];
  4272. BYTE pTmpBDK[64], pTmpKSN[64];
  4273. ZeroMemory(pTmpBDK, 64);
  4274. ZeroMemory(pTmpKSN, 64);
  4275. //HexBuf2StrBuf(bdk.data, (char**)&pTmpBDK, bdk.dwSize);
  4276. //HexBuf2StrBuf(curksn.data, (char**)&pTmpKSN, curksn.dwSize);
  4277. //PBYTE pData = new BYTE[64];
  4278. one_two(bdk.data, bdk.dwSize, pTmpBDK);
  4279. one_two(curksn.data, curksn.dwSize, pTmpKSN);
  4280. BYTE pData[64];
  4281. ZeroMemory(pData, 64);
  4282. Dbg("to EncypteDukptHSM");
  4283. if (EncypteDukptHSM != NULL)
  4284. EncypteDukptHSM(ram, pTmpBDK, pTmpKSN, pData);
  4285. Dbg("to two_one");
  4286. two_one(pData, 16, encryptedData.data);
  4287. Dbg("end two_one");
  4288. //if (pTmpBDK != NULL)
  4289. //{
  4290. // delete[]pTmpBDK;
  4291. // pTmpBDK = NULL;
  4292. //}
  4293. //if (pTmpKSN != NULL)
  4294. //{
  4295. // delete[]pTmpKSN;
  4296. // pTmpKSN = NULL;
  4297. //}
  4298. //if (pData != NULL)
  4299. //{
  4300. // delete[]pData;
  4301. // pData = NULL;
  4302. //}
  4303. Dbg("encrypt ok.");
  4304. encryptedData.dwSize = 8;
  4305. return 0;
  4306. }
  4307. int CCardIssuerFSM::OpenSafeLock(SpReqAnsContext<CardIssuerService_OpenSafeLock_Req, CardIssuerService_OpenSafeLock_Ans>::Pointer ctx)
  4308. {
  4309. LOG_FUNCTION();
  4310. bool bOpenSuc = false;
  4311. SCITempData ksnData, ramData;
  4312. ErrorCodeEnum eErr = Error_Succeed;
  4313. eErr = m_pCardIssuer->SLGetTempData(ksnData, ramData);
  4314. //ksnData.dwSize = 7;
  4315. //ksnData.data[0] = 0x00;
  4316. //ksnData.data[1] = 0x00;
  4317. //ksnData.data[2] = 0x00;
  4318. //ksnData.data[3] = 0x01;
  4319. //ksnData.data[4] = 0x00;
  4320. //ksnData.data[5] = 0x00;
  4321. //ksnData.data[6] = 0x2B;
  4322. //ramData.dwSize = 4;
  4323. //ramData.data[0] = 0xA8;
  4324. //ramData.data[1] = 0x25;
  4325. //ramData.data[2] = 0x36;
  4326. //ramData.data[3] = 0x84;
  4327. if (eErr != Error_Succeed)
  4328. {
  4329. LogErrMsg("OpenSafeLock:SL_GetTempData ", eErr, MEC_DEVAPI_CARDISSUER_SLGetTempData, TRUE);
  4330. Dbg("SLGetTempData failed.%d",eErr);
  4331. }
  4332. Dbg("Get temp data ok %d,%d.",ksnData.dwSize,ramData.dwSize);
  4333. //char *tmpStr = new char[128];
  4334. //ZeroMemory(tmpStr, 128);
  4335. //HexBuf2StrBuf(ksnData.data, (char**)&tmpStr, ksnData.dwSize);
  4336. //ZeroMemory(tmpStr, 128);
  4337. //HexBuf2StrBuf(ramData.data, (char**)&tmpStr, ramData.dwSize);
  4338. const int cmdSize = 26;
  4339. BYTE tmp[cmdSize] = { 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
  4340. 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
  4341. ZeroMemory(m_bdk, sizeof(m_bdk));
  4342. ZeroMemory(m_ksn, sizeof(m_ksn));
  4343. memcpy(m_bdk, tmp, 16);
  4344. memcpy(m_ksn, tmp + 16, 10);
  4345. //SCITempData bdk, ksn, enData;
  4346. //memcpy(bdk.data, m_bdk, 16);
  4347. //bdk.dwSize = 16;
  4348. //memcpy(ksn.data, m_ksn, 3);
  4349. //memcpy(ksn.data + 3, ksnData.data, 7);
  4350. //ksn.dwSize = 10;
  4351. BYTE ramAllData[64];
  4352. ZeroMemory(ramAllData, 64);
  4353. memcpy(ramAllData, ksnData.data, 7);
  4354. memcpy(ramAllData + 7, ramData.data, 4);
  4355. SCITempData enData;
  4356. int ret;
  4357. Dbg("to encrypt data");
  4358. ZeroMemory(enData.data, 64);
  4359. //ret = EncryptData(ramData, bdk, ksn, enData);
  4360. if (GetEncrypedData != NULL)
  4361. ret = GetEncrypedData(m_bdk, m_ksn, ramAllData, enData.data);
  4362. enData.dwSize = 8;
  4363. //if (eErr == Error_Succeed)
  4364. {
  4365. Dbg("to open door");
  4366. eErr = m_pCardIssuer->SLOpenDoor(enData);
  4367. if (eErr != Error_Succeed)
  4368. {
  4369. LogErrMsg("OpenSafeLock:SLOpenDoor ", eErr, MEC_DEVAPI_CARDISSUER_SLOpenDoor, TRUE);
  4370. Dbg("SLOpenDoor failed.%d", eErr);
  4371. }
  4372. else
  4373. {
  4374. bOpenSuc = true;
  4375. Dbg("Open SafeLock ok.");
  4376. }
  4377. }
  4378. //else
  4379. //{
  4380. // Dbg("EncryptData failed.%d", eErr);
  4381. // LogDevErrorInfo();
  4382. //}
  4383. if (ctx != NULL)
  4384. {
  4385. if (bOpenSuc)
  4386. ctx->Answer(Error_Succeed);
  4387. else
  4388. ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_SLOpenDoor));
  4389. }
  4390. return 0;
  4391. }
  4392. int CCardIssuerFSM::GetSCIInfo(char *&devSN)
  4393. {
  4394. if (m_machineType == 3)
  4395. {
  4396. Dbg("No CFG SCI");
  4397. return -1;
  4398. }
  4399. else if (m_machineType == 2 && !m_bBTConnected)
  4400. {
  4401. Dbg("SCI not connected.");
  4402. return -2;
  4403. }
  4404. //if (m_csDevSN.GetLength() > 1)
  4405. if(QueryIfCfgSCI()) {
  4406. strncpy(devSN, (const char*)m_csDevSN, m_csDevSN.GetLength());
  4407. }
  4408. else {
  4409. //devSN = "";
  4410. strcpy(devSN, "");
  4411. }
  4412. return 0;
  4413. }
  4414. int CCardIssuerFSM::UpdateLocalRunCfg(int hopper1, int hopper2, int hopper3)
  4415. {
  4416. LOG_FUNCTION();
  4417. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  4418. CSmartPointer<IConfigInfo> spConfig;
  4419. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  4420. if (eErrDev != Error_Succeed) {
  4421. Dbg("(UpdateLocalRunCfg)open cfg file failed!");
  4422. return false;
  4423. }
  4424. char sec[2];
  4425. for (int i = 0; i < 3; ++i)
  4426. {
  4427. ZeroMemory(sec, 2);
  4428. _itoa(i + 1, (char*)sec, 10);
  4429. if ((i == 0 && hopper1 == 1) || (i == 1 && hopper2 == 1) || (i == 2 && hopper3 == 1))
  4430. {
  4431. Dbg("sec:%s,CardBoxNo:%s,CardInit:%d,CardRemains:%d,CardIssued:%d", sec,(const char*)m_CardBoxNoEx[i]
  4432. , m_CardInitEx[i],m_remainsEx[i], m_issuedEx[i]);
  4433. spConfig->WriteConfigValue(sec, "CardBoxNo", m_CardBoxNoEx[i]);
  4434. spConfig->WriteConfigValue(sec, "PsbCode", m_PsbCodeEx[i]);
  4435. spConfig->WriteConfigValue(sec, "PsbName", m_PsbNameEx[i]);
  4436. spConfig->WriteConfigValueInt(sec, "CardInit", m_CardInitEx[i]);
  4437. spConfig->WriteConfigValueInt(sec, "CardRemains", m_remainsEx[i]);
  4438. spConfig->WriteConfigValueInt(sec, "CardIssued", m_issuedEx[i]);
  4439. spConfig->WriteConfigValueInt(sec, "CardMixed", m_mixedEx[i]);
  4440. spConfig->WriteConfigValueInt(sec, "CardPercent", m_CardPercentEx[i]);
  4441. spConfig->WriteConfigValue(sec, "Maintainer", m_MaintainerEx[i]);
  4442. spConfig->WriteConfigValue(sec, "MaintainTime", m_csMaintainTimeEx[i]);
  4443. if (i == 0 && hopper1 == 1)
  4444. {
  4445. spConfig->WriteConfigValueInt("RunInfo", "CardInit", m_CardInitEx[i]);
  4446. spConfig->WriteConfigValueInt("RunInfo", "CardRemains", m_remainsEx[i]);
  4447. spConfig->WriteConfigValueInt("RunInfo", "CardIssued", m_issuedEx[i]);
  4448. spConfig->WriteConfigValueInt("RunInfo", "CardMixed", m_mixedEx[i]);
  4449. spConfig->WriteConfigValueInt("RunInfo", "CardPercent", m_CardPercentEx[i]);
  4450. }
  4451. }
  4452. }
  4453. return 0;
  4454. }
  4455. int CCardIssuerFSM::SyncDataToDB(bool bMaintain[3], bool bSetCaptured)
  4456. {
  4457. LOG_FUNCTION();
  4458. GUIConsoleService_ClientBase *pGuiConsoleClient = NULL;
  4459. Dbg("to new gui client");
  4460. //pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
  4461. pGuiConsoleClient = new GUIConsoleService_ClientBase((GetEntityBase()));
  4462. Dbg("new gui client finish");
  4463. ErrorCodeEnum eConn = Error_Unexpect;
  4464. if (pGuiConsoleClient != NULL)
  4465. {
  4466. Dbg("to connect to guiconsole");
  4467. eConn = pGuiConsoleClient->Connect();
  4468. if(eConn != Error_Succeed)
  4469. pGuiConsoleClient->SafeDelete();
  4470. }
  4471. else
  4472. Dbg("new pGuiConsoleClient failed.");
  4473. if (eConn != Error_Succeed)
  4474. {
  4475. Dbg("SyncDataToDB can't connect to GUIConsole.");
  4476. pGuiConsoleClient = NULL;
  4477. return -1;
  4478. }
  4479. else
  4480. Dbg("SyncDataToDB GUIConsole connected.");
  4481. GUIConsoleService_SyncMaterialCount_Info info = {};
  4482. info.dwCardBoxNum = m_hopperNum;
  4483. if (!_strnicmp("RVC.Stand2S", m_csMachineType, strlen("RVC.Stand2S")))
  4484. {
  4485. Dbg("%s",(const char*)m_csMachineType);
  4486. info.strDeviceNo = m_terminalNo;
  4487. }
  4488. else
  4489. info.strDeviceNo = m_csDevSN;
  4490. //if (pDevSN != NULL)
  4491. // delete[]pDevSN;
  4492. Dbg("to init sync info[%d][%s]", info.dwCardBoxNum,(const char*)info.strDeviceNo);
  4493. info.arrMaintainFlag.Init(m_hopperNum+1);
  4494. info.arrMaintainer.Init(m_hopperNum+1);
  4495. info.arrMaintainTime.Init(m_hopperNum+1);
  4496. info.arrCardBoxNo.Init(m_hopperNum+1);
  4497. info.arrPsbCode.Init(m_hopperNum+1);
  4498. info.arrPsbName.Init(m_hopperNum+1);
  4499. info.arrCardInit.Init(m_hopperNum+1);
  4500. info.arrCardRemains.Init(m_hopperNum+1);
  4501. info.arrCardIssued.Init(m_hopperNum+1);
  4502. info.arrCardMixed.Init(m_hopperNum+1);
  4503. info.arrCardPercent.Init(m_hopperNum+1);
  4504. Dbg("to set info");
  4505. for (int i = 0; i < m_hopperNum; ++i)
  4506. {
  4507. Dbg("<%d>maintain:%d,maintainerEx:%s,maintainTimeEx:%d,CardBoxNoEx:%s,PsbCodeEx:%s,PsbNameEx:%s,CardInitEx:%d,remainsEx:%d,issuedEx:%d,mixedEx:%d,CardPercentEx:%d",
  4508. i,
  4509. bMaintain[i], (const char*)m_MaintainerEx[i], m_MaintainTimeEx[i],
  4510. (const char*)m_CardBoxNoEx[i], (const char*)m_PsbCodeEx[i], (const char*)m_PsbNameEx[i]
  4511. ,m_CardInitEx[i],m_remainsEx[i], m_issuedEx[i],m_mixedEx[i],m_CardPercentEx[i]);
  4512. //[17:36 : 30.353][DEBUG] Debug: {0, SP01010101, 0, NX00000002, 47N2, IC金卡2, 100, 10, 1, 0, 10}
  4513. info.arrMaintainFlag[i] = bMaintain[i];
  4514. info.arrMaintainer[i] = m_MaintainerEx[i];
  4515. info.arrMaintainTime[i] = m_MaintainTimeEx[i];
  4516. info.arrCardBoxNo[i] = m_CardBoxNoEx[i];
  4517. info.arrPsbCode[i] = m_PsbCodeEx[i];
  4518. info.arrPsbName[i] = m_PsbNameEx[i];
  4519. info.arrCardInit[i] = m_CardInitEx[i];
  4520. info.arrCardRemains[i] = m_remainsEx[i];
  4521. info.arrCardIssued[i] = m_issuedEx[i];
  4522. info.arrCardMixed[i] = m_mixedEx[i];
  4523. info.arrCardPercent[i] = m_CardPercentEx[i];
  4524. }
  4525. {
  4526. if (bSetCaptured)
  4527. info.arrMaintainFlag[m_hopperNum] = 1;
  4528. else
  4529. info.arrMaintainFlag[m_hopperNum] = 0;
  4530. info.arrCardRemains[m_hopperNum] = m_CardCaptured;
  4531. info.arrMaintainer[m_hopperNum] = m_MaintainerEx[0];
  4532. info.arrMaintainTime[m_hopperNum] = m_MaintainTimeEx[0];
  4533. info.arrCardBoxNo[m_hopperNum] = "";
  4534. info.arrPsbCode[m_hopperNum] = "";
  4535. info.arrPsbName[m_hopperNum] = "";
  4536. info.arrCardInit[m_hopperNum] = 0;
  4537. info.arrCardIssued[m_hopperNum] = 0;
  4538. info.arrCardMixed[m_hopperNum] = 0;
  4539. info.arrCardPercent[m_hopperNum] = 0;
  4540. Dbg("bSetCaptured,flag:%d,captured:%d,mter:%s,mtime:%d",
  4541. info.arrMaintainFlag[m_hopperNum], info.arrCardRemains[m_hopperNum], (const char*)info.arrMaintainer[m_hopperNum], info.arrMaintainTime[m_hopperNum]);
  4542. }
  4543. Dbg("to sync data.");
  4544. if (pGuiConsoleClient != NULL)
  4545. {
  4546. eConn = pGuiConsoleClient->SyncMaterialCount(info);
  4547. Dbg("%d", eConn);
  4548. pGuiConsoleClient->GetFunction()->CloseSession();
  4549. pGuiConsoleClient = NULL;
  4550. if (eConn != Error_Succeed)
  4551. return -2;
  4552. }
  4553. else
  4554. {
  4555. Dbg("pGuiConsoleClient is null? unexpect error.");
  4556. return -3;
  4557. }
  4558. return 0;
  4559. }
  4560. void CCardIssuerFSM::SetHopperNum(int hopperNum)
  4561. {
  4562. m_hopperNum = hopperNum;
  4563. }
  4564. int CCardIssuerFSM::BluetoothCheck()
  4565. {
  4566. m_bBTChecking = 2;
  4567. ErrorCodeEnum eErr = Error_Unexpect;
  4568. int count = 0;
  4569. BYTE *pSig = new BYTE[3];
  4570. while (2 == m_bBTChecking)
  4571. {
  4572. Sleep(5000);
  4573. if (m_pCardIssuer != NULL && m_bBTConnected && m_bInMainPage)
  4574. {
  4575. ZeroMemory(pSig, 3);
  4576. eErr = m_pCardIssuer->BluetoothGetSignalStrength(pSig);
  4577. Dbg("%d,%d,%d", eErr, pSig[0],pSig[1]);
  4578. if (eErr != Error_Succeed)
  4579. {
  4580. Dbg("get bluetooth signal strength failed!");
  4581. count++;
  4582. if (count >= 2)
  4583. {
  4584. LogWarn(Severity_Middle, Error_DevConnFailed, AlarmDECToBusiness(DEC_DEV_DISCONNECTED), "CardIssuer(SCI) device disconnecetd.");
  4585. m_bBTConnected = false;
  4586. Dbg("DevClose returned %d", m_pCardIssuer->DevClose());
  4587. count = 0;
  4588. Dbg("send bluetooth disonnect event!");
  4589. FSMEvent *pEvt = new FSMEvent(USER_EVT_BLUETOOTH_DISCONNECT);
  4590. PostEventFIFO(pEvt);
  4591. assert(m_bBTConncting == FALSE);
  4592. }
  4593. }
  4594. //else
  4595. // DetectBluetoothSCI();
  4596. }
  4597. }
  4598. if(pSig) {
  4599. delete pSig;
  4600. }
  4601. m_bBTChecking = 0;
  4602. return 0;
  4603. }
  4604. void CCardIssuerFSM::DoExitWhenIdle()
  4605. {
  4606. ErrorCodeEnum eErr = m_pCardIssuer->GetDevStatus(m_devStatus);
  4607. if (eErr == Error_Succeed)
  4608. {
  4609. Dbg("media:%d when receive exit while idle(s2) ", m_devStatus.eMedia);
  4610. if (m_devStatus.eMedia == CI_MEDIA_PRESENT || m_devStatus.eMedia == CI_MEDIA_ENTERING)
  4611. {
  4612. JustReadCardNo();
  4613. m_captureReason = "4001";
  4614. eErr = MachineMoveCardBackNotHold();
  4615. Dbg("capture card result:%d",eErr);
  4616. if (eErr == Error_Succeed)
  4617. {
  4618. bool bCaptured = RegistCardWhileCaptureCard();
  4619. Dbg("to capture card.regist %d", bCaptured);
  4620. m_CardCaptured++;
  4621. SetCardCaptured(m_CardCaptured);
  4622. }
  4623. }
  4624. }
  4625. }
  4626. bool CCardIssuerFSM::JustReadCardNo()
  4627. {
  4628. ErrorCodeEnum eErr = Error_Unexpect;
  4629. m_currCardNo = "";
  4630. bool bHasAccount = false;
  4631. int activeCardType;
  4632. bool bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
  4633. if (bIC)
  4634. {
  4635. //oilyang@20201014 add emv support
  4636. bool bGetICData = false;
  4637. bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
  4638. if (!bGetICData)
  4639. {
  4640. bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
  4641. }
  4642. ICData track2(false, 0x57, 0x00);
  4643. string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
  4644. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
  4645. {
  4646. Dbg("can't find track2 in ic data");
  4647. }
  4648. else
  4649. {
  4650. int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
  4651. char *pICTrack2 = new char[128];
  4652. ZeroMemory(pICTrack2, 128);
  4653. HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
  4654. pICTrack2[37] = '\0';
  4655. char *ddd = new char[128];
  4656. memset(ddd, 0, 128);
  4657. memcpy(ddd, pICTrack2, pos - 1);
  4658. m_currCardNo = ddd;
  4659. if (m_currCardNo.GetLength() > 1)
  4660. bHasAccount = true;
  4661. delete[]ddd;
  4662. delete[]pICTrack2;
  4663. }
  4664. m_pCardIssuer->DeactivateICCard();
  4665. m_pCardIssuer->ReleaseIC();
  4666. }
  4667. if (!bHasAccount)
  4668. {
  4669. MagTracks magTracks;
  4670. eErr = m_pCardIssuer->MagRead(magTracks);
  4671. if (eErr == Error_Succeed)
  4672. {
  4673. if (magTracks.track[1].eStatus == CI_DATA_OK)
  4674. {
  4675. int pos = 0;
  4676. for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos)
  4677. {
  4678. if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e)
  4679. break;
  4680. }
  4681. Dbg("pos:%d", pos);
  4682. char buf[128];
  4683. ZeroMemory(buf, 128);
  4684. strncpy(buf, (char*)magTracks.track[1].data, pos);
  4685. m_currCardNo = buf;
  4686. if (m_currCardNo.GetLength() > 1)
  4687. bHasAccount = true;
  4688. }
  4689. }
  4690. else {
  4691. LogErrMsg("JustReadCardNo::MagRead", eErr, MEC_DEVAPI_CARDISSUER_MagRead, TRUE);
  4692. }
  4693. }
  4694. if (m_currCardNo.GetLength() > 8)
  4695. Dbg("record the account (%d):%s****%s", m_currCardNo.GetLength()
  4696. , (const char*)m_currCardNo.SubString(0, 6), (const char*)m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4));
  4697. else
  4698. Dbg("record the account (%d):%s", m_currCardNo.GetLength(), (const char*)m_currCardNo);
  4699. return true;
  4700. }
  4701. bool CCardIssuerFSM::RegistCardWhileCaptureCard()
  4702. {
  4703. CSmallDateTime currTime;
  4704. CSimpleStringA csCurrTime = currTime.GetNow().ToTimeString();
  4705. CAutoArray<CSimpleStringA> arrTime;
  4706. arrTime = csCurrTime.Split(' ');
  4707. CSimpleStringA csDate, csTime;
  4708. csDate = arrTime[0].SubString(0, 4) + arrTime[0].SubString(5, 2) + arrTime[0].SubString(8, 2);
  4709. csTime = arrTime[1].SubString(0, 2) + arrTime[1].SubString(3, 2) + arrTime[1].SubString(6, 2);
  4710. GUIConsoleService_ClientBase *pGuiConsoleClient = NULL;
  4711. ErrorCodeEnum eErr = Error_Unexpect;
  4712. pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
  4713. if (pGuiConsoleClient != NULL)
  4714. eErr = pGuiConsoleClient->Connect();
  4715. else
  4716. {
  4717. Dbg("pGuiConsoleClient is null?");
  4718. return false;
  4719. }
  4720. if (eErr == Error_Succeed)
  4721. {
  4722. if (pGuiConsoleClient != NULL)
  4723. {
  4724. GUIConsoleService_RegistSwallowedCard_Req req;
  4725. GUIConsoleService_RegistSwallowedCard_Ans ans;
  4726. req.strCardNo = m_currCardNo;
  4727. if (IsValidCardNo((const char*)m_currCardNo, m_currCardNo.GetLength()))
  4728. {
  4729. if (m_currCardNo.GetLength() > 0)
  4730. req.strReasonCode = m_captureReason;
  4731. else
  4732. req.strReasonCode = "0000";
  4733. }
  4734. else
  4735. req.strReasonCode = "0001";
  4736. req.strSwallowDate = csDate;
  4737. req.strSwallowTime = csTime;
  4738. req.strDeviceSciNo = m_csDevSN;
  4739. Dbg("%s,%s,%s****%s,%s", (LPCTSTR)csDate, (LPCTSTR)csTime, (LPCTSTR)m_currCardNo.SubString(0, 6),
  4740. (LPCTSTR)m_currCardNo.SubString(m_currCardNo.GetLength()-4, 4),(LPCTSTR)m_captureReason);
  4741. //if (m_currCardNo.GetLength() > 8)
  4742. {
  4743. Dbg("to regist");
  4744. Dbg("%s,%s****%s,%s,%s,%s", (LPCTSTR)req.strDeviceSciNo, (LPCTSTR)req.strCardNo.SubString(0, 6),
  4745. (LPCTSTR)req.strCardNo.SubString(req.strCardNo.GetLength()-4, 4), (LPCTSTR)req.strReasonCode, (LPCTSTR)req.strSwallowDate, (LPCTSTR)req.strSwallowTime);
  4746. if (m_bCaptureCfgFlag)
  4747. {
  4748. eErr = pGuiConsoleClient->RegistSwallowedCard(req, ans, 10000);
  4749. Dbg("RegistSwallowedCard:%d", eErr);
  4750. }
  4751. else
  4752. Dbg("no capture regist flag.");
  4753. if (pGuiConsoleClient != NULL)
  4754. {
  4755. pGuiConsoleClient->GetFunction()->CloseSession();
  4756. pGuiConsoleClient = NULL;
  4757. }
  4758. }
  4759. Dbg("after regist swallow card...");
  4760. }
  4761. }
  4762. else
  4763. return false;
  4764. return true;
  4765. }
  4766. bool CCardIssuerFSM::IsValidCardNo(const char *pCardNo,int len)
  4767. {
  4768. //oilyang@20170207 卡号长度有限
  4769. len = (len > 32) ? 32 : len;
  4770. for (int i = 0; i < len; ++i)
  4771. {
  4772. if (pCardNo[i] < 0x30 || pCardNo[i] > 0x39)
  4773. {
  4774. //not '0'-'9'
  4775. return false;
  4776. }
  4777. }
  4778. return true;
  4779. }
  4780. int CCardIssuerFSM::IsValidSCIName(const char *pSCIName, int len)
  4781. {
  4782. //设备唯一标识:10位,厂商简称(两个字母,需报备行方) + SCI + 5位顺序序号
  4783. //怡化:YH;广电:YT;中航:ZH;南天:NT,中世顺:ZS;
  4784. //如:YHSCI00001
  4785. if (len < 10 || len > 11)
  4786. return 0;
  4787. //oiltmp 20170713 需要增加配置,然后格式判断
  4788. if ((*(pSCIName + 2) == 'S') && (*(pSCIName + 3) == 'C') && (*(pSCIName + 4) == 'I'))
  4789. return 1;
  4790. else if((*(pSCIName + 2) == 'C') && (*(pSCIName + 3) == 'I') && (*(pSCIName + 4) == 'L')) {
  4791. //设备唯一标识:10位,厂商简称(两个字母,需报备行方)+ CIL +5位顺序序号
  4792. return 2;
  4793. } else
  4794. return 0;
  4795. }
  4796. int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx)
  4797. {
  4798. ErrorCodeEnum eErr = Error_Unexpect;
  4799. Dbg("cmd %d",ctx->Req.cmdType);
  4800. switch (ctx->Req.cmdType)
  4801. {
  4802. case SAMICCommand_SAM_Select:
  4803. eErr = m_pCardIssuer->SAMSelect(ctx->Req.param1[0]);
  4804. if(eErr) {
  4805. LogErrMsg("SAMICCommand::SAMSelect", eErr, MEC_DEVAPI_CARDISSUER_SAMSelect, TRUE);
  4806. }
  4807. break;
  4808. case SAMICCommand_SAM_Active:
  4809. eErr = m_pCardIssuer->SAMActive(ctx->Req.param1[0]);
  4810. if(eErr) {
  4811. LogErrMsg("SAMICCommand::SAMActive", eErr, MEC_DEVAPI_CARDISSUER_SAMActive, TRUE);
  4812. }
  4813. break;
  4814. case SAMICCommand_SAM_Deactivate:
  4815. eErr = m_pCardIssuer->SAMDeactivate();
  4816. if(eErr) {
  4817. LogErrMsg("SAMICCommand::SAMDeactivate", eErr, MEC_DEVAPI_CARDISSUER_SAMDeactivate, TRUE);
  4818. }
  4819. break;
  4820. case SAMICCommand_SAM_WarmReset:
  4821. eErr = m_pCardIssuer->SAMWarmReset();
  4822. if(eErr) {
  4823. LogErrMsg("SAMICCommand::SAMWarmReset", eErr, MEC_DEVAPI_CARDISSUER_SAMWarmReset, TRUE);
  4824. }
  4825. break;
  4826. case SAMICCommand_SAM_QueryStatus:
  4827. {
  4828. SAMStatus samStatus;
  4829. eErr = m_pCardIssuer->SAMQueryStatus(samStatus);
  4830. if (eErr == Error_Succeed)
  4831. {
  4832. ctx->Ans.ret1.Init(2);
  4833. ctx->Ans.ret1[0] = samStatus.isActive;
  4834. ctx->Ans.ret1[1] = samStatus.chosenOfSAM;
  4835. }
  4836. else
  4837. {
  4838. LogErrMsg("SAMICCommand::SAMQueryStatus", eErr, MEC_DEVAPI_CARDISSUER_SAMQueryStatus, TRUE);
  4839. }
  4840. }
  4841. break;
  4842. case SAMICCommand_SAM_Command:
  4843. {
  4844. CmdInfo sendBuf, recvBuf;
  4845. BYTE *pTmp = new BYTE[MAX_IC_BUFFER_SIZE];
  4846. ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE);
  4847. Dbg("%s",(const char*)ctx->Req.param2[0]);
  4848. int size = StrBuf2HexBuf(ctx->Req.param2[0], &pTmp);
  4849. memcpy(sendBuf.data, pTmp, size);
  4850. sendBuf.dwSize = size;
  4851. eErr = m_pCardIssuer->SAMCommand(sendBuf,recvBuf);
  4852. if (eErr == Error_Succeed)
  4853. {
  4854. char *pRet = new char[MAX_IC_BUFFER_SIZE];
  4855. ZeroMemory(pRet, MAX_IC_BUFFER_SIZE);
  4856. Dbg("%d",recvBuf.dwSize);
  4857. HexBuf2StrBuf(recvBuf.data, (char**)&pRet, recvBuf.dwSize);
  4858. ctx->Ans.ret1.Init(1);
  4859. ctx->Ans.ret2.Init(1);
  4860. ctx->Ans.ret1[0] = recvBuf.dwSize * 2;
  4861. ctx->Ans.ret2[0] = pRet;
  4862. delete[]pRet;
  4863. }
  4864. else
  4865. {
  4866. LogErrMsg("SAMICCommand::SAMCommand", eErr, MEC_DEVAPI_CARDISSUER_SAMCommand, TRUE);
  4867. }
  4868. delete[]pTmp;
  4869. }
  4870. break;
  4871. case SAMICCommand_IC_Active:
  4872. eErr = m_pCardIssuer->ContactIC();
  4873. if (eErr == Error_Succeed)
  4874. {
  4875. CmdInfo atrBuf;
  4876. eErr = m_pCardIssuer->ActiveICCardATR(atrBuf);
  4877. if (eErr == Error_Succeed)
  4878. {
  4879. BYTE *pTmp = new BYTE[MAX_IC_BUFFER_SIZE];
  4880. if (pTmp == NULL)
  4881. {
  4882. Dbg("new MAX_IC_BUFFER_SIZE failed");
  4883. eErr = Error_Unexpect;
  4884. break;
  4885. }
  4886. ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE);
  4887. HexBuf2StrBuf(atrBuf.data, (char**)&pTmp, atrBuf.dwSize);
  4888. ctx->Ans.ret1.Init(1);
  4889. ctx->Ans.ret2.Init(1);
  4890. ctx->Ans.ret1[0] = atrBuf.dwSize * 2;
  4891. ctx->Ans.ret2[0] = CSimpleStringA((const char*)pTmp);
  4892. Dbg("AtrCtx: size=%d, content=%s, pTmp=%s", ctx->Ans.ret1[0], (LPCTSTR)ctx->Ans.ret2[0], (LPCTSTR)pTmp);
  4893. delete[] pTmp;
  4894. pTmp = NULL;
  4895. }
  4896. else
  4897. {
  4898. Dbg("ActiveICCardATR failed EC=0x%x", eErr);
  4899. }
  4900. }
  4901. else
  4902. {
  4903. LogErrMsg("SAMICCommand::ContactIC", eErr, MEC_DEVAPI_CARDISSUER_ContactIC, TRUE);
  4904. }
  4905. break;
  4906. case SAMICCommand_IC_Deactivate:
  4907. eErr = m_pCardIssuer->DeactivateICCard();
  4908. if (eErr == Error_Succeed)
  4909. eErr = m_pCardIssuer->DeactivateICCard();
  4910. break;
  4911. case SAMICCommand_IC_WarmReset:
  4912. eErr = m_pCardIssuer->WarmReset();
  4913. break;
  4914. case SAMICCommand_IC_Command:
  4915. {
  4916. CmdInfo sendBuf, recvBuf;
  4917. BYTE *pTmp = new BYTE[MAX_IC_BUFFER_SIZE];
  4918. ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE);
  4919. int size = StrBuf2HexBuf(ctx->Req.param2[0], &pTmp);
  4920. memcpy(sendBuf.data, pTmp, size);
  4921. sendBuf.dwSize = size;
  4922. eErr = m_pCardIssuer->ICCommand(sendBuf, recvBuf);
  4923. {
  4924. char *pRet = new char[MAX_IC_BUFFER_SIZE];
  4925. if (pRet != NULL)
  4926. {
  4927. ZeroMemory(pRet, MAX_IC_BUFFER_SIZE);
  4928. HexBuf2StrBuf(sendBuf.data, (char**)&pRet, size);
  4929. Dbg("%s", (const char*)pRet);
  4930. delete[] pRet;
  4931. }
  4932. }
  4933. if (eErr == Error_Succeed)
  4934. {
  4935. char *pRet = new char[MAX_IC_BUFFER_SIZE];
  4936. ZeroMemory(pRet, MAX_IC_BUFFER_SIZE);
  4937. Dbg("%d", recvBuf.dwSize);
  4938. HexBuf2StrBuf(recvBuf.data, (char**)&pRet, recvBuf.dwSize);
  4939. ctx->Ans.ret1.Init(1);
  4940. ctx->Ans.ret2.Init(1);
  4941. ctx->Ans.ret1[0] = recvBuf.dwSize * 2;
  4942. ctx->Ans.ret2[0] = pRet;
  4943. delete[]pRet;
  4944. }
  4945. delete[]pTmp;
  4946. }
  4947. break;
  4948. default:
  4949. break;
  4950. }
  4951. ctx->Answer(eErr,AlarmDECToBusiness());
  4952. return 0;
  4953. }
  4954. int CalcDelayFactor(int failedCount)
  4955. {
  4956. if ((failedCount % 7) == 0)
  4957. {
  4958. return 1;
  4959. }
  4960. else
  4961. return 1 << (failedCount % 7);
  4962. }
  4963. void CCardIssuerFSM::PeriodConnect(BOOL anotherThread)
  4964. {
  4965. //便携式蓝牙发卡器5s左右睡眠
  4966. Dbg("Fire period connect!");
  4967. Sleep(m_scanSlot * ONE_K * CalcDelayFactor(m_devOpenFailedCount));
  4968. if (m_bBTConnected || m_bBTConncting || m_currentFSMState != 12) {
  4969. Dbg("return previously: btconnected: %d, btconnecting: %d, fsm state: %d",
  4970. m_bBTConnected, m_bBTConncting, m_currentFSMState);
  4971. return;
  4972. }
  4973. Dbg("to connect(by PeriodConnect)");
  4974. ConnectTask *task = new ConnectTask(this);
  4975. if(anotherThread) {
  4976. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  4977. } else {
  4978. ConnectTask *task = new ConnectTask(this);
  4979. task->Process();
  4980. task->DecRef();
  4981. }
  4982. }
  4983. int CCardIssuerFSM::QueryPrinterStatus(SpReqAnsContext<CardIssuerService_QueryPrinterStatus_Req, CardIssuerService_QueryPrinterStatus_Ans>::Pointer ctx)
  4984. {
  4985. return 0;
  4986. }
  4987. int CCardIssuerFSM::Print(SpReqAnsContext<CardIssuerService_Print_Req, CardIssuerService_Print_Ans>::Pointer ctx)
  4988. {
  4989. int dataSize = 0;
  4990. Dbg("print data bitmap of bmp:%d,face:%d,name:%s,%s;size:%d,%d", ctx->Req.reserved1[0], (const char*)ctx->Req.reserved2[0], ctx->Req.reserved1[1]
  4991. , (const char*)ctx->Req.reserved2[1],ctx->Req.data1.m_iLength,ctx->Req.data2.m_iLength);
  4992. if (ctx->Req.reserved1[0] > 0xf)
  4993. {
  4994. ctx->Answer(Error_Param);
  4995. return -1;
  4996. }
  4997. PBYTE pData = new BYTE[2048];
  4998. if (pData == NULL)
  4999. {
  5000. Dbg("resource failed.");
  5001. ctx->Answer(Error_Unexpect);
  5002. return -1;
  5003. }
  5004. CSimpleStringA csDepPath, csBackslash("\\"), csABmp,csBBmp;
  5005. ErrorCodeEnum eErrPath = GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath);
  5006. ZeroMemory(pData, 2048);
  5007. pData[dataSize++] = 0x37;
  5008. pData[dataSize++] = 0x63;
  5009. pData[dataSize++] = 0x30;
  5010. //save print A bmp
  5011. if ((ctx->Req.reserved1[0] & 0x1) == 0x1)
  5012. {
  5013. FILE *fp = NULL;
  5014. csABmp = ctx->Req.reserved2[0];
  5015. //csABmp = csDepPath + csBackslash + "PrintImage.bmp";
  5016. Dbg("a.bmp:%s",(const char*)csABmp);
  5017. fp = fopen((const char*)csABmp, "wb+");
  5018. if (fp) {
  5019. fwrite(ctx->Req.data1.m_pData, 1, ctx->Req.data1.m_iLength, fp);
  5020. fclose(fp);
  5021. }
  5022. else {
  5023. Dbg("save print A file failed.");
  5024. ctx->Answer(Error_Unexpect);
  5025. return -1;
  5026. }
  5027. memcpy(pData + dataSize, ctx->Req.reserved2[0], ctx->Req.reserved2[0].GetLength());
  5028. dataSize += ctx->Req.reserved2[0].GetLength();
  5029. //memcpy(pData + dataSize, "PrintImage.bmp", strlen("PrintImage.bmp"));
  5030. //dataSize += strlen("PrintImage.bmp");
  5031. pData[dataSize++] = 0x00;
  5032. }
  5033. //save print B bmp
  5034. if ((ctx->Req.reserved1[0] & 0x2) == 0x2)
  5035. {
  5036. pData[2] = 0x31;
  5037. csBBmp = ctx->Req.reserved2[1];
  5038. //csBBmp = csDepPath + csBackslash + ctx->Req.reserved2[1];
  5039. //csBBmp = csDepPath + csBackslash + "Overcoat.bmp";
  5040. Dbg("b.bmp:%s", (const char*)csBBmp);
  5041. FILE *fp = fopen((const char*)csBBmp, "wb+");
  5042. if (fp) {
  5043. fwrite(ctx->Req.data2.m_pData, 1, ctx->Req.data2.m_iLength, fp);
  5044. fclose(fp);
  5045. }
  5046. else {
  5047. Dbg("save print B file failed.");
  5048. ctx->Answer(Error_Unexpect);
  5049. return -1;
  5050. }
  5051. memcpy(pData + dataSize, ctx->Req.reserved2[1], ctx->Req.reserved2[1].GetLength());
  5052. dataSize += ctx->Req.reserved2[1].GetLength();
  5053. //memcpy(pData + dataSize, "Overcoat.bmp", strlen("Overcoat.bmp"));
  5054. //dataSize += strlen("Overcoat.bmp");
  5055. pData[dataSize++] = 0x00;
  5056. }
  5057. pData[dataSize++] = 0x00;
  5058. pData[dataSize++] = 0x00;
  5059. char *tmpShow = new char[1024];
  5060. ZeroMemory(tmpShow, 1024);
  5061. HexBuf2StrBuf(pData, &tmpShow, dataSize);
  5062. Dbg("print datasize(%d)(%s)",dataSize,tmpShow);
  5063. delete[]tmpShow;
  5064. ErrorCodeEnum eErr = Error_Unexpect;
  5065. //BYTE *pData = new BYTE[ctx->Req.reserved1[0]];
  5066. //if (pData != NULL)
  5067. {
  5068. eErr = m_pCardIssuer->Print(pData, dataSize,ctx->Req.reserved1[1]);
  5069. if (eErr != Error_Succeed)
  5070. {
  5071. //DevErrorInfo devErrInfo;
  5072. //ErrorCodeEnum eErrGet = m_pCardIssuer->GetLastErr(devErrInfo);
  5073. //if (eErrGet == Error_Succeed)
  5074. //{
  5075. // Dbg("Print failed.%s", devErrInfo.szErrMsg);
  5076. //}
  5077. LogErrMsg("Print::Print", eErr, MEC_DEVAPI_CARDISSUER_Print, TRUE);
  5078. ctx->Answer(eErr);
  5079. }
  5080. ctx->Answer(Error_Succeed);
  5081. }
  5082. remove((const char*)csABmp);
  5083. remove((const char*)csBBmp);
  5084. return 0;
  5085. }
  5086. int CCardIssuerFSM::DetectBluetoothSCIOnLinux()
  5087. {
  5088. return Error_NotImpl;
  5089. }
  5090. int CCardIssuerFSM::DetectBluetoothSCI()
  5091. {
  5092. #ifdef RVC_OS_WIN
  5093. ClearSCIRecords();
  5094. WSADATA m_data;
  5095. SOCKET s;
  5096. WSAPROTOCOL_INFO protocolInfo;
  5097. int protocolInfoSize;
  5098. WSAQUERYSET querySet, *pResults, querySet2;
  5099. HANDLE hLookup, hLookup2;
  5100. int result;
  5101. static int i;
  5102. BYTE buffer[1000];
  5103. BYTE buffer1[2000];
  5104. DWORD bufferLength, flags, addressSize, bufferLength1;
  5105. CSADDR_INFO *pCSAddr;
  5106. BTH_DEVICE_INFO *pDeviceInfo;
  5107. char addressAsString[2000];
  5108. BLOB *pBlob;
  5109. GUID protocol;
  5110. // Load the winsock2 library
  5111. if (WSAStartup(MAKEWORD(2, 2), &m_data) == 0)
  5112. {
  5113. // Create a blutooth socket
  5114. s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
  5115. if (s == INVALID_SOCKET)
  5116. {
  5117. Dbg("Failed to get bluetooth socket with error code %ld", WSAGetLastError());
  5118. return 1;
  5119. }
  5120. else {
  5121. Dbg("create socket() suc!");
  5122. }
  5123. protocolInfoSize = sizeof(protocolInfo);
  5124. // Get the bluetooth device info using getsockopt()
  5125. if (getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFO, (char*)&protocolInfo, &protocolInfoSize) != 0)
  5126. {
  5127. Dbg("getsockopt(SO_PROTOCOL_INFO) failed with error code %ld", WSAGetLastError());
  5128. return 1;
  5129. }
  5130. else {
  5131. Dbg("getsockopt(SO_PROTOCOL_INFO) is OK!");
  5132. }
  5133. // Query set criteria
  5134. memset(&querySet, 0, sizeof(querySet));
  5135. querySet.dwSize = sizeof(querySet);
  5136. querySet.dwNameSpace = NS_BTH;
  5137. // Set the flags for query
  5138. //LUP_RETURN_BLOB
  5139. //flags = LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_NEAREST |
  5140. // LUP_RETURN_TYPE | LUP_RES_SERVICE;
  5141. flags = LUP_CONTAINERS| LUP_FLUSHCACHE;
  5142. Dbg("Start a device in range query...");
  5143. result = WSALookupServiceBegin(&querySet, flags, &hLookup);
  5144. if(WSAGetLastError() == 10108 && m_bBTConncting) {
  5145. WSASetLastError(10108);
  5146. const int maxWaitTimes = 12;
  5147. int currentWaitTimes = 0;
  5148. do {
  5149. Dbg("waiting bluetooth connect operation finish...");
  5150. Sleep(800);
  5151. currentWaitTimes++;
  5152. if(currentWaitTimes >= maxWaitTimes) {
  5153. Dbg("Timeout break");
  5154. break;
  5155. }
  5156. } while (m_bBTConncting);
  5157. memset(&querySet, 0, sizeof(querySet));
  5158. querySet.dwSize = sizeof(querySet);
  5159. querySet.dwNameSpace = NS_BTH;
  5160. result = WSALookupServiceBegin(&querySet, flags, &hLookup);
  5161. }
  5162. Dbg("If OK");
  5163. bool bFirst = false;//oilyang@20170802 暂时不用
  5164. if (result == 0)
  5165. {
  5166. i = 0;
  5167. //sockaddr *pRemoteAddr = new sockaddr();
  5168. while (result == 0)
  5169. {
  5170. bufferLength = sizeof(buffer);
  5171. pResults = (WSAQUERYSET *)&buffer;
  5172. // Next query...
  5173. flags = LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_NEAREST |
  5174. LUP_RETURN_TYPE | LUP_RES_SERVICE;
  5175. result = WSALookupServiceNext(hLookup, flags, &bufferLength, pResults);
  5176. if (result != 0)
  5177. {
  5178. Dbg("WSALookupServiceNext() failed with error code %ld", WSAGetLastError());
  5179. }
  5180. else
  5181. {
  5182. // Get the device info, name, address etc
  5183. // if (IsValidSCIName(pResults->lpszServiceInstanceName, strlen(pResults->lpszServiceInstanceName)))
  5184. // {
  5185. // }
  5186. pCSAddr = (CSADDR_INFO *)pResults->lpcsaBuffer;
  5187. pDeviceInfo = (BTH_DEVICE_INFO *)pResults->lpBlob;
  5188. memset(&querySet2, 0, sizeof(querySet2));
  5189. querySet2.dwSize = sizeof(querySet2);
  5190. protocol = L2CAP_PROTOCOL_UUID;
  5191. querySet2.lpServiceClassId = &protocol;
  5192. querySet2.dwNameSpace = NS_BTH;
  5193. if(strlen(pResults->lpszServiceInstanceName) > 0) {
  5194. Dbg("instance name: %s,protocol:%d,socket type:%d", pResults->lpszServiceInstanceName, pCSAddr->iProtocol, pCSAddr->iSocketType);
  5195. }
  5196. // Print the local bluetooth device address...
  5197. //addressSize = sizeof(addressAsString);
  5198. //if (WSAAddressToString(pCSAddr->LocalAddr.lpSockaddr, pCSAddr->LocalAddr.iSockaddrLength,
  5199. // &protocolInfo, (LPSTR)addressAsString, &addressSize) == 0)
  5200. //{
  5201. // Dbg("The local address: %s", addressAsString);
  5202. //}
  5203. //else {
  5204. // Dbg("WSAAddressToString() for local address failed with error code %ld", WSAGetLastError());
  5205. //}
  5206. addressSize = sizeof(addressAsString);
  5207. // Print the remote bluetooth device address...
  5208. if (WSAAddressToString(pCSAddr->RemoteAddr.lpSockaddr, pCSAddr->RemoteAddr.iSockaddrLength,
  5209. &protocolInfo, (LPSTR)addressAsString, &addressSize) == 0)
  5210. {
  5211. if (IsValidSCIName(pResults->lpszServiceInstanceName, strlen(pResults->lpszServiceInstanceName)))
  5212. {
  5213. Dbg("The remote device address: %s", addressAsString);
  5214. //oiltest@20200113 去掉socket连接确认蓝牙卡机是否在附近
  5215. //Dbg(" add %s\n", pResults->lpszServiceInstanceName);
  5216. AddToSCIRecords(pResults->lpszServiceInstanceName, addressAsString, bFirst);
  5217. bFirst = false;
  5218. #ifndef CancelSocketConfirm
  5219. SOCKET LocalSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
  5220. //sockaddr sockaddr_value;
  5221. //sockaddr *pRemoteAddr = &sockaddr_value;
  5222. if (INVALID_SOCKET == LocalSocket) {
  5223. Dbg("socket() call failed. WSAGetLastError = [%d]", WSAGetLastError());
  5224. }
  5225. else {
  5226. // 设置为非阻塞的socket
  5227. int iMode = 1;
  5228. ioctlsocket(LocalSocket, FIONBIO, (u_long FAR*)&iMode);
  5229. // 超时时间
  5230. struct timeval tm;
  5231. tm.tv_sec = 7;
  5232. tm.tv_usec = 0;
  5233. int ret = -1;
  5234. //
  5235. // Connect the socket (pSocket) to a given remote socket represented by address (pServerAddr)
  5236. //
  5237. SOCKADDR_BTH xAddr;
  5238. //CopyMemory(&xAddr,(PSOCKADDR_BTH)pCSAddr->RemoteAddr.lpSockaddr,sizeof(xAddr));
  5239. //xAddr.btAddr = 0x0000881b99079464;
  5240. //ZeroMemory(pRemoteAddr->sa_data, sizeof(pRemoteAddr->sa_data));
  5241. //pRemoteAddr->sa_family = AF_BTH;
  5242. //memcpy(pRemoteAddr->sa_data, addressAsString, strlen(addressAsString));
  5243. int iAddrLen = sizeof(xAddr);
  5244. WSAStringToAddress(addressAsString, AF_BTH, NULL, (LPSOCKADDR)&xAddr, &iAddrLen);
  5245. xAddr.addressFamily = AF_BTH;
  5246. xAddr.serviceClassId = RFCOMM_PROTOCOL_UUID;
  5247. xAddr.port = 0;
  5248. //if (SOCKET_ERROR == connect(LocalSocket, (const sockaddr*)pRemoteAddr, sizeof(pRemoteAddr)))
  5249. bool isConnected = false;
  5250. if (SOCKET_ERROR != connect(LocalSocket,(struct sockaddr *) &xAddr,sizeof(SOCKADDR_BTH)))
  5251. {
  5252. isConnected = true;
  5253. Dbg("connected.");
  5254. //Dbg("=CRITICAL= | connect() call failed. WSAGetLastError=[%d]\n", WSAGetLastError());
  5255. //break;
  5256. }
  5257. else
  5258. {
  5259. fd_set set;
  5260. FD_ZERO(&set);
  5261. FD_SET(LocalSocket, &set);
  5262. if (select(-1, NULL, &set, NULL, &tm) <= 0)
  5263. {
  5264. ret = -1; // 有错误(select错误或者超时)
  5265. isConnected = false;
  5266. Dbg("can't connect or timeout.");
  5267. }
  5268. else
  5269. {
  5270. int error = -1;
  5271. int optLen = sizeof(int);
  5272. getsockopt(LocalSocket, SOL_SOCKET, SO_ERROR, (char*)&error, &optLen);
  5273. if (0 != error)
  5274. {
  5275. ret = -1; // 有错误
  5276. }
  5277. else
  5278. {
  5279. isConnected = true;
  5280. Dbg("connected 2.");
  5281. }
  5282. }
  5283. }
  5284. if (isConnected)
  5285. {
  5286. //Dbg(" add %s\n", pResults->lpszServiceInstanceName);
  5287. AddToSCIRecords(pResults->lpszServiceInstanceName, addressAsString, bFirst);
  5288. bFirst = false;
  5289. }
  5290. Dbg("close socket.");
  5291. closesocket(LocalSocket);
  5292. // 设回为阻塞socket
  5293. iMode = 0;
  5294. ioctlsocket(LocalSocket, FIONBIO, (u_long FAR*)&iMode); //设置回阻塞模式
  5295. }
  5296. #endif // !CancelSocketConfirm
  5297. }
  5298. }
  5299. else {
  5300. Dbg("WSAAddressToString() for remote address failed with error code %ld", WSAGetLastError());
  5301. }
  5302. }
  5303. }
  5304. // Close handle to the device query
  5305. if (WSALookupServiceEnd(hLookup) == 0) {
  5306. Dbg("WSALookupServiceEnd(hLookup) is fine!", WSAGetLastError());
  5307. }
  5308. else {
  5309. Dbg("WSALookupServiceEnd(hLookup) failed with error code %ld");
  5310. }
  5311. }
  5312. else
  5313. {
  5314. Dbg("WSALookupServiceBegin() failed with error code %ld", WSAGetLastError());
  5315. }// end WSALookupServiceBegin()
  5316. // Cleanup the winsock library startup
  5317. if (WSACleanup() == 0) {
  5318. Dbg("WSACleanup() fine!");
  5319. } else {
  5320. Dbg("WSACleanup() failed with error code %ld", WSAGetLastError());
  5321. }
  5322. } // end WSAStartup()
  5323. return 0;
  5324. #else
  5325. return DetectBluetoothSCIOnLinux();
  5326. #endif //RVC_OS_WIN
  5327. }
  5328. int CCardIssuerFSM::QuerySCIList(
  5329. SpReqAnsContext<CardIssuerService_QuerySCIList_Req, CardIssuerService_QuerySCIList_Ans>::Pointer ctx,
  5330. const int fsmState)
  5331. {
  5332. m_bDoingQueryListOrBindSCI = true;
  5333. DetectBluetoothSCI();
  5334. vector<SCIRecord> vTmp;
  5335. //to get SCI list
  5336. EnterCriticalSection(&g_sciRecord);
  5337. vector<SCIRecord>::iterator it;
  5338. for (it = m_vSCIRecords.begin(); it != m_vSCIRecords.end(); it++)
  5339. {
  5340. vTmp.push_back(*it);
  5341. }
  5342. LeaveCriticalSection(&g_sciRecord);
  5343. //query info of each sci
  5344. GUIConsoleService_ClientBase *pGuiConsoleClient = NULL;
  5345. ErrorCodeEnum errCode = Error_Unexpect;
  5346. pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
  5347. if (pGuiConsoleClient != NULL) {
  5348. errCode = pGuiConsoleClient->Connect();
  5349. }else {
  5350. Dbg("pGuiConsoleClient is null?");
  5351. }
  5352. if (errCode == Error_Succeed)
  5353. {
  5354. if (pGuiConsoleClient)
  5355. {
  5356. for (it = vTmp.begin(); it != vTmp.end(); it++)
  5357. {
  5358. GUIConsoleService_QueryMaterialInfo_Req req;
  5359. GUIConsoleService_QueryMaterialInfo_Ans ans;
  5360. req.strDeviceNo = it->name;
  5361. Dbg("sci.name:%s", (const char*)req.strDeviceNo);
  5362. errCode = pGuiConsoleClient->QueryMaterialInfo(req, ans, 10000);
  5363. if (errCode == Error_Succeed)
  5364. {
  5365. Dbg("QueryMaterialInfo suc,count is:%d", ans.count);
  5366. //for (int i = 0; i < ans.count; i++)
  5367. if (ans.count >= 0 && ans.count < 100)//oilyang@20180228 count有时候会异常大,不正常
  5368. {
  5369. int tmpCount = ans.count;
  5370. if (ans.count == 0)
  5371. {
  5372. tmpCount = 1;
  5373. CSimpleStringA blank("");
  5374. unsigned int intZero = 0;
  5375. ctx->Ans.sciNo.Append(&(req.strDeviceNo), 0, 1);
  5376. ctx->Ans.arrMateriel.Append(&blank, 0, 1);
  5377. ctx->Ans.CardGroove.Append(&blank, 0, 1);
  5378. ctx->Ans.CardBoxNo.Append(&blank, 0, 1);
  5379. ctx->Ans.PsbCode.Append(&blank, 0, 1);
  5380. ctx->Ans.PsbName.Append(&blank, 0, 1);
  5381. ctx->Ans.CardInit.Append(&intZero, 0, 1);
  5382. ctx->Ans.CardRemains.Append(&intZero, 0, 1);
  5383. ctx->Ans.CardIssued.Append(&intZero, 0, 1);
  5384. ctx->Ans.CardMixed.Append(&intZero, 0, 1);
  5385. ctx->Ans.CardPercent.Append(&intZero, 0, 1);
  5386. ctx->Ans.Maintainer.Append(&blank, 0, 1);
  5387. ctx->Ans.MaintainTime.Append(&blank, 0, 1);
  5388. ctx->Ans.UpdateTime.Append(&blank, 0, 1);
  5389. }
  5390. else
  5391. {
  5392. ctx->Ans.sciNo.Append(ans.arrDeviceNo, 0, ans.count);
  5393. ctx->Ans.arrMateriel.Append(ans.arrMateriel, 0, ans.count);
  5394. ctx->Ans.CardGroove.Append(ans.CardGroove, 0, ans.count);
  5395. ctx->Ans.CardBoxNo.Append(ans.CardBoxNo, 0, ans.count);
  5396. ctx->Ans.PsbCode.Append(ans.PsbCode, 0, ans.count);
  5397. ctx->Ans.PsbName.Append(ans.PsbName, 0, ans.count);
  5398. ctx->Ans.CardInit.Append(ans.CardInit, 0, ans.count);
  5399. ctx->Ans.CardRemains.Append(ans.CardRemains, 0, ans.count);
  5400. ctx->Ans.CardIssued.Append(ans.CardIssued, 0, ans.count);
  5401. ctx->Ans.CardMixed.Append(ans.CardMixed, 0, ans.count);
  5402. ctx->Ans.CardPercent.Append(ans.CardPercent, 0, ans.count);
  5403. ctx->Ans.Maintainer.Append(ans.Maintainer, 0, ans.count);
  5404. ctx->Ans.MaintainTime.Append(ans.MaintainTime, 0, ans.count);
  5405. ctx->Ans.UpdateTime.Append(ans.UpdateTime, 0, ans.count);
  5406. }
  5407. Dbg("add sci %s,record count:%d,count:%d", (const char*)req.strDeviceNo, ctx->Ans.sciNo.GetCount(), tmpCount);
  5408. }
  5409. else
  5410. Dbg("QueryMaterialInfo ans.count:%d", ans.count);
  5411. }
  5412. else
  5413. Dbg("QueryMaterialInfo failed.%d", errCode);
  5414. }
  5415. ctx->Answer(Error_Succeed);
  5416. }
  5417. }
  5418. m_bDoingQueryListOrBindSCI = false;
  5419. return fsmState;
  5420. }
  5421. int CCardIssuerFSM::BindSCI(
  5422. SpReqAnsContext<CardIssuerService_BindSCI_Req, CardIssuerService_BindSCI_Ans>::Pointer ctx,
  5423. const int fsmState)
  5424. {
  5425. m_bDoingQueryListOrBindSCI = true;
  5426. Dbg("bindSCI type:%d, name:%s, previous fsm state: %d",ctx->Req.type, (const char*)ctx->Req.sciNo, fsmState);
  5427. ErrorCodeEnum eErr = Error_Unexpect;
  5428. int ret = 0;
  5429. switch (ctx->Req.type)
  5430. {//绑定类型:1:绑定(从后台同步数据) 2:绑定成功告知终端 3:解绑(终端数据同步到后台) 4:解绑成功
  5431. case 1:
  5432. if (!IsValidSCIName((const char*)ctx->Req.sciNo, ctx->Req.sciNo.GetLength()))
  5433. {
  5434. ctx->Answer(Error_Param);
  5435. }
  5436. else
  5437. {
  5438. eErr = AfterBindSyncData((const char*)ctx->Req.sciNo, true);
  5439. ctx->Answer(eErr);
  5440. }
  5441. ret = fsmState;
  5442. break;
  5443. case 2:
  5444. if (!IsValidSCIName((const char*)ctx->Req.sciNo, ctx->Req.sciNo.GetLength()))
  5445. {
  5446. ctx->Answer(Error_Param);
  5447. }
  5448. else
  5449. {
  5450. AfterBindUpdateSCINameToRunCfg((const char*)ctx->Req.sciNo, true);
  5451. ret = 1;
  5452. m_csDevSN = ctx->Req.sciNo; //绑定成功的时候才更新设备名称?
  5453. Dbg("after bind,to close previous SCI.");
  5454. CloseAndClearDevObj();
  5455. m_bUnbindType3 = false;
  5456. ctx->Answer(Error_Succeed);
  5457. }
  5458. break;
  5459. case 3:
  5460. if (!IsValidSCIName((const char*)ctx->Req.sciNo, ctx->Req.sciNo.GetLength()))
  5461. {
  5462. ctx->Answer(Error_Param);
  5463. }
  5464. else
  5465. {
  5466. //解绑操作,同步运行时数据(而不是初始化数据)到后台数据库
  5467. //在pad已经绑定多合一,而又没有连上的时候,如果收到解绑操作,去运行时取值再同步数据
  5468. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  5469. CSmartPointer<IConfigInfo> spConfig;
  5470. eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  5471. if (eErr != Error_Succeed) {
  5472. Dbg("open run cfg file failed!");
  5473. ctx->Answer(eErr);
  5474. }
  5475. char sec[2];
  5476. for (int i = 0; i < 3; ++i)
  5477. {
  5478. ZeroMemory(sec, 2);
  5479. _itoa(i + 1, (char*)sec, 10);
  5480. Dbg("sec:%s",sec);
  5481. spConfig->ReadConfigValue(sec, "CardBoxNo", m_CardBoxNoEx[i]);
  5482. spConfig->ReadConfigValue(sec, "PsbCode", m_PsbCodeEx[i]);
  5483. spConfig->ReadConfigValue(sec, "PsbName", m_PsbNameEx[i]);
  5484. spConfig->ReadConfigValueInt(sec, "CardInit", m_CardInitEx[i]);
  5485. spConfig->ReadConfigValueInt(sec, "CardRemains", m_remainsEx[i]);
  5486. spConfig->ReadConfigValueInt(sec, "CardIssued", m_issuedEx[i]);
  5487. spConfig->ReadConfigValueInt(sec, "CardMixed", m_mixedEx[i]);
  5488. spConfig->ReadConfigValueInt(sec, "CardPercent", m_CardPercentEx[i]);
  5489. spConfig->ReadConfigValue(sec, "Maintainer", m_MaintainerEx[i]);
  5490. spConfig->ReadConfigValue(sec, "MaintainTime", m_csMaintainTimeEx[i]);
  5491. }
  5492. eErr = AfterBindSyncData((const char*)ctx->Req.sciNo, false);
  5493. ctx->Answer(eErr);
  5494. if (eErr == Error_Succeed)
  5495. {
  5496. //已经解除绑定,告知OpenDevice退出尝试连接
  5497. Dbg("to set m_bUnbindType3 true");
  5498. m_bUnbindType3 = true;
  5499. }
  5500. }
  5501. ret = fsmState;
  5502. break;
  5503. case 4:
  5504. AfterBindUpdateSCINameToRunCfg((const char*)ctx->Req.sciNo, false);
  5505. //if (ctx->Req.sciNo.GetLength() > 0)
  5506. //{
  5507. // AfterBindUpdateSCINameToRunCfg((const char*)ctx->Req.sciNo, false);
  5508. //}
  5509. //else
  5510. //{
  5511. // AfterBindUpdateSCINameToRunCfg("", false);
  5512. //}
  5513. ret = 0;
  5514. // AfterBindUpdateSCINameToRunCfg 函数中已经做了清空 [10/10/2019 9:16 @Gifur]
  5515. // m_csDevSN = ""; //告知解绑成功才清空设备名称,并调用适配器的关闭接口
  5516. Dbg("after un bind,to close SCI.");
  5517. CloseAndClearDevObj(false, true);
  5518. //if (m_pCardIssuer != NULL && !m_bBTConncting)
  5519. //{
  5520. // eErr = m_pCardIssuer->DevClose();
  5521. // Dbg("Close device returned: %d", eErr);
  5522. // //ReleaseDevComponent((DeviceBaseClass *&)m_pCardIssuer);
  5523. // //m_pCardIssuer = NULL;
  5524. //}
  5525. ctx->Answer(Error_Succeed);
  5526. break;
  5527. default:
  5528. break;
  5529. }
  5530. m_bDoingQueryListOrBindSCI = false;
  5531. return ret;
  5532. }
  5533. void CCardIssuerFSM::AddToSCIRecords(const char *name, const char * remoteMac, bool bFirst)
  5534. {
  5535. EnterCriticalSection(&g_sciRecord);
  5536. if (bFirst) {
  5537. m_vSCIRecords.clear();
  5538. }
  5539. SCIRecord record;
  5540. record.name = name;
  5541. record.remoteMac = remoteMac;
  5542. m_vSCIRecords.push_back(record);
  5543. Dbg("the %dth sci,name is:%s", m_vSCIRecords.size(),name);
  5544. LeaveCriticalSection(&g_sciRecord);
  5545. }
  5546. void CCardIssuerFSM::ClearSCIRecords()
  5547. {
  5548. EnterCriticalSection(&g_sciRecord);
  5549. m_vSCIRecords.clear();
  5550. LeaveCriticalSection(&g_sciRecord);
  5551. return;
  5552. }
  5553. ErrorCodeEnum CCardIssuerFSM::AfterBindSyncData(const char *name, bool bBind)
  5554. {
  5555. LOG_FUNCTION();
  5556. if (!bBind)
  5557. {
  5558. bool bSetHopper[3];
  5559. bSetHopper[0] = bSetHopper[1] = true;
  5560. bSetHopper[2] = false;
  5561. int ret = SyncDataToDB(bSetHopper,false);
  5562. if (ret != 0)
  5563. {
  5564. Dbg("AfterBindSyncData %d",ret);
  5565. return Error_Unexpect;
  5566. }
  5567. }
  5568. else
  5569. {
  5570. GUIConsoleService_ClientBase *pGuiConsoleClient = NULL;
  5571. ErrorCodeEnum errCode = Error_Unexpect;
  5572. pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
  5573. if (pGuiConsoleClient != NULL)
  5574. errCode = pGuiConsoleClient->Connect();
  5575. else
  5576. {
  5577. Dbg("AfterBindSyncData pGuiConsoleClient is null?");
  5578. return Error_Unexpect;
  5579. }
  5580. GUIConsoleService_QueryMaterialInfo_Req req;
  5581. GUIConsoleService_QueryMaterialInfo_Ans ans;
  5582. req.strDeviceNo = name;
  5583. errCode = pGuiConsoleClient->QueryMaterialInfo(req, ans, 10000);
  5584. if (errCode == Error_Succeed)
  5585. {
  5586. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  5587. CSmartPointer<IConfigInfo> spConfig;
  5588. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  5589. if (eErrDev != Error_Succeed) {
  5590. Dbg("(AfterBindSyncData)open cfg file failed!");
  5591. return Error_Unexpect;
  5592. }
  5593. char sec[2];
  5594. for (int i = 0; i < ans.count; ++i)
  5595. {
  5596. ZeroMemory(sec, 2);
  5597. _itoa(i + 1, (char*)sec, 10);
  5598. Dbg("sec:%s", sec);
  5599. Dbg("box no:%s,name:%s,init:%d,remains:%d,maintainer:%s",(const char*)ans.CardBoxNo[i],(const char*)ans.PsbName[i]
  5600. ,ans.CardInit[i],ans.CardRemains[i],(const char*)ans.Maintainer[i]);
  5601. spConfig->WriteConfigValue(sec, "CardBoxNo", ans.CardBoxNo[i]);
  5602. spConfig->WriteConfigValue(sec, "PsbCode", ans.PsbCode[i]);
  5603. spConfig->WriteConfigValue(sec, "PsbName", ans.PsbName[i]);
  5604. spConfig->WriteConfigValueInt(sec, "CardInit", ans.CardInit[i]);
  5605. spConfig->WriteConfigValueInt(sec, "CardRemains", ans.CardRemains[i]);
  5606. spConfig->WriteConfigValueInt(sec, "CardIssued", ans.CardIssued[i]);
  5607. spConfig->WriteConfigValueInt(sec, "CardMixed", ans.CardMixed[i]);
  5608. spConfig->WriteConfigValueInt(sec, "CardPercent", ans.CardPercent[i]);
  5609. spConfig->WriteConfigValue(sec, "Maintainer", ans.Maintainer[i]);
  5610. spConfig->WriteConfigValue(sec, "MaintainTime", ans.MaintainTime[i]);
  5611. if (i == 0)
  5612. {
  5613. spConfig->WriteConfigValueInt("RunInfo", "CardInit", ans.CardInit[i]);
  5614. spConfig->WriteConfigValueInt("RunInfo", "CardRemains", ans.CardRemains[i]);
  5615. spConfig->WriteConfigValueInt("RunInfo", "CardIssued", ans.CardIssued[i]);
  5616. spConfig->WriteConfigValueInt("RunInfo", "CardMixed", ans.CardMixed[i]);
  5617. spConfig->WriteConfigValueInt("RunInfo", "CardPercent", ans.CardPercent[i]);
  5618. }
  5619. }
  5620. }
  5621. else
  5622. {
  5623. Dbg("QueryMaterialInfo ret:%d",errCode);
  5624. return errCode;
  5625. }
  5626. }
  5627. return Error_Succeed;
  5628. }
  5629. ErrorCodeEnum CCardIssuerFSM::AfterBindUpdateSCINameToRunCfg(const char *name, bool bBind)
  5630. {
  5631. LOG_FUNCTION();
  5632. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  5633. CSmartPointer<IConfigInfo> spConfig;
  5634. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  5635. if (eErrDev != Error_Succeed) {
  5636. Dbg("(AfterBindUpdateSCINameToRunCfg)open cfg file failed!");
  5637. return eErrDev;
  5638. }
  5639. if (bBind)
  5640. {
  5641. CSimpleStringA csName(name);
  5642. spConfig->WriteConfigValue("SCI", "name", name);
  5643. CSimpleStringA csVendor = csName.SubString(0, 2);
  5644. Dbg("sci vendor: %s",(const char*)csVendor);
  5645. //怡化:YH;广电:YT;中航:ZH;南天:NT,中世顺:ZS;中钞科堡 CK,长城:CC,东方通信:DX
  5646. if (csVendor.Compare("CK") == 0)
  5647. spConfig->WriteConfigValue("SCI", "Vendor","keba");
  5648. else if (csVendor.Compare("YT") == 0)
  5649. spConfig->WriteConfigValue("SCI", "Vendor", "grg");
  5650. else if (csVendor.Compare("NT") == 0)
  5651. spConfig->WriteConfigValue("SCI", "Vendor", "nantian");
  5652. else if (csVendor.Compare("ZS") == 0)
  5653. spConfig->WriteConfigValue("SCI", "Vendor", "zss");
  5654. else if (csVendor.Compare("CC") == 0)
  5655. spConfig->WriteConfigValue("SCI", "Vendor", "GWI");
  5656. else if (csVendor.Compare("DX") == 0) {
  5657. spConfig->WriteConfigValue("SCI", "Vendor", "EastCom");
  5658. }
  5659. else {
  5660. spConfig->WriteConfigValue("SCI", "Vendor", (const char*)csVendor);
  5661. }
  5662. } else {
  5663. spConfig->WriteConfigValue("SCI", "Vendor", "");
  5664. spConfig->WriteConfigValue("SCI", "name", "");
  5665. m_csDevSN = "";
  5666. }
  5667. return Error_Succeed;
  5668. }
  5669. void CCardIssuerFSM::GetVendorDllName(CSimpleStringA &strDevAdaptorPath)
  5670. {
  5671. if (m_csMachineType.Compare("RVC.Stand2S") == 0 || m_csMachineType.Compare("RVC.CardStore") == 0
  5672. || m_csMachineType.Compare("RVC.Desk1S") == 0
  5673. || (m_csMachineType.Compare("RVC.Desk2S") == 0 && m_majorVerion == 2 && (m_minorVerion == 0 || m_minorVerion == 1)))
  5674. {
  5675. SpGetDevAdaptorPath(m_pEntity, GetEntityBase()->GetEntityName(), strDevAdaptorPath);
  5676. return;
  5677. }
  5678. CSmartPointer<IConfigInfo> spConfigRoot,spConfigRun;
  5679. ErrorCodeEnum eErr = Error_Unexpect;
  5680. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  5681. if (eErr == Error_Succeed)
  5682. {
  5683. CSimpleStringA str("");
  5684. strDevAdaptorPath = "CardIssuer";
  5685. spConfigRun->ReadConfigValue("SCI", "Vendor", str);
  5686. if (!str.IsNullOrEmpty())
  5687. {
  5688. strDevAdaptorPath += ".";
  5689. strDevAdaptorPath += str;
  5690. }
  5691. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, str);
  5692. //一代便携式发卡器
  5693. const int SCIVersion = IsValidSCIName(m_csDevSN, m_csDevSN.GetLength());
  5694. if(SCIVersion == 1) {
  5695. // 南天更换新硬件驱动 [11/6/2019 16:47 @Gifur]
  5696. if(m_csDevSN.IsStartWith("NTSCIB", true)) {
  5697. strDevAdaptorPath += ".1.5";
  5698. Dbg("nantian new version device.");
  5699. } else {
  5700. //oilyang@20171228 根据和邱总讨论结果,便携卡机固定1.4
  5701. strDevAdaptorPath += ".1.4";
  5702. }
  5703. } else if(SCIVersion == 2){
  5704. // 新发卡器定义版本 [10/21/2019 8:35 @Gifur]
  5705. strDevAdaptorPath += ".1.20";
  5706. } else {
  5707. Dbg("find the cfg in the root.ini!!!");
  5708. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
  5709. if (eErr == Error_Succeed) {
  5710. //当运行时没有厂商名称时
  5711. if(strDevAdaptorPath.Compare("CardIssuer", true) == 0) {
  5712. str.Clear();
  5713. spConfigRoot->ReadConfigValue("Device.CardIssuer", "Vendor", str);
  5714. if (!str.IsNullOrEmpty())
  5715. {
  5716. strDevAdaptorPath += ".";
  5717. strDevAdaptorPath += str;
  5718. }
  5719. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, str);
  5720. }
  5721. str.Clear();
  5722. spConfigRoot->ReadConfigValue("Device.CardIssuer", "Version", str);
  5723. if (!str.IsNullOrEmpty())
  5724. {
  5725. strDevAdaptorPath += ".";
  5726. strDevAdaptorPath += str;
  5727. }
  5728. str.Clear();
  5729. spConfigRoot->ReadConfigValue("Device.CardIssuer", "Batch", str);
  5730. if (!str.IsNullOrEmpty())
  5731. {
  5732. strDevAdaptorPath += ".";
  5733. strDevAdaptorPath += str;
  5734. }
  5735. } else {
  5736. Dbg("Error occurs when open root config: %d", eErr);
  5737. }
  5738. }
  5739. CSimpleStringA strDepPath;
  5740. GetEntityBase()->GetFunction()->GetPath("Dep", strDepPath);
  5741. #ifdef RVC_OS_WIN
  5742. strDevAdaptorPath = CSimpleStringA::Format("%s\\%s.dll",
  5743. (const char*)strDepPath,
  5744. (const char*)strDevAdaptorPath);
  5745. #else
  5746. strDevAdaptorPath = CSimpleStringA::Format("%s/%s.so",
  5747. (const char*)strDepPath,
  5748. (const char*)strDevAdaptorPath);
  5749. #endif
  5750. }
  5751. return;
  5752. }
  5753. void CCardIssuerFSM::GetSCINo(CSimpleStringA &sciNo)
  5754. {
  5755. sciNo = m_csDevSN;
  5756. }
  5757. bool CCardIssuerFSM::AccountExchange(const char *origAcc, CSimpleStringA &acc, int dir)
  5758. {
  5759. int len = strlen(origAcc);
  5760. if (len < 8)
  5761. {
  5762. Dbg("account size error:%d",len);
  5763. return false;
  5764. }
  5765. CSimpleStringA csTmp(' ',len+1);
  5766. csTmp[len] = '\0';
  5767. if (dir)
  5768. {
  5769. int size, max;
  5770. size = max = len / 4;
  5771. if (len < 16)
  5772. max = 4;
  5773. for (int i = 0; i < max; i++)
  5774. {
  5775. csTmp[i * size] = *(origAcc + i);
  5776. csTmp[i * size + 1] = *(origAcc + 4 + i);
  5777. if (8 + i < len)
  5778. csTmp[i * size + 2] = *(origAcc + 8 + i);
  5779. if (12 + i < len)
  5780. csTmp[i * size + 3] = *(origAcc + 12 + i);
  5781. }
  5782. if (len % 4 != 0)
  5783. {
  5784. for (int j = 4 * (len / 4); j < len; j++)
  5785. csTmp[j] = *(origAcc + j);
  5786. }
  5787. acc = csTmp;
  5788. }
  5789. else
  5790. {
  5791. int size, max;
  5792. size = max = len / 4;
  5793. if (len < 16)
  5794. max = 4;
  5795. for (int i = 0; i < size; i++)
  5796. {
  5797. csTmp[i * 4] = *(origAcc + i);
  5798. csTmp[i * 4 + 1] = *(origAcc + size + i);
  5799. csTmp[i * 4 + 2] = *(origAcc + 2*size + i);
  5800. csTmp[i * 4 + 3] = *(origAcc + 3*size + i);
  5801. }
  5802. if (len % 4 != 0)
  5803. {
  5804. for (int j = 4 * (len / 4); j < len; j++)
  5805. csTmp[j] = *(origAcc + j);
  5806. }
  5807. acc = csTmp;
  5808. }
  5809. return true;
  5810. }
  5811. bool CCardIssuerFSM::WriteSlotInfo(CSmartPointer<IConfigInfo> &cfgRun, const char *acc, const char *cardSerial, int slot, bool bClear)
  5812. {
  5813. char buf[8];
  5814. ZeroMemory(buf, 8);
  5815. int sum = 0;
  5816. cfgRun->ReadConfigValueInt("SlotInfo", "count", sum);
  5817. if (bClear)
  5818. {
  5819. cfgRun->WriteConfigValue("SlotInfo", _itoa(slot, buf, 10), "0,0,0");
  5820. return true;
  5821. }
  5822. CSimpleStringA csAcc("");
  5823. if (AccountExchange(acc, csAcc))
  5824. {
  5825. csAcc = csAcc + ",1," + cardSerial;
  5826. cfgRun->WriteConfigValue("SlotInfo", _itoa(slot, buf, 10), csAcc);
  5827. sum++;
  5828. cfgRun->WriteConfigValueInt("SlotInfo", "count", sum);
  5829. return true;
  5830. }
  5831. return false;
  5832. }
  5833. bool CCardIssuerFSM::ReadSlotInfo(CSmartPointer<IConfigInfo> &cfgRun, CSimpleStringA &acc, CSimpleStringA &cardSerial, int slot, int &hasCard)
  5834. {
  5835. char buf[8];
  5836. ZeroMemory(buf, 8);
  5837. CSimpleStringA csAcc("");
  5838. cfgRun->ReadConfigValue("SlotInfo", _itoa(slot, buf, 10), csAcc);
  5839. CAutoArray<CSimpleStringA> arr = csAcc.Split(',');
  5840. if (arr.GetCount() < 3)
  5841. {
  5842. //Dbg("data error.size:%d",arr.GetCount());
  5843. return false;
  5844. }
  5845. if (arr[1].Compare("1") == 0)
  5846. hasCard = 1;
  5847. else
  5848. hasCard = 0;
  5849. csAcc = arr[0];
  5850. cardSerial = arr[2];
  5851. Dbg("account length: %d", strlen(csAcc));
  5852. if (AccountExchange(csAcc, acc, 0))
  5853. {
  5854. return true;
  5855. }
  5856. return false;
  5857. }
  5858. bool CCardIssuerFSM::WriteCardInfo(CSmartPointer<IConfigInfo> &cfgRun, const char *acc, const char* serial, int slot, bool bClear, bool bHasCard)
  5859. {
  5860. char buf[8];
  5861. ZeroMemory(buf, 8);
  5862. if (bClear || !bHasCard)
  5863. {
  5864. cfgRun->WriteConfigValue("OperateCardStore", _itoa(slot, buf, 10), "0,0,0");
  5865. return true;
  5866. }
  5867. CSimpleStringA csAcc("");
  5868. if (AccountExchange(acc, csAcc))
  5869. {
  5870. CSimpleStringA tmp("1,");
  5871. csAcc = tmp + csAcc + "," + serial;
  5872. cfgRun->WriteConfigValue("OperateCardStore", _itoa(slot, buf, 10), (const char*)csAcc);
  5873. return true;
  5874. }
  5875. return false;
  5876. }
  5877. bool CCardIssuerFSM::ReadCardInfo(CSmartPointer<IConfigInfo> &cfgRun, CSimpleStringA &acc, CSimpleStringA &serial, int slot)
  5878. {
  5879. char buf[8];
  5880. ZeroMemory(buf, 8);
  5881. CSimpleStringA csAcc("");
  5882. cfgRun->ReadConfigValue("OperateCardStore", _itoa(slot, buf, 10), csAcc);
  5883. CAutoArray<CSimpleStringA> arr = csAcc.Split(',');
  5884. if (arr.GetCount() < 3)
  5885. {
  5886. //Dbg("data error.size:%d",arr.GetCount());
  5887. return false;
  5888. }
  5889. csAcc = arr[1];
  5890. serial = arr[2];
  5891. if(strlen(csAcc) < 8 || serial.GetLength() <= 0)
  5892. {
  5893. return false;
  5894. }
  5895. if (AccountExchange(csAcc, acc, 0))
  5896. {
  5897. return true;
  5898. }
  5899. return false;
  5900. }
  5901. bool CCardIssuerFSM::SetSlotFlag(int slot, bool bReset,bool bClear)
  5902. {
  5903. return true;
  5904. }
  5905. void CCardIssuerFSM::ClearAllLocalSlotInfo()
  5906. {
  5907. LOG_FUNCTION();
  5908. CSmartPointer<IConfigInfo> spConfigRun;
  5909. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  5910. if (eErr != Error_Succeed)
  5911. {
  5912. Dbg("open runcfg failed.%d", eErr);
  5913. return;
  5914. }
  5915. for (int i = 0; i < m_maxSlot; i++)
  5916. {
  5917. WriteSlotInfo(spConfigRun, "", "",i, true);
  5918. }
  5919. }
  5920. int CCardIssuerFSM::PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx)
  5921. {
  5922. HeartBeatService_ClientBase *pHeartBeatClient = NULL;
  5923. ErrorCodeEnum eErr = Error_Unexpect;
  5924. pHeartBeatClient = new HeartBeatService_ClientBase(GetEntityBase());
  5925. if (pHeartBeatClient != NULL) {
  5926. eErr = pHeartBeatClient->Connect();
  5927. if(eErr != Error_Succeed)
  5928. pHeartBeatClient->SafeDelete();
  5929. }
  5930. else
  5931. {
  5932. Dbg("pGuiConsoleClient is null?");
  5933. ctx->Answer(Error_Unexpect);
  5934. return 0;
  5935. }
  5936. m_crossStart = GetTickCountRVC();
  5937. if (eErr == Error_Succeed)
  5938. {
  5939. if (pHeartBeatClient != NULL)
  5940. {
  5941. m_crossCtx = ctx;
  5942. HeartBeatService_CardActive_Req req;
  5943. HeartBeatService_CardActive_Ans ans;
  5944. req.type = 0;
  5945. req.account = ctx->Req.account;
  5946. req.term = ctx->Req.termNo;
  5947. req.data = ctx->Req.businessData;
  5948. req.slot = ctx->Req.slot;
  5949. eErr = pHeartBeatClient->CardActive(req, ans, 60000);
  5950. Dbg("card active result:%x", eErr);
  5951. pHeartBeatClient->GetFunction()->CloseSession();
  5952. pHeartBeatClient = NULL;
  5953. }
  5954. }
  5955. return 0;
  5956. }
  5957. void CCardIssuerFSM::NotifyPreOnline(unsigned long errCode, unsigned long findCard, unsigned long cardPos, CSimpleStringA data)
  5958. {
  5959. UINT64 crossEnd = GetTickCountRVC();
  5960. //in 110 second
  5961. if (m_crossCtx != NULL)
  5962. {
  5963. if ((crossEnd - m_crossStart) < 110 * 1000)
  5964. {
  5965. m_crossCtx->Ans.cardPos = cardPos;
  5966. m_crossCtx->Ans.findCard = findCard;
  5967. m_crossCtx->Ans.result = data;
  5968. Dbg("notify result:%d",errCode);
  5969. m_crossCtx->Answer((ErrorCodeEnum)errCode);
  5970. }
  5971. m_crossCtx = NULL;
  5972. }
  5973. }
  5974. int CCardIssuerFSM::IssueCardFromStore(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx,bool bSpec)
  5975. {
  5976. LOG_FUNCTION();
  5977. ErrorCodeEnum eErr = Error_Unexpect;
  5978. eErr = m_pCardIssuer->MoveCardFromSlot(ctx->Req.reserved1[0]);
  5979. if (eErr == Error_Succeed)
  5980. {
  5981. //oiltmp 只为杭州中心门禁
  5982. if (ctx->Req.hopper == 97)
  5983. {
  5984. ctx->Answer(Error_Succeed);
  5985. return 0;
  5986. }
  5987. CardNo card;
  5988. ctx->Ans.reserved1.Init(3);
  5989. ctx->Ans.reserved2.Init(2);
  5990. eErr = m_pCardIssuer->ReadAccount(card);
  5991. if (eErr == Error_Succeed && ctx->Req.reserved2[0].GetLength() == card.dwSize && strncmp(card.account, ctx->Req.reserved2[0], card.dwSize) == 0)
  5992. {
  5993. Dbg("ReadAccount ok.");
  5994. m_currCardNo = card.account;
  5995. if (card.dwSize > 6)
  5996. Dbg("acc:%s****%s", (const char*)m_currCardNo.SubString(0, 6), (const char*)m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4));
  5997. ctx->Ans.reserved1[0] = 0;
  5998. ctx->Ans.reserved1[1] = 0;
  5999. if (bSpec)
  6000. {
  6001. ctx->Ans.reserved1[1] = 4;
  6002. if (eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 32)
  6003. ctx->Ans.reserved2[0] = card.account;
  6004. else
  6005. ctx->Ans.reserved2[0] = "";
  6006. //oilyang@20171214 直接吐卡 @宋锐
  6007. EjectTask *task = new EjectTask(this);
  6008. task->ctx = NULL;
  6009. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  6010. ctx->Answer(Error_Succeed);
  6011. return 6;
  6012. }
  6013. }
  6014. else
  6015. {
  6016. ctx->Ans.reserved1[0] = 3;
  6017. if (bSpec)
  6018. {
  6019. if (eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 32)
  6020. ctx->Ans.reserved2[0] = card.account;
  6021. else
  6022. ctx->Ans.reserved2[0] = "";
  6023. if (ctx->Req.hopper == 98)
  6024. {
  6025. ctx->Ans.reserved1[1] = 4;
  6026. //oilyang@20171214 直接吐卡 @宋锐
  6027. EjectTask *task = new EjectTask(this);
  6028. task->ctx = NULL;
  6029. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  6030. ctx->Answer(Error_Succeed);
  6031. return 6;
  6032. }
  6033. if (ctx->Req.hopper == 100)
  6034. {
  6035. int ret = 2;
  6036. ctx->Ans.reserved1[1] = 5;
  6037. //zjw@20190506 直接吞卡 @宋锐
  6038. //这里改为同步,因为清卡操作要循环调用,以防本次还未吞卡结束又调用下一次清卡,导致流程混乱
  6039. eErr = MachineMoveCardBackNotHold();
  6040. if(eErr == Error_Succeed)
  6041. {
  6042. bool bCaptured = RegistCardWhileCaptureCard();
  6043. Dbg("to capture card.regist %d", bCaptured);
  6044. }
  6045. else
  6046. ret = 1;
  6047. m_CardCaptured++;
  6048. if(!SetCardCaptured(m_CardCaptured))
  6049. Dbg("set card captured failed.");
  6050. m_pCardProcess->DataInit();
  6051. if(Error_Succeed == eErr)
  6052. {
  6053. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  6054. if(eErr != Error_Succeed) {
  6055. //LogErrInfo("after capture,close shutter");
  6056. LogErrMsg("IssueCardFromStore::SetCardInType", eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, TRUE);
  6057. }
  6058. if(ctx != NULL)
  6059. ctx->Answer(Error_Succeed);
  6060. }
  6061. else
  6062. {
  6063. LogErrMsg("IssueCardFromStore::MachineMoveCardBackNotHold", eErr, CardIssuer_UserErrorCode_CaptureCard_Failed, TRUE);
  6064. //DevErrorInfo devErrInfo;
  6065. //m_pCardIssuer->GetLastErr(devErrInfo);
  6066. //Dbg("capture err %s",devErrInfo.szErrMsg);
  6067. if (ctx != NULL)
  6068. ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_Failed);
  6069. }
  6070. return ret;
  6071. }
  6072. }
  6073. else
  6074. {
  6075. eErr = m_pCardIssuer->MoveCardToSlot(ctx->Req.reserved1[0]);
  6076. if (eErr == Error_Succeed)
  6077. {
  6078. ctx->Ans.reserved1[1] = 1;
  6079. Dbg("accout not eqaul,card have been move back to slot.");
  6080. ctx->Answer(Error_Succeed);
  6081. return 2;
  6082. }
  6083. else
  6084. {
  6085. RegistCardWhileCaptureCard();
  6086. eErr = MachineMoveCardBackNotHold();
  6087. if (eErr == Error_Succeed)
  6088. {
  6089. ctx->Ans.reserved1[1] = 2;
  6090. Dbg("accout not eqaul,card move back to slot failed,capture card suc.");
  6091. ctx->Answer(Error_Succeed);
  6092. return 2;
  6093. }
  6094. else
  6095. {
  6096. ctx->Ans.reserved1[1] = 3;
  6097. Dbg("accout not eqaul,card move back to slot failed,capture card failed.");
  6098. }
  6099. }
  6100. }
  6101. }
  6102. ctx->Answer(Error_Succeed);
  6103. }
  6104. else
  6105. {
  6106. //Dbg("MoveCardFromSlot failed.%d",eErr);
  6107. LogErrMsg("IssueCardFromStore::MoveCardFromSlot", eErr, MEC_DEVAPI_CARDISSUER_MoveCardFromSlot, TRUE);
  6108. ctx->Answer(Error_Unexpect);
  6109. return 2;
  6110. }
  6111. return 0;
  6112. }
  6113. int CCardIssuerFSM::AddCardToStoreStepFirst(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
  6114. {
  6115. LOG_FUNCTION();
  6116. m_addCardNo = "";
  6117. m_addCardSerial = "";
  6118. ErrorCodeEnum eErr = Error_Unexpect;
  6119. eErr = m_pCardIssuer->MoveCard(CI_MOVECARD_FROM_HOPPER,99);
  6120. Dbg("add card first result:%d",eErr);
  6121. ctx->Ans.reserved1.Init(4);
  6122. ctx->Ans.reserved2.Init(2);
  6123. //oiltest@20180704 for songrui
  6124. //ctx->Ans.reserved1[2] = 0;
  6125. //CardNo cardtmp;
  6126. //m_pCardIssuer->ReadAccount(cardtmp);
  6127. //if (eErr != Error_Succeed)
  6128. //ctx->Ans.reserved1[2] = 3;
  6129. //else
  6130. //ctx->Ans.reserved1[2] = 0;
  6131. //ctx->Answer(Error_Succeed);
  6132. //return 0;
  6133. if (eErr == Error_Succeed)
  6134. {
  6135. CardNo card;
  6136. ctx->Ans.reserved2[0] = "";
  6137. eErr = m_pCardIssuer->ReadAccount(card);
  6138. bool bDataOK = true;//oilyang@20171213 是否读卡失败,是否解析出卡序号,否则吞卡 @宋锐
  6139. if (eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 64)
  6140. {
  6141. Dbg("read account ok.");
  6142. Track2Data track2Data;
  6143. track2Data.status = 0;
  6144. track2Data.t2Account = "";
  6145. char *tmpMag2 = new char[256];
  6146. ZeroMemory(tmpMag2, 256);
  6147. bool bT2OK = false, bT3OK = false;
  6148. if (card.dwTrack2Size > 0 && card.dwTrack2Size < 41)
  6149. {
  6150. //oilyang@20171129 IC卡等效二磁道数据可能存在补F的情况
  6151. if (card.track2[card.dwTrack2Size - 1] == 'F')
  6152. {
  6153. card.track2[card.dwTrack2Size - 1] = '\0';
  6154. card.dwTrack2Size--;
  6155. }
  6156. bT2OK = true;
  6157. }
  6158. if (card.dwTrack3Size > 0 && card.dwTrack3Size < 150)
  6159. bT3OK = true;
  6160. DecodeTracksData(card.track2, card.dwTrack2Size, card.track3, card.dwTrack3Size, tmpMag2, bT2OK, bT3OK);
  6161. if (SplitTrack2(tmpMag2, track2Data) == 0)
  6162. {
  6163. Dbg("set card serial %s", (const char*)track2Data.t2CardSerial);
  6164. ctx->Ans.reserved2[1] = track2Data.t2CardSerial;
  6165. m_addCardSerial = track2Data.t2CardSerial;
  6166. }
  6167. ctx->Ans.reserved1[2] = 0;
  6168. Dbg("account size:%d", card.dwSize);
  6169. m_currCardNo = m_addCardNo = ctx->Ans.reserved2[0] = CSimpleStringA(card.account, card.dwSize);
  6170. if (card.dwSize > 6)
  6171. Dbg("acc:%s****%s", (const char*)ctx->Ans.reserved2[0].SubString(0, 6), (const char*)ctx->Ans.reserved2[0].SubString(ctx->Ans.reserved2[0].GetLength() - 4, 4));
  6172. if (m_addCardSerial.GetLength() > 0)
  6173. {
  6174. ctx->Answer(Error_Succeed);
  6175. }
  6176. else
  6177. bDataOK = false;
  6178. }
  6179. else
  6180. bDataOK = false;
  6181. if (!bDataOK)
  6182. {
  6183. Dbg("read card failed,to capture card.%d,serial:%s",eErr,(const char*)m_addCardSerial);
  6184. ctx->Ans.reserved1[2] = 1;
  6185. RegistCardWhileCaptureCard();
  6186. eErr = MachineMoveCardBackNotHold();
  6187. ctx->Answer(Error_Succeed);
  6188. if (eErr == Error_Succeed)
  6189. return 2;
  6190. }
  6191. }
  6192. else
  6193. {
  6194. //oiltest need to add
  6195. Dbg("move card from card box to card reader failed.%d",eErr);
  6196. ctx->Ans.reserved1[2] = 3;
  6197. ctx->Answer(Error_Succeed);
  6198. return 2;
  6199. }
  6200. return 0;
  6201. }
  6202. int CCardIssuerFSM::AddCardToStoreStepLast(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
  6203. {
  6204. LOG_FUNCTION();
  6205. ErrorCodeEnum eErr = Error_Unexpect;
  6206. int slot = FindFirstEmptySlot();
  6207. if (slot < 0)
  6208. {
  6209. ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_KakuFindEmptySlot_Failed);
  6210. return 0;
  6211. }
  6212. ctx->Ans.reserved1.Init(4);
  6213. ctx->Ans.reserved2.Init(2);
  6214. eErr = m_pCardIssuer->MoveCardToSlot(slot);
  6215. if (eErr == Error_Succeed)
  6216. {
  6217. Dbg("move card to slot %d suc.",slot);
  6218. m_currCardNo = "";
  6219. ctx->Ans.reserved1[0] = slot;
  6220. ctx->Ans.reserved1[2] = 0;
  6221. ctx->Ans.reserved2[0] = "";
  6222. CSmartPointer<IConfigInfo> spConfigRun;
  6223. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  6224. if (eErr != Error_Succeed)
  6225. {
  6226. Dbg("open runcfg to write slot info failed.%d",eErr);
  6227. }
  6228. else
  6229. WriteSlotInfo(spConfigRun, (const char*)m_addCardNo,(const char*)m_addCardSerial, slot);
  6230. ctx->Answer(Error_Succeed);
  6231. return 2;
  6232. }
  6233. else
  6234. {
  6235. Dbg("move card to slot failed.to capture card.");
  6236. LogErrMsg("AddCardToStoreStepLast::MoveCardToSlot", eErr, MEC_DEVAPI_CARDISSUER_MoveCardToSlot, TRUE);
  6237. ctx->Ans.reserved1[2] = 2;
  6238. RegistCardWhileCaptureCard();
  6239. MachineMoveCardBackNotHold();
  6240. ctx->Answer(Error_Succeed);
  6241. return 2;
  6242. }
  6243. ctx->Answer(Error_Succeed);
  6244. return 0;
  6245. }
  6246. int CCardIssuerFSM::FindFirstEmptySlot()
  6247. {
  6248. LOG_FUNCTION();
  6249. SlotStatus status;
  6250. ErrorCodeEnum eErr = m_pCardIssuer->QuerySlotsStatus(status, 0,true);
  6251. if (eErr != Error_Succeed)
  6252. {
  6253. LogErrMsg("FindFirstEmptySlot::QuerySlotsStatus", eErr, MEC_DEVAPI_CARDISSUER_QuerySlotsStatus, TRUE);
  6254. return -1;
  6255. }
  6256. for (int i = 0; i < status.dwSize; i++)
  6257. {
  6258. if (status.status[i] == 0)
  6259. {
  6260. Dbg("find slot %d ok.",i);
  6261. return i;
  6262. }
  6263. }
  6264. Dbg("can't find a empty slot in %d",status.dwSize);
  6265. return -1;
  6266. }
  6267. bool CCardIssuerFSM::IsValidSlotNum(const int slot)
  6268. {
  6269. if (m_maxSlot == 0 || slot < 0 || slot >= m_maxSlot)
  6270. return false;
  6271. return true;
  6272. }
  6273. bool CCardIssuerFSM::IsSlotHasCard(const int slot)
  6274. {
  6275. if (m_pCardIssuer != NULL)
  6276. {
  6277. SlotStatus status;
  6278. ErrorCodeEnum eErr = m_pCardIssuer->QuerySlotsStatus(status, slot);
  6279. Dbg("slot:%d,ret:%d,status:%d", slot,eErr, status.status[slot]);
  6280. if (eErr == Error_Succeed && status.status[slot] == 1)
  6281. return true;
  6282. }
  6283. return false;
  6284. }
  6285. void CCardIssuerFSM::AfterPreOnlineOnStore(ErrorCodeEnum err, const int slot)
  6286. {
  6287. LOG_FUNCTION();
  6288. ErrorCodeEnum eErr = Error_Unexpect;
  6289. if (err == Error_Param)//oilyang@20171201 暂时不会进这里了,根据郭丹说明,所有跨机操作优先把卡移回卡槽
  6290. {
  6291. RegistCardWhileCaptureCard();
  6292. eErr = MachineMoveCardBackNotHold();
  6293. if (eErr == Error_Succeed)
  6294. m_cardPos = 2;
  6295. else
  6296. m_cardPos = 3;
  6297. }
  6298. else
  6299. {
  6300. eErr = m_pCardIssuer->MoveCardToSlot(slot);
  6301. if (eErr == Error_Succeed)
  6302. {
  6303. Dbg("move card back to slot %d suc.",slot);
  6304. m_cardPos = 1;
  6305. }
  6306. else
  6307. {
  6308. LogErrMsg("GetDevStatus::AfterPreOnlineOnStore", eErr, MEC_DEVAPI_CARDISSUER_MoveCardToSlot, TRUE);
  6309. //Dbg("move card back to slot failed.%d",eErr);
  6310. RegistCardWhileCaptureCard();
  6311. eErr = MachineMoveCardBackNotHold();
  6312. if (eErr == Error_Succeed)
  6313. m_cardPos = 2;
  6314. else
  6315. m_cardPos = 3;
  6316. }
  6317. }
  6318. GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "N");
  6319. }
  6320. bool CCardIssuerFSM::OperateCardStore(CSmartPointer<IConfigInfo> &spConfigRun, int slot, int& status)
  6321. {
  6322. ErrorCodeEnum eErr = Error_Unexpect;
  6323. DevErrorInfo devErrorInfo;
  6324. eErr = m_pCardIssuer->MoveCardFromSlot(slot);
  6325. if(eErr == Error_Succeed)
  6326. {
  6327. CardNo card;
  6328. ZeroMemory(card.account, sizeof(card.account));
  6329. eErr = m_pCardIssuer->ReadAccount(card);
  6330. bool bDataOK = true;
  6331. //读卡成功并解析出卡序号,才算成功,卡序号也要返回
  6332. if(eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 64)
  6333. {
  6334. Dbg("read account OK.");
  6335. Track2Data track2Data;
  6336. track2Data.status = 0;
  6337. track2Data.t2Account = "";
  6338. char * tmpMag2 = new char[256];
  6339. ZeroMemory(tmpMag2, 256);
  6340. bool bT2OK = false, bT3OK = false;
  6341. if (card.dwTrack2Size > 0 && card.dwTrack2Size < 41)
  6342. {
  6343. //IC卡等效二磁道数据可能存在补F的情况(参考oilyang@20171129)
  6344. if(card.track2[card.dwTrack2Size - 1] == 'F')
  6345. {
  6346. card.track2[card.dwTrack2Size - 1] = '\0';
  6347. card.dwTrack2Size--;
  6348. }
  6349. bT2OK = true;
  6350. }
  6351. if(card.dwTrack3Size > 0 && card.dwTrack3Size < 150)
  6352. bT3OK = true;
  6353. DecodeTracksData(card.track2, card.dwTrack2Size, card.track3, card.dwTrack3Size, tmpMag2, bT2OK, bT3OK);
  6354. if (SplitTrack2(tmpMag2, track2Data) == 0)
  6355. {
  6356. Dbg("set card serial %s", (const char*)track2Data.t2CardSerial);
  6357. m_addCardSerial = track2Data.t2CardSerial;
  6358. }
  6359. m_currCardNo = card.account;
  6360. Dbg("account size:%d", card.dwSize);
  6361. /*if(card.dwSize > 6)
  6362. Dbg("account: %s", (const char*)m_currCardNo);*/
  6363. if(card.dwSize > 6)
  6364. Dbg("account: %s****%s", (const char*)m_currCardNo.SubString(0, 6), (const char*)m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4));
  6365. if(m_addCardSerial.GetLength() <= 0)
  6366. bDataOK = false;
  6367. }
  6368. else
  6369. {
  6370. bDataOK = false;
  6371. }
  6372. if(!bDataOK)
  6373. {
  6374. LogErrMsg("OperateCardStore::ReadAccount", eErr, MEC_DEVAPI_CARDISSUER_ReadAccount, TRUE);
  6375. //m_pCardIssuer->GetLastErr(devErrorInfo);
  6376. //Dbg("read card(slot %d) info failed: %s(%d).", slot, devErrorInfo.szErrMsg, eErr);
  6377. Dbg("capture card...");
  6378. status = 2;
  6379. RegistCardWhileCaptureCard();
  6380. eErr = MachineMoveCardBackNotHold();
  6381. }
  6382. else
  6383. {
  6384. eErr = m_pCardIssuer->MoveCardToSlot(slot);
  6385. if(eErr == Error_Succeed)
  6386. {
  6387. if(WriteCardInfo(spConfigRun, m_currCardNo, m_addCardSerial, slot, false, true))
  6388. {
  6389. spConfigRun->WriteConfigValueInt("OperateCardStore", "SlotNum", slot);//记录已盘库到哪个槽
  6390. Dbg("operate slot(%d) success.", slot);
  6391. status = 0;
  6392. return true;
  6393. }
  6394. else
  6395. {
  6396. Dbg("operate slot(%d) success, but write card info to cardissuer.ini failed.");
  6397. }
  6398. }
  6399. else
  6400. {
  6401. //移回卡槽不成功,登记并吞卡
  6402. LogErrMsg("OperateCardStore::MoveCardToSlot", eErr, MEC_DEVAPI_CARDISSUER_MoveCardToSlot, TRUE);
  6403. //m_pCardIssuer->GetLastErr(devErrorInfo);
  6404. //Dbg("move card to slot(%d) failed: %s(%d).", slot, devErrorInfo.szErrMsg, eErr);
  6405. Dbg("capture card...");
  6406. status = 3;
  6407. RegistCardWhileCaptureCard();
  6408. MachineMoveCardBackNotHold();
  6409. }
  6410. }
  6411. }
  6412. else
  6413. {
  6414. //m_pCardIssuer->GetLastErr(devErrorInfo);
  6415. Dbg("move card from slot(%d) to cardreader failed!", slot);
  6416. LogErrMsg("OperateCardStore::MoveCardFromSlot", eErr, MEC_DEVAPI_CARDISSUER_MoveCardFromSlot, TRUE);
  6417. status = 1;
  6418. }
  6419. return false;
  6420. }
  6421. int CCardIssuerFSM::QueryCardInfoOnStore(SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req, CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx)
  6422. {
  6423. LOG_FUNCTION();
  6424. if(!ctx->Req.reserved1)
  6425. {
  6426. //原有业务
  6427. ctx->Ans.findCard = m_findCard;
  6428. ctx->Ans.cardPos = m_cardPos;
  6429. Dbg("query findCard:%d,cardPos:%d",ctx->Ans.findCard,ctx->Ans.cardPos);
  6430. ctx->Answer(Error_Succeed);
  6431. return 2;
  6432. }
  6433. else
  6434. {
  6435. //新增盘库操作@20190422 by zjw
  6436. ErrorCodeEnum eErr = Error_Unexpect;
  6437. DevErrorInfo devErrorInfo;
  6438. bool bRet;
  6439. CSmartPointer<IConfigInfo> spConfigRun;
  6440. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  6441. if(eErr != Error_Succeed)
  6442. {
  6443. Dbg("Open runcfg failed(%d).", eErr);
  6444. ctx->Answer(Error_Unexpect);
  6445. return 2;
  6446. }
  6447. //开始盘库
  6448. if(ctx->Req.reserved1[0] == 1)
  6449. {
  6450. //检查是否有旧的盘库记录,若有,则返回给业务确定继续盘库or终止盘库;若无,则进行正常盘库
  6451. if(CheckHasPanKuRecord(spConfigRun))
  6452. {
  6453. Dbg("Has operation cardstore record, please make sure continue or break!");
  6454. ctx->Answer(Error_Param, CardIssuer_UserErrorCode_KakuHaveOldPanKuRecord);
  6455. return 2;
  6456. }
  6457. //如果没有旧的盘库操作,则重新开始盘库(先清理本地记录)
  6458. ClearLocalRecord(spConfigRun);
  6459. SlotStatus slotstatus;
  6460. eErr = m_pCardIssuer->QuerySlotsStatus(slotstatus, 0, true);
  6461. if(eErr != Error_Succeed)
  6462. {
  6463. LogErrMsg("QueryCardInfoOnStore::QuerySlotsStatus", eErr, MEC_DEVAPI_CARDISSUER_QuerySlotsStatus, TRUE);
  6464. //m_pCardIssuer->GetLastErr(devErrorInfo);
  6465. //Dbg("query slots status failed: %s(%d).", devErrorInfo.szErrMsg, eErr);
  6466. ctx->Answer(Error_Unexpect,AlarmDECToBusiness());
  6467. return 2;
  6468. }
  6469. spConfigRun->WriteConfigValueInt("OperateCardStore", "OperationFlag", 1);//设置盘库标志
  6470. int i = 0;
  6471. int status = 0;
  6472. for (; i < m_maxSlot; ++i)
  6473. {
  6474. Dbg("slot[%d] status: %d.", i, slotstatus.status[i]);
  6475. if(slotstatus.status[i] == 1)
  6476. {
  6477. bRet = OperateCardStore(spConfigRun, i, status);
  6478. if(!bRet)
  6479. break;
  6480. }
  6481. else
  6482. {
  6483. //该卡槽无卡
  6484. WriteCardInfo(spConfigRun, "", "", i);
  6485. }
  6486. }
  6487. //将卡信息返回给业务端
  6488. ReturnCardInfo(i, status, spConfigRun, ctx);
  6489. }
  6490. else if(ctx->Req.reserved1[0] == 2)
  6491. {
  6492. //有旧的盘库记录,继续接着盘库
  6493. SlotStatus slotstatus;
  6494. eErr = m_pCardIssuer->QuerySlotsStatus(slotstatus,0,true);
  6495. int slotNum;
  6496. spConfigRun->ReadConfigValueInt("OperateCardStore", "SlotNum", slotNum);
  6497. if(slotNum >= 0)
  6498. {
  6499. int status = 0;
  6500. int i = slotNum;
  6501. for(; i < m_maxSlot; ++i)
  6502. {
  6503. Dbg("slot[%d] status: %d.", i, slotstatus.status[i]);
  6504. if(slotstatus.status[i] == 1)
  6505. {
  6506. bRet = OperateCardStore(spConfigRun, i, status);
  6507. if(!bRet)
  6508. break;
  6509. }
  6510. else
  6511. {
  6512. //该卡槽无卡
  6513. WriteCardInfo(spConfigRun, "", "", i);
  6514. }
  6515. }
  6516. //将卡信息返回给业务端
  6517. ReturnCardInfo(i, status, spConfigRun, ctx);
  6518. }
  6519. else
  6520. {
  6521. Dbg("No operate cardstore record, please make sure!");
  6522. ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_KakuHaveNoPanKuRecord);
  6523. }
  6524. }
  6525. else if(ctx->Req.reserved1[0] == 3)
  6526. {
  6527. //有旧的盘库记录,终止盘库(清空本地记录)
  6528. ClearLocalRecord(spConfigRun);
  6529. ctx->Answer(Error_Succeed);
  6530. }
  6531. else if(ctx->Req.reserved1[0] = 4)
  6532. {
  6533. //查询是否有盘库记录
  6534. if(CheckHasPanKuRecord(spConfigRun))
  6535. {
  6536. Dbg("Has operation cardstore record!");
  6537. ctx->Ans.findCard = 1;
  6538. ctx->Answer(Error_Succeed);
  6539. }
  6540. else
  6541. {
  6542. Dbg("Has no operation cardstore record!");
  6543. ClearLocalRecord(spConfigRun);
  6544. ctx->Ans.findCard = 0;
  6545. ctx->Answer(Error_Succeed);
  6546. }
  6547. }
  6548. }
  6549. return 2;
  6550. }
  6551. bool CCardIssuerFSM::CheckHasPanKuRecord(CSmartPointer<IConfigInfo>&spConfigRun)
  6552. {
  6553. int operFlag, slotNum;
  6554. spConfigRun->ReadConfigValueInt("OperateCardStore", "OperationFlag", operFlag);
  6555. spConfigRun->ReadConfigValueInt("OperateCardStore", "SlotNum", slotNum);
  6556. if(operFlag == 1 && slotNum >= 0)
  6557. {
  6558. return true;
  6559. }
  6560. return false;
  6561. }
  6562. void CCardIssuerFSM::ClearLocalRecord(CSmartPointer<IConfigInfo>&spConfigRun)
  6563. {
  6564. spConfigRun->WriteConfigValueInt("OperateCardStore", "OperationFlag", 0);
  6565. spConfigRun->WriteConfigValueInt("OperateCardStore", "SlotNum", -1);
  6566. for (int i = 0; i < m_maxSlot; ++i)
  6567. {
  6568. WriteCardInfo(spConfigRun, "", "", i, true);
  6569. }
  6570. }
  6571. void CCardIssuerFSM::ReturnCardInfo(int slotNum, int status, CSmartPointer<IConfigInfo>&spConfigRun, SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req, CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx)
  6572. {
  6573. bool bRet;
  6574. if(slotNum == m_maxSlot && status == 0)
  6575. {
  6576. ctx->Ans.reserved1.Init(1);
  6577. ctx->Ans.reserved3.Init(m_maxSlot);
  6578. ctx->Ans.reserved4.Init(m_maxSlot);
  6579. Dbg("Operate CardStore success.");
  6580. for (int i = 0; i < m_maxSlot; ++i)
  6581. {
  6582. CSimpleStringA csAcc("");
  6583. CSimpleStringA serial("");
  6584. bRet = ReadCardInfo(spConfigRun, csAcc, serial, i);
  6585. if(bRet)
  6586. {
  6587. ctx->Ans.reserved3[i] = csAcc;
  6588. ctx->Ans.reserved4[i] = serial;
  6589. }
  6590. else
  6591. {
  6592. ctx->Ans.reserved3[i] = "0";
  6593. ctx->Ans.reserved4[i] = "0";
  6594. }
  6595. }
  6596. ctx->Ans.reserved1[0] = m_maxSlot;
  6597. //返回完成,清空本地记录
  6598. spConfigRun->WriteConfigValueInt("OperateCardStore", "OperationFlag", 0);
  6599. spConfigRun->WriteConfigValueInt("OperateCardStore", "SlotNum", -1);
  6600. for (int i = 0; i < m_maxSlot; ++i)
  6601. {
  6602. WriteCardInfo(spConfigRun, "", "", i, true);
  6603. }
  6604. ctx->Answer(Error_Succeed);
  6605. }
  6606. else
  6607. {
  6608. Dbg("operate cardstore failed in slot(%d).", slotNum);
  6609. ctx->Ans.reserved1.Init(2);
  6610. ctx->Ans.reserved1[0] = slotNum;
  6611. ctx->Ans.reserved1[1] = status;
  6612. ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_KakuPanKu_Failed);
  6613. }
  6614. return;
  6615. }
  6616. void CCardIssuerFSM::GetAddCardInfo(SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req, CardIssuerService_GetAddCardInfo_Ans>::Pointer ctx)
  6617. {
  6618. LOG_FUNCTION();
  6619. ErrorCodeEnum eErr;
  6620. if(!ctx->Req.reserved1)
  6621. {
  6622. //原有业务
  6623. CSmartPointer<IConfigInfo> spConfigRun;
  6624. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  6625. if (eErr != Error_Succeed)
  6626. {
  6627. Dbg("open runcfg failed.%d", eErr);
  6628. ctx->Answer(Error_Unexpect);
  6629. return;
  6630. }
  6631. ctx->Ans.count = 0;
  6632. CSimpleStringA csAcc(""), csCardSerial("");
  6633. int hasCard = 0;
  6634. bool bRet = false;
  6635. Dbg("ctx->Req.isSync = %d.", ctx->Req.isSync);
  6636. if (ctx->Req.isSync == 1)//clear local record
  6637. {
  6638. for (int i = 0; i < m_maxSlot; i++)
  6639. {
  6640. bRet = ReadSlotInfo(spConfigRun, csAcc, csCardSerial, i, hasCard);
  6641. if (bRet)
  6642. WriteSlotInfo(spConfigRun, "", "", i, true);
  6643. }
  6644. spConfigRun->WriteConfigValueInt("SlotInfo", "count",0);
  6645. ctx->Answer(Error_Succeed);
  6646. return;
  6647. }
  6648. int sum = 0;
  6649. spConfigRun->ReadConfigValueInt("SlotInfo", "count", sum);
  6650. Dbg("count = %d", sum);
  6651. if (sum > 0)
  6652. {
  6653. //ctx->Ans.slot.Init(sum);
  6654. //ctx->Ans.account.Init(sum);
  6655. //ctx->Ans.cardSerial.Init(sum);
  6656. //ctx->Ans.count = sum;
  6657. /*ctx->Ans.account.Init(m_maxSlot);
  6658. ctx->Ans.cardSerial.Init(m_maxSlot);
  6659. ctx->Ans.slot.Init(m_maxSlot);*/
  6660. for (int i = 0; i < m_maxSlot; i++)
  6661. {
  6662. bRet = ReadSlotInfo(spConfigRun, csAcc, csCardSerial, i, hasCard);
  6663. if (bRet)
  6664. {
  6665. ctx->Ans.account.Append(&csAcc, 0, 1);
  6666. ctx->Ans.cardSerial.Append(&csCardSerial, 0, 1);
  6667. ctx->Ans.slot.Append(&i, 0, 1);
  6668. }
  6669. }
  6670. ctx->Ans.count = ctx->Ans.account.GetCount();
  6671. if (ctx->Ans.count != sum)
  6672. Dbg("sum %d is not equals to real added recored %d.", sum, ctx->Ans.count);
  6673. Dbg("add record count:%d", ctx->Ans.account.GetCount());
  6674. }
  6675. }
  6676. else if(ctx->Req.reserved1[0] == 1)
  6677. {
  6678. ctx->Ans.reserved1.Init(1);
  6679. //获取卡库总容量
  6680. if(m_maxSlot > 0)
  6681. {
  6682. Dbg("CardStore account is: %d.", m_maxSlot);
  6683. ctx->Ans.reserved1[0] = m_maxSlot;
  6684. }
  6685. else
  6686. {
  6687. Dbg("CardStore account is less zero.");
  6688. }
  6689. //卡库数量盘点
  6690. DevErrorInfo devErrInfo;
  6691. int numOfHasCard = 0;
  6692. vector<int> slotNoOfHasCard;
  6693. SlotStatus slotstatus;
  6694. eErr = m_pCardIssuer->QuerySlotsStatus(slotstatus,0,true);
  6695. if (eErr == Error_Succeed)
  6696. {
  6697. for(int i = 0; i < m_maxSlot; ++i)
  6698. {
  6699. if(slotstatus.status[i] == 1)
  6700. {
  6701. Dbg("slot %d has card.", i);
  6702. slotNoOfHasCard.push_back(i);
  6703. numOfHasCard++;
  6704. }
  6705. }
  6706. Dbg("num of card in cardstore: %d.", numOfHasCard);
  6707. ctx->Ans.reserved2.Init(numOfHasCard + 1);
  6708. ctx->Ans.reserved2[0] = numOfHasCard;
  6709. for(int j = 0; j < numOfHasCard; ++j)
  6710. {
  6711. ctx->Ans.reserved2[j+1] = slotNoOfHasCard[j];
  6712. }
  6713. }
  6714. else
  6715. {
  6716. LogErrMsg("GetAddCardInfo::QuerySlotsStatus", eErr, MEC_DEVAPI_CARDISSUER_QuerySlotsStatus, TRUE);
  6717. //m_pCardIssuer->GetLastErr(devErrInfo);
  6718. //Dbg("Query slot status failed: %s(%d).", devErrInfo.szErrMsg, eErr);
  6719. }
  6720. }
  6721. ctx->Answer(Error_Succeed);
  6722. return;
  6723. }
  6724. void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size, char *&magData, bool bT2OK, bool bT3OK)
  6725. {
  6726. if (dwT2size <= 0 || strlen(track2) < 16)
  6727. {
  6728. Dbg("t2.size %d,strlen(t2):%d",dwT2size,strlen(track2));
  6729. return;
  6730. }
  6731. Dbg("track2.size:%d,track3.size:%d",dwT2size,dwT3size);
  6732. char tmpMag2_3[512] = { 0 };// , tmpMag2[256] = { 0 };
  6733. memcpy(tmpMag2_3, track2, dwT2size);
  6734. char cardType[8];
  6735. ZeroMemory(cardType, 8);
  6736. if (bT3OK && strlen(track3) > 1)
  6737. {
  6738. Dbg("do track 3(%d)",dwT3size);
  6739. memcpy(tmpMag2_3 + dwT2size, "A", 1);
  6740. memcpy(tmpMag2_3 + dwT2size + 1, track3, dwT3size);
  6741. cmdDecodeEx(tmpMag2_3, cardType, magData);
  6742. }
  6743. if (!bT3OK || strlen(cardType) < 4)
  6744. {
  6745. Dbg("no(%d) or wrong track 3(size:%d,strlen(%d)),%s",bT3OK,dwT3size,strlen(track3),cardType);
  6746. cmdDecodeMag2(tmpMag2_3, magData);
  6747. }
  6748. }
  6749. int CCardIssuerFSM::SplitDevModelInfo()
  6750. {
  6751. LOG_FUNCTION();
  6752. if (strlen(m_devCat.szModel) < 3)
  6753. {
  6754. Dbg("Wrong szModel:%s", m_devCat.szModel);
  6755. return -1;
  6756. }
  6757. m_csCM = "";
  6758. CSimpleStringA csTmpModel(m_devCat.szModel);
  6759. CAutoArray<CSimpleStringA> arrParam;
  6760. arrParam.Init(16);
  6761. arrParam = csTmpModel.Split('#');
  6762. for (int i = 0; i < arrParam.GetCount(); ++i)
  6763. {
  6764. if (_strnicmp(arrParam[i], "CM", 2) == 0)
  6765. {
  6766. m_csCM = arrParam[i].SubString(3, arrParam[i].GetLength() - 3);
  6767. }
  6768. }
  6769. Dbg("CM=%s", (const char*)m_csCM);
  6770. return 0;
  6771. }
  6772. void CCardIssuerFSM::CloseAndClearDevObj(bool bCheckConnecting, bool bCloseOnly)
  6773. {
  6774. LOG_FUNCTION();
  6775. if(bCheckConnecting) {
  6776. Dbg("check connecting flag");
  6777. }
  6778. if(bCloseOnly) {
  6779. Dbg("only to close device");
  6780. }
  6781. ErrorCodeEnum ec = Error_Unexpect;
  6782. if(m_bBTConncting) {
  6783. if(m_pCardIssuer != NULL) {
  6784. ec = m_pCardIssuer->DevClose();
  6785. Dbg("Try to invoke DevClose when connecting returned %d", ec);
  6786. }
  6787. if(bCheckConnecting) {
  6788. const int maxWaitTimes = 20;
  6789. int currentWaitTimes = 0;
  6790. do {
  6791. Dbg("waiting bluetooth connect operation finish...");
  6792. Sleep(500);
  6793. currentWaitTimes++;
  6794. if(currentWaitTimes >= maxWaitTimes) {
  6795. Dbg("Timeout break");
  6796. break;
  6797. }
  6798. } while (m_bBTConncting);
  6799. }
  6800. }
  6801. if(m_bBTConnected || m_bOpened) {
  6802. if(m_pCardIssuer != NULL) {
  6803. ec = m_pCardIssuer->DevClose();
  6804. Dbg("DevClose returned %d", ec);
  6805. } else {
  6806. Dbg("device adapter object is null?");
  6807. }
  6808. m_bBTConnected = false;
  6809. m_bOpened = false;
  6810. }
  6811. if (m_pCardIssuer != NULL && !bCloseOnly)
  6812. {
  6813. if(m_hVerdorDll != NULL) {
  6814. if(ReleaseDevComponent != NULL) {
  6815. Dbg("ReleaseDevComponent()...");
  6816. ec = ReleaseDevComponent((DeviceBaseClass*&)m_pCardIssuer);
  6817. if(ec != Error_Succeed) {
  6818. Dbg("ReleaseDevComponent failed: EC=%u", ec);
  6819. }
  6820. m_pCardIssuer = NULL;
  6821. } else {
  6822. assert(FALSE && "ReleaseDevComponent is null!");
  6823. }
  6824. CreateDevComponent = NULL;
  6825. ReleaseDevComponent = NULL;
  6826. Dbg("FreeLibrary returned %d", FreeLibrary(m_hVerdorDll));
  6827. m_hVerdorDll = NULL;
  6828. } else {
  6829. assert(FALSE && "vendor dll is null!!");
  6830. }
  6831. }
  6832. }
  6833. void CCardIssuerFSM::LogErrMsg(
  6834. const char *pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode /*= 0*/, BOOL bAlarm /*= FALSE*/,BOOL bError /*= FALSE*/)
  6835. {
  6836. WORD wdErrCode = 0;
  6837. CSimpleStringA csErrMsg(true);
  6838. ErrorCodeEnum ec = DeviceBaseHelper::GetAndSplitDevErrInfo(m_pCardIssuer, csErrMsg, wdErrCode,
  6839. bAlarm ? NULL : pMsgHead);
  6840. if(ec == Error_Succeed && wdErrCode != 0) {
  6841. //oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
  6842. if ((defaultDevCode >> 20) == m_entCode.dwEntityId)
  6843. UpdateDEC(defaultDevCode);
  6844. else
  6845. UpdateDEC(wdErrCode);
  6846. } else if(defaultDevCode != 0) {
  6847. UpdateDEC(defaultDevCode);
  6848. }
  6849. m_csAlarmMsg = CSimpleStringA::Format("%s failed EC= 0x%x : %s", pMsgHead, eErrCode, (LPCTSTR)csErrMsg);
  6850. if(bAlarm) {
  6851. if (bError)
  6852. LogWarn(Severity_Middle, eErrCode, AlarmDECToBusiness(), (LPCTSTR)m_csAlarmMsg);
  6853. else
  6854. LogWarn(Severity_Middle, eErrCode, AlarmDEC(), (LPCTSTR)m_csAlarmMsg);
  6855. }
  6856. return;
  6857. }
  6858. void CCardIssuerFSM::oiltest()
  6859. {
  6860. if (m_pCardIssuer != NULL)
  6861. {
  6862. ErrorCodeEnum eErr = Error_Unexpect;
  6863. int sum = 0;
  6864. eErr = m_pCardIssuer->GetSlotSum(sum);
  6865. if (eErr == Error_Succeed)
  6866. Dbg("max slot:%d",sum);
  6867. SlotStatus slotstatus;
  6868. eErr = m_pCardIssuer->QuerySlotsStatus(slotstatus,0,true);
  6869. if (eErr == Error_Succeed)
  6870. {
  6871. for (int i = 0; i < 10; ++i)
  6872. {
  6873. Dbg("slot %d,status %d",i,slotstatus.status[i]);
  6874. if (slotstatus.status[i] == 1)
  6875. {
  6876. eErr = m_pCardIssuer->MoveCardFromSlot(i);
  6877. if (eErr == Error_Succeed)
  6878. {
  6879. CardNo card;
  6880. ZeroMemory(card.account, sizeof(card.account));
  6881. eErr = m_pCardIssuer->ReadAccount(card);
  6882. if (eErr == Error_Succeed)
  6883. {
  6884. Dbg("slot %d,account:%s", i, card.account);
  6885. }
  6886. else
  6887. Dbg("read slot %d failed.%d", i, eErr);
  6888. if (i % 3 == 0)
  6889. {
  6890. Dbg("move card in slot %d to front gate.", i);
  6891. eErr = m_pCardIssuer->MoveCard(CI_MOVECARD_FRONT_GATE);
  6892. }
  6893. else if (i % 3 == 1)
  6894. {
  6895. //oiltest@20171114 for dx
  6896. Dbg("capture card in slot %d 22.", i);
  6897. eErr = m_pCardIssuer->MoveCard(CI_MOVECARD_FRONT_GATE);
  6898. //eErr = m_pCardIssuer->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
  6899. }
  6900. if (i % 3 == 2)
  6901. {
  6902. Dbg("move card in slot %d back to slot.", i);
  6903. eErr = m_pCardIssuer->MoveCardToSlot(i);
  6904. }
  6905. Sleep(5000);
  6906. }
  6907. else
  6908. Dbg("move card from slot failed.%d",eErr);
  6909. }
  6910. }
  6911. }
  6912. }
  6913. }
  6914. void CCardIssuerFSM::oiltestSCI(bool bSCI)
  6915. {
  6916. LOG_FUNCTION();
  6917. if (bSCI && !m_bChannelOK)
  6918. {
  6919. Dbg("SCI压力测试,安全通道建立不成功,终止测试");
  6920. return;
  6921. }
  6922. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  6923. CSmartPointer<IConfigInfo> spConfig;
  6924. ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  6925. if (eErrDev != Error_Succeed) {
  6926. Dbg("(set issue)open cfg file failed!");
  6927. return;
  6928. }
  6929. //三步循环:发卡,读卡,吐卡/吞卡
  6930. //第一步:发卡
  6931. ErrorCodeEnum errCode = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  6932. if (errCode != Error_Succeed)
  6933. {
  6934. //LogErrInfo("before issue,close shutter");
  6935. return;
  6936. }
  6937. int hopperRemains = 0, hopperSN = 1;
  6938. int captureCount = 0;//SCI测试,吞卡计数,吞够3张不再吞(看各厂商吞卡箱容量?)
  6939. while (true)
  6940. {
  6941. spConfig->ReadConfigValueInt("SCITest", "Hopper1Remains", hopperRemains);
  6942. if (hopperRemains == 0)
  6943. {
  6944. spConfig->ReadConfigValueInt("SCITest", "Hopper2Remains", hopperRemains);
  6945. if (hopperRemains == 0)
  6946. {
  6947. Dbg("卡箱1,卡箱2都没有卡片了");
  6948. Dbg("hopper 1 & 2 no more card.");
  6949. return;
  6950. }
  6951. else
  6952. {
  6953. hopperSN = 2;
  6954. }
  6955. }
  6956. Dbg("move card to holder");
  6957. //move card to holder
  6958. errCode = m_pCardIssuer->MoveCard(CI_MOVECARD_FROM_HOPPER, hopperSN);
  6959. Dbg("move card result %d.", errCode);
  6960. if (errCode != Error_Succeed)
  6961. {
  6962. //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MoveCardFromHopper_Failed, "从卡槽发卡失败");
  6963. DevErrorInfo errMove;
  6964. m_pCardIssuer->GetLastErr(errMove);
  6965. Dbg("Move card from hopper to position failed(%d),(%s).", errCode, errMove.szErrMsg);
  6966. Dbg("从卡槽发卡失败");
  6967. return;
  6968. }
  6969. Dbg("issue suc.");
  6970. if (hopperSN == 1)
  6971. spConfig->WriteConfigValueInt("SCITest", "Hopper1Remains", hopperRemains - 1);
  6972. else
  6973. spConfig->WriteConfigValueInt("SCITest", "Hopper2Remains", hopperRemains - 1);
  6974. //第二步:读卡
  6975. ErrorCodeEnum eErr;
  6976. int activeCardType;
  6977. bool bIC(false), bICSuc(false), bReadCardInfo(false);
  6978. {
  6979. bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
  6980. if (bIC)
  6981. {
  6982. m_pCardIssuer->DeactivateICCard();
  6983. m_pCardIssuer->ReleaseIC();
  6984. }
  6985. }
  6986. DWORD dwStart = GetTickCountRVC();
  6987. MagTracks magTracks;
  6988. int readTries = 0;
  6989. magTracks.eRange = CI_TRACK_RANGE_2_3;
  6990. eErr = m_pCardIssuer->MagRead(magTracks);
  6991. Dbg("MAGread(%d)...", eErr);
  6992. Dbg("t2,t3:%d,%d", magTracks.track[1].eStatus, magTracks.track[2].eStatus);
  6993. if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data))
  6994. {
  6995. Dbg("Wrong dwSize %d,%d", magTracks.track[1].dwSize, magTracks.track[2].dwSize);
  6996. }
  6997. if (bIC)
  6998. {
  6999. //read card no 20140625
  7000. int activeCardType;
  7001. m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
  7002. //oilyang@20201014 add emv support
  7003. int retGetICData = -1;
  7004. retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
  7005. if (retGetICData < -1)//-1:DetectIfICCard failed; -2:select app failed
  7006. {
  7007. retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
  7008. }
  7009. ICData track2(false, 0x57, 0x00);
  7010. string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
  7011. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
  7012. {
  7013. Dbg("no track2 data (ic only)");
  7014. }
  7015. else
  7016. {
  7017. int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
  7018. char *pICTrack2 = new char[128];
  7019. ZeroMemory(pICTrack2, 128);
  7020. HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
  7021. pICTrack2[37] = '\0';
  7022. {
  7023. char *ddd = new char[128];
  7024. memset(ddd, 0, 128);
  7025. memcpy(ddd, pICTrack2, pos - 1);
  7026. t2ICTrack2 = pICTrack2;
  7027. t2ICAccount = (char*)ddd;
  7028. Dbg("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
  7029. delete[]ddd;
  7030. }
  7031. delete[]pICTrack2;
  7032. }
  7033. m_pCardIssuer->DeactivateICCard();
  7034. m_pCardIssuer->ReleaseIC();
  7035. bReadCardInfo = true;
  7036. if (magTracks.track[1].eStatus == CI_DATA_INVALID)
  7037. {
  7038. Dbg("may be ic only...");
  7039. }
  7040. }
  7041. if (Error_Succeed == eErr && magTracks.track[1].eStatus == CI_DATA_OK)
  7042. {
  7043. LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op.");
  7044. bool bT3OK = false;
  7045. if (magTracks.track[2].eStatus == CI_DATA_OK)
  7046. {
  7047. bT3OK = true;
  7048. }
  7049. Track2Data track2Data;
  7050. track2Data.status = 0;
  7051. track2Data.t2Account = "";
  7052. char *tmpMag2 = new char[256];
  7053. ZeroMemory(tmpMag2, 256);
  7054. DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2, true, bT3OK);
  7055. int pos = 0;
  7056. for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos)
  7057. {
  7058. if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e)
  7059. break;
  7060. }
  7061. Dbg("pos:%d,%d", pos, magTracks.track[1].dwSize);
  7062. char *ddd = new char[40];
  7063. memset(ddd, 0, 40);
  7064. memcpy(ddd, magTracks.track[1].data, pos);
  7065. if (SplitTrack2(tmpMag2, track2Data) == 0)
  7066. {
  7067. Dbg("done.");
  7068. bReadCardInfo = true;
  7069. }
  7070. delete[]ddd;
  7071. if (tmpMag2 != NULL)
  7072. {
  7073. delete[]tmpMag2;
  7074. tmpMag2 = NULL;
  7075. }
  7076. }
  7077. //第三步:吐卡/吞卡
  7078. srand((int)time(NULL));
  7079. int tmpNum = rand() % 7;
  7080. if (captureCount < 5 && tmpNum == 5)//吞卡箱容量优先,超过了就不再吞了,随意选择一个数,假定能实现1/7的概率吞卡
  7081. {
  7082. ErrorCodeEnum eErr;
  7083. eErr = MachineMoveCardBackNotHold();
  7084. Dbg("asked to capture %d", eErr);
  7085. if (eErr != Error_Succeed)
  7086. {
  7087. Dbg("capture card failed.");
  7088. DevErrorInfo devErrInfo;
  7089. m_pCardIssuer->GetLastErr(devErrInfo);
  7090. Dbg("capture err %s", devErrInfo.szErrMsg);
  7091. }
  7092. captureCount++;
  7093. Dbg("capture card suc,the %d", captureCount);
  7094. m_pCardProcess->DataInit();
  7095. if (Error_Succeed == eErr) {
  7096. eErr = m_pCardIssuer->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
  7097. }
  7098. }
  7099. else
  7100. {
  7101. EjectCard(NULL);
  7102. //等待取卡
  7103. DWORD dwStart, dwEnd;
  7104. dwStart = GetTickCountRVC();
  7105. do {
  7106. if (GetDevStatus()) {
  7107. dwEnd = GetTickCountRVC();
  7108. if (m_devStatus.eMedia == CI_MEDIA_ENTERING) {
  7109. Sleep(WAIT_INTERVAL);
  7110. //waitTries++;
  7111. }
  7112. else {
  7113. Dbg("Card have been fetched.");
  7114. break;
  7115. }
  7116. }
  7117. else
  7118. {
  7119. Dbg("GetDevStatus faied.");
  7120. break;
  7121. }
  7122. } while ((dwEnd - dwStart) < 60 * 1000);
  7123. }
  7124. }
  7125. }