From 9b7530625bdfa66787dfa37b208f1bfca4f09674 Mon Sep 17 00:00:00 2001 From: "guilhem.duche" Date: Tue, 5 Feb 2008 15:55:04 +0000 Subject: [PATCH] tests git-svn-id: http://wiiusej.googlecode.com/svn/trunk@10 ae48ae66-6a45-0410-b38e-211266189506 --- WiiuseJ/.classpath | 6 - WiiuseJ/.project | 17 - WiiuseJ/libWiiuseJ.dll | Bin 25232 -> 0 bytes WiiuseJ/src/tests/LedsTask.java | 30 - WiiuseJ/src/tests/Tests.java | 374 ---------- WiiuseJ/src/wiiusej/GForce.java | 81 -- WiiuseJ/src/wiiusej/LedsRequest.java | 109 --- .../src/wiiusej/OrientThresholdRequest.java | 54 -- WiiuseJ/src/wiiusej/Orientation.java | 77 -- WiiuseJ/src/wiiusej/Point2DInteger.java | 35 - WiiuseJ/src/wiiusej/WiiMoteEvent.java | 706 ------------------ WiiuseJ/src/wiiusej/WiiUseApi.java | 174 ----- WiiuseJ/src/wiiusej/WiiUseApiListener.java | 9 - WiiuseJ/src/wiiusej/WiiUseApiManager.java | 374 ---------- WiiuseJ/src/wiiusej/WiiUseApiRequest.java | 82 -- WiiuseJ/wiiuse.dll | Bin 114688 -> 0 bytes WiiuseJC/.cproject | 653 ---------------- WiiuseJC/.project | 69 -- WiiuseJC/wiiuse.c | 168 ----- WiiuseJC/wiiuse.h | 687 ----------------- WiiuseJC/wiiusej_WiiUseApi.c | 659 ---------------- WiiuseJC/wiiusej_WiiUseApi.def | 19 - WiiuseJC/wiiusej_WiiUseApi.h | 157 ---- 23 files changed, 4540 deletions(-) delete mode 100644 WiiuseJ/.classpath delete mode 100644 WiiuseJ/.project delete mode 100644 WiiuseJ/libWiiuseJ.dll delete mode 100644 WiiuseJ/src/tests/LedsTask.java delete mode 100644 WiiuseJ/src/tests/Tests.java delete mode 100644 WiiuseJ/src/wiiusej/GForce.java delete mode 100644 WiiuseJ/src/wiiusej/LedsRequest.java delete mode 100644 WiiuseJ/src/wiiusej/OrientThresholdRequest.java delete mode 100644 WiiuseJ/src/wiiusej/Orientation.java delete mode 100644 WiiuseJ/src/wiiusej/Point2DInteger.java delete mode 100644 WiiuseJ/src/wiiusej/WiiMoteEvent.java delete mode 100644 WiiuseJ/src/wiiusej/WiiUseApi.java delete mode 100644 WiiuseJ/src/wiiusej/WiiUseApiListener.java delete mode 100644 WiiuseJ/src/wiiusej/WiiUseApiManager.java delete mode 100644 WiiuseJ/src/wiiusej/WiiUseApiRequest.java delete mode 100644 WiiuseJ/wiiuse.dll delete mode 100644 WiiuseJC/.cproject delete mode 100644 WiiuseJC/.project delete mode 100644 WiiuseJC/wiiuse.c delete mode 100644 WiiuseJC/wiiuse.h delete mode 100644 WiiuseJC/wiiusej_WiiUseApi.c delete mode 100644 WiiuseJC/wiiusej_WiiUseApi.def delete mode 100644 WiiuseJC/wiiusej_WiiUseApi.h diff --git a/WiiuseJ/.classpath b/WiiuseJ/.classpath deleted file mode 100644 index d171cd4..0000000 --- a/WiiuseJ/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/WiiuseJ/.project b/WiiuseJ/.project deleted file mode 100644 index e58d767..0000000 --- a/WiiuseJ/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - WiiUseJ - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/WiiuseJ/libWiiuseJ.dll b/WiiuseJ/libWiiuseJ.dll deleted file mode 100644 index a045dbdba80baf058bc85961a294da8e522b11f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25232 zcmeHv4|rR}mG8A<5+~TP0J{X55Yd{}X^A7r`eQqGtk^O6QztQT0&Ky^vL(j~wxmc` zA(YU%wOvr}W-%>o*;ih%Ysw2POGBH|{M$rLvJHMMi#O!kCJ(x6c(6E4+NO{VX-m=m z&dl62|nf>C8d$Sr|ym4bkAZiXrLYpJrE_0hV7!1kgR=+tC3z`E#^NRIN=B|*> zUz(pkr&zFVte2#QtXYzE>#miOU6Ov9B}t>w%#UB0m0d1f4Lz}E&X3us1vI%xYNsJfmz($nI32SgY{}ZanM(D`&E)fUhT4QJyHQ5E zl0GSyTas#19zV?f1uU>B{$^9pxg4cPYAgx$osesk1t#R;7k3`~BsJf2HmBm{$aTt$ zzJ&Zva)i?{FnV^U{0S*uSUgs8tt44b#2Jg@Im}7Ma)8}&XY*0;zYPtTlvrNR`&shJ zxLlm0)SKcfigT6v+;~p$*#4^}DSou)9F-S5dc>OOd!^vfMBkCv%D#)SJSCqAHXOUf z`bzxNPXDDl?`}SlC!v{cNH_N4M<@Q7 zPo-m5(!-C(dQtJXln2C`IJ;}-Hc9BaX)ja%&7O1fNXEUy8yU#Vgk6AY!#$U>u1g%{ z{HCD)O%dpi_Ujky(R^kzgcA^+d(P#O)!dN!^93O9OB8%PQSf}?NUqf0ziD6NLP+pt z)Bf}GOF}*83gZpMroD~Vm4psR78GnO&LcVFcNOP=2@UFG(ZH=Gq5YKIcLn}{BnOpp zhs>l(PI0nm1m)HfeTmp?rTM-1$S@jG7EtM4szlnx=Ywn%2$98)%D+_dS-DA+D_5c4 zlSL*l5+!D}4ND zd;(%hn;^q9h*SJ)3jSu;blUti;_376{~-J|Vx2$Jw)=s?tb*q^%`bRIk<69Pys44FsqnFh#Ld!aw#HVyxR-fuujWfte9%mI%) z#*r!=SU{X8W*{Owasjm%(|w)e9Ae^u#HSyxWV z`YUP`g=9@*%?tpkO$EK*R_Rh%H%!WUiCQJ2)ZDgh;Bue?e4=Nq$F@>a9ECKf_W2LvC!t zd&wlS?LB)}!0J*#-)s1*Gy^!WiUWdd>`@&e?n$?gLOQB8_1 zT-kH9uqQd=^S@Od$W>OFcbN+ME`nUO4y`dG1_iJTxb>^%r-8>(Ro# zh4`bCV+=F<5j6##Z|aR9@KmEBDa2YU_{oE0Dy3Q|K%<|U+L01`QVrO97#(&tUtfG7 z$2skFpzXsX1vH=zq`*T0Pz*B&a1bm~1)#1$9W<>hNYxeVFRp89hxM*UZLv@g>r3ty zdmFU&uc2X>B0^f^tx9d5n-^vvf8bIuskyy{t;y$kSUq$nS~<{)KfKE;;(2_;-!8gb znS)LThddTY$MtqW?;+v^hpV7Hk(`(212^H2BeLLRxo(>+g;3y>KbigQ?W zsVY89?I+oQPGPiZ$3AkX1NY+(nYI269>cV$RayH6%|NhES|4wx-kjSvT+r7>x!ZE^ z9yW95%It!}my~t6eZzRTJ*VLCAC+x+eHW=Dmr9rnhiEDgJ`A7av$7C~%|)DSUk`** zDp^<4YN`1RlA3&0A8rM`=V8Co^<#>I_4W_7Miy9 z07`MrNm~6k=rM7t^1`&ai$*mD0nK0Br<&i>-f5vPG#P9`e83B3_V7`-_}Dk`Vao|*#nZVrzKcocBFh+YMU!hnX4viY0zA*m6`@haX|31`7;@Gv3} zatH`xr)J_S18Gcerg%Xv=$%I;ImP>>S}=sE#=Z*@@S!pZWq7G2j`aP6?meH&!P@gJ z>e<>{WlbJ4jZ$mkwo%p;4v}q?+Id*wLoQ{_{2>$FYt8Zeeg+gX`zW;~@q99nvgYO? ziBVYM`4&cD9~xyqc|5ff*#37qNrdU zhL4akb75dS-by)S0BIYB2B@SEYmWUUP(j9O&hs^?R z5paUTZUHkN0rhSUj|i9)CnlPgoTwzaAPP@ z@RLN(IUk%qcju;E_*O>&gFZGr9>!biLeQ`maeU@On3#38I%{~%_PO0VKDBFk?85Ay zu&HP*#R(?SB^)_ddx-6^?Hs$?hi$esV<^x%PPd zsdyFa^eF7aY?wnqXDbgH8zJ@B8RYqE_`^KRSceZ$0Vzz2rLkNxNnK9jlUP)P0{L7^ zF&2IO=;Y%wh*T+hl=5{Y$V>6M!a=hI!ZpoPii#;yH-B(|mER24PR5(e@jA<32}+cr zn_0Pia5u{1P320_9?H~J4JL3uUbli*aL4ObDMfbB4qEUh-qgstJYLrjKXu~^?0adk zIcqp)`9r;*T7@cW?t6>bJl@xVCuZe%UngbBwDG<$WyzlLKAE!2mVMhP%gouggR?Wv+2_XY2OljO^!F!k+JgrB`^nIBC2u;G_WVNH z^TD*|U!*;sOncs&_MAw29!Y!NmG=Bt+Veo#^OI@MG=Nj}AxBMpCIjowh=0vzu05kg zNOVK8k)jmY0vFvsy#D)GfZ_$hhjxWUUugg`YQLr5Q)xcT|G#O0djo-3)L-iB?3AK@ z`Sw7dDBlS)YKIU$sIZuG`BjEO28Y} zg)uapN(dDMf1Oz4t`U~3CXKy5-|7wFP#`EvB~4uH+L$bdg3&dxsN4vtqc8r35NdH;L5yn&#^^X6?gMa`Wd zug~u@mzXTOh~F2MBa4?s1E2GotE&hWZtY zh-qo*68ziT*0#8;)L!bK+!E;09@xAjP*(0-0)C4*zr|o!id_bhw9+pxmqT6ayj}j~ z<`OTmH=CpQ$J>Z5T4cVl+H4`p4==X&24?8@O7ybIws{oeUebcaH_|HLCj1;rDU6@4 zDUFC^!kyCYLY_wPlRG6hXekY#jFNuL_CoC zK||>Y$TW;}5y{*tNo$clhx9$95u`sLeGHzk4k?E81k%ru{)qGmAHLHd^&&lw^e;%W z{gPxyYDIbw=~<+gklsQ1NV_C0Mfxn#4y31$UPiiz^wG_dv+>tE8);K%rD5eMGuenkQX{Ek7TX=1U8(ooAtBmTr_jCVgD$ z474H$BP6e3F?o%5o7ck!-xd!FHbwo*!vPNqxL(<>hc;>2ly0kSD&o}}Hb%T{_aOLA zpK=;(4H0@O&IaOXFz3_3R9rdLG}vhq#8ezL!bzC6b%vtUS2UAi_RGXFjcgKzKL7MR zU?SRSv7Xusbk;iUv{)NDHyA52CEXbtjQ3NM6uhJQ5#V3rJ}w{ z%*-o|(rtBS5AK>@9 z?50k?Ka91K$Ag!rP|&|UAcHO>dAxW>h*179$>Wbig6!KzQMR`=1k{q<-rgCDb`Z~+ z>~_c@Ns;U>FIZq@f;CKbm%j@mfbw6+4oC1Nf>j1C>VpjFGxZzR)i;#c*opyUg`k@% zbw#(eMP#)GHSpo}|D^>?Sbt|>{cE|#Vzo3_zGFFNdD(Kc)oiV`Hd^D>?^wTQecpP& zdeVB<-L-*tT7@%N6S zj#nM8JKl0!awHw4&I)I(bEEUGoL_W4=zQAwtaG39Rp*#9$2Hqk=yJL0TppLt6>@#m z^=;Q~*Ndhtb;a*0E>z5{EUc`oY^>Z`xvld4%3YN|u6(=l-OBeW z7cH$?8d-Yp(j7~mUiyQjrFZ11TKb2jpR8J3)m#;*3RXp{`l_Cp z>Zj;evm{laf3CGGu&lIrE%#WW zmisMVvV6tzRmsv8}aj zw)NQ_wtW+Q`;_fj+w-=+xBY|dMcYZ+tF|}L&+pj&WXmp_Q+9RPb!9h}Eh;N5yS>a; z7AkwFY^dz-(Cfoxua~`BmTkY@ZnoR(Ui<&BKWX1vyN8B7DvRf z!x4A<-0@5F{Fviihvdw4UhgzJOPp5pe}nT@=jWV#&VJ{&oKHEQa~^aabN-|AHD|V~ z$hE+AlWT*k)fI7l2|n;0*AHDsTqj(wyWVzXmtS4}v2q){z*kP^3uuS83HJ}Li7imt z9_Yjrgf~=4dLLisH)mls!^~jipHZ|*IU<(@hnxX_oajO*VHeTPU^zOdLa2^>8c!`q z#3vhbC62*h-ZX)uKsz zxKwLg2b5a_rijY1_I9H=mZLnZN=QPbU8>BShUA$I3M1hMk=cyeT;{Zf@Tkg6!Gg<7 zG%xcGpe!y=0N)wK#q7iKx8iU2Bw7&By+{Kp4FS>2o1`Pf;OaIYwBIpoKt2y-z<@jpWW<2b7G4rY=X^C}u^12skZuFg24uGZ=?5}u zKn?>jU6IQ9H$dD5WC3Ie8<1Kc{RSie#La~yqu`Qpqo9Q51o8zSjRxc^Kt==~UhCUL z14klFIr0o{=Mmy`BtbM7%p6huup2faGtJ1_H&>GW0Xh8|?}xd1p~$IY$BbttbCz3_ z=r{EQ8X+Xzj4axJYP?imZ2-)DReV@(Gt#{U25tln)~DmRaN0|tF2z?LD zq^YJCqam4TMl)U?M6WQaa=nZ^=t-5?hdh@VU)m>-xeyFAK2o^U!dPimWluMPrg0Lz zh{z6_Zj}b_QT$hkQ4LXb=X^-_zeBAn8GrT9c-_I2`MOF0y~LSEP3A0;)p)782LW^4 z!%=_C7g`*lbBlVXtt9rCe5UFzPD3)&o(u94{ZeH%1DeVYyFo)uPUx#*?tTg7TxMjX zRwCCf)rRyfokswzNXuNFJS6$}Ya3c`RL2D?eh>(6-8`WdMD%^oxP?`@tr9@`QG%PW z-pk0E@x&~KJHFck8NgkqIg2dWTc^1QWVeB44q|G;fP55)#ZYT8kWsalwb-KDun0ny zp@x2qw;>(uHD0P8YIn*CLAE@;=bUy5qa%zv`U~l8*|(=7&K-I!(R%k~wf?HkN3>2m;Ea~9s`b{g>7HIh~Ja{TJzN*>|KP&R)HiXno+aTEC$45v`w0Z_D1BjyNCJYl+r(Usmg< zbUvbWIk^mM`l!xFw4O+B%N|ZgoE>^Cq5H^XwSHdbBU-1JVAQ=k z9dY*SwZx3}ub|;GT08bZ;34Je2;w(=JnM0zUG9hl@4xs#>6h^lMxkn}|lN z9JI(b5e?VWR;ad~MY*&YUsz+eMw62+jv68DEtAm*``iFIGTBF+@&AIl+aH=tW}*A3 zscBr7pcm`GEaNHI1dDTjwLJ z@mP9W_EqVK^Ma0u*0F7X&-fpxb=vZ67=w-hoimrm-k6R!3-wx}b<<_Feo*Hlbbm6v zE&IlF#95-(60MsrtMxrPAJO{b>22BR?ag2xXO3P=v~Ibq)}PV&h}IuXZ_Bx zB$=b}Uu!g(qjA+_G{Qbrlh{X%#(zQG?RQNkv+%=brlxTnQ~f6k|2sz7rM@q((sZBr zOX+I7NpamLe)}75pUhuM-H_ow^)AyUhayp|95g?qejo3QcS2_RR!MU>wTEA2fwbUG z^c?vzkP!p&bs%(6Ij4CN2%j&^0{Ib;PSHBPe)FGyr7)XQRGK58;olflKEDHE0ZYC0 zIdE)QALm#Lv~;26=ixlK>ywgcgrb)cFdx|@NVHy~9&)Qj_JAOsz& z*SZsk$$)eMF&mKk1s}auoN5_7;TfVa=za{yL4YJWZ~X+20R!@Ds>S-%L|nYq z++6gjK^`*@w*jdD(hczd3O+s{K0N6%hk>XU^(lVO@pu@Z_eD2o8V#JkA!_L~-v{D` z?s{7%flxHnHGPZK!ofz(6D|^BuumQaw8^0Rd?1e*_*jWXv$IERf#B~Ts>RlWhJROA zb&mq!-`-W^>p>h}2&kd~A&$hTv(7<~Sxpy@W$dXZ`wEcO}@_2O;) zejG9bo1(*pS|%WR>r{UskO7088-P5H65Y;iK=v4rZ9uvWoF4|#Z$O>`VnXZyD6H{M zKq#yC*Bd|v47Gj_WVZpCi^VwqtwiNh4n%#U=epklWE5GwtsoGxy53d~kc5Hrw}6Zo zkX^(_LlBXIKHlD5OjMA%_BgL0pXlIe8Z5G zFv#-+@iA!e5|C~vrR(($5c+t28foW_?<<4l>-L5iym$cTYvE07mZqHFp95aOZt z>DL7x9eE1KNkgqYK>7{H&qOVq^DE={ygLplz;9Q(418_?V$sGjilk2ic~YbChz(Q& znhiZ-d)96Zp<2sPD{Roc6NuTs`2iq$jG|gk08!US+=f2}GNAQ^hiwsa+eZy;y#gBb z;C$xKA!Mf2!(C-+qkDa5Q)m_FXbL=G}9kebat-AZ%TC=He&y0M2>}NyCGE$ zd7@i7w|D|U{J8GPuuIXnn==!YFKr7d?MCmy8KG!Kz7uR?&cr-rPbM~8W};H}I_sNt zGg0chb*H9Pxf-`FPtAFH^eXppTbHM9VA@quw$f(eI({!L?U2nxtqN_}znqC!xAnBh zRo?oM1?H<6d{bvWJ$l0i=S&hujoWfPn>$0T-p=){TO^UK4{lSlw+Ff;Pg^K_AO3W8 zg@T?a-(cd*ZjgNU+B~7wEuipp z#qj2jpNAO~Z1a~|C4?nUdzo%@lTkmOXs^7F?y=Oyx!}>Z;!|JAuSY@bPg8!pf%SYG|N7SVM z=9WZ@$V8d4f!J*)zAHAa-=OjN08UMHjdsRCz^*_L8>2D~Q!(x{m#6G>2Yb1b*^~?J z!2u(__t)da^gy4|J)S^U*yGXmM>B;O#8)6NBmB-2YA5yE?qLHWz^sr~fW6ZG$TmOO z2aBmKp$L4bHF{rE_IG)<`6E#rePLxDd@As4X9I={rEb&arevi7-PU}I2%2T*XSAMy z6+Eq-F~3abM7d~WOi`P!8`U0F2d`j7RdKEoQ&AWO-We!#*y9%w7s!A zP;C|#Yi+em4sG6yK&K4=I3;>C6iw~QDIJ|p!)OEc@um76pg@;*v)|K-qqE$S{BV>9 zQEqdP&bJbpy6Il`%k7dRaW6ETZ(Q+_)lL-5K{0py28?w-)E_L`bFG_PjbYCFi z*@hva8N5w3xajn@ah)EfGbZRC1NRL2=rg9iKw(D4(1xGUF$i`Tmah=Gd#0RRPn16i!S)4N%ZCK2*=_TQq5 zk*^*JQS0kV1DZsq?9fylQ@hMK>F_8nKAntj37Q&WRcf&2K@%OXPH!oJn}Rv>7IAK6 zYH(=lbmD1|myK_kH6&govGP!lG3ntjJxETWeQJCd p9~m;oQgzD13PRUOT|;DO)A064{miCkS&e*RoZTA<$bLRz{sYT1@MZu2 diff --git a/WiiuseJ/src/tests/LedsTask.java b/WiiuseJ/src/tests/LedsTask.java deleted file mode 100644 index d4adda2..0000000 --- a/WiiuseJ/src/tests/LedsTask.java +++ /dev/null @@ -1,30 +0,0 @@ -package tests; - -import java.util.TimerTask; - -import wiiusej.WiiUseApiManager; - -public class LedsTask extends TimerTask { - - private int i = 0; - private int inc = 1; - - @Override - public void run() { - if(i==0){ - WiiUseApiManager.getInstance().setLeds(1, true, false, false, false); - }else if(i==1){ - WiiUseApiManager.getInstance().setLeds(1, false, true, false, false); - }else if(i==2){ - WiiUseApiManager.getInstance().setLeds(1, false, false, true, false); - }else if(i==3){ - WiiUseApiManager.getInstance().setLeds(1, false, false, false, true); - } - if (i==0) i=1; - if (i==3) i=-1; - i = i+inc; - - } - -} - diff --git a/WiiuseJ/src/tests/Tests.java b/WiiuseJ/src/tests/Tests.java deleted file mode 100644 index dbe4ccc..0000000 --- a/WiiuseJ/src/tests/Tests.java +++ /dev/null @@ -1,374 +0,0 @@ -package tests; - -import java.awt.AWTException; -import java.awt.Robot; -import java.awt.event.InputEvent; -import java.util.ArrayList; - -import wiiusej.Point2DInteger; -import wiiusej.WiiMoteEvent; -import wiiusej.WiiUseApiListener; -import wiiusej.WiiUseApiManager; - -public class Tests implements WiiUseApiListener { - - Robot robot; - - private static int DISPLAY_EACH_VALUE = 1; - private static int DUMP = 2; - private static int MOVE_MOUSE = 3; - private static int ORIENT_THRESH_CONT = 4; - private static int TEST_LEDS = 5; - - int dump = ORIENT_THRESH_CONT; - - public Tests() { - try { - robot = new Robot(); - } catch (AWTException e) { - e.printStackTrace(); - } - } - - @Override - public void wiimoteEvent(WiiMoteEvent e) { - - /* leave if nothing is connected */ - if (WiiUseApiManager.getInstance().getNbConnectedWiimotes() == 0) { - WiiUseApiManager.getInstance().shutdown(); - } - - if (dump == DISPLAY_EACH_VALUE) { - if (e.isConnected()) { - // System.out.println("*********** WIIMOTE ID : "+ - // e.getWiimoteId() + " **************"); - /* button ONE */ - if (e.isButtonOneJustPressed()) { - System.out.println("button one pressed"); - } - if (e.isButtonOneHeld()) { - System.out.println("button one held"); - } - if (e.isButtonOneJustReleased()) { - System.out.println("button one released"); - } - - /* button TWO */ - if (e.isButtonTwoJustPressed()) { - System.out.println("button two pressed"); - } - if (e.isButtonTwoHeld()) { - System.out.println("button two held"); - } - if (e.isButtonTwoJustReleased()) { - System.out.println("button two released"); - } - - /* button A */ - if (e.isButtonAJustPressed()) { - System.out.println("button A pressed"); - } - if (e.isButtonAHeld()) { - System.out.println("button A held"); - } - if (e.isButtonAJustReleased()) { - System.out.println("button A released"); - } - - /* button B */ - if (e.isButtonBJustPressed()) { - System.out.println("button B pressed"); - } - if (e.isButtonBHeld()) { - System.out.println("button B held"); - } - if (e.isButtonBJustReleased()) { - System.out.println("button B released"); - } - - /* button LEFT */ - if (e.isButtonLeftJustPressed()) { - System.out.println("button Left pressed"); - } - if (e.isButtonLeftHeld()) { - System.out.println("button Left held"); - } - if (e.isButtonLeftJustReleased()) { - System.out.println("button Left released"); - } - - /* button RIGHT */ - if (e.isButtonRightJustPressed()) { - System.out.println("button Right pressed"); - } - if (e.isButtonRightHeld()) { - System.out.println("button Right held"); - } - if (e.isButtonRightJustReleased()) { - System.out.println("button Right released"); - } - - /* button UP */ - if (e.isButtonUpJustPressed()) { - System.out.println("button UP pressed"); - } - if (e.isButtonUpHeld()) { - System.out.println("button UP held"); - } - if (e.isButtonUpJustReleased()) { - System.out.println("button UP released"); - } - - /* button DOWN */ - if (e.isButtonDownJustPressed()) { - System.out.println("button DOWN pressed"); - } - if (e.isButtonDownHeld()) { - System.out.println("button DOWN held"); - } - if (e.isButtonDownJustReleased()) { - System.out.println("button DOWN released"); - } - - /* button MINUS */ - if (e.isButtonMinusJustPressed()) { - System.out.println("button MINUS pressed"); - } - if (e.isButtonMinusHeld()) { - System.out.println("button MINUS held"); - } - if (e.isButtonMinusJustReleased()) { - System.out.println("button MINUS released"); - } - - /* button PLUS */ - if (e.isButtonPlusJustPressed()) { - System.out.println("button PLUS pressed"); - } - if (e.isButtonPlusHeld()) { - System.out.println("button PLUS held"); - } - if (e.isButtonPlusJustReleased()) { - System.out.println("button PLUS released"); - } - - /* button HOME */ - if (e.isButtonHomeJustPressed()) { - System.out.println("button HOME pressed"); - } - if (e.isButtonHomeHeld()) { - System.out.println("button HOME held"); - } - if (e.isButtonHomeJustReleased()) { - System.out.println("button HOME released"); - } - - /* get status */ - if (e.isButtonMinusJustPressed()&&e.isButtonPlusJustPressed()) { - WiiUseApiManager.getInstance().getStatus(1); - } - - /* Activate rumble */ - if (e.isButtonOneJustPressed()) { - System.out.println("Rumble Activated"); - WiiUseApiManager.getInstance().activateRumble(1); - } - if (e.isButtonTwoJustPressed()) { - System.out.println("Rumble Deactivated"); - WiiUseApiManager.getInstance().deactivateRumble(1); - } - - /* Activate IR Tracking */ - if (e.isButtonAJustPressed()) { - System.out.println("IR Activated"); - WiiUseApiManager.getInstance().activateIRTRacking(1); - } - if (e.isButtonBJustPressed()) { - System.out.println("IR Deactivated"); - WiiUseApiManager.getInstance().deactivateIRTRacking(1); - } - - /* Activate Motion sensing */ - if (e.isButtonPlusJustPressed()){ - System.out.println("Motion sensing Activated"); - WiiUseApiManager.getInstance().activateMotionSensing(1); - } - if (e.isButtonMinusJustPressed()){ - System.out.println("Motion sensing Deactivated"); - WiiUseApiManager.getInstance().deactivateMotionSensing(1); - } - - /* display status */ - if (e.getBatteryLevel() != -1) { - System.out - .println("battery level : " + e.getBatteryLevel()); - System.out.println("= --- Leds : " + e.getLeds() + "\n"); - System.out.println("= --- Rumble : " + e.isRumbleActive() + "\n"); - } - - /* display ir points */ - if (e.isIrActive()) { - Point2DInteger[] list = e.getIRPoints(); - for (int i = 0; i < list.length; i++) { - if (list[i] != null) - System.out.print("Point :(" + list[i].getX() + "," - + list[i].getY() + ") "); - } - System.out.println(""); - } - - /* display motion sensing */ - if (e.isMotionSensingActive()){ - System.out.println("Motion Sensing :"+e.getOrientation()+" , "+e.getGforce()); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - WiiUseApiManager.getInstance().closeConnection(1); - } - } else { - System.out.println(" WIIMOTE ID : " + e.getWiimoteId() - + " DISCONNECTED !!!!!"); - WiiUseApiManager.getInstance().closeConnection(1); - } - } else if (dump == DUMP) { - System.out.println(e); - /* Activate all */ - if (e.isButtonAJustPressed()) { - System.out.println("IR Activated"); - WiiUseApiManager.getInstance().activateIRTRacking(1); - WiiUseApiManager.getInstance().activateMotionSensing(1); - WiiUseApiManager.getInstance().activateRumble(1); - } - if (e.isButtonBJustPressed()) { - System.out.println("IR Deactivated"); - WiiUseApiManager.getInstance().deactivateIRTRacking(1); - WiiUseApiManager.getInstance().deactivateMotionSensing(1); - WiiUseApiManager.getInstance().deactivateRumble(1); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - WiiUseApiManager.getInstance().closeConnection(1); - if (WiiUseApiManager.getInstance().getNbConnectedWiimotes() == 0) { - WiiUseApiManager.getInstance().shutdown(); - } - } - } else if (dump == MOVE_MOUSE) { - /* Activate IR Tracking */ - if (e.isButtonOneJustPressed()) { - System.out.println("IR Activated"); - WiiUseApiManager.getInstance().activateIRTRacking(1); - } - if (e.isButtonTwoJustPressed()) { - System.out.println("IR Deactivated"); - WiiUseApiManager.getInstance().deactivateIRTRacking(1); - } - - /* button A */ - if (e.isButtonAJustPressed()) { - robot.mousePress(InputEvent.BUTTON1_MASK); - } - if (e.isButtonAJustReleased()) { - robot.mouseRelease(InputEvent.BUTTON1_MASK); - } - - /* button B */ - if (e.isButtonBJustPressed()) { - robot.mousePress(InputEvent.BUTTON2_MASK); - } - if (e.isButtonBJustReleased()) { - robot.mouseRelease(InputEvent.BUTTON2_MASK); - } - - Point2DInteger[] list = e.getIRPoints(); - if (e.isIrActive() && list[0] != null) { - - int x1 = (int) list[0].getX(); - int y1 = (int) list[0].getY(); - - int mousex = (int) Math.round(((double) x1 / 1024.0) * 1280.0); - int mousey = (int) Math.round(((double) y1 / 768.0) * 1024.0); - robot.mouseMove(mousex, mousey); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - WiiUseApiManager.getInstance().closeConnection(1); - } - }else if(dump == ORIENT_THRESH_CONT){ - WiiUseApiManager.getInstance().activateMotionSensing(1); - if (e.isButtonOneJustPressed()) { - System.out.println("Continous activated"); - WiiUseApiManager.getInstance().activateContinuous(1); - } - if (e.isButtonTwoJustPressed()) { - System.out.println("Continous deactivated"); - WiiUseApiManager.getInstance().deactivateContinuous(1); - } - if (e.isButtonAJustPressed()) { - System.out.println("Smoothing activated"); - WiiUseApiManager.getInstance().activateSmoothing(1); - } - if (e.isButtonBJustPressed()) { - System.out.println("Smoothing deactivated"); - WiiUseApiManager.getInstance().deactivateSmoothing(1); - } - if (e.isButtonPlusJustPressed()) { - System.out.println("Threshold orientation 10 degrees"); - WiiUseApiManager.getInstance().setOrientationThreshold(1, 10); - } - if (e.isButtonMinusJustPressed()) { - System.out.println("Threshold orientation 0.5 degrees"); - WiiUseApiManager.getInstance().setOrientationThreshold(1, (float)0.5); - } - System.out.println(e); - - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - WiiUseApiManager.getInstance().closeConnection(1); - } - }else if(dump == TEST_LEDS){ - WiiUseApiManager.getInstance().activateMotionSensing(1); - if (e.isButtonUpJustPressed()) { - WiiUseApiManager.getInstance().setLeds(1, true, false, false, false); - } - if (e.isButtonDownJustPressed()) { - WiiUseApiManager.getInstance().setLeds(1, false, true, false, false); - } - if (e.isButtonLeftJustPressed()) { - WiiUseApiManager.getInstance().setLeds(1, false, false, true, false); - } - if (e.isButtonRightJustPressed()) { - WiiUseApiManager.getInstance().setLeds(1, false, false, false, true); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - WiiUseApiManager.getInstance().closeConnection(1); - } - } - } - - /** - * @param args - */ - public static void main(String[] args) { - Tests tests = new Tests(); - WiiUseApiManager manager = WiiUseApiManager.getInstance(); - manager.addWiiUseApiListener(tests); - manager.loadLibrary(); - manager.connectWiimotes(); - manager.start(); -// java.util.Timer timer = new java.util.Timer(); -// timer.scheduleAtFixedRate(new LedsTask(), 0, 100); - - } - -} diff --git a/WiiuseJ/src/wiiusej/GForce.java b/WiiuseJ/src/wiiusej/GForce.java deleted file mode 100644 index 3cd513d..0000000 --- a/WiiuseJ/src/wiiusej/GForce.java +++ /dev/null @@ -1,81 +0,0 @@ -package wiiusej; - -/** - * Represents gravity force on each axis. - * @author gduche - * - */ -public class GForce { - - private float x; - private float y; - private float z; - - /** - * Default constructor; - */ - public GForce(){ - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with gravity force on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public GForce(float xx, float yy, float zz){ - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public float getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(float x) { - this.x = x; - } - - /** - * @return the y - */ - public float getY() { - return y; - } - - /** - * @param y the y to set - */ - public void setY(float y) { - this.y = y; - } - - /** - * @return the z - */ - public float getZ() { - return z; - } - - /** - * @param z the z to set - */ - public void setZ(float z) { - this.z = z; - } - - @Override - public String toString() { - return "Gravity force : ("+x+", "+y+","+z+")"; - } -} diff --git a/WiiuseJ/src/wiiusej/LedsRequest.java b/WiiuseJ/src/wiiusej/LedsRequest.java deleted file mode 100644 index c068ba3..0000000 --- a/WiiuseJ/src/wiiusej/LedsRequest.java +++ /dev/null @@ -1,109 +0,0 @@ -package wiiusej; - -/** - * Represents a request to set leds of the wiimote with WiiUse API. - * @author gduche - * - */ -public class LedsRequest extends wiiusej.WiiUseApiRequest { - - private boolean led1, led2, led3, led4; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - */ - public LedsRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - * @param l1 - * led1 status. True=ON, False=OFF - * @param l2 - * led2 status. True=ON, False=OFF - * @param l3 - * led3 status. True=ON, False=OFF - * @param l4 - * led4 status. True=ON, False=OFF - */ - public LedsRequest(int id, int type, boolean l1, boolean l2, boolean l3, - boolean l4) { - super(id, type); - led1 = l1; - led2 = l2; - led3 = l3; - led4 = l4; - } - - /** - * @return the led1 - */ - public boolean isLed1() { - return led1; - } - - /** - * @param led1 - * the led1 to set - */ - public void setLed1(boolean led1) { - this.led1 = led1; - } - - /** - * @return the led2 - */ - public boolean isLed2() { - return led2; - } - - /** - * @param led2 - * the led2 to set - */ - public void setLed2(boolean led2) { - this.led2 = led2; - } - - /** - * @return the led3 - */ - public boolean isLed3() { - return led3; - } - - /** - * @param led3 - * the led3 to set - */ - public void setLed3(boolean led3) { - this.led3 = led3; - } - - /** - * @return the led4 - */ - public boolean isLed4() { - return led4; - } - - /** - * @param led4 - * the led4 to set - */ - public void setLed4(boolean led4) { - this.led4 = led4; - } - -} diff --git a/WiiuseJ/src/wiiusej/OrientThresholdRequest.java b/WiiuseJ/src/wiiusej/OrientThresholdRequest.java deleted file mode 100644 index 0d3cc14..0000000 --- a/WiiuseJ/src/wiiusej/OrientThresholdRequest.java +++ /dev/null @@ -1,54 +0,0 @@ -package wiiusej; - -/** - * Represents a request to set orientation Threshold in Wiiuse API. - * Orientation Threshold is the minimum angle (in degrees) between two events. - * @author gduche - * - */ -public class OrientThresholdRequest extends WiiUseApiRequest { - - private float thresholhd; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public OrientThresholdRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * threshold in degrees - */ - public OrientThresholdRequest(int id, int type, float th) { - super(id, type); - thresholhd = th; - } - - /** - * @return the thresholhd - */ - public float getThresholhd() { - return thresholhd; - } - - /** - * @param thresholhd the thresholhd to set - */ - public void setThresholhd(float thresholhd) { - this.thresholhd = thresholhd; - } - - - -} diff --git a/WiiuseJ/src/wiiusej/Orientation.java b/WiiuseJ/src/wiiusej/Orientation.java deleted file mode 100644 index 52ebd7c..0000000 --- a/WiiuseJ/src/wiiusej/Orientation.java +++ /dev/null @@ -1,77 +0,0 @@ -package wiiusej; - -/** - * Class that represents the orientation of the wiimote. - * @author gduche - * - */ -public class Orientation { - - private float roll; - private float pitch; - private float yaw; - - /** - * Default constructor. - */ - public Orientation(){ - roll = 0; - pitch = 0; - yaw = 0; - } - - /** - * Contructor with raw, pitch , yaw. - * @param r raw - * @param p pitch - * @param y yaw - */ - public Orientation(float r, float p, float y){ - roll = r; - pitch = p; - yaw = y; - } - - /** - * @return the roll - */ - public float getRoll() { - return roll; - } - /** - * @param roll the roll to set - */ - public void setRoll(float roll) { - this.roll = roll; - } - /** - * @return the pitch - */ - public float getPitch() { - return pitch; - } - /** - * @param pitch the pitch to set - */ - public void setPitch(float pitch) { - this.pitch = pitch; - } - /** - * @return the yaw - */ - public float getYaw() { - return yaw; - } - /** - * @param yaw the yaw to set - */ - public void setYaw(float yaw) { - this.yaw = yaw; - } - - @Override - public String toString() { - return "Orientation : (roll: "+roll+", pitch: "+pitch+", yaw: "+yaw+")"; - } - -} diff --git a/WiiuseJ/src/wiiusej/Point2DInteger.java b/WiiuseJ/src/wiiusej/Point2DInteger.java deleted file mode 100644 index f2f9181..0000000 --- a/WiiuseJ/src/wiiusej/Point2DInteger.java +++ /dev/null @@ -1,35 +0,0 @@ -package wiiusej; - -import java.awt.geom.Point2D; - -public class Point2DInteger extends Point2D { - private int x; - private int y; - - public Point2DInteger(int xx, int yy) { - super(); - setLocation(xx,yy); - } - - @Override - public double getX() { - return x; - } - - @Override - public double getY() { - return y; - } - - @Override - public void setLocation(double xx, double yy) { - this.x = (int)xx; - this.y = (int)yy; - } - - @Override - public String toString() { - return "("+x+","+y+")"; - } - -} diff --git a/WiiuseJ/src/wiiusej/WiiMoteEvent.java b/WiiuseJ/src/wiiusej/WiiMoteEvent.java deleted file mode 100644 index 663298d..0000000 --- a/WiiuseJ/src/wiiusej/WiiMoteEvent.java +++ /dev/null @@ -1,706 +0,0 @@ -package wiiusej; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - * Class that is a bean to be filled by the wiiuse API. - * - * @author gduche - * - */ -public class WiiMoteEvent { - - /* Buttons MACRO */ - private static short WIIMOTE_BUTTON_TWO = 0x0001; - private static short WIIMOTE_BUTTON_ONE = 0x0002; - private static short WIIMOTE_BUTTON_B = 0x0004; - private static short WIIMOTE_BUTTON_A = 0x0008; - private static short WIIMOTE_BUTTON_MINUS = 0x0010; - private static short WIIMOTE_BUTTON_ZACCEL_BIT6 = 0x0020; - private static short WIIMOTE_BUTTON_ZACCEL_BIT7 = 0x0040; - private static short WIIMOTE_BUTTON_HOME = 0x0080; - private static short WIIMOTE_BUTTON_LEFT = 0x0100; - private static short WIIMOTE_BUTTON_RIGHT = 0x0200; - private static short WIIMOTE_BUTTON_DOWN = 0x0400; - private static short WIIMOTE_BUTTON_UP = 0x0800; - private static short WIIMOTE_BUTTON_PLUS = 0x1000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT4 = 0x2000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT5 = 0x4000; - private static int WIIMOTE_BUTTON_UNKNOWN = 0x8000; - private static short WIIMOTE_BUTTON_ALL = 0x1F9F; - - private static short WIIMOTE_LED_1 = 1; - private static short WIIMOTE_LED_2 = 2; - private static short WIIMOTE_LED_3 = 4; - private static short WIIMOTE_LED_4 = 8; - - private static short NB_LEDS = 4; - - /* ID */ - private int wiimoteId = -1; - - /* Status variables */ - private boolean connected = false; - - private float batteryLevel = -1; - - private short leds = 0; - - private boolean isSpeakerEnabled = false; - - private boolean isThereAttachment = false; - - private boolean isRumbleActive = false; - - private float orientationThreshold = 0; - - private boolean isContinuousActive = false; - - private boolean isSmoothingActive = false; - - /* Buttons */ - private short buttonsJustPressed = 0; - private short buttonsJustReleased = 0; - private short buttonsHeld = 0; - - /* IR Tracking */ - private boolean isIrActive = false; - private Point2DInteger[] IRPoints; - - /* Motion Sensing */ - private boolean isMotionSensingActive = false; - private Orientation orientation; - private GForce gforce; - - /** - * Default constructor - */ - public WiiMoteEvent() { - // init IRPoints array - IRPoints = new Point2DInteger[NB_LEDS]; - } - - /** - * Construct the Wiimote setting up the id. - * - * @param id - * the Wiimote id - */ - public WiiMoteEvent(int id) { - this(); - wiimoteId = id; - } - - /** - * Get Wiimote ID - * - * @return the wiimote id. - */ - public int getWiimoteId() { - return wiimoteId; - } - - /** - * Set Wiimote ID - * - * @param wiimoteId - * id of the wiimote - */ - void setWiimoteId(int wiimoteId) { - this.wiimoteId = wiimoteId; - } - - /** - * True if the wiimote is connected false otherwise. - * - * @return return the connected status. - */ - public boolean isConnected() { - return connected; - } - - /** - * Set the connected value to true. - */ - void setConnected() { - this.connected = true; - } - - /** - * Set the connected value to false. - */ - void setDisconnected() { - this.connected = false; - } - - /** - * Get battery level. - * - * @return battery level. 1 = 100% - */ - public float getBatteryLevel() { - return batteryLevel; - } - - /** - * Set level battery. - * - * @param batteryLevel - * must be between 0 and 1 - */ - void setBatteryLevel(float batteryLevel) { - this.batteryLevel = batteryLevel; - } - - /** - * Get status of the leds . - * - * @return a short representing LEDS turned on. - */ - public short getLeds() { - return leds; - } - - /** - * Set Status of the leds. - * - * @param leds - */ - void setLeds(short leds) { - this.leds = leds; - } - - /** - * Tell if the speaker is enable for this wiimote - * - * @return TRUE if it enabled false otherwise - */ - public boolean isSpeakerEnabled() { - return isSpeakerEnabled; - } - - /** - * Set the flag for the speaker to "enabled" - */ - void setSpeakerEnabled() { - this.isSpeakerEnabled = true; - } - - /** - * Set the flag for the speaker to "disabled" - */ - void setSpeakerDisabled() { - this.isSpeakerEnabled = false; - } - - /** - * Tell if there is an attachment to the Wiimote - * - * @return TRUE if it there is one false otherwise - */ - public boolean isThereAttachment() { - return isThereAttachment; - } - - /** - * Set the flag for the attachment to true - */ - void setThereIsAnAttachment() { - this.isThereAttachment = true; - } - - /** - * Set the flag for the attachment to false - */ - void setThereIsNoAttachment() { - this.isThereAttachment = false; - } - - /** - * Get the status of rumble. - * - * @return true if the rumble is active false otherwise - */ - public boolean isRumbleActive() { - return isRumbleActive; - } - - /** - * Set Rumble flag to Active. - */ - void setRumbleActive() { - this.isRumbleActive = true; - } - - /** - * Set Rumble flag to Inactive. - */ - void setRumbleInactive() { - this.isRumbleActive = false; - } - - /** - * Get orientation threshold. - * - * @return the orientationThreshold - */ - public float getOrientationThreshold() { - return orientationThreshold; - } - - /** - * Set the orientation threshold. - * - * @param orientationThreshold - * the orientationThreshold to set - */ - void setOrientationThreshold(float orientationThreshold) { - this.orientationThreshold = orientationThreshold; - } - - /** - * Tell if the CONTINUOUS option is activated. - * - * @return the isContinuousActive - */ - public boolean isContinuousActive() { - return isContinuousActive; - } - - /** - * Set the CONTINUOUS option active. - */ - void setContinuousActive() { - this.isContinuousActive = true; - } - - /** - * Set the CONTINUOUS option inactive. - */ - void setContinuousInactive() { - this.isContinuousActive = false; - } - - /** - * Tell if the option SMOOTHING is activated. - * - * @return the isSmoothingActive - */ - public boolean isSmoothingActive() { - return isSmoothingActive; - } - - /** - * Set SMOOTHING option to active. - */ - void setSmoothingActive() { - this.isSmoothingActive = true; - } - - /** - * Set SMOOTHING option to inactive. - */ - void setSmoothingInactive() { - this.isSmoothingActive = false; - } - - /** - * Get the short storing the buttons just pressed - * - * @return the short storing the buttons just pressed - */ - public short getButtonsJustPressed() { - return buttonsJustPressed; - } - - /** - * set the short storing the buttons just pressed - * - * @param buttonsJustPressed - */ - void setButtonsJustPressed(short buttonsJustPressed) { - this.buttonsJustPressed = buttonsJustPressed; - } - - /** - * Get the short storing the buttons just released - * - * @return the short storing the buttons just released - */ - public short getButtonsJustReleased() { - return buttonsJustReleased; - } - - /** - * set the short storing the buttons just released - * - * @param buttonsJustReleased - */ - void setButtonsJustReleased(short buttonsJustReleased) { - this.buttonsJustReleased = buttonsJustReleased; - } - - /** - * get the short storing the buttons held - * - * @return the short storing the buttons held - */ - public short getButtonsHeld() { - return buttonsHeld; - } - - /** - * set the short storing the buttons held - * - * @param buttonsHeld - */ - void setButtonsHeld(short buttonsHeld) { - this.buttonsHeld = buttonsHeld; - } - - /** - * Tell if the IR Tracking is active. - * - * @return TRUE if it is active or false otherwise. - */ - public boolean isIrActive() { - return isIrActive; - } - - /** - * Set the value isIrActive to true - */ - void setIrActive() { - this.isIrActive = true; - } - - /** - * Set the value isIrActive to true - */ - void setIrInactive() { - this.isIrActive = false; - } - - /** - * Get list of IR points. - * - * @return the list of 2D points - */ - public Point2DInteger[] getIRPoints() { - return IRPoints; - } - - /** - * Add IR Point in the list (Max 4 points) - * - * @param x - * x value - * @param y - * y value - */ - void addIRpoint(int x, int y) { - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] == null) { - IRPoints[i] = new Point2DInteger(x, y); - return; - } - } - return; - } - - /** - * Clear IR points. - */ - void EmptyIRPoints() { - for (int i = 0; i < IRPoints.length; i++) { - IRPoints[i] = null; - } - } - - /** - * Get the flag indicating if the motion sensing is active. - * - * @return true if the motion sensing is active false otherwise - */ - public boolean isMotionSensingActive() { - return isMotionSensingActive; - } - - /** - * Set the motion sensing flag to active. - */ - void setMotionSensingActive() { - this.isMotionSensingActive = true; - } - - /** - * Set the motion sensing flag to inactive. - */ - void setMotionSensingInactive() { - this.isMotionSensingActive = false; - } - - /** - * @return the orientation - */ - public Orientation getOrientation() { - return orientation; - } - - /** - * Set orientation of the wiimote. - * - * @param r - * roll - * @param p - * pitch - * @param y - * yaw - */ - void setOrientation(float r, float p, float y) { - this.orientation = new Orientation(r, p, y); - } - - /** - * Get the gravity force. - * - * @return the gforce - */ - public GForce getGforce() { - return gforce; - } - - /** - * Set the gravity force. - * - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - */ - void setGforce(float x, float y, float z) { - this.gforce = new GForce(x, y, z); - } - - /** **************** BUTTONS Methods ***************** */ - /* generic button functions */ - - private boolean buttonTest(short buttonBitsDefinition, short buttons) { - return (buttons & buttonBitsDefinition) == buttonBitsDefinition; - } - - private boolean isButtonJustPressed(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustPressed) - && !isButtonHeld(buttonBitsDefinition); - } - - private boolean isButtonJustReleased(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustReleased); - } - - private boolean isButtonHeld(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsHeld); - } - - /* Button ONE */ - - public boolean isButtonOneJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneHeld() { - return isButtonHeld(WIIMOTE_BUTTON_ONE); - } - - /* Button TWO */ - - public boolean isButtonTwoJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoHeld() { - return isButtonHeld(WIIMOTE_BUTTON_TWO); - } - - /* Button A */ - - public boolean isButtonAJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAHeld() { - return isButtonHeld(WIIMOTE_BUTTON_A); - } - - /* Button B */ - - public boolean isButtonBJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBHeld() { - return isButtonHeld(WIIMOTE_BUTTON_B); - } - - /* Button LEFT */ - - public boolean isButtonLeftJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftHeld() { - return isButtonHeld(WIIMOTE_BUTTON_LEFT); - } - - /* Button RIGHT */ - - public boolean isButtonRightJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightHeld() { - return isButtonHeld(WIIMOTE_BUTTON_RIGHT); - } - - /* Button UP */ - - public boolean isButtonUpJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpHeld() { - return isButtonHeld(WIIMOTE_BUTTON_UP); - } - - /* Button DOWN */ - - public boolean isButtonDownJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownHeld() { - return isButtonHeld(WIIMOTE_BUTTON_DOWN); - } - - /* Button - */ - - public boolean isButtonMinusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_MINUS); - } - - /* Button + */ - - public boolean isButtonPlusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_PLUS); - } - - /* Button HOME */ - - public boolean isButtonHomeJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeHeld() { - return isButtonHeld(WIIMOTE_BUTTON_HOME); - } - - @Override - public String toString() { - super.toString(); - String out = ""; - /* Status */ - out += "/*********** WIIMOTE ID :" + wiimoteId + " ********/\n"; - out += "--- connected : " + connected + "\n"; - out += "--- Battery level : " + batteryLevel + "\n"; - out += "= --- Leds : " + leds + "\n"; - out += "--- Speaker enabled : " + isSpeakerEnabled + "\n"; - out += "--- Attachment ? : " + isThereAttachment + "\n"; - out += "--- Rumble ? : " + isRumbleActive + "\n"; - out += "--- Orientation threshold value ? : " + orientationThreshold - + "\n"; - out += "--- Continuous ? : " + isContinuousActive + "\n"; - out += "--- Smoothing ? : " + isSmoothingActive + "\n"; - /* Display buttons */ - out += "/******** Buttons ********/\n"; - out += "--- Buttons just pressed : " + buttonsJustPressed + "\n"; - out += "--- Buttons just released : " + buttonsJustReleased + "\n"; - out += "--- Buttons held : " + buttonsHeld + "\n"; - - /* Display IR Tracking */ - out += "/******** IR Tracking ********/\n"; - out += "--- Active : " + isIrActive + "\n"; - if (isIrActive) { - out += "--- Seen points\n"; - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] != null) { - out += IRPoints[i].toString(); - } - } - } - - /* Motion sensing */ - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : " + isMotionSensingActive + "\n"; - if (isMotionSensingActive) { - out += "--- " + orientation + "\n"; - out += "--- " + gforce + "\n"; - } - return out; - } - -} diff --git a/WiiuseJ/src/wiiusej/WiiUseApi.java b/WiiuseJ/src/wiiusej/WiiUseApi.java deleted file mode 100644 index 091f269..0000000 --- a/WiiuseJ/src/wiiusej/WiiUseApi.java +++ /dev/null @@ -1,174 +0,0 @@ -package wiiusej; - -/** - * Singleton used to manipulate WiiUse Api. - * @author gduche - * - */ -public class WiiUseApi { - - static { - System.loadLibrary("libWiiuseJ"); - } - - private static WiiUseApi instance = new WiiUseApi(); - - /** - * Get the only instance of WiiUseApi. - * @return - */ - static WiiUseApi getInstance(){ - return instance; - } - - /** - * Load the library. - * - * @return 0 if there is an error, 1 if everything is ok. - */ - native int loadLibrary(); - - /** - * Try to connect to 2 wiimotes. Make them rumble to show they are - * connected. - * - * @return 0 if there is an error otherwise it returns the number of - * wiimotes connected. - */ - native int doConnections(); - - /** - * Close connection to the wiimote with the given id. - * - */ - native void closeConnection(int id); - - /** - * Shutdown Wiiuse API. - * @return 0 if there is an error, 1 if everything is ok. - */ - native void shutdownApi(); - - /** - * Activate rumble on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateRumble(int id); - - /** - * Deactivate rumble on the wiimote with the given id. - * - * @param id the id of the wiimote. - */ - native void deactivateRumble(int id); - - /** - * Activate IR Tracking on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateIRTracking(int id); - - /** - * Deactivate IR Tracking on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void deactivateIRTracking(int id); - - /** - * Activate motion sensing on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateMotionSensing(int id); - - /** - * Deactivate motion sensing on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void deactivateMotionSensing(int id); - - /** - * Set wiimote leds status. - * @param id the id of the wiimote concerned - * @param led1 status of led1: True=ON, False=OFF - * @param led2 status of led2: True=ON, False=OFF - * @param led3 status of led3: True=ON, False=OFF - * @param led4 status of led4: True=ON, False=OFF - */ - native void setLeds(int id, boolean led1, boolean led2, boolean led3, boolean led4); - - /** - * Set how many degrees an angle must change to generate an event. - * @param id id of the wiimote concerned - * @param angle minimum angle detected by an event - */ - native void setOrientThreshold(int id, float angle); - - /** - * Make the the accelerometers give smoother results. - * This is set by default. - * @param id the id of the wiimote concerned - */ - native void activateSmoothing(int id); - - /** - * Make the the accelerometers give raw results. - * @param id the id of the wiimote concerned - */ - native void deactivateSmoothing(int id); - - /** - * Make the wiimote generate an event each time we poll. - * Not set by default. - * @param id the id of the wiimote concerned - */ - native void activateContinuous(int id); - - /** - * Make the wiimote generate an event only when there is one. - * @param id the id of the wiimote concerned - */ - native void deactivateContinuous(int id); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param id the id of the wiimote of which we want the status. - */ - native void getStatus(int id); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param mote The WiimoteEvent object to fill with the datas. - */ - native void specialPoll(WiiMoteEvent mote); - - - /* Tests */ - public static void main(String[] args) { - - /* Test JNI Side */ - WiiUseApi manager = new WiiUseApi(); - - int value = manager.loadLibrary(); - System.out.println("loadLibrary : " + value); - - value = manager.doConnections(); - System.out.println("doConnections : " + value); - - WiiMoteEvent mote = new WiiMoteEvent(); - - manager.getStatus(1); - System.out.println("Status : \n" + mote); - - System.out.println(""); - System.out.println("!!!!!!!!!!!!!! Polling !!!!!!!!!"); - while (true) { - manager.specialPoll(mote); - System.out.println(mote); - mote.EmptyIRPoints(); - } - // manager.closeConnectionsAndShutDown(); - } - -} diff --git a/WiiuseJ/src/wiiusej/WiiUseApiListener.java b/WiiuseJ/src/wiiusej/WiiUseApiListener.java deleted file mode 100644 index 81f3792..0000000 --- a/WiiuseJ/src/wiiusej/WiiUseApiListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package wiiusej; - - - -public interface WiiUseApiListener extends java.util.EventListener { - - void wiimoteEvent(WiiMoteEvent e); - -} diff --git a/WiiuseJ/src/wiiusej/WiiUseApiManager.java b/WiiuseJ/src/wiiusej/WiiUseApiManager.java deleted file mode 100644 index 178e0c4..0000000 --- a/WiiuseJ/src/wiiusej/WiiUseApiManager.java +++ /dev/null @@ -1,374 +0,0 @@ -package wiiusej; - -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.swing.event.EventListenerList; - -/** - * Class that manage the use of Wiiuse API. - * - * @author gduche - * - */ -public class WiiUseApiManager extends Thread { - - private static WiiUseApiManager instance = new WiiUseApiManager(); - - private final EventListenerList listeners = new EventListenerList(); - - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - - private boolean loaded = false; - - private int connected = 0; - - private AtomicBoolean running = new AtomicBoolean(false); - - private ConcurrentLinkedQueue requests = new ConcurrentLinkedQueue(); - - public static WiiUseApiManager getInstance() { - return instance; - } - - /** - * Load the wiimote library. - * - * @return false if the library is not loaded true otherwise. - */ - public boolean loadLibrary() { - if (!loaded) {// not yet loaded try to load it - int load = wiiuse.loadLibrary(); - if (load > 0) { - loaded = true; - return true; - } else { - loaded = false; - System.out.println("Error loading the Wiimote library !!!"); - return false; - } - } - // already loaded - return loaded; - } - - /** - * Connect wiimote and get the nu ber of wiimotes connected. Supposed to be - * used once. - * - * @return 0 if nothing connected or the number of wiimotes connected. - */ - public int connectWiimotes() { - if (loaded) { - connected = wiiuse.doConnections(); - System.out.println(connected + " wiimote(s) connected !!!"); - return connected; - } else {// library not loaded, no wiimotes connected - return 0; - } - } - - /** - * Ask the thread to close a connection. - * - * @param id - * id of the wiimote to disconnect. - */ - public void closeConnection(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST)); - } - - /** - * Get the number of wiimotes connected. - * - * @return the number of wiimotes connected. - */ - public int getNbConnectedWiimotes() { - return connected; - } - - /** - * Stop thread and shutdown wiiuse Api. - */ - public void shutdown() { - running.set(false); - wiiuse.shutdownApi(); - } - - /** - * Activate the rumble for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Deactivate the rumble for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Activate IR Tracking for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Deactivate IR Tracking for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Activate IR Tracking of the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Deactivate IR Tracking of the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Activate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Deactivate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Activate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Deactivate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote - */ - public void deactivateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Set leds for the wiimotes with the given id. - * - * @param id - * id of the wiimote - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(int id, boolean l1, boolean l2, boolean l3, boolean l4) { - requests.add(new LedsRequest(id, WiiUseApiRequest.WIIUSE_LEDS_REQUEST, - l1, l2, l3, l4)); - } - - /** - * Set the orientation threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(int id, float th) { - requests.add(new OrientThresholdRequest(id, - WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST, th)); - } - - /** - * Get Status for the wiimote for the given id. - * - * @param id - * id of the wiimote - */ - public void getStatus(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_STATUS_REQUEST)); - } - - @Override - public void run() { - - if (loaded && (connected > 0)) { - running.set(true); - - WiiMoteEvent evt = new WiiMoteEvent(); - - // Start polling and tell the observers when there Wiimote events - while (running.get()) { - WiiUseApiRequest req = requests.poll(); - if (req != null) {// there is a request for the wiiuse api - int id = req.getId(); - if (req.getRequestType() == WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST) { - /* Close connections requests */ - wiiuse.closeConnection(id); - connected--; - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_STATUS_REQUEST) { - /* Status requests */ - wiiuse.getStatus(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST) { - /* Activate Rumble requests */ - wiiuse.activateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST) { - /* Deactivate Rumble requests */ - wiiuse.deactivateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST) { - /* Activate IR Tracking requests */ - wiiuse.activateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST) { - /* Deactivate IR Tracking requests */ - wiiuse.deactivateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST) { - /* Activate Motion sensing requests */ - wiiuse.activateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST) { - /* Deactivate Motion sensing requests */ - wiiuse.deactivateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_LEDS_REQUEST) { - /* leds requests */ - LedsRequest reqLed = (LedsRequest) req; - wiiuse.setLeds(id, reqLed.isLed1(), reqLed.isLed2(), - reqLed.isLed3(), reqLed.isLed4()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST) { - /* Activate smoothing requests */ - wiiuse.activateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST) { - /* Deactivate smoothing requests */ - wiiuse.deactivateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST) { - /* Activate continuous requests */ - wiiuse.activateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST) { - /* Deactivate continuous requests */ - wiiuse.deactivateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST) { - /* set orientation request */ - wiiuse.setOrientThreshold(req.getId(), - ((OrientThresholdRequest) req).getThresholhd()); - } else { - System.out.println("Bad request to Wiiuse API !!!!!"); - } - } - - /* Polling */ - wiiuse.specialPoll(evt); - - if (evt.getWiimoteId() != -1) {// there is an event notify - // observers - notifyWiiUseApiListener(evt); - } - if (evt.getWiimoteId() != -1) {// create a new event when the last event created was filled - if (!evt.isConnected()){//check if it was a disconnection - connected --; - if (connected == 0){ - System.out.println("No more wiimotes connected !!!"); - } - } - evt = new WiiMoteEvent(); - } - } - - } else { - System.out.println("No polling possible !!!"); - } - - } - - /** - * - * @param listener - */ - public void addWiiUseApiListener(WiiUseApiListener listener) { - listeners.add(WiiUseApiListener.class, listener); - } - - /** - * - * @param listener - */ - public void removeWiiUseApiListener(WiiUseApiListener listener) { - listeners.remove(WiiUseApiListener.class, listener); - } - - /** - * - * @return - */ - public WiiUseApiListener[] getWiiUseApiListeners() { - return listeners.getListeners(WiiUseApiListener.class); - } - - /** - * - * @param evt - */ - public void notifyWiiUseApiListener(WiiMoteEvent evt) { - for (WiiUseApiListener listener : getWiiUseApiListeners()) { - listener.wiimoteEvent(evt); - } - } - -} diff --git a/WiiuseJ/src/wiiusej/WiiUseApiRequest.java b/WiiuseJ/src/wiiusej/WiiUseApiRequest.java deleted file mode 100644 index 56998c7..0000000 --- a/WiiuseJ/src/wiiusej/WiiUseApiRequest.java +++ /dev/null @@ -1,82 +0,0 @@ -package wiiusej; - -/** - * Represents a request we could do to the WiiUse API. - * @author gduche - * - */ -public class WiiUseApiRequest { - - public static int WIIUSE_STATUS_REQUEST=1; - public static int WIIUSE_ACTIVATE_SMOOTHING_REQUEST=2; - public static int WIIUSE_DEACTIVATE_SMOOTHING_REQUEST=-2; - public static int WIIUSE_ACTIVATE_IR_TRACKING_REQUEST=3; - public static int WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST=-3; - public static int WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST=4; - public static int WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST=-4; - public static int WIIUSE_CLOSE_CONNECTION_REQUEST=5; - public static int WIIUSE_ACTIVATE_CONTINUOUS_REQUEST=6; - public static int WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST=-6; - public static int WIIUSE_ACTIVATE_RUMBLE_REQUEST=7; - public static int WIIUSE_DEACTIVATE_RUMBLE_REQUEST=-7; - public static int WIIUSE_LEDS_REQUEST=8; - public static int WIIUSE_ORIENT_THRESHOLHD_REQUEST=9; - - - private int wiimoteId=0; - private int requestType=0; - - /** - * Constructor setting the id of the wiimote concerned. - * @param id the id of the wiimote concerned. - */ - public WiiUseApiRequest(int id){ - wiimoteId = id; - } - - /** - * Constructor setting the id of the wiimote concerned. - * @param id the id of the wiimote concerned. - * - */ - public WiiUseApiRequest(int id, int type){ - wiimoteId = id; - requestType = type; - } - - /** - * Get id of the wiimote concerned by this request. - * @return id of the wiimote concerned - */ - public int getId(){ - return wiimoteId; - } - - /** - * Set id of the wiimote concerned by this request. - * @param id id fh the wiimote concernet - */ - public void setId(int id){ - wiimoteId = id; - } - - /** - * Get the request type. - * @return the requestType - */ - public int getRequestType() { - return requestType; - } - - /** - * Set the request type. - * @param requestType the requestType to set - */ - public void setRequestType(int requestType) { - this.requestType = requestType; - } - - - -} - diff --git a/WiiuseJ/wiiuse.dll b/WiiuseJ/wiiuse.dll deleted file mode 100644 index c6ea93fa8adb95a0baf88aa7dc92a353dbbc9293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 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 HW#7B-J*0N`=WAU2% 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - diff --git a/WiiuseJC/.project b/WiiuseJC/.project deleted file mode 100644 index 82c2d24..0000000 --- a/WiiuseJC/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - WiiuseJC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/WiiuseJC/Release} - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.append_environment - true - - - ?name? - - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.cnature - - diff --git a/WiiuseJC/wiiuse.c b/WiiuseJC/wiiuse.c deleted file mode 100644 index 23db02f..0000000 --- a/WiiuseJC/wiiuse.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * wiiuse - * - * Written By: - * Michael Laforest < para > - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * 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 API source file - * - * The file must be linked to any third party - * program that is utilizing wiiuse as an - * external library. - */ - -#define WIIUSE_API_SRC - -#include -#include "wiiuse.h" - -#ifdef WIN32 - #define WIN32_LEAN_AND_MEAN - #include -#else - #include -#endif - -typedef int (*entry_func_t)(struct wiiuse_api_t**); - -struct wiiuse_api_t* wiiuse_api = NULL; -void* wiiuse_mod = NULL; - -/** - * @brief Load the wiiuse library and initialize the function pointers. - * - * @param wiiuse_file The relative or absolute path to the wiiuse library file. - * - * @return The version of the wiiuse library loaded. - * - * @see wiiuse_shutdown() - * - * If the version of wiiuse being used has a different API - * version as expected, this function will fail and return 0. - */ -const char* wiiuse_startup(char* wiiuse_file) { - entry_func_t entry_func = NULL; - - if (wiiuse_api) - /* already loaded */ - return wiiuse_api->version; - - if (!wiiuse_file) - return NULL; - - /* load the module */ - wiiuse_mod = dlopen(wiiuse_file, RTLD_NOW); - - if (!wiiuse_mod) - /* can not load module */ - return NULL; - - /* get the entry point */ - entry_func = (entry_func_t)dlsym(wiiuse_mod, "wiiuse_main"); - - if (!entry_func) { - wiiuse_shutdown(); - return NULL; - } - - /* call the entry function */ - entry_func(&wiiuse_api); - - /* make sure the API versions are the same */ - if (wiiuse_api->api_version != WIIUSE_API_VERSION) { - wiiuse_shutdown(); - return NULL; - } - - /* set all the function pointers */ - wiiuse_init = wiiuse_api->_wiiuse_init; - wiiuse_disconnected = wiiuse_api->_wiiuse_disconnected; - wiiuse_rumble = wiiuse_api->_wiiuse_rumble; - wiiuse_toggle_rumble = wiiuse_api->_wiiuse_toggle_rumble; - wiiuse_set_leds = wiiuse_api->_wiiuse_set_leds; - wiiuse_motion_sensing = wiiuse_api->_wiiuse_motion_sensing; - wiiuse_read_data = wiiuse_api->_wiiuse_read_data; - wiiuse_write_data = wiiuse_api->_wiiuse_write_data; - wiiuse_status = wiiuse_api->_wiiuse_status; - wiiuse_get_by_id = wiiuse_api->_wiiuse_get_by_id; - wiiuse_set_flags = wiiuse_api->_wiiuse_set_flags; - wiiuse_set_smooth_alpha = wiiuse_api->_wiiuse_set_smooth_alpha; - wiiuse_set_ir = wiiuse_api->_wiiuse_set_ir; - wiiuse_set_ir_vres = wiiuse_api->_wiiuse_set_ir_vres; - wiiuse_set_ir_position = wiiuse_api->_wiiuse_set_ir_position; - wiiuse_set_aspect_ratio = wiiuse_api->_wiiuse_set_aspect_ratio; - wiiuse_set_bluetooth_stack = wiiuse_api->_wiiuse_set_bluetooth_stack; - wiiuse_set_orient_threshold = wiiuse_api->_wiiuse_set_orient_threshold; - wiiuse_find = wiiuse_api->_wiiuse_find; - wiiuse_connect = wiiuse_api->_wiiuse_connect; - wiiuse_disconnect = wiiuse_api->_wiiuse_disconnect; - wiiuse_poll = wiiuse_api->_wiiuse_poll; - - printf("wiiuse v%s loaded ( http://wiiuse.net http://wiiuse.sf.net/ ).\n", wiiuse_api->version); - - return wiiuse_api->version; -} - - -/** - * @brief Unload the library. - * - * @see wiiuse_startup() - */ -void wiiuse_shutdown() { - if (!wiiuse_mod) - return; - - /* unload the module */ - dlclose(wiiuse_mod); - - wiiuse_api = NULL; - - wiiuse_init = NULL; - wiiuse_disconnected = NULL; - wiiuse_rumble = NULL; - wiiuse_toggle_rumble = NULL; - wiiuse_set_leds = NULL; - wiiuse_motion_sensing = NULL; - wiiuse_read_data = NULL; - wiiuse_write_data = NULL; - wiiuse_status = NULL; - wiiuse_get_by_id = NULL; - wiiuse_set_flags = NULL; - wiiuse_set_smooth_alpha = NULL; - wiiuse_set_ir = NULL; - wiiuse_set_ir_vres = NULL; - wiiuse_set_ir_position = NULL; - wiiuse_set_aspect_ratio = NULL; - wiiuse_set_bluetooth_stack = NULL; - wiiuse_set_orient_threshold = NULL; - wiiuse_find = NULL; - wiiuse_connect = NULL; - wiiuse_disconnect = NULL; - wiiuse_poll = NULL; - -} diff --git a/WiiuseJC/wiiuse.h b/WiiuseJC/wiiuse.h deleted file mode 100644 index 9a466d9..0000000 --- a/WiiuseJC/wiiuse.h +++ /dev/null @@ -1,687 +0,0 @@ -/* - * wiiuse - * - * Written By: - * Michael Laforest < para > - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * 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 API header file. - * - * If this file is included from inside the wiiuse source - * and not from a third party program, then wiimote_internal.h - * is also included which extends this file. - */ - -#ifndef WIIUSE_H_INCLUDED -#define WIIUSE_H_INCLUDED - -/* ignore this, this is used internally for wiiuse */ -#ifdef __WIIUSE__ - #ifndef WIIUSE_INTERNAL_H_INCLUDED - #error wiiuse.h included directly. Must include wiiuse_internal.h instead. - #endif - #define WCONST -#else - #define WCONST const -#endif - -#if defined(WIN32) || defined(__WIN32__) - /* windows */ - #include - #include - #include - #include - - #define dlopen(file, x) (void*)LoadLibrary(file) - #define dlsym(dll, func) (void*)GetProcAddress((HMODULE)(dll), (func)) - #define dlclose(dll) FreeLibrary((HMODULE)(dll)) - #define Dl_info MEMORY_BASIC_INFORMATION - #define dladdr(func, inf) VirtualQuery(func, inf, sizeof(*inf)) -#else - /* nix */ - #include -#endif - -/* wiiuse version and API version */ -#define WIIUSE_VERSION "0.9" -#define WIIUSE_API_VERSION 8 - -/* led bit masks */ -#define WIIMOTE_LED_NONE 0x00 -#define WIIMOTE_LED_1 0x10 -#define WIIMOTE_LED_2 0x20 -#define WIIMOTE_LED_3 0x40 -#define WIIMOTE_LED_4 0x80 - -/* button codes */ -#define WIIMOTE_BUTTON_TWO 0x0001 -#define WIIMOTE_BUTTON_ONE 0x0002 -#define WIIMOTE_BUTTON_B 0x0004 -#define WIIMOTE_BUTTON_A 0x0008 -#define WIIMOTE_BUTTON_MINUS 0x0010 -#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020 -#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040 -#define WIIMOTE_BUTTON_HOME 0x0080 -#define WIIMOTE_BUTTON_LEFT 0x0100 -#define WIIMOTE_BUTTON_RIGHT 0x0200 -#define WIIMOTE_BUTTON_DOWN 0x0400 -#define WIIMOTE_BUTTON_UP 0x0800 -#define WIIMOTE_BUTTON_PLUS 0x1000 -#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000 -#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000 -#define WIIMOTE_BUTTON_UNKNOWN 0x8000 -#define WIIMOTE_BUTTON_ALL 0x1F9F - -/* nunchul button codes */ -#define NUNCHUK_BUTTON_Z 0x01 -#define NUNCHUK_BUTTON_C 0x02 - -/* classic controller button codes */ -#define CLASSIC_CTRL_BUTTON_UP 0x0001 -#define CLASSIC_CTRL_BUTTON_LEFT 0x0002 -#define CLASSIC_CTRL_BUTTON_ZR 0x0004 -#define CLASSIC_CTRL_BUTTON_X 0x0008 -#define CLASSIC_CTRL_BUTTON_A 0x0010 -#define CLASSIC_CTRL_BUTTON_Y 0x0020 -#define CLASSIC_CTRL_BUTTON_B 0x0040 -#define CLASSIC_CTRL_BUTTON_ZL 0x0080 -#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200 -#define CLASSIC_CTRL_BUTTON_PLUS 0x0400 -#define CLASSIC_CTRL_BUTTON_HOME 0x0800 -#define CLASSIC_CTRL_BUTTON_MINUS 0x1000 -#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000 -#define CLASSIC_CTRL_BUTTON_DOWN 0x4000 -#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000 - -/* wiimote option flags */ -#define WIIUSE_SMOOTHING 0x01 -#define WIIUSE_CONTINUOUS 0x02 -#define WIIUSE_ORIENT_THRESH 0x04 -#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH) - -/* IR correction types */ -typedef enum ir_position_t { - WIIUSE_IR_ABOVE, - WIIUSE_IR_BELOW -} ir_position_t; - -/** - * @brief Check if a button is pressed. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_PRESSED(dev, button) ((dev->btns & button) == button) - -/** - * @brief Check if a button is being held. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is held, 0 if not. - */ -#define IS_HELD(dev, button) ((dev->btns_held & button) == button) - -/** - * @brief Check if a button is released on this event. \n\n - * This does not mean the button is not pressed, it means \n - * this button was just now released. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is released, 0 if not. - * - */ -#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button) - -/** - * @brief Check if a button has just been pressed this event. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button)) - -#define WIIUSE_USING_ACC(wm) ((wm->state & 0x10) == 0x10) -#define WIIUSE_USING_EXP(wm) ((wm->state & 0x20) == 0x20) -#define WIIUSE_USING_IR(wm) ((wm->state & 0x40) == 0x40) - -/* - * Largest known payload is 21 bytes. - * Add 2 for the prefix and round up to a power of 2. - */ -#define MAX_PAYLOAD 32 - -typedef unsigned char byte; -typedef char sbyte; - -struct wiimote_t; -struct vec3b_t; -struct orient_t; -struct gforce_t; - -/** - * @brief Event callback. - * - * @param wm Pointer to a wiimote_t structure. - * @param btns What buttons are currently pressed. They are OR'ed together. - * @param accel Acceleration of the device along each axis. - * This is the raw data reported by the wiimote. - * @param orient Orientation (roll, pitch, yaw) of the device. - * @param gforce Pull of gravity on each axis of the device (measured in gravity units). - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when an event occurs on the specified wiimote. - */ -typedef void (*wiiuse_event_cb)(struct wiimote_t* wm); - -/** - * @brief Callback that handles a read event. - * - * @param wm Pointer to a wiimote_t structure. - * @param data Pointer to the filled data block. - * @param len Length in bytes of the data block. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when the wiimote has returned the full data requested by a previous - * call to wiiuse_read_data(). - */ -typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len); - -/** - * @brief Callback that handles a controller status event. - * - * @param wm Pointer to a wiimote_t structure. - * @param attachment Is there an attachment? (1 for yes, 0 for no) - * @param speaker Is the speaker enabled? (1 for yes, 0 for no) - * @param ir Is the IR support enabled? (1 for yes, 0 for no) - * @param led What LEDs are lit. - * @param battery_level Battery level, between 0.0 (0%) and 1.0 (100%). - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when either the controller status changed or the controller - * status was requested explicitly by wiiuse_status(). - */ -typedef void (*wiiuse_ctrl_status_cb)(struct wiimote_t* wm, int attachment, int speaker, int ir, int led[4], float battery_level); - -/** - * @brief Callback that handles a disconnection event. - * - * @param wm Pointer to a wiimote_t structure. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when a disconnection occurs. This can happen if the POWER button - * is pressed or if the connection is interrupted. - */ -typedef void (*wiiuse_dis_cb)(struct wiimote_t* wm); - - -/** - * @struct read_req_t - * @brief Data read request structure. - */ -struct read_req_t { - wiiuse_read_cb cb; /**< read data callback */ - byte* buf; /**< buffer where read data is written */ - unsigned int addr; /**< the offset that the read started at */ - unsigned short size; /**< the length of the data read */ - unsigned short wait; /**< num bytes still needed to finish read */ - - struct read_req_t* next; /**< next read request in the queue */ -}; - - -/** - * @struct vec2b_t - * @brief Unsigned x,y byte vector. - */ -typedef struct vec2b_t { - byte x, y; -} vec2b_t; - - -/** - * @struct vec3b_t - * @brief Unsigned x,y,z byte vector. - */ -typedef struct vec3b_t { - byte x, y, z; -} vec3b_t; - - -/** - * @struct vec3f_t - * @brief Signed x,y,z float struct. - */ -typedef struct vec3f_t { - float x, y, z; -} vec3f_t; - - -/** - * @struct orient_t - * @brief Orientation struct. - * - * Yaw, pitch, and roll range from -180 to 180 degrees. - */ -typedef struct orient_t { - float roll; - float pitch; - float yaw; -} orient_t; - - -/** - * @struct gforce_t - * @brief Gravity force struct. - */ -typedef struct gforce_t { - float x, y, z; -} gforce_t; - - -/** - * @struct accel_t - * @brief Accelerometer struct. For any device with an accelerometer. - */ -typedef struct accel_t { - struct vec3b_t cal_zero; /**< zero calibration */ - struct vec3b_t cal_g; /**< gravity calibration */ - - float st_roll; /**< last smoothed roll value */ - float st_pitch; /**< last smoothed roll pitch */ - float st_alpha; /**< alpha value for smoothing [0-1] */ -} accel_t; - - -/** - * @struct ir_dot_t - * @brief A single IR source. - */ -typedef struct ir_dot_t { - byte visible; /**< if the IR source is visible */ - - unsigned int x; /**< interpolated X coordinate */ - unsigned int y; /**< interpolated Y coordinate */ - - short rx; /**< raw X coordinate (0-1023) */ - short ry; /**< raw Y coordinate (0-767) */ - - byte order; /**< increasing order by x-axis value */ - - byte size; /**< size of the IR dot (0-15) */ -} ir_dot_t; - - -/** - * @enum aspect_t - * @brief Screen aspect ratio. - */ -typedef enum aspect_t { - WIIUSE_ASPECT_4_3, - WIIUSE_ASPECT_16_9 -} aspect_t; - - -/** - * @struct ir_t - * @brief IR struct. Hold all data related to the IR tracking. - */ -typedef struct ir_t { - struct ir_dot_t dot[4]; /**< IR dots */ - byte num_dots; /**< number of dots at this time */ - - enum aspect_t aspect; /**< aspect ratio of the screen */ - - enum ir_position_t pos; /**< IR sensor bar position */ - - unsigned int vres[2]; /**< IR virtual screen resolution */ - int offset[2]; /**< IR XY correction offset */ - int state; /**< keeps track of the IR state */ - - int ax; /**< absolute X coordinate */ - int ay; /**< absolute Y coordinate */ - - int x; /**< calculated X coordinate */ - int y; /**< calculated Y coordinate */ - - float distance; /**< pixel distance between first 2 dots*/ - float z; /**< calculated distance */ -} ir_t; - - -/** - * @struct joystick_t - * @brief Joystick calibration structure. - * - * The angle \a ang is relative to the positive y-axis into quadrant I - * and ranges from 0 to 360 degrees. So if the joystick is held straight - * upwards then angle is 0 degrees. If it is held to the right it is 90, - * down is 180, and left is 270. - * - * The magnitude \a mag is the distance from the center to where the - * joystick is being held. The magnitude ranges from 0 to 1. - * If the joystick is only slightly tilted from the center the magnitude - * will be low, but if it is closer to the outter edge the value will - * be higher. - */ -typedef struct joystick_t { - struct vec2b_t max; /**< maximum joystick values */ - struct vec2b_t min; /**< minimum joystick values */ - struct vec2b_t center; /**< center joystick values */ - - float ang; /**< angle the joystick is being held */ - float mag; /**< magnitude of the joystick (range 0-1) */ -} joystick_t; - - -/** - * @struct nunchuk_t - * @brief Nunchuk expansion device. - */ -typedef struct nunchuk_t { - struct accel_t accel_calib; /**< nunchuk accelerometer calibration */ - struct joystick_t js; /**< joystick calibration */ - - int* flags; /**< options flag (points to wiimote_t.flags) */ - - byte btns; /**< what buttons have just been pressed */ - byte btns_held; /**< what buttons are being held down */ - byte btns_released; /**< what buttons were just released this */ - - struct vec3b_t accel; /**< current raw acceleration data */ - struct orient_t orient; /**< current orientation on each axis */ - struct gforce_t gforce; /**< current gravity forces on each axis */ -} nunchuk_t; - - -/** - * @struct classic_ctrl_t - * @brief Classic controller expansion device. - */ -typedef struct classic_ctrl_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float r_shoulder; /**< right shoulder button (range 0-1) */ - float l_shoulder; /**< left shoulder button (range 0-1) */ - - struct joystick_t ljs; /**< left joystick calibration */ - struct joystick_t rjs; /**< right joystick calibration */ -} classic_ctrl_t; - - -/** - * @struct expansion_t - * @brief Generic expansion device plugged into wiimote. - */ -typedef struct expansion_t { - enum { - EXP_NONE, - EXP_NUNCHUK, - EXP_CLASSIC - } type; /**< type of expansion attached */ - - union { - struct nunchuk_t nunchuk; - struct classic_ctrl_t classic; - }; -} expansion_t; - - -/** - * @enum win32_bt_stack_t - * @brief Available bluetooth stacks for Windows. - */ -typedef enum win_bt_stack_t { - WIIUSE_STACK_UNKNOWN, - WIIUSE_STACK_MS, - WIIUSE_STACK_BLUESOLEIL -} win_bt_stack_t; - - -typedef struct wiimote_state_t { - /* expansion_t */ - float exp_ljs_ang; - float exp_rjs_ang; - float exp_ljs_mag; - float exp_rjs_mag; - byte exp_btns; - struct orient_t exp_orient; - float exp_r_shoulder; - float exp_l_shoulder; - - /* ir_t */ - int ir_ax; - int ir_ay; - float ir_distance; - - struct orient_t orient; - unsigned short btns; -} wiimote_state_t; - - -/** - * @struct wiimote_t - * @brief Wiimote structure. - */ -typedef struct wiimote_t { - WCONST int unid; /**< user specified id */ - - #ifndef WIN32 - WCONST bdaddr_t bdaddr; /**< bt address */ - WCONST char bdaddr_str[18]; /**< readable bt address */ - WCONST int out_sock; /**< output socket */ - WCONST int in_sock; /**< input socket */ - #else - WCONST HANDLE dev_handle; /**< HID handle */ - WCONST OVERLAPPED hid_overlap; /**< overlap handle */ - WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */ - #endif - - WCONST int state; /**< various state flags */ - WCONST int leds; /**< currently lit leds */ - - WCONST int flags; /**< options flag */ - - WCONST wiiuse_event_cb event_cb; /**< event callback */ - WCONST wiiuse_dis_cb dis_cb; /**< disconnect callback */ - WCONST wiiuse_ctrl_status_cb stat_cb; /**< controller status callback */ - - WCONST byte handshake_state; /**< the state of the connection handshake */ - - WCONST struct read_req_t* read_req; /**< list of data read requests */ - WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */ - WCONST struct expansion_t exp; /**< wiimote expansion device */ - - WCONST struct vec3b_t accel; /**< current raw acceleration data */ - WCONST struct orient_t orient; /**< current orientation on each axis */ - WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ - - WCONST struct ir_t ir; /**< IR data */ - - WCONST unsigned short btns; /**< what buttons have just been pressed */ - WCONST unsigned short btns_held; /**< what buttons are being held down */ - WCONST unsigned short btns_released; /**< what buttons were just released this */ - - WCONST float orient_threshold; /**< threshold for orient to generate an event */ - - WCONST struct wiimote_state_t lstate; /**< last saved state */ - - WCONST byte event[MAX_PAYLOAD]; /**< event buffer */ -} wiimote; - - -/***************************************** - * - * Include API specific stuff - * - *****************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* wiiuse.c */ -typedef struct wiimote_t** (*_wiiuse_init_fptr)(int wiimotes, int* unids, wiiuse_event_cb event_cb, wiiuse_ctrl_status_cb stat_cb, wiiuse_dis_cb dis_cb); -typedef void (*_wiiuse_disconnected_fptr)(struct wiimote_t* wm); -typedef void (*_wiiuse_rumble_fptr)(struct wiimote_t* wm, int status); -typedef void (*_wiiuse_toggle_rumble_fptr)(struct wiimote_t* wm); -typedef void (*_wiiuse_set_leds_fptr)(struct wiimote_t* wm, int leds); -typedef void (*_wiiuse_motion_sensing_fptr)(struct wiimote_t* wm, int status); -typedef int (*_wiiuse_read_data_fptr)(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len); -typedef int (*_wiiuse_write_data_fptr)(struct wiimote_t* wm, unsigned int addr, byte* data, byte len); -typedef void (*_wiiuse_status_fptr)(struct wiimote_t* wm); -typedef struct wiimote_t* (*_wiiuse_get_by_id_fptr)(struct wiimote_t** wm, int wiimotes, int unid); -typedef int (*_wiiuse_set_flags_fptr)(struct wiimote_t* wm, int enable, int disable); -typedef float (*_wiiuse_set_smooth_alpha_fptr)(struct wiimote_t* wm, float alpha); -typedef void (*_wiiuse_set_ir_fptr)(struct wiimote_t* wm, int status); -typedef void (*_wiiuse_set_ir_vres_fptr)(struct wiimote_t* wm, unsigned int x, unsigned int y); -typedef void (*_wiiuse_set_ir_position_fptr)(struct wiimote_t* wm, enum ir_position_t pos); -typedef void (*_wiiuse_set_aspect_ratio_fptr)(struct wiimote_t* wm, enum aspect_t aspect); -typedef void (*_wiiuse_set_bluetooth_stack_fptr)(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type); -typedef void (*_wiiuse_set_orient_threshold_fptr)(struct wiimote_t* wm, float threshold); - -/* connect.c */ -typedef int (*_wiiuse_find_fptr)(struct wiimote_t** wm, int max_wiimotes, int timeout); -typedef int (*_wiiuse_connect_fptr)(struct wiimote_t** wm, int wiimotes); -typedef void (*_wiiuse_disconnect_fptr)(struct wiimote_t* wm); - -/* events.c */ -typedef void (*_wiiuse_poll_fptr)(struct wiimote_t** wm, int wiimotes); - -#ifdef __cplusplus -} -#endif - -/** - * @struct wiiuse_api_t - * @brief API structure that is filled by the library - * when the entry point is invoked. - * - * Unless you are modifying wiiuse, you probably - * will not be interested in any members - * that begin with an underscore (_). - */ -struct wiiuse_api_t { - const char* version; /**< wiiuse version */ - int api_version; /**< wiiuse API version */ - - _wiiuse_init_fptr _wiiuse_init; - _wiiuse_disconnected_fptr _wiiuse_disconnected; - _wiiuse_rumble_fptr _wiiuse_rumble; - _wiiuse_toggle_rumble_fptr _wiiuse_toggle_rumble; - _wiiuse_set_leds_fptr _wiiuse_set_leds; - _wiiuse_motion_sensing_fptr _wiiuse_motion_sensing; - _wiiuse_read_data_fptr _wiiuse_read_data; - _wiiuse_write_data_fptr _wiiuse_write_data; - _wiiuse_status_fptr _wiiuse_status; - _wiiuse_get_by_id_fptr _wiiuse_get_by_id; - _wiiuse_set_flags_fptr _wiiuse_set_flags; - _wiiuse_set_smooth_alpha_fptr _wiiuse_set_smooth_alpha; - _wiiuse_set_ir_fptr _wiiuse_set_ir; - _wiiuse_set_ir_vres_fptr _wiiuse_set_ir_vres; - _wiiuse_set_ir_position_fptr _wiiuse_set_ir_position; - _wiiuse_set_aspect_ratio_fptr _wiiuse_set_aspect_ratio; - _wiiuse_set_bluetooth_stack_fptr _wiiuse_set_bluetooth_stack; - _wiiuse_set_orient_threshold_fptr _wiiuse_set_orient_threshold; - - _wiiuse_find_fptr _wiiuse_find; - _wiiuse_connect_fptr _wiiuse_connect; - _wiiuse_disconnect_fptr _wiiuse_disconnect; - - _wiiuse_poll_fptr _wiiuse_poll; -}; - -#ifndef __WIIUSE__ - -/* - * Operating system dependent macros. - */ -#ifdef __WIN32__ - #define dlopen(file, x) (void*)LoadLibrary(file) - #define dlsym(dll, func) (void*)GetProcAddress((HMODULE)(dll), (func)) - #define dlclose(dll) FreeLibrary((HMODULE)(dll)) - - char* _dlerror(); - #define dlerror() _dlerror() -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* api/wiiuse.c */ -const char* wiiuse_startup(char* wiiuse_file); -void wiiuse_shutdown(); - -#ifdef WIIUSE_API_SRC - #define WEXTERN -#else - #define WEXTERN extern -#endif - -WEXTERN _wiiuse_init_fptr wiiuse_init; -WEXTERN _wiiuse_disconnected_fptr wiiuse_disconnected; -WEXTERN _wiiuse_rumble_fptr wiiuse_rumble; -WEXTERN _wiiuse_toggle_rumble_fptr wiiuse_toggle_rumble; -WEXTERN _wiiuse_set_leds_fptr wiiuse_set_leds; -WEXTERN _wiiuse_motion_sensing_fptr wiiuse_motion_sensing; -WEXTERN _wiiuse_read_data_fptr wiiuse_read_data; -WEXTERN _wiiuse_write_data_fptr wiiuse_write_data; -WEXTERN _wiiuse_status_fptr wiiuse_status; -WEXTERN _wiiuse_get_by_id_fptr wiiuse_get_by_id; -WEXTERN _wiiuse_set_flags_fptr wiiuse_set_flags; -WEXTERN _wiiuse_set_smooth_alpha_fptr wiiuse_set_smooth_alpha; -WEXTERN _wiiuse_set_ir_fptr wiiuse_set_ir; -WEXTERN _wiiuse_set_ir_vres_fptr wiiuse_set_ir_vres; -WEXTERN _wiiuse_set_ir_position_fptr wiiuse_set_ir_position; -WEXTERN _wiiuse_set_aspect_ratio_fptr wiiuse_set_aspect_ratio; -WEXTERN _wiiuse_set_bluetooth_stack_fptr wiiuse_set_bluetooth_stack; -WEXTERN _wiiuse_set_orient_threshold_fptr wiiuse_set_orient_threshold; - -WEXTERN _wiiuse_find_fptr wiiuse_find; -WEXTERN _wiiuse_connect_fptr wiiuse_connect; -WEXTERN _wiiuse_disconnect_fptr wiiuse_disconnect; - -WEXTERN _wiiuse_poll_fptr wiiuse_poll; - -#ifdef __cplusplus -} -#endif - -#endif /* __WIIUSE__ */ - -#endif /* WIIUSE_H_INCLUDED */ - diff --git a/WiiuseJC/wiiusej_WiiUseApi.c b/WiiuseJC/wiiusej_WiiUseApi.c deleted file mode 100644 index 063d347..0000000 --- a/WiiuseJC/wiiusej_WiiUseApi.c +++ /dev/null @@ -1,659 +0,0 @@ -#ifndef WIN32 -#include -#define WIIUSE_PATH "./wiiuse.so" -#else -#define WIIUSE_PATH "wiiuse.dll" -#endif - -#include "wiiusej_WiiUseApi.h" -#include "wiiuse.h" -/* - * These are some identifiers for wiimotes - * - * See below in main() for what they are used for. - */ -#define WIIMOTE_ID_1 1 -#define WIIMOTE_ID_2 2 -#define WIIMOTE_STATE_RUMBLE 0x08 -#define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s)) -#define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s)) - -/****************** CALLBACKS DECLARATIONS *************************/ - -static void handle_event(struct wiimote_t* wm); -static void handle_ctrl_status(struct wiimote_t* wm, int attachment, - int speaker, int ir, int led[4], float battery_level); -static void handle_disconnect(wiimote* wm); -static void copy_common_status(struct wiimote_t* wm); - -/********************* VARIABLES DECLARATIONS *****************************/ - -/* - * Make a temp array of wiimote ids. - * Here I only anticipate connecting up to - * two wiimotes. Each wiimote connected - * will get one of these ids. - */ -static int ids[] = { WIIMOTE_ID_1, WIIMOTE_ID_2 }; -static wiimote** wiimotes; -static JNIEnv *globalEnv; -static jobject globalObj; -static jobject globalWim; - -/****************** GENERAL FUNCTIONS DEFINITIONS *************************/ - -/* - * Load the wiiuse library - * - * This needs to be done before anything else can happen - * wiiuse_startup() will return the version of the library loaded. - * - * @return 0 if there is an error, 1 if everything is ok. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_loadLibrary -(JNIEnv *env, jobject obj) { - const char* version; - version = wiiuse_startup(WIIUSE_PATH); - //printf("Wiiuse Version = %s\n", version); - if (!version) { - return 0; - } - - /* no problems loading library */ - return 1; -} - -/** - * Try to connect to 2 wiimotes. - * Make them rumble to show they are connected. - * - * @return 0 if there is an error otherwise it returns - * the number of wiimotes connected.. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections -(JNIEnv *env, jobject obj) { - - /* variables declarations */ - int found, connected; - - /* - * Initialize an array of wiimote objects. - * - * The first parameter is the number of wiimotes - * I want to create. I only have two wiimotes - * so I'm limiting the test to just 2. - * - * Then I get it the array of ids and a couple - * callback functions to invoke when something - * happens on one of the wiimotes. - * - * handle_event gets called when a generic event occurs (button press, motion sensing, etc) - * handle_ctrl_status gets called when a response to a status request arrives (battery power, etc) - * handle_disconnect gets called when the wiimote disconnect (holding power button) - */ - wiimotes = wiiuse_init(2, ids, handle_event, handle_ctrl_status, - handle_disconnect); - - /* - * Find wiimote devices - * Now we need to find some wiimotes. - * Give the function the wiimote array we created, and tell it there - * are 2 wiimotes we are interested in. - * Set the timeout to be 5 seconds. - * This will return the number of actual wiimotes that are in discovery mode. - */ - found = wiiuse_find(wiimotes, 2, 5); - if (!found) return 0; - - /* - * Connect to the wiimotes - * Now that we found some wiimotes, connect to them. - * Give the function the wiimote array and the number of wiimote devices we found. - * This will return the number of established connections to the found wiimotes. - */ - connected = wiiuse_connect(wiimotes, 2); - if (!connected) return 0; - - //no problems during connection show that wiimotes are connected - - /* - * Now set the LEDs and rumble for a second so it's easy - * to tell which wiimotes are connected (just like the wii does). - */ - wiiuse_set_leds(wiimotes[0], WIIMOTE_LED_1); - wiiuse_set_leds(wiimotes[1], WIIMOTE_LED_2); - wiiuse_rumble(wiimotes[0], 1); - wiiuse_rumble(wiimotes[1], 1); - -#ifndef WIN32 - usleep(200000); -#else - Sleep(200); -#endif - - wiiuse_rumble(wiimotes[0], 0); - wiiuse_rumble(wiimotes[1], 0); - - //no pb connecting leave - return connected; -} - -/** - * Close connection to the wiimote with the given id. - * - * @param id the id of the wiimote to disconnect.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection -(JNIEnv *env, jobject obj, jint id) { - wiiuse_disconnect(wiimotes[id-1]); -} - -/** - * Shutdown api. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi -(JNIEnv *env, jobject obj) { - wiiuse_shutdown(); -} - -/** - * Activate rumble for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble -(JNIEnv *env, jobject obj, jint id) { - wiiuse_rumble(wiimotes[id-1], 1); -} - -/** - * Deactivate rumble for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble -(JNIEnv *env, jobject obj, jint id) { - wiiuse_rumble(wiimotes[id-1], 0); -} - -/** - * Activate IR TRacking for the wiimote with the given id. - * @param id the id of the wiimote. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir(wiimotes[id-1], 1); -} - -/** - * Deactivate IR TRacking for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir(wiimotes[id-1], 0); -} - -/** - * Activate Motion Sensing for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_motion_sensing(wiimotes[id-1], 1); -} - -/** - * Deactivate Motion Sensing for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_motion_sensing(wiimotes[id-1], 0); -} - -/** - * Set wiimote leds status. - * @param id the id of the wiimote concerned - * @param led1 status of led1: True=ON, False=OFF - * @param led2 status of led2: True=ON, False=OFF - * @param led3 status of led3: True=ON, False=OFF - * @param led4 status of led4: True=ON, False=OFF - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds -(JNIEnv *env, jobject obj, jint id, jboolean led1, jboolean led2, jboolean led3, jboolean led4) { - int leds = 0; - - if (led1) leds |= WIIMOTE_LED_1; - if (led2) leds |= WIIMOTE_LED_2; - if (led3) leds |= WIIMOTE_LED_3; - if (led4) leds |= WIIMOTE_LED_4; - - wiiuse_set_leds(wiimotes[id-1], leds); -} - -/** - * Set how many degrees an angle must change to generate an event. - * @param id id of the wiimote concerned - * @param angle minimum angle detected by an event - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold -(JNIEnv *env, jobject obj, jint id, jfloat thresh) { - wiiuse_set_orient_threshold(wiimotes[id-1], thresh); -} - -/** - * Make the the accelerometers give smoother results. - * This is set by default. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id-1], WIIUSE_SMOOTHING, 0); -} - -/** - * Make the the accelerometers give raw results. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id-1], 0, WIIUSE_SMOOTHING); -} - -/** - * Make the wiimote generate an event each time we poll. - * Not set by default. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id-1], WIIUSE_CONTINUOUS, 0); -} - -/** - * Make the wiimote generate an event only when there is one. - * (default behavior) - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id-1], 0, WIIUSE_CONTINUOUS); -} - -/** - * Get status from the wiimotes and send it through call backs. - * - * @param id the id of the wiimote. Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus -(JNIEnv *env, jobject obj, jint id) { - wiiuse_status(wiimotes[id-1]); -} - -/** - * Get status and values from the wiimotes and send it through callbacks. - * @param wim the wiimote object to fill with the datas. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll -(JNIEnv *env, jobject obj, jobject wim) { - - globalEnv = env; - globalObj = obj; - globalWim = wim; - - wiiuse_poll(wiimotes, 2); -} - -/****************** CALLBACKS DEFINITIONS *************************/ - -/** - * @brief Callback that handles an event. - * - * @param wm Pointer to a wiimote_t structure. - * - * This function is called automatically by the wiiuse library when an - * event occurs on the specified wiimote. - */ -static void handle_event(struct wiimote_t* wm) { - - /* Variables Declarations */ - jclass cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - jmethodID mid; - - /* fill java class */ - copy_common_status(wm); - - /* Take care of buttons pressed */ - if (wm->btns) { - /* if a button is just pressed, report it */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setButtonsJustPressed", "(S)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, wm->btns); - } - if (wm->btns_released) { - /* if a button is just released, report it */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setButtonsJustReleased", "(S)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->btns_released); - } - if (wm->btns_held) { - /* if a button is held, report it */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setButtonsHeld", - "(S)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->btns_held); - } - - /* - * If IR tracking is enabled then print the coordinates - * on the virtual screen that the wiimote is pointing to. - * - * Also make sure that we see at least 1 dot. - */ - if (WIIUSE_USING_IR(wm)) { - int i = 0; - /* go through each of the 4 possible IR sources */ - for (; i < 4; ++i) { - /* check if the source is visible */ - if (wm->ir.dot[i].visible) { - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "addIRpoint", - "(II)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->ir.dot[i].x, wm->ir.dot[i].y); - } - } - //printf("IR cursor: (%u, %u)\n", wm->ir.x, wm->ir.y); - //printf("IR z distance: %f\n", wm->ir.z); - } - - /* Motion Sensing */ - if (WIIUSE_USING_ACC(wm)) { - /* set orientation */ - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setOrientation", - "(FFF)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->orient.roll, wm->orient.pitch, wm->orient.yaw); - /* set gravity force*/ - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setGforce", "(FFF)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->gforce.x, wm->gforce.y, wm->gforce.z); - } -} - -/** - * @brief Callback that handles a controller status event. - * - * @param wm Pointer to a wiimote_t structure. - * @param attachment Is there an attachment? (1 for yes, 0 for no) - * @param speaker Is the speaker enabled? (1 for yes, 0 for no) - * @param ir Is the IR support enabled? (1 for yes, 0 for no) - * @param led What LEDs are lit. - * @param battery_level Battery level, between 0.0 (0%) and 1.0 (100%). - * - * This occurs when either the controller status changed - * or the controller status was requested explicitly by - * wiiuse_status(). - * - * One reason the status can change is if the nunchuk was - * inserted or removed from the expansion port. - */ -static void handle_ctrl_status(struct wiimote_t* wm, int attachment, - int speaker, int ir, int led[4], float battery_level) { - - /* Variables Declarations */ - jclass cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - jmethodID mid; - short leds = 0; - - /* fill java class */ - copy_common_status(wm); - - /* LEDS */ - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setLeds", "(S)V"); - if (mid == 0) { - return; - } - if (led[0]) - leds += 1; - if (led[1]) - leds += 2; - if (led[2]) - leds += 4; - if (led[3]) - leds += 8; - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, leds); - - /* Battery */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setBatteryLevel", "(F)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - battery_level); - - /* Speaker */ - if (speaker) { - /* set Speaker Enabled */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setSpeakerEnabled", - "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else { - /* set Speaker Disabled */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setSpeakerDisabled", - "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } - - /* Attachment */ - if (attachment) { - /* set there is an attachment */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setThereIsAnAttachment", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else { - /* set there is no attachment */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setThereIsNoAttachment", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } - -} - -/** - * @brief Callback that handles a disconnection event. - * - * @param wm Pointer to a wiimote_t structure. - * - * This can happen if the POWER button is pressed, or - * if the connection is interrupted. - */ -static void handle_disconnect(wiimote* wm) { - //printf("\n\n--- DISCONNECTED [wiimote id %i] ---\n", wm->unid); - - /* Variables Declarations */ - jclass cls; - jmethodID mid; - - /* call java method handling disconnection */ - - /* Set wiimote id */ - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setWiimoteId", "(I)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, wm->unid); - - /* set the wiimote disconnected */ - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setDisconnected", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - -} - - -/** - * Fills status variables. - * This function is used in handle_event and handle_ctrl_status. - */ -static void copy_common_status(struct wiimote_t* wm) { - - /* Variables Declarations */ - jmethodID mid; - jclass cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - - /* Set wiimote id */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setWiimoteId", "(I)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, wm->unid); - - /* set the wiimote connected */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setConnected", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - - /* IR state */ - if (WIIUSE_USING_IR(wm)) { - /* set IRActive */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setIrActive", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else { - /* set IRInactive */ - mid - = (*globalEnv)->GetMethodID(globalEnv, cls, - "setIrInactive", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } - - /* Rumble status */ - if (WIIMOTE_IS_SET(wm, WIIMOTE_STATE_RUMBLE)) { - /* set rumble active */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setRumbleActive", - "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else { - /* set rumble inactive */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setRumbleInactive", - "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } - - /* Motion sensing status */ - if (WIIUSE_USING_ACC(wm)) { - /* Set motion sensing active*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setMotionSensingActive", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else {/* motion sensing not activated */ - /* Set motion sensing inactive*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setMotionSensingInactive", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } - - /* orientation threshold value */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setOrientationThreshold", - "(F)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->orient_threshold); - - /* continuous status */ - if (WIIMOTE_IS_FLAG_SET(wm,WIIUSE_CONTINUOUS)) { - /* Set WIIUSE_CONTINUOUS active*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setContinuousActive", - "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else { - /* Set WIIUSE_CONTINUOUS inactive*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setContinuousInactive", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } - - /* smoothing status */ - if (WIIMOTE_IS_FLAG_SET(wm,WIIUSE_SMOOTHING)) { - /* Set WIIUSE_SMOOTHING active*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setSmoothingActive", - "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } else { - /* Set WIIUSE_SMOOTHING inactive*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setSmoothingInactive", "()V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid); - } -} diff --git a/WiiuseJC/wiiusej_WiiUseApi.def b/WiiuseJC/wiiusej_WiiUseApi.def deleted file mode 100644 index 258bf8b..0000000 --- a/WiiuseJC/wiiusej_WiiUseApi.def +++ /dev/null @@ -1,19 +0,0 @@ -EXPORTS -Java_wiiusej_WiiUseApi_loadLibrary -Java_wiiusej_WiiUseApi_doConnections -Java_wiiusej_WiiUseApi_closeConnection -Java_wiiusej_WiiUseApi_shutdownApi -Java_wiiusej_WiiUseApi_activateRumble -Java_wiiusej_WiiUseApi_deactivateRumble -Java_wiiusej_WiiUseApi_activateIRTracking -Java_wiiusej_WiiUseApi_deactivateIRTracking -Java_wiiusej_WiiUseApi_activateMotionSensing -Java_wiiusej_WiiUseApi_setOrientThreshold -Java_wiiusej_WiiUseApi_activateSmoothing -Java_wiiusej_WiiUseApi_setLeds -Java_wiiusej_WiiUseApi_deactivateSmoothing -Java_wiiusej_WiiUseApi_activateContinuous -Java_wiiusej_WiiUseApi_deactivateContinuous -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_getStatus -Java_wiiusej_WiiUseApi_specialPoll diff --git a/WiiuseJC/wiiusej_WiiUseApi.h b/WiiuseJC/wiiusej_WiiUseApi.h deleted file mode 100644 index 08efaf1..0000000 --- a/WiiuseJC/wiiusej_WiiUseApi.h +++ /dev/null @@ -1,157 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class wiiusej_WiiUseApi */ - -#ifndef _Included_wiiusej_WiiUseApi -#define _Included_wiiusej_WiiUseApi -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: wiiusej_WiiUseApi - * Method: loadLibrary - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_loadLibrary - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: doConnections - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: closeConnection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: shutdownApi - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setLeds - * Signature: (IZZZZ)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds - (JNIEnv *, jobject, jint, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: setOrientThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getStatus - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: specialPoll - * Signature: (Lwiiusej/WiiMoteEvent;)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif