From 80f639474bb68a5d9b196aa4cf8feca3c04ad669 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Sat, 15 Oct 2011 14:54:34 +0000 Subject: [PATCH] Diverse Wiimotegerelateerde aanpassingen. Projectinstellingen Wiiuse en Wiiusej nogmaals aangepast. Getracht Wiiscan te compileren, maar dit geeft vooralsnog problemen. De bedoeling is om bij de -c -d en -a argumenten ook waarden met spaties (op een of andere manier) te accepteren. Dit zou het mogelijk maken om behalve wiimotes ook het balance board te pairen. Voorlopig opgelost door een handmatige aanpassing in wiiscan.exe, opgeslagen als wiiscan-bb.exe. --- cpp/wiiscan/.cproject | 152 ++ cpp/wiiscan/.project | 71 + .../org.eclipse.cdt.managedbuilder.core.prefs | 14 + cpp/wiiscan/_Lib/Debug/WiimoteLib.dll | Bin 28672 -> 0 bytes cpp/wiiscan/_Lib/Debug/WiimoteWhiteboard.exe | Bin 24576 -> 0 bytes cpp/wiiscan/_Lib/Debug/wiimotelibpoll.exe | Bin 8192 -> 0 bytes cpp/wiiscan/_Lib/DelcomDLL.dll | Bin 90112 -> 0 bytes cpp/wiiscan/_Lib/DelcomDLL.lib | Bin 24654 -> 0 bytes cpp/wiiscan/_Lib/Release/WiimoteLib.dll | Bin 27648 -> 0 bytes .../_Lib/Release/WiimoteWhiteboard.exe | Bin 23552 -> 0 bytes cpp/wiiscan/_Lib/Release/wiimotelibpoll.exe | Bin 7680 -> 0 bytes cpp/wiiscan/_Lib/USBm.dll | Bin 60928 -> 0 bytes cpp/wiiscan/_Lib/wiiuse.dll | Bin 114688 -> 0 bytes cpp/wiiscan/_Lib/wiiuse.lib | Bin 8210 -> 0 bytes cpp/wiiscan/include/BluetoothAPIs.h | 1540 +++++++++++++++++ cpp/wiiscan/include/DelcomDLL.h | 5 +- cpp/wiiscan/include/bthdef.h | 858 +++++++++ cpp/wiiscan/include/bthsdpdef.h | 111 ++ cpp/wiiscan/include/wiiuse.h | 59 +- cpp/wiiscan/lib/irprops.lib | Bin 0 -> 16192 bytes cpp/wiiscan/msvc/wiiscan.sln | 20 - cpp/wiiscan/msvc/wiiscan.vcxproj | 120 -- cpp/wiiscan/msvc/wiiscan.vcxproj.user | 3 - cpp/wiiscan/{ => src}/args.h | 0 cpp/wiiscan/{ => src}/configfile.h | 2 +- cpp/wiiscan/{ => src}/exception.h | 0 cpp/wiiscan/{ => src}/file.h | 0 cpp/wiiscan/{ => src}/funs.h | 16 +- cpp/wiiscan/{ => src}/process.h | 0 cpp/wiiscan/{ => src}/reg.h | 0 cpp/wiiscan/{ => src}/stringfun.h | 0 cpp/wiiscan/{ => src}/templatefun.h | 6 +- cpp/wiiscan/{ => src}/toolsfun.h | 0 cpp/wiiscan/{ => src}/usbm.h | 0 cpp/wiiscan/{ => src}/wiiscan.cpp | 0 cpp/wiiscan/{ => src}/wiiscan.h | 29 +- cpp/wiiscan/{ => src}/wiiscan.test.h | 0 cpp/wiiuse/Debug/copy.bat | 4 +- cpp/wiiuse/Release/copy.bat | 4 +- cpp/wiiuse/src/balance_board.c | 140 ++ cpp/wiiuse/src/balance_board.h | 53 + cpp/wiiuse/src/events.c | 26 + cpp/wiiuse/src/ir.c | 7 +- cpp/wiiuse/src/wiiuse.h | 35 +- cpp/wiiuse/src/wiiuse_internal.h | 1 + cpp/wiiusej/.cproject | 9 +- cpp/wiiusej/.project | 2 +- cpp/wiiusej/Release/libwiiusej.dll | Bin 62016 -> 62016 bytes cpp/wiiusej/{src => include}/wiiuse.h | 35 +- cpp/wiiusej/lib/wiiuse.lib | Bin 27590 -> 27590 bytes .../mimis/device/wiimote/WiimoteDevice.java | 121 +- .../device/wiimote/WiimoteDiscovery.java | 38 +- .../mimis/device/wiimote/WiimoteService.java | 10 +- java/wiiscan-bb.exe | Bin 0 -> 281088 bytes java/wiiuse.dll | Bin 78860 -> 4533168 bytes java/wiiusej.dll | Bin 62016 -> 20480 bytes 56 files changed, 3229 insertions(+), 262 deletions(-) create mode 100644 cpp/wiiscan/.cproject create mode 100644 cpp/wiiscan/.project create mode 100644 cpp/wiiscan/.settings/org.eclipse.cdt.managedbuilder.core.prefs delete mode 100644 cpp/wiiscan/_Lib/Debug/WiimoteLib.dll delete mode 100644 cpp/wiiscan/_Lib/Debug/WiimoteWhiteboard.exe delete mode 100644 cpp/wiiscan/_Lib/Debug/wiimotelibpoll.exe delete mode 100644 cpp/wiiscan/_Lib/DelcomDLL.dll delete mode 100644 cpp/wiiscan/_Lib/DelcomDLL.lib delete mode 100644 cpp/wiiscan/_Lib/Release/WiimoteLib.dll delete mode 100644 cpp/wiiscan/_Lib/Release/WiimoteWhiteboard.exe delete mode 100644 cpp/wiiscan/_Lib/Release/wiimotelibpoll.exe delete mode 100644 cpp/wiiscan/_Lib/USBm.dll delete mode 100644 cpp/wiiscan/_Lib/wiiuse.dll delete mode 100644 cpp/wiiscan/_Lib/wiiuse.lib create mode 100644 cpp/wiiscan/include/BluetoothAPIs.h create mode 100644 cpp/wiiscan/include/bthdef.h create mode 100644 cpp/wiiscan/include/bthsdpdef.h create mode 100644 cpp/wiiscan/lib/irprops.lib delete mode 100644 cpp/wiiscan/msvc/wiiscan.sln delete mode 100644 cpp/wiiscan/msvc/wiiscan.vcxproj delete mode 100644 cpp/wiiscan/msvc/wiiscan.vcxproj.user rename cpp/wiiscan/{ => src}/args.h (100%) rename cpp/wiiscan/{ => src}/configfile.h (96%) rename cpp/wiiscan/{ => src}/exception.h (100%) rename cpp/wiiscan/{ => src}/file.h (100%) rename cpp/wiiscan/{ => src}/funs.h (94%) rename cpp/wiiscan/{ => src}/process.h (100%) rename cpp/wiiscan/{ => src}/reg.h (100%) rename cpp/wiiscan/{ => src}/stringfun.h (100%) rename cpp/wiiscan/{ => src}/templatefun.h (94%) rename cpp/wiiscan/{ => src}/toolsfun.h (100%) rename cpp/wiiscan/{ => src}/usbm.h (100%) rename cpp/wiiscan/{ => src}/wiiscan.cpp (100%) rename cpp/wiiscan/{ => src}/wiiscan.h (95%) rename cpp/wiiscan/{ => src}/wiiscan.test.h (100%) create mode 100644 cpp/wiiuse/src/balance_board.c create mode 100644 cpp/wiiuse/src/balance_board.h rename cpp/wiiusej/{src => include}/wiiuse.h (92%) create mode 100644 java/wiiscan-bb.exe diff --git a/cpp/wiiscan/.cproject b/cpp/wiiscan/.cproject new file mode 100644 index 0000000..17050d9 --- /dev/null +++ b/cpp/wiiscan/.cproject @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cpp/wiiscan/.project b/cpp/wiiscan/.project new file mode 100644 index 0000000..1368c5c --- /dev/null +++ b/cpp/wiiscan/.project @@ -0,0 +1,71 @@ + + + Wiiscan + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/Wiiscan/Release} + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/cpp/wiiscan/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/cpp/wiiscan/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..14ad3ce --- /dev/null +++ b/cpp/wiiscan/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,14 @@ +#Sat Oct 15 11:50:13 CEST 2011 +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPLUS_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1147005981/appendContributed=true diff --git a/cpp/wiiscan/_Lib/Debug/WiimoteLib.dll b/cpp/wiiscan/_Lib/Debug/WiimoteLib.dll deleted file mode 100644 index da8e126c6aa9630c0830d0817789115b45ebbd64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 diff --git a/cpp/wiiscan/_Lib/Debug/WiimoteWhiteboard.exe b/cpp/wiiscan/_Lib/Debug/WiimoteWhiteboard.exe deleted file mode 100644 index 28f2c9fd2930908413e1236099d24acce6582c7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 Nb7=WRlmDY0_+R_m=W_r6 diff --git a/cpp/wiiscan/_Lib/DelcomDLL.dll b/cpp/wiiscan/_Lib/DelcomDLL.dll deleted file mode 100644 index ecfa470c3c66e19ef056dd7553d648e0605a1342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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 diff --git a/cpp/wiiscan/_Lib/Release/WiimoteLib.dll b/cpp/wiiscan/_Lib/Release/WiimoteLib.dll deleted file mode 100644 index 4408358ed45b5095be1ca9956247f8d829c40ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 zcmeHw3wT`Bb?!Rn%p8qIvaA_B{nYpYk!4wtZ2>kIELoCm1=$jk@Dn1BMn}@%(TtcG z*%tDE1dj7E0i`a1)M@NMQXoK+l=5mCP#Y+OkQPWuNrB=L`rUAQ6H2)afb8`}!hJ7s^-M-;Szg0JHo_nQjy0ew2 zT{Gy3tv_o^mi9X7%L+6XQ6D(C@n`1*z=!KJF80oco38vuO8ny0~>D4!Y+6z=wY}k|0F?N48VM6uKdy{VBLY$vwL%dnvaj?6F1B?Iu8dD3(UuHSlJygc z!@lX{q#vR^?%qhGDfYh`cj?t$BDZcNV8Nj~67a)Ob8(7`zLrTM;*Of7N}9U&>H4@6 z0;9SFrsAlvo?yBrEhwESfLby~9_L_Mawvi1$QFP~=0Gpg6HH4EC6F9x!6$Uz5+6|l z5q9X+WpJPd(J85S(mvc#TMsHN!pe%pv2w^0`B1&S0x2U_33Th@%rPSiK&bS>$ih@w zKWCng_Kht9r!<1j=00DqNEEPBOZ9QNFW1Wz;}`lkJ6Y>dcRdD^W&|FaO0#x>vOkN> z8d?OOkHTj(jR&D-pNz;-l$UTL2@c+qNbBG3kEL=&&9mvH}+4C{uTr7ntKxcw{Ab1$h;FZf-#CLJo#Ig7$RJ%eVc? zbCpLBRJ5w}?pm+9>#i8Oh#5iGF*9TTT1zs-2XjKay2O!D6_4Y$*2RwV&`>(gLzA>x z#o0+6sF(BwY4|l-jp_jr#M)iEK@mn|6}$fLXqy_FkLjd{4ECzzJ;s01<|vjyAIInYt`1k;j32_#2aVALDb%#DhVUY2NsvR+lL zTxw?`){8bs?Bry5tQPf6AT+k8*KbF1jXSmm>+7IZ<*mleoac3%EAya4ufyXw!HMdRvuX5r$A)%f&-Xe+zufDTdv!f>o$oczm0>2; znQ|{(@AjHY6Bi=OYM0ksBq`+cnjU8|7h2QY_>WvQuQ`q|I~FVua|?XnH7d*Np_BLo zWZt}UWtd!bZ=NUb1SgbF8z9ohSs?;*Zf{;SqF`?P8Z3D8#<46oeAlD4>#qfMF;ga@ zyFQ?s)m_kAQ&mx*n-W)vmOjoQK5-eEJc8Py<15<>s>&;3aK)Xt9CE$-QsmXE5mWQE zVxICkg)1~1+X4RSO}1AUTkh56(Ld+8MGRM808R{nabIUv>~ZHyJ-xc=b#RT$i@$pA z!w>VTQM!44-kO4Fl|~~<8#9L*PXz$GM8ezml&0f|PsCxt<0*gb$ED04m z1#?&n@(9)9B^q-U=ZYX??%MP0PG*}j%d5&UlOZf>CNm=lrTcvDPYyzDCBHq#pnEK` zvl)>~SPik>43*j{HC}2f)E%Maej9T`7QrAvKsl_h8Rx%7?3=1_TtEzr)s|y5LoX~IS0WdMk5j>|oHa&*>hI=5;jp{8Z zaKl&AX|OQd%nc`Iupnt+2`?dbMjiJi@D^6LvSd$&M43q{ELI8^%~ViElX_LfO0g(I zQDS5)o=OZNRw`mghmkZEOjQ;4mY>t`Um`qH=1a;VGi8lQ*~ko;ZvxRtimz4WRN6E; z4>#C&5Rg|FQdC|-$l9XhplC!aRu?K^dEy!=f#y6*GA zDKsd1CA|b=LMqGo3i70Q)p=Xd+W3!Zl)}-2P&oQohA05W6VKy5yRc#^@xq+K%BjSQ za|#zuC4M}oaM4uaZ|4-EFTOO3&|Er|7@dt@l|Pk;%_?wDCE~LR3Z@cAW)&1pB@WFh zm^YO;3_&u6A*7F<1|WQuffo|v=}c)+g@`a6B!in4Rf_1k*+dIObp33ig(AW}b*8~Z zB1+6AT0FG?9!}0CS|XwwW)m$H(Zp;b1e`4%n^oo(*^RTx3Pg6(EVA;%r)J?+RV9wk z!Y)sIdKNB}KLd7+jN=vP?-=mdgRHJFOv9Y2s_<7;?2+Nt`@$(+7fs^}!F6vKHN<`(ml+;+JtS$TMJ%(2T8+blZ!6MqANy#`(D#HNPVAeqmP4nTtS*;qQYFtDI^Y2Sgw zAA^%AT*AV|w(w7~h2sx^cAFJ@Td}gqw&h-IXugZ|hOZ-$X$Hd@c2p7H%C=%uxmi|e zm+@e>v^?=}F5{7G2K-km-F#z-O3A)rwN{b%vm8x$p;U{xP)VkA;kIMLFVNj`-L5J~ z1!p$TAx?%T$8}VyYJP97{{}KJd#+k6NY-Ngd>F{~anAZIO4VmQs#cJbjjNVbtHLRx zswh>fZ|92Vi8xuSKg|^viT{u0vJ36l!k2k=6227W`10qu+2*4#Ps*3?_3=zd~QAN5h=YV=GNmFr}U=h z*5mr8^!{RQJsydyx0(I>%enQqOQ!U`Kerw?a!T*Xx%IdKQhHBi>y2~w-1ruTe`X}P z^KHbGm&weO=ZqXUS=racAZpjtK^CO8Zh__cp3+Qg4Fyg=Lol%v7cUznUt5jq+#Aq z8;+^O=hFo!R>hvF#EER?(a(u;B_z+zDp>$Y#xlu<>^uu0$yhB_5sUVyeL>=uY-@%C z5?RF)w`NPknjMFf^{lm4xT*6&&Z?Uu{4tCt*RveaEGu!Uycy+ZuE{xevRCIEVdgrW zBU1UYR_wXU&s@86>}0RvIl|2KJV&JRsg*smz8u-{Q9$ir20J4;{`uL0Iv!_kYWI^W zOiayag7KJW?@!!}dxmW}_l@(}XXAIV&B%~sB*(ea&NRvApV=H>YcsVEiT3`)7jRFG zln~MwDOH<$Ur2lnX}e6t#%K}2ow))GmL&nh0lDu947=V%fdeq2(hC9yUP#jEt63dYyadIxP zIy)qOe@?kPc1irl&k80aV~kf`loVKPJ$TskZ$Tm|VzxvkCdZ#GHljOf$0(&N8DAe(u4A+>d)rNxdoW&-1ZY!GU{eZ*4*J zPg4)`!CAtbDn0plADo2&x3O3s-+}Dqcm`6v2`5c`yaQz9QhDHR2V#5(tTjeC4rni+ z9D~r))HD35@+Im)sO?(-iaC!Eg_Zr_P*{~&j|+vB{g6;t*^dT=Wj_#1?$3horI73F zHmlax<(X9%)fM2G?t*GO{xnz5*DF*4kNZ(EU?<~vJJ-3&drGA$RP7e3T4YxDzzeoY zrEyBHz5;oD7-9#{;|%%k z1&7k^g#+-s{G;tOW4q~4Z>o7dOPZ-j z#@o2Y2h|V5y;YR~<$gG0Y(w@T^;Q)JlEZz0;RA!i4SBMI$HmI_B1f*qVn<3t z#-W-@egDNEDvxY|(|Eo5NNWC7^DaN1HmMA*ncT;W3iSm5yjXJBEuEZiumZ>@yGhFb zH`ecz6JHSFmRjskOM}!Z*(CVJ4Q5zJO`SANq?sE9yf)_H&W&EP9AEg6#Kn3=gww*sK034Ma*&%a!~z3q7~ROox=TX zG|Ye zhnD0cLBH14Q@MIpfEv?zxZc9mi|Zy_>=pCT?Fl<#e(x+i%sp&J9@erBr9NQE%yQ=q7z2Xd0ZJC+HPiELbhLS+E`GroVQ4*J09+oUDJ+JYwQ|J?5Rj zM+E;u@P+)x^Gy`R{4MUaZj%noZ<=q?p9(%LxXDxFF{xW{MDP~Dy9K8OUlIJ3V6m4i ztQ1`5<-C^*j(dl^pQl^AT%+%K|IlmFYl0tm+1t{R?>gMHTyTwGYstkWZt52NB+#TA zO4#x}B}2&jPzl%Thd?*|6#9sgr1erxUr@@@t)&;2nzTpoM&aBe_(&<+`H|qu!g*8D zzY$zi#(7tlaZEZTeNgaF8OP@~!TSWC5&o+{ZZFjzxnF8XE}#aqb&}d_Q_Lx*0H}PV z_$sDjLK)oN$ahLK9q12CJ#16+g?iDZN+jPqlFvaELb)`y>7+`bs%&b3P#ZzbgKQys zT`_Hg-Ff)OGg2{KDYE&rnso3F;POx@T}WJFhUw5dmh+5n1c z^o-ct1d44wkIO?>(A8uh^{P<&K=D^K-U77*@le#SZ0eI@Mc3Ku07h0mH0OgVqc9y1 zs#2(^O?_ObF`McX>a#X=wNO(wb)8VBZE8xW2W;vNp`Nv=yM%h)rXCgQC!n}ho&@Eg zf3&F=h59E@CL|XFM~uxtUH=4d%=jE?bG>mp@Kxh$z|D^Pz`xh=5b!0(W5AyQHG12z z8Tf(Yd*BQ@nICn&Lc1ms&hG&~FL;OGy@HPbP4gektF>JdZUNLb!_*YEaD0p1(q~K}6 z#{_>Y_@>}*1k3WjhuAjc7otOk^2>D(y^`-k`j^6gFMlP{1@3Bn8I`zSf#w3>GFsvO z1n>%XEu{P1Xj4S{7Jb)*tMH4!;{}ZKC0!x7Qm|I=Qo(j$GS}6G-++Ff;Gkeg&?OiV z92YzeH0dt=G2o;6+~0Z^Yxd2cZ&3G z!TSZjBlvJ3TYg&XJSX^q;7SOvg69Ms^Vk!&V6kAi;9|k$g4Kd` zf)@*J73>oHDp!xTe<&P6*y8cuerKf?p6kDflJ9Q-Ws% zj|g5T_(y{G3f?dHkl-ihokfX{>Td!c7ayJ!d{*#z!JmjfKNWmc@O8mAMEXm?`-St6 z;QyHSb6BGy?%}3jp`cf=QgEr@O2Hbzdcg|?HwkVL++M_S=n&i`c(q`E5yxs!@EXBk z!4bij;32^=!J}gBnBa4Toc9&M%=n)u;+D;9h3ln8Q^G$f_$9$F3w}lLwBSd#(VgP+ z9|_LUUiK)vy6|Gmd*3W#{1aeu96ed|bBv>B1piv_?|{4l8+5#Kosrx(8T6F4!6*h- z$)3{o85OesV$G+t0b@CTn*^U^KDSMAzH0Rg1JT@Pe4L6>GS26vP9HP4ye(8h11V~! zoC4A|u~o!J`O<^cIZ5p^_G3LxQfzanO{qFyzl)E`H-K3vN$oR+X+?_Sd>^wZm9IJ_ z+h81#HC|cSXWT%wDH-Rhr%@j>INuj&EgefyCutp>$f8by^3ieEmyJ`9-EUKmfm%;b z+0?I%Z(v9A4>q;P@eR6w-m|G*$G5N>@SqxOEPlDpl1l{Ia=KKMuheb9?=R_k926bZJ{`>Na12S**3D zs48=zh65Bn?B^xs$21(VQdEQ1lcM&U&Dy>c^{lyF+n=IdGWTeGG?C$1KYa!iN3c1+ zSnsDZHnj_sMUUCkvHXSl0KI5ar$G(UKZ8Ofq<%xRi4QHP`$6|f8lpn!K*uR2RJ%}< zbiGg~Z0ctBa%jG1Q@6Y8^&q{simgo2ozT37o>-%(hus(I*U;NG^`!eHI!Lu2SF#sC zh3F_wU!3n%P{Z`W1&VspeW@O%yYb|KW$!{ZLLbI73!a~e}OMIQIAmH2en(j ziF%c$wDd6=%%VoJC_b^gifK)!p8+-cuabTzCvDKLz;TGCMl}CFo+}S|bt)7KWxs=+ z|C2sfik}Pr7w`iIN5%(DooYmXz2Jt7^q8STXOnP-fjT8J(w{-vpf3rh*hM~_?iJ2U zKnGohhXNX%MOvq~g#V84oyGi2!2?W6Ic?B+KnHCu=HI$qjkHPE{JV5C8Y^ZWZUh>1 zvsn8Q(oVV;h!Z?GdGvjxxwmua&x!rHV)eHo{kz|aI=z~qqx#Ixg!4N3K}eF0ESAYsSQ#$PSUZGON=0-I{05LX)~_XzEjd^jA>7l>^3H~7fbeo zUsO6|G|{5c8<4Iky~(&o>nQy!@IdJ;#<#VDrN0k;y!0tp>vKL}Op8~~03S4_P|9w7 zQv7*Yd%g5|?X33SN*^~~*4{1szVUO-Rra(oNz2N9XnYnr&x3Pb*-7GZ{~kWDSCcfa z_&Z+{=>3<$6B2&ZxpXwSj}I@Q?f>S6WD_1Z!Wwu`z5fQ-o>7- z2hx1}a^p?lRgmV>0pa&kzm|`6EC>uy7&t;PV4RKsk5B@5lx_r0(5HdN=mhXHGzC0C zw*haZKLDPj)4<#5>%dcVFYq+|G4L*W5O_B|3cQcL2mBWOCGbId8o%;=n|=y>m;M3x z9{mjX0U?^`lD_~tw0{M2Z1lcoR(n zKTkgZ#^{^CMWVBU{uP?5VWEvy>p{mGTDSH(tuWrwU#DilfZ$DncMATc;2VO5gEdzO zHVXy>ZxXyy&|mltbS4GQ2u=&071ZXjbeUk2pkHuO@QmQJ;8{VfNc08$f|G)01g8bh z3TpF3Q?NGlJ8CX9YEn=nFOp`UNKi&j?Nno)y%* zqA%Da=og$6JR>+Qcves=5q-fXLBHUn;2FVb!Lx!|sptzf3Hk*m1A1+T$x(=vu@q}6;aMf0QeQO|12;Q-z=nK&BN56kga%vE_2W9x`vsrZi!r8k z%)9(#S*KlCnTzo}*8$FApoX`WPVn~vT{z$3Ss+ybT{sJ3e#03MGagQRZlpH?zgY6= z(pySTm72)fhWSCGt=evS(TT#ez4V6M_tU@OzE!)L3QPm{UaG>qQS;L!au3LTt7g%D zkq^?drUrSCUV>T21n&S;G*A(I8gRjW>Z8$5h0NxuC;ap9Okh5q1Qg@);PT=s!BvL1 zl;e`mrX7*~(U5f+?G6TqBXO%e*jLvd3MI+rA%A$#>Tf+{h2z`(;r@^nO^TqIOtv10 zTj5wR68;GFS#_GCc*SLxoS9en9pM&#+}~vdg4UrN7dpbtp&(ppj)cQjAfDx3Qq~fT z1!fV?uqkEDG?&57u_Th6R{U@zda&Dy9zsZ(yCZ>vR=m^CNZZ?5+J;9W(Rhqnw+2I2 zQyeez`bOhcjJi8}TUvLu?cCbY+tSq2l%$(md)s#Qw03Q6LTYY7Yfn>KyON`fmfohG zp02hnSN61aCxb|B;gQjJm&K)1$7noFaJ><(c+?+=6B9eE;l6ZhcE|m3i`rXTRAT37 zI50GNu-P99_C@`1G;LdWAVSR{e=HUZh@D6Xogr7j&Zmsb(B3i{k4M6D2o<}nOWm6S z0V|Y|%q=L>RH|$BjEz{-)`c!@(J)#+3h$|VEEczhX~$?N9t`+n@fIs&4RU3r*QlP> zcMWtvo;b*81 z-GH`OgFysM)LO&+$qeC`6^&ci+Mxw#?j9Z^e}8}PN6DksaO9Bnkt)fNFv}=O+Mn6) z?NJ`1Q~@8MlPn=;grsb!N+<(!>Ex6%m)giccsB-|bh*$Lj<9OjI*i0RHT*EVWEj$L zZ!8jM52D?}=;1=CycCQnHr}n1jFDK}AC0GZZ5i_Jcw_|4XpNxT^JJ6u3=NkR6x!_% z#b{Fc#y0XWvuwyk+9=7X(GSGM=qRA*Ofck9k1 z)zseJ+}_mPjRCHdJG(lzwzapWvhHeYZcWV`v~4ulPuqk2Exp^UIPO_=std=IO1Bly znjk=rj!7_Nv1Il`Jf3@dsmt>BN5Y{ou6(~0rj}q7V?Gicqo!zJ2u(%GMcNsO4*NsY zWAPO3hrD~lAB`!)m{>X883~5t)EpTeiNYB)a>u|xC>XYomzN}TyLel;-#P+GYd8=c z8{rYZI~t5zy*)$G$mrk@bzs>D`A0?|*cnm%f%{|^*4W4}PkyLmw{`6(Oa=X+Zv4?E z_!qL`7I!_=j(7-+j&xhYerN<@)ES8dkEF?t5i6YKEi-mTu$p3mLeQeIcxP|~?TG;p z4pkeMWk;4Qp-3HNMA>xJ^i#u|v>C-w}Lw>B^++(|TwYJy+?DWTnNQ~`5*N;T; zJ(bQVHW`69QoF1u?-O>8%G$GwWw^RpJ3G31dfQufZtK|&YFk@37Q^1QuFP~V#zl8q zPus4xp1r+m=aj6=lI-YcX-zX)_w=xhj-6O-+j?f>_w4PQRlm8Zy=_ZZQxEbcms)$j zA`^A?7A84$=5TE?wOY+$V1~?|9OuevPl3(676*8hj-fY4{bMr50&4eT^><;Zh+Azf zYEI`A4cmi@hYP-HWci0_IC%OAD3ViE{D-4;^~Vh036E9H!+NdN||cyCtVQ4~gv zoktmnarw!{CC-r(auW%TlBAh*4q635ur^9=N!w4PW^hAS$gH}{>rPIN%ofgeh zI>STRK6m*K@4*y*crTvz?ZuO*ebhu-s56BAvpq6wafwJ?IYKRw!(nQ-2GApegF|uJ z*G~JoC{ty8!4>efIg0M=o8PXoayEW#XYp$us;b>GYMKH5`H zd+TXmJ?+^>d$-ZPZI~4->Ny-C`)D!q48p4~x)07Js@L>mL~R|#Di=}P`e8Ny#IPD+ z)8*$QCoh7sOUL@nTlY909D>Qc`QaG;l%MPyXdo(UaA1u3N7Xrq{Mhmn_Lnq>okVhX z(lv@zc-X3wMKXeAIm)}G7$3n>`!3mb$u6oxIhK;dC^Vub2YW`#B-*X;AXZe~gIRC^ zhmReY;)eX8rdY}VT^Ytcz>kx<^0>p#a1yR3d8l12t1l5+qH&rU!3JSTWKW52^mwW*6)fl+Li z#!?kTlSQ$;!wRP+Ff0j?Fb&B51E;%@5FhAUBWMBX@AYmPhV_-!vv_cj- zDPSGLdWHsu7{S;uj|a3U&MdsEqZsdp`enN0bcRJZu_0qRAa+l{`=E>RX??pmuD6@BJjyo?I-y0hT8bSm81k4*J!eBdMy0C zR2*_5vKeG|uI$;mfj4Mq!6G3J}VkY&X=-Obqq-PG9{%Cop>OI$DBBs#o(~L zHHL-t>$o$h<0OZdx5-?^X20xIRa5dlh8s%mIAy720xEcbg~yhurjm_0T4!WTJ$d41 z2FW8XI+5%a)dq>w?wYzo^6&xEmmh1BJY=vla9&;)#ThKUaoW~Q-J>IN9^D!Y%XXPM z`eG42GN!|ZXX|STUk=4<@D6-Cxf$;jgJdCv@+pFQ7*qgMP^gQc*Ns#F--@xo_2F%# zA8*He)CZdL`5?nW3m)c5JQF7;+a|pC#TQYfj27gGiSB>Ew!a%W<1~u* zpe?YoO{f;&Ay90)O=@CMlm<{Db6Coy2jQhpxSV2NeNsaoBwl2<2sq=8H(oL5GSzO40H{!aU zpD*%NV#f)KPKSoKKn{L;8A-dET`}o(nu1D?OKbHZfDL z)XjXu^lXxsc8*3ad4hpocsckj7hZrdz$XV@VgY;%jSNH+42=vvhGGU6gH%N4lm_q- zpqRl$C~S>xqSzvQ%iY0$G1Y;WZun&)=i(niLJPpZadhzS8R64i4hR3?MYwnu{*bZP z#gX&6kSdf^AyQ4a*5Yc#)dsG<#A*7pB~HHSxO4O+>FGgdaNuhay3VblLkm6QB+|MI zs?apKlewIEJ_Crx@sYP5xm}KGPE?~UOthM(NAqdRw0do=wq9${F3>Il4}X|b^JreJ zL@U$EwF+$^_rK3DoM1S{FafPdk+BtlcL(>e+$+h!bskt<9 zwMe;oa{>M`?Zh4Gzd|_anfQul;*4kF>kiX9aS!)&+)x+9XyV%-z01&Xoq3?{2h+O> z;{-2vT}4HxR1uOz_=xz)BA@A9h6uPk6VD+}UY_o4@J>7lJ?`8t?=m!&cj9lIh{(jt zZlBY|x=Re#ygaA30SR!S&Z-i9c=mInViL`+xfY{|xeY22XxHL=w19W5=K>cGh@!=d zi}GA9-Lt0B(~|Gm?rGd@*t z91Mkg{aC}J!`Pwv;?Tg~@y8~^cbFe1C)NCM{$u`f0`>Vi@RZw!ofNe3Xa9o(K5UYF z*t>+lK8&ZuzIenp5QzpXUoeh!YQ9Ep`$-eO(xo*TRqs%TNuRv^i;l6nl)aNrk9er- zvom15=Lv*XXtZ=oH0TfeIxXvL&KW&8#ea!1=jlOH}>IcxrG|# zt*u*&-&WS6!8Q9eITAdl5iR8x={((1^ z`H8x^Te^=ed)sK+Jg?*a@;5(z{_U%R=#sSW;;ZmK0=Vk1dU<|$2yN0A@kjfwibX~d zVF(bd!?7bHSEWOI6`o66h4YH#k69V)x{>}q@=d^~{kd!c37<{m-0CNC7}VR0_fMhF z4r~?GyHCrKT{P=`cpmv0b2I!W{eMja_*aU=zs8uzc3FKl1l@fGpY^um+H;!dX-t60 z&(j8fgJc(W^}Rs6>OiUu`}Ccl+kjh<=Fguyet8ZHsQhDEm85U7MqJ!_YmasGPDdg=VTke@fw>3nP917G!Wae4U7 zuCx}{I|{%3h-bP+vz1eaO*5Za_;U=FG<=_xx9*&iTVVvz@v9x*^^}dVTyYN<(!UG%rfh;L1NztJ9uh}Qy-s)(~+1xKgXa! zVxFBZH}bi0-ynIK&^CO69!9@VhoIk_m{9-EpiZ9H{`2$yT?GCo0dBMZ diff --git a/cpp/wiiscan/_Lib/Release/WiimoteWhiteboard.exe b/cpp/wiiscan/_Lib/Release/WiimoteWhiteboard.exe deleted file mode 100644 index 1ca21b87ae023bd4226b494952e5e8d03ad213ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23552 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 E1-PBdi2wiq diff --git a/cpp/wiiscan/_Lib/USBm.dll b/cpp/wiiscan/_Lib/USBm.dll deleted file mode 100644 index 1460ff323663990109860430ba824471a2ee8916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60928 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 E0}hP#`~Uy| diff --git a/cpp/wiiscan/include/BluetoothAPIs.h b/cpp/wiiscan/include/BluetoothAPIs.h new file mode 100644 index 0000000..0027b2b --- /dev/null +++ b/cpp/wiiscan/include/BluetoothAPIs.h @@ -0,0 +1,1540 @@ + +// +// Copyright 2002 - Microsoft Corporation +// +// Created By: +// Geoff Pease (GPease) 12-JAN-2002 +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#define BLUETOOTH_MAX_NAME_SIZE (248) +#define BLUETOOTH_MAX_PASSKEY_SIZE (16) +#define BLUETOOTH_MAX_PASSKEY_BUFFER_SIZE (BLUETOOTH_MAX_PASSKEY_SIZE + 1) + +#ifdef __cplusplus +extern "C" { +#endif + +// *************************************************************************** +// +// Bluetooth Address +// +// *************************************************************************** + +typedef ULONGLONG BTH_ADDR; + +typedef struct _BLUETOOTH_ADDRESS { + union { + BTH_ADDR ullLong; // easier to compare again BLUETOOTH_NULL_ADDRESS + BYTE rgBytes[ 6 ]; // easier to format when broken out + }; + +} BLUETOOTH_ADDRESS_STRUCT; + +#define BLUETOOTH_ADDRESS BLUETOOTH_ADDRESS_STRUCT + +#define BLUETOOTH_NULL_ADDRESS ( (ULONGLONG) 0x0 ) + +// *************************************************************************** +// +// Radio Enumeration +// +// Description: +// This group of APIs enumerates the installed Bluetooth radios. +// +// Sample Usage: +// HANDLE hRadio; +// BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) }; +// +// HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio( &btfrp, &hRadio ); +// if ( NULL != hFind ) +// { +// do +// { +// // +// // TODO: Do something with the radio handle. +// // +// +// CloseHandle( hRadio ); +// +// } while( BluetoothFindNextRadio( hFind, &hRadio ) ); +// +// BluetoothFindRadioClose( hFind ); +// } +// +// *************************************************************************** + +typedef struct _BLUETOOTH_FIND_RADIO_PARAMS { + DWORD dwSize; // IN sizeof this structure + +} BLUETOOTH_FIND_RADIO_PARAMS; + +typedef HANDLE HBLUETOOTH_RADIO_FIND; + +// +// Description: +// Begins the enumeration of local Bluetooth radios. +// +// Parameters: +// pbtfrp +// A pointer to a BLUETOOTH_FIND_RADIO_PARAMS structure. The dwSize +// member of this structure must match the sizeof the of the structure. +// +// phRadio +// A pointer where the first radio HANDLE enumerated will be returned. +// +// Return Values: +// NULL +// Error opening radios or no devices found. Use GetLastError() for +// more info. +// +// ERROR_INVALID_PARAMETER +// pbtfrp parameter is NULL. +// +// ERROR_REVISION_MISMATCH +// The pbtfrp structure is not the right length. +// +// ERROR_OUTOFMEMORY +// Out of memory. +// +// other Win32 errors. +// +// any other +// Success. The return handle is valid and phRadio points to a valid handle. +// +HBLUETOOTH_RADIO_FIND +WINAPI +BluetoothFindFirstRadio( + BLUETOOTH_FIND_RADIO_PARAMS * pbtfrp, + HANDLE * phRadio + ); + +// +// Description: +// Finds the next installed Bluetooth radio. +// +// Parameters: +// hFind +// The handle returned by BluetoothFindFirstRadio(). +// +// phRadio +// A pointer where the next radio HANDLE enumerated will be returned. +// +// Return Values: +// TRUE +// Next device succesfully found. pHandleOut points to valid handle. +// +// FALSE +// No device found. pHandleOut points to an invalid handle. Call +// GetLastError() for more details. +// +// ERROR_INVALID_HANDLE +// The handle is NULL. +// +// ERROR_NO_MORE_ITEMS +// No more radios found. +// +// ERROR_OUTOFMEMORY +// Out of memory. +// +// other Win32 errors +// +BOOL +WINAPI +BluetoothFindNextRadio( + HBLUETOOTH_RADIO_FIND hFind, + HANDLE * phRadio + ); + +// +// Description: +// Closes the enumeration handle. +// +// Parameters +// hFind +// The handle returned by BluetoothFindFirstRadio(). +// +// Return Values: +// TRUE +// Handle succesfully closed. +// +// FALSE +// Failure. Check GetLastError() for details. +// +// ERROR_INVALID_HANDLE +// The handle is NULL. +// +BOOL +WINAPI +BluetoothFindRadioClose( + HBLUETOOTH_RADIO_FIND hFind + ); + +// *************************************************************************** +// +// Radio Information +// +// *************************************************************************** + +typedef struct _BLUETOOTH_RADIO_INFO { + DWORD dwSize; // Size, in bytes, of this entire data structure + + BLUETOOTH_ADDRESS address; // Address of the local radio + + WCHAR szName[ BLUETOOTH_MAX_NAME_SIZE ]; // Name of the local radio + + ULONG ulClassofDevice; // Class of device for the local radio + + USHORT lmpSubversion; // lmpSubversion, manufacturer specifc. + USHORT manufacturer; // Manufacturer of the radio, BTH_MFG_Xxx value. For the most up to date + // list, goto the Bluetooth specification website and get the Bluetooth + // assigned numbers document. +} BLUETOOTH_RADIO_INFO, *PBLUETOOTH_RADIO_INFO; + +// +// Description: +// Retrieves the information about the radio represented by the handle. +// +// Parameters: +// hRadio +// Handle to a local radio retrieved through BluetoothFindFirstRadio() +// et al or SetupDiEnumerateDeviceInterfaces() +// +// pRadioInfo +// Radio information to be filled in. The dwSize member must match the +// size of the structure. +// +// Return Values: +// ERROR_SUCCESS +// The information was retrieved successfully. +// +// ERROR_INVALID_PARAMETER +// pRadioInfo or hRadio is NULL. +// +// ERROR_REVISION_MISMATCH +// pRadioInfo->dwSize is invalid. +// +// other Win32 error codes. +// +DWORD +WINAPI +BluetoothGetRadioInfo( + HANDLE hRadio, + PBLUETOOTH_RADIO_INFO pRadioInfo + ); + +// *************************************************************************** +// +// Device Information Stuctures +// +// *************************************************************************** + +typedef struct _BLUETOOTH_DEVICE_INFO { + DWORD dwSize; // size, in bytes, of this structure - must be the sizeof(BLUETOOTH_DEVICE_INFO) + + BLUETOOTH_ADDRESS Address; // Bluetooth address + + ULONG ulClassofDevice; // Bluetooth "Class of Device" + + BOOL fConnected; // Device connected/in use + BOOL fRemembered; // Device remembered + BOOL fAuthenticated; // Device authenticated/paired/bonded + + SYSTEMTIME stLastSeen; // Last time the device was seen + SYSTEMTIME stLastUsed; // Last time the device was used for other than RNR, inquiry, or SDP + + WCHAR szName[ BLUETOOTH_MAX_NAME_SIZE ]; // Name of the device + +} BLUETOOTH_DEVICE_INFO_STRUCT; + +#define BLUETOOTH_DEVICE_INFO BLUETOOTH_DEVICE_INFO_STRUCT + +typedef BLUETOOTH_DEVICE_INFO * PBLUETOOTH_DEVICE_INFO; + +// *************************************************************************** +// +// Device Enumeration +// +// Description: +// Enumerates the Bluetooth devices. The types of returned device depends +// on the flags set in the BLUETOOTH_DEVICE_SEARCH_PARAMS (see structure +// definition for details). +// +// Sample Usage: +// HBLUETOOTH_DEVICE_FIND hFind; +// BLUETOOTH_DEVICE_SEARCH_PARAMS btsp = { sizeof(btsp) }; +// BLUETOOTH_DEVICE_INFO btdi = { sizeof(btdi) }; +// +// btsp.fReturnAuthenticated = TRUE; +// btsp.fReturnRemembered = TRUE; +// +// hFind = BluetoothFindFirstDevice( &btsp, &btdi ); +// if ( NULL != hFind ) +// { +// do +// { +// // +// // TODO: Do something useful with the device info. +// // +// +// } while( BluetoothFindNextDevice( hFind, &btdi ) ); +// +// BluetoothFindDeviceClose( hFind ); +// } +// +// *************************************************************************** + +typedef struct _BLUETOOTH_DEVICE_SEARCH_PARAMS { + DWORD dwSize; // IN sizeof this structure + + BOOL fReturnAuthenticated; // IN return authenticated devices + BOOL fReturnRemembered; // IN return remembered devices + BOOL fReturnUnknown; // IN return unknown devices + BOOL fReturnConnected; // IN return connected devices + + BOOL fIssueInquiry; // IN issue a new inquiry + UCHAR cTimeoutMultiplier; // IN timeout for the inquiry + + HANDLE hRadio; // IN handle to radio to enumerate - NULL == all radios will be searched + +} BLUETOOTH_DEVICE_SEARCH_PARAMS; + +typedef HANDLE HBLUETOOTH_DEVICE_FIND; + +// +// Description: +// Begins the enumeration of Bluetooth devices. +// +// Parameters: +// pbtsp +// A pointer to a BLUETOOTH_DEVICE_SEARCH_PARAMS structure. This +// structure contains the flags and inputs used to conduct the search. +// See BLUETOOTH_DEVICE_SEARCH_PARAMS for details. +// +// pbtdi +// A pointer to a BLUETOOTH_DEVICE_INFO structure to return information +// about the first Bluetooth device found. Note that the dwSize member +// of the structure must be the sizeof(BLUETOOTH_DEVICE_INFO) before +// calling because the APIs hast to know the size of the buffer being +// past in. The dwSize member must also match the exact +// sizeof(BLUETOOTH_DEVICE_INFO) or the call will fail. +// +// Return Values: +// NULL +// Error opening radios or not devices found. Use GetLastError for more info. +// +// ERROR_INVALID_PARAMETER +// pbtsp parameter or pbtdi parameter is NULL. +// +// ERROR_REVISION_MISMATCH +// The pbtfrp structure is not the right length. +// +// other Win32 errors +// +// any other value +// Success. The return handle is valid and pbtdi points to valid data. +// +HBLUETOOTH_DEVICE_FIND +WINAPI +BluetoothFindFirstDevice( + BLUETOOTH_DEVICE_SEARCH_PARAMS * pbtsp, + BLUETOOTH_DEVICE_INFO * pbtdi + ); + +// +// Description: +// Finds the next Bluetooth device in the enumeration. +// +// Parameters: +// hFind +// The handle returned from BluetoothFindFirstDevice(). +// +// pbtdi +// A pointer to a BLUETOOTH_DEVICE_INFO structure to return information +// about the first Bluetooth device found. Note that the dwSize member +// of the structure must be the sizeof(BLUETOOTH_DEVICE_INFO) before +// calling because the APIs hast to know the size of the buffer being +// past in. The dwSize member must also match the exact +// sizeof(BLUETOOTH_DEVICE_INFO) or the call will fail. +// +// Return Values: +// TRUE +// Next device succesfully found. pHandleOut points to valid handle. +// +// FALSE +// No device found. pHandleOut points to an invalid handle. Call +// GetLastError() for more details. +// +// ERROR_INVALID_HANDLE +// The handle is NULL. +// +// ERROR_NO_MORE_ITEMS +// No more radios found. +// +// ERROR_OUTOFMEMORY +// Out of memory. +// +// other Win32 errors +// +BOOL +WINAPI +BluetoothFindNextDevice( + HBLUETOOTH_DEVICE_FIND hFind, + BLUETOOTH_DEVICE_INFO * pbtdi + ); + +// +// Description: +// Closes the enumeration handle. +// +// Parameters: +// hFind +// The handle returned from BluetoothFindFirstDevice(). +// +// Return Values: +// TRUE +// Handle succesfully closed. +// +// FALSE +// Failure. Check GetLastError() for details. +// +// ERROR_INVALID_HANDLE +// The handle is NULL. +// +BOOL +WINAPI +BluetoothFindDeviceClose( + HBLUETOOTH_DEVICE_FIND hFind + ); + +// +// Description: +// Retrieves information about a remote device. +// +// Fill in the dwSize and the Address members of the pbtdi structure +// being passed in. On success, the rest of the members will be filled +// out with the information that the system knows. +// +// Parameters: +// hRadio +// Handle to a local radio retrieved through BluetoothFindFirstRadio() +// et al or SetupDiEnumerateDeviceInterfaces() +// +// pbtdi +// A pointer to a BLUETOOTH_DEVICE_INFO structure to return information +// about the first Bluetooth device found. The dwSize member of the +// structure must be the sizeof the structure in bytes. The Address +// member must be filled out with the Bluetooth address of the remote +// device. +// +// Return Values: +// ERROR_SUCCESS +// Success. Information returned. +// +// ERROR_REVISION_MISMATCH +// The size of the BLUETOOTH_DEVICE_INFO isn't compatible. Check +// the dwSize member of the BLUETOOTH_DEVICE_INFO structure you +// passed in. +// +// ERROR_NOT_FOUND +// The radio is not known by the system or the Address field of +// the BLUETOOTH_DEVICE_INFO structure is all zeros. +// +// ERROR_INVALID_PARAMETER +// pbtdi is NULL. +// +// other error codes +// +DWORD +WINAPI +BluetoothGetDeviceInfo( + HANDLE hRadio, + BLUETOOTH_DEVICE_INFO * pbtdi + ); + +// +// Description: +// Updates the computer local cache about the device. +// +// Parameters: +// pbtdi +// A pointer to the BLUETOOTH_DEVICE_INFO structure to be updated. +// The following members must be valid: +// dwSize +// Must match the size of the structure. +// Address +// Must be a previously found radio address. +// szName +// New name to be stored. +// +// Return Values: +// ERROR_SUCCESS +// The device information was updated successfully. +// +// ERROR_INVALID_PARAMETER +// pbtdi is NULL. +// +// ERROR_REVISION_MISMATCH +// pbtdi->dwSize is invalid. +// +// other Win32 error codes. +// +DWORD +WINAPI +BluetoothUpdateDeviceRecord( + BLUETOOTH_DEVICE_INFO * pbtdi + ); + +// +// Description: +// Delete the authentication (aka "bond") between the computer and the +// device. Also purges any cached information about the device. +// +// Return Values: +// ERROR_SUCCESS +// The device was removed successfully. +// +// ERROR_NOT_FOUND +// The device was not found. If no Bluetooth radio is installed, +// the devices could not be enumerated or removed. +// +DWORD +WINAPI +BluetoothRemoveDevice( + BLUETOOTH_ADDRESS * pAddress + ); + +// *************************************************************************** +// +// Device Picker Dialog +// +// Description: +// Invokes a common dialog for selecting Bluetooth devices. The list +// of devices displayed to the user is determined by the flags and +// settings the caller specifies in the BLUETOOTH_SELECT_DEVICE_PARAMS +// (see structure definition for more details). +// +// If BluetoothSelectDevices() returns TRUE, the caller must call +// BluetoothSelectDevicesFree() or memory will be leaked within the +// process. +// +// Sample Usage: +// +// BLUETOOTH_SELECT_DEVICE_PARAMS btsdp = { sizeof(btsdp) }; +// +// btsdp.hwndParent = hDlg; +// btsdp.fShowUnknown = TRUE; +// btsdp.fAddNewDeviceWizard = TRUE; +// +// BOOL b = BluetoothSelectDevices( &btsdp ); +// if ( b ) +// { +// BLUETOOTH_DEVICE_INFO * pbtdi = btsdp.pDevices; +// for ( ULONG cDevice = 0; cDevice < btsdp.cNumDevices; cDevice ++ ) +// { +// if ( pbtdi->fAuthenticated || pbtdi->fRemembered ) +// { +// // +// // TODO: Do something usefull with the device info +// // +// } +// +// pbtdi = (BLUETOOTH_DEVICE_INFO *) ((LPBYTE)pbtdi + pbtdi->dwSize); +// } +// +// BluetoothSelectDevicesFree( &btsdp ); +// } +// +// *************************************************************************** + + +typedef struct _BLUETOOTH_COD_PAIRS { + ULONG ulCODMask; // ClassOfDevice mask to compare + LPCWSTR pcszDescription; // Descriptive string of mask + +} BLUETOOTH_COD_PAIRS; + +typedef BOOL (WINAPI *PFN_DEVICE_CALLBACK)(LPVOID pvParam, PBLUETOOTH_DEVICE_INFO pDevice); + +typedef struct _BLUETOOTH_SELECT_DEVICE_PARAMS { + DWORD dwSize; // IN sizeof this structure + + ULONG cNumOfClasses; // IN Number in prgClassOfDevice - if ZERO search for all devices + BLUETOOTH_COD_PAIRS * prgClassOfDevices; // IN Array of CODs to find. + + LPWSTR pszInfo; // IN If not NULL, sets the "information" text + + HWND hwndParent; // IN parent window - NULL == no parent + + BOOL fForceAuthentication; // IN If TRUE, authenication will be forced before returning + BOOL fShowAuthenticated; // IN If TRUE, authenticated devices will be shown in the picker + BOOL fShowRemembered; // IN If TRUE, remembered devices will be shown in the picker + BOOL fShowUnknown; // IN If TRUE, unknown devices that are not authenticated or "remember" will be shown. + + BOOL fAddNewDeviceWizard; // IN If TRUE, invokes the add new device wizard. + BOOL fSkipServicesPage; // IN If TRUE, skips the "Services" page in the wizard. + + PFN_DEVICE_CALLBACK pfnDeviceCallback; // IN If non-NULL, a callback that will be called for each device. If the + // the callback returns TRUE, the item will be added. If the callback is + // is FALSE, the item will not be shown. + LPVOID pvParam; // IN Parameter to be passed to pfnDeviceCallback as the pvParam. + + DWORD cNumDevices; // IN number calles wants - ZERO == no limit. + // OUT the number of devices returned. + + PBLUETOOTH_DEVICE_INFO pDevices; // OUT pointer to an array for BLUETOOTH_DEVICE_INFOs. + // call BluetoothSelectDevicesFree() to free + +} BLUETOOTH_SELECT_DEVICE_PARAMS; + +// +// Description: +// (See header above) +// +// Return Values: +// TRUE +// User selected a device. pbtsdp->pDevices points to valid data. +// Caller should check the fAuthenticated && fRemembered flags to +// determine which devices we successfuly authenticated or valid +// selections by the user. +// +// Use BluetoothSelectDevicesFree() to free the nessecary data +// such as pDevices only if this function returns TRUE. +// +// FALSE +// No valid data returned. Call GetLastError() for possible details +// of the failure. If GLE() is: +// +// ERROR_CANCELLED +// The user cancelled the request. +// +// ERROR_INVALID_PARAMETER +// The pbtsdp is NULL. +// +// ERROR_REVISION_MISMATCH +// The structure passed in as pbtsdp is of an unknown size. +// +// other WIN32 errors +// +BOOL +WINAPI +BluetoothSelectDevices( + BLUETOOTH_SELECT_DEVICE_PARAMS * pbtsdp + ); + +// +// Description: +// This function should only be called if BluetoothSelectDevices() returns +// TRUE. This function will free any memory and resource returned by the +// BluetoothSelectDevices() in the BLUETOOTH_SELECT_DEVICE_PARAMS +// structure. +// +// Return Values: +// TRUE +// Success. +// +// FALSE +// Nothing to free. +// +BOOL +WINAPI +BluetoothSelectDevicesFree( + BLUETOOTH_SELECT_DEVICE_PARAMS * pbtsdp + ); + +// *************************************************************************** +// +// Device Property Sheet +// +// *************************************************************************** + +// +// Description: +// Invokes the CPLs device info property sheet. +// +// Parameters: +// hwndParent +// HWND to parent the property sheet. +// +// pbtdi +// A pointer to a BLUETOOTH_DEVICE_INFO structure of the device +// to be displayed. +// +// Return Values: +// TRUE +// The property page was successfully displayed. +// +// FALSE +// Failure. The property page was not displayed. Check GetLastError +// for more details. +// +BOOL +WINAPI +BluetoothDisplayDeviceProperties( + HWND hwndParent, + BLUETOOTH_DEVICE_INFO * pbtdi + ); + + +// *************************************************************************** +// +// Radio Authentication +// +// *************************************************************************** + +// +// Description: +// Sends an authentication request to a remote device. +// +// There are two modes of operation. "Wizard mode" and "Blind mode." +// +// "Wizard mode" is invoked when the pszPasskey is NULL. This will cause +// the "Bluetooth Connection Wizard" to be invoked. The user will be +// prompted to enter a passkey during the wizard after which the +// authentication request will be sent. The user will see the success +// or failure of the authentication attempt. The user will also be +// given the oppurtunity to try to fix a failed authentication. +// +// "Blind mode" is invoked when the pszPasskey is non-NULL. This will +// cause the computer to send a authentication request to the remote +// device. No UI is ever displayed. The Bluetooth status code will be +// mapped to a Win32 Error code. +// +// Parameters: +// +// hwndParent +// The window to parent the authentication wizard. If NULL, the +// wizard will be parented off the desktop. +// +// hRadio +// A valid local radio handle or NULL. If NULL, then all radios will +// be tired. If any of the radios succeed, then the call will +// succeed. +// +// pbtdi +// BLUETOOTH_DEVICE_INFO record of the device to be authenticated. +// +// pszPasskey +// PIN to be used to authenticate the device. If NULL, then UI is +// displayed and the user steps through the authentication process. +// If not NULL, no UI is shown. The passkey is NOT NULL terminated. +// +// ulPasskeyLength +// Length of szPassKey in bytes. The length must be less than or +// equal to BLUETOOTH_MAX_PASSKEY_SIZE * sizeof(WCHAR). +// +// Return Values: +// +// ERROR_SUCCESS +// Success. +// +// ERROR_CANCELLED +// User aborted the operation. +// +// ERROR_INVALID_PARAMETER +// The device structure in pbtdi is invalid. +// +// ERROR_NO_MORE_ITEMS +// The device in pbtdi is already been marked as authenticated. +// +// other WIN32 error +// Failure. Return value is the error code. +// +// For "Blind mode," here is the current mapping of Bluetooth status +// code to Win32 error codes: +// +// { BTH_ERROR_SUCCESS, ERROR_SUCCESS }, +// { BTH_ERROR_NO_CONNECTION, ERROR_DEVICE_NOT_CONNECTED }, +// { BTH_ERROR_PAGE_TIMEOUT, WAIT_TIMEOUT }, +// { BTH_ERROR_HARDWARE_FAILURE, ERROR_GEN_FAILURE }, +// { BTH_ERROR_AUTHENTICATION_FAILURE, ERROR_NOT_AUTHENTICATED }, +// { BTH_ERROR_MEMORY_FULL, ERROR_NOT_ENOUGH_MEMORY }, +// { BTH_ERROR_CONNECTION_TIMEOUT, WAIT_TIMEOUT }, +// { BTH_ERROR_LMP_RESPONSE_TIMEOUT, WAIT_TIMEOUT }, +// { BTH_ERROR_MAX_NUMBER_OF_CONNECTIONS, ERROR_REQ_NOT_ACCEP }, +// { BTH_ERROR_PAIRING_NOT_ALLOWED, ERROR_ACCESS_DENIED }, +// { BTH_ERROR_UNSPECIFIED_ERROR, ERROR_NOT_READY }, +// { BTH_ERROR_LOCAL_HOST_TERMINATED_CONNECTION, ERROR_VC_DISCONNECTED }, +// +DWORD +WINAPI +BluetoothAuthenticateDevice( + HWND hwndParent, + HANDLE hRadio, + BLUETOOTH_DEVICE_INFO * pbtbi, + PWCHAR pszPasskey, + ULONG ulPasskeyLength + ); + +// +// Description: +// Allows the caller to prompt for multiple devices to be authenticated +// within a single instance of the "Bluetooth Connection Wizard." +// +// Parameters: +// +// hwndParent +// The window to parent the authentication wizard. If NULL, the +// wizard will be parented off the desktop. +// +// hRadio +// A valid local radio handle or NULL. If NULL, then all radios will +// be tired. If any of the radios succeed, then the call will +// succeed. +// +// cDevices +// Number of devices in the rgbtdi array. +// +// rgbtdi +// An array BLUETOOTH_DEVICE_INFO records of the devices to be +// authenticated. +// +// Return Values: +// +// ERROR_SUCCESS +// Success. Check the fAuthenticate flag on each of the devices. +// +// ERROR_CANCELLED +// User aborted the operation. Check the fAuthenticate flags on +// each device to determine if any of the devices were authenticated +// before the user cancelled the operation. +// +// ERROR_INVALID_PARAMETER +// One of the items in the array of devices is invalid. +// +// ERROR_NO_MORE_ITEMS +// All the devices in the array of devices are already been marked as +// being authenticated. +// +// other WIN32 error +// Failure. Return value is the error code. +// +DWORD +WINAPI +BluetoothAuthenticateMultipleDevices( + HWND hwndParent, + HANDLE hRadio, + DWORD cDevices, + BLUETOOTH_DEVICE_INFO * pbtdi + ); + +// *************************************************************************** +// +// Bluetooth Services +// +// *************************************************************************** + +#define BLUETOOTH_SERVICE_DISABLE 0x00 +#define BLUETOOTH_SERVICE_ENABLE 0x01 +#define BLUETOOTH_SERVICE_MASK ( BLUETOOTH_ENABLE_SERVICE | BLUETOOTH_DISABLE_SERVICE ) + +// +// Description: +// Enables/disables the services for a particular device. +// +// The system maintains a mapping of service guids to supported drivers for +// Bluetooth-enabled devices. Enabling a service installs the corresponding +// device driver. Disabling a service removes the corresponding device driver. +// +// If a non-supported service is enabled, a driver will not be installed. +// +// Parameters +// hRadio +// Handle of the local Bluetooth radio device. +// +// pbtdi +// Pointer to a BLUETOOTH_DEVICE_INFO record. +// +// pGuidService +// The service GUID on the remote device. +// +// dwServiceFlags +// Flags to adjust the service. +// BLUETOOTH_SERVICE_DISABLE - disable the service +// BLUETOOTH_SERVICE_ENABLE - enables the service +// +// Return Values: +// ERROR_SUCCESS +// The call was successful. +// +// ERROR_INVALID_PARAMETER +// dwServiceFlags are invalid. +// +// ERROR_SERVICE_DOES_NOT_EXIST +// The GUID in pGuidService is not supported. +// +// other WIN32 error +// The call failed. +// +DWORD +WINAPI +BluetoothSetServiceState( + HANDLE hRadio, + BLUETOOTH_DEVICE_INFO * pbtdi, + GUID * pGuidService, + DWORD dwServiceFlags + ); + +// +// Description: +// Enumerates the services guids enabled on a particular device. If hRadio +// is NULL, all device will be searched for the device and all the services +// enabled will be returned. +// +// Parameters: +// hRadio +// Handle of the local Bluetooth radio device. If NULL, it will search +// all the radios for the address in the pbtdi. +// +// pbtdi +// Pointer to a BLUETOOTH_DEVICE_INFO record. +// +// pcService +// On input, the number of records pointed to by pGuidServices. +// On output, the number of valid records return in pGuidServices. +// +// pGuidServices +// Pointer to memory that is at least *pcService in length. +// +// Return Values: +// ERROR_SUCCESS +// The call succeeded. pGuidServices is valid. +// +// ERROR_MORE_DATA +// The call succeeded. pGuidService contains an incomplete list of +// enabled service GUIDs. +// +// other WIN32 errors +// The call failed. +// +DWORD +WINAPI +BluetoothEnumerateInstalledServices( + HANDLE hRadio, + BLUETOOTH_DEVICE_INFO * pbtdi, + DWORD * pcServices, + GUID * pGuidServices + ); + +// +// Description: +// Change the discovery state of the local radio(s). +// If hRadio is NULL, all the radios will be set. +// +// Use BluetoothIsDiscoverable() to determine the radios current state. +// +// The system ensures that a discoverable system is connectable, thus +// the radio must allow incoming connections (see +// BluetoothEnableIncomingConnections) prior to making a radio +// discoverable. Failure to do so will result in this call failing +// (returns FALSE). +// +// Parameters: +// hRadio +// If not NULL, changes the state of a specific radio. +// If NULL, the API will interate through all the radios. +// +// fEnabled +// If FALSE, discovery will be disabled. +// +// Return Values +// TRUE +// State was successfully changed. If the caller specified NULL for +// hRadio, at least of the radios accepted the state change. +// +// FALSE +// State was not changed. If the caller specified NULL for hRadio, all +// of the radios did not accept the state change. +// +BOOL +WINAPI +BluetoothEnableDiscovery( + HANDLE hRadio, + BOOL fEnabled + ); + +// +// Description: +// Determines if the Bluetooth radios are discoverable. If there are +// multiple radios, the first one to say it is discoverable will cause +// this function to return TRUE. +// +// Parameters: +// hRadio +// Handle of the radio to check. If NULL, it will check all local +// radios. +// +// Return Values: +// TRUE +// A least one radio is discoverable. +// +// FALSE +// No radios are discoverable. +// +BOOL +WINAPI +BluetoothIsDiscoverable( + HANDLE hRadio + ); + +// +// Description: +// Enables/disables the state of a radio to accept incoming connections. +// If hRadio is NULL, all the radios will be set. +// +// Use BluetoothIsConnectable() to determine the radios current state. +// +// The system enforces that a radio that is not connectable is not +// discoverable too. The radio must be made non-discoverable (see +// BluetoothEnableDiscovery) prior to making a radio non-connectionable. +// Failure to do so will result in this call failing (returns FALSE). +// +// Parameters: +// hRadio +// If not NULL, changes the state of a specific radio. +// If NULL, the API will interate through all the radios. +// +// fEnabled +// If FALSE, incoming connection will be disabled. +// +// Return Values +// TRUE +// State was successfully changed. If the caller specified NULL for +// hRadio, at least of the radios accepted the state change. +// +// FALSE +// State was not changed. If the caller specified NULL for hRadio, all +// of the radios did not accept the state change. +// +BOOL +WINAPI +BluetoothEnableIncomingConnections( + HANDLE hRadio, + BOOL fEnabled + ); + +// +// Description: +// Determines if the Bluetooth radios are connectable. If there are +// multiple radios, the first one to say it is connectable will cause +// this function to return TRUE. +// +// Parameters: +// hRadio +// Handle of the radio to check. If NULL, it will check all local +// radios. +// +// Return Values: +// TRUE +// A least one radio is allowing incoming connections. +// +// FALSE +// No radios are allowing incoming connections. +// +BOOL +WINAPI +BluetoothIsConnectable( + HANDLE hRadio + ); + +// *************************************************************************** +// +// Authentication Registration +// +// *************************************************************************** + +typedef HANDLE HBLUETOOTH_AUTHENTICATION_REGISTRATION; + +typedef BOOL (*PFN_AUTHENTICATION_CALLBACK)(LPVOID pvParam, PBLUETOOTH_DEVICE_INFO pDevice); + +// +// Description: +// Registers a callback function to be called when a particular device +// requests authentication. The request is sent to the last application +// that requested authentication for a particular device. +// +// Parameters: +// pbtdi +// A pointer to a BLUETOOTH_DEVICE_INFO structure. The Bluetooth +// address will be used for comparision. +// +// phRegHandle +// A pointer to where the registration HANDLE value will be +// stored. Call BluetoothUnregisterAuthentication() to close +// the handle. +// +// pfnCallback +// The function that will be called when the authentication event +// occurs. This function should match PFN_AUTHENTICATION_CALLBACK's +// prototype. +// +// pvParam +// Optional parameter to be past through to the callback function. +// This can be anything the application was to define. +// +// Return Values: +// ERROR_SUCCESS +// Success. A valid registration handle was returned. +// +// ERROR_OUTOFMEMORY +// Out of memory. +// +// other Win32 error. +// Failure. The registration handle is invalid. +// +DWORD +WINAPI +BluetoothRegisterForAuthentication( + BLUETOOTH_DEVICE_INFO * pbtdi, + HBLUETOOTH_AUTHENTICATION_REGISTRATION * phRegHandle, + PFN_AUTHENTICATION_CALLBACK pfnCallback, + PVOID pvParam + ); + +// +// Description: +// Unregisters an authentication callback and closes the handle. See +// BluetoothRegisterForAuthentication() for more information about +// authentication registration. +// +// Parameters: +// hRegHandle +// Handle returned by BluetoothRegisterForAuthentication(). +// +// Return Value: +// TRUE +// The handle was successfully closed. +// +// FALSE +// The handle was not successfully closed. Check GetLastError for +// more details. +// +// ERROR_INVALID_HANDLE +// The handle is NULL. +// +// other Win32 errors. +// +BOOL +WINAPI +BluetoothUnregisterAuthentication( + HBLUETOOTH_AUTHENTICATION_REGISTRATION hRegHandle + ); + +// +// Description: +// This function should be called after receiving an authentication request +// to send the passkey response. +// +// Parameters: +// +// hRadio +// Optional handle to the local radio. If NULL, the function will try +// each radio until one succeeds. +// +// pbtdi +// A pointer to a BLUETOOTH_DEVICE_INFO structure describing the device +// being authenticated. This can be the same structure passed to the +// callback function. +// +// pszPasskey +// A pointer to UNICODE zero-terminated string of the passkey response +// that should be sent back to the authenticating device. +// +// Return Values: +// ERROR_SUCESS +// The device accepted the passkey response. The device is authenticated. +// +// ERROR_CANCELED +// The device denied the passkey reponse. This also will returned if there +// is a communications problem with the local radio. +// +// E_FAIL +// The device returned a failure code during authentication. +// +// other Win32 error codes +// +DWORD +WINAPI +BluetoothSendAuthenticationResponse( + HANDLE hRadio, + BLUETOOTH_DEVICE_INFO * pbtdi, + LPWSTR pszPasskey + ); + +// *************************************************************************** +// +// SDP Parsing Functions +// +// *************************************************************************** + +typedef struct _SDP_ELEMENT_DATA { + // + // Enumeration of SDP element types. Generic element types will have a + // specificType value other then SDP_ST_NONE. The generic types are: + // o SDP_TYPE_UINT + // o SDP_TYPE_INT + // o SDP_TYPE_UUID + // + SDP_TYPE type; + + // + // Specific types for the generic SDP element types. + // + SDP_SPECIFICTYPE specificType; + + // + // Union of all possible data types. type and specificType will indicate + // which field is valid. For types which do not have a valid specificType, + // specific type will be SDP_ST_NONE. + // + union { + // type == SDP_TYPE_INT + SDP_LARGE_INTEGER_16 int128; // specificType == SDP_ST_INT128 + LONGLONG int64; // specificType == SDP_ST_INT64 + LONG int32; // specificType == SDP_ST_INT32 + SHORT int16; // specificType == SDP_ST_INT16 + CHAR int8; // specificType == SDP_ST_INT8 + + // type == SDP_TYPE_UINT + SDP_ULARGE_INTEGER_16 uint128; // specificType == SDP_ST_UINT128 + ULONGLONG uint64; // specificType == SDP_ST_UINT64 + ULONG uint32; // specificType == SDP_ST_UINT32 + USHORT uint16; // specificType == SDP_ST_UINT16 + UCHAR uint8; // specificType == SDP_ST_UINT8 + + // type == SDP_TYPE_BOOLEAN + UCHAR booleanVal; + + // type == SDP_TYPE_UUID + GUID uuid128; // specificType == SDP_ST_UUID128 + ULONG uuid32; // specificType == SDP_ST_UUID32 + USHORT uuid16; // specificType == SDP_ST_UUID32 + + // type == SDP_TYPE_STRING + struct { + // raw string buffer, may not be encoded as ANSI, use + // BluetoothSdpGetString to convert the value if it is described + // by the base language attribute ID list + LPBYTE value; + + // raw length of the string, may not be NULL terminuated + ULONG length; + } string; + + // type == SDP_TYPE_URL + struct { + LPBYTE value; + ULONG length; + } url; + + // type == SDP_TYPE_SEQUENCE + struct { + // raw sequence, starts at sequence element header + LPBYTE value; + + // raw sequence length + ULONG length; + } sequence; + + // type == SDP_TYPE_ALTERNATIVE + struct { + // raw alternative, starts at alternative element header + LPBYTE value; + + // raw alternative length + ULONG length; + } alternative; + + } data; + +} SDP_ELEMENT_DATA, *PSDP_ELEMENT_DATA; + +// +// Description: +// Retrieves and parses the element found at pSdpStream +// +// Parameters: +// IN pSdpStream +// pointer to valid SDP stream +// +// IN cbSdpStreamLength +// length of pSdpStream in bytes +// +// OUT pData +// pointer to be filled in with the data of the SDP element at the +// beginning of pSdpStream +// +// Return Values: +// ERROR_INVALID_PARAMETER +// one of required parameters is NULL or the pSdpStream is invalid +// +// ERROR_SUCCESS +// the sdp element was parsed correctly +// +DWORD +WINAPI +BluetoothSdpGetElementData( + LPBYTE pSdpStream, + ULONG cbSdpStreamLength, + PSDP_ELEMENT_DATA pData + ); + +typedef HANDLE HBLUETOOTH_CONTAINER_ELEMENT; + +// +// Description: +// Iterates over a container stream, returning each elemetn contained with +// in the container element at the beginning of pContainerStream +// +// Parameters: +// IN pContainerStream +// pointer to valid SDP stream whose first element is either a sequence +// or alternative +// +// IN cbContainerlength +// length in bytes of pContainerStream +// +// IN OUT pElement +// Value used to keep track of location within the stream. The first +// time this function is called for a particular container, *pElement +// should equal NULL. Upon subsequent calls, the value should be +// unmodified. +// +// OUT pData +// pointer to be filled in with the data of the SDP element at the +// current element of pContainerStream +// +// Return Values: +// ERROR_SUCCESS +// The call succeeded, pData contains the data +// +// ERROR_NO_MORE_ITEMS +// There are no more items in the list, the caller should cease calling +// BluetoothSdpGetContainerElementData for this container. +// +// ERROR_INVALID_PARAMETER +// A required pointer is NULL or the container is not a valid SDP +// stream +// +// Usage example: +// +// HBLUETOOTH_CONTAINER_ELEMENT element; +// SDP_ELEMENT_DATA data; +// ULONG result; +// +// element = NULL; +// +// while (TRUE) { +// result = BluetoothSdpGetContainerElementData( +// pContainer, ulContainerLength, &element, &data); +// +// if (result == ERROR_NO_MORE_ITEMS) { +// // We are done +// break; +// } +// else if (result != ERROR_SUCCESS) { +// // error +// } +// +// // do something with data ... +// } +// +// +DWORD +WINAPI +BluetoothSdpGetContainerElementData( + LPBYTE pContainerStream, + ULONG cbContainerLength, + HBLUETOOTH_CONTAINER_ELEMENT* pElement, + PSDP_ELEMENT_DATA pData + ); + +// +// Description: +// Retrieves the attribute value for the given attribute ID. pRecordStream +// must be an SDP stream that is formatted as an SDP record, a SEQUENCE +// containing UINT16 + element pairs. +// +// Parameters: +// IN pRecordStream +// pointer to a valid SDP stream which is formatted as a singl SDP +// record +// +// IN cbRecordlnegh +// length of pRecordStream in bytes +// +// IN usAttributeId +// the attribute ID to search for. see bthdef.h for SDP_ATTRIB_Xxx +// values. +// +// OUT pAttributeData +// pointer that will contain the attribute ID's value +// +// Return Values: +// ERRROR_SUCCESS +// Call succeeded, pAttributeData contains the attribute value +// +// ERROR_INVALID_PARAMETER +// One of the required pointers was NULL, pRecordStream was not a valid +// SDP stream, or pRecordStream was not a properly formatted SDP record +// +// ERROR_FILE_NOT_FOUND +// usAttributeId was not found in the record +// +// Usage: +// +// ULONG result; +// SDP_DATA_ELEMENT data; +// +// result = BluetoothSdpGetAttributeValue( +// pRecordStream, cbRecordLength, SDP_ATTRIB_RECORD_HANDLE, &data); +// if (result == ERROR_SUCCESS) { +// printf("record handle is 0x%x\n", data.data.uint32); +// } +// +DWORD +WINAPI +BluetoothSdpGetAttributeValue( + LPBYTE pRecordStream, + ULONG cbRecordLength, + USHORT usAttributeId, + PSDP_ELEMENT_DATA pAttributeData + ); + +// +// These three fields correspond one to one with the triplets defined in the +// SDP specification for the language base attribute ID list. +// +typedef struct _SDP_STRING_TYPE_DATA { + // + // How the string is encoded according to ISO 639:1988 (E/F): "Code + // for the representation of names of languages". + // + USHORT encoding; + + // + // MIBE number from IANA database + // + USHORT mibeNum; + + // + // The base attribute where the string is to be found in the record + // + USHORT attributeId; + +} SDP_STRING_TYPE_DATA, *PSDP_STRING_TYPE_DATA; + +// +// Description: +// Converts a raw string embedded in the SDP record into a UNICODE string +// +// Parameters: +// IN pRecordStream +// a valid SDP stream which is formatted as an SDP record +// +// IN cbRecordLength +// length of pRecordStream in bytes +// +// IN pStringData +// if NULL, then the calling thread's locale will be used to search +// for a matching string in the SDP record. If not NUL, the mibeNum +// and attributeId will be used to find the string to convert. +// +// IN usStringOffset +// the SDP string type offset to convert. usStringOffset is added to +// the base attribute id of the string. SDP specification defined +// offsets are: STRING_NAME_OFFSET, STRING_DESCRIPTION_OFFSET, and +// STRING_PROVIDER_NAME_OFFSET (found in bthdef.h). +// +// OUT pszString +// if NULL, pcchStringLength will be filled in with the required number +// of characters (not bytes) to retrieve the converted string. +// +// IN OUT pcchStringLength +// Upon input, if pszString is not NULL, will contain the length of +// pszString in characters. Upon output, it will contain either the +// number of required characters including NULL if an error is returned +// or the number of characters written to pszString (including NULL). +// +// Return Values: +// ERROR_SUCCES +// Call was successful and pszString contains the converted string +// +// ERROR_MORE_DATA +// pszString was NULL or too small to contain the converted string, +// pccxhStringLength contains the required length in characters +// +// ERROR_INVALID_DATA +// Could not perform the conversion +// +// ERROR_NO_SYSTEM_RESOURCES +// Could not allocate memory internally to perform the conversion +// +// ERROR_INVALID_PARAMETER +// One of the rquired pointers was NULL, pRecordStream was not a valid +// SDP stream, pRecordStream was not a properly formatted record, or +// the desired attribute + offset was not a string. +// +// Other HRESULTs returned by COM +// +DWORD +WINAPI +BluetoothSdpGetString( + LPBYTE pRecordStream, + ULONG cbRecordLength, + PSDP_STRING_TYPE_DATA pStringData, + USHORT usStringOffset, + PWCHAR pszString, + PULONG pcchStringLength + ); + +// *************************************************************************** +// +// Raw Attribute Enumeration +// +// *************************************************************************** + +typedef BOOL (CALLBACK *PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK)( + ULONG uAttribId, + LPBYTE pValueStream, + ULONG cbStreamSize, + LPVOID pvParam + ); + +// +// Description: +// Enumerates through the SDP record stream calling the Callback function +// for each attribute in the record. If the Callback function returns +// FALSE, the enumeration is stopped. +// +// Return Values: +// TRUE +// Success! Something was enumerated. +// +// FALSE +// Failure. GetLastError() could be one of the following: +// +// ERROR_INVALID_PARAMETER +// pSDPStream or pfnCallback is NULL. +// +// ERROR_INVALID_DATA +// The SDP stream is corrupt. +// +// other Win32 errors. +// +#define BluetoothEnumAttributes BluetoothSdpEnumAttributes + +BOOL +WINAPI +BluetoothSdpEnumAttributes( + LPBYTE pSDPStream, + ULONG cbStreamSize, + PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK pfnCallback, + LPVOID pvParam + ); + +#ifdef __cplusplus +} +#endif diff --git a/cpp/wiiscan/include/DelcomDLL.h b/cpp/wiiscan/include/DelcomDLL.h index 8fd16b5..eb48350 100644 --- a/cpp/wiiscan/include/DelcomDLL.h +++ b/cpp/wiiscan/include/DelcomDLL.h @@ -66,7 +66,7 @@ DWORD __stdcall DelcomGetDeviceCount( DWORD Type ); DWORD __stdcall DelcomReadDeviceVersion(HANDLE ); DWORD __stdcall DelcomReadDeviceSerialNum(LPSTR, HANDLE ); -DWORD __stdcall DelcomSendPacket( HANDLE, pPacketStruct, pPacketStruct); +DWORD __stdcall DelcomSendPacket( HANDLE, pPacketStruct, pPacketStruct); // USBDELVI - Visual Indicator Functions @@ -123,6 +123,3 @@ DWORD __stdcall DelcomNumericDouble(HANDLE hUsb, double Number, DWORD Base ); #endif - - - diff --git a/cpp/wiiscan/include/bthdef.h b/cpp/wiiscan/include/bthdef.h new file mode 100644 index 0000000..37b3f5d --- /dev/null +++ b/cpp/wiiscan/include/bthdef.h @@ -0,0 +1,858 @@ +/*++ + +Copyright (c) 2000 Microsoft Corporation + +Module Name: + + bthdef.h + +Abstract: + + This module contains the Bluetooth common structures and definitions + +Author: + +Notes: + +Environment: + + Kernel mode only + + +Revision History: + + --*/ + +#ifndef __BTHDEF_H__ +#define __BTHDEF_H__ + +#ifndef GUID_DEFS_ONLY + #ifndef NO_BTHSDPDEF_INC + #include "bthsdpdef.h" + #endif // NO_BTHSDPDEF_INC +#endif // GUID_DEFS_ONLY + +#ifndef NO_GUID_DEFS + +// {0850302A-B344-4fda-9BE9-90576B8D46F0} +DEFINE_GUID(GUID_BTHPORT_DEVICE_INTERFACE, 0x850302a, 0xb344, 0x4fda, 0x9b, 0xe9, 0x90, 0x57, 0x6b, 0x8d, 0x46, 0xf0); + +// {EA3B5B82-26EE-450E-B0D8-D26FE30A3869} +DEFINE_GUID(GUID_BLUETOOTH_RADIO_IN_RANGE, 0xea3b5b82, 0x26ee, 0x450e, 0xb0, 0xd8, 0xd2, 0x6f, 0xe3, 0x0a, 0x38, 0x69); + +// {E28867C9-C2AA-4CED-B969-4570866037C4} +DEFINE_GUID(GUID_BLUETOOTH_RADIO_OUT_OF_RANGE, 0xe28867c9, 0xc2aa, 0x4ced, 0xb9, 0x69, 0x45, 0x70, 0x86, 0x60, 0x37, 0xc4); + +// BD198B7C-24AB-4B9A-8C0D-A8EA8349AA16 +DEFINE_GUID(GUID_BLUETOOTH_PIN_REQUEST, 0xbd198b7c, 0x24ab, 0x4b9a, 0x8c, 0x0d, 0xa8, 0xea, 0x83, 0x49, 0xaa, 0x16); + +// {7EAE4030-B709-4AA8-AC55-E953829C9DAA} +DEFINE_GUID(GUID_BLUETOOTH_L2CAP_EVENT, 0x7eae4030, 0xb709, 0x4aa8, 0xac, 0x55, 0xe9, 0x53, 0x82, 0x9c, 0x9d, 0xaa); + +// {FC240062-1541-49BE-B463-84C4DCD7BF7F} +DEFINE_GUID(GUID_BLUETOOTH_HCI_EVENT, 0xfc240062, 0x1541, 0x49be, 0xb4, 0x63, 0x84, 0xc4, 0xdc, 0xd7, 0xbf, 0x7f); + +// +// Bluetooth base UUID for service discovery +// +DEFINE_GUID(Bluetooth_Base_UUID, 0x00000000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); + +// +// UUID for the root of the browse group list +// + +DEFINE_GUID(SDP_PROTOCOL_UUID, 0x00000001, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(UDP_PROTOCOL_UUID, 0x00000002, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(RFCOMM_PROTOCOL_UUID, 0x00000003, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(TCP_PROTOCOL_UUID, 0x00000004, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(TCSBIN_PROTOCOL_UUID, 0x00000005, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(TCSAT_PROTOCOL_UUID, 0x00000006, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(OBEX_PROTOCOL_UUID, 0x00000008, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(IP_PROTOCOL_UUID, 0x00000009, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(FTP_PROTOCOL_UUID, 0x0000000A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HTTP_PROTOCOL_UUID, 0x0000000C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(WSP_PROTOCOL_UUID, 0x0000000E, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(BNEP_PROTOCOL_UUID, 0x0000000F, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(UPNP_PROTOCOL_UUID, 0x00000010, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HID_PROTOCOL_UUID, 0x00000011, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HCCC_PROTOCOL_UUID, 0x00000012, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HCDC_PROTOCOL_UUID, 0x00000014, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HN_PROTOCOL_UUID, 0x00000016, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AVCTP_PROTOCOL_UUID, 0x00000017, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AVDTP_PROTOCOL_UUID, 0x00000019, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(CMPT_PROTOCOL_UUID, 0x0000001B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(UDI_C_PLANE_PROTOCOL_UUID, 0x0000001D, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(L2CAP_PROTOCOL_UUID, 0x00000100, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); + +#define SDP_PROTOCOL_UUID16 (0x0001) +#define UDP_PROTOCOL_UUID16 (0x0002) +#define RFCOMM_PROTOCOL_UUID16 (0x0003) +#define TCP_PROTOCOL_UUID16 (0x0004) +#define TCSBIN_PROTOCOL_UUID16 (0x0005) +#define TCSAT_PROTOCOL_UUID16 (0x0006) +#define OBEX_PROTOCOL_UUID16 (0x0008) +#define IP_PROTOCOL_UUID16 (0x0009) +#define FTP_PROTOCOL_UUID16 (0x000A) +#define HTTP_PROTOCOL_UUID16 (0x000C) +#define WSP_PROTOCOL_UUID16 (0x000E) +#define BNEP_PROTOCOL_UUID16 (0x000F) +#define UPNP_PROTOCOL_UUID16 (0x0010) +#define HID_PROTOCOL_UUID16 (0x0011) +#define HCCC_PROTOCOL_UUID16 (0x0012) +#define HCDC_PROTOCOL_UUID16 (0x0014) +#define HCN_PROTOCOL_UUID16 (0x0016) +#define AVCTP_PROTOCOL_UUID16 (0x0017) +#define AVDTP_PROTOCOL_UUID16 (0x0019) +#define CMPT_PROTOCOL_UUID16 (0x001B) +#define UDI_C_PLANE_PROTOCOL_UUID16 (0x001D) +#define L2CAP_PROTOCOL_UUID16 (0x0100) + +DEFINE_GUID(ServiceDiscoveryServerServiceClassID_UUID, 0x00001000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(BrowseGroupDescriptorServiceClassID_UUID, 0x00001001, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(PublicBrowseGroupServiceClass_UUID, 0x00001002, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(SerialPortServiceClass_UUID, 0x00001101, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(LANAccessUsingPPPServiceClass_UUID, 0x00001102, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(DialupNetworkingServiceClass_UUID, 0x00001103, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(IrMCSyncServiceClass_UUID, 0x00001104, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(OBEXObjectPushServiceClass_UUID, 0x00001105, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(OBEXFileTransferServiceClass_UUID, 0x00001106, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(IrMCSyncCommandServiceClass_UUID, 0x00001107, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HeadsetServiceClass_UUID, 0x00001108, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(CordlessTelephonyServiceClass_UUID, 0x00001109, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AudioSourceServiceClass_UUID, 0x0000110A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AudioSinkServiceClass_UUID, 0x0000110B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AVRemoteControlTargetServiceClass_UUID, 0x0000110C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AdvancedAudioDistributionServiceClass_UUID,0x0000110D, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AVRemoteControlServiceClass_UUID, 0x0000110E, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(VideoConferencingServiceClass_UUID, 0x0000110F, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(IntercomServiceClass_UUID, 0x00001110, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(FaxServiceClass_UUID, 0x00001111, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HeadsetAudioGatewayServiceClass_UUID, 0x00001112, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(WAPServiceClass_UUID, 0x00001113, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(WAPClientServiceClass_UUID, 0x00001114, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(PANUServiceClass_UUID, 0x00001115, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(NAPServiceClass_UUID, 0x00001116, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(GNServiceClass_UUID, 0x00001117, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(DirectPrintingServiceClass_UUID, 0x00001118, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(ReferencePrintingServiceClass_UUID, 0x00001119, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(ImagingServiceClass_UUID, 0x0000111A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(ImagingResponderServiceClass_UUID, 0x0000111B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(ImagingAutomaticArchiveServiceClass_UUID, 0x0000111C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(ImagingReferenceObjectsServiceClass_UUID, 0x0000111D, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HandsfreeServiceClass_UUID, 0x0000111E, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HandsfreeAudioGatewayServiceClass_UUID, 0x0000111F, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(DirectPrintingReferenceObjectsServiceClass_UUID, + 0x00001120, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(ReflectedUIServiceClass_UUID, 0x00001121, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(BasicPringingServiceClass_UUID, 0x00001122, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(PrintingStatusServiceClass_UUID, 0x00001123, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HumanInterfaceDeviceServiceClass_UUID, 0x00001124, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HardcopyCableReplacementServiceClass_UUID, 0x00001125, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HCRPrintServiceClass_UUID, 0x00001126, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(HCRScanServiceClass_UUID, 0x00001127, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(CommonISDNAccessServiceClass_UUID, 0x00001128, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(VideoConferencingGWServiceClass_UUID, 0x00001129, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(UDIMTServiceClass_UUID, 0x0000112A, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(UDITAServiceClass_UUID, 0x0000112B, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(AudioVideoServiceClass_UUID, 0x0000112C, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(PnPInformationServiceClass_UUID, 0x00001200, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(GenericNetworkingServiceClass_UUID, 0x00001201, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(GenericFileTransferServiceClass_UUID, 0x00001202, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(GenericAudioServiceClass_UUID, 0x00001203, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); +DEFINE_GUID(GenericTelephonyServiceClass_UUID, 0x00001204, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB); + +#define ServiceDiscoveryServerServiceClassID_UUID16 (0x1000) +#define BrowseGroupDescriptorServiceClassID_UUID16 (0x1001) +#define PublicBrowseGroupServiceClassID_UUID16 (0x1002) +#define SerialPortServiceClassID_UUID16 (0x1101) +#define LANAccessUsingPPPServiceClassID_UUID16 (0x1102) +#define DialupNetworkingServiceClassID_UUID16 (0x1103) +#define IrMCSyncServiceClassID_UUID16 (0x1104) +#define OBEXObjectPushServiceClassID_UUID16 (0x1105) +#define OBEXFileTransferServiceClassID_UUID16 (0x1106) +#define IrMcSyncCommandServiceClassID_UUID16 (0x1107) +#define HeadsetServiceClassID_UUID16 (0x1108) +#define CordlessServiceClassID_UUID16 (0x1109) +#define AudioSourceServiceClassID_UUID16 (0x110A) +#define AudioSinkSourceServiceClassID_UUID16 (0x110B) +#define AVRemoteControlTargetServiceClassID_UUID16 (0x110C) +#define AdvancedAudioDistributionServiceClassID_UUID16 (0x110D) +#define AVRemoteControlServiceClassID_UUID16 (0x110E) +#define VideoConferencingServiceClassID_UUID16 (0x110F) +#define IntercomServiceClassID_UUID16 (0x1110) +#define FaxServiceClassID_UUID16 (0x1111) +#define HeadsetAudioGatewayServiceClassID_UUID16 (0x1112) +#define WAPServiceClassID_UUID16 (0x1113) +#define WAPClientServiceClassID_UUID16 (0x1114) +#define PANUServiceClassID_UUID16 (0x1115) +#define NAPServiceClassID_UUID16 (0x1116) +#define GNServiceClassID_UUID16 (0x1117) +#define DirectPrintingServiceClassID_UUID16 (0x1118) +#define ReferencePrintingServiceClassID_UUID16 (0x1119) +#define ImagingServiceClassID_UUID16 (0x111A) +#define ImagingResponderServiceClassID_UUID16 (0x111B) +#define ImagingAutomaticArchiveServiceClassID_UUID16 (0x111C) +#define ImagingReferenceObjectsServiceClassID_UUID16 (0x111D) +#define HandsfreeServiceClassID_UUID16 (0x111E) +#define HandsfreeAudioGatewayServiceClassID_UUID16 (0x111F) +#define DirectPrintingReferenceObjectsServiceClassID_UUID16 \ + (0x1120) +#define ReflectsUIServiceClassID_UUID16 (0x1121) +#define BasicPrintingServiceClassID_UUID16 (0x1122) +#define PrintingStatusServiceClassID_UUID16 (0x1123) +#define HumanInterfaceDeviceServiceClassID_UUID16 (0x1124) +#define HardcopyCableReplacementServiceClassID_UUID16 (0x1125) +#define HCRPrintServiceClassID_UUID16 (0x1126) +#define HCRScanServiceClassID_UUID16 (0x1127) +#define CommonISDNAccessServiceClass_UUID16 (0x1128) +#define VideoConferencingGWServiceClass_UUID16 (0x1129) +#define UDIMTServiceClass_UUID16 (0x112A) +#define UDITAServiceClass_UUID16 (0x112B) +#define AudioVideoServiceClass_UUID16 (0x112C) + +#define PnPInformationServiceClassID_UUID16 (0x1200) +#define GenericNetworkingServiceClassID_UUID16 (0x1201) +#define GenericFileTransferServiceClassID_UUID16 (0x1202) +#define GenericAudioServiceClassID_UUID16 (0x1203) +#define GenericTelephonyServiceClassID_UUID16 (0x1204) + +#endif // NO_GUID_DEFS + +#ifndef GUID_DEFS_ONLY + +// +// max length of device friendly name. +// +#define BTH_MAX_NAME_SIZE (248) + +#define BTH_MAX_PIN_SIZE (16) +#define BTH_LINK_KEY_LENGTH (16) + +#define BTH_MFG_ERICSSON (0) +#define BTH_MFG_NOKIA (1) +#define BTH_MFG_INTEL (2) +#define BTH_MFG_IBM (3) +#define BTH_MFG_TOSHIBA (4) +#define BTH_MFG_3COM (5) +#define BTH_MFG_MICROSOFT (6) +#define BTH_MFG_LUCENT (7) +#define BTH_MFG_MOTOROLA (8) +#define BTH_MFG_INFINEON (9) +#define BTH_MFG_CSR (10) +#define BTH_MFG_SILICONWAVE (11) +#define BTH_MFG_DIGIANSWER (12) +#define BTH_MFG_TI (13) +#define BTH_MFG_PARTHUS (14) +#define BTH_MFG_BROADCOM (15) +#define BTH_MFG_MITEL (16) +#define BTH_MFG_WIDCOMM (17) +#define BTH_MFG_ZEEVO (18) +#define BTH_MFG_ATMEL (19) +#define BTH_MFG_MITSIBUSHI (20) +#define BTH_MFG_RTX_TELECOM (21) +#define BTH_MFG_KC_TECHNOLOGY (22) +#define BTH_MFG_NEWLOGIC (23) +#define BTH_MFG_TRANSILICA (24) +#define BTH_MFG_ROHDE_SCHWARZ (25) +#define BTH_MFG_TTPCOM (26) +#define BTH_MFG_SIGNIA (27) +#define BTH_MFG_CONEXANT (28) +#define BTH_MFG_QUALCOMM (29) +#define BTH_MFG_INVENTEL (30) +#define BTH_MFG_AVM_BERLIN (31) +#define BTH_MFG_BANDSPEED (32) +#define BTH_MFG_MANSELLA (33) +#define BTH_MFG_NEC (34) +#define BTH_MFG_WAVEPLUS_TECHNOLOGY_CO (35) +#define BTH_MFG_ALCATEL (36) +#define BTH_MFG_PHILIPS_SEMICONDUCTOR (37) +#define BTH_MFG_C_TECHNOLOGIES (38) +#define BTH_MFG_OPEN_INTERFACE (39) +#define BTH_MFG_RF_MICRO_DEVICES (40) +#define BTH_MFG_HITACHI (41) +#define BTH_MFG_SYMBOL_TECHNOLOGIES (42) +#define BTH_MFG_TENOVIS (43) +#define BTH_MFG_MACRONIX_INTERNATIONAL (44) +#define BTH_MFG_INTERNAL_USE (65535) + +typedef ULONGLONG BTH_ADDR, *PBTH_ADDR; +typedef ULONG BTH_COD, *PBTH_COD; +typedef ULONG BTH_LAP, *PBTH_LAP; + +#define BTH_ADDR_NULL ((ULONGLONG) 0x0000000000000000) + +#define NAP_MASK ((ULONGLONG) 0xFFFF00000000) +#define SAP_MASK ((ULONGLONG) 0x0000FFFFFFFF) + +#define NAP_BIT_OFFSET (8 * 4) +#define SAP_BIT_OFFSET (0) + +#define GET_NAP(_bth_addr) ((USHORT) (((_bth_addr) & NAP_MASK) >> NAP_BIT_OFFSET)) +#define GET_SAP(_bth_addr) ((ULONG) (((_bth_addr) & SAP_MASK) >> SAP_BIT_OFFSET)) + +#define SET_NAP(_nap) (((ULONGLONG) ((USHORT) (_nap))) << NAP_BIT_OFFSET) +#define SET_SAP(_sap) (((ULONGLONG) ((ULONG) (_sap))) << SAP_BIT_OFFSET) + +#define SET_NAP_SAP(_nap, _sap) (SET_NAP(_nap) | SET_SAP(_sap)) + +#define COD_FORMAT_BIT_OFFSET (0) +#define COD_MINOR_BIT_OFFSET (2) +#define COD_MAJOR_BIT_OFFSET (8 * 1) +#define COD_SERVICE_BIT_OFFSET (8 * 1 + 5) + +#define COD_FORMAT_MASK (0x000003) +#define COD_MINOR_MASK (0x0000FC) +#define COD_MAJOR_MASK (0x001F00) +#define COD_SERVICE_MASK (0xFFE000) + + +#define GET_COD_FORMAT(_cod) ( (_cod) & COD_FORMAT_MASK >> COD_FORMAT_BIT_OFFSET) +#define GET_COD_MINOR(_cod) (((_cod) & COD_MINOR_MASK) >> COD_MINOR_BIT_OFFSET) +#define GET_COD_MAJOR(_cod) (((_cod) & COD_MAJOR_MASK) >> COD_MAJOR_BIT_OFFSET) +#define GET_COD_SERVICE(_cod) (((_cod) & COD_SERVICE_MASK) >> COD_SERVICE_BIT_OFFSET) + +#define SET_COD_MINOR(_cod, _minor) (_cod) = ((_cod) & ~COD_MINOR_MASK) | ((_minor) << COD_MINOR_BIT_OFFSET) +#define SET_COD_MAJOR(_cod, _major) (_cod) = ((_cod) & ~COD_MAJOR_MASK) | ((_major) << COD_MAJOR_BIT_OFFSET) +#define SET_COD_SERVICE(_cod, _service) (_cod) = ((_cod) & ~COD_SERVICE_MASK) | ((_service) << COD_SERVICE_BIT_OFFSET) + +#define COD_VERSION (0x0) + +#define COD_SERVICE_LIMITED (0x0001) +#define COD_SERVICE_POSITIONING (0x0008) +#define COD_SERVICE_NETWORKING (0x0010) +#define COD_SERVICE_RENDERING (0x0020) +#define COD_SERVICE_CAPTURING (0x0040) +#define COD_SERVICE_OBJECT_XFER (0x0080) +#define COD_SERVICE_AUDIO (0x0100) +#define COD_SERVICE_TELEPHONY (0x0200) +#define COD_SERVICE_INFORMATION (0x0400) + +#define COD_SERVICE_VALID_MASK (COD_SERVICE_LIMITED | \ + COD_SERVICE_POSITIONING | \ + COD_SERVICE_NETWORKING | \ + COD_SERVICE_RENDERING | \ + COD_SERVICE_CAPTURING | \ + COD_SERVICE_OBJECT_XFER |\ + COD_SERVICE_AUDIO |\ + COD_SERVICE_TELEPHONY |\ + COD_SERVICE_INFORMATION) + +#define COD_SERVICE_MAX_COUNT (9) + +// +// Major class codes +// +#define COD_MAJOR_MISCELLANEOUS (0x00) +#define COD_MAJOR_COMPUTER (0x01) +#define COD_MAJOR_PHONE (0x02) +#define COD_MAJOR_LAN_ACCESS (0x03) +#define COD_MAJOR_AUDIO (0x04) +#define COD_MAJOR_PERIPHERAL (0x05) +#define COD_MAJOR_IMAGING (0x06) +#define COD_MAJOR_UNCLASSIFIED (0x1F) + +// +// Minor class codes specific to each major class +// +#define COD_COMPUTER_MINOR_UNCLASSIFIED (0x00) +#define COD_COMPUTER_MINOR_DESKTOP (0x01) +#define COD_COMPUTER_MINOR_SERVER (0x02) +#define COD_COMPUTER_MINOR_LAPTOP (0x03) +#define COD_COMPUTER_MINOR_HANDHELD (0x04) +#define COD_COMPUTER_MINOR_PALM (0x05) +#define COD_COMPUTER_MINOR_WEARABLE (0x06) + +#define COD_PHONE_MINOR_UNCLASSIFIED (0x00) +#define COD_PHONE_MINOR_CELLULAR (0x01) +#define COD_PHONE_MINOR_CORDLESS (0x02) +#define COD_PHONE_MINOR_SMART (0x03) +#define COD_PHONE_MINOR_WIRED_MODEM (0x04) + +#define COD_AUDIO_MINOR_UNCLASSIFIED (0x00) +#define COD_AUDIO_MINOR_HEADSET (0x01) +#define COD_AUDIO_MINOR_HANDS_FREE (0x02) +#define COD_AUDIO_MINOR_HEADSET_HANDS_FREE (0x03) +#define COD_AUDIO_MINOR_MICROPHONE (0x04) +#define COD_AUDIO_MINOR_LOUDSPEAKER (0x05) +#define COD_AUDIO_MINOR_HEADPHONES (0x06) +#define COD_AUDIO_MINOR_PORTABLE_AUDIO (0x07) +#define COD_AUDIO_MINOR_CAR_AUDIO (0x08) +#define COD_AUDIO_MINOR_SET_TOP_BOX (0x09) +#define COD_AUDIO_MINOR_HIFI_AUDIO (0x0A) +#define COD_AUDIO_MINOR_VCR (0x0B) +#define COD_AUDIO_MINOR_VIDEO_CAMERA (0x0C) +#define COD_AUDIO_MINOR_CAMCORDER (0x0D) +#define COD_AUDIO_MINOR_VIDEO_MONITOR (0x0E) +#define COD_AUDIO_MINOR_VIDEO_DISPLAY_LOUDSPEAKER \ + (0x0F) +#define COD_AUDIO_MINOR_VIDEO_DISPLAY_CONFERENCING \ + (0x10) +// #define COD_AUDIO_MINOR_RESERVED (0x11) +#define COD_AUDIO_MINOR_GAMING_TOY (0x12) + +#define COD_PERIPHERAL_MINOR_KEYBOARD_MASK (0x10) +#define COD_PERIPHERAL_MINOR_POINTER_MASK (0x20) + +#define COD_PERIPHERAL_MINOR_NO_CATEGORY (0x00) +#define COD_PERIPHERAL_MINOR_JOYSTICK (0x01) +#define COD_PERIPHERAL_MINOR_GAMEPAD (0x02) +#define COD_PERIPHERAL_MINOR_REMOTE_CONTROL (0x03) +#define COD_PERIPHERAL_MINOR_SENSING (0x04) + +#define COD_IMAGING_MINOR_DISPLAY_MASK (0x04) +#define COD_IMAGING_MINOR_CAMERA_MASK (0x08) +#define COD_IMAGING_MINOR_SCANNER_MASK (0x10) +#define COD_IMAGING_MINOR_PRINTER_MASK (0x20) + +// +// Cannot use GET_COD_MINOR for this b/c it is embedded in a different manner +// than the rest of the major classes +// + +#define COD_LAN_ACCESS_BIT_OFFSET (5) + +#define COD_LAN_MINOR_MASK (0x00001C) +#define COD_LAN_ACCESS_MASK (0x0000E0) + +#define GET_COD_LAN_MINOR(_cod) (((_cod) & COD_LAN_MINOR_MASK) >> COD_MINOR_BIT_OFFSET) +#define GET_COD_LAN_ACCESS(_cod) (((_cod) & COD_LAN_ACCESS_MASK) >> COD_LAN_ACCESS_BIT_OFFSET) + +// +// LAN access percent usage subcodes +// +#define COD_LAN_MINOR_UNCLASSIFIED (0x00) + +#define COD_LAN_ACCESS_0_USED (0x00) +#define COD_LAN_ACCESS_17_USED (0x01) +#define COD_LAN_ACCESS_33_USED (0x02) +#define COD_LAN_ACCESS_50_USED (0x03) +#define COD_LAN_ACCESS_67_USED (0x04) +#define COD_LAN_ACCESS_83_USED (0x05) +#define COD_LAN_ACCESS_99_USED (0x06) +#define COD_LAN_ACCESS_FULL (0x07) + +// +// Used as an initializer of LAP_DATA +// +#define LAP_GIAC_INIT { 0x33, 0x8B, 0x9E } +#define LAP_LIAC_INIT { 0x00, 0x8B, 0x9E } + +// +// General Inquiry Access Code. +// +#define LAP_GIAC_VALUE (0x009E8B33) + +// +// Limited Inquiry Access Code. +// +#define LAP_LIAC_VALUE (0x009E8B00) + +#define BTH_ADDR_IAC_FIRST (0x9E8B00) +#define BTH_ADDR_IAC_LAST (0x9E8B3f) +#define BTH_ADDR_LIAC (0x9E8B00) +#define BTH_ADDR_GIAC (0x9E8B33) + +typedef UCHAR BTHSTATUS, *PBTHSTATUS; + +#define BTH_ERROR(_btStatus) ((_btStatus) != BTH_ERROR_SUCCESS) +#define BTH_SUCCESS(_btStatus) ((_btStatus) == BTH_ERROR_SUCCESS) + +#define BTH_ERROR_SUCCESS (0x00) +#define BTH_ERROR_UNKNOWN_HCI_COMMAND (0x01) +#define BTH_ERROR_NO_CONNECTION (0x02) +#define BTH_ERROR_HARDWARE_FAILURE (0x03) +#define BTH_ERROR_PAGE_TIMEOUT (0x04) +#define BTH_ERROR_AUTHENTICATION_FAILURE (0x05) +#define BTH_ERROR_KEY_MISSING (0x06) +#define BTH_ERROR_MEMORY_FULL (0x07) +#define BTH_ERROR_CONNECTION_TIMEOUT (0x08) +#define BTH_ERROR_MAX_NUMBER_OF_CONNECTIONS (0x09) +#define BTH_ERROR_MAX_NUMBER_OF_SCO_CONNECTIONS (0x0a) +#define BTH_ERROR_ACL_CONNECTION_ALREADY_EXISTS (0x0b) +#define BTH_ERROR_COMMAND_DISALLOWED (0x0c) +#define BTH_ERROR_HOST_REJECTED_LIMITED_RESOURCES (0x0d) +#define BTH_ERROR_HOST_REJECTED_SECURITY_REASONS (0x0e) +#define BTH_ERROR_HOST_REJECTED_PERSONAL_DEVICE (0x0f) +#define BTH_ERROR_HOST_TIMEOUT (0x10) +#define BTH_ERROR_UNSUPPORTED_FEATURE_OR_PARAMETER (0x11) +#define BTH_ERROR_INVALID_HCI_PARAMETER (0x12) +#define BTH_ERROR_REMOTE_USER_ENDED_CONNECTION (0x13) +#define BTH_ERROR_REMOTE_LOW_RESOURCES (0x14) +#define BTH_ERROR_REMOTE_POWERING_OFF (0x15) +#define BTH_ERROR_LOCAL_HOST_TERMINATED_CONNECTION (0x16) +#define BTH_ERROR_REPEATED_ATTEMPTS (0x17) +#define BTH_ERROR_PAIRING_NOT_ALLOWED (0x18) +#define BTH_ERROR_UKNOWN_LMP_PDU (0x19) +#define BTH_ERROR_UNSUPPORTED_REMOTE_FEATURE (0x1a) +#define BTH_ERROR_SCO_OFFSET_REJECTED (0x1b) +#define BTH_ERROR_SCO_INTERVAL_REJECTED (0x1c) +#define BTH_ERROR_SCO_AIRMODE_REJECTED (0x1d) +#define BTH_ERROR_INVALID_LMP_PARAMETERS (0x1e) +#define BTH_ERROR_UNSPECIFIED_ERROR (0x1f) +#define BTH_ERROR_UNSUPPORTED_LMP_PARM_VALUE (0x20) +#define BTH_ERROR_ROLE_CHANGE_NOT_ALLOWED (0x21) +#define BTH_ERROR_LMP_RESPONSE_TIMEOUT (0x22) +#define BTH_ERROR_LMP_TRANSACTION_COLLISION (0x23) +#define BTH_ERROR_LMP_PDU_NOT_ALLOWED (0x24) +#define BTH_ERROR_ENCRYPTION_MODE_NOT_ACCEPTABLE (0x25) +#define BTH_ERROR_UNIT_KEY_NOT_USED (0x26) +#define BTH_ERROR_QOS_IS_NOT_SUPPORTED (0x27) +#define BTH_ERROR_INSTANT_PASSED (0x28) +#define BTH_ERROR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED (0x29) + +#define BTH_ERROR_UNSPECIFIED (0xFF) + +// +// Min, max, and default L2cap MTU. +// +#define L2CAP_MIN_MTU (48) +#define L2CAP_MAX_MTU (0xFFFF) +#define L2CAP_DEFAULT_MTU (672) + +// +// Max l2cap signal size (48) - size of signal header (4) +// +#define MAX_L2CAP_PING_DATA_LENGTH (44) +#define MAX_L2CAP_INFO_DATA_LENGTH (44) + +// +// the following two structures provides information about +// disocvered remote radios. +// + +#define BDIF_ADDRESS (0x00000001) +#define BDIF_COD (0x00000002) +#define BDIF_NAME (0x00000004) +#define BDIF_PAIRED (0x00000008) +#define BDIF_PERSONAL (0x00000010) +#define BDIF_CONNECTED (0x00000020) + +#define BDIF_VALID_FLAGS \ + (BDIF_ADDRESS | BDIF_COD | BDIF_NAME | BDIF_PAIRED | BDIF_PERSONAL | \ + BDIF_CONNECTED) + +typedef struct _BTH_DEVICE_INFO { + // + // Combination BDIF_Xxx flags + // + ULONG flags; + + // + // Address of remote device. + // + BTH_ADDR address; + + // + // Class Of Device. + // + BTH_COD classOfDevice; + + // + // name of the device + // + CHAR name[BTH_MAX_NAME_SIZE]; + +} BTH_DEVICE_INFO, *PBTH_DEVICE_INFO; + +// +// Buffer associated with GUID_BLUETOOTH_RADIO_IN_RANGE +// +typedef struct _BTH_RADIO_IN_RANGE { + // + // Information about the remote radio + // + BTH_DEVICE_INFO deviceInfo; + + // + // The previous flags value for the BTH_DEVICE_INFO. The receiver of this + // notification can compare the deviceInfo.flags and previousDeviceFlags + // to determine what has changed about this remote radio. + // + // For instance, if BDIF_NAME is set in deviceInfo.flags and not in + // previousDeviceFlags, the remote radio's has just been retrieved. + // + ULONG previousDeviceFlags; + +} BTH_RADIO_IN_RANGE, *PBTH_RADIO_IN_RANGE; + +// +// Buffer associated with GUID_BLUETOOTH_L2CAP_EVENT +// +typedef struct _BTH_L2CAP_EVENT_INFO { + // + // Remote radio address which the L2CAP event is associated with + // + BTH_ADDR bthAddress; + + // + // The PSM that is either being connected to or disconnected from + // + USHORT psm; + + // + // If != 0, then the channel has just been established. If == 0, then the + // channel has been destroyed. Notifications for a destroyed channel will + // only be sent for channels successfully established. + // + UCHAR connected; + + // + // If != 0, then the local host iniated the l2cap connection. If == 0, then + // the remote host initated the connection. This field is only valid if + // connect is != 0. + // + UCHAR initiated; + +} BTH_L2CAP_EVENT_INFO, *PBTH_L2CAP_EVENT_INFO; + +#define HCI_CONNNECTION_TYPE_ACL (1) +#define HCI_CONNNECTION_TYPE_SCO (2) + +// +// Buffer associated with GUID_BLUETOOTH_HCI_EVENT +// +typedef struct _BTH_HCI_EVENT_INFO { + // + // Remote radio address which the HCI event is associated with + // + BTH_ADDR bthAddress; + + // + // HCI_CONNNECTION_TYPE_XXX value + // + UCHAR connectionType; + + // + // If != 0, then the underlying connection to the remote radio has just + // been estrablished. If == 0, then the underlying conneciton has just been + // destroyed. + // + UCHAR connected; + +} BTH_HCI_EVENT_INFO, *PBTH_HCI_EVENT_INFO; + +#define MAX_UUIDS_IN_QUERY (12) + +#define BTH_VID_DEFAULT_VALUE (0xFFFF) + +#define SDP_ERROR_INVALID_SDP_VERSION (0x0001) +#define SDP_ERROR_INVALID_RECORD_HANDLE (0x0002) +#define SDP_ERROR_INVALID_REQUEST_SYNTAX (0x0003) +#define SDP_ERROR_INVALID_PDU_SIZE (0x0004) +#define SDP_ERROR_INVALID_CONTINUATION_STATE (0x0005) +#define SDP_ERROR_INSUFFICIENT_RESOURCES (0x0006) + +// +// Defined by windows to handle server errors that are not described by the +// above errors. Start at 0x0100 so we don't go anywhere near the spec +// defined values. +// + +// +// Success, nothing went wrong +// +#define SDP_ERROR_SUCCESS ((SDP_ERROR) 0x0000) + +// +// The SDP PDU or parameters other than the SDP stream response was not correct +// +#define SDP_ERROR_SERVER_INVALID_RESPONSE ((SDP_ERROR) 0x0100) + +// +// The SDP response stream did not parse correctly. +// +#define SDP_ERROR_SERVER_RESPONSE_DID_NOT_PARSE ((SDP_ERROR) 0x0200) + +// +// The SDP response stream was successfully parsed, but did not match the +// required format for the query. +// +#define SDP_ERROR_SERVER_BAD_FORMAT ((SDP_ERROR) 0x0300) + +// +// SDP was unable to send a continued query back to the server +// +#define SDP_ERROR_COULD_NOT_SEND_CONTINUE ((SDP_ERROR) 0x0400) + +// +// Server sent a response that was too large to fit in the caller's buffer. +// +#define SDP_ERROR_RESPONSE_TOO_LARGE ((SDP_ERROR) 0x0500) + + +#define SDP_ATTRIB_RECORD_HANDLE (0x0000) +#define SDP_ATTRIB_CLASS_ID_LIST (0x0001) +#define SDP_ATTRIB_RECORD_STATE (0x0002) +#define SDP_ATTRIB_SERVICE_ID (0x0003) +#define SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST (0x0004) +#define SDP_ATTRIB_BROWSE_GROUP_LIST (0x0005) +#define SDP_ATTRIB_LANG_BASE_ATTRIB_ID_LIST (0x0006) +#define SDP_ATTRIB_INFO_TIME_TO_LIVE (0x0007) +#define SDP_ATTRIB_AVAILABILITY (0x0008) +#define SDP_ATTRIB_PROFILE_DESCRIPTOR_LIST (0x0009) +#define SDP_ATTRIB_DOCUMENTATION_URL (0x000A) +#define SDP_ATTRIB_CLIENT_EXECUTABLE_URL (0x000B) +#define SDP_ATTRIB_ICON_URL (0x000C) +#define SDP_ATTRIB_ADDITIONAL_PROTOCOL_DESCRIPTOR_LIST \ + (0x000D) + +// +// Attribute IDs in the range of 0x000D - 0x01FF are reserved for future use +// +#define SDP_ATTRIB_PROFILE_SPECIFIC (0x0200) + +#define LANG_BASE_LANGUAGE_INDEX (0x0000) +#define LANG_BASE_ENCODING_INDEX (0x0001) +#define LANG_BASE_OFFSET_INDEX (0x0002) +#define LANG_DEFAULT_ID (0x0100) + +#define STRING_NAME_OFFSET (0x0000) +#define STRING_DESCRIPTION_OFFSET (0x0001) +#define STRING_PROVIDER_NAME_OFFSET (0x0002) + +#define SDP_ATTRIB_SDP_VERSION_NUMBER_LIST (0x0200) +#define SDP_ATTRIB_SDP_DATABASE_STATE (0x0201) + +#define SDP_ATTRIB_BROWSE_GROUP_ID (0x0200) + +#define SDP_ATTRIB_CORDLESS_EXTERNAL_NETWORK (0x0301) + +#define SDP_ATTRIB_FAX_CLASS_1_SUPPORT (0x0302) +#define SDP_ATTRIB_FAX_CLASS_2_0_SUPPORT (0x0303) +#define SDP_ATTRIB_FAX_CLASS_2_SUPPORT (0x0304) +#define SDP_ATTRIB_FAX_AUDIO_FEEDBACK_SUPPORT (0x0305) + +#define SDP_ATTRIB_HEADSET_REMOTE_AUDIO_VOLUME_CONTROL (0x0302) + +#define SDP_ATTRIB_LAN_LPSUBNET (0x0200) + +#define SDP_ATTRIB_OBJECT_PUSH_SUPPORTED_FORMATS_LIST (0x0303) + +#define SDP_ATTRIB_SYNCH_SUPPORTED_DATA_STORES_LIST (0x0301) + +// this is in the assigned numbers doc, but it does not show up in any profile +#define SDP_ATTRIB_SERVICE_VERSION (0x0300) + +#define SDP_ATTRIB_PAN_NETWORK_ADDRESS (0x0306) +#define SDP_ATTRIB_PAN_WAP_GATEWAY (0x0307) +#define SDP_ATTRIB_PAN_HOME_PAGE_URL (0x0308) +#define SDP_ATTRIB_PAN_WAP_STACK_TYPE (0x0309) +#define SDP_ATTRIB_PAN_SECURITY_DESCRIPTION (0x030A) +#define SDP_ATTRIB_PAN_NET_ACCESS_TYPE (0x030B) +#define SDP_ATTRIB_PAN_MAX_NET_ACCESS_RATE (0x030C) + +#define SDP_ATTRIB_IMAGING_SUPPORTED_CAPABILITIES (0x0310) +#define SDP_ATTRIB_IMAGING_SUPPORTED_FEATURES (0x0311) +#define SDP_ATTRIB_IMAGING_SUPPORTED_FUNCTIONS (0x0312) +#define SDP_ATTRIB_IMAGING_TOTAL_DATA_CAPACITY (0x0313) + +#define SDP_ATTRIB_DI_SPECIFICATION_ID (0x0200) +#define SDP_ATTRIB_DI_VENDOR_ID (0x0201) +#define SDP_ATTRIB_DI_PRODUCT_ID (0x0202) +#define SDP_ATTRIB_DI_VERSION (0x0203) +#define SDP_ATTRIB_DI_PRIMARY_RECORD (0x0204) +#define SDP_ATTRIB_DI_VENDOR_ID_SOURCE (0x0205) + +#define SDP_ATTRIB_HID_DEVICE_RELEASE_NUMBER (0x0200) +#define SDP_ATTRIB_HID_PARSER_VERSION (0x0201) +#define SDP_ATTRIB_HID_DEVICE_SUBCLASS (0x0202) +#define SDP_ATTRIB_HID_COUNTRY_CODE (0x0203) +#define SDP_ATTRIB_HID_VIRTUAL_CABLE (0x0204) +#define SDP_ATTRIB_HID_RECONNECT_INITIATE (0x0205) +#define SDP_ATTRIB_HID_DESCRIPTOR_LIST (0x0206) +#define SDP_ATTRIB_HID_LANG_ID_BASE_LIST (0x0207) +#define SDP_ATTRIB_HID_SDP_DISABLE (0x0208) +#define SDP_ATTRIB_HID_BATTERY_POWER (0x0209) +#define SDP_ATTRIB_HID_REMOTE_WAKE (0x020A) +#define SDP_ATTRIB_HID_REPORT_LIST (0x020B) +#define SDP_ATTRIB_HID_SUPERVISION_TIMEOUT (0x020C) +#define SDP_ATTRIB_HID_NORMALLY_CONNECTABLE (0x020D) +#define SDP_ATTRIB_HID_BOOT_DEVICE (0x020E) + +// +// Profile specific values +// +#define CORDLESS_EXTERNAL_NETWORK_PSTN (0x01) +#define CORDLESS_EXTERNAL_NETWORK_ISDN (0x02) +#define CORDLESS_EXTERNAL_NETWORK_GSM (0x03) +#define CORDLESS_EXTERNAL_NETWORK_CDMA (0x04) +#define CORDLESS_EXTERNAL_NETWORK_ANALOG_CELLULAR (0x05) +#define CORDLESS_EXTERNAL_NETWORK_PACKET_SWITCHED (0x06) +#define CORDLESS_EXTERNAL_NETWORK_OTHER (0x07) + +#define OBJECT_PUSH_FORMAT_VCARD_2_1 (0x01) +#define OBJECT_PUSH_FORMAT_VCARD_3_0 (0x02) +#define OBJECT_PUSH_FORMAT_VCAL_1_0 (0x03) +#define OBJECT_PUSH_FORMAT_ICAL_2_0 (0x04) +#define OBJECT_PUSH_FORMAT_VNOTE (0x05) +#define OBJECT_PUSH_FORMAT_VMESSAGE (0x06) +#define OBJECT_PUSH_FORMAT_ANY (0xFF) + +#define SYNCH_DATA_STORE_PHONEBOOK (0x01) +#define SYNCH_DATA_STORE_CALENDAR (0x03) +#define SYNCH_DATA_STORE_NOTES (0x05) +#define SYNCH_DATA_STORE_MESSAGES (0x06) + +#define DI_VENDOR_ID_SOURCE_BLUETOOTH_SIG (0x0001) +#define DI_VENDOR_ID_SOURCE_USB_IF (0x0002) + +#define PSM_SDP (0x0001) +#define PSM_RFCOMM (0x0003) +#define PSM_TCS_BIN (0x0005) +#define PSM_TCS_BIN_CORDLESS (0x0007) +#define PSM_BNEP (0x000F) +#define PSM_HID_CONTROL (0x0011) +#define PSM_HID_INTERRUPT (0x0013) +#define PSM_AVCTP (0x0017) +#define PSM_AVDTP (0x0019) +#define PSM_UDI_C_PLANE (0x001D) + +// +// Strings +// +#define STR_ADDR_FMTA "(%02x:%02x:%02x:%02x:%02x:%02x)" +#define STR_ADDR_FMTW L"(%02x:%02x:%02x:%02x:%02x:%02x)" + +#define STR_ADDR_SHORT_FMTA "%04x%08x" +#define STR_ADDR_SHORT_FMTW L"%04x%08x" + +#if defined(UNICODE) || defined(BTH_KERN) + +#define STR_ADDR_FMT STR_ADDR_FMTW +#define STR_ADDR_SHORT_FMT STR_ADDR_SHORT_FMTW + +#else // UNICODE + +#define STR_ADDR_FMT STR_ADDR_FMTA +#define STR_ADDR_SHORT_FMT STR_ADDR_SHORT_FMTA + +#endif // UNICODE + +#define GET_BITS(field,offset,mask) ( ( (field) >> (offset) ) & (mask) ) +#define GET_BIT(field,offset) ( GET_BITS(field,offset,0x1) ) + +#define LMP_3_SLOT_PACKETS(x) (GET_BIT(x, 0)) +#define LMP_5_SLOT_PACKETS(x) (GET_BIT(x, 1)) +#define LMP_ENCRYPTION(x) (GET_BIT(x, 2)) +#define LMP_SLOT_OFFSET(x) (GET_BIT(x, 3)) +#define LMP_TIMING_ACCURACY(x) (GET_BIT(x, 4)) +#define LMP_SWITCH(x) (GET_BIT(x, 5)) +#define LMP_HOLD_MODE(x) (GET_BIT(x, 6)) +#define LMP_SNIFF_MODE(x) (GET_BIT(x, 7)) +#define LMP_PARK_MODE(x) (GET_BIT(x, 8)) +#define LMP_RSSI(x) (GET_BIT(x, 9)) +#define LMP_CHANNEL_QUALITY_DRIVEN_MODE(x) (GET_BIT(x,10)) +#define LMP_SCO_LINK(x) (GET_BIT(x,11)) +#define LMP_HV2_PACKETS(x) (GET_BIT(x,12)) +#define LMP_HV3_PACKETS(x) (GET_BIT(x,13)) +#define LMP_MU_LAW_LOG(x) (GET_BIT(x,14)) +#define LMP_A_LAW_LOG(x) (GET_BIT(x,15)) +#define LMP_CVSD(x) (GET_BIT(x,16)) +#define LMP_PAGING_SCHEME(x) (GET_BIT(x,17)) +#define LMP_POWER_CONTROL(x) (GET_BIT(x,18)) +#define LMP_TRANSPARENT_SCO_DATA(x) (GET_BIT(x,19)) +#define LMP_FLOW_CONTROL_LAG(x) (GET_BITS(x,20,0x3)) + +#endif // GUID_DEFS_ONLY + +#endif // __BTHDEF_H__ diff --git a/cpp/wiiscan/include/bthsdpdef.h b/cpp/wiiscan/include/bthsdpdef.h new file mode 100644 index 0000000..1764816 --- /dev/null +++ b/cpp/wiiscan/include/bthsdpdef.h @@ -0,0 +1,111 @@ +#ifndef __BTHSDPDEF_H__ +#define __BTHSDPDEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct SDP_LARGE_INTEGER_16 { + ULONGLONG LowPart; + LONGLONG HighPart; +}; + + +struct SDP_ULARGE_INTEGER_16 { + ULONGLONG LowPart; + ULONGLONG HighPart; +}; + +typedef struct SDP_ULARGE_INTEGER_16 SDP_ULARGE_INTEGER_16, *PSDP_ULARGE_INTEGER_16, *LPSDP_ULARGE_INTEGER_16; +typedef struct SDP_LARGE_INTEGER_16 SDP_LARGE_INTEGER_16, *PSDP_LARGE_INTEGER_16, *LPSDP_LARGE_INTEGER_16; + +enum NodeContainerType { + NodeContainerTypeSequence, + NodeContainerTypeAlternative +}; + +typedef enum NodeContainerType NodeContainerType; + +typedef USHORT SDP_ERROR, *PSDP_ERROR; + +enum SDP_TYPE { + SDP_TYPE_NIL = 0x00, + SDP_TYPE_UINT = 0x01, + SDP_TYPE_INT = 0x02, + SDP_TYPE_UUID = 0x03, + SDP_TYPE_STRING = 0x04, + SDP_TYPE_BOOLEAN = 0x05, + SDP_TYPE_SEQUENCE = 0x06, + SDP_TYPE_ALTERNATIVE = 0x07, + SDP_TYPE_URL = 0x08, + SDP_TYPE_CONTAINER = 0x20 +}; +// 9 - 31 are reserved +typedef enum SDP_TYPE SDP_TYPE; + +// allow for a little easier type checking / sizing for integers and UUIDs +// ((SDP_ST_XXX & 0xF0) >> 4) == SDP_TYPE_XXX +// size of the data (in bytes) is encoded as ((SDP_ST_XXX & 0xF0) >> 8) +enum SDP_SPECIFICTYPE { + SDP_ST_NONE = 0x0000, + + SDP_ST_UINT8 = 0x0010, + SDP_ST_UINT16 = 0x0110, + SDP_ST_UINT32 = 0x0210, + SDP_ST_UINT64 = 0x0310, + SDP_ST_UINT128 = 0x0410, + + SDP_ST_INT8 = 0x0020, + SDP_ST_INT16 = 0x0120, + SDP_ST_INT32 = 0x0220, + SDP_ST_INT64 = 0x0320, + SDP_ST_INT128 = 0x0420, + + SDP_ST_UUID16 = 0x0130, + SDP_ST_UUID32 = 0x0220, + SDP_ST_UUID128 = 0x0430 +}; +typedef enum SDP_SPECIFICTYPE SDP_SPECIFICTYPE; + +typedef struct _SdpAttributeRange { + USHORT minAttribute; + USHORT maxAttribute; +} SdpAttributeRange; + + +typedef +#ifdef USE_MIDL_SYNTAX + [switch_type(unsigned short)] +#endif + union SdpQueryUuidUnion { +#ifdef USE_MIDL_SYNTAX + [case(SDP_ST_UUID128)] +#endif + GUID uuid128; + +#ifdef USE_MIDL_SYNTAX + [case(SDP_ST_UUID32)] +#endif _NTDDK_ + ULONG uuid32; + +#ifdef USE_MIDL_SYNTAX + [case(SDP_ST_UUID16)] +#endif _NTDDK_ + USHORT uuid16; +} SdpQueryUuidUnion; + +typedef struct _SdpQueryUuid { +#ifdef USE_MIDL_SYNTAX + [switch_is(uuidType)] +#endif + SdpQueryUuidUnion u; + + USHORT uuidType; +} SdpQueryUuid; + + +#ifdef __cplusplus +}; +#endif + +#endif // __BTHSDPDEF_H__ diff --git a/cpp/wiiscan/include/wiiuse.h b/cpp/wiiscan/include/wiiuse.h index 9dff81c..bd3c27f 100644 --- a/cpp/wiiscan/include/wiiuse.h +++ b/cpp/wiiscan/include/wiiuse.h @@ -128,6 +128,7 @@ #define EXP_NUNCHUK 1 #define EXP_CLASSIC 2 #define EXP_GUITAR_HERO_3 3 +#define EXP_BALANCE_BOARD 4 /* IR correction types */ typedef enum ir_position_t { @@ -371,6 +372,17 @@ typedef struct ir_t { } ir_t; +/** + * @struct speaker_t + */ +typedef struct speaker_t { + byte format; + byte rate; + byte freq; + byte vol; +} speaker_t; + + /** * @struct joystick_t * @brief Joystick calibration structure. @@ -451,6 +463,34 @@ typedef struct guitar_hero_3_t { } guitar_hero_3_t; +/** + * @struct balance_board_data_t + * @brief Balance board l/r, t/b corner data data. + */ +typedef struct balance_board_data_t { + int tr; + int br; + int tl; + int bl; +} balance_board_data_t; + + +/** + * @struct balance_board_t + * @brief Balance board expansion device. + */ +typedef struct balance_board_t { + float tr; /** Top Right weight */ + float br; /** Bottom Right weight */ + float tl; /** Top Left weight */ + float bl; /** Bottom Left weight */ + struct balance_board_data_t raw; /** Raw actual values */ + struct balance_board_data_t cal_0; /** Calibration values at 0kg */ + struct balance_board_data_t cal_17; /** Calibration values at 17kg */ + struct balance_board_data_t cal_34; /** Calibration values at 34kg */ +} balance_board_t; + + /** * @struct expansion_t * @brief Generic expansion device plugged into wiimote. @@ -462,6 +502,7 @@ typedef struct expansion_t { struct nunchuk_t nunchuk; struct classic_ctrl_t classic; struct guitar_hero_3_t gh3; + struct balance_board_t bb; }; } expansion_t; @@ -492,6 +533,7 @@ typedef struct wiimote_state_t { struct vec3b_t exp_accel; float exp_r_shoulder; float exp_l_shoulder; + struct balance_board_data_t exp_bb_raw; /* ir_t */ int ir_ax; @@ -522,7 +564,9 @@ typedef enum WIIUSE_EVENT_TYPE { WIIUSE_CLASSIC_CTRL_INSERTED, WIIUSE_CLASSIC_CTRL_REMOVED, WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED + WIIUSE_GUITAR_HERO_3_CTRL_REMOVED, + WIIUSE_BALANCE_BOARD_CTRL_INSERTED, + WIIUSE_BALANCE_BOARD_CTRL_REMOVED } WIIUSE_EVENT_TYPE; /** @@ -563,6 +607,7 @@ typedef struct wiimote_t { WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ WCONST struct ir_t ir; /**< IR data */ + WCONST struct speaker_t speaker; /**< speaker */ WCONST unsigned short btns; /**< what buttons have just been pressed */ WCONST unsigned short btns_held; /**< what buttons are being held down */ @@ -643,6 +688,18 @@ WIIUSE_EXPORT extern void wiiuse_set_ir_sensitivity(struct wiimote_t* wm, int le WIIUSE_EXPORT extern void wiiuse_set_nunchuk_orient_threshold(struct wiimote_t* wm, float threshold); WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct wiimote_t* wm, int threshold); +/* speaker.c */ +WIIUSE_EXPORT extern void wiiuse_speaker_enable(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_disable(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_mute(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_unmute(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_activate(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_deactivate(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_format(struct wiimote_t* wm, byte format); +WIIUSE_EXPORT extern void wiiuse_speaker_volume(struct wiimote_t* wm, double vol); +WIIUSE_EXPORT extern void wiiuse_speaker_rate(struct wiimote_t* wm, byte rate, byte freq); +WIIUSE_EXPORT extern void wiiuse_speaker_config(struct wiimote_t* wm); +WIIUSE_EXPORT extern void wiiuse_speaker_data(struct wiimote_t* wm, byte* data, int len); #ifdef __cplusplus } diff --git a/cpp/wiiscan/lib/irprops.lib b/cpp/wiiscan/lib/irprops.lib new file mode 100644 index 0000000000000000000000000000000000000000..1761118e163a1d0c28869458e28215f69de19d00 GIT binary patch literal 16192 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 - - - - Debug - Win32 - - - Release - Win32 - - - - {6E522A84-9956-44F9-B30A-CF44F3CED276} - wiiscan - Win32Proj - - - - Application - MultiByte - true - - - Application - MultiByte - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - false - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - false - ..\include;$(IncludePath) - ..\lib;$(LibraryPath) - ..\include;$(IncludePath) - ..\lib;$(LibraryPath) - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - false - - - true - Console - MachineX86 - - - - - - - MaxSpeed - AnySuitable - false - Speed - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - - - false - - - true - Console - true - true - MachineX86 - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cpp/wiiscan/msvc/wiiscan.vcxproj.user b/cpp/wiiscan/msvc/wiiscan.vcxproj.user deleted file mode 100644 index 695b5c7..0000000 --- a/cpp/wiiscan/msvc/wiiscan.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/cpp/wiiscan/args.h b/cpp/wiiscan/src/args.h similarity index 100% rename from cpp/wiiscan/args.h rename to cpp/wiiscan/src/args.h diff --git a/cpp/wiiscan/configfile.h b/cpp/wiiscan/src/configfile.h similarity index 96% rename from cpp/wiiscan/configfile.h rename to cpp/wiiscan/src/configfile.h index 574d738..859b802 100644 --- a/cpp/wiiscan/configfile.h +++ b/cpp/wiiscan/src/configfile.h @@ -41,7 +41,7 @@ class Configfile { throw_("bad stream in configfile input operator, missing end tag"); } - string Strip(const string& s) const + void Strip(const string& s) const { for(size_t i=0;i +#include + #define Unimplemented throw_("Function unimplemented") #define Dontgethere throw_("Dontgethere") @@ -116,7 +119,7 @@ inline int Message(const string& title,const string& msg,const int type) // 4 = MB_YESNO // 5 = MB_RETRYCANCEL // 6 = MB_CANCELTRYCONTINUE: if(WINVER >= 0x0500) - const long hr=MessageBox(NULL,msg.c_str(),title.c_str(),type); + MessageBox(NULL,msg.c_str(),title.c_str(),type); #else Unimplemented; #endif @@ -226,11 +229,10 @@ inline string System(const string& cmd,const bool throwexception=true,const bool if (pret!=0) *pret=n; return ""; } else { - static size_t n=0; #ifdef WIN32 const string rm="del "; char tmp[1024]; - if (tmpnam_s(tmp,1024)) throw_("error in creating win32 temp name"); + if (tmpnam(tmp)) throw_("error in creating win32 temp name"); const string file(tmp); #else const string rm="rm "; @@ -261,11 +263,9 @@ string Getlocaltime() FUNSTACK; time_t rawtime; time(&rawtime); - struct tm timeinfo; - localtime_s(&timeinfo,&rawtime); - char buff[1024]; - asctime_s(buff,1014,&timeinfo); - return string(buff); + struct tm* timeinfo; + timeinfo = localtime(&rawtime); + return asctime(timeinfo); } class timer diff --git a/cpp/wiiscan/process.h b/cpp/wiiscan/src/process.h similarity index 100% rename from cpp/wiiscan/process.h rename to cpp/wiiscan/src/process.h diff --git a/cpp/wiiscan/reg.h b/cpp/wiiscan/src/reg.h similarity index 100% rename from cpp/wiiscan/reg.h rename to cpp/wiiscan/src/reg.h diff --git a/cpp/wiiscan/stringfun.h b/cpp/wiiscan/src/stringfun.h similarity index 100% rename from cpp/wiiscan/stringfun.h rename to cpp/wiiscan/src/stringfun.h diff --git a/cpp/wiiscan/templatefun.h b/cpp/wiiscan/src/templatefun.h similarity index 94% rename from cpp/wiiscan/templatefun.h rename to cpp/wiiscan/src/templatefun.h index 0cb60e9..5212732 100644 --- a/cpp/wiiscan/templatefun.h +++ b/cpp/wiiscan/src/templatefun.h @@ -1,6 +1,8 @@ #ifndef __TEMPLATE_FUN__ #define __TEMPLATE_FUN__ +#define __stdcall + template class Autobool { @@ -26,7 +28,7 @@ private: void operator=(const DeviceAutoClose&); public: - DeviceAutoClose(T dev,R(__stdcall *fun)(void*)) : m_dev(dev), m_fun(fun), m_init(true) + DeviceAutoClose(T dev,R(__stdcall *fun)(void*)) : m_dev(dev), m_fun(fun), m_init(true) { FUNSTACK; assert(m_fun!=NULL); @@ -49,4 +51,4 @@ public: }; -#endif // __TEMPLATE_FUN__ \ No newline at end of file +#endif // __TEMPLATE_FUN__ diff --git a/cpp/wiiscan/toolsfun.h b/cpp/wiiscan/src/toolsfun.h similarity index 100% rename from cpp/wiiscan/toolsfun.h rename to cpp/wiiscan/src/toolsfun.h diff --git a/cpp/wiiscan/usbm.h b/cpp/wiiscan/src/usbm.h similarity index 100% rename from cpp/wiiscan/usbm.h rename to cpp/wiiscan/src/usbm.h diff --git a/cpp/wiiscan/wiiscan.cpp b/cpp/wiiscan/src/wiiscan.cpp similarity index 100% rename from cpp/wiiscan/wiiscan.cpp rename to cpp/wiiscan/src/wiiscan.cpp diff --git a/cpp/wiiscan/wiiscan.h b/cpp/wiiscan/src/wiiscan.h similarity index 95% rename from cpp/wiiscan/wiiscan.h rename to cpp/wiiscan/src/wiiscan.h index 4b65804..69d9de0 100644 --- a/cpp/wiiscan/wiiscan.h +++ b/cpp/wiiscan/src/wiiscan.h @@ -24,6 +24,8 @@ #define VC_EXTRALEAN +#define sprintf_s snprintf + #include "toolsfun.h" #include "wiiuse.h" #include "usbm.h" @@ -169,7 +171,7 @@ bool USB_microio_updown(const bool up,const bool dbg) return true; } -bool __stdcall CloseDelcomhandle(HANDLE h){return DelcomCloseDevice(h)==0;} +bool CloseDelcomhandle(HANDLE h){return DelcomCloseDevice(h)==0;} void do_cmd(HANDLE di, int ma, int mi, int lsb, int msb, unsigned char *data, unsigned datalen) { @@ -206,7 +208,7 @@ bool USB_delconio_updown(const bool up,const bool dbg) log << " USB Delcon info:" << (char*)&names[0] << "\n SN=" << DelcomReadDeviceSerialNum((char*)&names[0], NULL) << endl; } - DeviceAutoClose h(DelcomOpenDevice((char*)&names[0],0),CloseDelcomhandle); + DeviceAutoClose h(DelcomOpenDevice((char*)&names[0],0), CloseDelcomhandle); if(up) do_cmd(h(),10,1,0xFE,0,0,0); else do_cmd(h(),10,1,0xFF,0,0,0); @@ -460,7 +462,7 @@ bool ReachedMax(const int i) return false; } -bool RemoveDev(const BLUETOOTH_DEVICE_INFO& bdi) +bool RemoveDev(BLUETOOTH_DEVICE_INFO& bdi) { FUNSTACK; DWORD status=BluetoothUpdateDeviceRecord(&bdi); @@ -481,7 +483,9 @@ HANDLE RadioInfo(const string& btr,const bool dbg) HANDLE hRadio=NULL; BLUETOOTH_FIND_RADIO_PARAMS btfrp=Get_BLUETOOTH_FIND_RADIO_PARAMS(); - DeviceAutoClose hbf(BluetoothFindFirstRadio(&btfrp,&hRadio),&BluetoothFindRadioClose); + DeviceAutoClose hbf( + BluetoothFindFirstRadio(&btfrp,&hRadio), + BluetoothFindRadioClose); if (hbf()==NULL) { if (dbg) log << " " << endl; @@ -526,8 +530,9 @@ bool ScanDevices(const int timeout) BLUETOOTH_DEVICE_SEARCH_PARAMS bdsp=Get_BLUETOOTH_DEVICE_SEARCH_PARAMS(timeout); BLUETOOTH_DEVICE_INFO bdi=Get_BLUETOOTH_DEVICE_INFO(); - DeviceAutoClose hbf(BluetoothFindFirstDevice(&bdsp,&bdi),&BluetoothFindDeviceClose); - const DWORD dwErr = GetLastError(); + DeviceAutoClose hbf(BluetoothFindFirstDevice(&bdsp,&bdi), + BluetoothFindDeviceClose); + //const DWORD dwErr = GetLastError(); if (hbf()==NULL) { log << " ** warning: no devices found" << endl << "Done [FAILED]" << endl; @@ -579,9 +584,9 @@ bool RemoveDevice(const string& d,const bool dbg) bdsp.fReturnUnknown = FALSE; bdsp.fReturnConnected = TRUE; - DeviceAutoClose hbf(BluetoothFindFirstDevice(&bdsp,&bdi),&BluetoothFindDeviceClose); + DeviceAutoClose hbf(BluetoothFindFirstDevice(&bdsp,&bdi),BluetoothFindDeviceClose); - const DWORD dwErr = GetLastError(); + //const DWORD dwErr = GetLastError(); if (hbf()==NULL) { log << " ** error: failed to find device" << endl << "Done [FAILED]" << endl; @@ -699,7 +704,7 @@ bool OpenDevice(const string& d,const string& btr,const int timeout,const int wi // DWORD status=GetLastError(); unsigned long tid=0; - DeviceAutoClose h(CreateThread(0,0,BluetoothFindFirstDevice_thread,&p,0,&tid),CloseHandle); + DeviceAutoClose h(CreateThread(0,0,BluetoothFindFirstDevice_thread,&p,0,&tid),CloseHandle); timer tthread; Sleep(timeout); @@ -717,7 +722,7 @@ bool OpenDevice(const string& d,const string& btr,const int timeout,const int wi assert(p.hbf!=0); BLUETOOTH_DEVICE_INFO bdi=p.bdi; - DeviceAutoClose hbf(p.hbf,&BluetoothFindDeviceClose); + DeviceAutoClose hbf(p.hbf,BluetoothFindDeviceClose); if (hbf()==NULL) { log << " ** error: no devices found" << endl << "Done [FAILED]" << endl; @@ -744,11 +749,11 @@ bool OpenDevice(const string& d,const string& btr,const int timeout,const int wi if (dbg) log << " BluetoothUpdateDeviceRecord()...OK" << endl; { - DeviceAutoClose hRadio(RadioInfo(btr,dbg),&CloseHandle); + DeviceAutoClose hRadio(RadioInfo(btr,dbg),CloseHandle); if (hRadio()==NULL) throw_("failed to get radio"); if (dbg) log << " RadioInfo()...OK" << endl; - const GUID service=HumanInterfaceDeviceServiceClass_UUID; + GUID service=HumanInterfaceDeviceServiceClass_UUID; status=BluetoothSetServiceState(hRadio(),&bdi,&service,BLUETOOTH_SERVICE_ENABLE); if (dbg && status==ERROR_SUCCESS) log << " BluetoothSetServiceState()...OK" << endl; diff --git a/cpp/wiiscan/wiiscan.test.h b/cpp/wiiscan/src/wiiscan.test.h similarity index 100% rename from cpp/wiiscan/wiiscan.test.h rename to cpp/wiiscan/src/wiiscan.test.h diff --git a/cpp/wiiuse/Debug/copy.bat b/cpp/wiiuse/Debug/copy.bat index bb541cd..f33aec8 100644 --- a/cpp/wiiuse/Debug/copy.bat +++ b/cpp/wiiuse/Debug/copy.bat @@ -1,3 +1,5 @@ -copy ..\src\wiiuse.h ..\..\WiiuseJ\src\wiiuse.h +copy ..\src\wiiuse.h ..\..\WiiuseJ\include\wiiuse.h +copy ..\src\wiiuse.h ..\..\Wiiscan\include\wiiuse.h copy wiiuse.lib ..\..\WiiuseJ\lib\wiiuse.lib +copy wiiuse.lib ..\..\Wiiscan\lib\wiiuse.lib copy wiiuse.dll ..\..\Mimis\wiiuse.dll \ No newline at end of file diff --git a/cpp/wiiuse/Release/copy.bat b/cpp/wiiuse/Release/copy.bat index bb541cd..f33aec8 100644 --- a/cpp/wiiuse/Release/copy.bat +++ b/cpp/wiiuse/Release/copy.bat @@ -1,3 +1,5 @@ -copy ..\src\wiiuse.h ..\..\WiiuseJ\src\wiiuse.h +copy ..\src\wiiuse.h ..\..\WiiuseJ\include\wiiuse.h +copy ..\src\wiiuse.h ..\..\Wiiscan\include\wiiuse.h copy wiiuse.lib ..\..\WiiuseJ\lib\wiiuse.lib +copy wiiuse.lib ..\..\Wiiscan\lib\wiiuse.lib copy wiiuse.dll ..\..\Mimis\wiiuse.dll \ No newline at end of file diff --git a/cpp/wiiuse/src/balance_board.c b/cpp/wiiuse/src/balance_board.c new file mode 100644 index 0000000..502005f --- /dev/null +++ b/cpp/wiiuse/src/balance_board.c @@ -0,0 +1,140 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * This file: + * Bertho Stultiens < para > + * + * Copyright 2009 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief Balance Board expansion device. + */ + +#include +#include +#include + +#ifdef WIN32 + #include +#endif + +#include "definitions.h" +#include "wiiuse_internal.h" +#include "dynamics.h" +#include "events.h" +#include "balance_board.h" + +/** + * @brief Handle the handshake data from the guitar. + * + * @param cc A pointer to a classic_ctrl_t structure. + * @param data The data read in from the device. + * @param len The length of the data block, in bytes. + * + * @return Returns 1 if handshake was successful, 0 if not. + */ +int balance_board_handshake(struct wiimote_t* wm, struct balance_board_t* bb, byte* data, unsigned short len) { + int i; + + bb->tr = 0.0; + bb->br = 0.0; + bb->tl = 0.0; + bb->br = 0.0; + + if (len < 0xe0) + return 0; + + if (data[0xdc] != 0xa4) { + /* decrypt data */ + for (i = 0; i < len; ++i) + data[i] = (data[i] ^ 0x17) + 0x17; + } + + /* See: http://wiibrew.org/wiki/Wii_Balance_Board */ + /* Unknown data at 0xa40020..23 (mine says: 0x44 0x69 0x00 0x00) */ + bb->cal_0.tr = (data[0x04] << 8) + data[0x05]; + bb->cal_0.br = (data[0x06] << 8) + data[0x07]; + bb->cal_0.tl = (data[0x08] << 8) + data[0x09]; + bb->cal_0.bl = (data[0x0a] << 8) + data[0x0b]; + bb->cal_17.tr = (data[0x0c] << 8) + data[0x0d]; + bb->cal_17.br = (data[0x0e] << 8) + data[0x0f]; + bb->cal_17.tl = (data[0x10] << 8) + data[0x11]; + bb->cal_17.bl = (data[0x12] << 8) + data[0x13]; + bb->cal_34.tr = (data[0x14] << 8) + data[0x15]; + bb->cal_34.br = (data[0x16] << 8) + data[0x17]; + bb->cal_34.tl = (data[0x18] << 8) + data[0x19]; + bb->cal_34.bl = (data[0x1a] << 8) + data[0x1b]; + /* Unknown data at 0xa4003c..3f (mine says: 0x4c 0x81 0x59 0x95) */ + + WIIUSE_DEBUG("calibration 0: %04x %04x %04x %04x\n", bb->cal_0.tr, bb->cal_0.br, bb->cal_0.tl, bb->cal_0.br); + WIIUSE_DEBUG("calibration 17: %04x %04x %04x %04x\n", bb->cal_17.tr, bb->cal_17.br, bb->cal_17.tl, bb->cal_17.br); + WIIUSE_DEBUG("calibration 34: %04x %04x %04x %04x\n", bb->cal_34.tr, bb->cal_34.br, bb->cal_34.tl, bb->cal_34.br); + + /* handshake done */ + wm->exp.type = EXP_BALANCE_BOARD; + + #ifdef WIN32 + wm->timeout = WIIMOTE_DEFAULT_TIMEOUT; + #endif + + return 1; +} + + +/** + * @brief The balance board disconnected. + * + * @param cc A pointer to a balance_board_t structure. + */ +void balance_board_disconnected(struct balance_board_t* bb) { + memset(bb, 0, sizeof(*bb)); +} + + + +/** + * @brief Handle balance board event. + * + * @param cc A pointer to a balance board_t structure. + * @param msg The message specified in the event packet. + */ +#define set_bbval(x) do {\ + if(bb->raw.x < bb->cal_17.x) \ + bb->x = 17.0 * (float)(bb->raw.x - bb->cal_0.x) / (float)(bb->cal_17.x - bb->cal_0.x); \ + else \ + bb->x = 17.0 * (1.0 + (float)(bb->raw.x - bb->cal_17.x) / (float)(bb->cal_34.x - bb->cal_17.x)); \ + } while(0) +void balance_board_event(struct balance_board_t* bb, byte* msg) { + bb->raw.tr = (msg[0] << 8) + msg[1]; + bb->raw.br = (msg[2] << 8) + msg[3]; + bb->raw.tl = (msg[4] << 8) + msg[5]; + bb->raw.bl = (msg[6] << 8) + msg[7]; + set_bbval(tr); + set_bbval(br); + set_bbval(tl); + set_bbval(bl); +} + diff --git a/cpp/wiiuse/src/balance_board.h b/cpp/wiiuse/src/balance_board.h new file mode 100644 index 0000000..a3d2ca5 --- /dev/null +++ b/cpp/wiiuse/src/balance_board.h @@ -0,0 +1,53 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * This file: + * Bertho Stultiens < para > + * + * Copyright 2009 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief Balance Board expansion device. + */ + +#ifndef BALANCE_BOARD_H_INCLUDED +#define BALANCE_BOARD_H_INCLUDED + +#include "wiiuse_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int balance_board_handshake(struct wiimote_t* wm, struct balance_board_t* bb, byte* data, unsigned short len); +void balance_board_disconnected(struct balance_board_t* bb); +void balance_board_event(struct balance_board_t* bb, byte* msg); + +#ifdef __cplusplus +} +#endif + +#endif // BALANCE_BOARD_H_INCLUDED diff --git a/cpp/wiiuse/src/events.c b/cpp/wiiuse/src/events.c index 01d8a6a..26a822c 100644 --- a/cpp/wiiuse/src/events.c +++ b/cpp/wiiuse/src/events.c @@ -56,6 +56,7 @@ #include "nunchuk.h" #include "classic.h" #include "guitar_hero_3.h" +#include "balance_board.h" #include "events.h" static void idle_cycle(struct wiimote_t* wm); @@ -612,6 +613,9 @@ static void handle_expansion(struct wiimote_t* wm, byte* msg) { case EXP_GUITAR_HERO_3: guitar_hero_3_event(&wm->exp.gh3, msg); break; + case EXP_BALANCE_BOARD: + balance_board_event(&wm->exp.bb, msg); + break; default: break; } @@ -681,6 +685,12 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) { wm->event = WIIUSE_GUITAR_HERO_3_CTRL_INSERTED; break; } + case EXP_ID_CODE_BALANCE_BOARD: + { + if (balance_board_handshake(wm, &wm->exp.bb, data, len)) + wm->event = WIIUSE_BALANCE_BOARD_CTRL_INSERTED; + break; + } default: { WIIUSE_WARNING("Unknown expansion type. Code: 0x%x", id); @@ -721,6 +731,10 @@ void disable_expansion(struct wiimote_t* wm) { guitar_hero_3_disconnected(&wm->exp.gh3); wm->event = WIIUSE_GUITAR_HERO_3_CTRL_REMOVED; break; + case EXP_BALANCE_BOARD: + balance_board_disconnected(&wm->exp.bb); + wm->event = WIIUSE_BALANCE_BOARD_CTRL_REMOVED; + break; default: break; } @@ -772,6 +786,10 @@ static void save_state(struct wiimote_t* wm) { wm->lstate.exp_btns = wm->exp.gh3.btns; break; + case EXP_BALANCE_BOARD: + wm->lstate.exp_bb_raw = wm->exp.bb.raw; + break; + case EXP_NONE: break; } @@ -867,6 +885,14 @@ static int state_changed(struct wiimote_t* wm) { STATE_CHANGED(wm->lstate.exp_btns, wm->exp.gh3.btns); break; } + case EXP_BALANCE_BOARD: + { + STATE_CHANGED(wm->lstate.exp_bb_raw.tr, wm->exp.bb.raw.tr); + STATE_CHANGED(wm->lstate.exp_bb_raw.br, wm->exp.bb.raw.br); + STATE_CHANGED(wm->lstate.exp_bb_raw.tl, wm->exp.bb.raw.tl); + STATE_CHANGED(wm->lstate.exp_bb_raw.bl, wm->exp.bb.raw.bl); + break; + } case EXP_NONE: { break; diff --git a/cpp/wiiuse/src/ir.c b/cpp/wiiuse/src/ir.c index 7a9bb68..4cc2e2d 100644 --- a/cpp/wiiuse/src/ir.c +++ b/cpp/wiiuse/src/ir.c @@ -623,11 +623,10 @@ static void reorder_ir_dots(struct ir_dot_t* dot) { dot[i].order = 0; for (order = 1; order < 5; ++order) { - i = 0; - - for (; !dot[i].visible || dot[i].order; ++i) - if (i > 4) + for (i = 0; i < 4 && (!dot[i].visible || dot[i].order); ++i) { + if (i >= 4) return; + } for (j = 0; j < 4; ++j) { if (dot[j].visible && !dot[j].order && (dot[j].x < dot[i].x)) diff --git a/cpp/wiiuse/src/wiiuse.h b/cpp/wiiuse/src/wiiuse.h index b27637f..bd3c27f 100644 --- a/cpp/wiiuse/src/wiiuse.h +++ b/cpp/wiiuse/src/wiiuse.h @@ -128,6 +128,7 @@ #define EXP_NUNCHUK 1 #define EXP_CLASSIC 2 #define EXP_GUITAR_HERO_3 3 +#define EXP_BALANCE_BOARD 4 /* IR correction types */ typedef enum ir_position_t { @@ -462,6 +463,34 @@ typedef struct guitar_hero_3_t { } guitar_hero_3_t; +/** + * @struct balance_board_data_t + * @brief Balance board l/r, t/b corner data data. + */ +typedef struct balance_board_data_t { + int tr; + int br; + int tl; + int bl; +} balance_board_data_t; + + +/** + * @struct balance_board_t + * @brief Balance board expansion device. + */ +typedef struct balance_board_t { + float tr; /** Top Right weight */ + float br; /** Bottom Right weight */ + float tl; /** Top Left weight */ + float bl; /** Bottom Left weight */ + struct balance_board_data_t raw; /** Raw actual values */ + struct balance_board_data_t cal_0; /** Calibration values at 0kg */ + struct balance_board_data_t cal_17; /** Calibration values at 17kg */ + struct balance_board_data_t cal_34; /** Calibration values at 34kg */ +} balance_board_t; + + /** * @struct expansion_t * @brief Generic expansion device plugged into wiimote. @@ -473,6 +502,7 @@ typedef struct expansion_t { struct nunchuk_t nunchuk; struct classic_ctrl_t classic; struct guitar_hero_3_t gh3; + struct balance_board_t bb; }; } expansion_t; @@ -503,6 +533,7 @@ typedef struct wiimote_state_t { struct vec3b_t exp_accel; float exp_r_shoulder; float exp_l_shoulder; + struct balance_board_data_t exp_bb_raw; /* ir_t */ int ir_ax; @@ -533,7 +564,9 @@ typedef enum WIIUSE_EVENT_TYPE { WIIUSE_CLASSIC_CTRL_INSERTED, WIIUSE_CLASSIC_CTRL_REMOVED, WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED + WIIUSE_GUITAR_HERO_3_CTRL_REMOVED, + WIIUSE_BALANCE_BOARD_CTRL_INSERTED, + WIIUSE_BALANCE_BOARD_CTRL_REMOVED } WIIUSE_EVENT_TYPE; /** diff --git a/cpp/wiiuse/src/wiiuse_internal.h b/cpp/wiiuse/src/wiiuse_internal.h index 1b2f423..25357a4 100644 --- a/cpp/wiiuse/src/wiiuse_internal.h +++ b/cpp/wiiuse/src/wiiuse_internal.h @@ -152,6 +152,7 @@ #define EXP_ID_CODE_NUNCHUK 0x9A1EFEFE #define EXP_ID_CODE_CLASSIC_CONTROLLER 0x9A1EFDFD #define EXP_ID_CODE_GUITAR 0x9A1EFDFB +#define EXP_ID_CODE_BALANCE_BOARD 0xA4200402 #define EXP_HANDSHAKE_LEN 224 diff --git a/cpp/wiiusej/.cproject b/cpp/wiiusej/.cproject index 80c883a..7d4e8d1 100644 --- a/cpp/wiiusej/.cproject +++ b/cpp/wiiusej/.cproject @@ -48,6 +48,7 @@ @@ -62,7 +63,8 @@ -