From 603fec6fc3c1bba84ec4b81b83c37a214a2ab49b Mon Sep 17 00:00:00 2001 From: anovikova Date: Tue, 12 Aug 2025 21:51:30 +0300 Subject: [PATCH] rt mode v1 --- .gitignore | 34 + TestTa1.pro | 20 + USB_TA_DRV.dll | Bin 0 -> 77824 bytes USB_TA_VC2.dll | Bin 0 -> 86016 bytes WDMTMKv2.cpp | 2105 ++++++++++++++++++++++++++++++++++++++++++++++++ WDMTMKv2.h | 1020 +++++++++++++++++++++++ bcmil.cpp | 195 +++++ bcmil.h | 98 +++ cmdwrd.cpp | 87 ++ cmdwrd.h | 45 ++ declarations.h | 22 + main.cpp | 14 + mainwindow.cpp | 325 ++++++++ mainwindow.h | 55 ++ testinfo.cpp | 310 +++++++ testinfo.h | 49 ++ 16 files changed, 4379 insertions(+) create mode 100644 .gitignore create mode 100644 TestTa1.pro create mode 100644 USB_TA_DRV.dll create mode 100644 USB_TA_VC2.dll create mode 100644 WDMTMKv2.cpp create mode 100644 WDMTMKv2.h create mode 100644 bcmil.cpp create mode 100644 bcmil.h create mode 100644 cmdwrd.cpp create mode 100644 cmdwrd.h create mode 100644 declarations.h create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 testinfo.cpp create mode 100644 testinfo.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b1d33a --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +*.a +*.o +*.md +*.exe +*.user +*.Debug +*.Release +*.stash +MakeFile +*.bin +*.m +*.txt +*.mpd +*.sens +*.kna +*.djvu +resource/ +*.qrc +resource.h +*.png +*.jpeg +*.mp3 +*.wav +*.db +data/ +debug/ +platforms/ +release/ +compiler/ +src_build/ +html/ +log/ +doc/ +QtXml/ \ No newline at end of file diff --git a/TestTa1.pro b/TestTa1.pro new file mode 100644 index 0000000..f7462d4 --- /dev/null +++ b/TestTa1.pro @@ -0,0 +1,20 @@ +QT += testlib +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +SOURCES += \ + WDMTMKv2.cpp \ + bcmil.cpp \ + cmdwrd.cpp \ + main.cpp \ + mainwindow.cpp \ + testinfo.cpp + +HEADERS += \ + WDMTMKv2.h \ + bcmil.h \ + cmdwrd.h \ + declarations.h \ + mainwindow.h \ + testinfo.h diff --git a/USB_TA_DRV.dll b/USB_TA_DRV.dll new file mode 100644 index 0000000000000000000000000000000000000000..238123fcccb6d4873cc2a48ec06c2bf3562e1966 GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/USB_TA_VC2.dll b/USB_TA_VC2.dll new file mode 100644 index 0000000000000000000000000000000000000000..ea729722a65585564c1bd146393432a0cd90e30d GIT binary patch literal 86016 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

;b3yJ^k!Lh9|L< z%}5hy7Rs8>n~$CUfL681c?PMi%rlx*U|LjL zb<)hxN5yKEhE2c$VR$kyQ&#Y$DkjUqDDgXiV0qmRFP` zf5!Y!F79>9!#Nxi&uKZ-?VF{^eZwt{=fH{FrrG?BdlmTe)@AzcjR~4U>S&{7=SEz^ zfSSC~e#+ALHsSgWa$5`(YR1}+D%f<~uYhep*D+M_4c<9;|D%fdz0_yQlxz-XaXBR_>E!Wbo84ULqoSe0T?-fhweB)jxOF=gyw4DbrJ48KUU z`Dqf3HvGJ?)HQiOie$K*ql&>J5l99g$Ww^YQAs`v!+SM4nm62^NsUDNGiexf;xxR< z%55j?0at~kL4-3BDsU=*P=MrGu{8FI@I=B?pcrevz#TF2z%a|xe@23qzJ1BG$-ub;yRj*id^lQC7J95b(AtIZYiW29ncP#M*UQS>S(7NImNXRzo){-T zlBFeOAjZYiy$-mXGVRDHsdN%UNu}MNrd0BVL@1LJ#L_U2C}-)E3(|*DcBAaUl+(kM zX>UbIr85jlD(&MmrIKGELYdqNmWH#CiaT4U?3_H5@`_6+?*lI9nRZE(RNDPlQfWt~ zDV0{}5z5=3d@T+CL6m3cl$T5yN_pialvjo+(|(7NO8e$YD($T_rP5kALU{woSsDt6 za-L3ke2mWFF3>60WelbK_$8EI zr`|<NZA&PN(r+d0GJ|WE=`pY#Zh>COBIT0(3aK3wCy?Tn64kgt6SgwG zdo47kYUV8P3AZ#d)AG}J-U-}YD&3}T;@qm@kBHkcr zKE(46Jn^V~DxT?hFgu7`GUXV3kc??&NHV;s(T22w!HK;#?^eVx@(f%^yGkCLKIqF=6)UC@|4ISf$vk6k|3@j39EMUs|fv zoSQ(ZHeARfybx-QD-=TDuPcNa?b1RljT7Oi&rKlB8!l)QFNmS{J5%}v0qS1AEL5aK|Qs3c% zDtJMJeT9Mu{51vPobEP^wVUjM^;tZ9cpk_Tto!iT@&)T=JYl21{xo?pqV^G4OHg1L zc!k_hWRAo1PqF!JpW1qFIZ=NHA5T~eV4rm~o-wTqLQ8uUQ&qm|*d9e^fsC zlPvO-VS-S%HhqlHY<}7s_uCOS9SX)YAA;jRzA(b_^y5g?(tp%h1pTlnJ&RaK)wsA%3H};AvCaDO1ye?3*ab1Xv~xWy^l! z?+l!;?*GI=?V(iFKV^O(2V>-mpxX+%nXvn@S;@=!VW=GFn3N9jSD1=~<^?G6aLnPl zeZx=;l_)9;euW}p;YNASE;gINCaU<32cLtyNZd8)ws&_6d zmvB6YCe3{)btv=HQ{s3F9s&=<(be=6uw&L)ol59t?<5_nswJEGeFs^qo*i z#Q0UVnpwx2MlESZ^W2QQRvq>&f>{B}lH22DKkBd7^#hc0d0ll5{)VB#hgGD)2;6Ad zv5Y9zfgp2qv7xxhtyf?3NVhexOJwv-Q z4JZ*^d7TY3bkQSl6{AxCUHL-1W&L%iihLo#B9EfszvyYx&^r4Tjf=A%v8*p4K9EYC za~8tJ6PZV%ZT~*T>(?@HrA9|Hn9%BI`#}S0DOW^aH=bq^7MING?~-I58p?Q7*{r)a zs%X~D)^$d73a@l==yj*tg>%-6Vm1BEk zNVpK+`WOoHu^mTBX#I1@JY;M?4FE|qG`5LD>Mx{~A}oT3sQ%TpQzpUqfF3-$^!`2# zX=bFEN#HctA#n`!#Je%*q0vM>*a03~)jw0E8bZ?oH^Jf3n92h%<2Sn$P8)A_ zo=&LaWhoB>7Sb*l+9 zkAbxm`0d4JLQ}Dc0{07!cfiRB(%JLXQQSu~Rk!=+)9Qw3qCXCzd4#fJ;tcf%Y)QaH zI-mXeB>57|DxWV~s4?sFo~9|)(s-ax(;7}#8qQPB*Yz6fo)vwshr6gU<~u{4pK!fV z+4jQhJZ*k>4Mvr9Mk7IrkqMRMXbhkn!ZVQ#jJ*63m{W}##NK?q@x)o;GU6Lh55Wi~IqPo03ig8& zTrhn3LH0*z`Eds{aQ$wwQUb7R{8%rHy+g1*gJ(*CU_BLj7R(Z?^c=-A9d^W`I|b|N z*@CtHG(l-W*@$D4dW@_=bMX1$TLR<-iAYCH|K;do3~s+#{`dAbg0v>iuF zNL(pGN3lG$4!_tSqWTtC8df4!=3+m9^9$~*kPF=#?_$p~?ly|JX0ga(D`D%vs;gj& zan=n1xTbXnA3H=S0*RFs856F#vR9&^(Ds2q(|tUZZQFh$&z zf+Rr!(Dw|(J?!brF-X2w zuL)-e6YUq*jANDr_~6G@D_Q8WWo4`dOv<|x)%IXM-2Tb-Gm_Yp9Q>ntaK?3B@y>fC zG^h8o=8;Xq?<~6gZLjfO=?vP}+LX*XkkNB}rD9UQ2yP?a^1^^Ufv#LiF=qnZpCWaz z#K0WM1y;KEA)6l_ZWFZS*!l}J&TB@>`FT6BQ|*oIwvHq%a9+M3)=WS5NBKje*PMB% zX_(x>P3vBDPg|$S*hViaUi;*ajBVX9-ncU_f$(r0@03C6Mb%A<$wwiE1YNG4u5hW6 zSuL@uwI;PqJ!EXR53DxX`z%jwp+-K>IhhdVWNd{?{=_1GY_ShiFP2Qzi>tbS2G-7X zkY1INP$-I)&zov)I`eZZsnSaX>qfQX50ol*i#2As(`eiSzsrodf>lfRWm7udI}qJi zj2|za=kQEA)Ew6|thvb0G{?|f6a%_Vb7JInqujx%?~hQ2PLAMmEWRM>h#?++5y9H1 z<6w`JIE2uU+7w9zjd5Vagh#;Bhw^*yFg%@jj^j}apXpKxpY6h%;mz0NB0Q=Ca@-r(NHrcD)@vVvfX5*c zfjGjrKJWB?-`d>%P$Q&A8zJG#Ge7S~x&C=5MLYLLNO~oLpcQVD^Lm?PQk(1sFTfz= zjqf4chbIk@<|5;yLrrsx@@HInpL6N`b`WXeErb(otIuNO&v`2}4Z_?w2oE(t4MT1A znNj|nTGsNE3;JeI4$$_3hqZVb@NB@d3D0IcTkyP!2eM9qtW)q##yc7BM7$I6w&G3c zX1vXKoA8GIcm{gpS#fCF=rTG8ddKlFJpDvF+%`ola*Xo&`b0(M3wk%*k4#8t8& zHkJb(t9uD?^AkkWDy(Frk(y*?_d>x}cJIfShdOBNmCR+V5T#ajzY0)@T}$H+5wU4X zZI?XIX?eOCF|aX#DxlQ%m$7Gf$kA!xhxZ0`c7L(Gy(UI&ca~{V7klucrj@aopr<%Gk$W*h*tN~A?UIV^=cG7W zZ;>LI<#yxEq z+7}#6y0XfIO3#NTuMDWQUD$|id=nIM^Zmbwv3jSv*c`NTC7oV6jCNzMz;MW|?UYtT z+rte|r4kohOnGJGWk1l7yzUOVttA8>{t_MKXGq5(erg*WG3w3b z-BtZkN@j22jDTl68;@;mw?>j!O?9Yjq2VF-8KjZ+&%C1gR?ukk7dV6CgiI|VFs6F*u`zU zhK5cm8GdhWLPhAv))AOd-1sAQhQXNnDR5lMOf9JxXpMf1TxkTyN=7{Rfm&o$*O?WE zSuGM3hgB^yDUSa7PqZhot|MB6#Y@E0UVlKSLxCmzt$WbzRA3)$`^aQG^5~k7mu@Hr{7C`*$wM=}xBMlx^ zc78HHbTN#{Y3Q8$8M}$%Ytz_@3?8_~Bd}*f0v@5orXWxE%ha0mvC80Hn`ZBja&q$t zZh7V`X|n_h=jMyQ#EKx6?M9>L)>@_SvjaCES1L+je}U2pdgQ(ssgivJk-KRj;4!d2 zrBm;^W0^4Nm6*vr;>VL2*rmi;V)I%1SM%0Cke*i5kXSvWu<2 zc6w#^BgjkLX;=lj|9YUIgTYwaiw|*N7`#BkU=4b?dS3lI20Ri;EkiBlCh=M{yoKt~ zV6gY#oYz2%baP7&&YYlJQ-!NcI|yvj)s}`I0}l}PF5K)y!f$Dy5l^54f8Zc_z#yfg zDbgyOW$ZP;&~?h#e*!;DGL9gqR4)}}l%`PTbx21h<3zn6@2D_xr2Np}#JCKms*cmD zNsV`wvLjPTBms393#CIz9D!;M;LMoGfVOxC2D(?O zDk0^mF}E9}n}_?oQ*M92AWa_Lh=eWk`*^?`(94J53;B~odK5gmG)ao;}+0xDUD5_r1%=>_eXW~TeVh^9#?9;%QyV! z1;m$c@X=shzM*R6@(qp^%Qq}@FW>OU(#_8{J_oS6{bi8xHPWxrNE@dej^hSc#LD)K zlw8p7aVm`)5cE0f@bMHj?X0FDs5lP#99YhnI~;YGqWy}rL2EHTxedbL!uE5wX3bfwUZw0xO69 z#Mt&4tF%r~*+^8Xx;xQwBq?lYitl7$4dNX=OFlns?H9h{Pv!HY)|fpB_u;EC?_?t> z5KGg&XJn;)&p7|2Hra0qu=P;R;4N;)bEAO3L94=`%{s^&aIsI2kvc`GVq!joE7cz6 z$6Lv&CKmOUX)SIgeN;%lNd@$qnn%AmGw3%z8^6mpBrV~uga!PSn#EtSQ~7Ih27gUU z$7}PmvG?JHldi3E`CDvt;_Y*oS{G5gv9n*(I%1!LXsEebD6w@eVjZys_>C6@e@AQ~ zPYv}MrSUkjv?M|jO5;fc_10?L2qY+-JD>_Hq0y75;oN62()E^;^9eyf(;3(}!f_Mr zAx+1dNj@#YK%ym934HLwmRmmeM-N>sw>$~RlXI-}lSV&T^ix1TPWo9wKP!E2)}g1} zB^^{j>2H{^)YI~5E0J}Wexml-E@WQ7+KgV9<@0DocS!!|Nu~U(eV=!9=Dt!VBgGFF z5%AUWvsf8Aj1Ft&F2&IYr&n#CT5|TxuaOqK`P^UR4iN4kFgWfZaF1GoTvp?r%!Bhi zLMdCvX_<+Z&W=2J1||)Gt-##SNFVy$%M=UCi-Xyimy)P$;d zHq;qPOI8Njvl;xwb#1S{fnO_Qlr3 zV#eDW@EGsg8?gCvp+h`^Ws~1c-(QAGTFRAHD=j);fB6HfmN@P+wvyQm1mtv%i7%T4zW~E4z>I4r<*iU> zHfr86@;cGrO{mb0RIp)xheW2pU~b3vy!MR7C%R5@%*FaAya-c*bX0hg3vK>ryHqZ`mUSlm=r!gTj# zb7phL!+`Dxe%F)C7LP*`_e5IQ1hjeB&JDs($|^B-Dls~8$4gVWASze}jIl~AFr;fL z*lk}xv9s>;;as$a8==e$!hA}hq)V3qPlDM1$lipWK}!Lum&>PDOr9x7W1K744^ma^KdT9Ox4#y7Cs1+=z|ENsb&ZuGZOe~=91))VE)J7Clb@?>g!p)~`)HouZU z>&=eXsrZFJ1b6@wD7}R;KD;;4xCbjZm@t`6Gkk35%r)5ROtiPvoC+%|E2+6zIO{8! zE7XC^C$PlqZ~NS$9(ZW4i2m%`U?>D*N=c78@~+-CgHqCOX*`02GGEGcbqtiP>grd@ z`=DQYcNvr_v*c~NAl@xsxMQ`^bI1MaJ)->{lXRziA?-D=SGVd~b>ESoZ*Giu?#RSN zI|>KlrAc65;V0Dc8fw81d&t*Rf0)QN~|H)g8 z=}LV}v_EE&?DEC5ot)=u)VGg(cJAmzFZi8n6s3v8)b!wWzI!@3e4EZKC2@Wq1Dl{? zQtuL#d3sn>?=mU#Ob~L=2LikFv&0~{hhZqlS> z=~7>DA}0RH>EPO7f<=mj7ZULq zJ>aeuOiBT^eoc2vXFZ~Nk zpGTYd{#{rJ*VYB4ynoGXbzkOzwr;a;j&+t?+^5M+r)diDZS2QOvEuzX6lOtx4@I3~ zM;$|eBC#}+-X*=QmZO{X#rA3?wIc+z({^6GOFn;x zQqs3N&T~g4-s)n}zStzqmd}TD+jTS&`+Rc^T)Ax|#kIi+avPLeG;#Ars@@>| zcCQK46ezlTMfFLO@&uWUneQ4(`eC97mS=trY%=X&OKal2vUZ1W?(}|Au#45Iv%Zvz z3JkJ^Jb#r{sWd6~h@?&KG2z!pW( zP(2V#<7rmky_YDC2F^6V;W17|ASB}}yrmyUKj#|yq1(#Mz9NHiC-wqv>FcIHumLB~ z47@D9Z;>3U%r{C_-#mkIPrq-G4d$G+Z9tqS58Q#712C#mb+4lz4Nyl_mij}92YBB%SmS!sLE#gN3_yVhbPoB_=2%V=Olm+pdv6?7`HGzFCIOndYjf9U;G~ z9r;Wy>C=J<=ydWv&DMM56iv_xWHG3J431LEMAbg2yl>I~EdJqgAkltYsWR0t`*G<> zHI)co2?sVl;rvlr7&Ob@Hwio^VD{rRJ;*sdlruh(X6HG2kRyrx0=AcWyzvC^xmz%v z3L_jILtk5w_Kv#s(B&HFbcl`}cps#@g>8uX1fQQg41ow{~o;iMAc`G9mIxuI0O zHx?JFx#7Bu)Excl4;mnPcwmB`kfynO+|S)uXwxRWD~%2j22oGiV(84ha~k(TXO^5* z7n~Q>;hC^_z6f{DlD>7+GwtUr4F>AQcZ>GBP0}KaCO&>@r>F;Lcw<*;2Ku5>b$ZgG zra}eJfJL&YC8sgvPaF}Pim{`kZQzrkjy>_(0Sj_SBY*_diT8*h6QK{~nAGoy^gX1z zMfH267Ay@u8W)j%dACUcLMb6ArKS*H)q1}if#I(A%i2kGwIkqp7aTfWzIR_AqcTjE-+D{QhqmzB9YZWXqv_>IxN~?Hy>x!CJmYkM z9#5q>4k+~&h|4XF6R1NxY?i+qfR#=sFR(X<2OIcGS--d1SNMpa&Rw4ffh<~YRWYv9 z6TM^AW9;MvS}jtshP8!H&IQ3lu%R;P9e%>lo6gx9#Kte^fcGFaeoS#3Dxh;awoW_S!Z$xjL7CBb>cCQ#q++phdmyG11S+_`!D5fc!)O_7t!tP!e77}=AUETW@MDVZyvBTII;Q( zQGELkaMWpR64JVp5JHJ!>+9$z0WF7KY_&;W%3H`WOWy5DFD$JBEX@N<7Il9u`xCT? zmP1QTRs?*$8q^NL<_oyZACbeV4#pE|I@a9}{}op8YxQ`XPBcI-b_m5+azIi8lJ|Q| ztN<(7$^Zh3X`L5vsXf6Fd=VQ1>g}Q(U#zbAyc%!>VE$QPD~+Na?~Tz8>FMU0Aihpb zUpch(+TWE@*?$G$x2Jy{0`>p}WCH;V>rxz{*N@bAxUIc--3-QBlMg1Y( zN@;S!JVKmr>Zin`b~?53$bE_M^BxY$lKwu=?uSelC+!^m^74*vTp8pg%;!js`*|ADak zvq!*U67tHs(_5)WR|iVzI|bP1we?~dlJez20KIW@WbK-@U*N|guYukv_ZZoqu1Bsu z12%`I0|LNa0LaUbAm>jdkFTX6842|l`%!62!yO2_cYGpPUrU6~s_YFbWM0myu=9iZ zK#n2j*^lAlMhA7{mb|d@M&MxUu03|zi)eH$X(Jy;(iHa#pyR%XVd!GxA`~n(zmxv4 z`8o|3`wr3y65tHF;st6KJ#??FbuFkgzXSI2N$(+q-pCCFey6WD+K?Fvs^D4yklRq!dYNxXar21XOcSyl#xmi5tBPVm-oah|CQN* zI5`xm`lYGtIDIhBpN8!_GuzL@1z6oC&{2rRh!X3=T+E7Kf)2)p^O8eRtU}!l|(?wZcg`W8pP~7_n;`ERpx5p*(OMd;$v<`Ml;GC!Zg{T-PRd zPI%a#LEe^Fqxd7?4Op15JD$THCT7qyZ=xrrtgMusNE3ufyX4*21=qZjQEGFEsmT-^ z3kP5Y_BnWQKZbu!FD|#X-y0v2Qji?{lQrukV_!%nn4Hf!?L>#+IWzr@1aS{BWX9qORllDGrtgbP_FRDo?K1Zh}C3iSZ-w9fpl&DAy z4)IQ{9NrJB{fy#B^k&-wYp>Tzx*o@It4^Hi8-+aBdR+w_1!2SI8>>1JgCpVhuIg%9 zG*h!Y?=LP6FRXbrtYGVduA$X<6mh*8!G)-U$$rKgn_FdGlfbqiMXzfx3%r3TO|qi9 zxZFoygr55|#(}&$*&e8kX~F@A0cjk2iszv2%>~8AL}=4d1?+flLT^!XHevK>M=|s# zw$K(h^^|Min4v`NDBlD(sdeO92##|vVuMV8>)dk@jhX<%p~X$uw8rs3bQe=KG&}n- zM2p$}Un;Brie;_%=VfV0&!HaZCn3(0s9G>0uGMlfXiNVIVkBIxq|HbSM5;R$@GL@F zKuEAh68Kqw77_u8VU+TqxahF!x{%7WyIg=df8jNG#|>Xtj=_MSkQZH~TtL zz3IB7)KoH-v?I!T5~rJLgi}fsrz$J!R<^I-gVvhezWyG>XYc46i~WQmH%i}vd>%8q zh=Tb{kMkQ!(F*b>wa}PDSX;eWID#gF0ebm9n1xG3Yreh06)|WP*VHYQFNE^ zkq2HWE-&pMKl3s#d`e;)W;24IH{U+=galW+ymKUbFj0NRweXN55;!`3*B?=;trw-f zh*If@4EA}~pkQ8#$zx>={{RNTJtlV=iSsUOOhbT;y_SYksDN68GY$9<3L7|1h(%NN zSdSjd)?**(u{=HYo*paIW9@pZSdZ<{V~g^sb%^XQ3E)X!|3&iQE8ul*Y{6UymR|pSTyeYtVKcj#hp|UY1JcX?(h9!YAx*h_ zP>mkaq8PhsUp4u72c2xGfysy-Ucpqf*y2bJkH@(KO&=8%gL<>thl1kS5oE$4WEkf; z)Pdcb(QzxZqwbCLZY6sIkp>>2v4+T69-*@|+EF>5F!13~8g#8R&R}Wg6QbZHbBYHr zxk%|PG-g{VrGf;=vvX#26rC~ors1I=`DKSgKYXGo4=vP_} zWoL=7F?9saDHC~|O64W7vv8y6!@rfE{psS{m^z~@5h@d1XPNtqgt4j<{1yn1k^l=N zSZ{H7w5+E-ppTa9p`)cAH1+dD<7l+_iNcTrMOcR6MA^fDW5oeM!$9RGv4*ZejZi7w zkQx!6$3wP4IKK4^gVU}9jhObpkJ=;cRXgCoru=C5@L984a={or6JtheUL~Ej z2pv#Cw@bIO_@g0SDy3<;@FsY#lGIL4%Co>-Oat5v%b(7E_WK;0(dAyJcGi!kdNMp| z)iCVQ9F>)H_EUfj+)9RxlEYrdxr`?GyM^G5?FFI$Pknnq>~Q6AQ#-yF(q1rmczeN= z;WF%@1jbF zpO|28aBYTmFY%eTa|R4@EU}R0+sJvCGKdFxiAktil3q8MiBa{tI0L(Cjuz$SQ_i)& z2*#;ABrod}8ntzg&>G7`2Azuxy3%GN%+GsXG)W_H$7u(og5vX3sZ(ul>x-2?p73yQ zhB3R5nBj{vC9c`nR3!2(R$r0X$#%sJE$BMe{?K+pJwp_7 zI05>LO5PDL61;JB^TfJfO?#18k0ZRXp5FUlcm;~-CWY+(2ij)?I6>FZH1BNawmYB~ zL%d}xGr4t0N9%}6K`@@q!HEc(qFhZ4apk=Y90i9HUPl~FJ+tMDM$3lpAf)le)snWM zBrN=K#{&DUk#l9}*z9|_lY}n4lk-kH9GMSJ+g$(oZ zy@ok1rePwjgg@NS9Cv#_I^_}PRItrZh_nNam2*BLhr!!Af%0Gh&d(x)${ckw^DDjI z@)*k5cY$pW0C$-8ZdbXJAFZXqh;^ZEn61M+Nk(6XX#B^F@zU$q6$3YHIGD%BTo6y}_8GS#>iPdCwEKQ?OHx zg&>OY(tb$YjO!&4UZe!v=|6#Lpc1IVp>DX0M&HE?k6CmlDzsPng6a~7ubPx|9!+53 zp1gSPoW>L0d|Yhb>34c3v08XZv0U>eG-JEjtXEDO7OiP8f!!ZMF&1gVkW_9i>UN?3 zqO4)R!WUB%^MU5odDXfTzPZWo5qFvuq@W5;p$OnetKQ9joq!6B{aJ)tzcz z+b1zT(E=5CtCRgV&RgKH>zPXLjiKzufeIH9cn7N$oj`HxNtC4IbmAAokY*IVSSc-S zDF9deI|}&+X^ftLA1&aCsgkDQejBKI%{UJS6zXHa>vaoL?t5H{SKn$Scrcbzz?$CD zNc#vFV-`Ip-?kuiwLEvc+U^}`d~11bvUFa5{awx9kK!;wGTX}z^%Xc>xSod3)F3Of z2feqHv!i`{TmfkHPAV%acVe1K2Nr#g9M=(O&gysdKN+J-v&;FJd zmlmZuEonDFPz&6Ega~Jh_YNq8vWjvDng*{K(K<2wZ&Nl*PPF zBR34DiLPoPyb-R79a(VDy-7dz4z=epS0A6Fcg!Fh`uQpxeJ9$*X2Xo!NX1UF5{FD9dn$I5gn~l5ddsdlpb1_)j;PUZ9 z?F?7%!;KB{U<{&nkw)RgSX_s|ga#$tP4+k4sc!fH0d?LI+MO*iEAy79_#7H8*);AT zc)|>nk3VfizlV(H?Z;}&O98Xo( zEtTRsik8YC6|BzR2oR6gQ+!_j55jTkH^G_tKMcpoKNGw;ANw{s{!H6ABd)DpiZcU8DwTChgTttjrP>kn{Ys^12|7DJsIY_F`><_9xNxwRb+WbG z5+DybcRyJ9rir|)k88EEiZ|zdT=1H`112XX$b?3Gfau)8RyzF|T!K?{eVCOxse4KN zHmOfbI*G8YM_(k-`#6tdrv-TL5uW3$&Cz4SsdQ=B&U-;QIHK{4Gz=C%r*%Y+!uM6q z9aVCufa=BA-yvr>REquWA$Jhf_pmyR-a$-76q5_?AWo0mLA(}s5b17Q4DKBUqW2E3 zW%p9v(7i*ye(w+$4XK=SZAQq@o8F8M`5B-~=jj0Ha~N9K+tL59Way>K_{Fc|8+Or6z_oVPS|dDDLdkqO>0c)?7K3BH353sNbWZ2{jb+VjyvUq(Xx zp^!Ye3)U3Qgqhv&1X|g(&Pd$}c}t;5m9b2?@#!nNR&u_jz^N@E!>GL+f<-aJkis6hV z_K0^-c>t9oPv63G4)RTk-jS>t>H*`7jz7|nLsPMz0@RuZr4By$&P*LtBi}92lDeoP z_zQNK1W%&7iK=xc)*bwYl$Jwy>@|GU83&@#Gs=88-O2tzYeL+3N~oZJEFVSy84$Hy z2JA`od>(ev0AsX!52EN{YpI73h1i{^8gSx}U4&Ux*-GSLjgwxHOxjW0lL~$-BtOM* z(zZAM8c5HwsZDJotE|5EB*n2VHR+3bvSuT)>|_W23R&*QSoy!b5Be-R;#b`V&3^hT z?t>PuN5#{9g_Mr>9z-|Zho1&KFXD;Z@%(4^L5Vu<3r285cMI_an!)!$IS*fXA2dWG z6Qq*ySn-(f2zdIyM-Lu`2X_d&aEI{!@;)dPrfO8_xp?lwvw|SuJBR<@?t>m|qH_6t z&^iPmvn$;PeGj~#EeLsI7s4h4vhalOa9;5~C}D$M80Vkd2jz4J;eGvm&=Bng6tMx% zCOn(*Y{By~o^5zK@Stt}AKV9}!c?sjzYI?w9fV6@LVNz^UhP3>BQIPh#`RR<=CUzLEtKXBxQxWMxB)E0yvt0ed z@k~n+($VK;iCF*WAG`C~$PcU*n{0bnej6+%)tyWS5La5Ym5FR7G$L%LDvpC{C^7sq z9#F-&1)|=lJ(i+9maILN!Dus^5NQ*@RZ*tmm@SOZ!?cH|9m2d_6;My9U#M-kJ@GAY z#Z&hpUDG~>CW4S?JJG$kS+JI}zc}cd9CTBUt`*KN#WbJDwqcg%1(@_}^;D1L^|>YY z^I1ckm1k_LpW#GKsmHc=dHv(bBMiDm3|+!U4Mep#&$!3(>a4^vm*v&R;%tW-dnEi%uvDtpUCLW^4`L~O>!M+RM!^yB8t@&7=Wa0jNk@WuEAAl1~XLK6OI-g&) zpsShr=na{>ob%bgK@_yg_hzaE>1}Mnxr6wUb4dRN(?WV1N*k>bRobC+T+zw`dF+8g zilM#W2jNiGcY@U(d{!oz%?ALs?m%T_&06&@nIHHb7UeI+nw2irdm|dY$NrDXRd?%7 zlb%($XN!ye?KPNQNR01dLctOWn{K`$?7i36b?~bpus5^qVvN(5_Z-7zM9e(28BG?6 zavK)D6>J57t+Xc%e=tp&+?2+(WDyRTsUSfcz{S8pLpApD%p4m|i)8HgW06mL^)L(e zkQ`(FjFS-S|Dp?%HlT-*;Nb5G$%4gGH^$^Y9*6<944C@Kh1Ydex)g0`}U=Kim>^Hy- zxPQ3;*}hM6cxwZh0n~w7n-FTJhdCqEdTs^FWOY-meB^X7T39 zEY6!*>`h^D`@*|b;f?Db?WML$4E|;(vDZRB!Ld83zAf|<9KMrk+(JJgL(a)|!!(0M zf?JhxZ6{VDbZ$D=(J2kX*6>?svs_0PdGWgrK$1AO@938=n!LkNIb3nPC`#khd$DSH zPnoj>aH&AOcd1fxuw%~B4Io31oAuR;QgTvF;0u@}TCEuO<(8bRy;dzbNeh{ZMM~i) zIMYrBPq3-PPF%PPC55O=(AF$1)5<$5gV)k&v)bcyWfP|y1m>mHXMm>-Wo(q{2y+z& zzoar}DF){c|Ael=d%|YOKo7l0A-?oTgC1iqky!}e)yn`YjvlPwlq%ds!jb&{1~cxZ zJ!JTuCPR-t6hn7~E75czul;>Uh1VXRs`&)_DKOMJ#Pni+49J8xCo_KCrTk7T_FC;J&P!R6KZI`VlF-9i}tG~ku3I{@GbG zDf%`mS;tbpmP4{)Q}smdAmLLCc53*>bcKZ7VabXeTWK`c>{S6cNQU9yH2*wI4_F(t zG_>{cEOxx60{@~(Sg$v?hrYRU*2XI-t zQX0hukU>9vp?0Xpf_Fos_)7Xqaoi9~k{=k5gHa>m+C>D%HRRDU3YuK z|E-GL^X)6l66?~w#G)N;EV@{Ld|g;H_~15wI(}v>eozU4+8^N`AZ{+`m*Yy-MqHJJ@_Qf`B-0yk9(kdbhgwH_}t)h zQU1^%O<_0b1gw`3XweDaz_7Y2xX{U}C&QOacP)**sEWax64}M4IqD^DhG1ZyRLVPp z*Rfs5t;>$>Lr|F^mz>n(l1?qGfy}6h>Nu&EcQO|?X97gzr&I*L&&;stRDXICOo7OK z=0rr)#&rCm`E$3!RgR-Fn-%E=MS6~_3ojrzBzFU=qyn?p9e53C|3J9?yYC`e+tct{ zrhXv*b;83ZGWcFag)dLvrWj@nG#97G>^*qC?tF|=yRoU{CAfyqW7MiXD*4W7lj>0U~pj%>VY35!O;dnxbfC0gg>7$cF|I2%z+iK#!?bLp`h}L%hmJ>EC4L~{KK$^y+Lz#<{w-o!(pjX* z%eD&g8^k2`V>c^~2Hd^2tk>WHk(X@|a6DJq(Cl~#-`s1AL!Rb1+upq4D1cnaN=XxY z3un;4m2@5cPKM)Umy>-t898_3BMn`S zX?%VtYdmMkR$K27#-@WY*|8OWWN7rPSkoPE!je&0_>riHquJ1IwZZRYWWs0 zXppuT-{m|G=lmJl4boQp2ZP4;`r57YL8NBCt=Hvpzl3)1`RI>|l=^%`3V%E|bJw9h zr`qOpxx2Aj8|u(lhe#3XgZiX5-Y9Ld4?Ou^FkYWX(1Q@2 zqdK-kq^~$$usn4uY8T7`#ga{>8rOfCv{}mv_iZn3qHmIyy$r4R!XQ$r;|1&}xFBt4 zP3dJEW{j=ITS{OP-VCegU?%nI9KkT0YN2; zcI=Fqj^`FHRDGnH>B|gBzojoTBqN6D&FU_u=`H&pRGB`jjbm>jtBhG~3#Ufw7?9yt z$}XAIeoSS|U~40I`lOaX`C*6e{pXXK_f04JADmAaJY9{Am_qEQ*iwQ?ad2nsTTt_J`l0b8?|^7O*#XP5yC|y2hH>Mu!ai_{i5!b`cJaw8A{| zVonLkI1zWCDEWIl8FI%0bO_2sXQxwhBrRN9&=} zqxlM8u}<3p4dT6CW}^2RnI(A5#oTSPLxj!_>=?~|MV#^o>=;F1@_xL*U0OZmSl(Bs zRN#9#zrj#hCo1bq$~v>n?^|bm>7|$W@jLYK%=Tt;a?^;}CDJ+HGpSHNI|cmUZ_hQ2 znl(>4M}7)!Z!Nt@_7;5(Dq?RvhXTuR&=%J;R*PCvKdRs8f0MFX8a_u?wE3GFVxI&1 z1@?}bv(1j?27h}a#nZf*zADx7${x!rM*E&MV>8a5lTyI2&Jj zJdUG2tIa;l!>dJSg^v?((jj`bcrwa3Q3g1m=(-h=RiWju-UvL>*mI#TAMe-63yVK-nJNT5`oeP1S(A%;z&+GQ+ops@anY% zOML4I+~KJEnFf<@?~RT+wY<*PFp{9ggTDLIHptO-7 zeW>nKT9Y+sY!`%C_5(F9-wG4)I_&(u z%$pA<0tfUHfiC9W3j7vAQs%gE1cU-o7f`nVHEgA$LkPiVRH+LEd>iVKA6A!71NEfKqG1 zCDuUb)L-{9u!2hAsK|~CI>G%N4d06LXXW>R!q&?gj028oqp;4H5cgkN^DuNY$B41$Rm3 z)!8Cj1fn2`Zz=?h3hu}GaS;ycCHULi9BOGx<3><}I>XgH{0TvH=h45`G`_ZNqK7Q4}I?0*qd947m0Tw16g;iq9pve(h?E9q{irJ)GG-#39H z^m_H;nV-v(@DVU%{5vwz#h*?r2^wkNQk70>tKE@aK1wZe=j;94$?EW9sO*5mwbZas-N`RTgkzSvqT z{yyexEB^YVV-LUuLB><^Nj29dG|x>=X=+No7T=~0cIyeGHfy1El1W`OHKkogX&>XP z6q+f*_82}IBaC-IGgRUX6;N<2Bs?M^A}qnc?2$hpIS`zTIaNxlzo=KYjQxOevDw?n zrod$*0e=->StktpPWCzcA-E7mXU7C-wC79aLfch##1a5pL7~(90}8KefMA z;e9l}hb~6A)%9Be!`YMS+zfm=dOaPWKVRki(pc!;B7gNbRr8kLfK&U?;0&I~ByE74I9wM0c21Vo_W9Mlp;0TV~c%3D@e zmUgqUuH8(nYbELRU1?g8b&bmM5LQ~IR22X3+GmD`X1Cw({yzVEf1e+N%e~Kj@3miR zuf6u#e`1O4#+SSbR_wAXUq68_e|teomFRBWOr?_49yy*!3kw_M)2HV|R4(z{wrpv= zhNPXl_}immosd1)vm=nsbZdSCZib8wZ+0F`&QK9`i*ztW?n@tRDGlHcuXj>cOM$o# z!x~saVWeT3A+70yiqiD4yZHm9ndwPgcBfLB4*sw}pwc@bJ=PJUGWfkGDp9KTub>*X zqr{K}D+RlUhXs@WVUY1%hHM&_7WI;M zyvP`*Ok5J2qOte{4G6~RWL$-zMRdkt)WChtIxQOf1hiu&F5hGdja-o#{8u%y=rk4D z?T>Gwc#(1z;_v4MA)K5FE0#$=hlNsEWEoc%v4(+V8!HQxbN`vaoZrEUkDO^?T^3ka zYb6wNCHVMMg^2w$O>yv7mucZ13=;!;Wn$!{q^T*yy@{Tb1mz5k1t1EKpl=~!GsT@xM zxgOnVw?vO>(CKre;oVE;{nbRo!#wBTb14Jv2mJfU3_Dgg8g`PwBQ@m+bFB8*N5{T8 zR^92Kbm7wX{&NTwjSvYjQJ209JLbE_j&KW9J~f^TRTXuZFc==al4GI`AHk-AE%MSy zsChrh`49Pz`#+?7X1*E4U5t;66C+9&L5?)0acua)PW~<{LmNYgEQkbS4p$+o_fs`! zt`F-Fv8OSDs3E$C+!aEbtK6!_#7G(47lWx0=|IqR=@}d?UmP772kj^4{2z)&5;w-7 z5h@%KQ8#o|SR?79e@9-9NFxzT>ME=Mg82L(D13WotBZ{iD8xic$4M&}bWEzy9Lvrw z#CQqPVC5IkU;O1nZ72C34Tph^&s6_wk+3zstiu15iJPDbvZDAz1z3@iTp{fS2~;8N z1<$rZ+9l5cePET2N<-!Quq&XQlCo%}$OG6eA-be^E48V63sHf@E2zU}2&YaL<09kK z<(ts_9@+mL%8grVqPbBzDi^b_U#E+)^p%eRR@0g>ob6L-$r-9f#*Omz+p zIjSl-e5QS0g?lHSG(@bN_S5kM{9Sj#3SH)ze2_+4w$XYr7-qfDQYCSL}5RWx~+C998oenpRQOmwQg8eg*nVp_mVq9j8d18EI2Ak z!DHd+FfcDY^McNarC3DZ)tS69)Mf3+%*JgE?3f(+>ariml+K)MfvG zS?b*h*ac4PCXagio1mURWkWDxmHW(e5ofnYDoe5%h!}**xj|`tlKP%4XdLmjQaN6XLW{-&RAa`d%g1AfiEZhA_iCEs(eqIMIP4_2 z%G9%rHB^!MafN%Wx^gf4_q%IQAFj4NhH&O3x2#o3QUIZKxdDgv0SA9#4aBykcCVm= zFGc&2cN8>UQbz#6uP)mf20901`xC2i;|K>tIQ7}@-bJOTT?MaF8E7#gBa}3CaFx1@ zRtG9EJyP2;J#nCV$LIzR+uT>W&w8L>)+7I&@$$f#5U<_!8FODVT;kz!*PZA_3lDy&)apKfv^n4nEX~Yho1CC@uVKXk{9-*UqR=wJlR4%j~ z>ems~g@Vn@@`LJ%coZS*SO4gG|I~)sY9VT8iS_92Uq8U?7@;S?3tDo*KCBt zl3}=@vus}~JRzHcMHT&T${B2`HsnAIfzI)ywf^e5_J~ixXR@>_!1WjndC@ZJx{Wwj zdi_mklSk?Cu@-87@dm6Z3+z03Kgchfh5L);(!ITxohd;Izyf-k)QzGhHJU^Uwm}It zeR@gpnYq&S=p{k#0`gwgzJ9VfVY&4@B04b)XA_A8mCQ0am%!hfmt)KA>IcKDgh#7Y)JHz6AHoOH~{;wM?dJ zfB3~Jjo9sCRUCDg2=yDI8|uQT2R>961xMgP40{N|KJUUC-(rvQcb7&lM*k|j1}pr# z+@+I&0<%80#(&aZFNGRDA|w=d2)0U>Qm=f84ZmRX`1g0(BVo_Bm#cia4pqR;tuYZB z-K7!a10^u->W3zKlBUWA^q0~qZRwBJiqy6KdjH8KVPT2uS6(xr?nq@h#T>kE6w5la z!j1LjV=)nfq`m*`6024m(Fn1T#E3&6PK=0)!*!GI2fIH$R$q4m8?S*r zkMUa9eryTCw4)$DAP7<{Endf|%YO#u{B9W<32w}UptKkPqzi;IaKTf zn+8}$k)ZEu_u$m(!Kr)EB#}}VthJTyBT0~w8cMZ+az1IVznI)A6Crj7H-u9`odS$- zNj)_wM+-lhQv#P3??UF);-vE3OA^5Xpy_KzL}TJw54KR{XOSP~h?S#o3+VA5D0R#d z(hXMkO0j37w370uq%iXP7vWjF7Q2wDx~`>(N1!MRxIxq-^55V!y|nlUx0sbcq!MVz zV+qBw8*l|f{_9i04S7JO zsP=kPf{tW%Lg=S>XM1&dJ<@DN?_k*bD~ZHXSSvf$5vQ;o-v{>$+yV*EXSt|n02cw; z=eQ^afJ+zj=*5EU(!kRlw=}&ILHmbx?4b(_-ahC;`(Y-R zt&%4b-@e6eYZg-Wr=GTdBBJqCU|%;p$S`UDL`q9(trpQ=4af0;MC&fxZ3ngxVaf*N)3D>W!7HbulAQc%SIqU$Dudk% z$_y#0DNG!+U>o>Y;Df#0i{se)SkQ${2T-l#SM|sVvYQQt19I^LOnx=W?}?r4_ry$= zqk)Xly{aq3S4k)rJC-S)oL{pRB9qp#xE^}PO3|!^P_ZP7OH#Ovq755`A=r385z>&N zp^(D$N4`YwU6B~>;+G(Y+g*{vO?XKqkEM1X3-yG$9aQXqimrelu3>iuF2drsY*9Fs z0sE0jk^ae%)=4U<-A?p=9D_{yTNL;?b)5nh!Ypaz8yQ|PFLKHx&$Q{O({F>sZR1fo zhLmX_Jdb_|W!`wlpwa$``cJ!|sk4vV=gHupR0hBcPf**@@l0J(u#@xXPH~%+4xJ?b zh1uwN7qOGSu%Yyu4q(KROhuD$=8Y&IJ$4e6)TFXg1vWP}Vf*CyD8wH0QApZ>qaH3t zJx$#d+Ul+7m5SiYRTTMOY^OnmLsB4`*HQkS27-L-eOj~OaGiV{*6B)+P<7b`l%V4O zx88r#TBi3OomEl&kGC7$C6F?V3u^wK23A3{zJJI-R$*#7LZbndxVBVQE#vMdZRH|M`Fb6CL_B3+wEI5JiY+B9(#KpthYpgAa>QV@1_i zscTZsg*sJI&JT5ANjVpxiHh2zeQ9I_dPH3}xjTkzKvd}lSS#ofEt3cjoX~ccRd6oV zaPrrW2SXxA;Hb90B8XMk^UCAcuqrB+6eAx%JaB$qfYI_S*M)DTyWupDV*zoz?j6*?f1o;0T;CS>oDd>Sbea7G&xP~+(;G98?faB&rwMSF1dx|n+0T&xVr>FbrXtV{@@c(u@rI(Tdfg;FHl8}{e z^d2l#@otdS;2t%Qz(U5obXoyj4K%obn!3-G8j#9Z#^n>cT2rIMYjCj{NFg3sSSIoL zNI@Z!20SM}j=`uf@1z@)AW+`F{hG`QRm%e`x=eM5Zp*2+M|kAHU(?WqAZjrkd#$7$ zTj`G>OK!9#MlIGD-nFKx)PH&t+(Ff(l$;KX(H6N0O5t@iA+t#&%>vIA6!!Ygc97PeBu)gXdL9`_HbSR_^kHKLX6UZgIq`2`BBaN&}aZyj!&g@~n@klu)x>ECmkqV5lD zXDEv?0R7WRLCgwZ3@r;0ZaU&8wOL%87>x%)K51<9$QG*ZbP~}g?luN|bk-O`VHA$2 z*o`^tmr;RZQ~}UW5G<5x>`WX(U0I4OSmi6jw_17VC0CG`g7SAm;$UUHi(A|c0sL*n zrHzYKrQ&ew6qVG)BNLs(5ZxDuuDjlfW723k`bHa=0$yM&g0L@!3@maQRaZu|R80W+ zTT|pvmdTzV(jg@XIXYDcrV0_S!hOunoe295%#~QvLgX7LU4_(&Zk`d6Qb-0|1+My3 z|9Oc|N+NAuS>w->9&wC7yp$-%6G2KWx07eeJ?hy5Hab5OU9yO=mrO}$`+2z;4< z1gADi7ZjOV=oF;9h#T-3a`u}DCrKbED1dU;(SN{x7?+yWWmO1(ZC)hqZr*H7?G1Jd z9PEj`)%QFN3)F$(kfCM7+BM{Vc!^sn{dp=qG!l0Rl>Rz-FqQrS&Jc3;M^Nc;;9S?! zBkQiH0JzW4!iRwIkch^uoTkDBo3KC1lawTdCneQICn2yN#{`NOQ(8W9DwNZI~RefI&5C4O_iP!D1JApkpCRIlGuT8x%zH| z#FUOc7-@C)pnE2ZnA5&WZw+W0w*1MNt7!FWwHZ2wRliY+#cJFr#jvup%1a&!34+qS zn#;C7NCK)BNH?tE?~tN@A`+vH2D*I@UTl?Ybol}s$P_lru~utQSfX4jOcb!r*kXj| zgihPY9NV!(*w7_O3mUrnVX~ns!(vVCp$y&jZ0PoA9=aMDx>0QCMm7)K9>Jme95t_F zS>riyD;F4B4qH9=*q0Am`-|G}v6Y zc)_ZR&Xpvq!G)k6UMGPpO6`r_jKZU9_eN!u4@^R6*xvHDn1iWnGvUk8cC=t$>d;Z> z(4e*OXdvs3)HyKxz^OwYM%SVeP>$#y-G%_i_V4}mB2HA7tft)1AgCorBd5k9l^n^;NI9IDQE~$YL1R(0 ze1VxgduW2RAlnVG%i=b6dNPchRWKMJ#S zZ(L(hoO~a1N|0AEbBw&4nd9X0MtvD_0T6=8b``j;F@uG`DV8p5nA$$Amvt#SKmveq#xO~rBz zv(mY*{2sHeBkLh%T~F3Gm~{hLw=pXnd&$o*>t?b(25afwApr%%IQTdDBkb*%*ailE z34Eb_4oWO95FrkiJm!KYj!pH3 z54iMFTzc5ssRAw?6qnxic98*>OBgFCh{oP7D&X=3b190ko1&Qu4!Ox?W)t&7;d`V6 zSY}WmOV0`5ZgnW$!|Q;1sOsm!W9rUBmIzBf+@alJRRr_e7oy%69#i-YRE_S{;Id8A z@h|aF{y=*EMwSp>i%=3eUpWdWrj*!p8BNO_xJPH@4bRb-#$~Wbl3<1u0K^=iTXhdM z7L2D5xOA(XTjdE1j9wQRMfK;uE^51&^{_s$54amDU(`Z>7v&5+HvA}}u)}WG~wV+Sj(R8d(XI$0Zu~6*n zn8utiA8~d4;1@-fj-~ZcQdb0*u3@3V9n+-n(UirDR2YZ)&RiJoq>)TV-3(}BQU4`1It)(>G*G=)Zw`MQgKVkPYjcR?EUgI@ zJ1oPTg`=+p9ZgkEItu!rGP6|a)e zDivD6BWS1?b}6-?Rr5jRd|i)V7;P&rXw9G-Ug#>ICEL|NLJX63V0M<;XQ?o->OwqB z{tcZX@Qz&%T0<%mWjXN~bg5KT<;W0$Na6*!5hwdgSUc|spH?T~&4j9Am5QVnvEgKj z%pf0dDzK%z7SaGYp)1|>D^q{m=l+SCUf0oZaAj)!KKGAYJW|3ERS=CmB_2xiOrn(; z>EM#0e2yKYX@I0C9z+t(+|MbUv@Tk`!`(2z9a(}mib%fVTq&eEu>n@b)Fix2uNr&+ zPsoK;^*Y$8YI>~=RB)4P`=DzKT-imSFi%cc7SJA-RrV8I`3%P%ZzJv4_XL>&P}Ru6 zQKYMIA_S-2e?kjy+9o!+Ko1(*-{F!oHf9)dePj;^oR&lG(@Hkv&>8DST!b28(SmK* zd2nF-)$I9ONFTjRo3e2z7&{v%Zil4s(#5FW7|0zx^5}BRMHNeWL#&#;DnsJA1+-mD zdmJg_mH_yPxH^g4gZ#v|kfk!<6@KE(<|0I*2)I*0X@R+tffTS?9D0m$C~ioRhoRH9 zWRv4~m#cdZ$wNIh1)|;d8p`{N$7sG`mjt`YsVqO*|I(KJS(rp~HQgTQDLa}1D9YO2 z!g`DzS9esoKjCP7DNv0|f!BoNQlPlcBjR2)yDY%-3O47;C?Er(!m0!tPW&ML8++YGgAJi6b1aZL-2K z;UH(~$&KBjlx%5pUDuIapM6(GT!orlx3r0*F*YYdb8{jTkX2*$gMOT&e!PiFN6;#I z%L$5T6OVvVffGD+*({7Tzo`Ko4}%a~C{S_!KC~YcXO7(qImfW`NS4L$fRVJ7N8;Rla5m3;eGWUyoU~@QhD%O&Z z5tWEX=y+m!ZonR>J%%(r@+;_txQ^Ot<4EW(J`HX6Vs&M>nKlilf4n`30-2zD+2h#-VxN79CkS9WquBpQtiXS&ZjdbGC3RLT~-1RGJD0fYz7s?R= z`;RY+sl}R?W@e+ABYZGkV7+v7zybf>8#$oRe!$n!Up0NLpQ{Lu*)x=+ILf)YT1I~2 zjpHPwP1LfOh=+uqpnI-T#KpMe5Ip3FXNh}Xj2i;w=-{#sM!1|1C=l)s3vfDJ?42TC zM+HNdrWps5Uq_`&E4w%-{H;Z6HQ(heZw%b#oxTruU^y{zs@zBv3w21Q_JPLfRvM?m zBZwHh_H+PYh=2S%%)o%ac!dtJ%kT0&jsTF5EN=>@%p=!P{6BW>X=g2KfTmlzXcd)w z{8w_sC{@dYnv(vlF?ry z7_2d?aN?Haudb?5L1-`VPP5o;RY!Vb`LOs-*+Fqq;PK|VPSsQWd#XNUhvF2LJ>&j8;6LUC`rH(&_B2Jisp0DOQIfQJFw0Ve=5;36PAG=#erFbFUL za4R4Ouo$og@EG7(z^j0xfK!040QG>-un?{%U=UygU>sluAP2A*@BrWizyZK1Kt15v z@DQ#)fCo$lgtiOeq5&}gBVZihRzMEm4!~-_V}Q$l zKTqePjziaXC#V};{V*5x_>;|i5&JvHmm5Lh0EvJkz-DlFHvu*P)&tf7Rs%`^3js4`44Z*qocj)`aL&*hGsr$CEkl!* zo134WCT8d7kqeG8pmuN_U}V0}y)aw!`0~@eg@qh9zc4-D=k*TD$j#+^Ql6MS->dQZ zeEB{N$92XjTk`mcNlA(eeR4@-CyZ|K$t6roj2}Cpr3=SRHfs&W&K=|PG-(9|x!FoF zG+Akdn)zuNUQHU@MbSIIK-7r&n%sPpR?PBhMrwlj=Vs6GrTG?Vvhz?jpEq61T{Ntt zC)b-+=+&g>=ZR_Qh=~|2QXg2TDU=Ed@_q2}rp?!6q5|_#F{AEZWg42EKffS5*PEe<9iE=+yIGSd<)u^8D&vEj=#$b#R386W zB@%LT6VtNuSly}Kda8F`zNqo$8LM)Q-8^Ag|L?R(p`qHrn-BT#+#h1 z;9JZ>q4V?7y~F-EJ}4h5o0jqziIk{(%^73_{PjHfOL=K?P)zik<`9}JZ(4y;TBM`5 z{7xMgWVeXO+O0XB`Ks{>#f;yHXQFro5_(%vwojDOa+@27T9Rcz<-(Y_3hrm+=Xo(I zhoj@b(1=vUrgG`56tB77`32rQ8V7~>z(a<&C_BAH*Z_{a3kxuA&|?TQEk`HHp=0=w zkYgasd~~~PG0W%0NJKA~cX{}$<0TL&BTY<0aXTwb-eOp?LGSb4E_n;7Fx1N@2PPRb zpy>6@&&Gg4r=#|!?k?p?g@nKbY5#*m9(C3-9R6m%_vWG1^7H0<^F-8v!ZIBGX4o{} zT!{h}2HRB2##1IHF_8vrL4J0g$ht30YhKoKF_&kj`|=C(Geu2GHmlvp!GoLdFkYGL zFfDN%F%E_e8^$>beED;In8otaFdIvG^YZc+G=hV*q{tfz}dh@ps=$8VT$G` zE7;XTa$GR%@1~cr2t5Nu3QQLn7+ryBpC)ob4>vm)rg@gcilF$;_GSf({ZEV3BJA%K z=?Z+bC{qhepj=nrt$EFA8E|$%E*2&lYnbAw58RfjNzctM#4M}S?{fbZzO(b^=Vh}+ zv@m-vwRNk1b1-GT597@|3WwN=pRm(MH(>e^=d~$N~Si-G)3^!ZK5V2y5k}nSf zAAVP0rzsh(1rCGw{>@6a2=|-lYvE7Rf3VG4q7D5gumojf7dE44ep&(W5bRsOSBPMk z-z)&ty{W(db^&G=V#!PMDJZ8Yu{ohYzw~CN5t-An2F<8yN}n~^Z^c&%-zwGFKm}_A zDqpKH8yKwQE@FJ=XDVeVqGcIvRy2pTJ~_?~^aQfc6gX}%;3j~>A#hHoz}*P@aKKQ& zV89^2;>8Ga6HJN&SOSQ}oI3<2qF|4O_%IzX>CWA7z)GktfZZu;Z4s)8Z?1r#F88R_-}Bl7Z3yJ0f+=} zfD2!9QD*@)fD?dYfaqGh&jRHZrvZBbn*m4Qz8A0?unVvgunn*kum!LgupY1uuokce zuo|!uPzERgECwtDh=2k>E+7k#0hkS#0hk6z26zDD0b>9OfH;5yzypi`Eno;B77zo_ z0HOgZ00+2mmW%ora1^i$upY1&FazKK^aj+|Aq-$AU>%?UkPJuw!~u9fEFc`v@D<)F z0@MKZ0yY5_1Cjwl036^n@U|PU9#8;C0K@_ar(=Wr5AR4Hb|Pr4BrHbQ7sTgfBo$=m zjm!tZfOeYa_2qeUu_n_d4?irnf&Jf9Y*+FZB+&wgjUwEq6ncHiVmr2Z;}oyN8IMjA zkMxVM+!sg%EFI-rNrp?rjuLC)i2Q}|+>|8uhuPq$!y`RHoHS`y5izTj7)Hk z8a-z0xLd|2PMGMKG&w05T1KZ$zxB2msWWHIPMd@NnK?HrJ7-?*{Ji{v+kJ(iRJ35> zqC4(fT)bo{7g18OqGVYK2%xYPB`cPfM7L`P3aGriydB4BwIv=rucYE)2lAe&C7^FW z1bI9wQDseR$;uMM;y?yvWo4;U?H3jlEGQ^wMgPG2|NKwGUH%sfdQ|zl+~>Ex$DphK z-d`Dae+`%Q|GNi-ENl9M;L{)a z1zV8J~p&@_lFBt!~`t*Oz?VpVR$|)Lu!5rzU*&aorUjK#P<>CKWZJR?yfg9ZV z56oWtN|r4zEh}Gf*UE}j{?(Ot-?Qf4`|e-+rw1Nf_t3+Stbg>e$2UCjQ0W$g&7O zE-`UEU>QImZlxC-Q)}fW<@@fK8JKEO%7>MI)FUHTSRG4e2UABOUvVu z(y+D7fCr`L%VxIZEXh|GaGUDQ$nyq1lEL01=fwOx=9?r1%rueWa)`$vJcn=;hJ!yh za^i%EQ<7uI4k!2^0Ky?Saz>sg1B!wYp3dq%YVb98=)FJ z5gpbd?$&HPuvh`M*R~dpEvyh#Zlq5rjAmx=d)`D$%J>Dpk6z~gsi(F7{9#*R|jFgT0O=eYMsvI`3yV!`~GjfjXn9Vl#BAa zhRBeb;8$x?i(Nt6nfHJ1%-hI~1n1Q|CM_=`*Nao>kzj<2-cdM_jOSKi1)~$FvH2r$ zGV9CF<*o|@W8Yl_&Mn8i89EuvTQH3hC7f(=+?uedY1!had|wjyb-7-J)4*L9ItHgy z>{x)?7}Ct0AXkoi2Wb>Gr8p}rIe2Q6%oy@q0_CUJJ-+OGa6%Sw`GGP9f^f3~->ew% zU<9xnm4k++6AQ*2xt;PSP6s<=;kceGU<46m!j=57u_Z z`0PAjrIuV$yuL!PRovi)%xo@o)5-gY7HI_?^TMX&;Q$qA&TubG$I_4Zz%x5q8AtWJ zs<$PRR8$OwR|*$kwq;TYscdwf z#O+YZpN3Q60%EAea~DAodA;uDGsh&xyDkLBjKW^&!CksajH%q(u&LP@-jP{pzU2Hw zI>Q~Y2;wDEe>O5Osn8o9}#<8dw;IPyfx^&B3NsW%#<2h4{a!i!O0!gHtHns{il}iX6KQb|` zKxtFd&)xDHE$}L(qWDt(K#12`yCBRrI2)A;vj{6Aq|8iABCS_4^z&_0Cg0f+_Q_CI)LVO%)Z4hPLRA?7-89l1`>XE`Nl z#H{4_St%nG-t!0=aI^9yaaJ~V0JNqcKwxYGF|)F;mdsiJQG{7ZULPcDIO;940s*j1 z$i_+Qm<0$K;55^2LU98N+b6dC%rD?3L!Mz4j-h9{ixL7KY3Yh3ko;ut+-&q_ABuwp zg;(GcC8Tfkh*=4U()Me^KpO_yFwlm9HVm|3pbZ26+cA(FuNw-&Yp7NSb_rz2Cwv+A zw->K}gT&6+kKBTGGKs>YciKV&K)h12hXZ;5aE#9APska9@*^2Rj_ER21x#{_1VFrz z`E`OB^rLi%b|n)^cUiiWIk|y!@{{TS#J%BL64*}t&CGtb?O~0V2d^LanGxw|cUoD-hg%7$1 z&0ze0r}<5QpG~+Na|UucFnhzKHahnu7e#G14JP4p2u#9#!xvl>^`~l>U14s4Nqty^ zc|FYWFnhv`h6&a6+{dRO*8_7K%)T(!!o;?T)56ritpA*g>Iaj9*&oL2&mfNkb39Bs zJaNFh1LhEz4KQP260^Jq%+o0A2>{s7O}`Q<^gsDwyzQobL%%+-(>SEx11;>8uoFJ$ z2Q4m5_Ip~`*R-&s4>yImuZ8{o7Iqr99Owz-mcjqkZz|{I zWhK?Z!8|z~2Wz>jc8X;54; z>HMCcq(J#T2Nk7o<~&KsWc;^(o`iob{uroST?ruKIar9x?S0{42iyuEy7fW8%YYMr z?*Uy(R%?An@$nq1?IOsQSBsl~_#p_LhS%+HFfVN*7 z2HG&thJiK=v|*qP18o>+!$2Db+Az?Dfi?{MCt?7cu{a!_b<_6JYP2_M2Wf|EjasYL zrA^R|)lSeRX{TvZwdvX{?R>3IyFj~GyG(nRcD43i?E~6Jv>UWfX`j<>)xNBKRr`i^ zulAt!9qkG2huTxx&$Y7lYwh>idhIXTP+fanq^^suyRNscpYA5zV4YUy(M{2bx)PmV zcb{&P?uf3Pev*EgevV$$Kc;_CzgPc({ww`2dW|90pfy+wg5h?X`BC#RbG7+1^96HXi_Vf@nQFz@PqL@lv+a_7nZ45f zu>DExCNyogfI~gvr9K!tFw_uu8aJcvN^scv+|t-V#m=vI&O4mwL-in)9IZJ?E#+ubn?RLtPzR{aiy`HrGg3 zqHDU#>$=@l>{{iz&-Jito9hD?I<$u4_J(j=S8ZSI&03wdOdG8;=$yK-XyLWGzv{lx z{iqAqN9rf*r|TE#)rOvierV58hM9&8Lyo~`C^0-{c-FAn@V?;_gKYTL@Pi@Dc#SdI zINF$E%rlC{JB-VXYm6@#Uo{>zerf#HSZ{1Jwlj4#^)Om04}>W*%T3W;UAVnv2YLo7b8jHa}_JYJS^%(tOSwVNqLpSZ=V~Xfarv zX!8Y@6_&>=n=H>-{%YB6Ic53E!tvMfH}J9iaNfj^wEZ{y zPkfa1ChKr3Z*^JS)+F?R47C5Bt*=}6S`S&@MKAc(+R>)5nQboH7~4eK6kED2&nDWQ zwr#h)Z98E*Y5UA}&UTHxr(J6wWuIuDW}jvE+6(PV>}B>H_7iCR3-&OF!!gD&)iKAB z?I?1TJ61a$a{Sq`2W@`L@sZ=SBSh#a+$0PaY(l&+UYH@I3wH~T2~P=s6AlaC3ys1x z&OXicV=753P5g7A6jPGiU zTu#?Xcdf3MuD@=YE*E2Ug>H@RQQaQhF}dT;eYL*Au*dL?;esK;IL^4p zxWRbL__?vWX{2eADcj^TEey2Ky{7f1ji%>JFPUC39WlLYsy3Z6oi^2>y?!yZGj}$3 zHQ!_&V%D2^v(xN0d(2bKv(R?)F-}*QSDWuMuQNYxe%Ab=`4w}Oc|TgQ#{8xEtob|h zkLGYoCrejLFH1j*(PFd2Sw>mLTaqj@Endrfi)6Xea<^rz8Er z@}5Pud}Fy_`3WuEp1+pAp6|!sjMg5Fw!W30%P;14@rU^L`BVH4{4acGYhSeQ1J*~Z zTddoy`>k(VKeB#i{nmQX8fNQg>u&378*I~~ooCxJY+1HkTLId6p>46P#8zfoX)*k89Fu)k+N&&GZ? z$3Tb9;dI=J9+2l);#lK&*zq*l|FGi&#~H_u81qrW5Wy(K2_9jNkSi<_{=`Q6D`@}s zFxGz+RL)3elr!4d!`a)ZL0_;qCFh;a66Y@GA!lco#fX}T=#un>`sef~^rH;(4V8vdhR+RMjR%cy8$UIEWehb9M@yHYUALN! zn?5wjCeGXk?Kj?>WX?4gqm@pZWwg^d%&+z41~X>~x2PM5dCa!A^9%WMej~=+E`Bfn7XKc9npau7VaC1Ls>R3~ZOyfc z)+N@vtZOj#9>eI{Vcl&#Z0&CMUNI4YbMdN~uF$q8eQ&ZBdHE?6CxYma07`$enKCF^e0W$K>SRq2lF`s!o# zWA)4Q_vk|m*J4fMG5?8%6$ZcIUc-YJKL-r&V*Kr~H@vS^hiVP>t0|Wjka4#?CpqV}%*uFgOIqD91!c8rGO1$5O`% z^tJ~a>(Sp{0M-rHj$&bPnAFT^i;RpKhV981utaq{cKh_tNR|S zMSJ}<`mXxk`kVE`fwNonv-P*5_vM-wnxDg3-O1vy46qKfnyq84nbtR~8*R_o_F_zF z?YGz`+n3uPv_ES9v;BGd5qpATv7-#NSm)T{*nxI`+fnWKgpHc(g#lP4-9n-;UC2Z| z)(Vdcn}j!o(P;5(=VQ+8&MM~@&TpJQIDd6IvGUDxRl5G_`n&6t>zs=O1jnGQyJ-zN z8!P+!m<@*;vJ82KMTT<2!-frpXAD~nCk!VIUl`7#RU?hvjJ=I!qs!5i|a`Qcy z_uesIXSvxj++w%H0}m;nRTf&7VkAAnD3%v2FI)a*dDC*hauhw}W6NpF*OnhGzhX>v z;5+kO`5qWqH}QIY44=eLLr=-#3)u*}pMQvdhTn%iBJvh*5*D;!JN+6#HJgT&}YIC)ZYPT`!k!VJZZm6yR8GPz9?OjAJZ<(i&0ePy}< zD~QWH8Z(f`oQxT0Bi4%p<|F2#<`bavK4vr0Fsu~3#eucr&z2W0M=ZxJ)xcJbC4?W$ zr()j8;&b@|UIcCy^CegZj`An?YW`zhK%bjp`@t55mAb(GrTr)S0L(Fh<8H^Zpu)~N zE;@d8a6&uG%5lO3%*782p9rUgI^mpfNoWw}IYm%e9HXdsm(w-LmEy{A6|gz@KG!P@ zFEy?&T;I8%e4E<<6h&)ig5qAUEy8Fi)ycXabkX`D`W*d3`bmZ=Lz=PJXfUOi9yGmZ zPPT-j>`t_21>Xr2NuKpf>lmy-ccIOmw(Yd-u^qF0V*3(h53yfo*V_{?R_55}+3y0q zxy}BX{X=_${VqopMu^MlajtSc=zPNY7w1mro6bvU!49tet|2a$E6ueIEr^1la2N($ zf9w+O($;EKC|`wcz3v6wL5$-Mb?0;)^f&5<>5Y0pKLT|9Lj4o^zv|!BKWKQ((B60p zsP*@ZR+Gn+W_r}L*Yu9*YmDkI_(#y&zOhDtUiM?M34gt%f|qba|wkj;c~SeuF3 z=jna=BK;luCHm$13jG)QpY(B{Cnp;+uqwT0Of<~})qfvoL82+fnWvfWH21Ldw@kC- zSxPM%E#F((15dZIIq_@0o)5QPYwc+rXiczAuuiqku`a-RQf7VF`m!|z^U7IUXZ!W` zIC~=SHQPSiF&Q*?iQ^r|b)d9Opt^1ml7yL{x?UHipq~$PJ>}wdD>B7J+Ml%H*zXKL zZ#L;hfF53?yH>?~x7t?N zUa);(`_|^N&#KX%qQPdjDjS?4+D1!ujp0lhoirNVfRaz(p( zxO#)ah(Q|;acNyf7w>Yo;#>)?F|P40k1N?V%{9X{+m+$Ua^+$ah^~d0BT8Ilu9dFU zSXbAgudR1&0Clq2wZ*j+yN#W$U9R1rTT#h#bP9>OV<$DuzR z&v4Af++Tv#YXe*FYa9(2ml}-9*+Pl1LD((SK#`-y8Hcq!7xmqYHJui4!e1nI!3VJ3 ze5^mMKdZl>Z_tMuA`Q`o-i8>%5QEX+FeDhp8{%hZSWYAjngo@ z&o*XYe$O=)V2)pCEHP?OrV^||8ys6fd7O5f!#Y~e%A*n@1GI-x-~|UtmmrJ*9q$p6 zvA)hgSu=zzP;~`@C@d5fqvU16N@2CI2J6*2VLj@xN!ToG5w;53&?|PKR(k`~%L$=c zkTL6A5b81SaL#aNkPg%^>IKzo`?X=94Fhc$Xv07o2HG&thJiK=v|*qP18o>+!$2Db L+A#2c2m}8Q9Dx +#include +#include "WDMTMKv2.h" + +HANDLE _ahVTMK4Event[MAX_TMK_NUMBER+1]; +HANDLE _hVTMK4VxD[MAX_TMK_NUMBER+1]; +int _VTMK4tmkMaxNum = -1; +int _VTMK4mrtMaxNum = -1; +int _VTMK4tmkCurNum = 0; +char _VTMK4usbFlag[MAX_TMK_NUMBER+1]; +int _VTMK4tmkDrvnum[MAX_TMK_NUMBER+1]; + +HINSTANCE hUSBDrvDll = NULL; + +DWORD TmkOpen() +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[6]; + DWORD _cbVTMK4Ret; + PEZUSB_DRIVER_VERSION version; + int iTMK; + int nTMK = -1; + int nMRT = -1; + int loaded = 1; + int nTMKb = 0; + int badver = 0; + char tmkName[32]; + char cc = 0x5c; + + for (iTMK = 0; iTMK <= MAX_TMK_NUMBER; ++iTMK) + { + _VTMK4usbFlag[iTMK] = 0; + sprintf (tmkName, "%c%c.%cTMK1553BDevice%d",cc,cc,cc,iTMK); + _hVTMK4VxD[iTMK] = CreateFileA(tmkName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (_hVTMK4VxD[iTMK] != INVALID_HANDLE_VALUE) + { + if (!DeviceIoControl(_hVTMK4VxD[iTMK], (DWORD)IOCTL_TMK_GetVersion, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL) || + _awVTMK4OutBuf[0] < TMK_VERSION_MIN) + { + badver = 1; + } + _VTMK4tmkDrvnum[iTMK] = iTMK; + nTMK = iTMK; + if (iTMK < 8) + nMRT = iTMK; + + CloseHandle(_hVTMK4VxD[iTMK]); + } + _hVTMK4VxD[iTMK] = NULL; + _ahVTMK4Event[iTMK] = 0; + } + if(badver) + return VTMK_BAD_VERSION; + + if(!hUSBDrvDll) + hUSBDrvDll = LoadLibrary(TEXT("USB_TA_DRV.dll")); + + if(hUSBDrvDll != NULL) + { + if(!(ptmkError = (int*)GetProcAddress(hUSBDrvDll, "tmkError"))) + {ptmkError = &ftmkError;loaded = 0;} + if(!(tmkconfig_usb = (htmkconfig_usb) GetProcAddress(hUSBDrvDll, "tmkconfig_usb"))) + {tmkconfig_usb = ftmkconfig_usb;loaded = 0;} + if(!(tmkdone_usb = (htmkdone_usb) GetProcAddress(hUSBDrvDll, "tmkdone_usb"))) + {tmkdone_usb = ftmkdone_usb;loaded = 0;} + if(!(tmkselect_usb = (htmkselect_usb) GetProcAddress(hUSBDrvDll, "tmkselect_usb"))) + {tmkselect_usb = ftmkselect_usb;loaded = 0;} + if(!(Read_DLL_EvD_usb = (hRead_DLL_EvD_usb) GetProcAddress(hUSBDrvDll, "Read_DLL_EvD_usb"))) + {Read_DLL_EvD_usb = fRead_DLL_EvD_usb;loaded = 0;} + if(!(tmktimeout_usb = (htmktimeout_usb) GetProcAddress(hUSBDrvDll, "tmktimeout_usb"))) + {tmktimeout_usb = ftmktimeout_usb;loaded = 0;} + if(!(tmksetcwbits_usb = (htmksetcwbits_usb) GetProcAddress(hUSBDrvDll, "tmksetcwbits_usb"))) + {tmksetcwbits_usb = ftmksetcwbits_usb;loaded = 0;} + if(!(tmkclrcwbits_usb = (htmkclrcwbits_usb) GetProcAddress(hUSBDrvDll, "tmkclrcwbits_usb"))) + {tmkclrcwbits_usb = ftmkclrcwbits_usb;loaded = 0;} + if(!(tmkgetcwbits_usb = (htmkgetcwbits_usb) GetProcAddress(hUSBDrvDll, "tmkclrcwbits_usb"))) + {tmkgetcwbits_usb = ftmkgetcwbits_usb;loaded = 0;} + if(!(tmkgetmode_usb = (htmkgetmode_usb) GetProcAddress(hUSBDrvDll, "tmkgetmode_usb"))) + {tmkgetmode_usb = ftmkgetmode_usb;loaded = 0;} + if(!(tmkdefdac_usb = (htmkdefdac_usb) GetProcAddress(hUSBDrvDll, "tmkdefdac_usb"))) + {tmkdefdac_usb = ftmkdefdac_usb;loaded = 0;} + if(!(tmkgetdac_usb = (htmkgetdac_usb) GetProcAddress(hUSBDrvDll, "tmkgetdac_usb"))) + {tmkgetdac_usb = ftmkgetdac_usb;loaded = 0;} + if(!(bcreset_usb = (hbcreset_usb) GetProcAddress(hUSBDrvDll, "bcreset_usb"))) + {bcreset_usb = fbcreset_usb;loaded = 0;} + if(!(bcdefirqmode_usb = (hbcdefirqmode_usb) GetProcAddress(hUSBDrvDll, "bcdefirqmode_usb"))) + {bcdefirqmode_usb = fbcdefirqmode_usb;loaded = 0;} + if(!(bcgetirqmode_usb = (hbcgetirqmode_usb) GetProcAddress(hUSBDrvDll, "bcgetirqmode_usb"))) + {bcgetirqmode_usb = fbcgetirqmode_usb;loaded = 0;} + if(!(bcgetmaxbase_usb = (hbcgetmaxbase_usb) GetProcAddress(hUSBDrvDll, "bcgetmaxbase_usb"))) + {bcgetmaxbase_usb = fbcgetmaxbase_usb;loaded = 0;} + if(!(bcgetmaxbase_usb = (hbcgetmaxbase_usb) GetProcAddress(hUSBDrvDll, "bcgetmaxbase_usb"))) + {bcgetmaxbase_usb = fbcgetmaxbase_usb;loaded = 0;} + if(!(bcdefbase_usb = (hbcdefbase_usb) GetProcAddress(hUSBDrvDll, "bcdefbase_usb"))) + {bcdefbase_usb = fbcdefbase_usb;loaded = 0;} + if(!(bcgetbase_usb = (hbcgetbase_usb) GetProcAddress(hUSBDrvDll, "bcgetbase_usb"))) + {bcgetbase_usb = fbcgetbase_usb;loaded = 0;} + if(!(bcputw_usb = (hbcputw_usb) GetProcAddress(hUSBDrvDll, "bcputw_usb"))) + {bcputw_usb = fbcputw_usb;loaded = 0;} + if(!(bcgetw_usb = (hbcgetw_usb) GetProcAddress(hUSBDrvDll, "bcgetw_usb"))) + {bcgetw_usb = fbcgetw_usb;loaded = 0;} + if(!(bcgetansw_usb = (hbcgetansw_usb) GetProcAddress(hUSBDrvDll, "bcgetansw_usb"))) + {bcgetansw_usb = fbcgetansw_usb;loaded = 0;} + if(!(bcputblk_usb = (hbcputblk_usb) GetProcAddress(hUSBDrvDll, "bcputblk_usb"))) + {bcputblk_usb = fbcputblk_usb;loaded = 0;} + if(!(bcgetblk_usb = (hbcgetblk_usb) GetProcAddress(hUSBDrvDll, "bcgetblk_usb"))) + {bcgetblk_usb = fbcgetblk_usb;loaded = 0;} + if(!(bcdefbus_usb = (hbcdefbus_usb) GetProcAddress(hUSBDrvDll, "bcdefbus_usb"))) + {bcdefbus_usb = fbcdefbus_usb;loaded = 0;} + if(!(bcgetbus_usb = (hbcgetbus_usb) GetProcAddress(hUSBDrvDll, "bcgetbus_usb"))) + {bcgetbus_usb = fbcgetbus_usb;loaded = 0;} + if(!(bcstart_usb = (hbcstart_usb) GetProcAddress(hUSBDrvDll, "bcstart_usb"))) + {bcstart_usb = fbcstart_usb;loaded = 0;} + if(!(bcstartx_usb = (hbcstartx_usb) GetProcAddress(hUSBDrvDll, "bcstartx_usb"))) + {bcstartx_usb = fbcstartx_usb;loaded = 0;} + if(!(bcdeflink_usb = (hbcdeflink_usb) GetProcAddress(hUSBDrvDll, "bcdeflink_usb"))) + {bcdeflink_usb = fbcdeflink_usb;loaded = 0;} + if(!(bcgetlink_usb = (hbcgetlink_usb) GetProcAddress(hUSBDrvDll, "bcgetlink_usb"))) + {bcgetlink_usb = fbcgetlink_usb;loaded = 0;} + if(!(bcstop_usb = (hbcstop_usb) GetProcAddress(hUSBDrvDll, "bcstop_usb"))) + {bcstop_usb = fbcstop_usb;loaded = 0;} + if(!(bcgetstate_usb = (hbcgetstate_usb) GetProcAddress(hUSBDrvDll, "bcgetstate_usb"))) + {bcgetstate_usb = fbcgetstate_usb;loaded = 0;} + if(!(rtreset_usb = (hrtreset_usb) GetProcAddress(hUSBDrvDll, "rtreset_usb"))) + {rtreset_usb = frtreset_usb;loaded = 0;} + if(!(rtdefirqmode_usb = (hrtdefirqmode_usb) GetProcAddress(hUSBDrvDll, "rtdefirqmode_usb"))) + {rtdefirqmode_usb = frtdefirqmode_usb;loaded = 0;} + if(!(rtgetirqmode_usb = (hrtgetirqmode_usb) GetProcAddress(hUSBDrvDll, "rtgetirqmode_usb"))) + {rtgetirqmode_usb = frtgetirqmode_usb;loaded = 0;} + if(!(rtdefmode_usb = (hrtdefmode_usb) GetProcAddress(hUSBDrvDll, "rtdefmode_usb"))) + {rtdefmode_usb = frtdefmode_usb;loaded = 0;} + if(!(rtgetmode_usb = (hrtgetmode_usb) GetProcAddress(hUSBDrvDll, "rtgetmode_usb"))) + {rtgetmode_usb = frtgetmode_usb;loaded = 0;} + if(!(rtgetmaxpage_usb = (hrtgetmaxpage_usb) GetProcAddress(hUSBDrvDll, "rtgetmaxpage_usb"))) + {rtgetmaxpage_usb = frtgetmaxpage_usb;loaded = 0;} + if(!(rtdefpage_usb = (hrtdefpage_usb) GetProcAddress(hUSBDrvDll, "rtdefpage_usb"))) + {rtdefpage_usb = frtdefpage_usb;loaded = 0;} + if(!(rtgetpage_usb = (hrtgetpage_usb) GetProcAddress(hUSBDrvDll, "rtgetpage_usb"))) + {rtgetpage_usb = frtgetpage_usb;loaded = 0;} + if(!(rtdefpagepc_usb = (hrtdefpagepc_usb) GetProcAddress(hUSBDrvDll, "rtdefpagepc_usb"))) + {rtdefpagepc_usb = frtdefpagepc_usb;loaded = 0;} + if(!(rtdefpagebus_usb = (hrtdefpagebus_usb) GetProcAddress(hUSBDrvDll, "rtdefpagebus_usb"))) + {rtdefpagebus_usb = frtdefpagebus_usb;loaded = 0;} + if(!(rtgetpagepc_usb = (hrtgetpagepc_usb) GetProcAddress(hUSBDrvDll, "rtgetpagepc_usb"))) + {rtgetpagepc_usb = frtgetpagepc_usb;loaded = 0;} + if(!(rtgetpagebus_usb = (hrtgetpagebus_usb) GetProcAddress(hUSBDrvDll, "rtgetpagebus_usb"))) + {rtgetpagebus_usb = frtgetpagebus_usb;loaded = 0;} + if(!(rtdefaddress_usb = (hrtdefaddress_usb) GetProcAddress(hUSBDrvDll, "rtdefaddress_usb"))) + {rtdefaddress_usb = frtdefaddress_usb;loaded = 0;} + if(!(rtgetaddress_usb = (hrtgetaddress_usb) GetProcAddress(hUSBDrvDll, "rtgetaddress_usb"))) + {rtgetaddress_usb = frtgetaddress_usb;loaded = 0;} + if(!(rtdefsubaddr_usb = (hrtdefsubaddr_usb) GetProcAddress(hUSBDrvDll, "rtdefsubaddr_usb"))) + {rtdefsubaddr_usb = frtdefsubaddr_usb;loaded = 0;} + if(!(rtgetsubaddr_usb = (hrtgetsubaddr_usb) GetProcAddress(hUSBDrvDll, "rtgetsubaddr_usb"))) + {rtgetsubaddr_usb = frtgetsubaddr_usb;loaded = 0;} + if(!(rtputw_usb = (hrtputw_usb) GetProcAddress(hUSBDrvDll, "rtputw_usb"))) + {rtputw_usb = frtputw_usb;loaded = 0;} + if(!(rtgetw_usb = (hrtgetw_usb) GetProcAddress(hUSBDrvDll, "rtgetw_usb"))) + {rtgetw_usb = frtgetw_usb;loaded = 0;} + if(!(rtputblk_usb = (hrtputblk_usb) GetProcAddress(hUSBDrvDll, "rtputblk_usb"))) + {rtputblk_usb = frtputblk_usb;loaded = 0;} + if(!(rtgetblk_usb = (hrtgetblk_usb) GetProcAddress(hUSBDrvDll, "rtgetblk_usb"))) + {rtgetblk_usb = frtgetblk_usb;loaded = 0;} + if(!(rtsetanswbits_usb = (hrtsetanswbits_usb) GetProcAddress(hUSBDrvDll, "rtsetanswbits_usb"))) + {rtsetanswbits_usb = frtsetanswbits_usb;loaded = 0;} + if(!(rtclranswbits_usb = (hrtclranswbits_usb) GetProcAddress(hUSBDrvDll, "rtclranswbits_usb"))) + {rtclranswbits_usb = frtclranswbits_usb;loaded = 0;} + if(!(rtgetanswbits_usb = (hrtgetanswbits_usb) GetProcAddress(hUSBDrvDll, "rtgetanswbits_usb"))) + {rtgetanswbits_usb = frtgetanswbits_usb;loaded = 0;} + if(!(rtgetflags_usb = (hrtgetflags_usb) GetProcAddress(hUSBDrvDll, "rtgetflags_usb"))) + {rtgetflags_usb = frtgetflags_usb;loaded = 0;} + if(!(rtputflags_usb = (hrtputflags_usb) GetProcAddress(hUSBDrvDll, "rtputflags_usb"))) + {rtputflags_usb = frtputflags_usb;loaded = 0;} + if(!(rtsetflag_usb = (hrtsetflag_usb) GetProcAddress(hUSBDrvDll, "rtsetflag_usb"))) + {rtsetflag_usb = frtsetflag_usb;loaded = 0;} + if(!(rtclrflag_usb = (hrtclrflag_usb) GetProcAddress(hUSBDrvDll, "rtclrflag_usb"))) + {rtclrflag_usb = frtclrflag_usb;loaded = 0;} + if(!(rtgetflag_usb = (hrtgetflag_usb) GetProcAddress(hUSBDrvDll, "rtgetflag_usb"))) + {rtgetflag_usb = frtgetflag_usb;loaded = 0;} + if(!(rtputflag_usb = (hrtputflag_usb) GetProcAddress(hUSBDrvDll, "rtputflag_usb"))) + {rtputflag_usb = frtputflag_usb;loaded = 0;} + if(!(rtgetstate_usb = (hrtgetstate_usb) GetProcAddress(hUSBDrvDll, "rtgetstate_usb"))) + {rtgetstate_usb = frtgetstate_usb;loaded = 0;} + if(!(rtbusy_usb = (hrtbusy_usb) GetProcAddress(hUSBDrvDll, "rtbusy_usb"))) + {rtbusy_usb = frtbusy_usb;loaded = 0;} + if(!(rtlock_usb = (hrtlock_usb) GetProcAddress(hUSBDrvDll, "rtlock_usb"))) + {rtlock_usb = frtlock_usb;loaded = 0;} + if(!(rtunlock_usb = (hrtunlock_usb) GetProcAddress(hUSBDrvDll, "rtunlock_usb"))) + {rtunlock_usb = frtunlock_usb;loaded = 0;} + if(!(rtgetcmddata_usb = (hrtgetcmddata_usb) GetProcAddress(hUSBDrvDll, "rtgetcmddata_usb"))) + {rtgetcmddata_usb = frtgetcmddata_usb;loaded = 0;} + if(!(rtputcmddata_usb = (hrtputcmddata_usb) GetProcAddress(hUSBDrvDll, "rtputcmddata_usb"))) + {rtputcmddata_usb = frtputcmddata_usb;loaded = 0;} + if(!(mtreset_usb = (hmtreset_usb) GetProcAddress(hUSBDrvDll, "mtreset_usb"))) + {mtreset_usb = fmtreset_usb;loaded = 0;} + if(!(mtgetsw_usb = (hmtgetsw_usb) GetProcAddress(hUSBDrvDll, "mtgetsw_usb"))) + {mtgetsw_usb = fmtgetsw_usb;loaded = 0;} + if(!(rtenable_usb = (hrtenable_usb) GetProcAddress(hUSBDrvDll, "rtenable_usb"))) + {rtenable_usb = frtenable_usb;loaded = 0;} + if(!(mrtselected_usb = (hmrtselected_usb) GetProcAddress(hUSBDrvDll, "mrtselected_usb"))) + {mrtselected_usb = fmrtselected_usb;loaded = 0;} + if(!(mrtgetstate_usb = (hmrtgetstate_usb) GetProcAddress(hUSBDrvDll, "mrtgetstate_usb"))) + {mrtgetstate_usb = fmrtgetstate_usb;loaded = 0;} + if(!(mrtdefbrcsubaddr0_usb = (hmrtdefbrcsubaddr0_usb) GetProcAddress(hUSBDrvDll, "mrtdefbrcsubaddr0_usb"))) + {mrtdefbrcsubaddr0_usb = fmrtdefbrcsubaddr0_usb;loaded = 0;} + if(!(mrtreset_usb = (hmrtreset_usb) GetProcAddress(hUSBDrvDll, "mrtreset_usb"))) + {mrtreset_usb = fmrtreset_usb;loaded = 0;} + if(!(tmktimer_usb = (htmktimer_usb) GetProcAddress(hUSBDrvDll, "tmktimer_usb"))) + {tmktimer_usb = ftmktimer_usb;loaded = 0;} + if(!(tmkgettimer_usb = (htmkgettimer_usb) GetProcAddress(hUSBDrvDll, "tmkgettimer_usb"))) + {tmkgettimer_usb = ftmkgettimer_usb;loaded = 0;} + if(!(tmkgettimerl_usb = (htmkgettimerl_usb) GetProcAddress(hUSBDrvDll, "tmkgettimerl_usb"))) + {tmkgettimerl_usb = ftmkgettimerl_usb;loaded = 0;} + if(!(bcgetmsgtime_usb = (hbcgetmsgtime_usb) GetProcAddress(hUSBDrvDll, "bcgetmsgtime_usb"))) + {bcgetmsgtime_usb = fbcgetmsgtime_usb;loaded = 0;} + if(!(rtgetmsgtime_usb = (hrtgetmsgtime_usb) GetProcAddress(hUSBDrvDll, "rtgetmsgtime_usb"))) + {rtgetmsgtime_usb = frtgetmsgtime_usb;loaded = 0;} + if(!(tmkgethwver_usb = (htmkgethwver_usb) GetProcAddress(hUSBDrvDll, "tmkgethwver_usb"))) + {tmkgethwver_usb = ftmkgethwver_usb;loaded = 0;} + if(!(tmkgetevtime_usb = (htmkgetevtime_usb) GetProcAddress(hUSBDrvDll, "tmkgetevtime_usb"))) + {tmkgetevtime_usb = ftmkgetevtime_usb;loaded = 0;} + if(!(tmkdefevent_usb = (htmkdefevent_usb) GetProcAddress(hUSBDrvDll, "tmkdefevent_usb"))) + {tmkdefevent_usb = ftmkdefevent_usb;loaded = 0;} + if(!(tmkswtimer_usb = (htmkswtimer_usb) GetProcAddress(hUSBDrvDll, "tmkswtimer_usb"))) + {tmkswtimer_usb = ftmkswtimer_usb;loaded = 0;} + if(!(tmkgetswtimer_usb = (htmkgetswtimer_usb) GetProcAddress(hUSBDrvDll, "tmkgetswtimer_usb"))) + {tmkgetswtimer_usb = ftmkgetswtimer_usb;loaded = 0;} + if(!(tmktimeout_usb = (htmktimeout_usb) GetProcAddress(hUSBDrvDll, "tmktimeout_usb"))) + {tmktimeout_usb = ftmktimeout_usb;loaded = 0;} + if(!(mrtdefbrcpage_usb = (hmrtdefbrcpage_usb) GetProcAddress(hUSBDrvDll, "mrtdefbrcpage_usb"))) + {mrtdefbrcpage_usb = fmrtdefbrcpage_usb;loaded = 0;} + if(!(mrtgetbrcpage_usb = (hmrtgetbrcpage_usb) GetProcAddress(hUSBDrvDll, "mrtgetbrcpage_usb"))) + {mrtgetbrcpage_usb = fmrtgetbrcpage_usb;loaded = 0;} + + if(!(MonitorHwStart_usb = (hMonitorHwStart_usb) GetProcAddress(hUSBDrvDll, "MonitorHwStart_usb"))) + {MonitorHwStart_usb = fMonitorHwStart_usb;loaded = 0;} + if(!(MonitorHwGetMessage_usb = (hMonitorHwGetMessage_usb) GetProcAddress(hUSBDrvDll, "MonitorHwGetMessage_usb"))) + {MonitorHwGetMessage_usb = fMonitorHwGetMessage_usb;loaded = 0;} + if(!(MonitorHwStop_usb = (hMonitorHwStop_usb) GetProcAddress(hUSBDrvDll, "MonitorHwStop_usb"))) + {MonitorHwStop_usb = fMonitorHwStop_usb;loaded = 0;} + + if(!(tmkrawio_usb = (htmkrawio_usb) GetProcAddress(hUSBDrvDll, "tmkrawio_usb"))) + {tmkrawio_usb = ftmkrawio_usb;loaded = 0;} + if(!(rtgap_usb = (hrtgap_usb) GetProcAddress(hUSBDrvDll, "rtgap_usb"))) + {rtgap_usb = frtgap_usb;loaded = 0;} + if(!(tmkreadsn_usb = (htmkreadsn_usb) GetProcAddress(hUSBDrvDll, "tmkreadsn_usb"))) + {tmkreadsn_usb = ftmkreadsn_usb;loaded = 0;} + + + if(loaded) + { + nTMKb = 0; + for(iTMK = 0; iTMK <= MAX_USBTA_NUM; ++iTMK) + { + if(nMRT+1+nTMKb > MAX_USBTA_NUM) + break; + sprintf (tmkName,"%c%c.%cEZUSB-%d",cc,cc,cc,iTMK); + _hVTMK4VxD[nMRT+1+nTMKb] = CreateFileA(tmkName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (_hVTMK4VxD[nMRT+1+nTMKb] != INVALID_HANDLE_VALUE) + { + DeviceIoControl(_hVTMK4VxD[nMRT+1+nTMKb], (DWORD)IOCTL_EZUSB_GET_DRIVER_VERSION, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 6, &_cbVTMK4Ret, NULL); + version = (PEZUSB_DRIVER_VERSION) _awVTMK4OutBuf; + if(((DWORD)(version->MajorVersion << 16)+(DWORD)(version->MinorVersion)) < ((DWORD)(EZUSB_MAJOR_VERSION_MIN << 16)+(DWORD)(EZUSB_MINOR_VERSION_MIN))) + { + badver = 1; + } + _VTMK4usbFlag[nMRT+1+nTMKb] = 1; + _VTMK4tmkDrvnum[nMRT+1+nTMKb]=iTMK; + CloseHandle(_hVTMK4VxD[nMRT+1+nTMKb]); + _hVTMK4VxD[nMRT+1+nTMKb] = NULL; + nTMKb++; + } + else + _hVTMK4VxD[nMRT+1+nTMKb] = NULL; + } + if(badver) + return VTMK_BAD_VERSION; + nMRT += nTMKb; + if(nTMK < MAX_USBTA_NUM) + nTMK += nTMKb; + } + } + + if (nTMK == -1) + return 1; + + _VTMK4tmkMaxNum = nTMK; + _VTMK4mrtMaxNum = nMRT; + + return 0; +} + +void TmkClose() +{ + int iTMK; + for (iTMK = 0; iTMK <= _VTMK4tmkMaxNum; ++iTMK) + { + if (_hVTMK4VxD[iTMK]) + CloseHandle(_hVTMK4VxD[iTMK]); + _ahVTMK4Event[iTMK] = 0; + _hVTMK4VxD[iTMK] = NULL; + _VTMK4usbFlag[iTMK] = 0; + _VTMK4tmkDrvnum[iTMK] = -1; + } + + _VTMK4tmkMaxNum = -1; + + tmkconfig_usb = ftmkconfig_usb; + tmkdone_usb = ftmkdone_usb; + tmkselect_usb = ftmkselect_usb; + tmkdefevent_usb = ftmkdefevent_usb; + Read_DLL_EvD_usb = fRead_DLL_EvD_usb; + tmksetcwbits_usb = ftmksetcwbits_usb; + tmkclrcwbits_usb = ftmkclrcwbits_usb; + tmkgetcwbits_usb = ftmkgetcwbits_usb; + tmkgetmode_usb = ftmkgetmode_usb; + tmkdefdac_usb = ftmkdefdac_usb; + tmkgetdac_usb = ftmkgetdac_usb; + bcreset_usb = fbcreset_usb; + bcdefirqmode_usb = fbcdefirqmode_usb; + bcgetirqmode_usb = fbcgetirqmode_usb; + bcgetmaxbase_usb = fbcgetmaxbase_usb; + bcdefbase_usb = fbcdefbase_usb; + bcgetbase_usb = fbcgetbase_usb; + bcputw_usb = fbcputw_usb; + bcgetw_usb = fbcgetw_usb; + bcgetansw_usb = fbcgetansw_usb; + bcputblk_usb = fbcputblk_usb; + bcgetblk_usb = fbcgetblk_usb; + bcdefbus_usb = fbcdefbus_usb; + bcgetbus_usb = fbcgetbus_usb; + bcstart_usb = fbcstart_usb; + bcstartx_usb = fbcstartx_usb; + bcdeflink_usb = fbcdeflink_usb; + bcgetlink_usb = fbcgetlink_usb; + bcstop_usb = fbcstop_usb; + bcgetstate_usb = fbcgetstate_usb; + rtreset_usb = frtreset_usb; + rtdefirqmode_usb = frtdefirqmode_usb; + rtgetirqmode_usb = frtgetirqmode_usb; + rtdefmode_usb = frtdefmode_usb; + rtgetmode_usb = frtgetmode_usb; + rtgetmaxpage_usb = frtgetmaxpage_usb; + rtdefpage_usb = frtdefpage_usb; + rtgetpage_usb = frtgetpage_usb; + rtdefpagepc_usb = frtdefpagepc_usb; + rtdefpagebus_usb = frtdefpagebus_usb; + rtgetpagepc_usb = frtgetpagepc_usb; + rtgetpagebus_usb = frtgetpagebus_usb; + rtdefaddress_usb = frtdefaddress_usb; + rtgetaddress_usb = frtgetaddress_usb; + rtdefsubaddr_usb = frtdefsubaddr_usb; + rtgetsubaddr_usb = frtgetsubaddr_usb; + rtputw_usb = frtputw_usb; + rtgetw_usb = frtgetw_usb; + rtputblk_usb = frtputblk_usb; + rtgetblk_usb = frtgetblk_usb; + rtsetanswbits_usb = frtsetanswbits_usb; + rtclranswbits_usb = frtclranswbits_usb; + rtgetanswbits_usb = frtgetanswbits_usb; + rtgetflags_usb = frtgetflags_usb; + rtputflags_usb = frtputflags_usb; + rtsetflag_usb = frtsetflag_usb; + rtclrflag_usb = frtclrflag_usb; + rtgetflag_usb = frtgetflag_usb; + rtputflag_usb = frtputflag_usb; + rtgetstate_usb = frtgetstate_usb; + rtbusy_usb = frtbusy_usb; + rtlock_usb = frtlock_usb; + rtunlock_usb = frtunlock_usb; + rtgetcmddata_usb = frtgetcmddata_usb; + rtputcmddata_usb = frtputcmddata_usb; + mtreset_usb = fmtreset_usb; + mtgetsw_usb = fmtgetsw_usb; + rtenable_usb = frtenable_usb; + mrtselected_usb = fmrtselected_usb; + mrtgetstate_usb = fmrtgetstate_usb; + mrtdefbrcsubaddr0_usb = fmrtdefbrcsubaddr0_usb; + mrtreset_usb = fmrtreset_usb; + tmktimer_usb = ftmktimer_usb; + tmkgettimer_usb = ftmkgettimer_usb; + tmkgettimerl_usb = ftmkgettimerl_usb; + bcgetmsgtime_usb = fbcgetmsgtime_usb; + rtgetmsgtime_usb = frtgetmsgtime_usb; + tmkgethwver_usb = ftmkgethwver_usb; + tmkgetevtime_usb = ftmkgetevtime_usb; + tmkswtimer_usb = ftmkswtimer_usb; + tmkgetswtimer_usb = ftmkgetswtimer_usb; + tmktimeout_usb = ftmktimeout_usb; + mrtdefbrcpage_usb = fmrtdefbrcpage_usb; + mrtgetbrcpage_usb = fmrtgetbrcpage_usb; + + MonitorHwStart_usb = fMonitorHwStart_usb; + MonitorHwGetMessage_usb = fMonitorHwGetMessage_usb; + MonitorHwStop_usb = fMonitorHwStop_usb; + + tmkrawio_usb = ftmkrawio_usb; + rtgap_usb = frtgap_usb; + tmkreadsn_usb = ftmkreadsn_usb; + + if(hUSBDrvDll) + FreeLibrary(hUSBDrvDll); + hUSBDrvDll = NULL; +} + +int tmkgetmaxn() +{ + return _VTMK4tmkMaxNum; +} + +int tmkconfig(int tmkNumber) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + int Status; + char tmkName[32]; + + if (_VTMK4tmkMaxNum == -1) + return TMK_BAD_NUMBER; + + if (_hVTMK4VxD[tmkNumber] != NULL) + return TMK_BAD_NUMBER; + + if (tmkNumber < 0 || tmkNumber > _VTMK4tmkMaxNum) + return TMK_BAD_NUMBER; + + if (_VTMK4usbFlag[tmkNumber]) + { + sprintf (tmkName,"%c%c.%cEZUSB-%d",0x5c,0x5c,0x5c,_VTMK4tmkDrvnum[tmkNumber]); + _hVTMK4VxD[tmkNumber] = CreateFileA(tmkName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (_hVTMK4VxD[tmkNumber] == INVALID_HANDLE_VALUE) + { + _hVTMK4VxD[tmkNumber] = NULL; + return TMK_BAD_NUMBER; + } + + if(DeviceIoControl(_hVTMK4VxD[tmkNumber], (DWORD)IOCTL_EZUSB_SET_CURPROC, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL)) + { + Status = tmkconfig_usb(_VTMK4tmkDrvnum[tmkNumber], 9, 0, 0); + if(Status == 0) + { + _VTMK4tmkCurNum = tmkNumber; + return Status; + } + } + + CloseHandle (_hVTMK4VxD[tmkNumber]); + _hVTMK4VxD[tmkNumber] = NULL; + return TMK_BAD_NUMBER; + } + + sprintf (tmkName,"%c%c.%cTMK1553BDevice%d",0x5c,0x5c,0x5c,tmkNumber); + _hVTMK4VxD[tmkNumber] = CreateFileA(tmkName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + if (_hVTMK4VxD[tmkNumber] == INVALID_HANDLE_VALUE) + { + _hVTMK4VxD[tmkNumber] = NULL; + return TMK_BAD_NUMBER; + } + + _awVTMK4InBuf[0] = (WORD)tmkNumber; + DeviceIoControl(_hVTMK4VxD[tmkNumber], (DWORD)IOCTL_TMK_tmkconfig, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + if (_awVTMK4OutBuf[0] != 0) + { + CloseHandle (_hVTMK4VxD[tmkNumber]); + _hVTMK4VxD[tmkNumber] = NULL; + } + _VTMK4tmkCurNum = tmkNumber; + return (int)_awVTMK4OutBuf[0]; +} + +int tmkdone(int tmkNumber) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + int iTMK; + + if (tmkNumber == ALL_TMKS) + { + for (iTMK = 0; iTMK <= _VTMK4tmkMaxNum; ++iTMK) + { + if(_VTMK4usbFlag[iTMK]) + { + _ahVTMK4Event[iTMK] = 0; + if(_hVTMK4VxD[iTMK]) + CloseHandle (_hVTMK4VxD[iTMK]); + _hVTMK4VxD[iTMK] = NULL; + tmkdone_usb(_VTMK4tmkDrvnum[iTMK]); + } + else + { + if (_hVTMK4VxD[iTMK] == NULL) + continue; + _awVTMK4InBuf[0] = (WORD)iTMK; + DeviceIoControl(_hVTMK4VxD[iTMK], (DWORD)IOCTL_TMK_tmkdone, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + + _ahVTMK4Event[iTMK] = 0; + CloseHandle(_hVTMK4VxD[iTMK]); + _hVTMK4VxD[iTMK] = NULL; + } + } + } + else if (tmkNumber >= 0 && tmkNumber <= _VTMK4tmkMaxNum && _hVTMK4VxD[tmkNumber] != NULL) + { + if(_VTMK4usbFlag[tmkNumber]) + { + _ahVTMK4Event[tmkNumber] = 0; + CloseHandle (_hVTMK4VxD[tmkNumber]); + _hVTMK4VxD[tmkNumber] = NULL; + tmkdone_usb(_VTMK4tmkDrvnum[tmkNumber]); + } + else + { + _awVTMK4InBuf[0] = (WORD)tmkNumber; + DeviceIoControl(_hVTMK4VxD[tmkNumber], (DWORD)IOCTL_TMK_tmkdone, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + + _ahVTMK4Event[tmkNumber] = 0; + CloseHandle (_hVTMK4VxD[tmkNumber]); + _hVTMK4VxD[tmkNumber] = NULL; + } + } + + return 0; +} + +int tmkselect(int tmkNumber) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + + if (tmkNumber < 0 || tmkNumber > _VTMK4tmkMaxNum) + return TMK_BAD_NUMBER; + if ((_hVTMK4VxD[tmkNumber] != INVALID_HANDLE_VALUE) && (_hVTMK4VxD[tmkNumber] != 0)) + { + if (_VTMK4usbFlag[tmkNumber]) + { + _VTMK4tmkCurNum = tmkNumber; + tmkselect_usb(_VTMK4tmkDrvnum[tmkNumber]); + return 0; + } + + //************** ********************************************************** + _awVTMK4InBuf[0] = tmkNumber; + DeviceIoControl(_hVTMK4VxD[tmkNumber], (DWORD)IOCTL_TMK_tmkselect, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + + if (_awVTMK4OutBuf[0] == 0) + _VTMK4tmkCurNum = tmkNumber; + return _awVTMK4OutBuf[0]; + //******************************************************************************************************************* + //return 0; + } + else + return TMK_BAD_NUMBER; +} + +int tmkselected() +{ + return _VTMK4tmkCurNum; +} + +TMK_DATA tmkgetmode() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetmode, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return tmkgetmode_usb(); +} + +int tmkdefdac(int dacValue) +{ + if ((_hVTMK4VxD[_VTMK4tmkCurNum])&&(_VTMK4usbFlag[_VTMK4tmkCurNum])) + return tmkdefdac_usb(dacValue); + else + return TMK_BAD_NUMBER; +} + +int tmkgetdac(int *dacValue, int *dacMode) +{ + if ((_hVTMK4VxD[_VTMK4tmkCurNum])&&(_VTMK4usbFlag[_VTMK4tmkCurNum])) + return tmkgetdac_usb(dacValue, dacMode); + else + { + *dacValue = 0; + *dacMode = 0; + return TMK_BAD_NUMBER; + } +} + +void tmksetcwbits(TMK_DATA tmkSetControl) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = tmkSetControl; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmksetcwbits, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + tmksetcwbits_usb(tmkSetControl); +} + +void tmkclrcwbits(TMK_DATA tmkClrControl) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = tmkClrControl; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkclrcwbits, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + tmkclrcwbits_usb(tmkClrControl); +} + +TMK_DATA tmkgetcwbits() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetcwbits, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return tmkgetcwbits_usb(); +} + +void tmkdefevent(HANDLE hEvent, BOOL fEventSet) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[8], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + DWORD64 hVxDEvent; + hVxDEvent = (DWORD64)hEvent; + _ahVTMK4Event[_VTMK4tmkCurNum] = hEvent; +// _awVTMK4InBuf[0] = 0; +// _awVTMK4InBuf[1] = 0; + _awVTMK4InBuf[2] = LOWORD(fEventSet); + _awVTMK4InBuf[3] = HIWORD(fEventSet); + *(PDWORD64)(_awVTMK4InBuf+4) = hVxDEvent; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkdefevent, _awVTMK4InBuf, 16, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + tmkdefevent_usb(hEvent); +#else + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + DWORD hVxDEvent; + +/* int iTMK; + if (hEvent != 0) + { + for (iTMK = 0; iTMK <= MAX_TMK_NUMBER; ++iTMK) + { + if (hEvent == _ahVTMK4Event[iTMK]) + break; + } + if (iTMK > MAX_TMK_NUMBER) + { + hVxDEvent = (DWORD)hEvent; + _ahVTMK4Event[_VTMK4tmkCurNum] = hEvent; + } + } + else + { + hVxDEvent = 0; + _ahVTMK4Event[_VTMK4tmkCurNum] = 0; + } +*/ + hVxDEvent = (DWORD)hEvent; + _ahVTMK4Event[_VTMK4tmkCurNum] = hEvent; + _awVTMK4InBuf[0] = LOWORD(hVxDEvent); + _awVTMK4InBuf[1] = HIWORD(hVxDEvent); + _awVTMK4InBuf[2] = LOWORD(fEventSet); + _awVTMK4InBuf[3] = HIWORD(fEventSet); + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkdefevent, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + tmkdefevent_usb(hEvent); +#endif +} + +void tmkgetevd(TTmkEventData *pEvD) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[6]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetevd, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 12, &_cbVTMK4Ret, NULL); + + pEvD->nInt = ((DWORD*)(_awVTMK4OutBuf))[0]; + switch (pEvD->wMode = _awVTMK4OutBuf[2]) + { + case BC_MODE: + switch (pEvD->nInt) + { + case 1: + pEvD->bc.wResult = _awVTMK4OutBuf[3]; + break; + case 2: + pEvD->bc.wResult = _awVTMK4OutBuf[3]; + pEvD->bc.wAW1 = _awVTMK4OutBuf[4]; + pEvD->bc.wAW2 = _awVTMK4OutBuf[5]; + break; + case 3: + pEvD->bcx.wResultX = _awVTMK4OutBuf[3]; + pEvD->bcx.wBase = _awVTMK4OutBuf[4]; + break; + case 4: + pEvD->bcx.wBase = _awVTMK4OutBuf[3]; + break; + } + break; + case MT_MODE: + switch (pEvD->nInt) + { + case 3: + pEvD->mt.wResultX = _awVTMK4OutBuf[3]; + pEvD->mt.wBase = _awVTMK4OutBuf[4]; + break; + case 4: + pEvD->mt.wBase = _awVTMK4OutBuf[3]; + break; + } + break; + case RT_MODE: + switch (pEvD->nInt) + { + case 1: + pEvD->rt.wCmd = _awVTMK4OutBuf[3]; + break; + case 2: + case 3: + pEvD->rt.wStatus = _awVTMK4OutBuf[3]; + break; + } + break; + case UNDEFINED_MODE: + switch (pEvD->nInt) + { + case 5: + pEvD->tmk.wRequest = _awVTMK4OutBuf[3]; +// pEvD->tmk.dwTimer = *((DWORD*)(&_awVTMK4OutBuf[4])); + break; + } + break; + } + } + else + { + TListEvD evd_s; + Read_DLL_EvD_usb(&evd_s); + + pEvD->nInt = evd_s.nInt; + pEvD->wMode = evd_s.wMode; + switch (pEvD->wMode) + { + case BC_MODE: + switch (pEvD->nInt) + { + case 1: + pEvD->bc.wResult = evd_s.awEvData[0]; + break; + case 2: + pEvD->bc.wResult = evd_s.awEvData[0]; + pEvD->bc.wAW1 = evd_s.awEvData[1]; + pEvD->bc.wAW2 = evd_s.awEvData[2]; + break; + case 3: + pEvD->bcx.wResultX = evd_s.awEvData[0]; + pEvD->bcx.wBase = evd_s.awEvData[1]; + break; + case 4: + pEvD->bcx.wBase = evd_s.awEvData[0]; + break; + } + break; + case MT_MODE: + switch (pEvD->nInt) + { + case 3: + pEvD->mt.wResultX = evd_s.awEvData[0]; + pEvD->mt.wBase = evd_s.awEvData[1]; + break; + case 4: + pEvD->mt.wBase = evd_s.awEvData[0]; + break; + } + break; + case RT_MODE: + switch (pEvD->nInt) + { + case 1: + pEvD->rt.wCmd = evd_s.awEvData[0]; + break; + case 2: + case 3: + pEvD->rt.wStatus = evd_s.awEvData[0]; + break; + } + break; + case UNDEFINED_MODE: + switch (pEvD->nInt) + { + case 5: + pEvD->tmk.wRequest = evd_s.awEvData[0]; +// pEvD->tmk.dwTimer = *((DWORD*)(&_awVTMK4OutBuf[4])); + break; + case 255: + pEvD->raw.wData1 = evd_s.awEvData[0]; + pEvD->raw.wData2 = evd_s.awEvData[1]; + break; + } + break; + } + } +} + +void tmkgetinfo(TTmkConfigData *pConfD) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + *(PDWORD64)(_awVTMK4InBuf) = (DWORD64)pConfD; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetinfo, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + } +#else + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = LOWORD(pConfD); + _awVTMK4InBuf[1] = HIWORD(pConfD); + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetinfo, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + } +#endif + else + { + pConfD->nType = TA; + strcpy(pConfD->szName, "TA1USB"); + pConfD->wPorts1 = 0; + pConfD->wPorts2 = 0; + pConfD->wIrq1 = 0; + pConfD->wIrq2 = 0; + pConfD->wIODelay = 0; + } +} + +int bcreset() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return(DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcreset, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcreset_usb(); +} + +void bc_def_tldw(TMK_DATA wTLDW) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = wTLDW; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bc_def_tldw, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); +} + +void bc_enable_di() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bc_enable_di, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); +} + +void bc_disable_di() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bc_disable_di, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); +} + +int bcdefirqmode(TMK_DATA bcIrqMode) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcIrqMode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcdefirqmode, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcdefirqmode_usb(bcIrqMode); +} + +TMK_DATA bcgetirqmode() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetirqmode, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return bcgetirqmode_usb(); +} + +TMK_DATA bcgetmaxbase() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetmaxbase, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return bcgetmaxbase_usb(); +} + +int bcdefbase(TMK_DATA bcBasePC) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcBasePC; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcdefbase, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcdefbase_usb(bcBasePC); +} + +TMK_DATA bcgetbase() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetbase, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return bcgetbase_usb(); +} + +void bcputw(TMK_DATA bcAddr, TMK_DATA bcData) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcAddr; + _awVTMK4InBuf[1] = bcData; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcputw, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + bcputw_usb(bcAddr, bcData); +} + +TMK_DATA bcgetw(TMK_DATA bcAddr) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcAddr; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetw, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return bcgetw_usb(bcAddr); +} + +DWORD bcgetansw(TMK_DATA bcCtrlCode) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcCtrlCode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetansw, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return bcgetansw_usb(bcCtrlCode); +} + +void bcputblk(TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[8], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcAddr; +// _awVTMK4InBuf[1] = 0; +// _awVTMK4InBuf[2] = 0; + _awVTMK4InBuf[3] = cwLength; + *(PDWORD64)(_awVTMK4InBuf+4) = (DWORD64)pcBuffer; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcputblk, _awVTMK4InBuf, 16, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + bcputblk_usb(bcAddr, pcBuffer, cwLength); +#else + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcAddr; + _awVTMK4InBuf[1] = (WORD)(LOWORD(pcBuffer)); + _awVTMK4InBuf[2] = (WORD)(HIWORD(pcBuffer)); + _awVTMK4InBuf[3] = cwLength; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcputblk, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + bcputblk_usb(bcAddr, pcBuffer, cwLength); +#endif +} + +void bcgetblk(TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[8], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcAddr; +// _awVTMK4InBuf[1] = 0; +// _awVTMK4InBuf[2] = 0; + _awVTMK4InBuf[3] = cwLength; + *(PDWORD64)(_awVTMK4InBuf+4) = (DWORD64)pcBuffer; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetblk, _awVTMK4InBuf, 16, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + bcgetblk_usb(bcAddr, pcBuffer, cwLength); +#else + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcAddr; + _awVTMK4InBuf[1] = (WORD)(LOWORD(pcBuffer)); + _awVTMK4InBuf[2] = (WORD)(HIWORD(pcBuffer)); + _awVTMK4InBuf[3] = cwLength; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetblk, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + bcgetblk_usb(bcAddr, pcBuffer, cwLength); +#endif +} + +int bcdefbus(TMK_DATA bcBus) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcBus; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcdefbus, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcdefbus_usb(bcBus); +} + +TMK_DATA bcgetbus() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetbus, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return bcgetbus_usb(); +} + +int bcstart(TMK_DATA bcBase, TMK_DATA bcCtrlCode) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcBase; + _awVTMK4InBuf[1] = bcCtrlCode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcstart, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcstart_usb(bcBase, bcCtrlCode); +} + +int bcstartx(TMK_DATA bcBase, TMK_DATA bcCtrlCode) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcBase; + _awVTMK4InBuf[1] = bcCtrlCode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcstartx, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcstartx_usb(bcBase, bcCtrlCode); +} + +int bcdeflink(TMK_DATA bcBase, TMK_DATA bcCtrlCode) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = bcBase; + _awVTMK4InBuf[1] = bcCtrlCode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcdeflink, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return bcdeflink_usb(bcBase, bcCtrlCode); +} + +DWORD bcgetlink() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetlink, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return bcgetlink_usb(); +} + +TMK_DATA bcstop() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcstop, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return bcstop_usb(); +} + +DWORD bcgetstate() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetstate, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return bcgetstate_usb(); +} + +int rtreset() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtreset, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtreset_usb(); +} + +int rtdefirqmode(TMK_DATA rtIrqMode) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtIrqMode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefirqmode, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtdefirqmode_usb(rtIrqMode); +} + +TMK_DATA rtgetirqmode() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetirqmode, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetirqmode_usb(); +} + +int rtdefmode(TMK_DATA rtMode) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtMode; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefmode, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtdefmode_usb(rtMode); +} + +TMK_DATA rtgetmode() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetmode, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetmode_usb(); +} + +TMK_DATA rtgetmaxpage() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetmaxpage, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetmaxpage_usb(); +} + +int rtdefpage(TMK_DATA rtPage) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtPage; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefpage, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtdefpage_usb(rtPage); +} + +TMK_DATA rtgetpage() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetpage, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetpage_usb(); +} + +int rtdefpagepc(TMK_DATA rtPagePC) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtPagePC; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefpagepc, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtdefpagepc_usb(rtPagePC); +} + +int rtdefpagebus(TMK_DATA rtPageBus) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtPageBus; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefpagebus, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtdefpagebus_usb(rtPageBus); +} + +TMK_DATA rtgetpagepc() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetpagepc, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetpagepc_usb(); +} + +TMK_DATA rtgetpagebus() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetpagebus, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetpagebus_usb(); +} + +int rtdefaddress(TMK_DATA rtAddress) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddress; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefaddress, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return rtdefaddress_usb(rtAddress); +} + +TMK_DATA rtgetaddress() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetaddress, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetaddress_usb(); +} + +void rtdefsubaddr(TMK_DATA rtDir, TMK_DATA rtSubAddr) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtDir; + _awVTMK4InBuf[1] = rtSubAddr; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtdefsubaddr, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtdefsubaddr_usb(rtDir, rtSubAddr); +} + +TMK_DATA rtgetsubaddr() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetsubaddr, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetsubaddr_usb(); +} + +void rtputw(TMK_DATA rtAddr, TMK_DATA rtData) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddr; + _awVTMK4InBuf[1] = rtData; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtputw, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtputw_usb(rtAddr, rtData); +} + +TMK_DATA rtgetw(TMK_DATA rtAddr) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddr; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetw, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetw_usb(rtAddr); +} + +void rtputblk(TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[8], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddr; +// _awVTMK4InBuf[1] = 0; +// _awVTMK4InBuf[2] = 0; + _awVTMK4InBuf[3] = cwLength; + *(PDWORD64)(_awVTMK4InBuf+4) = (DWORD64)pcBuffer; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtputblk, _awVTMK4InBuf, 16, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtputblk_usb(rtAddr, pcBuffer, cwLength); +#else + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddr; + _awVTMK4InBuf[1] = (WORD)(LOWORD(pcBuffer)); + _awVTMK4InBuf[2] = (WORD)(HIWORD(pcBuffer)); + _awVTMK4InBuf[3] = cwLength; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtputblk, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtputblk_usb(rtAddr, pcBuffer, cwLength); +#endif +} + +void rtgetblk(TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[8], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddr; +// _awVTMK4InBuf[1] = 0; +// _awVTMK4InBuf[2] = 0; + _awVTMK4InBuf[3] = cwLength; + *(PDWORD64)(_awVTMK4InBuf+4) = (DWORD64)pcBuffer; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetblk, _awVTMK4InBuf, 16, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtgetblk_usb(rtAddr, pcBuffer, cwLength); +#else + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtAddr; + _awVTMK4InBuf[1] = (WORD)(LOWORD(pcBuffer)); + _awVTMK4InBuf[2] = (WORD)(HIWORD(pcBuffer)); + _awVTMK4InBuf[3] = cwLength; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetblk, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtgetblk_usb(rtAddr, pcBuffer, cwLength); +#endif +} + +void rtsetanswbits(TMK_DATA rtSetControl) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtSetControl; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtsetanswbits, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtsetanswbits_usb(rtSetControl); +} + +void rtclranswbits(TMK_DATA rtClrControl) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtClrControl; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtclranswbits, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtclranswbits_usb(rtClrControl); +} + +TMK_DATA rtgetanswbits() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetanswbits, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetanswbits_usb(); +} + +void rtgetflags(void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[12], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; +// _awVTMK4InBuf[0] = 0; +// _awVTMK4InBuf[1] = 0; + _awVTMK4InBuf[2] = rtDir; + _awVTMK4InBuf[3] = rtFlagMin; + _awVTMK4InBuf[4] = rtFlagMax; + *(PDWORD64)(_awVTMK4InBuf+8) = (DWORD64)pcBuffer; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetflags, _awVTMK4InBuf, 24, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtgetflags_usb(pcBuffer, rtDir, rtFlagMin, rtFlagMax); +#else + WORD _awVTMK4InBuf[5], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = (WORD)(LOWORD(pcBuffer)); + _awVTMK4InBuf[1] = (WORD)(HIWORD(pcBuffer)); + _awVTMK4InBuf[2] = rtDir; + _awVTMK4InBuf[3] = rtFlagMin; + _awVTMK4InBuf[4] = rtFlagMax; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetflags, _awVTMK4InBuf, 10, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtgetflags_usb(pcBuffer, rtDir, rtFlagMin, rtFlagMax); +#endif +} + +void rtputflags(void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax) +{ +#ifdef _WIN64 + WORD _awVTMK4InBuf[12], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; +// _awVTMK4InBuf[0] = 0; +// _awVTMK4InBuf[1] = 0; + _awVTMK4InBuf[2] = rtDir; + _awVTMK4InBuf[3] = rtFlagMin; + _awVTMK4InBuf[4] = rtFlagMax; + *(PDWORD64)(_awVTMK4InBuf+8) = (DWORD64)pcBuffer; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtputflags, _awVTMK4InBuf, 24, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtputflags_usb(pcBuffer, rtDir, rtFlagMin, rtFlagMax); +#else + WORD _awVTMK4InBuf[5], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = (WORD)(LOWORD(pcBuffer)); + _awVTMK4InBuf[1] = (WORD)(HIWORD(pcBuffer)); + _awVTMK4InBuf[2] = rtDir; + _awVTMK4InBuf[3] = rtFlagMin; + _awVTMK4InBuf[4] = rtFlagMax; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtputflags, _awVTMK4InBuf, 10, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtputflags_usb(pcBuffer, rtDir, rtFlagMin, rtFlagMax); +#endif +} + +void rtsetflag() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtsetflag, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtsetflag_usb(); +} + +void rtclrflag() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtclrflag, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtclrflag_usb(); +} + +TMK_DATA rtgetflag(TMK_DATA rtDir, TMK_DATA rtSubAddr) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtDir; + _awVTMK4InBuf[1] = rtSubAddr; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetflag, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetflag_usb(rtDir, rtSubAddr); +} + +TMK_DATA rtgetstate() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetstate, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetstate_usb(); +} + +TMK_DATA rtbusy() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtbusy, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtbusy_usb(); +} + +void rtlock(TMK_DATA rtDir, TMK_DATA rtSubAddr) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtDir; + _awVTMK4InBuf[1] = rtSubAddr; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtlock, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtlock_usb(rtDir, rtSubAddr); +} + +void rtunlock() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtunlock, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtunlock_usb(); +} + +TMK_DATA rtgetcmddata(TMK_DATA rtBusCommand) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtBusCommand; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetcmddata, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtgetcmddata_usb(rtBusCommand); +} +void rtputcmddata(TMK_DATA rtBusCommand, TMK_DATA rtData) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtBusCommand; + _awVTMK4InBuf[1] = rtData; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtputcmddata, _awVTMK4InBuf, 4, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + rtputcmddata_usb(rtBusCommand, rtData); +} + +int mtreset() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mtreset, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return mtreset_usb(); +} + +TMK_DATA mtgetsw() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mtgetsw, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return mtgetsw_usb(); +} + +TMK_DATA rtenable(TMK_DATA rtEnable) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = rtEnable; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtenable, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return rtenable_usb(rtEnable); +} + +int mrtgetmaxn() +{ + return _VTMK4mrtMaxNum; +/* + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtgetmaxn, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return ((int)(_awVTMK4OutBuf[0])); +*/ +} + +DWORD mrtconfig(int mrtNumber) +{ + WORD _awVTMK4InBuf[2], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + DWORD RTN,RT0,iRT; + int err; + char tmkName[32]; + + if (_hVTMK4VxD[mrtNumber] != NULL) + return 0; + + if (!_VTMK4usbFlag[mrtNumber]) + { + sprintf (tmkName,"%c%c.%cTMK1553BDevice%d",0x5c,0x5c,0x5c,mrtNumber); + _hVTMK4VxD[mrtNumber] = CreateFileA(tmkName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + if (_hVTMK4VxD[mrtNumber] == INVALID_HANDLE_VALUE) + { + _hVTMK4VxD[mrtNumber] = NULL; + return 0; + } + + _awVTMK4InBuf[0] = (WORD)mrtNumber; + DeviceIoControl(_hVTMK4VxD[mrtNumber], (DWORD)IOCTL_TMK_mrtconfig, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + if (_awVTMK4OutBuf[0] != 0 && _awVTMK4OutBuf[1] != 0) + { + RT0 = (DWORD)_awVTMK4OutBuf[0]; + RTN = (DWORD)_awVTMK4OutBuf[1] + RT0 - 1; + // + for (iRT = RT0; iRT < RTN; ++iRT) + { + if (_hVTMK4VxD[iRT] != NULL) + { + err = 1; + break; + } + sprintf (tmkName,"%c%c.%cTMK1553BDevice%d",0x5c,0x5c,0x5c,iRT); + _hVTMK4VxD[iRT] = CreateFileA(tmkName, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + if (_hVTMK4VxD[iRT] == INVALID_HANDLE_VALUE) + { + _hVTMK4VxD[iRT] = NULL; + err = 1; + break; + } + }//for(iRT = RT0; iRT < RTN; iRT++) + if (err) + { + for (--iRT; iRT >= RT0; --iRT) + { + CloseHandle(_hVTMK4VxD[iRT]); + _hVTMK4VxD[iRT] = 0; + } + } + }//if(_awVTMK4OutBuf[0] != 0 && _awVTMK4OutBuf[1] != 0) + else + { + err = 1; + } + if (err) + { + CloseHandle(_hVTMK4VxD[mrtNumber]); + _hVTMK4VxD[mrtNumber] = 0; + return 0; + } + return (_awVTMK4OutBuf[0] + (_awVTMK4OutBuf[1]<<16)); + } + else + return 0; +} + +int mrtselected() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtselected, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return ((int)(_awVTMK4OutBuf[0])); + } + else + return mrtselected_usb(); +} + +TMK_DATA mrtgetstate() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtgetstate, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return mrtgetstate_usb(); +} + +void mrtdefbrcsubaddr0() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtdefbrcsubaddr0, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL); + else + mrtdefbrcsubaddr0_usb(); +} + +int mrtreset() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtreset, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return mrtreset_usb(); +} + +TMK_DATA tmktimer(TMK_DATA tmkTimerCtrl) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = tmkTimerCtrl; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmktimer, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return tmktimer_usb(tmkTimerCtrl); +} + +DWORD tmkgettimer() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgettimer, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return tmkgettimer_usb(); +} +TMK_DATA tmkgettimerl() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgettimerl, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return (TMK_DATA)tmkgettimerl_usb(); +} +DWORD bcgetmsgtime() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_bcgetmsgtime, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return bcgetmsgtime_usb(); +} +DWORD rtgetmsgtime() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_rtgetmsgtime, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return rtgetmsgtime_usb(); +} + +TMK_DATA tmkgethwver() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgethwver, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return tmkgethwver_usb(); +} + +DWORD tmkgetevtime() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetevtime, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return tmkgetevtime_usb(); +} + +TMK_DATA tmkswtimer(TMK_DATA tmkTimerCtrl) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = tmkTimerCtrl; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkswtimer, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return tmkswtimer_usb(tmkTimerCtrl); +} + +DWORD tmkgetswtimer() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[2]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmkgetswtimer, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 4, &_cbVTMK4Ret, NULL); + return (((DWORD*)(_awVTMK4OutBuf))[0]); + } + else + return tmkgetswtimer_usb(); +} + +TMK_DATA tmktimeout(TMK_DATA tmkTimeOut) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = tmkTimeOut; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_tmktimeout, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return tmktimeout_usb(tmkTimeOut); +} + +int mrtdefbrcpage(TMK_DATA mrtBrcPage) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = mrtBrcPage; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtdefbrcpage, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return mrtdefbrcpage_usb(mrtBrcPage); +} + +TMK_DATA mrtgetbrcpage() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if (!_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mrtgetbrcpage, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return mrtgetbrcpage_usb(); +} + +int mbcinit(TMK_DATA mbcId) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = mbcId; + if(_VTMK4usbFlag[_VTMK4tmkCurNum] == 0) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mbcinit, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return TMK_BAD_NUMBER; +} + +int mbcpreparex(TMK_DATA mbcId, TMK_DATA bcBase, TMK_DATA bcCtrlCode, TMK_DATA mbcDelay) +{ + WORD _awVTMK4InBuf[4], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = mbcId; + _awVTMK4InBuf[1] = bcBase; + _awVTMK4InBuf[2] = bcCtrlCode; + _awVTMK4InBuf[3] = mbcDelay; + if(_VTMK4usbFlag[_VTMK4tmkCurNum] == 0) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mbcpreparex, _awVTMK4InBuf, 8, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return TMK_BAD_NUMBER; +} + +int mbcstartx(TMK_DATA mbcId) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = mbcId; + if(_VTMK4usbFlag[_VTMK4tmkCurNum] == 0) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mbcstartx, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return TMK_BAD_NUMBER; +} + +TMK_DATA mbcalloc() +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + if(_VTMK4usbFlag[_VTMK4tmkCurNum] == 0) + { + DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mbcalloc, _awVTMK4InBuf, 0, _awVTMK4OutBuf, 2, &_cbVTMK4Ret, NULL); + return _awVTMK4OutBuf[0]; + } + else + return 0; +} + +int mbcfree(TMK_DATA mbcId) +{ + WORD _awVTMK4InBuf[1], _awVTMK4OutBuf[1]; + DWORD _cbVTMK4Ret; + _awVTMK4InBuf[0] = mbcId; + if(_VTMK4usbFlag[_VTMK4tmkCurNum] == 0) + return (DeviceIoControl(_hVTMK4VxD[_VTMK4tmkCurNum], (DWORD)IOCTL_TMK_mbcfree, _awVTMK4InBuf, 2, _awVTMK4OutBuf, 0, &_cbVTMK4Ret, NULL))?0:GetLastError(); + else + return TMK_BAD_NUMBER; +} + +DWORD MT_Start(DWORD dwBufSize, HANDLE hEvent) +{ + if (_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + return MonitorHwStart_usb(dwBufSize, hEvent); + } + else + return TMK_BAD_NUMBER; +} + +DWORD MT_GetMessage(WORD * Data, DWORD dwBufSize, int FillFlag, DWORD * dwMsWritten) +{ + if (_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + return MonitorHwGetMessage_usb(Data, dwBufSize, FillFlag, dwMsWritten); + } + else + return TMK_BAD_NUMBER; +} + +DWORD MT_Stop() +{ + if (_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + return MonitorHwStop_usb(); + } + else + return TMK_BAD_NUMBER; +} + +unsigned int tmkrawio(unsigned int *buf_out, unsigned int *buf_in) +{ + if (_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + return tmkrawio_usb(buf_out, buf_in); + } + else + return TMK_BAD_NUMBER; +} + +TMK_DATA rtgap(TMK_DATA Gap) +{ + if (_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + return rtgap_usb(Gap); + } + else + return 0; +} + +int tmkreadsn() +{ + if (_VTMK4usbFlag[_VTMK4tmkCurNum]) + { + return tmkreadsn_usb(); + } + else + return TMK_BAD_NUMBER; +} +//#endif diff --git a/WDMTMKv2.h b/WDMTMKv2.h new file mode 100644 index 0000000..3ad16b2 --- /dev/null +++ b/WDMTMKv2.h @@ -0,0 +1,1020 @@ +/*****************************************************************************/ +/* WDMTMK API v4.08 for Microsoft Windows. ELCUS, 1998, 2011. */ +/* Interface to driver TMK1553B.SYS v4.08 */ +/* Interface to driver USB_TA_DRV.dll v1.9.2 for Windows 98/ME/2000/XP */ +/* for Windows 98/ME/2000/XP/Vista/7 */ +/*****************************************************************************/ + +//#ifndef _TMK1553B_ +//#define _TMK1553B_ + +//************************************************************************** +#include +#include +typedef uint16_t WORD; +typedef unsigned __LONG32 DWORD; +typedef void *HANDLE; +typedef int BOOL; +//************************************************************************** + +#define TMK_DATA unsigned short +#define tmkError *ptmkError + +#ifndef _TMK1553B_MRT +#define _TMK1553B_MRT +#endif + +#define TMK_VERSION_MIN 0x0406 /* v4.06 */ +#define TMK_VERSION 0x0408 /* v4.08 */ + +#define EZUSB_MAJOR_VERSION_MIN 02 +#define EZUSB_MINOR_VERSION_MIN 01 + +#ifdef _TMK1553B_MRT +#define MAX_TMK_NUMBER (8+64-1) +#else +#define MAX_TMK_NUMBER (8-1) +#endif //def TMK1553B_MRT + +#ifndef MAX_USBTA_NUM +#define MAX_USBTA_NUM (8-1) +#endif + +#define TMK_INT_TIMER 0x4000 +#define TMK_INT_BUSJAM 0x2000 +#define TMK_INT_FIFO_OVF 0x0400 + +#define MIN_TMK_TYPE 2 +#define MAX_TMK_TYPE 12 + +#define TMK400 2 +#define TMKMPC 3 +#define RTMK400 4 +#define TMKX 5 +#define TMKXI 6 +#define MRTX 7 +#define MRTXI 8 +#define TA 9 +#define TAI 10 +#define MRTA 11 +#define MRTAI 12 + +#define ALL_TMKS 0x00FF + +#define MBC_ALLOC_FAIL 0xFFFF + +#define GET_RT_GAP 0xFFFF +#define RT_GAP_DEFAULT 0 +#define RT_GAP_OPT1 1 + +#define GET_TIMEOUT 0xFFFF + +#define SWTIMER_OFF 0x0000 +#define SWTIMER_ON 0x0400 +#define SWTIMER_EVENT 0x8000 +#define SWTIMER_RESET 0xFBFF + +#define GET_SWTIMER_CTRL 0xFFFF + +#define TIMER_RESET 0xFBFF +#define TIMER_OFF 0x0000 +#define TIMER_16BIT 0x1400 +#define TIMER_32BIT 0x0400 +#define TIMER_1US 0x0000 +#define TIMER_2US 0x0080 +#define TIMER_4US 0x0100 +#define TIMER_8US 0x0180 +#define TIMER_16US 0x0200 +#define TIMER_32US 0x0280 +#define TIMER_64US 0x0300 +#define TIMER_STOP 0x0380 +#define TIMER_SYN 0x0040 +#define TIMER_SYND 0x0020 +#define TIMER_SA 0x001F + +#define TIMER_NOSTOP 0x2000 + +#define TIMER_MASK 0x17FF +#define TIMER_STEP 0x0380 +#define TIMER_BITS 0x3400 + +#define GET_TIMER_CTRL 0xFFFF + +#define DATA_BC_RT 0x00 +#define DATA_BC_RT_BRCST 0x08 +#define DATA_RT_BC 0x01 +#define DATA_RT_RT 0x02 +#define DATA_RT_RT_BRCST 0x0A +#define CTRL_C_A 0x03 +#define CTRL_C_BRCST 0x0B +#define CTRL_CD_A 0x04 +#define CTRL_CD_BRCST 0x0C +#define CTRL_C_AD 0x05 + +#define CC_FMT_1 0x00 +#define CC_FMT_2 0x01 +#define CC_FMT_3 0x02 +#define CC_FMT_4 0x03 +#define CC_FMT_5 0x05 +#define CC_FMT_6 0x04 +#define CC_FMT_7 0x08 +#define CC_FMT_8 0x0A +#define CC_FMT_9 0x0B +#define CC_FMT_10 0x0C + +#define BUS_A 0 +#define BUS_B 1 +#define BUS_1 0 +#define BUS_2 1 + +#define S_ERAO_MASK 0x01 +#define S_MEO_MASK 0x02 +#define S_IB_MASK 0x04 +#define S_TO_MASK 0x08 +#define S_EM_MASK 0x10 +#define S_EBC_MASK 0x20 +#define S_DI_MASK 0x40 +#define S_ELN_MASK 0x80 +#define S_G1_MASK 0x1000 +#define S_G2_MASK 0x2000 + +#define NWORDS_MASK 0x001F +#define CMD_MASK 0x041F +#define SUBADDR_MASK 0x03E0 +#define CI_MASK 0x03E0 +#define HBIT_MASK 0x0200 +#define RT_DIR_MASK 0x0400 +#define ADDRESS_MASK 0xF800 +#define RTFL_MASK 0x0001 +#define DNBA_MASK 0x0002 +#define SSFL_MASK 0x0004 +#define BUSY_MASK 0x0008 +#define BRCST_MASK 0x0010 +#define NULL_MASK 0x00E0 +#define SREQ_MASK 0x0100 +#define ERROR_MASK 0x0400 + +#define SREQ 0x01 +#define BUSY 0x02 +#define SSFL 0x04 +#define RTFL 0x08 +#define DNBA 0x10 + +#define CWB0 0x20 +#define CWB1 0x40 + +#define BC_MODE 0x00 +#define RT_MODE 0x80 +#define MT_MODE 0x100 +#define MRT_MODE 0x280 +#define UNDEFINED_MODE 0xFFFF + +#define RT_TRANSMIT 0x0400 +#define RT_RECEIVE 0x0000 + +#define RT_ERROR_MASK 0x4000 + +#define RT_FLAG 0x8000 +#define RT_FLAG_MASK 0x8000 + +#define RT_HBIT_MODE 0x0001 +#define RT_FLAG_MODE 0x0002 +#define RT_BRCST_MODE 0x0004 +#define RT_DATA_BL 0x2000 +#define RT_GENER1_BL 0x0004 +#define RT_GENER2_BL 0x4000 +#define BC_GENER1_BL 0x0004 +#define BC_GENER2_BL 0x4000 +#define MT_GENER1_BL 0x0004 +#define MT_GENER2_BL 0x4000 +#define TMK_IRQ_OFF 0x8000 + +#define CX_CC_MASK 0x000F +#define CX_CONT_MASK 0x0010 +#define CX_BUS_MASK 0x0020 +#define CX_SIG_MASK 0x8000 +#define CX_INT_MASK 0x0020 + +#define CX_CONT 0x0010 +#define CX_STOP 0x0000 +#define CX_BUS_0 0x0000 +#define CX_BUS_A 0x0000 +#define CX_BUS_1 0x0020 +#define CX_BUS_B 0x0020 +#define CX_NOSIG 0x0000 +#define CX_SIG 0x8000 +#define CX_INT 0x0000 +#define CX_NOINT 0x0020 + +#define SX_NOERR 0 +#define SX_MEO 1 +#define SX_TOA 2 +#define SX_TOD 3 +#define SX_ELN 4 +#define SX_ERAO 5 +#define SX_ESYN 6 +#define SX_EBC 7 + +#define SX_ERR_MASK 0x0007 +#define SX_IB_MASK 0x0008 +#define SX_G1_MASK 0x0010 +#define SX_G2_MASK 0x0020 +#define SX_K2_MASK 0x0100 +#define SX_K1_MASK 0x0200 +#define SX_SCC_MASK 0x3C00 +#define SX_ME_MASK 0x4000 +#define SX_BUS_MASK 0x8000 + +#define SX_BUS_0 0x0000 +#define SX_BUS_A 0x0000 +#define SX_BUS_1 0x8000 +#define SX_BUS_B 0x8000 + +#define GET_IO_DELAY 0xFFFF + +#define RT_ENABLE 0x0000 +#define RT_DISABLE 0x001F +#define RT_GET_ENABLE 0xFFFF + +#define CW(ADDR,DIR,SUBADDR,NWORDS) ((TMK_DATA)(((ADDR)<<11)|(DIR)|((SUBADDR)<<5)|((NWORDS)&0x1F))) +#define CWM(ADDR,COMMAND) ((TMK_DATA)(((ADDR)<<11)|(CI_MASK)|(COMMAND))) +#define CWMC(ADDR,CI,COMMAND) ((TMK_DATA)(((ADDR)<<11)|((CI)&0x03E0)|(COMMAND))) + +/*#define CMD_ILLEGAL 0x000*/ +#define CMD_DYNAMIC_BUS_CONTROL 0x400 +#define CMD_SYNCHRONIZE 0x401 +#define CMD_TRANSMIT_STATUS_WORD 0x402 +#define CMD_INITIATE_SELF_TEST 0x403 +#define CMD_TRANSMITTER_SHUTDOWN 0x404 +#define CMD_OVERRIDE_TRANSMITTER_SHUTDOWN 0x405 +#define CMD_INHIBIT_TERMINAL_FLAG_BIT 0x406 +#define CMD_OVERRIDE_INHIBIT_TERMINAL_FLAG_BIT 0x407 +#define CMD_RESET_REMOTE_TERMINAL 0x408 +#define CMD_TRANSMIT_VECTOR_WORD 0x410 +#define CMD_SYNCHRONIZE_WITH_DATA_WORD 0x011 +#define CMD_TRANSMIT_LAST_COMMAND_WORD 0x412 +#define CMD_TRANSMIT_BUILT_IN_TEST_WORD 0x413 + +#define TMK_ERROR_0 0xE0040000 +#define TMK_BAD_TYPE (1 + TMK_ERROR_0) +#define TMK_BAD_IRQ (2 + TMK_ERROR_0) +#define TMK_BAD_NUMBER (3 + TMK_ERROR_0) +#define BC_BAD_BUS (4 + TMK_ERROR_0) +#define BC_BAD_BASE (5 + TMK_ERROR_0) +#define BC_BAD_LEN (6 + TMK_ERROR_0) +#define RT_BAD_PAGE (7 + TMK_ERROR_0) +#define RT_BAD_LEN (8 + TMK_ERROR_0) +#define RT_BAD_ADDRESS (9 + TMK_ERROR_0) +#define RT_BAD_FUNC (10 + TMK_ERROR_0) +#define BC_BAD_FUNC (11 + TMK_ERROR_0) +#define TMK_BAD_FUNC (12 + TMK_ERROR_0) +#define VTMK_BAD_VERSION (13 + TMK_ERROR_0) + +#define VTMK_tmkconfig 2 +#define VTMK_tmkdone 3 +#define VTMK_tmkgetmaxn 4 +#define VTMK_tmkselect 5 +#define VTMK_tmkselected 6 +#define VTMK_tmkgetmode 7 +#define VTMK_tmksetcwbits 8 +#define VTMK_tmkclrcwbits 9 +#define VTMK_tmkgetcwbits 10 +#define VTMK_tmkdefevent 11 +#define VTMK_tmkgetevd 12 + +#define VTMK_bcreset 13 +#define VTMK_bc_def_tldw 14 +#define VTMK_bc_enable_di 15 +#define VTMK_bc_disable_di 16 +#define VTMK_bcdefirqmode 17 +#define VTMK_bcgetirqmode 18 +#define VTMK_bcgetmaxbase 19 +#define VTMK_bcdefbase 20 +#define VTMK_bcgetbase 21 +#define VTMK_bcputw 22 +#define VTMK_bcgetw 23 +#define VTMK_bcgetansw 24 +#define VTMK_bcputblk 25 +#define VTMK_bcgetblk 26 +#define VTMK_bcdefbus 27 +#define VTMK_bcgetbus 28 +#define VTMK_bcstart 29 +#define VTMK_bcstartx 30 +#define VTMK_bcdeflink 31 +#define VTMK_bcgetlink 32 +#define VTMK_bcstop 33 +#define VTMK_bcgetstate 34 + +#define VTMK_rtreset 35 +#define VTMK_rtdefirqmode 36 +#define VTMK_rtgetirqmode 37 +#define VTMK_rtdefmode 38 +#define VTMK_rtgetmode 39 +#define VTMK_rtgetmaxpage 40 +#define VTMK_rtdefpage 41 +#define VTMK_rtgetpage 42 +#define VTMK_rtdefpagepc 43 +#define VTMK_rtdefpagebus 44 +#define VTMK_rtgetpagepc 45 +#define VTMK_rtgetpagebus 46 +#define VTMK_rtdefaddress 47 +#define VTMK_rtgetaddress 48 +#define VTMK_rtdefsubaddr 49 +#define VTMK_rtgetsubaddr 50 +#define VTMK_rtputw 51 +#define VTMK_rtgetw 52 +#define VTMK_rtputblk 53 +#define VTMK_rtgetblk 54 +#define VTMK_rtsetanswbits 55 +#define VTMK_rtclranswbits 56 +#define VTMK_rtgetanswbits 57 +#define VTMK_rtgetflags 58 +#define VTMK_rtputflags 59 +#define VTMK_rtsetflag 60 +#define VTMK_rtclrflag 61 +#define VTMK_rtgetflag 62 +#define VTMK_rtgetstate 63 +#define VTMK_rtbusy 64 +#define VTMK_rtlock 65 +#define VTMK_rtunlock 66 +#define VTMK_rtgetcmddata 67 +#define VTMK_rtputcmddata 68 + +#define VTMK_mtreset 69 +#define VTMK_mtdefirqmode 70 +#define VTMK_mtgetirqmode 71 +#define VTMK_mtgetmaxbase 72 +#define VTMK_mtdefbase 73 +#define VTMK_mtgetbase 74 +#define VTMK_mtputw 75 +#define VTMK_mtgetw 76 +#define VTMK_mtgetsw 77 +#define VTMK_mtputblk 78 +#define VTMK_mtgetblk 79 +#define VTMK_mtstartx 80 +#define VTMK_mtdeflink 81 +#define VTMK_mtgetlink 82 +#define VTMK_mtstop 83 +#define VTMK_mtgetstate 84 + +#define VTMK_tmkgetinfo 85 +#define VTMK_GetVersion 86 + +#define VTMK_rtenable 87 + +#define VTMK_mrtgetmaxn 88 +#define VTMK_mrtconfig 89 +#define VTMK_mrtselected 90 +#define VTMK_mrtgetstate 91 +#define VTMK_mrtdefbrcsubaddr0 92 +#define VTMK_mrtreset 93 + +#define VTMK_tmktimer 94 +#define VTMK_tmkgettimer 95 +#define VTMK_tmkgettimerl 96 +#define VTMK_bcgetmsgtime 97 +#define VTMK_mtgetmsgtime 98 +#define VTMK_rtgetmsgtime 99 + +#define VTMK_tmkgethwver 100 + +#define VTMK_tmkgetevtime 101 +#define VTMK_tmkswtimer 102 +#define VTMK_tmkgetswtimer 103 + +#define VTMK_tmktimeout 104 + +#define VTMK_mrtdefbrcpage 105 +#define VTMK_mrtgetbrcpage 106 + +#define VTMK_mbcinit 107 +#define VTMK_mbcpreparex 108 +#define VTMK_mbcstartx 109 +#define VTMK_mbcalloc 110 +#define VTMK_mbcfree 111 + +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 +#define FILE_ANY_ACCESS 0 +#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe +#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe +#define TMK_KRNLDRVR 0x8000 +#define IOCTL_TMK_tmkconfig CTL_CODE(TMK_KRNLDRVR, VTMK_tmkconfig+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkdone CTL_CODE(TMK_KRNLDRVR, VTMK_tmkdone+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgetmaxn CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetmaxn+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkselect CTL_CODE(TMK_KRNLDRVR, VTMK_tmkselect+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkselected CTL_CODE(TMK_KRNLDRVR, VTMK_tmkselected+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgetmode CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmksetcwbits CTL_CODE(TMK_KRNLDRVR, VTMK_tmksetcwbits+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkclrcwbits CTL_CODE(TMK_KRNLDRVR, VTMK_tmkclrcwbits+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgetcwbits CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetcwbits+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkdefevent CTL_CODE(TMK_KRNLDRVR, VTMK_tmkdefevent+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgetevd CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetevd+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcreset CTL_CODE(TMK_KRNLDRVR, VTMK_bcreset+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bc_def_tldw CTL_CODE(TMK_KRNLDRVR, VTMK_bc_def_tldw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bc_enable_di CTL_CODE(TMK_KRNLDRVR, VTMK_bc_enable_di+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bc_disable_di CTL_CODE(TMK_KRNLDRVR, VTMK_bc_disable_di+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcdefirqmode CTL_CODE(TMK_KRNLDRVR, VTMK_bcdefirqmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetirqmode CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetirqmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetmaxbase CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetmaxbase+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcdefbase CTL_CODE(TMK_KRNLDRVR, VTMK_bcdefbase+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetbase CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetbase+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcputw CTL_CODE(TMK_KRNLDRVR, VTMK_bcputw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetw CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetansw CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetansw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcputblk CTL_CODE(TMK_KRNLDRVR, VTMK_bcputblk+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetblk CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetblk+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcdefbus CTL_CODE(TMK_KRNLDRVR, VTMK_bcdefbus+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetbus CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetbus+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcstart CTL_CODE(TMK_KRNLDRVR, VTMK_bcstart+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcstartx CTL_CODE(TMK_KRNLDRVR, VTMK_bcstartx+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcdeflink CTL_CODE(TMK_KRNLDRVR, VTMK_bcdeflink+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetlink CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetlink+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcstop CTL_CODE(TMK_KRNLDRVR, VTMK_bcstop+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetstate CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetstate+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_rtreset CTL_CODE(TMK_KRNLDRVR, VTMK_rtreset+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefirqmode CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefirqmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetirqmode CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetirqmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefmode CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetmode CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetmaxpage CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetmaxpage+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefpage CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefpage+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetpage CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetpage+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefpagepc CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefpagepc+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefpagebus CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefpagebus+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetpagepc CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetpagepc+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetpagebus CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetpagebus+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefaddress CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefaddress+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetaddress CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetaddress+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtdefsubaddr CTL_CODE(TMK_KRNLDRVR, VTMK_rtdefsubaddr+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetsubaddr CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetsubaddr+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtputw CTL_CODE(TMK_KRNLDRVR, VTMK_rtputw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetw CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtputblk CTL_CODE(TMK_KRNLDRVR, VTMK_rtputblk+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetblk CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetblk+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtsetanswbits CTL_CODE(TMK_KRNLDRVR, VTMK_rtsetanswbits+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtclranswbits CTL_CODE(TMK_KRNLDRVR, VTMK_rtclranswbits+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetanswbits CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetanswbits+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetflags CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetflags+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtputflags CTL_CODE(TMK_KRNLDRVR, VTMK_rtputflags+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtsetflag CTL_CODE(TMK_KRNLDRVR, VTMK_rtsetflag+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtclrflag CTL_CODE(TMK_KRNLDRVR, VTMK_rtclrflag+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetflag CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetflag+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetstate CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetstate+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtbusy CTL_CODE(TMK_KRNLDRVR, VTMK_rtbusy+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtlock CTL_CODE(TMK_KRNLDRVR, VTMK_rtlock+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtunlock CTL_CODE(TMK_KRNLDRVR, VTMK_rtunlock+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetcmddata CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetcmddata+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtputcmddata CTL_CODE(TMK_KRNLDRVR, VTMK_rtputcmddata+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_mtreset CTL_CODE(TMK_KRNLDRVR, VTMK_mtreset+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtdefirqmode CTL_CODE(TMK_KRNLDRVR, VTMK_mtdefirqmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetirqmode CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetirqmode+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetmaxbase CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetmaxbase+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtdefbase CTL_CODE(TMK_KRNLDRVR, VTMK_mtdefbase+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetbase CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetbase+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtputw CTL_CODE(TMK_KRNLDRVR, VTMK_mtputw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetw CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetsw CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetsw+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtputblk CTL_CODE(TMK_KRNLDRVR, VTMK_mtputblk+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetblk CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetblk+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtstartx CTL_CODE(TMK_KRNLDRVR, VTMK_mtstartx+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtdeflink CTL_CODE(TMK_KRNLDRVR, VTMK_mtdeflink+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetlink CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetlink+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtstop CTL_CODE(TMK_KRNLDRVR, VTMK_mtstop+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetstate CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetstate+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_tmkgetinfo CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetinfo+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_GetVersion CTL_CODE(TMK_KRNLDRVR, VTMK_GetVersion+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_rtenable CTL_CODE(TMK_KRNLDRVR, VTMK_rtenable+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_mrtgetmaxn CTL_CODE(TMK_KRNLDRVR, VTMK_mrtgetmaxn+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mrtconfig CTL_CODE(TMK_KRNLDRVR, VTMK_mrtconfig+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mrtselected CTL_CODE(TMK_KRNLDRVR, VTMK_mrtselected+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mrtgetstate CTL_CODE(TMK_KRNLDRVR, VTMK_mrtgetstate+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mrtdefbrcsubaddr0 CTL_CODE(TMK_KRNLDRVR, VTMK_mrtdefbrcsubaddr0+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mrtreset CTL_CODE(TMK_KRNLDRVR, VTMK_mrtreset+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_tmktimer CTL_CODE(TMK_KRNLDRVR, VTMK_tmktimer+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgettimer CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgettimer+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgettimerl CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgettimerl+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_bcgetmsgtime CTL_CODE(TMK_KRNLDRVR, VTMK_bcgetmsgtime+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mtgetmsgtime CTL_CODE(TMK_KRNLDRVR, VTMK_mtgetmsgtime+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_rtgetmsgtime CTL_CODE(TMK_KRNLDRVR, VTMK_rtgetmsgtime+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_tmkgethwver CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgethwver+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_tmkgetevtime CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetevtime+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkswtimer CTL_CODE(TMK_KRNLDRVR, VTMK_tmkswtimer+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_tmkgetswtimer CTL_CODE(TMK_KRNLDRVR, VTMK_tmkgetswtimer+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_tmktimeout CTL_CODE(TMK_KRNLDRVR, VTMK_tmktimeout+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_mrtdefbrcpage CTL_CODE(TMK_KRNLDRVR, VTMK_mrtdefbrcpage+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mrtgetbrcpage CTL_CODE(TMK_KRNLDRVR, VTMK_mrtgetbrcpage+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_TMK_mbcinit CTL_CODE(TMK_KRNLDRVR, VTMK_mbcinit+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mbcpreparex CTL_CODE(TMK_KRNLDRVR, VTMK_mbcpreparex+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mbcstartx CTL_CODE(TMK_KRNLDRVR, VTMK_mbcstartx+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mbcalloc CTL_CODE(TMK_KRNLDRVR, VTMK_mbcalloc+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_TMK_mbcfree CTL_CODE(TMK_KRNLDRVR, VTMK_mbcfree+0x800, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define Ezusb_IOCTL_INDEX 0x0800 +#define FILE_DEVICE_UNKNOWN 0x00000022 + +#define IOCTL_EZUSB_GET_DRIVER_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, Ezusb_IOCTL_INDEX+29, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EZUSB_SET_CURPROC CTL_CODE(FILE_DEVICE_UNKNOWN, Ezusb_IOCTL_INDEX+34, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _EZUSB_DRIVER_VERSION +{ + WORD MajorVersion; + WORD MinorVersion; + WORD BuildVersion; +} EZUSB_DRIVER_VERSION, *PEZUSB_DRIVER_VERSION; + +typedef struct +{ + short nType; + char szName[10]; + unsigned short wPorts1; + unsigned short wPorts2; + unsigned short wIrq1; + unsigned short wIrq2; + unsigned short wIODelay; +} TTmkConfigData; + +typedef struct +{ + int nInt; + unsigned short wMode; + union + { + struct + { + unsigned short wResult; + unsigned short wAW1; + unsigned short wAW2; + } bc; + struct + { + unsigned short wBase; + unsigned short wResultX; + } bcx; + struct + { + unsigned short wStatus; + unsigned short wCmd; + } rt; + struct + { + unsigned short wBase; + unsigned short wResultX; + } mt; + struct + { + unsigned short wStatus; + } mrt; + struct + { + unsigned short wRequest; +// DWORD dwTimer; + } tmk; + struct + { + unsigned short wData1; + unsigned short wData2; + } raw; + }; +} TTmkEventData; + +DWORD TmkOpen(); +void TmkClose(); +void tmkgetinfo(TTmkConfigData *pConfD); +void tmkgetevd( TTmkEventData *pEvD ); +void tmkdefevent( HANDLE hEvent, BOOL fEventSet ); +int tmkgetmaxn(); +int tmkconfig( int tmkNumber ); +int tmkdone( int tmkNumber ); +int tmkselect( int tmkNumber ); +int tmkselected(); +TMK_DATA tmkgetmode(); +int tmkdefdac(int dacValue); +int tmkgetdac(int *dacValue, int *dacMode); +void tmksetcwbits( TMK_DATA tmkSetControl ); +void tmkclrcwbits( TMK_DATA tmkClrControl ); +TMK_DATA tmkgetcwbits(); +int bcreset(); +void bc_def_tldw( TMK_DATA wTLDW ); +void bc_enable_di(); +void bc_disable_di(); +int bcdefirqmode( TMK_DATA bcIrqMode ); +TMK_DATA bcgetirqmode(); +TMK_DATA bcgetmaxbase(); +int bcdefbase( TMK_DATA bcBasePC ); +TMK_DATA bcgetbase(); +void bcputw( TMK_DATA bcAddr, TMK_DATA bcData ); +TMK_DATA bcgetw( TMK_DATA bcAddr ); +DWORD bcgetansw( TMK_DATA bcCtrlCode ); +void bcputblk( TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength ); +void bcgetblk( TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength ); +int bcdefbus( TMK_DATA bcBus ); +TMK_DATA bcgetbus(); +int bcstart( TMK_DATA bcBase, TMK_DATA bcCtrlCode ); +int bcstartx( TMK_DATA bcBase, TMK_DATA bcCtrlCode ); +int bcdeflink( TMK_DATA bcBase, TMK_DATA bcCtrlCode ); +DWORD bcgetlink(); +TMK_DATA bcstop(); +DWORD bcgetstate(); +int rtreset(); +int rtdefirqmode( TMK_DATA rtIrqMode ); +TMK_DATA rtgetirqmode(); +int rtdefmode( TMK_DATA rtMode ); +TMK_DATA rtgetmode(); +TMK_DATA rtgetmaxpage(); +int rtdefpage( TMK_DATA rtPage ); +TMK_DATA rtgetpage(); +int rtdefpagepc( TMK_DATA rtPagePC ); +int rtdefpagebus( TMK_DATA rtPageBus ); +TMK_DATA rtgetpagepc(); +TMK_DATA rtgetpagebus(); +int rtdefaddress( TMK_DATA rtAddress ); +TMK_DATA rtgetaddress(); +void rtdefsubaddr( TMK_DATA rtDir, TMK_DATA rtSubAddr); +TMK_DATA rtgetsubaddr(); +void rtputw( TMK_DATA rtAddr, TMK_DATA rtData ); +TMK_DATA rtgetw( TMK_DATA rtAddr ); +void rtputblk( TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength ); +void rtgetblk( TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength ); +void rtsetanswbits( TMK_DATA rtSetControl ); +void rtclranswbits( TMK_DATA rtClrControl ); +TMK_DATA rtgetanswbits(); +void rtgetflags( void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax ); +void rtputflags( void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax ); +void rtsetflag(); +void rtclrflag(); +TMK_DATA rtgetflag( TMK_DATA rtDir, TMK_DATA rtSubAddr ); +TMK_DATA rtgetstate(); +TMK_DATA rtbusy(); +void rtlock( TMK_DATA rtDir, TMK_DATA rtSubAddr ); +void rtunlock(); +TMK_DATA rtgetcmddata( TMK_DATA rtBusCommand ); +void rtputcmddata( TMK_DATA rtBusCommand, TMK_DATA rtData ); +int mtreset(); +TMK_DATA mtgetsw(); +#define mtdefirqmode bcdefirqmode +#define mtgetirqmode bcgetirqmode +#define mtgetmaxbase bcgetmaxbase +#define mtdefbase bcdefbase +#define mtgetbase bcgetbase +#define mtputw bcputw +#define mtgetw bcgetw +#define mtputblk bcputblk +#define mtgetblk bcgetblk +#define mtstartx bcstartx +#define mtdeflink bcdeflink +#define mtgetlink bcgetlink +#define mtstop bcstop +#define mtgetstate bcgetstate + +TMK_DATA rtenable(TMK_DATA rtEnable); + +int mrtgetmaxn(); +DWORD mrtconfig(int tmkNumber); +int mrtselected(); +TMK_DATA mrtgetstate(); +void mrtdefbrcsubaddr0(); +int mrtreset(); + +TMK_DATA tmktimer(TMK_DATA tmkTimerCtrl); +DWORD tmkgettimer(); +TMK_DATA tmkgettimerl(); +DWORD bcgetmsgtime(); +#define mtgetmsgtime bcgetmsgtime +DWORD rtgetmsgtime(); +TMK_DATA tmkgethwver(); + +DWORD tmkgetevtime(); +TMK_DATA tmkswtimer(TMK_DATA tmkTimerCtrl); +DWORD tmkgetswtimer(); + +TMK_DATA tmktimeout(TMK_DATA tmkTimeOut); + +int mrtdefbrcpage(TMK_DATA mrtBrcPage); +TMK_DATA mrtgetbrcpage(); + +int mbcinit(TMK_DATA mbcId); +int mbcpreparex(TMK_DATA mbcId, TMK_DATA bcBase, TMK_DATA bcCtrlCode, TMK_DATA mbcDelay); +int mbcstartx(TMK_DATA mbcId); +TMK_DATA mbcalloc(); +int mbcfree(TMK_DATA mbcId); + +DWORD MT_Start(DWORD dwBufSize, HANDLE hEvent); +DWORD MT_GetMessage(WORD * Data, DWORD dwBufSize, int FillFlag, DWORD * dwMsWritten); +DWORD MT_Stop(); + +unsigned int tmkrawio(unsigned int *buf_out, unsigned int *buf_in); +TMK_DATA rtgap(TMK_DATA Gap); +int tmkreadsn(); + +typedef struct +{ + int nInt; + unsigned int empty; + unsigned int wMode; + unsigned int awEvData[3]; +// PEPROCESS hProc; + unsigned int empty1; + unsigned int empty2; +} TListEvD, *pTListEvD; + +typedef int (__cdecl *htmkconfig_usb) (int tmkNumber, int wType, int PortsAddr1, int PortsAddr2); +typedef int (__cdecl *htmkdone_usb) (int tmkNumber); +typedef int (__cdecl *htmkselect_usb)(int tmkNumber); +typedef void (__cdecl *htmkdefevent_usb)(void *hEvent); +typedef int (__cdecl *hRead_DLL_EvD_usb)(TListEvD *evd); +typedef void (__cdecl *htmksetcwbits_usb)(TMK_DATA tmkSetControl); +typedef void (__cdecl *htmkclrcwbits_usb)(TMK_DATA tmkClrControl); +typedef TMK_DATA (__cdecl *htmkgetcwbits_usb)(); +typedef TMK_DATA (__cdecl *htmkgetmode_usb)(); +typedef int (__cdecl *htmkdefdac_usb)(int dacValue); +typedef int (__cdecl *htmkgetdac_usb)(int *value, int *mode); +typedef int (__cdecl *hbcreset_usb)(); +typedef int (__cdecl *hbcdefirqmode_usb)(TMK_DATA bcIrqMode); +typedef TMK_DATA (__cdecl *hbcgetirqmode_usb)(); +typedef TMK_DATA (__cdecl *hbcgetmaxbase_usb)(); +typedef int (__cdecl *hbcdefbase_usb)(TMK_DATA bcBasePC); +typedef TMK_DATA (__cdecl *hbcgetbase_usb)(); +typedef void (__cdecl *hbcputw_usb)(TMK_DATA bcAddr, TMK_DATA bcData); +typedef TMK_DATA (__cdecl *hbcgetw_usb)(TMK_DATA bcAddr); +typedef DWORD (__cdecl *hbcgetansw_usb)(TMK_DATA bcCtrlCode); +typedef void (__cdecl *hbcputblk_usb)(TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength); +typedef void (__cdecl *hbcgetblk_usb)(TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength); +typedef int (__cdecl *hbcdefbus_usb)(TMK_DATA bcBus); +typedef TMK_DATA (__cdecl *hbcgetbus_usb)(); +typedef int (__cdecl *hbcstart_usb)(TMK_DATA bcBase, TMK_DATA bcCtrlCode); +typedef int (__cdecl *hbcstartx_usb)(TMK_DATA bcBase, TMK_DATA bcCtrlCode); +typedef int (__cdecl *hbcdeflink_usb)(TMK_DATA bcBase, TMK_DATA bcCtrlCode); +typedef DWORD (__cdecl *hbcgetlink_usb)(); +typedef TMK_DATA (__cdecl *hbcstop_usb)(); +typedef DWORD (__cdecl *hbcgetstate_usb)(); +typedef int (__cdecl *hrtreset_usb)(); +typedef int (__cdecl *hrtdefirqmode_usb)(TMK_DATA rtIrqMode); +typedef TMK_DATA (__cdecl *hrtgetirqmode_usb)(); +typedef int (__cdecl *hrtdefmode_usb)(TMK_DATA rtMode); +typedef TMK_DATA (__cdecl *hrtgetmode_usb)(); +typedef TMK_DATA (__cdecl *hrtgetmaxpage_usb)(); +typedef int (__cdecl *hrtdefpage_usb)(TMK_DATA rtPage); +typedef TMK_DATA (__cdecl *hrtgetpage_usb)(); +typedef int (__cdecl *hrtdefpagepc_usb)(TMK_DATA rtPagePC); +typedef int (__cdecl *hrtdefpagebus_usb)(TMK_DATA rtPageBus); +typedef TMK_DATA (__cdecl *hrtgetpagepc_usb)(); +typedef TMK_DATA (__cdecl *hrtgetpagebus_usb)(); +typedef int (__cdecl *hrtdefaddress_usb)(TMK_DATA rtAddress); +typedef TMK_DATA (__cdecl *hrtgetaddress_usb)(); +typedef void (__cdecl *hrtdefsubaddr_usb)(TMK_DATA rtDir, TMK_DATA rtSubAddr); +typedef TMK_DATA (__cdecl *hrtgetsubaddr_usb)(); +typedef void (__cdecl *hrtputw_usb)(TMK_DATA rtAddr, TMK_DATA rtData); +typedef TMK_DATA (__cdecl *hrtgetw_usb)(TMK_DATA rtAddr); +typedef void (__cdecl *hrtputblk_usb)(TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength); +typedef void (__cdecl *hrtgetblk_usb)(TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength); +typedef void (__cdecl *hrtsetanswbits_usb)(TMK_DATA rtSetControl); +typedef void (__cdecl *hrtclranswbits_usb)(TMK_DATA rtClrControl); +typedef TMK_DATA (__cdecl *hrtgetanswbits_usb)(); +typedef void (__cdecl *hrtgetflags_usb)(void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax); +typedef void (__cdecl *hrtputflags_usb)(void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax); +typedef void (__cdecl *hrtsetflag_usb)(); +typedef void (__cdecl *hrtclrflag_usb)(); +typedef TMK_DATA (__cdecl *hrtgetflag_usb)(TMK_DATA rtDir, TMK_DATA rtSubAddr); +typedef void (__cdecl *hrtputflag_usb)(TMK_DATA rtDir, TMK_DATA rtSubAddr, TMK_DATA rtFlag); +typedef TMK_DATA (__cdecl *hrtgetstate_usb)(); +typedef TMK_DATA (__cdecl *hrtbusy_usb)(); +typedef void (__cdecl *hrtlock_usb)(TMK_DATA rtDir, TMK_DATA rtSubAddr); +typedef void (__cdecl *hrtunlock_usb)(); +typedef TMK_DATA (__cdecl *hrtgetcmddata_usb)(TMK_DATA rtBusCommand); +typedef void (__cdecl *hrtputcmddata_usb)(TMK_DATA rtBusCommand, TMK_DATA rtData); +typedef int (__cdecl *hmtreset_usb)(); +typedef TMK_DATA (__cdecl *hmtgetsw_usb)(); +typedef TMK_DATA (__cdecl *hrtenable_usb)(TMK_DATA rtEnable); +typedef int (__cdecl *hmrtselected_usb)(); +typedef TMK_DATA (__cdecl *hmrtgetstate_usb)(); +typedef void (__cdecl *hmrtdefbrcsubaddr0_usb)(); +typedef int (__cdecl *hmrtreset_usb)(); +typedef TMK_DATA (__cdecl *htmktimer_usb)(TMK_DATA TimerCtrl); +typedef DWORD (__cdecl *htmkgettimer_usb)(); +typedef DWORD (__cdecl *htmkgettimerl_usb)(); +typedef DWORD (__cdecl *hbcgetmsgtime_usb)(); +typedef DWORD (__cdecl *hrtgetmsgtime_usb)(); +typedef TMK_DATA (__cdecl *htmkgethwver_usb)(); +typedef DWORD (__cdecl *htmkgetevtime_usb)(); +typedef TMK_DATA (__cdecl *htmkswtimer_usb)(TMK_DATA tmkTimerCtrl); +typedef DWORD (__cdecl *htmkgetswtimer_usb)(); +typedef TMK_DATA (__cdecl *htmktimeout_usb)(TMK_DATA tmkTimeOut); +typedef int (__cdecl *hmrtdefbrcpage_usb)(TMK_DATA mrtBrcPage); +typedef TMK_DATA (__cdecl *hmrtgetbrcpage_usb)(); + +typedef DWORD (__cdecl *hMonitorHwStart_usb)(DWORD dwBufSize, HANDLE hEvent); +typedef DWORD (__cdecl *hMonitorHwGetMessage_usb)(WORD * Data, DWORD dwBufSize, BOOL FillFlag, DWORD * dwMsWritten); +typedef DWORD (__cdecl *hMonitorHwStop_usb)(void); + +typedef unsigned int (__cdecl *htmkrawio_usb)(unsigned int *buf_out, unsigned int *buf_in); +typedef TMK_DATA (__cdecl *hrtgap_usb)(TMK_DATA Gap); +typedef int (__cdecl *htmkreadsn_usb)(void); + +int ftmkError = -1; + +int ftmkconfig_usb (int tmkNumber, int wType, int PortsAddr1, int PortsAddr2){return -1;} +int ftmkdone_usb (int tmkNumber){return -1;} +int ftmkselect_usb(int tmkNumber){return -1;} +void ftmkdefevent_usb(void *hEvent){} +int fRead_DLL_EvD_usb(TListEvD *evd){return -1;} +void ftmksetcwbits_usb(TMK_DATA tmkSetControl){} +void ftmkclrcwbits_usb(TMK_DATA tmkClrControl){} +TMK_DATA ftmkgetcwbits_usb(){return -1;} +TMK_DATA ftmkgetmode_usb(){return -1;} +int ftmkdefdac_usb(int dacValue){return -1;} +int ftmkgetdac_usb(int *value, int *mode){return -1;} +int fbcreset_usb(){return -1;} +int fbcdefirqmode_usb(TMK_DATA bcIrqMode){return -1;} +TMK_DATA fbcgetirqmode_usb(){return -1;} +TMK_DATA fbcgetmaxbase_usb(){return -1;} +int fbcdefbase_usb(TMK_DATA bcBasePC){return -1;} +TMK_DATA fbcgetbase_usb(){return -1;} +void fbcputw_usb(TMK_DATA bcAddr, TMK_DATA bcData){} +TMK_DATA fbcgetw_usb(TMK_DATA bcAddr){return -1;} +DWORD fbcgetansw_usb(TMK_DATA bcCtrlCode){return -1;} +void fbcputblk_usb(TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength){} +void fbcgetblk_usb(TMK_DATA bcAddr, void *pcBuffer, TMK_DATA cwLength){} +int fbcdefbus_usb(TMK_DATA bcBus){return -1;} +TMK_DATA fbcgetbus_usb(){return -1;} +int fbcstart_usb(TMK_DATA bcBase, TMK_DATA bcCtrlCode){return -1;} +int fbcstartx_usb(TMK_DATA bcBase, TMK_DATA bcCtrlCode){return -1;} +int fbcdeflink_usb(TMK_DATA bcBase, TMK_DATA bcCtrlCode){return -1;} +DWORD fbcgetlink_usb(){return -1;} +TMK_DATA fbcstop_usb(){return -1;} +DWORD fbcgetstate_usb(){return -1;} +int frtreset_usb(){return -1;} +int frtdefirqmode_usb(TMK_DATA rtIrqMode){return -1;} +TMK_DATA frtgetirqmode_usb(){return -1;} +int frtdefmode_usb(TMK_DATA rtMode){return -1;} +TMK_DATA frtgetmode_usb(){return -1;} +TMK_DATA frtgetmaxpage_usb(){return -1;} +int frtdefpage_usb(TMK_DATA rtPage){return -1;} +TMK_DATA frtgetpage_usb(){return -1;} +int frtdefpagepc_usb(TMK_DATA rtPagePC){return -1;} +int frtdefpagebus_usb(TMK_DATA rtPageBus){return -1;} +TMK_DATA frtgetpagepc_usb(){return -1;} +TMK_DATA frtgetpagebus_usb(){return -1;} +int frtdefaddress_usb(TMK_DATA rtAddress){return -1;} +TMK_DATA frtgetaddress_usb(){return -1;} +void frtdefsubaddr_usb(TMK_DATA rtDir, TMK_DATA rtSubAddr){} +TMK_DATA frtgetsubaddr_usb(){return -1;} +void frtputw_usb(TMK_DATA rtAddr, TMK_DATA rtData){} +TMK_DATA frtgetw_usb(TMK_DATA rtAddr){return -1;} +void frtputblk_usb(TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength){} +void frtgetblk_usb(TMK_DATA rtAddr, void *pcBuffer, TMK_DATA cwLength){} +void frtsetanswbits_usb(TMK_DATA rtSetControl){} +void frtclranswbits_usb(TMK_DATA rtClrControl){} +TMK_DATA frtgetanswbits_usb(){return -1;} +void frtgetflags_usb(void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax){} +void frtputflags_usb(void *pcBuffer, TMK_DATA rtDir, TMK_DATA rtFlagMin, TMK_DATA rtFlagMax){} +void frtsetflag_usb(){} +void frtclrflag_usb(){} +TMK_DATA frtgetflag_usb(TMK_DATA rtDir, TMK_DATA rtSubAddr){return -1;} +void frtputflag_usb(TMK_DATA rtDir, TMK_DATA rtSubAddr, TMK_DATA rtFlag){} +TMK_DATA frtgetstate_usb(){return -1;} +TMK_DATA frtbusy_usb(){return -1;} +void frtlock_usb(TMK_DATA rtDir, TMK_DATA rtSubAddr){} +void frtunlock_usb(){} +TMK_DATA frtgetcmddata_usb(TMK_DATA rtBusCommand){return -1;} +void frtputcmddata_usb(TMK_DATA rtBusCommand, TMK_DATA rtData){} +int fmtreset_usb(){return -1;} +TMK_DATA fmtgetsw_usb(){return -1;} +TMK_DATA frtenable_usb(TMK_DATA rtEnable){return -1;} +int fmrtselected_usb(){return -1;} +TMK_DATA fmrtgetstate_usb(){return -1;} +void fmrtdefbrcsubaddr0_usb(){} +int fmrtreset_usb(){return -1;} +TMK_DATA ftmktimer_usb(TMK_DATA TimerCtrl){return -1;} +DWORD ftmkgettimer_usb(){return -1;} +DWORD ftmkgettimerl_usb(){return -1;} +DWORD fbcgetmsgtime_usb(){return -1;} +DWORD frtgetmsgtime_usb(){return -1;} +TMK_DATA ftmkgethwver_usb(){return -1;} +DWORD ftmkgetevtime_usb(){return -1;} +TMK_DATA ftmkswtimer_usb(TMK_DATA tmkTimerCtrl){return -1;} +DWORD ftmkgetswtimer_usb(){return -1;} +TMK_DATA ftmktimeout_usb(WORD tmkTimeOut){return -1;} +int fmrtdefbrcpage_usb(TMK_DATA mrtBrcPage){return -1;} +TMK_DATA fmrtgetbrcpage_usb(){return 0;} + +DWORD fMonitorHwStart_usb(DWORD dwBufSize, HANDLE hEvent){return -1;} +DWORD fMonitorHwGetMessage_usb(WORD * Data, DWORD dwBufSize, BOOL FillFlag, DWORD * dwMsWritten){return -1;} +DWORD fMonitorHwStop_usb(void){return -1;} + +unsigned int ftmkrawio_usb(unsigned int *buf_out, unsigned int *buf_in){return -1;} +TMK_DATA frtgap_usb(TMK_DATA Gap){return -1;} +int ftmkreadsn_usb(void){return -1;} + +int *ptmkError; + +htmkconfig_usb tmkconfig_usb = ftmkconfig_usb; +htmkdone_usb tmkdone_usb = ftmkdone_usb; +htmkselect_usb tmkselect_usb = ftmkselect_usb; +htmkdefevent_usb tmkdefevent_usb = ftmkdefevent_usb; +hRead_DLL_EvD_usb Read_DLL_EvD_usb = fRead_DLL_EvD_usb; +htmksetcwbits_usb tmksetcwbits_usb = ftmksetcwbits_usb; +htmkclrcwbits_usb tmkclrcwbits_usb = ftmkclrcwbits_usb; +htmkgetcwbits_usb tmkgetcwbits_usb = ftmkgetcwbits_usb; +htmkgetmode_usb tmkgetmode_usb = ftmkgetmode_usb; +htmkdefdac_usb tmkdefdac_usb = ftmkdefdac_usb; +htmkgetdac_usb tmkgetdac_usb = ftmkgetdac_usb; +hbcreset_usb bcreset_usb = fbcreset_usb; +hbcdefirqmode_usb bcdefirqmode_usb = fbcdefirqmode_usb; +hbcgetirqmode_usb bcgetirqmode_usb = fbcgetirqmode_usb; +hbcgetmaxbase_usb bcgetmaxbase_usb = fbcgetmaxbase_usb; +hbcdefbase_usb bcdefbase_usb = fbcdefbase_usb; +hbcgetbase_usb bcgetbase_usb = fbcgetbase_usb; +hbcputw_usb bcputw_usb = fbcputw_usb; +hbcgetw_usb bcgetw_usb = fbcgetw_usb; +hbcgetansw_usb bcgetansw_usb = fbcgetansw_usb; +hbcputblk_usb bcputblk_usb = fbcputblk_usb; +hbcgetblk_usb bcgetblk_usb = fbcgetblk_usb; +hbcdefbus_usb bcdefbus_usb = fbcdefbus_usb; +hbcgetbus_usb bcgetbus_usb = fbcgetbus_usb; +hbcstart_usb bcstart_usb = fbcstart_usb; +hbcstartx_usb bcstartx_usb = fbcstartx_usb; +hbcdeflink_usb bcdeflink_usb = fbcdeflink_usb; +hbcgetlink_usb bcgetlink_usb = fbcgetlink_usb; +hbcstop_usb bcstop_usb = fbcstop_usb; +hbcgetstate_usb bcgetstate_usb = fbcgetstate_usb; +hrtreset_usb rtreset_usb = frtreset_usb; +hrtdefirqmode_usb rtdefirqmode_usb = frtdefirqmode_usb; +hrtgetirqmode_usb rtgetirqmode_usb = frtgetirqmode_usb; +hrtdefmode_usb rtdefmode_usb = frtdefmode_usb; +hrtgetmode_usb rtgetmode_usb = frtgetmode_usb; +hrtgetmaxpage_usb rtgetmaxpage_usb = frtgetmaxpage_usb; +hrtdefpage_usb rtdefpage_usb = frtdefpage_usb; +hrtgetpage_usb rtgetpage_usb = frtgetpage_usb; +hrtdefpagepc_usb rtdefpagepc_usb = frtdefpagepc_usb; +hrtdefpagebus_usb rtdefpagebus_usb = frtdefpagebus_usb; +hrtgetpagepc_usb rtgetpagepc_usb = frtgetpagepc_usb; +hrtgetpagebus_usb rtgetpagebus_usb = frtgetpagebus_usb; +hrtdefaddress_usb rtdefaddress_usb = frtdefaddress_usb; +hrtgetaddress_usb rtgetaddress_usb = frtgetaddress_usb; +hrtdefsubaddr_usb rtdefsubaddr_usb = frtdefsubaddr_usb; +hrtgetsubaddr_usb rtgetsubaddr_usb = frtgetsubaddr_usb; +hrtputw_usb rtputw_usb = frtputw_usb; +hrtgetw_usb rtgetw_usb = frtgetw_usb; +hrtputblk_usb rtputblk_usb = frtputblk_usb; +hrtgetblk_usb rtgetblk_usb = frtgetblk_usb; +hrtsetanswbits_usb rtsetanswbits_usb = frtsetanswbits_usb; +hrtclranswbits_usb rtclranswbits_usb = frtclranswbits_usb; +hrtgetanswbits_usb rtgetanswbits_usb = frtgetanswbits_usb; +hrtgetflags_usb rtgetflags_usb = frtgetflags_usb; +hrtputflags_usb rtputflags_usb = frtputflags_usb; +hrtsetflag_usb rtsetflag_usb = frtsetflag_usb; +hrtclrflag_usb rtclrflag_usb = frtclrflag_usb; +hrtgetflag_usb rtgetflag_usb = frtgetflag_usb; +hrtputflag_usb rtputflag_usb = frtputflag_usb; +hrtgetstate_usb rtgetstate_usb = frtgetstate_usb; +hrtbusy_usb rtbusy_usb = frtbusy_usb; +hrtlock_usb rtlock_usb = frtlock_usb; +hrtunlock_usb rtunlock_usb = frtunlock_usb; +hrtgetcmddata_usb rtgetcmddata_usb = frtgetcmddata_usb; +hrtputcmddata_usb rtputcmddata_usb = frtputcmddata_usb; +hmtreset_usb mtreset_usb = fmtreset_usb; +hmtgetsw_usb mtgetsw_usb = fmtgetsw_usb; +hrtenable_usb rtenable_usb = frtenable_usb; +hmrtselected_usb mrtselected_usb = fmrtselected_usb; +hmrtgetstate_usb mrtgetstate_usb = fmrtgetstate_usb; +hmrtdefbrcsubaddr0_usb mrtdefbrcsubaddr0_usb = fmrtdefbrcsubaddr0_usb; +hmrtreset_usb mrtreset_usb = fmrtreset_usb; +htmktimer_usb tmktimer_usb = ftmktimer_usb; +htmkgettimer_usb tmkgettimer_usb = ftmkgettimer_usb; +htmkgettimerl_usb tmkgettimerl_usb = ftmkgettimerl_usb; +hbcgetmsgtime_usb bcgetmsgtime_usb = fbcgetmsgtime_usb; +hrtgetmsgtime_usb rtgetmsgtime_usb = frtgetmsgtime_usb; +htmkgethwver_usb tmkgethwver_usb = ftmkgethwver_usb; +htmkgetevtime_usb tmkgetevtime_usb = ftmkgetevtime_usb; +htmkswtimer_usb tmkswtimer_usb = ftmkswtimer_usb; +htmkgetswtimer_usb tmkgetswtimer_usb = ftmkgetswtimer_usb; +htmktimeout_usb tmktimeout_usb = ftmktimeout_usb; +hmrtdefbrcpage_usb mrtdefbrcpage_usb = fmrtdefbrcpage_usb; +hmrtgetbrcpage_usb mrtgetbrcpage_usb = fmrtgetbrcpage_usb; + +hMonitorHwStart_usb MonitorHwStart_usb = fMonitorHwStart_usb; +hMonitorHwGetMessage_usb MonitorHwGetMessage_usb = fMonitorHwGetMessage_usb; +hMonitorHwStop_usb MonitorHwStop_usb = fMonitorHwStop_usb; + +htmkrawio_usb tmkrawio_usb = ftmkrawio_usb; +hrtgap_usb rtgap_usb = frtgap_usb; +htmkreadsn_usb tmkreadsn_usb = ftmkreadsn_usb; diff --git a/bcmil.cpp b/bcmil.cpp new file mode 100644 index 0000000..9c16c4b --- /dev/null +++ b/bcmil.cpp @@ -0,0 +1,195 @@ +#include +#include "bcmil.h" +#include "WDMTMKv2.cpp" +//#include + +//TTmkEventData tmkEvD; +HANDLE hBcEvent; +//HANDLE hRtEvent; + +int nTmk; +unsigned long dwGoodStarts = 0, dwBusyStarts = 0, dwErrStarts = 0, dwStatStarts = 0; +unsigned long dwStarts = 0L; +TMK_DATA wSubAddr, wState, wStatus; + +MIL::MIL(int dev_index) //open the driver, configuration, create event +{ + qDebug() << "MIL constructor"; + if (TmkOpen()) + { + qDebug() << "TmkOpen() error"; + closeAllrt(); + //closeAll(); + } + else + { + if ((dev_index > tmkgetmaxn()) || (dev_index < 0)) + { + closeAllrt(); + //closeAll(); + } + else + { + this->m_TmkIndex = dev_index; + + if (tmkconfig(this->m_TmkIndex)) + { + closeAllrt(); + //closeAll(); + } + } + } +} + +/*int MIL::WaitInt(TMK_DATA wCtrlCode) +{ + //Wait for an interrupt + DWORD k; + k = WaitForSingleObject(hBcEvent, 1000); + switch (k) + { + case WAIT_OBJECT_0: + ResetEvent(hBcEvent); + break; + + case WAIT_TIMEOUT: + qDebug() << "Interrupt timeout error\n"; + return 1; + + default: + qDebug() << "k = " << k; + qDebug() << "Interrupt wait error\n"; + return 1; + } + + // Get interrupt data + // We do not need to check tmkEvD.nInt because bcstartx with CX_NOSIG + // guarantees us only single interrupt of single type nInt == 3 + tmkgetevd(&tmkEvD); + + if (tmkEvD.bcx.wResultX & SX_IB_MASK) + { + // We have set bit(s) in Status Word + if (((tmkEvD.bcx.wResultX & SX_ERR_MASK) == SX_NOERR) || ((tmkEvD.bcx.wResultX & SX_ERR_MASK) == SX_TOD)) + { + wStatus = bcgetansw(wCtrlCode); // We have either no errors or Data Time Out (No Data) error + if (wStatus & BUSY_MASK) // We have BUSY bit set + ++dwBusyStarts; + else // We have unknown bit(s) set + ++dwStatStarts; + } + else // We have an error + ++dwErrStarts; + } + else if (tmkEvD.bcx.wResultX & SX_ERR_MASK) // We have an error + ++dwErrStarts; + else // We have a completed message + ++dwGoodStarts; + + ++dwStarts; + return 0; +}*/ + +/*void MIL::closeAll() +{ + qDebug() << "Close All"; + //printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts); + bcreset(); + //Close all opened things + CloseHandle(hBcEvent); + tmkdone(ALL_TMKS); + TmkClose(); +}*/ + +void MIL::closeAllrt() +{ + qDebug() << "Close All"; + //printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts); + rtreset(); + //Close all opened things + CloseHandle(hBcEvent); + tmkdone(ALL_TMKS); + TmkClose(); +} + +MIL::~MIL() +{ + qDebug() << "MIL destructor"; +} + +/*BC_MIL::BC_MIL(int dev_index): MIL(dev_index) +{ + qDebug() << "BC_MIL constructor"; + //Find first configured device + for (nTmk = 0; nTmk <= MAX_TMK_NUMBER; ++nTmk) + if (!tmkselect(nTmk)) + break; + if (nTmk > MAX_TMK_NUMBER) + { + qDebug() << "tmkselect error"; + closeAll(); + } + //Try to reset in BC mode + if (bcreset()) + { + qDebug() << "bcreset error"; + closeAll(); + } +} + +BC_MIL::~BC_MIL() +{ + qDebug() << "BC_MIL destructor"; +}*/ + +RT_MIL::RT_MIL(int dev_index, unsigned short Addr): MIL(dev_index) +{ + qDebug() << "RT_MIL constructor"; + this->m_Addr = Addr; + + //Find first configured device + for (nTmk = 0; nTmk <= MAX_TMK_NUMBER; ++nTmk) + if (!tmkselect(nTmk)) + break; + if (nTmk > MAX_TMK_NUMBER) + { + qDebug() << "tmkselect error"; + closeAllrt(); + } + //Try to reset in RT mode + if (rtreset()) + { + qDebug() << "rtreset error"; + closeAllrt(); + } + //Set RT address, set flag mode, enable data irqs + rtdefaddress(Addr); + rtdefmode(rtgetmode()|RT_FLAG_MODE); + //rtdefmode(rtgetmode()&~RT_FLAG_MODE); + rtdefirqmode(rtgetirqmode()&~RT_DATA_BL); + + for (wSubAddr = 1; wSubAddr <= 30; ++wSubAddr) + { + //Ready to receive, not ready to transmit + rtdefsubaddr(RT_RECEIVE, wSubAddr); + rtclrflag(); + rtdefsubaddr(RT_TRANSMIT, wSubAddr); + rtclrflag(); + } + + hBcEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!hBcEvent) + { + qDebug() << "create event error"; + closeAllrt(); + } + ResetEvent(hBcEvent); + tmkdefevent(hBcEvent, TRUE); +} + +RT_MIL::~RT_MIL() +{ + qDebug() << "RT_MIL destructor"; +} + + diff --git a/bcmil.h b/bcmil.h new file mode 100644 index 0000000..3820239 --- /dev/null +++ b/bcmil.h @@ -0,0 +1,98 @@ +#ifndef BCMIL_H +#define BCMIL_H + +#include + +//******************* +//#include "WDMTMKv2.h" +//#include "windows.h" +//******************* +/*typedef struct +{ + int nInt; + unsigned short wMode; + union + { + struct + { + unsigned short wResult; + unsigned short wAW1; + unsigned short wAW2; + } bc; + struct + { + unsigned short wBase; + unsigned short wResultX; + } bcx; + struct + { + unsigned short wStatus; + unsigned short wCmd; + } rt; + struct + { + unsigned short wBase; + unsigned short wResultX; + } mt; + struct + { + unsigned short wStatus; + } mrt; + struct + { + unsigned short wRequest; +// DWORD dwTimer; + } tmk; + struct + { + unsigned short wData1; + unsigned short wData2; + } raw; + }; +} TTmkEventData1;*/ + +#define TMK_DATA unsigned short +typedef void *HANDLE; + +//class BC_MIL; +//class RT_MIL; +class MIL:public QObject +{ + Q_OBJECT +public: + + MIL(int dev_index); + ~MIL(); + + //int WaitInt(TMK_DATA wCtrlCode); + //void closeAll(); + void closeAllrt(); + //bool GetEvent(TTmkEventData1 *pEv, unsigned short Timeout); + +protected: + + int m_TmkIndex; + //HANDLE m_hEvent; +}; + +/*class BC_MIL:public MIL +{ +public: + + BC_MIL(int dev_index); + ~BC_MIL(void); +}; +*/ +class RT_MIL:public MIL +{ +public: + + RT_MIL(int dev_indexi, unsigned short Addr); + ~RT_MIL(); + +protected: + + unsigned short m_Addr; +}; + +#endif // BCMIL_H diff --git a/cmdwrd.cpp b/cmdwrd.cpp new file mode 100644 index 0000000..07094c2 --- /dev/null +++ b/cmdwrd.cpp @@ -0,0 +1,87 @@ +#include "mainwindow.h" +#include "cmdwrd.h" + +extern unsigned char HexBinFlag; + +CommandWord::CommandWord() +{ + addrRTf = 0; + Kf = 0; + subAddrf = 0; + numDWf = 0; + + cmdCode.insert(dynBC, "Принять упр-е интерфейсом"); + cmdCode.insert(sync1, "Синхронизация"); + cmdCode.insert(transSW, "Передать ОС"); + cmdCode.insert(initST, "Начать самоконтроль ОУ"); + cmdCode.insert(transS, "Блокировать передатчик"); + cmdCode.insert(overrTS, "Разблокировать передатчик"); + cmdCode.insert(inhTFB, "Блок-ть признак неиспр-ти ОУ"); + cmdCode.insert(overrITF, "Разблок-ть признак неиспр-ти ОУ"); + cmdCode.insert(resetRT, "Уст-ть ОУ в исх-е состояние"); + cmdCode.insert(transVW, "Передать вект-ое слово"); + cmdCode.insert(sync2, "Синхронизация (с СД)"); + cmdCode.insert(transLC, "Передать послед-ю команду"); + cmdCode.insert(transBW, "Передать слово ВСК ОУ"); + cmdCode.insert(selectedSW, "Блок-ть i-й передатчик"); + cmdCode.insert(overrSTS, "Разблок-ть i-й передатчик"); + + for(uint8_t i = 0b01001; i < 0b10000; i++) + cmdCode.insert(i, "Резерв"); + + for(uint8_t i = 0b10110; i < 0b11111; i++) + cmdCode.insert(i, "Резерв"); +} + +uint8_t CommandWord::addrRTFind(uint16_t cmdw) +{ + CW.all = cmdw; + return CW.addrRT; +} + +uint8_t CommandWord::KFind(uint16_t cmdw) +{ + CW.all = cmdw; + return CW.K; +} + +uint8_t CommandWord::subAddrFind(uint16_t cmdw) +{ + CW.all = cmdw; + return CW.subAddr; +} + +uint8_t CommandWord::numDWFind(uint16_t cmdw) +{ + CW.all = cmdw; + return CW.numDW; +} + +void CommandWord::description(QString CmdW) +{ + uint16_t cmdw; + bool result; + + if(HexBinFlag) + cmdw = CmdW.toInt(&result, 16); + else + cmdw = CmdW.toInt(&result, 2); + + if(result == false) + QMessageBox::warning(0, "Ошибка", "Недопустимое значение КС"); + else if((HexBinFlag == 0) && (CmdW.length() != 16)) + QMessageBox::warning(0, "Ошибка", "Недопустимое значение КС"); + else if((HexBinFlag == 1) && (CmdW.length() != 4)) + QMessageBox::warning(0, "Ошибка", "Недопустимое значение КС"); + else + { + addrRTf = addrRTFind(cmdw); + Kf = KFind(cmdw); + subAddrf = subAddrFind(cmdw); + numDWf = numDWFind(cmdw); + } +} + +CommandWord::~CommandWord() +{ +} diff --git a/cmdwrd.h b/cmdwrd.h new file mode 100644 index 0000000..05c0df0 --- /dev/null +++ b/cmdwrd.h @@ -0,0 +1,45 @@ +#ifndef CMDWRD_H +#define CMDWRD_H + +#include "declarations.h" + +class CommandWord:public QObject +{ + Q_OBJECT +public: + + typedef union { + uint16_t all; + struct { + unsigned numDW: 5; // DW - data word + unsigned subAddr: 5; + unsigned K: 1; // translate/receive flag + unsigned addrRT: 5; // RT - remote terminal + }; + } CW_t; + + CW_t CW; + + uint8_t addrRTf; + uint8_t Kf; + uint8_t subAddrf; + uint8_t numDWf; + + QHash cmdCode; + + //01001 - 01111 reserved, 10110 - 11111 reserved + enum codeName {dynBC, sync1, transSW, initST, transS, + overrTS, inhTFB, overrITF, resetRT, transVW = 0b10000, + sync2, transLC, transBW, selectedSW, overrSTS}; + + void description(QString CmdW); + uint8_t addrRTFind(uint16_t cmdw); + uint8_t KFind(uint16_t cmdw); + uint8_t subAddrFind(uint16_t cmdw); + uint8_t numDWFind(uint16_t cmdw); + + CommandWord(); + ~CommandWord(); +}; + +#endif // CMDWRD_H diff --git a/declarations.h b/declarations.h new file mode 100644 index 0000000..68fe40a --- /dev/null +++ b/declarations.h @@ -0,0 +1,22 @@ +#ifndef DECLARATIONS_H +#define DECLARATIONS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // DECLARATIONS_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..5030ce3 --- /dev/null +++ b/main.cpp @@ -0,0 +1,14 @@ +#include "mainwindow.h" +//#include "testinfo.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + //QTest::qExec(new testInfo, argc, argv); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..40c9ddc --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,325 @@ +#include "mainwindow.h" +//#include "windows.h" +//#include "WDMTMKv2.cpp" +#include "bcmil.cpp" + +TTmkEventData tmkEvD; +extern HANDLE hBcEvent; + +//#define RT_ADDR 10 + +//const int fInstMode = 1; + +unsigned short awBuf[32]; + +TMK_DATA wBase, wMaxBase, wLen; +extern TMK_DATA wSubAddr, wState; + +unsigned char HexBinFlag = 1; //1 - hex, 0 - bin + +MainWindow::MainWindow() +{ + init_mainwindowobj(); + init_table(); + init_connections(); +} + +void MainWindow::init_mainwindowobj() +{ + qDebug() << "Startyem"; + + Window_1 = new QWidget; + Window_2 = new QWidget; + + HexBinButton = new QPushButton("Hex/Bin"); + HexBinLabel = new QLabel("Hex"); + + CmdWordLabel = new QLabel("Enter the command word:"); + CmdWordLineEdit = new QLineEdit; + EnterCmdWordButton = new QPushButton("Start"); + DataTable = new QTableWidget; + + QGridLayout *layout_g = new QGridLayout(Window_2); + layout_g->addWidget(HexBinButton, 0, 1); + layout_g->addWidget(HexBinLabel, 0, 0); + layout_g->addWidget(CmdWordLabel, 1, 0); // Row 0, Column 0 + layout_g->addWidget(CmdWordLineEdit, 2, 0); + layout_g->addWidget(EnterCmdWordButton, 3, 0); + + Window_2->setLayout(layout_g); + setCentralWidget(Window_2); + + QVBoxLayout *layout = new QVBoxLayout(Window_1); + layout->addWidget(Window_2); + layout->addWidget(DataTable); + + Window_1->setLayout(layout); + setCentralWidget(Window_1); +} + +void MainWindow::init_connections() +{ + /*connect(EnterCmdWordButton, + SIGNAL(clicked()), + this, + SLOT(getlineedit()));*/ + /*connect(EnterCmdWordButton, + SIGNAL(clicked()), + this, + SLOT(sendcmdwrd()));*/ + connect(EnterCmdWordButton, + SIGNAL(clicked()), + this, + SLOT(rthandler())); + connect(HexBinButton, + SIGNAL(clicked()), + this, + SLOT(HexBinChange())); +} + +QString intToBinaryString(int number) +{ + return QString::number(number,2); +} + +QString intToDecString(int number) +{ + return QString::number(number,10); +} + +/*void MainWindow::getlineedit() +{ + qDebug() << "Entered the button command word"; + QString CmdW = CmdWordLineEdit->text(); + qDebug() << CmdW; + + QScopedPointer NewCmdWord(new CommandWord()); + NewCmdWord->description(CmdW); + + set_item(DataTable, 0, 0, "Адрес устройства", false); + set_item(DataTable, 0, 1, intToBinaryString(NewCmdWord->addrRTf), false); + set_item(DataTable, 0, 2, intToDecString(NewCmdWord->addrRTf), false); + + if(NewCmdWord->Kf) + { + set_item(DataTable, 1, 0, "Передача", false); + set_item(DataTable, 1, 1, intToBinaryString(NewCmdWord->Kf), false); + set_item(DataTable, 1, 2, intToDecString(NewCmdWord->Kf), false); + } + else + { + set_item(DataTable, 1, 0, "Прием", false); + set_item(DataTable, 1, 1, intToBinaryString(NewCmdWord->Kf), false); + set_item(DataTable, 1, 2, intToDecString(NewCmdWord->Kf), false); + } + + if((NewCmdWord->subAddrf == 0) || (NewCmdWord->subAddrf == 31)) + { + set_item(DataTable, 2, 0, "Режим управления", false); + set_item(DataTable, 2, 1, intToBinaryString(NewCmdWord->subAddrf), false); + set_item(DataTable, 2, 2, intToDecString(NewCmdWord->subAddrf), false); + } + else + { + set_item(DataTable, 2, 0, "Подадрес", false); + set_item(DataTable, 2, 1, intToBinaryString(NewCmdWord->subAddrf), false); + set_item(DataTable, 2, 2, intToDecString(NewCmdWord->subAddrf), false); + } + + if((NewCmdWord->subAddrf == 0) || (NewCmdWord->subAddrf == 31)) + { + set_item(DataTable, 3, 0, NewCmdWord->cmdCode.value(NewCmdWord->numDWf), false); + set_item(DataTable, 3, 1, intToBinaryString(NewCmdWord->numDWf), false); + set_item(DataTable, 3, 2, intToDecString(NewCmdWord->numDWf), false); + } + else + { + if(NewCmdWord->numDWf == 0) + { + set_item(DataTable, 3, 0, "Число СД", false); + set_item(DataTable, 3, 1, intToBinaryString(32), false); + set_item(DataTable, 3, 2, intToDecString(32), false); + } + else + { + set_item(DataTable, 3, 0, "Число СД", false); + set_item(DataTable, 3, 1, intToBinaryString(NewCmdWord->numDWf), false); + set_item(DataTable, 3, 2, intToDecString(NewCmdWord->numDWf), false); + } + } +}*/ + +void MainWindow::HexBinChange() +{ + switch(HexBinFlag) + { + case 0: //было bin + HexBinLabel->setText("Hex"); + HexBinFlag = 1; + break; + + case 1: //было hex + HexBinLabel->setText("Bin"); + HexBinFlag = 0; + break; + } +} + +void MainWindow::init_table() +{ + int ColCount = 3; + int RowCount = 4; + QStringList header; + header << "Биты КС" << "Бинарное представление" << "Десятичное представление"; + + DataTable->setColumnCount(ColCount); + DataTable->setRowCount(RowCount); + DataTable->setHorizontalHeaderLabels(header); + DataTable->verticalHeader()->setVisible(true); + + DataTable->setColumnWidth(0,200); + DataTable->setColumnWidth(1,160); + DataTable->setColumnWidth(2,160); + + for(int i = 0; i < RowCount; i++) + { + DataTable->setRowHeight(i,20); + for(int j = 0; j < ColCount; j++) + set_item(DataTable, i, j, "%", false); + } +} + + + +void MainWindow::set_item(QTableWidget *pTable, int indRow, + int indCol, QString data, bool editFlag) +{ + QColor color; + color.black(); + QTableWidgetItem *itm = + new QTableWidgetItem(data); + pTable->setItem(indRow,indCol,itm); + + if (editFlag) {} + else + { + pTable->item(indRow, indCol)->setFlags(Qt::ItemIsSelectable| + Qt::ItemIsDragEnabled| + Qt::ItemIsUserCheckable); + } + pTable->item(indRow, indCol)->setTextColor(color); +} + +/*void MainWindow::sendcmdwrd() +{ + qDebug() << "send1"; + QScopedPointer NewBC(new BC_MIL(0)); + qDebug() << "send2"; + wBase = 0; + wMaxBase = bcgetmaxbase(); + srand(1); + + //Select base + if (wBase > wMaxBase) + wBase = 0; + bcdefbase(wBase); + qDebug() << "send3"; + + //Prepare data to RT + //wSubAddr = rand() & 0x1F; + wSubAddr = 0x1F;; + //if (fInstMode) + // wSubAddr |= 0x10; + //wLen = rand() & 0x1F; + wLen = 0x1; + if (wLen == 0) + wLen = 32; + for (int i = 0; i < wLen; ++i) + awBuf[i] = (wSubAddr<<8) | i; + qDebug() << "send4"; + + //Try to send data to RT until it answers with Clear Status + bcputw(0, CW(RT_ADDR, RT_RECEIVE, wSubAddr, wLen)); + bcputblk(1, awBuf, wLen); + do + { + //bcstartx(wBase, DATA_BC_RT | CX_STOP | CX_BUS_A | CX_NOSIG); + bcstartx(wBase, DATA_BC_RT | CX_STOP | CX_BUS_B | CX_NOSIG); + if (NewBC->WaitInt(DATA_BC_RT)) + NewBC->closeAll(); + } while ((tmkEvD.bcx.wResultX & (SX_ERR_MASK | SX_IB_MASK)) != 0); + qDebug() << "send5"; + NewBC->closeAll(); +}*/ + +void MainWindow::rthandler() +{ + qDebug() << "rt1"; + QScopedPointer NewRT(new RT_MIL(0, 1)); + qDebug() << "rt2"; + + int i = 0; + while (i != 1000) + { + i++; + if (tmkselect(0)) + { + qDebug() << "tmk select error"; + NewRT->closeAllrt(); + } + //Wait for an interrupt + switch (WaitForSingleObject(hBcEvent, 1000)) + { + case WAIT_OBJECT_0: + qDebug() << "Interrupt"; + //New message has arrived + ResetEvent(hBcEvent); + do + { + //Get interrupt data + tmkgetevd(&tmkEvD); + //Check interrupt type + if (tmkEvD.nInt == 3) + { + wSubAddr = (tmkEvD.rt.wStatus >> 5) &0x1F; + wLen = tmkEvD.rt.wStatus & 0x1F; + if (wLen == 0) + wLen = 32; + if ((tmkEvD.rt.wStatus & RT_DIR_MASK) == RT_RECEIVE) + { + //If we received some data then copy the data from Rx subaddres to + //Tx subaddress and process flags + if ((rtgetflag(RT_RECEIVE, wSubAddr) & RT_FLAG_MASK) == 0) + { + //qDebug() << "Flag read error"; + NewRT->closeAllrt(); + } + rtdefsubaddr(RT_RECEIVE, wSubAddr); + rtgetblk(0, awBuf, wLen); + rtclrflag(); + rtdefsubaddr(RT_TRANSMIT, wSubAddr); + rtputblk(0, awBuf, wLen); + rtsetflag(); + } + } + } while (tmkEvD.nInt != 0); //Loop while we have not processed all interrupts + + break; + + case WAIT_TIMEOUT: + // No new messages + qDebug() << "No new messages"; + break; + + default: + qDebug() << "Interrupt wait error"; + NewRT->closeAllrt(); + break; + } + } + NewRT->closeAllrt(); +} + +MainWindow::~MainWindow() +{ +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..54c3a65 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,55 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include "declarations.h" + +class MainWindow:public QMainWindow +{ + Q_OBJECT +public: + void init_mainwindowobj(); //the function of this class + void init_connections(); + explicit MainWindow(); //constructor + ~MainWindow(); //destructor + +private: + void init_table(); + void set_item(QTableWidget *pTable, int indRow, + int indCol, QString data, bool editFlag); + +public slots: + //void getlineedit(); + //void sendcmdwrd(); + void rthandler(); + void HexBinChange(); + +private: + QWidget *Window_1 = new QWidget; + QWidget *Window_2 = new QWidget; + + QLabel *HexBinLabel; + QPushButton *HexBinButton; + + QLabel *CmdWordLabel; + QLineEdit *CmdWordLineEdit; + QPushButton *EnterCmdWordButton; + QTableWidget *DataTable; + +protected: + + void keyPressEvent(QKeyEvent *event) override + { + if (loopActive) + { + loopActive = false; + qDebug() << "Key pressed! Stopping loop."; + } + QWidget::keyPressEvent(event); + } + +public: + + bool loopActive = true; +}; + +#endif // MAINWINDOW_H diff --git a/testinfo.cpp b/testinfo.cpp new file mode 100644 index 0000000..339e08f --- /dev/null +++ b/testinfo.cpp @@ -0,0 +1,310 @@ +/*#include +#include "testinfo.h" +#include +#include "declarations.h" +#include + +HANDLE hEvent; +TTmkEventData tmkEvD; + +void testInfo::init() +{ + if (isFailed) + { + qDebug() << "Skip"; + QSKIP(""); + } +} + +void testInfo::cleanup() +{ + bool a = QTest::currentTestFailed(); + if (a) + isFailed = a; +} + +void testInfo::cleanupTestCase() +{ + qDebug() << "TmkClose()"; + TmkClose(); + if (hEvent) + CloseHandle(hEvent); +} + +void testInfo::testcreateevent() +{ + hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + QVERIFY(hEvent); +} + +void testInfo::testTmkOpen() +{ + DWORD a; + + a = TmkOpen(); + QCOMPARE(a, DWORD(0)); +} + +void testInfo::testtmkgetmaxn() +{ + QCOMPARE(tmkgetmaxn(), (int)(0)); +} + +void testInfo::testmrtgetmaxn() +{ + QCOMPARE(mrtgetmaxn(), (int)(0)); +} + +void testInfo::testtmkconfig() +{ + int hTmk = 0; + + QCOMPARE(tmkconfig(hTmk), (int)(0)); +} + +void testInfo::testtmkselect() +{ + int hTmk = 0; + + QCOMPARE(tmkselect(hTmk), (int)(0)); +} + +void testInfo::testtmkgetinfo() +{ + TTmkConfigData tmkCfg; + int hTmk = 0; + + tmkgetinfo(&tmkCfg); + QCOMPARE(hTmk, (int)(0)); //Device Number + QCOMPARE(tmkCfg.nType, (short)(9)); //Device Type + QCOMPARE(tmkCfg.szName, "TA1USB"); //Device Name + QCOMPARE(tmkCfg.wPorts1, (unsigned short)(0)); //Device I/O Ports + + if (tmkCfg.wPorts2 == (unsigned short)(0xFFFF)) //Device I/O Ports + ; + else + QCOMPARE(tmkCfg.wPorts2, (unsigned short)(0)); + + if (tmkCfg.wIrq2 == (unsigned short)(0xFF)) + QCOMPARE(tmkCfg.wIrq1, (unsigned short)(0)); //Device Interrupt + else + { + QCOMPARE(tmkCfg.wIrq1, (unsigned short)(0)); //Device Interrupts + QCOMPARE(tmkCfg.wIrq2, (unsigned short)(0)); + } + + QCOMPARE(tmkCfg.wIODelay, (unsigned short)(0)); //Device I/O Delay +} + +void testInfo::testtmkgethwver() +{ + QCOMPARE(tmkgethwver(), (unsigned short)(11)); +} + +void testInfo::testbcreset() +{ + QCOMPARE(bcreset(), (int)(0)); +} + +void testInfo::testbcgetmaxbase() +{ + QCOMPARE(bcgetmaxbase(), (unsigned short)(1023)); +} + +void testInfo::testbcputgetw() +{ + int fError; + unsigned short wBase, wAddr; + unsigned short wMaxBase = bcgetmaxbase(); + + for (wBase = 0; wBase <= wMaxBase; ++wBase) + { + bcdefbase(wBase); + for (wAddr = 0; wAddr <= 63; ++wAddr) + { + bcputw(wAddr, wAddr|(wBase<<6)); + } + } + + fError = 0; + for (wBase = 0; wBase <= wMaxBase; ++wBase) + { + bcdefbase(wBase); + for (wAddr = 0; wAddr <= 63; ++wAddr) + { + if (bcgetw(wAddr) != (unsigned short)(wAddr|(wBase<<6))) + fError = 1; + } + } + + QCOMPARE(fError, (int)(0)); +} + +void testInfo::testbcputgetblk() +{ + int fError; + unsigned short awBuf[64]; + unsigned short wBase, wAddr; + unsigned short wMaxBase = bcgetmaxbase(); + + for (wBase = 0; wBase <= wMaxBase; ++wBase) + { + bcdefbase(wBase); + for (wAddr = 0; wAddr <= 63; ++wAddr) + { + awBuf[63-wAddr] = wBase+(wAddr<<8); + } + bcputblk(0, awBuf, 64); + } + + fError = 0; + for (wBase = 0; wBase <= wMaxBase; ++wBase) + { + bcdefbase(wBase); + bcgetblk(0, awBuf, 64); + for (wAddr = 0; wAddr <= 63; ++wAddr) + { + if (awBuf[63-wAddr] != (wBase+(wAddr<<8))) + fError = 1; + } + } + + QCOMPARE(fError, (int)(0)); +} + +void testInfo::testrtreset() +{ + QCOMPARE(rtreset(), (int)(0)); +} + +void testInfo::testrtgetmaxpage() +{ + QCOMPARE(rtgetmaxpage(), (unsigned short)(0)); +} + +void testInfo::testrtputgetw() +{ + int fError; + unsigned short wPage, wAddr, wSubAddr; + unsigned short wMaxPage = rtgetmaxpage(); + + for (wPage = 0; wPage <= wMaxPage; ++wPage) + { + rtdefpage(wPage); + for (wSubAddr = 0; wSubAddr <= 0x1F; ++wSubAddr) + { + rtdefsubaddr(RT_RECEIVE, wSubAddr); + for (wAddr = 0; wAddr <= 31; ++wAddr) + rtputw(wAddr, wAddr|(wSubAddr<<8)|(wPage<<13)); + rtdefsubaddr(RT_TRANSMIT, wSubAddr); + for (wAddr = 0; wAddr <= 31; ++wAddr) + rtputw(wAddr, (wAddr+32)|(wSubAddr<<8)|(wPage<<13)); + } + } + + fError = 0; + for (wPage = 0; wPage <= wMaxPage; ++wPage) + { + rtdefpage(wPage); + for (wSubAddr = 0; wSubAddr <= 0x1F; ++wSubAddr) + { + rtdefsubaddr(RT_RECEIVE, wSubAddr); + for (wAddr = 0; wAddr <= 31; ++wAddr) + { + if (rtgetw(wAddr) != (wAddr|(wSubAddr<<8)|(wPage<<13))) + fError = 1; + } + rtdefsubaddr(RT_TRANSMIT, wSubAddr); + for (wAddr = 0; wAddr <= 31; ++wAddr) + { + if (rtgetw(wAddr) != ((wAddr+32)|(wSubAddr<<8)|(wPage<<13))) + fError = 1; + } + } + } + + QCOMPARE(fError, (int)(0)); +} + +void testInfo::testrtputgetblk() +{ + int fError; + unsigned short awBuf[64]; + unsigned short wPage, wAddr, wSubAddr; + unsigned short wMaxPage = rtgetmaxpage(); + + for (wPage = 0; wPage <= wMaxPage; ++wPage) + { + rtdefpage(wPage); + for (wSubAddr = 0; wSubAddr <= 0x1F; ++wSubAddr) + { + rtdefsubaddr(RT_RECEIVE, wSubAddr); + for (wAddr = 0; wAddr <= 31; ++wAddr) + awBuf[31-wAddr] = wSubAddr|(wAddr<<8)|(wPage<<13); + rtputblk(0, awBuf, 32); + rtdefsubaddr(RT_TRANSMIT, wSubAddr); + for (wAddr = 0; wAddr <= 31; ++wAddr) + awBuf[31-wAddr] = (wSubAddr+32)|(wAddr<<8)|(wPage<<13); + rtputblk(0, awBuf, 32); + } + } + + fError = 0; + for (wPage = 0; wPage <= wMaxPage; ++wPage) + { + rtdefpage(wPage); + for (wSubAddr = 0; wSubAddr <= 0x1F; ++wSubAddr) + { + rtdefsubaddr(RT_RECEIVE, wSubAddr); + rtgetblk(0, awBuf, 32); + for (wAddr = 0; wAddr <= 31; ++wAddr) + { + if (awBuf[31-wAddr] != (wSubAddr|(wAddr<<8)|(wPage<<13))) + fError = 1; + } + rtdefsubaddr(RT_TRANSMIT, wSubAddr); + rtgetblk(0, awBuf, 32); + for (wAddr = 0; wAddr <= 31; ++wAddr) + { + if (awBuf[31-wAddr] != ((wSubAddr+32)|(wAddr<<8)|(wPage<<13))) + fError = 1; + } + } + } + + QCOMPARE(fError, (int)(0)); +} + +void testInfo::testgetInt() +{ + bcreset(); + tmkdefevent(hEvent, TRUE); + tmkgetevd(&tmkEvD); + QCOMPARE(tmkEvD.nInt, (int)(0)); + bcdefbase(0); + bcputw(0, 0xFFE1); + bcstart(0, CTRL_C_BRCST); + + switch (WaitForSingleObject(hEvent, 1000)) + { + case WAIT_OBJECT_0: + ResetEvent(hEvent); + qDebug() << "We got interrupt!"; + break; + + case WAIT_TIMEOUT: + qDebug() << "We didn't get interrupt!"; + break; + + default: + qDebug() << "Somebody abandon our interrupt waiting!"; + break; + } + + tmkgetevd(&tmkEvD); + QCOMPARE(tmkEvD.nInt, (int)(1)); + + tmkdefevent(0,TRUE); +} +*/ + diff --git a/testinfo.h b/testinfo.h new file mode 100644 index 0000000..93a9fb7 --- /dev/null +++ b/testinfo.h @@ -0,0 +1,49 @@ +/*#ifndef TESTINFO_H +#define TESTINFO_H + +#include +#include + +class testInfo:public QObject +{ + Q_OBJECT + +private slots: + + void testcreateevent(); + + void testTmkOpen(); + void testtmkgetmaxn(); + void testmrtgetmaxn(); + void testtmkconfig(); + void testtmkselect(); + void testtmkgetinfo(); + void testtmkgethwver(); + + //Now we'll test onboard RAM in Bus Controller mode + void testbcreset(); + void testbcgetmaxbase(); + void testbcputgetw(); + void testbcputgetblk(); + + //Now we'll test onboard RAM in Remote Terminal mode + void testrtreset(); + void testrtgetmaxpage(); + void testrtputgetw(); + void testrtputgetblk(); + + + //Now we'll test interrupt in Bus Controller mode + void testgetInt(); + + void init(); + void cleanup(); + void cleanupTestCase(); + +protected: + + bool isFailed = false; +}; + +#endif // TESTINFO_H +*/