From b2b22001c6ed6541edf2faf33c012cb91d2c4e9b Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Sat, 31 Dec 2011 14:50:33 +0000 Subject: [PATCH] Several minor modifications and some cleanup. --- cpp/wiiuse/.cproject | 1 + cpp/wiiuse/src/definitions.h | 4 +- cpp/wiiuse/src/events.c | 6 +- cpp/wiiuse/src/nunchuk.c | 11 - cpp/wiiuse/src/wiiuse_internal.h | 10 +- cpp/wiiusej/lib/wiiuse.lib | Bin 27590 -> 27590 bytes java/build.xml | 20 +- java/mimis.exe | Bin 1502574 -> 1507106 bytes java/src/mimis/Worker.java | 1 - .../cmd/windows/WindowsApplication.java | 9 + .../mimis/device/lirc/LircButtonListener.java | 2 +- .../mimis/device/lirc/remote/ColorButton.java | 7 + .../mimis/device/wiimote/WiimoteDevice.java | 17 +- .../device/wiimote/WiimoteDiscovery.java | 5 +- .../mimis/device/wiimote/WiimoteService.java | 7 +- java/src/mimis/event/EventHandler.java | 6 + java/src/mimis/util/Ir.java | 180 +++ java/src/mimis/util/Sound.java | 6 +- java/src/mimis/value/Command.java | 16 + java/src/mimis/value/Windows.java | 1 + java/src/mimis/worker/Listener.java | 38 + .../test/ClassicControllerGuiTest.java | 179 --- .../src/wiiusej/test/CloseGuiTestCleanly.java | 58 - java/src/wiiusej/test/GuitarHero3GuiTest.java | 168 -- java/src/wiiusej/test/Main.java | 45 - java/src/wiiusej/test/NunchukGuiTest.java | 450 ------ java/src/wiiusej/test/Tests.java | 389 ----- java/src/wiiusej/test/WiiuseJGuiTest.java | 1379 ----------------- .../AccelerationExpansionEventPanel.java | 39 - java/src/wiiusej/utils/AccelerationPanel.java | 303 ---- .../utils/AccelerationWiimoteEventPanel.java | 37 - java/src/wiiusej/utils/ButtonsEventPanel.java | 382 ----- .../ClassicControllerButtonsEventPanel.java | 500 ------ .../utils/GForceExpansionEventPanel.java | 38 - java/src/wiiusej/utils/GForcePanel.java | 304 ---- .../utils/GForceWiimoteEventPanel.java | 37 - .../utils/GuitarHero3ButtonsEventPanel.java | 274 ---- .../utils/GuitarHeroJoystickEventPanel.java | 39 - java/src/wiiusej/utils/IRPanel.java | 275 ---- .../src/wiiusej/utils/JoystickEventPanel.java | 248 --- .../utils/NunchukJoystickEventPanel.java | 38 - .../utils/OrientationExpansionEventPanel.java | 38 - java/src/wiiusej/utils/OrientationPanel.java | 305 ---- .../utils/OrientationWiimoteEventPanel.java | 38 - java/wiiuse.dll | Bin 80722 -> 80210 bytes java/wiiusej.dll | Bin 18432 -> 18432 bytes java/wiiusej.jar | Bin 0 -> 222970 bytes 47 files changed, 303 insertions(+), 5607 deletions(-) create mode 100644 java/src/mimis/device/lirc/remote/ColorButton.java create mode 100644 java/src/mimis/util/Ir.java create mode 100644 java/src/mimis/worker/Listener.java delete mode 100644 java/src/wiiusej/test/ClassicControllerGuiTest.java delete mode 100644 java/src/wiiusej/test/CloseGuiTestCleanly.java delete mode 100644 java/src/wiiusej/test/GuitarHero3GuiTest.java delete mode 100644 java/src/wiiusej/test/Main.java delete mode 100644 java/src/wiiusej/test/NunchukGuiTest.java delete mode 100644 java/src/wiiusej/test/Tests.java delete mode 100644 java/src/wiiusej/test/WiiuseJGuiTest.java delete mode 100644 java/src/wiiusej/utils/AccelerationExpansionEventPanel.java delete mode 100644 java/src/wiiusej/utils/AccelerationPanel.java delete mode 100644 java/src/wiiusej/utils/AccelerationWiimoteEventPanel.java delete mode 100644 java/src/wiiusej/utils/ButtonsEventPanel.java delete mode 100644 java/src/wiiusej/utils/ClassicControllerButtonsEventPanel.java delete mode 100644 java/src/wiiusej/utils/GForceExpansionEventPanel.java delete mode 100644 java/src/wiiusej/utils/GForcePanel.java delete mode 100644 java/src/wiiusej/utils/GForceWiimoteEventPanel.java delete mode 100644 java/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java delete mode 100644 java/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java delete mode 100644 java/src/wiiusej/utils/IRPanel.java delete mode 100644 java/src/wiiusej/utils/JoystickEventPanel.java delete mode 100644 java/src/wiiusej/utils/NunchukJoystickEventPanel.java delete mode 100644 java/src/wiiusej/utils/OrientationExpansionEventPanel.java delete mode 100644 java/src/wiiusej/utils/OrientationPanel.java delete mode 100644 java/src/wiiusej/utils/OrientationWiimoteEventPanel.java create mode 100644 java/wiiusej.jar diff --git a/cpp/wiiuse/.cproject b/cpp/wiiuse/.cproject index 6ce7a94..a5a7260 100644 --- a/cpp/wiiuse/.cproject +++ b/cpp/wiiuse/.cproject @@ -183,4 +183,5 @@ + diff --git a/cpp/wiiuse/src/definitions.h b/cpp/wiiuse/src/definitions.h index 8e23ed7..bc44ff5 100644 --- a/cpp/wiiuse/src/definitions.h +++ b/cpp/wiiuse/src/definitions.h @@ -54,8 +54,8 @@ char* file = __FILE__; \ int i = strlen(file) - 1; \ for (; i && (file[i] != '\\'); --i); \ - fprintf(stderr, "[DEBUG] %s:%i: " fmt "\n", file+i+1, __LINE__, ##__VA_ARGS__); \ - fflush(stderr); \ + fprintf(stdout, "[DEBUG] %s:%i: " fmt "\n", file+i+1, __LINE__, ##__VA_ARGS__); \ + fflush(stdout); \ } while (0) #else #define WIIUSE_DEBUG(fmt, ...) fprintf(stderr, "[DEBUG] " __FILE__ ":%i: " fmt "\n", __LINE__, ##__VA_ARGS__) diff --git a/cpp/wiiuse/src/events.c b/cpp/wiiuse/src/events.c index 26a822c..e80a3d6 100644 --- a/cpp/wiiuse/src/events.c +++ b/cpp/wiiuse/src/events.c @@ -640,7 +640,7 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) { if (!data) { byte* handshake_buf; - byte buf = 0x00; + byte buf = 0x55; if (WIIMOTE_IS_SET(wm, WIIMOTE_STATE_EXP)) disable_expansion(wm); @@ -651,7 +651,9 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) { wm->timeout = wm->exp_timeout; #endif - wiiuse_write_data(wm, WM_EXP_MEM_ENABLE, &buf, 1); + wiiuse_write_data(wm, WM_EXP_MEM_ENABLE1, &buf, 1); + buf = 0x00; + wiiuse_write_data(wm, WM_EXP_MEM_ENABLE2, &buf, 1); /* get the calibration data */ handshake_buf = malloc(EXP_HANDSHAKE_LEN * sizeof(byte)); diff --git a/cpp/wiiuse/src/nunchuk.c b/cpp/wiiuse/src/nunchuk.c index 48dbe6a..2733174 100644 --- a/cpp/wiiuse/src/nunchuk.c +++ b/cpp/wiiuse/src/nunchuk.c @@ -53,7 +53,6 @@ static void nunchuk_pressed_buttons(struct nunchuk_t* nc, byte now); * @return Returns 1 if handshake was successful, 0 if not. */ int nunchuk_handshake(struct wiimote_t* wm, struct nunchuk_t* nc, byte* data, unsigned short len) { - int i; int offset = 0; nc->btns = 0; @@ -64,10 +63,6 @@ int nunchuk_handshake(struct wiimote_t* wm, struct nunchuk_t* nc, byte* data, un nc->flags = &wm->flags; nc->accel_calib.st_alpha = wm->accel_calib.st_alpha; - /* decrypt data */ - for (i = 0; i < len; ++i) - data[i] = (data[i] ^ 0x17) + 0x17; - if (data[offset] == 0xFF) { /* * Sometimes the data returned here is not correct. @@ -137,12 +132,6 @@ void nunchuk_disconnected(struct nunchuk_t* nc) { * @param msg The message specified in the event packet. */ void nunchuk_event(struct nunchuk_t* nc, byte* msg) { - int i; - - /* decrypt data */ - for (i = 0; i < 6; ++i) - msg[i] = (msg[i] ^ 0x17) + 0x17; - /* get button states */ nunchuk_pressed_buttons(nc, msg[5]); diff --git a/cpp/wiiuse/src/wiiuse_internal.h b/cpp/wiiuse/src/wiiuse_internal.h index 25357a4..fb623e3 100644 --- a/cpp/wiiuse/src/wiiuse_internal.h +++ b/cpp/wiiuse/src/wiiuse_internal.h @@ -87,6 +87,7 @@ #define WM_RPT_BTN_ACC_EXP 0x35 #define WM_RPT_BTN_IR_EXP 0x36 #define WM_RPT_BTN_ACC_IR_EXP 0x37 +#define WM_RPT_BALANCE_BOARD 0x40 #define WM_BT_INPUT 0x01 #define WM_BT_OUTPUT 0x02 @@ -104,7 +105,8 @@ /* offsets in wiimote memory */ #define WM_MEM_OFFSET_CALIBRATION 0x16 #define WM_EXP_MEM_BASE 0x04A40000 -#define WM_EXP_MEM_ENABLE 0x04A40040 +#define WM_EXP_MEM_ENABLE1 0x04A400F0 +#define WM_EXP_MEM_ENABLE2 0x04A400FB #define WM_EXP_MEM_CALIBR 0x04A40020 #define WM_REG_IR 0x04B00030 @@ -149,9 +151,9 @@ */ /* encrypted expansion id codes (located at 0x04A400FC) */ -#define EXP_ID_CODE_NUNCHUK 0x9A1EFEFE -#define EXP_ID_CODE_CLASSIC_CONTROLLER 0x9A1EFDFD -#define EXP_ID_CODE_GUITAR 0x9A1EFDFB +#define EXP_ID_CODE_NUNCHUK 0xA4200000 +#define EXP_ID_CODE_CLASSIC_CONTROLLER 0xA4200101 +#define EXP_ID_CODE_GUITAR 0xA4200103 #define EXP_ID_CODE_BALANCE_BOARD 0xA4200402 #define EXP_HANDSHAKE_LEN 224 diff --git a/cpp/wiiusej/lib/wiiuse.lib b/cpp/wiiusej/lib/wiiuse.lib index 906e164e8f55022db0e2b477208a32bd2c6f563a..0c6fe6ead103abf8f537b0aea98d7830ec933f14 100644 GIT binary patch delta 822 zcmX?ho$=Up#tBj!MuryV#+DYw8EihSaVLlF_*oX?}ngset< z^KL$MBoPBCiOo!cW(bkZ4#E~lyav$#6rK>{=2sGS2un5_NckWsFpvT&m?mq5q@Y0* zq(>e_k0O$xlN&@OHZM@NLzpr-!Bb-MKUEim2+$UwAu*a5=5EkNG8bghEihSaVLlF_*oX?}ngset< z^KL$MBoPBCiOo!cW(bkZ4#E~lyav$#6rK>{=2sGS2un5_NckWsFpvT&m?mq5q@Y0* zq(>e_k0O$xlN&@OHZM@NLzpr-!Bb-MKUEim2+$UwAu*a5=5EkNG8bgh - + @@ -43,15 +43,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/java/mimis.exe b/java/mimis.exe index 3933eafc0abdfeb856ef54633da8dd1197cbf69e..d0fb364a1c16a371e759230f1d0e1e5c64736e75 100644 GIT binary patch delta 38551 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 z z+R?>3=q$|lE5@>_Y{3e@D=XZ=@&SL;X@X2##LQJvaOg>mC|*FPbHvK6;8r5 zO6BVarL=o$ss6f$Qf;b7{VPbJH2kS*U~T)~iob+`9mraw#z51COf-lpR+5aOm9p8R ze-^CFXe?OiS+c^1_cILr`#0fH%9cGi>XQw0e1brmWy^sa9nR3M9RylCUUH%RS*TfN zJd?3ncNVPZrjj%5)hSK^Y(9ys^s2xT#Q7H4DXxjrwug{Uyf5?f!D#G#Sb5z`pc$=I z2i%JH5nbi2xImWK1*XQz%DzJ0_(1mLu@rj%E2;g>sGgD&EfX&fq-?8XBa?Ktp63<4;FqG&5QcZyai(4Q6igFfW)Gz7W=A8ps4LFo_W z$~@F}58<@)bP9ZH;ABk>d-$N0}Pk#g}ZDyHS z2Kw|!HgN}r$6)oJV`e!~;uwr7@VV+z@OP>b`{Xl znvZn!y_I|F6G@@T&t+epkS;e?Og#nvK?oq+904n3k+Mt%%o^5adwVZ+L z7wxcC(TW0du$DpTscjD2#n@5FS8@RDw^!V#_*={^jCF*uei{U;@;jW}nfpR^C+`>P zLN@vZ_^(}mUzmbxPI?1&^HF0(3Op1^Q0fiwL8%TNq0ojD`~7GP~I!kMoE7jMEVmwJmWdkH)Vbx?sM0K|l#EsC z2Jc@RayBi0uU`7yWkzB~(%1KLIJa8t1Aq$26z~zNR*#-KnO^;;_KcC9{Z>Y!XKaK~ z?L6o{PRJklp!UWrW@X`IGipy`hv=Ls_Mke-M*jAXDPPnv@!%KOe{@0EfAvKjel_P=YEt* zIXS2%-bt8&V8?^^HlUM);Q(Uo(x-urGQZlOTqZ6@V)K3#!5rwjUsCO7#e!@W2AO?6*&7bI7%xn@v z3x)`^j;pm(zS+B%zciYJ^7^0^6w{b(6GoXo)jI@ExoDfk!X-*+Xsu9OuIwN9Kc^~c zlpmMMm$hX_Ee3Ig{KMFOZO4Z4mI^;|WzRrXYS*MAVfB&G2PnBVJY8)|g$AW@-uE+a zGzw_V@2`047BsZr&)=l@2ma67(3*%BHMNi@ydqtY2Vm-ww7DC`gEWi>+Ut}nZMlLU zdDgZz_t7=yqQ<5mnN)dNSvaAqd>yF$)X^NCY;1nwXuGm?kq7#9t{H2s_;I*BV99wXC0i>MIk2ArD@HOPkUm>0;uLj*4bX3+Da=L@ zCzdBN;QM$QWurv#ST;@karG-A=#K;knfO&eL@ef6qj%6FmhlrM+R)z; zP5>+&okSz_s*|k@_%WHz>lJ>$cd9Mua#P9IRw={t_VY%_np`-W3a8rfZ}2qgZ>yB& zMcT;J4os)hwyND90CXNRC8|8!x^RA24ecNoKZ|Ac-!GxAvnK4vIh5GdKd?uzD){*(;I0IO! zu!7Q@6%YDhPy)Gdpfk|ql>*&A6NksL8sa7FpVsnsYdAfCk9O&NZ55NR%MH9@21>6X z2Ny-m0d-vf%w5X>Z@Mzq+AZIr<`p(g&R(peBQ9zla+!e&8yMh4!{=M$E;GA|WkqXm z1Z&Pl!6Ks)$^+%^xFJZwM>~+c*u+E&5?*~Pm~SP(6;@)l2-c{DmQ5p>v1V))tn+_b zYTah6>~z8MUu^B3U#=XVn14s0Jah5!(v&N7J2iGw+vO-X)XS~y5?L*^4is}aE7Ms9 z+w763_zG(u3cZ6>Dd56%8D-+=^;bJ^*l|Im7=^f=TBIlJPco+7}T{>e3uN$l$GND z=PQ7Dsa%!P{*v_ne<9HF5}u{**LP6z&3Iq`)lA+SDHL)?b}r4de|=LSUpwOFuiAKR zfl5A=-FX>*-Cm!sn0|{A6(x{MO>ChI+<`32K)w3piQs!x%CskxrYPdiS6oogD2C;r z51&BuG&hRP-CP%JMx!ud!omfu`QNIPnAa5Hp#*am-NU1+FNKSSaDgS2`QNG(|93RV zLkZz^w8R5-^x zjuceH-&}cDkVWOj5g$7I%5r5fF3F)Un~Mg*Qz4BBqlr3uiFuV4dLftoGVS(KlbgkW zCSLR%08j3>`Gqr_vCt}ryC3ZRm%M+gQg-@KRc}Q+CF|vlNWKK?sE?J6LTT!vkG2Aq zmPONfZ*}4FMY7ItM#0h%m9~aGV|6sc%cdZO`>3@L;{%&*tLW&G58%D*E;VcB5jQvN zTLu&R|ED62)hW$KDa@tjY`hVAT&_}%Gm}?RQxfQSJ2hjH$ml>unC}IeyYie zelS_+H)`Rh6z4(C{M%(2ySN#QY-lebvl8fwpW;t{`>A8s9j5y}k)aj%bF0w}9KSDu zt_iwD%yF<*=R)s-6n9FkgqmQt7I~+c>JR-l9cZn;QicQf0O%@q($Tg!Y!5pXYop!` zK#Hkk0C<%;b6yy?!CPg_#er4o!DS5cs=X5z+)cG}I6z&KWW$8Cw>vcq#9ZhRsFtE+ zAke2h87kIsy|UVuVSke(0XZ$KDaFNJv?5R`C3@KCNZ*y^sKH;sJN5C zVlN(q*xU5OwOu{H=JKa7c*Ot?LmC+P;(=d8lNU6#lEgg0C zTr~uB3m@&AQ+cG00)MkHQJ2E%1esD8jt-4dVeF7|r#``o6Sq?!)bDvAcw^U++O#>2 zQ5E#T>T)V97Fw)9UKWPsyRfXisD3|Dl^xN+#+Mo_ zP?uzTmd>(bbvzDt`2sZs?>L1Tg(wj`YbhaU9=S7UX^2vs0~Z)zHID&aG^>w|Be@h& z8?;{$upa(N(M8muWy|S8C){uY@fjv3t&0I`bo4aECaA=(^R2|Lbxv<`9ap@KWZZSp$W}f;!J$exPx*b%jnZaV%f{mX?UiQJQ#v}m z!X|=SyWjteCG|6PbaW$jue=OZOZzPprQLazJd3I`#QJqllHHK~>;E&p zRk*LCEeFwXlZ&d#(~ClR+#_0FR1q62E-|3vGkRTA&9iS9fPvqrVwfT}OSA`|tLkJ; zqr=p>W-CL^I$Kk0j!huF4pVLaU~mgpYdZfD@v=vWyliJ@FK@UB4Wv54)6R2eO)&As z#*fSLN}f{;&bKMFrI_j}ivh<9()VKOWn0POa8k*~nzntiDa!kF!2j%p)Kp21FGWTu zMcCFzanZAL%-+^Aa{V54qrD@1AyA0c%e8T%@Nm>N+lZCqcg@#`RmeIlDQas>mk$y0 zj^SvuY)3#$IHKKLT%g4qu$5>DtZ>#Q#wt=uu-=9%0o-=}Ca(eos%UIa#chWOrBMLe zQt;>2d7nxl;{KR>D{7?1Mlq?9lo^3hl|_&f0XGgY!VUI;7365$NT7~21v)bl9h%9e zGt{fDK(PNgdlY^NAqE{R~6m6yy)T1&x- zETseoGAnO(ZWy=^y=NyHgZ4_tF43Bj>gatbxsu+U>TbZ;#T6dheZC&Wwz2y4;iyYb zt`IQIm(AzRf zC~d8$_s`GF^U^5OwSH!n6SZ%scN2V;)HY?nA2X2gE09ZLy?CU@)3>bEjWc!ODh#gb zXk3*Z!sJ_sx+)6;k1z!=-?PeM4a0Jv*&3(O?J-gnRX54`bNRl*2LE0izTDxfsz%;8 z+AQzG!{+iA9~Nm=4)W|lRh&kC=U5?sryN#+ER-Jd%%)`_`W-`#<(8RMDYeH7(Yoc; z29v)7@7D%%Yl0BPc0AYoD56g9pLHCj!!cB78+yALLjGQbt{) z%!*1)$@?C8Mk@`adQYfZv{GAF=CwUdKj-K}8PT{P3jWWYlCL=W(aVZ35mpI{gQTDK zwC{GF)jTsOCF@DY^st~6{NfFsJFb@2? zZ)jJXQdydrOCRHuXx)Ka2a3Pz6hP@!@Mjnkt0;cb=Uf_7MQNj}QNWSzR#D1HeG1UK z>L^55Ra|#3i8tzg)c6DSPBB}QqCueeK z4mUfh;dbU4Hx&tsug)nV>+5OWkjEvlpPD-;$)x|P9)-}|8Q)&_Tr+I%0v1X@W; zL)mvI`RWa}G_nTlYz-4gMh&H;^rE;R!fJx(5h;iXj5t1;S%)Q%@-`UD<4b)SqVXriIV(cSi5lLkV~9u;BUEN8@zfZGlA0G1$}W zc?N84tB-)IpAx*Z2DqF4ygtG^e#Qc+-#{rVjl5t+8c6#tnF$lcZ8aFEcthA}dsV=Q z(UWEX(bc%?NSXT$3S}~Cn4tW~yO9zqZM#c>&ET+QBdBJpL|iAup3)fNc~7vj8X=yB zDv>@2?C^M{s5C)EGOHSGXj~J;hce?8XK7!aV7wA8y;O;@hft57;$hT3OBm(IvN4J+ zJ!u5hgvL;9mB(wWl$Pe?5r+(pbfqy=&j}EB;4O<%N;2GIj>ZZckz9w4=`3)wP zsz_u>lO6SD$Tbz2eF5vcbcWbH;FeRJ-1YR40Wln?qU-m7cWhr8*9@K4{XOs9_=}>T zq+RbRtC`YF>iL0v2U3gX2#c(#aRRDoVRH;W0eV49eTX{!-W+z1I|(E_#}GsbEr4`2 znh{sp+yX5%M>Zn{dcICk$fqT`+TcI|XZk)6rcf(q%KJ%-Ai=NKGbgC8DuVc)J3-ga{0f}%_tTlpYTutx} z1UUQAn{^0+^CmOi$VP&8c=#B%-rt-(ZA^`X{0*OuZ|JeTgX4$}B+`4msPCPkWSk=u?5TX^)88Jr~6K_L$2q zy%NN?_Gmd*-U}io)7gtvwvj%)bv9yAnm4I$q3jMQBlyVHJ7?@ToCl#(NhsSQneKN$ zIR7QVY6%ZP)b60fN>jZBvABa$O)7=s!#kh>ybNLA?$pBCrC{m+80p&)M%==L=+cgu zR*#1ZBHYOZn{Ldt?%D~0gQBQPXQe1L?}UNpeMLcRXTT2;x>(1envA`gc?O zD6yK0D}BSBJ5il>^<6Cc#$SDyR7dHzf$X~&6<&+J<~cXA(ycs}=p*5oZ_*qO@p!k`eo*8-W-3t?6~Wr4ith3f5dhWhu%^PucC zEAw*`^7&&7?VY(isr+6US@ zvjyze7o`n(Du@NgT|D8%NK5)c#O{SaN1TRcw|aTb|6{y0Zv?MIKjgsSy&y(qxOi~& zt^FYK;gdk0^h3$oVSP0i<;c8?obz_wtUqMFSPOW1f2FDv>L`d8{Za7320_#spj4M$ z8wJt+wF~}8`JlW=E)0MPLonk7k>f!0zJ^5^QIz@)L{Dvm^%5hp1}e3s9pQo~?PT<4 zCXAFa2-+1&3V5Hh(Tl-hQs*)PDLYuHCG9OIh$wfXpV0cE7%kghdIcuXOF9xG1mnDo zs4QlF#}Js`8OPvIs=Eh6F0VSnP{7L?G1!}`4@GU+HKmlHN|Lm>nE-Q#VxX+qQV{;7 zje0s<*62iihbduJA+&rr8r$qjMjtv0K)Tmn$i-JSx=_GyAYD2$1b>aZs?kFXu@i^G zr9IYf3~oOHe-?cIa5N0(5f(^t3nLc)rSsbPns%B}CSa|mD%X}8&lf~`JZ6x;2B5s7 zN95_f906Bl)>;Vok3`Md@3BBeFl06sT+AXj@^h8Zm2$cwY5$FczWxkd8jTy`MMtqj zoD;;(btp1M%`hn;Lm=liK`Vdc(j_z3Hw3R-GMZ(Z+k&{4jK%5vWXziz9+{C^(znNg zm^~URs#>GLp7_d)#7eDSGa^BH@J4{~7mPBs9fJVMzZVErPj#fB9|e(q9jmaM%SMG7 zj7C9f7KDnPCiP)M#9kfInUb1X(8Mbg4C(rOnAWMm3bGR?yR zi5!Q*4SXuA&1>o>O~qC5(u&4N**+G?v~g&Er2`n^N9%r|Dlya<$#pye{0Dz*cmf^) z1UR@lQOog&Z9{Q0;zozYBNN?9G9;4TIJ@e}|92nrt1Vl@80pbOL={zCz>$+66J1jf^B7U7wjlmv zM3uVKcnSh*H5t{aYaoaNlfn7fP!N7o7!l8iBbj1ksNX{)vLP!Z}HTC^sFPj7~IX26PrqM#~>=3;cJIR_(j$>V}ZU+!w6u;+O_`pg_;J@TZP=SZG&p}Or1 zL(0(Tx$yA!IYxAr{=Oi<1{)D#j@d-Vc`y;0$#|t{`#fl;Ut>flMeKkt|36Tc2m^&imsc$dM=rQ1&hJ9a)IwSR3U^tjvMDyQ~_{OS3SU;Rd~98$4{ zoBocfq#~zFKe96Wk?D#nE`*uw_o? z?8pU}2P7Loq%XkKRK`{ivmdw`DB}^DK6*`<)X8Lq?da=U*kSK8h*AIVg>X1jwh-|B z6DyIKc+rpf@cH5@)3QHdWPKn*qDj99X}Vp65mjl#A|!cjm>}Zp+-zynNt9xdgPY}4 z)TD$E=(HHpOCkhulM(Kv1krE_h$&?lF;Kc%PJq4LVJ~(md1`z_>I}i(MoQyoZe$uRM)NLy0|GFd~Ao z(r^psbxR6dj>)si0QMb9M;f`gi*fS$a$Jlx9mQn*C?dhlgR)v7%+f0m=Ke8exG*he zh+T?6G7jOs$?xsl+{k(*;77lc)mjX(wN}E{9lQv`h_sa$^1jUzMECw~2L4`;sHHNa zGzopNlu2PX`YHuCcvfKqe352Gq9xrvK@3PmcwuXi3eVLjZlfa%_N8M>+&n2~Kj7gE z?tMbQ+gIaKpx9+WEZgel&t%keMXiBg=i6qUBaK>vW?=P1Am`Q~fs5WSqN(KhjeUDk zpS8Fm*k+)k>##2HdEpjJGtR(g`45_+yq3)ZuC#wO)}#&A!Izu2fRopu3p@#7L`$h# zI9=KRiEEA~SyXZJ^^h$RDd5TLF|~eCiF@mnXe*iKY=rYMvdM?Zs|)qk8=#aGEtIBj zz=C5)93$FFhhjKpyF1H5}KJK9}BFO#|govo;tYd^f`R+!4{Jepc0&j-Tz)hWXdjO~HhQjkrX4pX8rkdPn|5x17 z<98$`&CsO2a=Ka6MDcr2qG87clC#_tAW}YjjYcIBS5wUC&pl{{)E_W8_ex@g=`=Au&$(7%x*cRXx3hV6n0e`5@O6{r%q7%KR!tuI#Y zmZMC1VIdG8xqFF0y5=z$`8|xmJ~a9mx=3m`BjTkwrG>2badef9Go7 z_&Bs@RS>*f#hu?!Q+Xd4?_{*#g`U8|Z&i#SW}mgzXRYEO@I=V!`ldBMT&#A(xw&5gfpD3Qbwp+>96rt6C2_ zdkV(>X=wo)PGf?OXl+JZsNZR1X7=v_`I+R7ZK-SX8pOiRnvmls3#r4M-DQ?zwU1Uj z121i-3106rN?j>=x*#&o;I6^3KLinU7Opp>GNP_jY8h=ji(Iu{Mi0+oDww*A3Y|lL z+r5ku&tdHTEsffp$2f8N94x%sCK9k zb;ONYEphkdFDFoZCN87@Nz)W##xZ(x0hJbXiYi~k&5J`f**A7#UqnE!?g`@UMMUHL zND#?K-A(*eY+AL)Mqr75fURNTdVJdO>C9ckAUI%--iez5L zBCc3Fq3v@6^;slQ5It_7^|`he#ON5=Kxc12@rsJXRhBW$JwlozZlZGK4nh#HElr7q zG`r=UdLNBx0^_H4Vf>a-YB%;>nEY?SRYDIzjJyR`!+J5I5XIfb^7cm^8Eaf--RidD zWmSP(vrr!wZ=um0ZUEM(mtb`POFA=%sRhxh+qg4cc?csELJ|%1{Wf~Sw4qwWo}8PZ zQrSKU9$d;D*l0b>EaZs?EvSGC*rdq$_Zffua5Fz7U$xF%u$qq$tn9m3>twfp>e9Q& z(mx~3a5HK9D6_hOino^iDCdxBe)2uo7(H6ccP4#Xyu0cfqze59A*+{k|2|T{O9mST z8rTjm&zWVqWWkWfc&#A=Ep3n2B+Wv%nNZ|Jt&kJhg(+^lu$9o7bRWHI0pHn(<`eWBSBQU{`4xUNS8?Z+{pWM!py;_@`J2|scI;*eM#1yH z@~Y;*WRHtl*n`&PKzhUt0b{(ep*J~L_hsC&K$^V35IF3PK=?593a6EeE`Id|BB`Ba z!E=6z0b%|_En-XkUSiM~`q&ItmS#MmpD&e~VIQ8D3iRsRwM>ujegpdU>pWmk_s#?3 a>)BxQQ-K2Ablr5li&_;}_7um175IN?=Tdk8 delta 33388 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 diff --git a/java/src/mimis/Worker.java b/java/src/mimis/Worker.java index 6da9482..8056362 100644 --- a/java/src/mimis/Worker.java +++ b/java/src/mimis/Worker.java @@ -79,7 +79,6 @@ public abstract class Worker implements Runnable { public final void run() { while (run || deactivate) { - //log.debug("run() run=" + run + ", active=" + active + ", activate=" + activate + ", deactivate=" + deactivate); if (activate && !active) { try { activate(); diff --git a/java/src/mimis/application/cmd/windows/WindowsApplication.java b/java/src/mimis/application/cmd/windows/WindowsApplication.java index 6fff081..292dba6 100644 --- a/java/src/mimis/application/cmd/windows/WindowsApplication.java +++ b/java/src/mimis/application/cmd/windows/WindowsApplication.java @@ -38,6 +38,7 @@ public abstract class WindowsApplication extends CMDApplication { public boolean active() { if (!active) { handle = Native.getHandle(window); + system(Command.System.MAXIMIZE); } return super.active(); } @@ -64,6 +65,14 @@ public abstract class WindowsApplication extends CMDApplication { //return Windows.sendMessage(handle, Windows.WM_USER + wParam, 0, 0); } + protected void system(Command.System system) { + system(system, 0); + } + + protected void system(Command.System system, int lParam) { + Native.sendMessage(handle, Windows.WM_SYSCOMMAND, system.getCode(), lParam); + } + protected void key(Type type, int code) { int scanCode = Native.mapVirtualKey(code, Windows.MAPVK_VK_TO_VSC); Native.postMessage(handle, type.getCode(), code, 1 | (scanCode << 16)); diff --git a/java/src/mimis/device/lirc/LircButtonListener.java b/java/src/mimis/device/lirc/LircButtonListener.java index d37c98e..9bbf826 100644 --- a/java/src/mimis/device/lirc/LircButtonListener.java +++ b/java/src/mimis/device/lirc/LircButtonListener.java @@ -2,4 +2,4 @@ package mimis.device.lirc; public interface LircButtonListener { public void add(LircButton lircButton); -} +} \ No newline at end of file diff --git a/java/src/mimis/device/lirc/remote/ColorButton.java b/java/src/mimis/device/lirc/remote/ColorButton.java new file mode 100644 index 0000000..257bf75 --- /dev/null +++ b/java/src/mimis/device/lirc/remote/ColorButton.java @@ -0,0 +1,7 @@ +package mimis.device.lirc.remote; + +import mimis.Button; + +public enum ColorButton implements Button { + RED, GREEN, YELLOW, BLUE; +} diff --git a/java/src/mimis/device/wiimote/WiimoteDevice.java b/java/src/mimis/device/wiimote/WiimoteDevice.java index 8d7d91a..6745821 100644 --- a/java/src/mimis/device/wiimote/WiimoteDevice.java +++ b/java/src/mimis/device/wiimote/WiimoteDevice.java @@ -19,6 +19,7 @@ import org.wiigee.event.GestureListener; import org.wiigee.util.Log; import wiiusej.Wiimote; +import wiiusej.wiiusejevents.physicalevents.IREvent; import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; @@ -27,7 +28,7 @@ public class WiimoteDevice extends Device implements GestureListener { protected static final int RUMBLE = 50; protected static final int CONNECTED_TIMEOUT = 500; protected static final int LED_TIMEOUT = 1000; - protected static final int LED_SLEEP = 20; + protected static final int LED_SLEEP = 50; protected static WiimoteService wiimoteService; protected WiimoteEventMapCycle eventMapCycle; @@ -41,7 +42,7 @@ public class WiimoteDevice extends Device implements GestureListener { static { WiimoteDevice.wiimoteService = new WiimoteService(); - Log.setLevel(0); + Log.setLevel(Log.DEBUG); } public WiimoteDevice() { @@ -160,8 +161,8 @@ public class WiimoteDevice extends Device implements GestureListener { public void feedback(Feedback feedback) { if (wiimote != null && active()) { - log.debug("Wiimote rumble feedback"); - wiimote.rumble(RUMBLE); + //log.debug("Wiimote rumble feedback"); + //wiimote.rumble(RUMBLE); } } @@ -170,8 +171,8 @@ public class WiimoteDevice extends Device implements GestureListener { wiimote = wiimoteService.getDevice(this); //wiimote.activateContinuous(); wiimoteDiscovery.stop(); - //ledWorker.start(); - sleep(10000); + ledWorker.start(); + //sleep(10000); } /* Listeners */ @@ -195,6 +196,10 @@ public class WiimoteDevice extends Device implements GestureListener { gestureDevice.add(event.getGforce()); } + public void onIrEvent(IREvent event) { + + } + public void gestureReceived(GestureEvent event) { if (event.isValid()) { System.out.printf("id #%d, prob %.0f%%, valid %b\n", event.getId(), 100 * event.getProbability(), event.isValid()); diff --git a/java/src/mimis/device/wiimote/WiimoteDiscovery.java b/java/src/mimis/device/wiimote/WiimoteDiscovery.java index c4eca93..4fb436d 100644 --- a/java/src/mimis/device/wiimote/WiimoteDiscovery.java +++ b/java/src/mimis/device/wiimote/WiimoteDiscovery.java @@ -9,7 +9,7 @@ import mimis.exception.worker.ActivateException; import mimis.exception.worker.DeactivateException; public class WiimoteDiscovery extends Worker { - protected static final String WIISCAN = "wiiscan-bb.exe"; + protected static final String WIISCAN = "wiiscan.exe"; protected static final int TIMEOUT = 1000; protected WiimoteDevice wiimoteDevice; protected Process process; @@ -30,12 +30,13 @@ public class WiimoteDiscovery extends Worker { } public boolean execute(String parameters) { - String command = WIISCAN + " -l none " + parameters; + String command = WIISCAN + " -l wiiuse " + parameters; try { process = Runtime.getRuntime().exec(command); Scanner scanner = new Scanner(process.getInputStream()); while (scanner.hasNext()) { String line = scanner.nextLine(); + log.error(line); if (line.contains("error: BluetoothSetServiceState()")) { disconnect = true; return false; diff --git a/java/src/mimis/device/wiimote/WiimoteService.java b/java/src/mimis/device/wiimote/WiimoteService.java index bfd3771..affa201 100644 --- a/java/src/mimis/device/wiimote/WiimoteService.java +++ b/java/src/mimis/device/wiimote/WiimoteService.java @@ -89,7 +89,7 @@ public class WiimoteService extends WiiUseApiManager implements WiimoteListener } public void onStatusEvent(StatusEvent event) { - log.debug(event); + //log.debug(event); if (event.isConnected()) { WiimoteDevice wiimoteDevice = getWiimoteDevice(event); wiimoteDevice.connected = true; @@ -99,7 +99,10 @@ public class WiimoteService extends WiiUseApiManager implements WiimoteListener } } - public void onIrEvent(IREvent event) {} + public void onIrEvent(IREvent event) { + getWiimoteDevice(event).onIrEvent(event); + } + public void onExpansionEvent(ExpansionEvent event) {} public void onDisconnectionEvent(DisconnectionEvent event) {} public void onNunchukInsertedEvent(NunchukInsertedEvent event) {} diff --git a/java/src/mimis/event/EventHandler.java b/java/src/mimis/event/EventHandler.java index db0d093..d64169b 100644 --- a/java/src/mimis/event/EventHandler.java +++ b/java/src/mimis/event/EventHandler.java @@ -1,10 +1,16 @@ package mimis.event; import mimis.Event; +import mimis.sequence.SequenceParser; import mimis.value.Action; public abstract class EventHandler extends EventListener { protected static EventRouter eventRouter; + protected static SequenceParser sequenceParser; + + static { + //sequenceParser = new SequenceParser(); + } public static void initialise(EventRouter eventRouter) { EventHandler.eventRouter = eventRouter; diff --git a/java/src/mimis/util/Ir.java b/java/src/mimis/util/Ir.java new file mode 100644 index 0000000..7b5efa8 --- /dev/null +++ b/java/src/mimis/util/Ir.java @@ -0,0 +1,180 @@ +package mimis.util; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import mimis.device.lirc.LircButton; +import mimis.device.lirc.LircButtonListener; +import mimis.device.lirc.LircService; +import mimis.device.lirc.remote.PhiliphsRCLE011Button; +import mimis.device.wiimote.WiimoteDevice; +import mimis.device.wiimote.WiimoteService; +import mimis.exception.device.DeviceNotFoundException; +import wiiusej.Wiimote; +import wiiusej.wiiusejevents.physicalevents.IREvent; + +public class Ir extends WiimoteDevice implements LircButtonListener { + protected Graph graph; + protected Point tl, tr, br, bl, raw, point; + protected Line t, r, b, l; + + public Ir() { + tl = tr = br = bl = new Point(0, 0); + graph = new Graph(); + /*try { + while (true) { + graph.draw(new Point(Math.random(), Math.random())); + Thread.sleep(100); + } + } catch (InterruptedException e) { + e.printStackTrace(); + }*/ + LircService lircService = new LircService(); + lircService.put(PhiliphsRCLE011Button.NAME, + PhiliphsRCLE011Button.values()); + lircService.add(this); + lircService.start(); + WiimoteService wiimoteService = new WiimoteService(); + try { + Wiimote wiimote = wiimoteService.getDevice(this); + wiimote.activateIRTRacking(); + Thread.sleep(10000000); + } catch (DeviceNotFoundException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public void add(LircButton lircButton) { + if (lircButton instanceof PhiliphsRCLE011Button) { + boolean t = false, r = false, b = false, l = false; + switch ((PhiliphsRCLE011Button) lircButton) { + case RED: + tl = raw; + l = bl != null; + t = tr != null; + break; + case GREEN: + tr = raw; + t = tl != null; + r = br != null; + break; + case YELLOW: + br = raw; + r = tr != null; + b = bl != null; + break; + case BLUE: + bl = raw; + b = br != null; + l = tl != null; + break; + } + if (t) { + this.t = new Line(tl, tr); + } + if (r) { + this.r = new Line(tr, br); + } + if (b) { + this.b = new Line(br, bl); + } + if (l) { + this.l = new Line(bl, tl); + } + } + } + + public void onIrEvent(IREvent event) { + // log.debug(event); + raw = new Point(event.getAx(), event.getAy()); + log.debug(String.format("%d %d", raw.x, raw.y)); + if (t != null && r != null && b != null && l != null) { + double w = r.getX(raw.y) - l.getX(raw.y); + double h = t.getY(raw.x) - b.getY(raw.x); + point = new Point((w - l.getX(raw.y)) / w, (h - b.getY(raw.x)) / h); + graph.draw(point); + } + } + + public static void main(String[] args) { + new Ir(); + } + + protected class Point { + public double x, y; + + public Point(double x, double y) { + this.x = x; + this.y = y; + } + } + + protected class Line { + protected double a, b; + + public Line(Point p1, Point p2) { + a = (p2.y - p1.y) / (p2.x - p1.x); + b = p2.y - a * p2.x; + } + + public double getY(double x) { + return a * x + b; + } + + public double getX(double y) { + return (y - b) / a; + } + } + + public class Graph extends JPanel { + protected static final long serialVersionUID = 1L; + + final int PAD = 20; + final double X = 1; + final double Y = 2; + JFrame f; + Graphics2D g2; + double w, h; + + public Graph() { + f = new JFrame(); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.add(this); + f.setSize(400, 400); + f.setLocation(200, 200); + f.setVisible(true); + g2 = (Graphics2D) f.getGraphics(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + w = getWidth(); + h = getHeight(); + axes(); + } + + protected void draw(Point point) { + g2.clearRect(0, 0, 400, 400); + axes(); + double xInc = (double) (w - 2 * PAD) / X; + double scale = (double) (h - 2 * PAD) / Y; + // Mark data points. + g2.setPaint(Color.blue); + double x = PAD + point.x * xInc; + double y = h - PAD - scale * point.y; + g2.fill(new Ellipse2D.Double(x - 2, y - 2, 4, 4)); + } + + protected void axes() { + // Draw ordinate. + g2.draw(new Line2D.Double(PAD, PAD, PAD, h - PAD)); + // Draw abcissa. + g2.draw(new Line2D.Double(PAD, h - PAD, w - PAD, h - PAD)); + } + } +} diff --git a/java/src/mimis/util/Sound.java b/java/src/mimis/util/Sound.java index d3110bc..4f07002 100644 --- a/java/src/mimis/util/Sound.java +++ b/java/src/mimis/util/Sound.java @@ -37,8 +37,8 @@ public class Sound { public static void main(String[] args) { /*File file = new File("sound.wav"); try { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); - AudioFormat au = audioInputStream.getFormat(); + AudioInputStream inputStream = AudioSystem.getAudioInputStream(file); + AudioFormat au = inputStream.getFormat(); System.out.println(au.getSampleRate());// Hz System.out.println(au.getSampleSizeInBits());// bits } catch (Exception e) { @@ -59,7 +59,7 @@ public class Sound { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); AudioFormat audioFormat = audioInputStream.getFormat(); - // BufferedSound bufferedSound = bufferSound(audioInputStream); + // BufferedSound bufferedSound = bufferSound(inputStream); System.out.println(audioInputStream.getFormat().getSampleRate()); System.out.println(audioInputStream.getFormat().getFrameRate()); diff --git a/java/src/mimis/value/Command.java b/java/src/mimis/value/Command.java index f5ba3cf..1901135 100644 --- a/java/src/mimis/value/Command.java +++ b/java/src/mimis/value/Command.java @@ -65,4 +65,20 @@ public enum Command { public int getCode() { return code; } + + public enum System { + MOVE (0xf010), + MAXIMIZE (0xf030), + MINIMIZE (0xf020); + + protected int code; + + private System(int code) { + this.code = code; + } + + public int getCode() { + return code; + } + } } diff --git a/java/src/mimis/value/Windows.java b/java/src/mimis/value/Windows.java index 491c041..32c0d9c 100644 --- a/java/src/mimis/value/Windows.java +++ b/java/src/mimis/value/Windows.java @@ -3,6 +3,7 @@ package mimis.value; public enum Windows { WM_CLOSE (0x0010), WM_COMMAND (0x0111), + WM_SYSCOMMAND (0x0112), WM_APPCOMMAND (0x0319), WM_USER (0x0400), MAPVK_VK_TO_VSC (0); diff --git a/java/src/mimis/worker/Listener.java b/java/src/mimis/worker/Listener.java new file mode 100644 index 0000000..9e17294 --- /dev/null +++ b/java/src/mimis/worker/Listener.java @@ -0,0 +1,38 @@ +package mimis.worker; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +import mimis.Worker; + +public abstract class Listener extends Worker { + protected Queue queue; + + public Listener() { + queue = new ConcurrentLinkedQueue(); + } + + public void add(E element) { + queue.add(element); + synchronized (this) { + notifyAll(); + } + } + + public final void work() { + while (!queue.isEmpty()) { + input(queue.poll()); + } + if (!deactivate) { + synchronized (this) { + try { + wait(); + } catch (InterruptedException e) { + log.info(e); + } + } + } + } + + public abstract void input(E element); +} \ No newline at end of file diff --git a/java/src/wiiusej/test/ClassicControllerGuiTest.java b/java/src/wiiusej/test/ClassicControllerGuiTest.java deleted file mode 100644 index 4e55b90..0000000 --- a/java/src/wiiusej/test/ClassicControllerGuiTest.java +++ /dev/null @@ -1,179 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.test; - -import wiiusej.WiiUseApiManager; -import wiiusej.Wiimote; -import wiiusej.utils.ClassicControllerButtonsEventPanel; -import wiiusej.wiiusejevents.physicalevents.ClassicControllerEvent; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This frame is used to display events from a classic controller. - * - * @author guiguito - */ -public class ClassicControllerGuiTest extends javax.swing.JFrame implements WiimoteListener { - - private Wiimote wiimote; - private static int MAX_SHOULDER = 100; - - /** Creates new form ClassicControllerGuiTest */ - public ClassicControllerGuiTest(Wiimote wiimote) { - initComponents(); - this.wiimote = wiimote; - registerListeners(); - leftShoulderBar.setMaximum(MAX_SHOULDER); - rightShoulderBar.setMaximum(MAX_SHOULDER); - } - - private void registerListeners() { - wiimote.addWiiMoteEventListeners(this); - wiimote.addWiiMoteEventListeners((ClassicControllerButtonsEventPanel) classicControllerPanel); - } - - public void unRegisterListeners() { - wiimote.removeWiiMoteEventListeners(this); - wiimote.removeWiiMoteEventListeners((ClassicControllerButtonsEventPanel) classicControllerPanel); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - shouldersPanel = new javax.swing.JPanel(); - leftShoulderBar = new javax.swing.JProgressBar(); - rightShoulderBar = new javax.swing.JProgressBar(); - classicControllerPanel = new wiiusej.utils.ClassicControllerButtonsEventPanel(); - - setTitle("WiiuseJ Classic Controller Test GUI"); - setResizable(false); - getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS)); - - shouldersPanel.setMaximumSize(new java.awt.Dimension(350, 16)); - shouldersPanel.setMinimumSize(new java.awt.Dimension(350, 16)); - shouldersPanel.setPreferredSize(new java.awt.Dimension(350, 16)); - shouldersPanel.setLayout(new javax.swing.BoxLayout(shouldersPanel, javax.swing.BoxLayout.LINE_AXIS)); - shouldersPanel.add(leftShoulderBar); - shouldersPanel.add(rightShoulderBar); - - getContentPane().add(shouldersPanel); - - classicControllerPanel.setMaximumSize(new java.awt.Dimension(350, 182)); - classicControllerPanel.setMinimumSize(new java.awt.Dimension(350, 182)); - - javax.swing.GroupLayout classicControllerPanelLayout = new javax.swing.GroupLayout(classicControllerPanel); - classicControllerPanel.setLayout(classicControllerPanelLayout); - classicControllerPanelLayout.setHorizontalGroup( - classicControllerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 350, Short.MAX_VALUE) - ); - classicControllerPanelLayout.setVerticalGroup( - classicControllerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 182, Short.MAX_VALUE) - ); - - getContentPane().add(classicControllerPanel); - - pack(); - }// //GEN-END:initComponents - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing to do - } - - public void onIrEvent(IREvent arg0) { - // nothing to do - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - // nothing to do - } - - public void onExpansionEvent(ExpansionEvent arg0) { - if (arg0 instanceof ClassicControllerEvent) { - ClassicControllerEvent classicController = (ClassicControllerEvent) arg0; - float leftShoulder = classicController.getLeftShoulder(); - float rightShoulder = classicController.getRightShoulder(); - leftShoulderBar.setValue(Math.round(leftShoulder * MAX_SHOULDER)); - rightShoulderBar.setValue(Math.round(rightShoulder * MAX_SHOULDER)); - } - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing to do - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // nothing to do - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing to do - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing to do - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing to do - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing to do - } - - public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { - // nothing to do - } - - public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { - // nothing to do - } - - public static void main(String[] args) { - Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(1, true); - ClassicControllerGuiTest gui = null; - if (wiimotes.length > 0) { - gui = new ClassicControllerGuiTest(wiimotes[0]); - } - gui.setDefaultCloseOperation(WiiuseJGuiTest.EXIT_ON_CLOSE); - gui.setVisible(true); - } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel classicControllerPanel; - private javax.swing.JProgressBar leftShoulderBar; - private javax.swing.JProgressBar rightShoulderBar; - private javax.swing.JPanel shouldersPanel; - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/test/CloseGuiTestCleanly.java b/java/src/wiiusej/test/CloseGuiTestCleanly.java deleted file mode 100644 index 584f2d9..0000000 --- a/java/src/wiiusej/test/CloseGuiTestCleanly.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.test; - -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import wiiusej.WiiUseApiManager; - -/** - * This class is used to close wiiusej cleanly. - * - * @author guiguito - */ -public class CloseGuiTestCleanly implements WindowListener { - - public void windowOpened(WindowEvent e) { - // nothing - } - - public void windowClosing(WindowEvent e) { - WiiUseApiManager.definitiveShutdown(); - } - - public void windowClosed(WindowEvent e) { - // nothing - } - - public void windowIconified(WindowEvent e) { - // nothing - } - - public void windowDeiconified(WindowEvent e) { - // nothing - } - - public void windowActivated(WindowEvent e) { - // nothing - } - - public void windowDeactivated(WindowEvent e) { - // nothing - } - -} diff --git a/java/src/wiiusej/test/GuitarHero3GuiTest.java b/java/src/wiiusej/test/GuitarHero3GuiTest.java deleted file mode 100644 index b0f1dd4..0000000 --- a/java/src/wiiusej/test/GuitarHero3GuiTest.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * GuitarHeroGUITest.java - * - * Created on 12 juin 2008, 23:10 - */ -package wiiusej.test; - -import wiiusej.Wiimote; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.GuitarHeroEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This frame is used to display events from a Guitar Hero 3. - * @author guiguito - */ -public class GuitarHero3GuiTest extends javax.swing.JFrame implements WiimoteListener { - - private Wiimote wiimote; - private static int MAX_WHAMMY_BAR = 100; - - /** Creates new form GuitarHeroGUITest */ - public GuitarHero3GuiTest(Wiimote wiimote) { - initComponents(); - this.wiimote = wiimote; - whammyProgressBar.setMaximum(MAX_WHAMMY_BAR); - registerListeners(); - } - - private void registerListeners() { - wiimote.addWiiMoteEventListeners(this); - //register panel buttons - wiimote.addWiiMoteEventListeners(guitarHero3ButtonsEventPanel); - //register joystick panel - wiimote.addWiiMoteEventListeners(guitarHero3JoystickPanel); - } - - public void unRegisterListeners() { - wiimote.removeWiiMoteEventListeners(this); - wiimote.removeWiiMoteEventListeners(guitarHero3ButtonsEventPanel); - wiimote.removeWiiMoteEventListeners(guitarHero3JoystickPanel); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - buttonsEventPanel = new javax.swing.JPanel(); - guitarHero3ButtonsEventPanel = new wiiusej.utils.GuitarHero3ButtonsEventPanel(); - bottomPanel = new javax.swing.JPanel(); - guitarHero3JoystickPanel = new wiiusej.utils.GuitarHeroJoystickEventPanel(); - whammyProgressBar = new javax.swing.JProgressBar(); - - setTitle("WiiuseJ Guitar Hero 3 Test GUI"); - getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS)); - - buttonsEventPanel.setBackground(new java.awt.Color(0, 0, 0)); - - javax.swing.GroupLayout buttonsEventPanelLayout = new javax.swing.GroupLayout(buttonsEventPanel); - buttonsEventPanel.setLayout(buttonsEventPanelLayout); - buttonsEventPanelLayout.setHorizontalGroup( - buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 526, Short.MAX_VALUE) - .addGroup(buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(buttonsEventPanelLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(guitarHero3ButtonsEventPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE))) - ); - buttonsEventPanelLayout.setVerticalGroup( - buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 96, Short.MAX_VALUE) - .addGroup(buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(buttonsEventPanelLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(guitarHero3ButtonsEventPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE))) - ); - - getContentPane().add(buttonsEventPanel); - - bottomPanel.setBackground(new java.awt.Color(0, 0, 0)); - bottomPanel.setLayout(new javax.swing.BoxLayout(bottomPanel, javax.swing.BoxLayout.X_AXIS)); - bottomPanel.add(guitarHero3JoystickPanel); - - whammyProgressBar.setBackground(new java.awt.Color(255, 255, 255)); - whammyProgressBar.setForeground(new java.awt.Color(255, 0, 255)); - bottomPanel.add(whammyProgressBar); - - getContentPane().add(bottomPanel); - - pack(); - }// //GEN-END:initComponents - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing to do - } - - public void onIrEvent(IREvent arg0) { - // nothing to do - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - // nothing to do - } - - public void onExpansionEvent(ExpansionEvent arg0) { - if (arg0 instanceof GuitarHeroEvent) { - GuitarHeroEvent guitar = (GuitarHeroEvent) arg0; - //move progress bar for whammy bar - whammyProgressBar.setValue(Math.round(MAX_WHAMMY_BAR*guitar.getWhammyBar())); - } - - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing to do - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // nothing to do - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing to do - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing to do - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing to do - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing to do - } - - public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { - // nothing to do - } - - public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { - // nothing to do - } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel bottomPanel; - private javax.swing.JPanel buttonsEventPanel; - private wiiusej.utils.GuitarHero3ButtonsEventPanel guitarHero3ButtonsEventPanel; - private wiiusej.utils.GuitarHeroJoystickEventPanel guitarHero3JoystickPanel; - private javax.swing.JProgressBar whammyProgressBar; - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/test/Main.java b/java/src/wiiusej/test/Main.java deleted file mode 100644 index 67ef279..0000000 --- a/java/src/wiiusej/test/Main.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.test; - -import wiiusej.WiiUseApiManager; -import wiiusej.Wiimote; - -/** - * Main Class to launch WiiuseJ GUI Test. - * - * @author guiguito - */ -public class Main { - - /** - * @param args - * the command line arguments - */ - public static void main(String[] args) { - Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(1, true); - WiiuseJGuiTest gui = null; - if (wiimotes.length > 0) { - gui = new WiiuseJGuiTest(wiimotes[0]); - } else { - gui = new WiiuseJGuiTest(); - } - gui.setDefaultCloseOperation(WiiuseJGuiTest.EXIT_ON_CLOSE); - gui.setVisible(true); - } - -} diff --git a/java/src/wiiusej/test/NunchukGuiTest.java b/java/src/wiiusej/test/NunchukGuiTest.java deleted file mode 100644 index d7f284f..0000000 --- a/java/src/wiiusej/test/NunchukGuiTest.java +++ /dev/null @@ -1,450 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.test; - -import wiiusej.Wiimote; -import wiiusej.utils.AccelerationExpansionEventPanel; -import wiiusej.utils.AccelerationPanel; -import wiiusej.utils.GForceExpansionEventPanel; -import wiiusej.utils.GForcePanel; -import wiiusej.utils.NunchukJoystickEventPanel; -import wiiusej.utils.OrientationExpansionEventPanel; -import wiiusej.utils.OrientationPanel; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukButtonsEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This frame is used to display events from a nunchuk. - * - * @author guiguito - */ -public class NunchukGuiTest extends javax.swing.JFrame implements - WiimoteListener { - - private Wiimote wiimote; - private boolean isThresholdsRequested = true; - - /** Creates new form NunchukGuiTest */ - public NunchukGuiTest(Wiimote wiimote) { - initComponents(); - this.wiimote = wiimote; - registerListeners(); - } - - private void registerListeners() { - wiimote.addWiiMoteEventListeners(this); - wiimote.addWiiMoteEventListeners((OrientationPanel) orientationPanel); - wiimote.addWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote - .addWiiMoteEventListeners((AccelerationPanel) rawAccelerationPanel); - wiimote - .addWiiMoteEventListeners((NunchukJoystickEventPanel) joystickEventsPanel); - } - - public void unRegisterListeners() { - wiimote - .removeWiiMoteEventListeners((OrientationPanel) orientationPanel); - wiimote.removeWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote - .removeWiiMoteEventListeners((AccelerationPanel) rawAccelerationPanel); - wiimote - .removeWiiMoteEventListeners((NunchukJoystickEventPanel) joystickEventsPanel); - wiimote.removeWiiMoteEventListeners(this); - } - - public void requestThresholdsUpdate() { - isThresholdsRequested = true; - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - topPanels = new javax.swing.JPanel(); - joystickEventsPanel = new NunchukJoystickEventPanel(); - motionSensingEventsPanel = new javax.swing.JPanel(); - motionSensingEventsTabbedPanels = new javax.swing.JTabbedPane(); - rawAccelerationPanel = new AccelerationExpansionEventPanel(); - orientationPanel = new OrientationExpansionEventPanel(); - gForcePanel = new GForceExpansionEventPanel(); - setNunchukValuesPanel = new javax.swing.JPanel(); - nunchukButtonsEventPanel = new javax.swing.JPanel(); - cButton = new javax.swing.JButton(); - zButton = new javax.swing.JButton(); - nunchukOrientationPanel = new javax.swing.JPanel(); - nunchukOrientationTextField = new javax.swing.JTextField(); - nunchukOrientationButton = new javax.swing.JButton(); - nunchukAccelerationPanel = new javax.swing.JPanel(); - nunchukAccelerationTextField = new javax.swing.JTextField(); - nunchukAccelerationButton = new javax.swing.JButton(); - messagePanel = new javax.swing.JPanel(); - messageText = new javax.swing.JLabel(); - - setTitle("WiiuseJ Nunchuk Test GUI"); - setMinimumSize(new java.awt.Dimension(400, 400)); - getContentPane().setLayout( - new javax.swing.BoxLayout(getContentPane(), - javax.swing.BoxLayout.Y_AXIS)); - - topPanels.setMinimumSize(new java.awt.Dimension(400, 200)); - topPanels.setPreferredSize(new java.awt.Dimension(400, 200)); - topPanels.setLayout(new javax.swing.BoxLayout(topPanels, - javax.swing.BoxLayout.LINE_AXIS)); - - joystickEventsPanel.setBackground(new java.awt.Color(0, 0, 0)); - joystickEventsPanel.setBorder(javax.swing.BorderFactory - .createTitledBorder(new javax.swing.border.LineBorder( - new java.awt.Color(51, 153, 0), 2, true), - "Joystick View", - javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, - javax.swing.border.TitledBorder.DEFAULT_POSITION, - new java.awt.Font("Tahoma", 0, 11), new java.awt.Color( - 204, 102, 0))); - joystickEventsPanel.setToolTipText("JoystickEvent"); - joystickEventsPanel.setMinimumSize(new java.awt.Dimension(200, 200)); - - javax.swing.GroupLayout joystickEventsPanelLayout = new javax.swing.GroupLayout( - joystickEventsPanel); - joystickEventsPanel.setLayout(joystickEventsPanelLayout); - joystickEventsPanelLayout.setHorizontalGroup(joystickEventsPanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 601, Short.MAX_VALUE)); - joystickEventsPanelLayout.setVerticalGroup(joystickEventsPanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 174, Short.MAX_VALUE)); - - topPanels.add(joystickEventsPanel); - joystickEventsPanel.getAccessibleContext() - .setAccessibleName("Joystick"); - - motionSensingEventsPanel - .setMinimumSize(new java.awt.Dimension(200, 200)); - - rawAccelerationPanel.setToolTipText("Nunchuk MotionSensingEvent"); - - javax.swing.GroupLayout rawAccelerationPanelLayout = new javax.swing.GroupLayout( - rawAccelerationPanel); - rawAccelerationPanel.setLayout(rawAccelerationPanelLayout); - rawAccelerationPanelLayout - .setHorizontalGroup(rawAccelerationPanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 597, Short.MAX_VALUE)); - rawAccelerationPanelLayout.setVerticalGroup(rawAccelerationPanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 175, Short.MAX_VALUE)); - - motionSensingEventsTabbedPanels.addTab("RawAcceleration", - rawAccelerationPanel); - - javax.swing.GroupLayout orientationPanelLayout = new javax.swing.GroupLayout( - orientationPanel); - orientationPanel.setLayout(orientationPanelLayout); - orientationPanelLayout.setHorizontalGroup(orientationPanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 597, Short.MAX_VALUE)); - orientationPanelLayout.setVerticalGroup(orientationPanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 175, Short.MAX_VALUE)); - - motionSensingEventsTabbedPanels.addTab("Orientation", orientationPanel); - - javax.swing.GroupLayout gForcePanelLayout = new javax.swing.GroupLayout( - gForcePanel); - gForcePanel.setLayout(gForcePanelLayout); - gForcePanelLayout.setHorizontalGroup(gForcePanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 597, Short.MAX_VALUE)); - gForcePanelLayout.setVerticalGroup(gForcePanelLayout - .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 175, Short.MAX_VALUE)); - - motionSensingEventsTabbedPanels.addTab("GForce", gForcePanel); - - javax.swing.GroupLayout motionSensingEventsPanelLayout = new javax.swing.GroupLayout( - motionSensingEventsPanel); - motionSensingEventsPanel.setLayout(motionSensingEventsPanelLayout); - motionSensingEventsPanelLayout - .setHorizontalGroup(motionSensingEventsPanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(motionSensingEventsTabbedPanels, - javax.swing.GroupLayout.DEFAULT_SIZE, 602, - Short.MAX_VALUE)); - motionSensingEventsPanelLayout - .setVerticalGroup(motionSensingEventsPanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(motionSensingEventsTabbedPanels, - javax.swing.GroupLayout.DEFAULT_SIZE, 200, - Short.MAX_VALUE)); - - topPanels.add(motionSensingEventsPanel); - - getContentPane().add(topPanels); - - setNunchukValuesPanel.setMinimumSize(new java.awt.Dimension(400, 200)); - setNunchukValuesPanel - .setPreferredSize(new java.awt.Dimension(400, 200)); - setNunchukValuesPanel.setLayout(new javax.swing.BoxLayout( - setNunchukValuesPanel, javax.swing.BoxLayout.Y_AXIS)); - - nunchukButtonsEventPanel.setToolTipText("Nunchuk ButtonsEvent"); - nunchukButtonsEventPanel - .setMinimumSize(new java.awt.Dimension(100, 100)); - nunchukButtonsEventPanel.setPreferredSize(new java.awt.Dimension(100, - 100)); - nunchukButtonsEventPanel.setLayout(new javax.swing.BoxLayout( - nunchukButtonsEventPanel, javax.swing.BoxLayout.LINE_AXIS)); - - cButton.setText("C"); - cButton.setMaximumSize(new java.awt.Dimension(50, 50)); - cButton.setMinimumSize(new java.awt.Dimension(50, 50)); - cButton.setPreferredSize(new java.awt.Dimension(50, 50)); - nunchukButtonsEventPanel.add(cButton); - - zButton.setText("Z"); - zButton.setMaximumSize(new java.awt.Dimension(50, 50)); - zButton.setMinimumSize(new java.awt.Dimension(50, 50)); - zButton.setPreferredSize(new java.awt.Dimension(50, 50)); - nunchukButtonsEventPanel.add(zButton); - - setNunchukValuesPanel.add(nunchukButtonsEventPanel); - - nunchukOrientationTextField.setPreferredSize(new java.awt.Dimension(60, - 20)); - nunchukOrientationPanel.add(nunchukOrientationTextField); - - nunchukOrientationButton.setText("Set Orientation Threshold"); - nunchukOrientationButton - .addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - nunchukOrientationButtonMousePressed(evt); - } - }); - nunchukOrientationPanel.add(nunchukOrientationButton); - - setNunchukValuesPanel.add(nunchukOrientationPanel); - - nunchukAccelerationTextField.setPreferredSize(new java.awt.Dimension( - 60, 20)); - nunchukAccelerationPanel.add(nunchukAccelerationTextField); - - nunchukAccelerationButton.setText("Set Acceleration Threshold"); - nunchukAccelerationButton - .addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - nunchukAccelerationButtonMousePressed(evt); - } - }); - nunchukAccelerationPanel.add(nunchukAccelerationButton); - - setNunchukValuesPanel.add(nunchukAccelerationPanel); - - messageText.setText("Message:"); - - javax.swing.GroupLayout messagePanelLayout = new javax.swing.GroupLayout( - messagePanel); - messagePanel.setLayout(messagePanelLayout); - messagePanelLayout - .setHorizontalGroup(messagePanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 1216, Short.MAX_VALUE) - .addGroup( - messagePanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addGroup( - messagePanelLayout - .createSequentialGroup() - .addGap(0, 0, - Short.MAX_VALUE) - .addComponent( - messageText) - .addGap(0, 0, - Short.MAX_VALUE)))); - messagePanelLayout - .setVerticalGroup(messagePanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 34, Short.MAX_VALUE) - .addGroup( - messagePanelLayout - .createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING) - .addGroup( - messagePanelLayout - .createSequentialGroup() - .addGap(0, 0, - Short.MAX_VALUE) - .addComponent( - messageText) - .addGap(0, 0, - Short.MAX_VALUE)))); - - setNunchukValuesPanel.add(messagePanel); - - getContentPane().add(setNunchukValuesPanel); - - pack(); - }// //GEN-END:initComponents - - private void nunchukOrientationButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_nunchukOrientationButtonMousePressed - try { - float nb = Float.parseFloat(nunchukOrientationTextField.getText()); - wiimote.setNunchukOrientationThreshold(nb); - messageText.setText("Nunchuk orientation threshold set to " + nb); - } catch (NumberFormatException e) { - messageText - .setText("Number is not an integer, nunchuk orientation threshold not set !"); - } - }// GEN-LAST:event_nunchukOrientationButtonMousePressed - - private void nunchukAccelerationButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_nunchukAccelerationButtonMousePressed - try { - int nb = Integer.parseInt(nunchukAccelerationTextField.getText()); - wiimote.setNunchukAccelerationThreshold(nb); - messageText.setText("Nunchuk acceleration threshold set to " + nb); - } catch (NumberFormatException e) { - messageText - .setText("Number is not an integer, nunchuk acceleration threshold not set !"); - } - }// GEN-LAST:event_nunchukAccelerationButtonMousePressed - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing to do - } - - public void onIrEvent(IREvent arg0) { - // nothing to do - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - // nothing to do - } - - public void onExpansionEvent(ExpansionEvent arg0) { - if (arg0 instanceof NunchukEvent) { - NunchukEvent nunchuk = (NunchukEvent) arg0; - NunchukButtonsEvent buttons = nunchuk.getButtonsEvent(); - - //C button - if (buttons.isButtonCJustPressed()) { - cButton.setEnabled(false); - }else if (buttons.isButtonCJustReleased()) { - cButton.setEnabled(true); - } - - //Z button - if(buttons.isButtonZJustPressed()) { - zButton.setEnabled(false); - }else if (buttons.isButtonZJustReleased()) { - zButton.setEnabled(true); - } - - - if (isThresholdsRequested) { - MotionSensingEvent evt = nunchuk.getNunchukMotionSensingEvent(); - nunchukAccelerationTextField.setText(evt - .getAccelerationThreshold() - + ""); - nunchukOrientationTextField.setText(evt - .getOrientationThreshold() - + ""); - isThresholdsRequested = false; - } - } - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing to do - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // nothing - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton cButton; - private javax.swing.JPanel gForcePanel; - private javax.swing.JPanel joystickEventsPanel; - private javax.swing.JPanel messagePanel; - private javax.swing.JLabel messageText; - private javax.swing.JPanel motionSensingEventsPanel; - private javax.swing.JTabbedPane motionSensingEventsTabbedPanels; - private javax.swing.JButton nunchukAccelerationButton; - private javax.swing.JPanel nunchukAccelerationPanel; - private javax.swing.JTextField nunchukAccelerationTextField; - private javax.swing.JPanel nunchukButtonsEventPanel; - private javax.swing.JButton nunchukOrientationButton; - private javax.swing.JPanel nunchukOrientationPanel; - private javax.swing.JTextField nunchukOrientationTextField; - private javax.swing.JPanel orientationPanel; - private javax.swing.JPanel rawAccelerationPanel; - private javax.swing.JPanel setNunchukValuesPanel; - private javax.swing.JPanel topPanels; - private javax.swing.JButton zButton; - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/test/Tests.java b/java/src/wiiusej/test/Tests.java deleted file mode 100644 index fcd4ef0..0000000 --- a/java/src/wiiusej/test/Tests.java +++ /dev/null @@ -1,389 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.test; - -import java.awt.AWTException; -import java.awt.Robot; -import java.awt.event.InputEvent; - -import wiiusej.WiiUseApiManager; -import wiiusej.Wiimote; -import wiiusej.values.IRSource; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This class used to test WiiuseJ in text mode. - * - * @author guiguito - */ -public class Tests implements WiimoteListener { - - Robot robot; - - private static int DISPLAY_EACH_VALUE = 1; - private static int DUMP = 2; - private static int MOVE_MOUSE = 3; - private static int TEST_LEDS = 5; - - private Wiimote wiimote; - - int dump = DISPLAY_EACH_VALUE; - - public Tests(Wiimote wim) { - wiimote = wim; - wiimote.addWiiMoteEventListeners(this); - try { - robot = new Robot(); - } catch (AWTException e) { - e.printStackTrace(); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent e) { - if (dump == DISPLAY_EACH_VALUE) { - // 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.isButtonUpJustPressed()) { - wiimote.getStatus(); - } - - /* Activate rumble */ - if (e.isButtonOneJustPressed()) { - System.out.println("Rumble Activated"); - wiimote.activateRumble(); - } - if (e.isButtonTwoJustPressed()) { - System.out.println("Rumble Deactivated"); - wiimote.deactivateRumble(); - } - - /* Activate IR Tracking */ - if (e.isButtonAJustPressed()) { - System.out.println("IR Activated"); - wiimote.activateIRTRacking(); - } - if (e.isButtonBJustPressed()) { - System.out.println("IR Deactivated"); - wiimote.deactivateIRTRacking(); - } - - /* Activate Motion sensing */ - if (e.isButtonPlusJustPressed()) { - System.out.println("Motion sensing Activated"); - wiimote.activateMotionSensing(); - } - if (e.isButtonMinusJustPressed()) { - System.out.println("Motion sensing Deactivated"); - wiimote.deactivateMotionSensing(); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - wiimote.disconnect(); - WiiUseApiManager.definitiveShutdown(); - } - - } else if (dump == DUMP) { - System.out.println(e); - /* Activate all */ - if (e.isButtonAJustPressed()) { - System.out.println("IR, rumble and motion sensing Activated"); - wiimote.activateIRTRacking(); - wiimote.activateMotionSensing(); - wiimote.activateRumble(); - } - if (e.isButtonBJustPressed()) { - System.out.println("IR, rumble and motion sensing Deactivated"); - wiimote.deactivateIRTRacking(); - wiimote.deactivateMotionSensing(); - wiimote.deactivateRumble(); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - wiimote.disconnect(); - } - } else if (dump == MOVE_MOUSE) { - /* Activate IR Tracking */ - if (e.isButtonOneJustPressed()) { - System.out.println("IR Activated"); - wiimote.activateIRTRacking(); - } - if (e.isButtonTwoJustPressed()) { - System.out.println("IR Deactivated"); - wiimote.deactivateIRTRacking(); - } - - /* 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); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - wiimote.disconnect(); - } - } else if (dump == TEST_LEDS) { - wiimote.activateMotionSensing(); - if (e.isButtonUpJustPressed()) { - wiimote.setLeds(true, false, false, false); - } - if (e.isButtonDownJustPressed()) { - wiimote.setLeds(false, true, false, false); - } - if (e.isButtonLeftJustPressed()) { - wiimote.setLeds(false, false, true, false); - } - if (e.isButtonRightJustPressed()) { - wiimote.setLeds(false, false, false, true); - } - - /* leave test */ - if (e.isButtonHomeJustPressed()) { - System.out.println("LEAVING TEST"); - wiimote.disconnect(); - } - } - - } - - public void onIrEvent(IREvent e) { - if (dump == MOVE_MOUSE) { - IRSource[] list = e.getIRPoints(); - if (list.length > 0) { - 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); - } - } else { - System.out.println(e); - } - } - - public void onMotionSensingEvent(MotionSensingEvent e) { - /* display motion sensing */ - System.out.println(e); - } - - public void onExpansionEvent(ExpansionEvent e) { - System.out.println(e); - } - - public void onStatusEvent(StatusEvent e) { - // Display status variables - System.out.println(e); - } - - public void onDisconnectionEvent(DisconnectionEvent e) { - System.out.println(" wiimote " + e.getWiimoteId() - + "has been disconnected !!"); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent e) { - System.out.println(e); - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent e) { - System.out.println(e); - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent e) { - System.out.println(e); - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent e) { - System.out.println(e); - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent e) { - System.out.println(e); - } - - public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent e) { - System.out.println(e); - } - - /** - * @param args - */ - public static void main(String[] args) { - Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(1, true); - if (wiimotes.length > 0) { - System.out.println(wiimotes[0]); - new Tests(wiimotes[0]); - } else { - System.out.println("No wiimotes found !!!"); - } - - // java.util.Timer timer = new java.util.Timer(); - // timer.scheduleAtFixedRate(new LedsTask(), 0, 100); - - } - -} diff --git a/java/src/wiiusej/test/WiiuseJGuiTest.java b/java/src/wiiusej/test/WiiuseJGuiTest.java deleted file mode 100644 index 54dc777..0000000 --- a/java/src/wiiusej/test/WiiuseJGuiTest.java +++ /dev/null @@ -1,1379 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.test; - -import java.awt.AWTException; -import java.awt.Robot; -import java.awt.event.InputEvent; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.swing.JFrame; -import wiiusej.WiiUseApiManager; -import wiiusej.Wiimote; -import wiiusej.utils.AccelerationPanel; -import wiiusej.utils.AccelerationWiimoteEventPanel; -import wiiusej.utils.ButtonsEventPanel; -import wiiusej.utils.GForcePanel; -import wiiusej.utils.IRPanel; -import wiiusej.utils.OrientationPanel; -import wiiusej.utils.OrientationWiimoteEventPanel; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * Gui class to test WiiuseJ. - * - * @author guiguito - */ -public class WiiuseJGuiTest extends javax.swing.JFrame implements - WiimoteListener { - - private Wiimote wiimote; - private Robot robot = null; - private boolean statusMotionRequested = false; - private boolean statusIRRequested = false; - private JFrame expansionFrame = null; - private boolean isFirstStatusGot = false; - private WindowListener buttonSetter = new WindowListener() { - - public void windowOpened(WindowEvent e) { - // nothing - } - - public void windowClosing(WindowEvent e) { - // nothing - } - - public void windowClosed(WindowEvent e) { - // nothing - } - - public void windowIconified(WindowEvent e) { - // nothing - } - - public void windowDeiconified(WindowEvent e) { - // nothing - } - - public void windowActivated(WindowEvent e) { - showExpansionWiimoteButton.setEnabled(false); - if (expansionFrame instanceof NunchukGuiTest){ - showExpansionWiimoteButton.setText("Hide Nunchuk"); - }else if(expansionFrame instanceof GuitarHero3GuiTest){ - showExpansionWiimoteButton.setText("Hide Guitar"); - }else if(expansionFrame instanceof ClassicControllerGuiTest){ - showExpansionWiimoteButton.setText("Hide Classic Controller"); - } - } - - public void windowDeactivated(WindowEvent e) { - showExpansionWiimoteButton.setEnabled(true); - if (expansionFrame instanceof NunchukGuiTest){ - showExpansionWiimoteButton.setText("Show Nunchuk"); - }else if(expansionFrame instanceof GuitarHero3GuiTest){ - showExpansionWiimoteButton.setText("Show Guitar"); - }else if(expansionFrame instanceof ClassicControllerGuiTest){ - showExpansionWiimoteButton.setText("Show Classic controller"); - } - } - }; - - /** - * default constructor - */ - public WiiuseJGuiTest() { - initComponents(); - this.addWindowListener(new CloseGuiTestCleanly()); - } - - /** - * Creates new form WiiuseJGuiTest - */ - public WiiuseJGuiTest(Wiimote wiimote) { - initComponents(); - this.addWindowListener(new CloseGuiTestCleanly()); - if (wiimote != null) { - this.wiimote = wiimote; - registerListeners(); - initWiimote(); - isFirstStatusGot = false; - getStatusButtonMousePressed(null); - } - } - - /** - * Clear all views - */ - private void clearViews() { - ((IRPanel) irViewPanel).clearView(); - ((ButtonsEventPanel) buttonsPanel).clearView(); - ((OrientationPanel) motionSensingPanel).clearView(); - ((GForcePanel) gForcePanel).clearView(); - ((AccelerationPanel) accelerationPanel).clearView(); - } - - /** - * Unregister all listeners. - */ - private void unregisterListeners() { - wiimote.removeWiiMoteEventListeners((IRPanel) irViewPanel); - wiimote.removeWiiMoteEventListeners((ButtonsEventPanel) buttonsPanel); - wiimote - .removeWiiMoteEventListeners((OrientationPanel) motionSensingPanel); - wiimote.removeWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote - .removeWiiMoteEventListeners((AccelerationPanel) accelerationPanel); - wiimote.removeWiiMoteEventListeners(this); - } - - private void initWiimote() { - wiimote.deactivateContinuous(); - wiimote.deactivateSmoothing(); - wiimote.setScreenAspectRatio169(); - wiimote.setSensorBarBelowScreen(); - } - - /** - * Register all listeners - */ - private void registerListeners() { - wiimote.addWiiMoteEventListeners((IRPanel) irViewPanel); - wiimote.addWiiMoteEventListeners((ButtonsEventPanel) buttonsPanel); - wiimote.addWiiMoteEventListeners((OrientationPanel) motionSensingPanel); - wiimote.addWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote.addWiiMoteEventListeners((AccelerationPanel) accelerationPanel); - wiimote.addWiiMoteEventListeners(this); - - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - if (robot != null) { - if (arg0.isButtonAPressed()) { - robot.mousePress(InputEvent.BUTTON1_MASK); - - } - if (arg0.isButtonBPressed()) { - robot.mousePress(InputEvent.BUTTON2_MASK); - - } - if (arg0.isButtonOnePressed()) { - robot.mousePress(InputEvent.BUTTON3_MASK); - - } - if (arg0.isButtonAJustReleased()) { - robot.mouseRelease(InputEvent.BUTTON1_MASK); - - } - if (arg0.isButtonBJustReleased()) { - robot.mouseRelease(InputEvent.BUTTON2_MASK); - - } - if (arg0.isButtonOneJustReleased()) { - robot.mouseRelease(InputEvent.BUTTON3_MASK); - - } - if (arg0.isButtonUpPressed()) {// mouse wheel up - robot.mouseWheel(-1); - } - if (arg0.isButtonDownPressed()) {// mouse wheel down - robot.mouseWheel(1); - } - - if (arg0.isButtonTwoPressed()) {// stop mouse control - mouseIRControlButtonMousePressed(null); - } - } - } - - public void onIrEvent(IREvent arg0) { - if (robot != null) {// if mouse control activated - robot.mouseMove(arg0.getX(), arg0.getY()); - } - if (statusIRRequested) { - xResolutionTextField.setText("" + arg0.getXVRes()); - yResolutionTextField.setText("" + arg0.getYVRes()); - statusIRRequested = false; - } - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (statusMotionRequested) {// Status requested - accelerationThresholdTextField.setText("" - + arg0.getAccelerationThreshold()); - orientationThresholdTextField.setText("" - + arg0.getOrientationThreshold()); - alphaSmoothingTextField.setText("" + arg0.getAlphaSmoothing()); - statusMotionRequested = false; - } - } - - public void onExpansionEvent(ExpansionEvent e) { - // nothing yet - } - - public void onStatusEvent(StatusEvent arg0) { - if (!isFirstStatusGot) { - if (arg0.isNunchukConnected()) { - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Nunchuk"); - expansionFrame = new NunchukGuiTest(wiimote); - expansionFrame - .setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - expansionFrame.addWindowListener(buttonSetter); - isFirstStatusGot = true; - }else if(arg0.isClassicControllerConnected()){ - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Classic Controller"); - expansionFrame = new ClassicControllerGuiTest(wiimote); - expansionFrame - .setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - expansionFrame.addWindowListener(buttonSetter); - isFirstStatusGot = true; - } - else if(arg0.isGuitarHeroConnected()){ - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Guitar Hero 3 Controller"); - expansionFrame = new GuitarHero3GuiTest(wiimote); - expansionFrame - .setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - expansionFrame.addWindowListener(buttonSetter); - isFirstStatusGot = true; - } - } - messageText.setText("Status received !"); - batteryLevelText.setText(arg0.getBatteryLevel() + " %"); - led1Button.setEnabled(arg0.isLed1Set()); - led2Button.setEnabled(arg0.isLed2Set()); - led3Button.setEnabled(arg0.isLed3Set()); - led4Button.setEnabled(arg0.isLed4Set()); - if (arg0.isNunchukConnected()) { - ((NunchukGuiTest) expansionFrame).requestThresholdsUpdate(); - } - // attachments - int eventType = arg0.getEventType(); - if (eventType == StatusEvent.WIIUSE_CLASSIC_CTRL_INSERTED) { - expansionText.setText("Classic control connected."); - } else if (eventType == StatusEvent.WIIUSE_CLASSIC_CTRL_REMOVED) { - expansionText.setText("Classic control removed."); - } else if (eventType == StatusEvent.WIIUSE_NUNCHUK_INSERTED) { - expansionText.setText("Nunchuk connected."); - } else if (eventType == StatusEvent.WIIUSE_NUNCHUK_REMOVED) { - expansionText.setText("Nunchuk removed."); - } else if (eventType == StatusEvent.WIIUSE_GUITAR_HERO_3_CTRL_INSERTED) { - expansionText.setText("Guitar Hero 3 control connected."); - } else if (eventType == StatusEvent.WIIUSE_GUITAR_HERO_3_CTRL_REMOVED) { - expansionText.setText("Guitar Hero 3 control removed."); - } - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - messageText.setText("Wiimote Disconnected !"); - unregisterListeners(); - clearViews(); - isFirstStatusGot = false; - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent e) { - messageText.setText("Nunchuk connected !"); - expansionText.setText("Expansion connected : Nunchuk."); - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show nunchuk"); - expansionFrame = new NunchukGuiTest(wiimote); - expansionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - expansionFrame.addWindowListener(buttonSetter); - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent e) { - messageText.setText("Nunchuk disconnected !"); - expansionText.setText("No expansion connected."); - showExpansionWiimoteButton.setEnabled(false); - showExpansionWiimoteButton.setText("No expansion"); - if (expansionFrame != null) { - if (expansionFrame instanceof NunchukGuiTest) { - ((NunchukGuiTest) expansionFrame).unRegisterListeners(); - } - expansionFrame.setEnabled(false); - expansionFrame.dispose(); - expansionFrame = null; - } - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - messageText.setText("Guitar Hero 3 connected !"); - expansionText.setText("Expansion connected : Guitar Hero 3."); - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Guitar Hero 3"); - expansionFrame = new GuitarHero3GuiTest(wiimote); - expansionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - expansionFrame.addWindowListener(buttonSetter); - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - messageText.setText("Guitar Hero 3 disconnected !"); - expansionText.setText("No expansion connected."); - showExpansionWiimoteButton.setEnabled(false); - showExpansionWiimoteButton.setText("No expansion"); - if (expansionFrame != null) { - if (expansionFrame instanceof GuitarHero3GuiTest) { - ((GuitarHero3GuiTest) expansionFrame).unRegisterListeners(); - } - expansionFrame.setEnabled(false); - expansionFrame.dispose(); - expansionFrame = null; - } - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - messageText.setText("Classic controller connected !"); - expansionText.setText("Expansion connected : Classic Controller."); - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Classic Controller"); - expansionFrame = new ClassicControllerGuiTest(wiimote); - expansionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - expansionFrame.addWindowListener(buttonSetter); - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - messageText.setText("Classic controller disconnected !"); - expansionText.setText("No expansion connected."); - showExpansionWiimoteButton.setEnabled(false); - showExpansionWiimoteButton.setText("No expansion"); - if (expansionFrame != null) { - if (expansionFrame instanceof ClassicControllerGuiTest) { - ((ClassicControllerGuiTest) expansionFrame).unRegisterListeners(); - } - expansionFrame.setEnabled(false); - expansionFrame.dispose(); - expansionFrame = null; - } - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - leftPanel = new javax.swing.JPanel(); - irViewPanel = new IRPanel(); - jTabbedPane1 = new javax.swing.JTabbedPane(); - accelerationPanel = new AccelerationWiimoteEventPanel(); - motionSensingPanel = new OrientationWiimoteEventPanel(); - gForcePanel = new wiiusej.utils.GForceWiimoteEventPanel(); - rightPanel = new javax.swing.JPanel(); - fixedWiimotePanel = new javax.swing.JPanel(); - buttonsPanel = new ButtonsEventPanel(); - controlsPanel = new javax.swing.JPanel(); - activateRumbleIRPanel = new javax.swing.JPanel(); - toggleRumbleButton = new javax.swing.JButton(); - toggleIRTrackingButton = new javax.swing.JButton(); - activateMotionSensingPanel = new javax.swing.JPanel(); - toggleMotionSensingTrackingButton = new javax.swing.JButton(); - activateSmoothingContinuousPanel = new javax.swing.JPanel(); - toggleSmoothingButton = new javax.swing.JButton(); - toggleContinuousButton = new javax.swing.JButton(); - setLedsPanel = new javax.swing.JPanel(); - led1Button = new javax.swing.JButton(); - led2Button = new javax.swing.JButton(); - led3Button = new javax.swing.JButton(); - led4Button = new javax.swing.JButton(); - setLedsButton = new javax.swing.JButton(); - setAlphaSmoothingPanel = new javax.swing.JPanel(); - alphaSmoothingTextField = new javax.swing.JTextField(); - alphaSmoothingButton = new javax.swing.JButton(); - setOrientationThresholdPanel = new javax.swing.JPanel(); - orientationThresholdTextField = new javax.swing.JTextField(); - orientationThresholdButton = new javax.swing.JButton(); - setAccelerationThresholdPanel = new javax.swing.JPanel(); - accelerationThresholdTextField = new javax.swing.JTextField(); - accelerationThresholdButton = new javax.swing.JButton(); - getStatusPanel = new javax.swing.JPanel(); - getStatusButton = new javax.swing.JButton(); - batteryText = new javax.swing.JLabel(); - batteryLevelText = new javax.swing.JLabel(); - setIrSensitivyPanel = new javax.swing.JPanel(); - setIrSensitivySpinner = new javax.swing.JSpinner(); - setIrSensitivyButton = new javax.swing.JButton(); - setTimeoutButton = new javax.swing.JButton(); - setTimeoutPanel = new javax.swing.JPanel(); - normalTimeoutSpinner = new javax.swing.JSpinner(); - normalTimeoutText = new javax.swing.JLabel(); - expansionHandshakeTimeoutSpinner = new javax.swing.JSpinner(); - expansionHandshakeTimeoutText = new javax.swing.JLabel(); - setIRConfPanel = new javax.swing.JPanel(); - toggleSensorBarPositionButton = new javax.swing.JButton(); - toggleScreenAspectRatioButton = new javax.swing.JButton(); - setVirtualResolutionPanel = new javax.swing.JPanel(); - xLabel = new javax.swing.JLabel(); - xResolutionTextField = new javax.swing.JTextField(); - yLabel = new javax.swing.JLabel(); - yResolutionTextField = new javax.swing.JTextField(); - setVirtualResolutionButton = new javax.swing.JButton(); - startMouseControlPanel = new javax.swing.JPanel(); - mouseIRControlButton = new javax.swing.JButton(); - exPansionPanel = new javax.swing.JPanel(); - expansionText = new javax.swing.JLabel(); - expansionButtonPanel = new javax.swing.JPanel(); - showExpansionWiimoteButton = new javax.swing.JButton(); - showExpansionWiimoteButton.setEnabled(false); - messagesPanel = new javax.swing.JPanel(); - reconnectWiimotesButton = new javax.swing.JButton(); - messageLabelText = new javax.swing.JLabel(); - messageText = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setTitle("WiiuseJ Test GUI"); - setName("WiiuseJ Test GUI"); // NOI18N - - leftPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - - irViewPanel.setBackground(new java.awt.Color(0, 0, 0)); - irViewPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 153, 153), 2, true), "IR View", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(255, 0, 51))); - irViewPanel.setToolTipText("IREvent"); - - javax.swing.GroupLayout irViewPanelLayout = new javax.swing.GroupLayout(irViewPanel); - irViewPanel.setLayout(irViewPanelLayout); - irViewPanelLayout.setHorizontalGroup( - irViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 272, Short.MAX_VALUE) - ); - irViewPanelLayout.setVerticalGroup( - irViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 299, Short.MAX_VALUE) - ); - - accelerationPanel.setToolTipText("MotionSensingEvent"); - - javax.swing.GroupLayout accelerationPanelLayout = new javax.swing.GroupLayout(accelerationPanel); - accelerationPanel.setLayout(accelerationPanelLayout); - accelerationPanelLayout.setHorizontalGroup( - accelerationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 279, Short.MAX_VALUE) - ); - accelerationPanelLayout.setVerticalGroup( - accelerationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 213, Short.MAX_VALUE) - ); - - jTabbedPane1.addTab("Acceleration", accelerationPanel); - - javax.swing.GroupLayout motionSensingPanelLayout = new javax.swing.GroupLayout(motionSensingPanel); - motionSensingPanel.setLayout(motionSensingPanelLayout); - motionSensingPanelLayout.setHorizontalGroup( - motionSensingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 279, Short.MAX_VALUE) - ); - motionSensingPanelLayout.setVerticalGroup( - motionSensingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 213, Short.MAX_VALUE) - ); - - jTabbedPane1.addTab("Orientation", motionSensingPanel); - - javax.swing.GroupLayout gForcePanelLayout = new javax.swing.GroupLayout(gForcePanel); - gForcePanel.setLayout(gForcePanelLayout); - gForcePanelLayout.setHorizontalGroup( - gForcePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 279, Short.MAX_VALUE) - ); - gForcePanelLayout.setVerticalGroup( - gForcePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 213, Short.MAX_VALUE) - ); - - jTabbedPane1.addTab("GForce", gForcePanel); - - javax.swing.GroupLayout leftPanelLayout = new javax.swing.GroupLayout(leftPanel); - leftPanel.setLayout(leftPanelLayout); - leftPanelLayout.setHorizontalGroup( - leftPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(irViewPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE) - ); - leftPanelLayout.setVerticalGroup( - leftPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, leftPanelLayout.createSequentialGroup() - .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(irViewPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - jTabbedPane1.getAccessibleContext().setAccessibleName("Orientation"); - - rightPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - rightPanel.setLayout(new javax.swing.BoxLayout(rightPanel, javax.swing.BoxLayout.LINE_AXIS)); - - fixedWiimotePanel.setMaximumSize(new java.awt.Dimension(120, 32767)); - fixedWiimotePanel.setMinimumSize(new java.awt.Dimension(120, 100)); - fixedWiimotePanel.setPreferredSize(new java.awt.Dimension(120, 100)); - fixedWiimotePanel.setRequestFocusEnabled(false); - fixedWiimotePanel.setLayout(null); - - buttonsPanel.setMaximumSize(new java.awt.Dimension(120, 484)); - buttonsPanel.setMinimumSize(new java.awt.Dimension(120, 484)); - buttonsPanel.setOpaque(false); - buttonsPanel.setPreferredSize(new java.awt.Dimension(120, 484)); - - javax.swing.GroupLayout buttonsPanelLayout = new javax.swing.GroupLayout(buttonsPanel); - buttonsPanel.setLayout(buttonsPanelLayout); - buttonsPanelLayout.setHorizontalGroup( - buttonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 120, Short.MAX_VALUE) - ); - buttonsPanelLayout.setVerticalGroup( - buttonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 484, Short.MAX_VALUE) - ); - - fixedWiimotePanel.add(buttonsPanel); - buttonsPanel.setBounds(0, 0, 120, 484); - - rightPanel.add(fixedWiimotePanel); - - controlsPanel.setMinimumSize(new java.awt.Dimension(100, 264)); - controlsPanel.setPreferredSize(new java.awt.Dimension(190, 264)); - controlsPanel.setLayout(new java.awt.GridLayout(16, 1)); - - toggleRumbleButton.setText("Activate Rumble"); - toggleRumbleButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleRumbleButtonMousePressed(evt); - } - }); - activateRumbleIRPanel.add(toggleRumbleButton); - - toggleIRTrackingButton.setText("Activate IR Tracking"); - toggleIRTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleIRTrackingButtonMousePressed(evt); - } - }); - activateRumbleIRPanel.add(toggleIRTrackingButton); - - controlsPanel.add(activateRumbleIRPanel); - - toggleMotionSensingTrackingButton.setText("Activate motion sensing Tracking"); - toggleMotionSensingTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleMotionSensingTrackingButtonMousePressed(evt); - } - }); - activateMotionSensingPanel.add(toggleMotionSensingTrackingButton); - - controlsPanel.add(activateMotionSensingPanel); - - toggleSmoothingButton.setText("Activate Smoothing"); - toggleSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSmoothingButtonMousePressed(evt); - } - }); - activateSmoothingContinuousPanel.add(toggleSmoothingButton); - - toggleContinuousButton.setText("Activate Continuous"); - toggleContinuousButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleContinuousButtonMousePressed(evt); - } - }); - activateSmoothingContinuousPanel.add(toggleContinuousButton); - - controlsPanel.add(activateSmoothingContinuousPanel); - - led1Button.setText("Led1"); - led1Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led1ButtonMousePressed(evt); - } - }); - setLedsPanel.add(led1Button); - - led2Button.setText("Led2"); - led2Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led2ButtonMousePressed(evt); - } - }); - setLedsPanel.add(led2Button); - - led3Button.setText("Led3"); - led3Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led3ButtonMousePressed(evt); - } - }); - setLedsPanel.add(led3Button); - - led4Button.setText("Led4"); - led4Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led4ButtonMousePressed(evt); - } - }); - setLedsPanel.add(led4Button); - - setLedsButton.setText("Set leds"); - setLedsButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setLedsButtonMousePressed(evt); - } - }); - setLedsPanel.add(setLedsButton); - - controlsPanel.add(setLedsPanel); - - alphaSmoothingTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - alphaSmoothingTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - setAlphaSmoothingPanel.add(alphaSmoothingTextField); - - alphaSmoothingButton.setText("Set alpha smoothing"); - alphaSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - alphaSmoothingButtonMousePressed(evt); - } - }); - setAlphaSmoothingPanel.add(alphaSmoothingButton); - - controlsPanel.add(setAlphaSmoothingPanel); - - orientationThresholdTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - orientationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - setOrientationThresholdPanel.add(orientationThresholdTextField); - - orientationThresholdButton.setText("Set orientation threshold"); - orientationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - orientationThresholdButtonMousePressed(evt); - } - }); - setOrientationThresholdPanel.add(orientationThresholdButton); - - controlsPanel.add(setOrientationThresholdPanel); - - accelerationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - setAccelerationThresholdPanel.add(accelerationThresholdTextField); - - accelerationThresholdButton.setText("Set acceleration threshold"); - accelerationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - accelerationThresholdButtonMousePressed(evt); - } - }); - setAccelerationThresholdPanel.add(accelerationThresholdButton); - - controlsPanel.add(setAccelerationThresholdPanel); - - getStatusButton.setText("Get status"); - getStatusButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - getStatusButtonMousePressed(evt); - } - }); - getStatusPanel.add(getStatusButton); - - batteryText.setFont(new java.awt.Font("Tahoma", 0, 14)); - batteryText.setText("Battery level :"); - getStatusPanel.add(batteryText); - - batteryLevelText.setFont(new java.awt.Font("Arial", 0, 14)); - batteryLevelText.setText(" %"); - getStatusPanel.add(batteryLevelText); - - controlsPanel.add(getStatusPanel); - - setIrSensitivySpinner.setPreferredSize(new java.awt.Dimension(50, 18)); - setIrSensitivySpinner.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - setIrSensitivySpinnerStateChanged(evt); - } - }); - setIrSensitivyPanel.add(setIrSensitivySpinner); - - setIrSensitivyButton.setText("SetIrSensivity"); - setIrSensitivyButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setIrSensitivyButtonMousePressed(evt); - } - }); - setIrSensitivyPanel.add(setIrSensitivyButton); - - setTimeoutButton.setText("Set timeouts in ms"); - setTimeoutButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setTimeoutButtonMousePressed(evt); - } - }); - setIrSensitivyPanel.add(setTimeoutButton); - - controlsPanel.add(setIrSensitivyPanel); - - normalTimeoutSpinner.setPreferredSize(new java.awt.Dimension(40, 18)); - normalTimeoutSpinner.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - normalTimeoutSpinnerStateChanged(evt); - } - }); - setTimeoutPanel.add(normalTimeoutSpinner); - - normalTimeoutText.setText("Normal timeout"); - setTimeoutPanel.add(normalTimeoutText); - - expansionHandshakeTimeoutSpinner.setPreferredSize(new java.awt.Dimension(40, 18)); - expansionHandshakeTimeoutSpinner.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - expansionHandshakeTimeoutSpinnerStateChanged(evt); - } - }); - setTimeoutPanel.add(expansionHandshakeTimeoutSpinner); - - expansionHandshakeTimeoutText.setText("Expansion handshake timeout"); - setTimeoutPanel.add(expansionHandshakeTimeoutText); - - controlsPanel.add(setTimeoutPanel); - - toggleSensorBarPositionButton.setText("Set sensor bar above"); - toggleSensorBarPositionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSensorBarPositionButtonMousePressed(evt); - } - }); - setIRConfPanel.add(toggleSensorBarPositionButton); - - toggleScreenAspectRatioButton.setText("Set screen aspect ratio 4/3"); - toggleScreenAspectRatioButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleScreenAspectRatioButtonMousePressed(evt); - } - }); - setIRConfPanel.add(toggleScreenAspectRatioButton); - - controlsPanel.add(setIRConfPanel); - - xLabel.setText("X"); - setVirtualResolutionPanel.add(xLabel); - - xResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - xResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - setVirtualResolutionPanel.add(xResolutionTextField); - - yLabel.setText("Y"); - setVirtualResolutionPanel.add(yLabel); - - yResolutionTextField.setFocusTraversalPolicyProvider(true); - yResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - yResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - setVirtualResolutionPanel.add(yResolutionTextField); - - setVirtualResolutionButton.setText("Set virtual resolution"); - setVirtualResolutionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setVirtualResolutionButtonMousePressed(evt); - } - }); - setVirtualResolutionPanel.add(setVirtualResolutionButton); - - controlsPanel.add(setVirtualResolutionPanel); - - mouseIRControlButton.setText("Start infrared mouse control"); - mouseIRControlButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - mouseIRControlButtonMousePressed(evt); - } - }); - startMouseControlPanel.add(mouseIRControlButton); - - controlsPanel.add(startMouseControlPanel); - - expansionText.setText("No expansion connected."); - exPansionPanel.add(expansionText); - - controlsPanel.add(exPansionPanel); - - showExpansionWiimoteButton.setText("No expansion connected"); - showExpansionWiimoteButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - showExpansionWiimoteButtonMousePressed(evt); - } - }); - expansionButtonPanel.add(showExpansionWiimoteButton); - - controlsPanel.add(expansionButtonPanel); - - reconnectWiimotesButton.setText("Reconnect wiimote"); - reconnectWiimotesButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - reconnectWiimotesButtonMousePressed(evt); - } - }); - messagesPanel.add(reconnectWiimotesButton); - - messageLabelText.setFont(new java.awt.Font("Tahoma", 0, 14)); - messageLabelText.setText("Message : "); - messagesPanel.add(messageLabelText); - - messageText.setFont(new java.awt.Font("Arial", 0, 14)); - messageText.setText("None"); - messagesPanel.add(messageText); - - controlsPanel.add(messagesPanel); - - rightPanel.add(controlsPanel); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(leftPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(rightPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 498, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(leftPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(rightPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 573, Short.MAX_VALUE) - ); - - java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); - setBounds((screenSize.width-800)/2, (screenSize.height-600)/2, 800, 600); - }// //GEN-END:initComponents - - private void toggleRumbleButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleRumbleButtonMousePressed - if (toggleRumbleButton.isEnabled()) { - wiimote.activateRumble(); - toggleRumbleButton.setEnabled(false); - toggleRumbleButton.setText("Deactivate Rumble"); - messageText.setText("Rumble activated"); - } else { - wiimote.deactivateRumble(); - toggleRumbleButton.setEnabled(true); - toggleRumbleButton.setText("Activate Rumble"); - messageText.setText("Rumble deactivated"); - } - }// GEN-LAST:event_toggleRumbleButtonMousePressed - - private void toggleIRTrackingButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleIRTrackingButtonMousePressed - if (toggleIRTrackingButton.isEnabled()) { - wiimote.activateIRTRacking(); - toggleIRTrackingButton.setEnabled(false); - toggleIRTrackingButton.setText("Deactivate IR Tracking"); - messageText.setText("IR Tracking activated"); - } else { - wiimote.deactivateIRTRacking(); - toggleIRTrackingButton.setEnabled(true); - toggleIRTrackingButton.setText("Activate IR Tracking"); - ((IRPanel) irViewPanel).onDisconnectionEvent(null); - messageText.setText("IR Tracking deactivated"); - } - }// GEN-LAST:event_toggleIRTrackingButtonMousePressed - - private void toggleMotionSensingTrackingButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleMotionSensingTrackingButtonMousePressed - if (toggleMotionSensingTrackingButton.isEnabled()) { - wiimote.activateMotionSensing(); - toggleMotionSensingTrackingButton.setEnabled(false); - toggleMotionSensingTrackingButton - .setText("Deactivate Motion Sensing"); - messageText.setText("Motion Sensing activated"); - } else { - wiimote.deactivateMotionSensing(); - toggleMotionSensingTrackingButton.setEnabled(true); - toggleMotionSensingTrackingButton - .setText("Activate Motion Sensing"); - ((OrientationPanel) motionSensingPanel).onDisconnectionEvent(null); - ((GForcePanel) gForcePanel).onDisconnectionEvent(null); - messageText.setText("Motion Sensing deactivated"); - } - }// GEN-LAST:event_toggleMotionSensingTrackingButtonMousePressed - - private void toggleSmoothingButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleSmoothingButtonMousePressed - if (toggleSmoothingButton.isEnabled()) { - wiimote.activateSmoothing(); - toggleSmoothingButton.setEnabled(false); - toggleSmoothingButton.setText("Deactivate Alpha Smoothing"); - messageText.setText("Alpha Smoothing activated"); - } else { - wiimote.deactivateSmoothing(); - toggleSmoothingButton.setEnabled(true); - toggleSmoothingButton.setText("Activate Alpha Smoothing"); - messageText.setText("Alpha Smoothing deactivated"); - } - }// GEN-LAST:event_toggleSmoothingButtonMousePressed - - private void toggleContinuousButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleContinuousButtonMousePressed - if (toggleContinuousButton.isEnabled()) { - wiimote.activateContinuous(); - toggleContinuousButton.setEnabled(false); - toggleContinuousButton.setText("Deactivate Continuous"); - messageText.setText("Continuous activated"); - } else { - wiimote.deactivateContinuous(); - toggleContinuousButton.setEnabled(true); - toggleContinuousButton.setText("Activate Continuous"); - messageText.setText("Continuous deactivated"); - } - }// GEN-LAST:event_toggleContinuousButtonMousePressed - - private void led1ButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_led1ButtonMousePressed - if (led1Button.isEnabled()) { - led1Button.setEnabled(false); - } else { - led1Button.setEnabled(true); - } - }// GEN-LAST:event_led1ButtonMousePressed - - private void led2ButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_led2ButtonMousePressed - if (led2Button.isEnabled()) { - led2Button.setEnabled(false); - } else { - led2Button.setEnabled(true); - } - }// GEN-LAST:event_led2ButtonMousePressed - - private void led3ButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_led3ButtonMousePressed - if (led3Button.isEnabled()) { - led3Button.setEnabled(false); - } else { - led3Button.setEnabled(true); - } - }// GEN-LAST:event_led3ButtonMousePressed - - private void led4ButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_led4ButtonMousePressed - if (led4Button.isEnabled()) { - led4Button.setEnabled(false); - } else { - led4Button.setEnabled(true); - } - }// GEN-LAST:event_led4ButtonMousePressed - - private void setLedsButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_setLedsButtonMousePressed - wiimote.setLeds(led1Button.isEnabled(), led2Button.isEnabled(), - led3Button.isEnabled(), led4Button.isEnabled()); - messageText.setText("Leds set"); - }// GEN-LAST:event_setLedsButtonMousePressed - - private void alphaSmoothingButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_alphaSmoothingButtonMousePressed - try { - float nb = Float.parseFloat(alphaSmoothingTextField.getText()); - wiimote.setAlphaSmoothingValue(nb); - messageText.setText("Alpha smoothing set to " + nb); - } catch (NumberFormatException e) { - messageText - .setText("Number is not a float, alpha smoothing not set !"); - } - }// GEN-LAST:event_alphaSmoothingButtonMousePressed - - private void orientationThresholdButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_orientationThresholdButtonMousePressed - try { - float nb = Float - .parseFloat(orientationThresholdTextField.getText()); - wiimote.setOrientationThreshold(nb); - messageText.setText("Orientation threshold set to " + nb); - } catch (NumberFormatException e) { - messageText - .setText("Number is not a float, orientation threshold not set !"); - } - }// GEN-LAST:event_orientationThresholdButtonMousePressed - - private void accelerationThresholdButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_accelerationThresholdButtonMousePressed - try { - int nb = Integer.parseInt(accelerationThresholdTextField.getText()); - wiimote.setAccelerationThreshold(nb); - messageText.setText("Acceleration threshold set to " + nb); - } catch (NumberFormatException e) { - messageText - .setText("Number is not an integer, acceleration threshold not set !"); - } - }// GEN-LAST:event_accelerationThresholdButtonMousePressed - - private void getStatusButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_getStatusButtonMousePressed - wiimote.getStatus(); - statusMotionRequested = true; - statusIRRequested = true; - if (expansionFrame instanceof NunchukGuiTest) { - ((NunchukGuiTest) expansionFrame).requestThresholdsUpdate(); - } - }// GEN-LAST:event_getStatusButtonMousePressed - - private void toggleSensorBarPositionButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleSensorBarPositionButtonMousePressed - if (toggleSensorBarPositionButton.isEnabled()) { - wiimote.setSensorBarBelowScreen(); - toggleSensorBarPositionButton.setEnabled(false); - toggleSensorBarPositionButton.setText("Set sensor bar below"); - messageText.setText("Sensor bar set above"); - } else { - wiimote.setSensorBarAboveScreen(); - toggleSensorBarPositionButton.setEnabled(true); - toggleSensorBarPositionButton.setText("Set sensor bar above"); - messageText.setText("Sensor bar set below"); - } - }// GEN-LAST:event_toggleSensorBarPositionButtonMousePressed - - private void toggleScreenAspectRatioButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_toggleScreenAspectRatioButtonMousePressed - if (toggleScreenAspectRatioButton.isEnabled()) { - wiimote.setScreenAspectRatio43(); - toggleScreenAspectRatioButton.setEnabled(false); - toggleScreenAspectRatioButton - .setText("Set screen aspect ratio 16/9"); - messageText.setText("creen aspect ratio to 4/3"); - } else { - wiimote.setScreenAspectRatio169(); - toggleScreenAspectRatioButton.setEnabled(true); - toggleScreenAspectRatioButton - .setText("Set screen aspect ratio 4/3"); - messageText.setText("Screen aspect ratio to 16/9"); - } - }// GEN-LAST:event_toggleScreenAspectRatioButtonMousePressed - - private void setVirtualResolutionButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_setVirtualResolutionButtonMousePressed - try { - int xres = Integer.parseInt(xResolutionTextField.getText()); - int yres = Integer.parseInt(yResolutionTextField.getText()); - wiimote.setVirtualResolution(xres, yres); - messageText.setText("Virtual resolution set to " + xres + "X" - + yres); - } catch (NumberFormatException e) { - messageText - .setText("A number in the virtual resolution is not an integer. Virtual resolution not set!"); - } - }// GEN-LAST:event_setVirtualResolutionButtonMousePressed - - private void mouseIRControlButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_mouseIRControlButtonMousePressed - if (mouseIRControlButton.isEnabled()) { - try { - mouseIRControlButton.setEnabled(false); - mouseIRControlButton.setText("Stop infrared mouse control"); - robot = new Robot(); - messageText.setText("Infrared mouse control started"); - } catch (AWTException ex) { - Logger.getLogger(WiiuseJGuiTest.class.getName()).log( - Level.SEVERE, null, ex); - } - } else { - mouseIRControlButton.setEnabled(true); - mouseIRControlButton.setText("Start infrared mouse control"); - robot = null; - messageText.setText("Infrared mouse control stopped"); - } - }// GEN-LAST:event_mouseIRControlButtonMousePressed - - private void normalTimeoutSpinnerStateChanged( - javax.swing.event.ChangeEvent evt) {// GEN-FIRST:event_normalTimeoutSpinnerStateChanged - String value = normalTimeoutSpinner.getValue().toString(); - boolean isInt = true; - int valueInt = 0; - try { - valueInt = Integer.parseInt(value); - } catch (NumberFormatException e) { - isInt = false; - messageText.setText("Wrong value for normal timeout."); - } - if (isInt) { - if (valueInt > 1000) { - normalTimeoutSpinner.setValue("1000"); - } else if (valueInt < 0) { - normalTimeoutSpinner.setValue("0"); - } - } - }// GEN-LAST:event_normalTimeoutSpinnerStateChanged - - private void expansionHandshakeTimeoutSpinnerStateChanged( - javax.swing.event.ChangeEvent evt) {// GEN-FIRST:event_expansionHandshakeTimeoutSpinnerStateChanged - String value = expansionHandshakeTimeoutSpinner.getValue().toString(); - boolean isInt = true; - int valueInt = 0; - try { - valueInt = Integer.parseInt(value); - } catch (NumberFormatException e) { - isInt = false; - messageText.setText("Wrong value for expansion handshake timeout."); - } - if (isInt) { - if (valueInt > 1000) { - expansionHandshakeTimeoutSpinner.setValue("1000"); - } else if (valueInt < 0) { - expansionHandshakeTimeoutSpinner.setValue("0"); - } - } - }// GEN-LAST:event_expansionHandshakeTimeoutSpinnerStateChanged - - private void setIrSensitivySpinnerStateChanged( - javax.swing.event.ChangeEvent evt) {// GEN-FIRST:event_setIrSensitivySpinnerStateChanged - String value = setIrSensitivySpinner.getValue().toString(); - boolean isInt = true; - int valueInt = 0; - try { - valueInt = Integer.parseInt(value); - } catch (NumberFormatException e) { - isInt = false; - messageText.setText("Wrong value for IR senstivity."); - } - if (isInt) { - if (valueInt > 5) { - setIrSensitivySpinner.setValue("1000"); - } else if (valueInt < 0) { - setIrSensitivySpinner.setValue("0"); - } - } - }// GEN-LAST:event_setIrSensitivySpinnerStateChanged - - private void setIrSensitivyButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_setIrSensitivyButtonMousePressed - String value = setIrSensitivySpinner.getValue().toString(); - boolean isInt = true; - int valueInt = 0; - try { - valueInt = Integer.parseInt(value); - } catch (NumberFormatException e) { - isInt = false; - messageText - .setText("Wrong value for IR sensitivity. It must be an int !"); - } - if (isInt) { - if (valueInt >= 1 && valueInt <= 5) { - wiimote.setIrSensitivity(valueInt); - messageText.setText("IR senstivity set to: " + valueInt + "."); - } else { - messageText - .setText("Wrong value for IR senstivity. It muset be between 1 and 5 !"); - } - } - }// GEN-LAST:event_setIrSensitivyButtonMousePressed - - private void setTimeoutButtonMousePressed(java.awt.event.MouseEvent evt) {// GEN-FIRST:event_setTimeoutButtonMousePressed - // get normal timeout - String value = normalTimeoutSpinner.getValue().toString(); - boolean isInt = true; - short valueInt = 0; - try { - valueInt = Short.parseShort(value); - } catch (NumberFormatException e) { - isInt = false; - messageText - .setText("Wrong value for normal timeout. It must be an int !"); - } - // get expansion handshake timeout - String value2 = expansionHandshakeTimeoutSpinner.getValue().toString(); - boolean isInt2 = true; - short valueInt2 = 0; - try { - valueInt2 = Short.parseShort(value2); - } catch (NumberFormatException e) { - isInt2 = false; - messageText - .setText("Wrong value for expansion handshake timeout. It must be an int !"); - } - if (isInt && isInt2) { - if (valueInt > 0 && valueInt2 > 0) { - wiimote.setTimeout(valueInt, valueInt2); - messageText.setText("Normal timeout set to: " + valueInt - + " and expansion handshake timeout set to: " - + valueInt2 + "!"); - } else { - messageText - .setText("Wrong value for one of the timeout value. It must be an integer > 0 !"); - } - } - }// GEN-LAST:event_setTimeoutButtonMousePressed - - private void reconnectWiimotesButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_reconnectWiimotesButtonMousePressed - // stop manager - WiiUseApiManager.shutdown(); - - // unregister previous wiimote - if (wiimote != null) { - onDisconnectionEvent(null); - } - - // Reset Gui - // remove frame for expansion - if (expansionFrame != null) { - if (expansionFrame instanceof NunchukGuiTest) { - ((NunchukGuiTest) expansionFrame).unRegisterListeners(); - }else if (expansionFrame instanceof ClassicControllerGuiTest) { - ((ClassicControllerGuiTest) expansionFrame).unRegisterListeners(); - } - expansionFrame.setEnabled(false); - expansionFrame.dispose(); - expansionFrame = null; - } - - // setup buttons In first state - toggleRumbleButton.setText("Activate Rumble"); - toggleRumbleButton.setEnabled(true); - toggleMotionSensingTrackingButton - .setText("Activate motion sensing Tracking"); - toggleMotionSensingTrackingButton.setEnabled(true); - toggleIRTrackingButton.setText("Activate IR Tracking"); - toggleIRTrackingButton.setEnabled(true); - toggleContinuousButton.setText("Activate Continuous"); - toggleContinuousButton.setEnabled(true); - toggleScreenAspectRatioButton.setText("Set screen aspect ratio 4/3"); - toggleScreenAspectRatioButton.setEnabled(true); - toggleSensorBarPositionButton.setText("Set sensor bar above"); - toggleSensorBarPositionButton.setEnabled(true); - toggleSmoothingButton.setText("Activate Smoothing"); - toggleSmoothingButton.setEnabled(true); - mouseIRControlButton.setText("Start infrared mouse control"); - mouseIRControlButton.setEnabled(true); - - // get wiimote - Wiimote[] listWiimote = WiiUseApiManager.getWiimotes(1, true); - if (listWiimote != null && listWiimote.length > 0) { - wiimote = listWiimote[0]; - - // registers listeners - registerListeners(); - initWiimote(); - - isFirstStatusGot = false; - getStatusButtonMousePressed(null); - } - }// GEN-LAST:event_reconnectWiimotesButtonMousePressed - - private void showExpansionWiimoteButtonMousePressed( - java.awt.event.MouseEvent evt) {// GEN-FIRST:event_showExpansionWiimoteButtonMousePressed - if (expansionFrame != null) { - if (showExpansionWiimoteButton.isEnabled()) {// expansion frame - // not shown - // show it - expansionFrame.setEnabled(true); - expansionFrame.setVisible(true); - showExpansionWiimoteButton.setEnabled(false); - if (expansionFrame instanceof NunchukGuiTest){ - showExpansionWiimoteButton.setText("Hide Nunchuk"); - messageText.setText("Nunchuk displayed !"); - }else if(expansionFrame instanceof GuitarHero3GuiTest){ - showExpansionWiimoteButton.setText("Hide Guitar"); - messageText.setText("Guitar displayed !"); - }else if(expansionFrame instanceof ClassicControllerGuiTest){ - showExpansionWiimoteButton.setText("Hide Classic controller"); - messageText.setText("Classic controller displayed !"); - } - } else {// already being shown - expansionFrame.setEnabled(false); - expansionFrame.setVisible(false); - showExpansionWiimoteButton.setEnabled(true); - if (expansionFrame instanceof NunchukGuiTest){ - showExpansionWiimoteButton.setText("Show Nunchuk"); - messageText.setText("Nunchuk hidden !"); - }else if(expansionFrame instanceof GuitarHero3GuiTest){ - showExpansionWiimoteButton.setText("Show Guitar"); - messageText.setText("Guitar hidden !"); - }else if(expansionFrame instanceof ClassicControllerGuiTest){ - showExpansionWiimoteButton.setText("Show Classic controller"); - messageText.setText("Classic controller hidden !"); - } - } - } - }// GEN-LAST:event_showExpansionWiimoteButtonMousePressed - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel accelerationPanel; - private javax.swing.JButton accelerationThresholdButton; - private javax.swing.JTextField accelerationThresholdTextField; - private javax.swing.JPanel activateMotionSensingPanel; - private javax.swing.JPanel activateRumbleIRPanel; - private javax.swing.JPanel activateSmoothingContinuousPanel; - private javax.swing.JButton alphaSmoothingButton; - private javax.swing.JTextField alphaSmoothingTextField; - private javax.swing.JLabel batteryLevelText; - private javax.swing.JLabel batteryText; - private javax.swing.JPanel buttonsPanel; - private javax.swing.JPanel controlsPanel; - private javax.swing.JPanel exPansionPanel; - private javax.swing.JPanel expansionButtonPanel; - private javax.swing.JSpinner expansionHandshakeTimeoutSpinner; - private javax.swing.JLabel expansionHandshakeTimeoutText; - private javax.swing.JLabel expansionText; - private javax.swing.JPanel fixedWiimotePanel; - private javax.swing.JPanel gForcePanel; - private javax.swing.JButton getStatusButton; - private javax.swing.JPanel getStatusPanel; - private javax.swing.JPanel irViewPanel; - private javax.swing.JTabbedPane jTabbedPane1; - private javax.swing.JButton led1Button; - private javax.swing.JButton led2Button; - private javax.swing.JButton led3Button; - private javax.swing.JButton led4Button; - private javax.swing.JPanel leftPanel; - private javax.swing.JLabel messageLabelText; - private javax.swing.JLabel messageText; - private javax.swing.JPanel messagesPanel; - private javax.swing.JPanel motionSensingPanel; - private javax.swing.JButton mouseIRControlButton; - private javax.swing.JSpinner normalTimeoutSpinner; - private javax.swing.JLabel normalTimeoutText; - private javax.swing.JButton orientationThresholdButton; - private javax.swing.JTextField orientationThresholdTextField; - private javax.swing.JButton reconnectWiimotesButton; - private javax.swing.JPanel rightPanel; - private javax.swing.JPanel setAccelerationThresholdPanel; - private javax.swing.JPanel setAlphaSmoothingPanel; - private javax.swing.JPanel setIRConfPanel; - private javax.swing.JButton setIrSensitivyButton; - private javax.swing.JPanel setIrSensitivyPanel; - private javax.swing.JSpinner setIrSensitivySpinner; - private javax.swing.JButton setLedsButton; - private javax.swing.JPanel setLedsPanel; - private javax.swing.JPanel setOrientationThresholdPanel; - private javax.swing.JButton setTimeoutButton; - private javax.swing.JPanel setTimeoutPanel; - private javax.swing.JButton setVirtualResolutionButton; - private javax.swing.JPanel setVirtualResolutionPanel; - private javax.swing.JButton showExpansionWiimoteButton; - private javax.swing.JPanel startMouseControlPanel; - private javax.swing.JButton toggleContinuousButton; - private javax.swing.JButton toggleIRTrackingButton; - private javax.swing.JButton toggleMotionSensingTrackingButton; - private javax.swing.JButton toggleRumbleButton; - private javax.swing.JButton toggleScreenAspectRatioButton; - private javax.swing.JButton toggleSensorBarPositionButton; - private javax.swing.JButton toggleSmoothingButton; - private javax.swing.JLabel xLabel; - private javax.swing.JTextField xResolutionTextField; - private javax.swing.JLabel yLabel; - private javax.swing.JTextField yResolutionTextField; - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/AccelerationExpansionEventPanel.java b/java/src/wiiusej/utils/AccelerationExpansionEventPanel.java deleted file mode 100644 index cb3021f..0000000 --- a/java/src/wiiusej/utils/AccelerationExpansionEventPanel.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.values.RawAcceleration; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukEvent; - -/** - * Panel to display Acceleration in a MotionSensingEvent from an expansion. - * - * @author guiguito - */ -public class AccelerationExpansionEventPanel extends AccelerationPanel { - - @Override - public RawAcceleration getRawAccelerationValue(GenericEvent e) { - if (e instanceof NunchukEvent) { - return ((NunchukEvent) e).getNunchukMotionSensingEvent() - .getRawAcceleration(); - } - return null; - } - -} diff --git a/java/src/wiiusej/utils/AccelerationPanel.java b/java/src/wiiusej/utils/AccelerationPanel.java deleted file mode 100644 index 15f1551..0000000 --- a/java/src/wiiusej/utils/AccelerationPanel.java +++ /dev/null @@ -1,303 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.util.ArrayList; - -import wiiusej.values.RawAcceleration; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to watch raw acceleration values from a - * MotionSensingEvent. - * - * @author guiguito - */ -public abstract class AccelerationPanel extends javax.swing.JPanel implements - WiimoteListener { - - private Image mImage;// image for double buffering - private Color xColor = Color.RED; - private Color yColor = Color.GREEN; - private Color zColor = Color.BLUE; - private Color backgroundColor = Color.WHITE; - private Color lineColor = Color.BLACK; - private ArrayList values = new ArrayList(); - - /** Creates new form AccelerationPanel */ - public AccelerationPanel() { - initComponents(); - } - - /** - * Constructor used to choose the colors used by the AccelerationPanel. - * - * @param bgColor - * background color. - * @param xColor - * x color. - * @param yColor - * y color. - * @param zColor - * z color. - * @param lColor - * line color. - */ - public AccelerationPanel(Color bgColor, Color xColor, Color yColor, - Color zColor, Color lColor) { - backgroundColor = bgColor; - this.xColor = xColor; - this.yColor = yColor; - this.zColor = zColor; - lineColor = lColor; - initComponents(); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - // draw medium line - int yLine = getHeight() - 25; - - g2.setPaint(lineColor); - g2.drawLine(0, yLine, getWidth(), yLine); - - RawAcceleration[] valuesArray = values.toArray(new RawAcceleration[0]); - - double unit = yLine / 255.0; - int previousX = 0; - int previousY = 0; - int previousZ = 0; - // draw curves - for (int i = 0; i < valuesArray.length && i < getWidth(); i++) { - RawAcceleration acceleration = valuesArray[i]; - // draw X - g2.setPaint(xColor); - int yDelta = (int) Math.round(unit * acceleration.getX()); - int y = -1 * yDelta + yLine; - g2.drawLine(i - 1, previousX, i, y); - g2.setTransform(new AffineTransform()); - previousX = y; - // draw Y - g2.setPaint(yColor); - yDelta = (int) Math.round(unit * acceleration.getY()); - y = -1 * yDelta + yLine; - g2.drawLine(i - 1, previousY, i, y); - g2.setTransform(new AffineTransform()); - previousY = y; - // draw Z - g2.setPaint(zColor); - yDelta = (int) Math.round(unit * acceleration.getZ()); - y = -1 * yDelta + yLine; - g2.drawLine(i - 1, previousZ, i, y); - g2.setTransform(new AffineTransform()); - previousZ = y; - } - - // draw legend - g2.setPaint(xColor); - g2.drawLine(5, getHeight() - 10, 25, getHeight() - 10); - g2.setPaint(yColor); - g2.drawLine(60, getHeight() - 10, 80, getHeight() - 10); - g2.setPaint(zColor); - g2.drawLine(120, getHeight() - 10, 140, getHeight() - 10); - - g2.setPaint(lineColor); - g2.drawString("X", 30, getHeight() - 5); - g2.drawString("Y", 85, getHeight() - 5); - g2.drawString("Z", 145, getHeight() - 5); - g2.drawString("0", 2, yLine - 5); - g2.drawString("255", 2, 15); - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width - || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing - } - - public void onIrEvent(IREvent arg0) { - // nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - draw(arg0); - } - - public void onExpansionEvent(ExpansionEvent arg0) { - draw(arg0); - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // Clear points. - values.clear(); - repaint(); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - private void draw(GenericEvent arg0) { - if (values.size() >= getWidth()) { - // if there are as many values as pixels in the width - // clear points - values.clear(); - } - RawAcceleration rawAcceleration = getRawAccelerationValue(arg0); - if (rawAcceleration != null) - values.add(rawAcceleration); - repaint(); - } - - public abstract RawAcceleration getRawAccelerationValue(GenericEvent e); - - public Color getBackgroundColor() { - return backgroundColor; - } - - public Color getLineColor() { - return lineColor; - } - - public Color getXColor() { - return xColor; - } - - public Color getYColor() { - return yColor; - } - - public Color getZColor() { - return zColor; - } - - public void setBackgroundColor(Color backgroundColor) { - this.backgroundColor = backgroundColor; - } - - public void setLineColor(Color lineColor) { - this.lineColor = lineColor; - } - - public void setXColor(Color xColor) { - this.xColor = xColor; - } - - public void setYColor(Color yColor) { - this.yColor = yColor; - } - - public void setZColor(Color zColor) { - this.zColor = zColor; - } - - public void clearView() { - values.clear(); - repaint(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, - Short.MAX_VALUE)); - layout.setVerticalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, - Short.MAX_VALUE)); - }// //GEN-END:initComponents - - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/AccelerationWiimoteEventPanel.java b/java/src/wiiusej/utils/AccelerationWiimoteEventPanel.java deleted file mode 100644 index 4e716de..0000000 --- a/java/src/wiiusej/utils/AccelerationWiimoteEventPanel.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.values.RawAcceleration; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; - -/** - * Panel to display Acceleration in a MotionSensingEvent from a wiimote. - * @author guiguito - */ -public class AccelerationWiimoteEventPanel extends AccelerationPanel { - - @Override - public RawAcceleration getRawAccelerationValue(GenericEvent e) { - if (e instanceof MotionSensingEvent) { - return ((MotionSensingEvent) e).getRawAcceleration(); - } - return null; - } - -} diff --git a/java/src/wiiusej/utils/ButtonsEventPanel.java b/java/src/wiiusej/utils/ButtonsEventPanel.java deleted file mode 100644 index 97f9b19..0000000 --- a/java/src/wiiusej/utils/ButtonsEventPanel.java +++ /dev/null @@ -1,382 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Toolkit; -import java.awt.geom.AffineTransform; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to see what buttons are pressed on the wiimote. It - * displays the result of last ButtonsEvent. - * - * @author guiguito - */ -public class ButtonsEventPanel extends javax.swing.JPanel implements - WiimoteListener { - - private Image mImage;// image for double buffering - private Image wiimoteImage;// image for double buffering - private WiimoteButtonsEvent buttons; - private Color pressedColor = Color.RED; - private Color heldColor = Color.ORANGE; - private Color releasedColor = Color.YELLOW; - private Shape shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - - /** - * Default constructor. Red : button just pressed. Orange : button held. - * Yellow : button just released. - */ - public ButtonsEventPanel() { - Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); - java.net.URL url = ButtonsEventPanel.class - .getResource("/img/wiimote.png"); - wiimoteImage = toolkit.createImage(url); - initComponents(); - } - - /** - * Constructor used to set colors and shape used. - * - * @param pressColor - * color of a button just pressed. - * @param hColor - * color of a button held. - * @param relColor - * color of a button just released. - * @param sh - * shape draw on the buttons. - */ - public ButtonsEventPanel(Color pressColor, Color hColor, Color relColor, - Shape sh) { - pressedColor = pressColor; - heldColor = hColor; - releasedColor = relColor; - shape = sh; - Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); - wiimoteImage = toolkit.createImage("img\\wiimote.png"); - initComponents(); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - // offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - // draw buttons pushed - g2.drawImage(wiimoteImage, 0, 0, this); - g2.setTransform(new AffineTransform()); - - if (buttons != null) { - /* button ONE */ - if (buttons.isButtonOneJustPressed()) { - drawFunction(g2, pressedColor, 53, 353); - } - if (buttons.isButtonOneHeld()) { - drawFunction(g2, heldColor, 53, 353); - } - if (buttons.isButtonOneJustReleased()) { - drawFunction(g2, releasedColor, 53, 353); - } - - /* button TWO */ - if (buttons.isButtonTwoJustPressed()) { - drawFunction(g2, pressedColor, 53, 395); - } - if (buttons.isButtonTwoHeld()) { - drawFunction(g2, heldColor, 53, 395); - } - if (buttons.isButtonTwoJustReleased()) { - drawFunction(g2, releasedColor, 53, 395); - } - - /* button A */ - if (buttons.isButtonAJustPressed()) { - drawFunction(g2, pressedColor, 53, 150); - } - if (buttons.isButtonAHeld()) { - drawFunction(g2, heldColor, 53, 150); - } - if (buttons.isButtonAJustReleased()) { - drawFunction(g2, releasedColor, 53, 150); - } - - /* button B */ - if (buttons.isButtonBJustPressed()) { - drawFunction(g2, pressedColor, 16, 149); - } - if (buttons.isButtonBHeld()) { - drawFunction(g2, heldColor, 16, 149); - } - if (buttons.isButtonBJustReleased()) { - drawFunction(g2, releasedColor, 16, 149); - } - - /* button LEFT */ - if (buttons.isButtonLeftJustPressed()) { - drawFunction(g2, pressedColor, 33, 77); - } - if (buttons.isButtonLeftHeld()) { - drawFunction(g2, heldColor, 33, 77); - } - if (buttons.isButtonLeftJustReleased()) { - drawFunction(g2, releasedColor, 33, 77); - } - - /* button RIGHT */ - if (buttons.isButtonRightJustPressed()) { - drawFunction(g2, pressedColor, 73, 77); - } - if (buttons.isButtonRightHeld()) { - drawFunction(g2, heldColor, 73, 77); - } - if (buttons.isButtonRightJustReleased()) { - drawFunction(g2, releasedColor, 73, 77); - } - - /* button UP */ - if (buttons.isButtonUpJustPressed()) { - drawFunction(g2, pressedColor, 54, 60); - } - if (buttons.isButtonUpHeld()) { - drawFunction(g2, heldColor, 54, 60); - } - if (buttons.isButtonUpJustReleased()) { - drawFunction(g2, releasedColor, 54, 60); - } - - /* button DOWN */ - if (buttons.isButtonDownJustPressed()) { - drawFunction(g2, pressedColor, 54, 97); - } - if (buttons.isButtonDownHeld()) { - drawFunction(g2, heldColor, 54, 97); - } - if (buttons.isButtonDownJustReleased()) { - drawFunction(g2, releasedColor, 54, 97); - } - - /* button MINUS */ - if (buttons.isButtonMinusJustPressed()) { - drawFunction(g2, pressedColor, 20, 230); - } - if (buttons.isButtonMinusHeld()) { - drawFunction(g2, heldColor, 20, 230); - } - if (buttons.isButtonMinusJustReleased()) { - drawFunction(g2, releasedColor, 20, 230); - } - - /* button PLUS */ - if (buttons.isButtonPlusJustPressed()) { - drawFunction(g2, pressedColor, 86, 230); - } - if (buttons.isButtonPlusHeld()) { - drawFunction(g2, heldColor, 86, 230); - } - if (buttons.isButtonPlusJustReleased()) { - drawFunction(g2, releasedColor, 86, 230); - } - - /* button HOME */ - if (buttons.isButtonHomeJustPressed()) { - drawFunction(g2, pressedColor, 53, 230); - } - if (buttons.isButtonHomeHeld()) { - drawFunction(g2, heldColor, 53, 230); - } - if (buttons.isButtonHomeJustReleased()) { - drawFunction(g2, releasedColor, 53, 230); - } - - buttons = null; - } - - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * Function used to factorize code. - * - * @param g2 - * where to draw a shape. - * @param col - * color to use. - * @param x - * x coordinates. - * @param y - * y coordinates. - */ - private void drawFunction(Graphics2D g2, Color col, int x, int y) { - g2.setPaint(col); - g2.translate(x, y); - g2.draw(shape); - g2.fill(shape); - g2.setTransform(new AffineTransform()); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width - || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - setSize(wiimoteImage.getWidth(this), wiimoteImage.getHeight(this)); - buttons = arg0; - repaint(); - } - - public void onIrEvent(IREvent arg0) { - // nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - // nothing - } - - public void onExpansionEvent(ExpansionEvent e) { - // nothing - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - clearView(); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent e) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent e) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - public Color getHeldColor() { - return heldColor; - } - - public Color getPressedColor() { - return pressedColor; - } - - public Color getReleasedColor() { - return releasedColor; - } - - public Shape getShape() { - return shape; - } - - public void setHeldColor(Color heldColor) { - this.heldColor = heldColor; - } - - public void setPressedColor(Color pressedColor) { - this.pressedColor = pressedColor; - } - - public void setReleasedColor(Color releasedColor) { - this.releasedColor = releasedColor; - } - - public void setShape(Shape shape) { - this.shape = shape; - } - - public void clearView() { - buttons = null; - repaint(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, - Short.MAX_VALUE)); - layout.setVerticalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, - Short.MAX_VALUE)); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/ClassicControllerButtonsEventPanel.java b/java/src/wiiusej/utils/ClassicControllerButtonsEventPanel.java deleted file mode 100644 index 9bec5a9..0000000 --- a/java/src/wiiusej/utils/ClassicControllerButtonsEventPanel.java +++ /dev/null @@ -1,500 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Toolkit; -import java.awt.geom.AffineTransform; -import wiiusej.wiiusejevents.physicalevents.ClassicControllerButtonsEvent; -import wiiusej.wiiusejevents.physicalevents.ClassicControllerEvent; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.JoystickEvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to display what happens on the classic controller. - * - * @author guiguito - */ -public class ClassicControllerButtonsEventPanel extends javax.swing.JPanel implements WiimoteListener { - - private Image mImage;// image for double buffering - private Image wiimoteImage;// image for double buffering - private ClassicControllerEvent event; - private Color pressedColor = Color.RED; - private Color heldColor = Color.ORANGE; - private Color releasedColor = Color.YELLOW; - private Color joystickColor = Color.PINK; - private Color shoulderColor = Color.BLUE; - private Shape shapeJoystick = new java.awt.geom.Ellipse2D.Double(0, 0, 15, 15); - private Shape shapeButton = new java.awt.geom.Ellipse2D.Double(0, 0, 20, 20); - private static int xAmplitude = 20; - private static int yAmplitude = 20; - - /** - * Default constructor. Red : button just pressed. Orange : button held. - * Yellow : button just released. - */ - public ClassicControllerButtonsEventPanel() { - Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); - java.net.URL url = ButtonsEventPanel.class.getResource("/img/classiccontroller.png"); - wiimoteImage = toolkit.createImage(url); - initComponents(); - } - - /** - * Constructor used to set colors and shape used. - * - * @param pressColor - * color of a button just pressed. - * @param hColor - * color of a button held. - * @param relColor - * color of a button just released. - * @param jsColor - * color of the joysticks. - * @param shouldColor - * color of the shoulders. - * @param js - * shape drawn on the joysticks. - * @param sh - * shape drawn on the buttons. - */ - public ClassicControllerButtonsEventPanel(Color pressColor, Color hColor, Color relColor, - Color jsColor, Color shouldColor, Shape js, Shape sh) { - pressedColor = pressColor; - heldColor = hColor; - releasedColor = relColor; - shapeButton = sh; - shapeJoystick = js; - joystickColor = jsColor; - shoulderColor = shouldColor; - Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); - wiimoteImage = toolkit.createImage("img\\wiimote.png"); - initComponents(); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 400, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 300, Short.MAX_VALUE) - ); - }// //GEN-END:initComponents - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - // offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - //draw classic controller - g2.drawImage(wiimoteImage, 0, 0, this); - g2.setTransform(new AffineTransform()); - - if (event != null) { - // draw buttons pushed - ClassicControllerButtonsEvent buttons = event.getButtonsEvent(); - - /* button A */ - if (buttons.isButtonAJustPressed()) { - drawFunction(g2, pressedColor, 304, 76, shapeButton); - } - if (buttons.isButtonAHeld()) { - drawFunction(g2, heldColor, 304, 76, shapeButton); - } - if (buttons.isButtonAJustReleased()) { - drawFunction(g2, releasedColor, 304, 76, shapeButton); - } - - /* button B */ - if (buttons.isButtonBJustPressed()) { - drawFunction(g2, pressedColor, 269, 98, shapeButton); - } - if (buttons.isButtonBHeld()) { - drawFunction(g2, heldColor, 269, 98, shapeButton); - } - if (buttons.isButtonBJustReleased()) { - drawFunction(g2, releasedColor, 269, 98, shapeButton); - } - - /* button Down */ - if (buttons.isButtonDownJustPressed()) { - drawFunction(g2, pressedColor, 60, 97, shapeButton); - } - if (buttons.isButtonDownHeld()) { - drawFunction(g2, heldColor, 60, 97, shapeButton); - } - if (buttons.isButtonDownJustReleased()) { - drawFunction(g2, releasedColor, 60, 97, shapeButton); - } - - /* button FullLeft */ - if (buttons.isButtonFullLeftJustPressed()) { - drawFunction(g2, pressedColor, 55, 4, shapeButton); - } - if (buttons.isButtonFullLeftHeld()) { - drawFunction(g2, heldColor, 55, 4, shapeButton); - } - if (buttons.isButtonFullLeftJustReleased()) { - drawFunction(g2, releasedColor, 55, 4, shapeButton); - } - - /* button FullRight */ - if (buttons.isButtonFullRightJustPressed()) { - drawFunction(g2, pressedColor, 276, 4, shapeButton); - } - if (buttons.isButtonFullRightHeld()) { - drawFunction(g2, heldColor, 276, 4, shapeButton); - } - if (buttons.isButtonFullRightJustReleased()) { - drawFunction(g2, releasedColor, 276, 4, shapeButton); - } - - /* button Home */ - if (buttons.isButtonHomeJustPressed()) { - drawFunction(g2, pressedColor, 166, 76, shapeButton); - } - if (buttons.isButtonHomeHeld()) { - drawFunction(g2, heldColor, 166, 76, shapeButton); - } - if (buttons.isButtonHomeJustReleased()) { - drawFunction(g2, releasedColor, 166, 76, shapeButton); - } - - /* button Left */ - if (buttons.isButtonLeftJustPressed()) { - drawFunction(g2, pressedColor, 34, 75, shapeButton); - } - if (buttons.isButtonLeftHeld()) { - drawFunction(g2, heldColor, 34, 75, shapeButton); - } - if (buttons.isButtonLeftJustReleased()) { - drawFunction(g2, releasedColor, 34, 75, shapeButton); - } - - /* button Minus */ - if (buttons.isButtonMinusJustPressed()) { - drawFunction(g2, pressedColor, 140, 76, shapeButton); - } - if (buttons.isButtonMinusHeld()) { - drawFunction(g2, heldColor, 140, 76, shapeButton); - } - if (buttons.isButtonMinusJustReleased()) { - drawFunction(g2, releasedColor, 140, 76, shapeButton); - } - - /* button Plus */ - if (buttons.isButtonPlusJustPressed()) { - drawFunction(g2, pressedColor, 191, 76, shapeButton); - } - if (buttons.isButtonPlusHeld()) { - drawFunction(g2, heldColor, 191, 76, shapeButton); - } - if (buttons.isButtonPlusJustReleased()) { - drawFunction(g2, releasedColor, 191, 76, shapeButton); - } - - /* button Right */ - if (buttons.isButtonRightJustPressed()) { - drawFunction(g2, pressedColor, 86, 75, shapeButton); - } - if (buttons.isButtonRightHeld()) { - drawFunction(g2, heldColor, 86, 75, shapeButton); - } - if (buttons.isButtonRightJustReleased()) { - drawFunction(g2, releasedColor, 86, 353, shapeButton); - } - - /* button Up */ - if (buttons.isButtonUpJustPressed()) { - drawFunction(g2, pressedColor, 60, 50, shapeButton); - } - if (buttons.isButtonUpHeld()) { - drawFunction(g2, heldColor, 60, 50, shapeButton); - } - if (buttons.isButtonUpJustReleased()) { - drawFunction(g2, releasedColor, 60, 50, shapeButton); - } - - /* button X */ - if (buttons.isButtonXJustPressed()) { - drawFunction(g2, pressedColor, 271, 53, shapeButton); - } - if (buttons.isButtonXHeld()) { - drawFunction(g2, heldColor, 271, 53, shapeButton); - } - if (buttons.isButtonXJustReleased()) { - drawFunction(g2, releasedColor, 271, 53, shapeButton); - } - - /* button Y */ - if (buttons.isButtonYJustPressed()) { - drawFunction(g2, pressedColor, 237, 76, shapeButton); - } - if (buttons.isButtonYHeld()) { - drawFunction(g2, heldColor, 237, 76, shapeButton); - } - if (buttons.isButtonYJustReleased()) { - drawFunction(g2, releasedColor, 237, 76, shapeButton); - } - - /* button ZL */ - if (buttons.isButtonZLJustPressed()) { - drawFunction(g2, pressedColor, 123, 4, shapeButton); - } - if (buttons.isButtonZLHeld()) { - drawFunction(g2, heldColor, 123, 4, shapeButton); - } - if (buttons.isButtonZLJustReleased()) { - drawFunction(g2, releasedColor, 123, 4, shapeButton); - } - - /* button ZR */ - if (buttons.isButtonZRJustPressed()) { - drawFunction(g2, pressedColor, 208, 4, shapeButton); - } - if (buttons.isButtonZRHeld()) { - drawFunction(g2, heldColor, 208, 4, shapeButton); - } - if (buttons.isButtonZRJustReleased()) { - drawFunction(g2, releasedColor, 208, 4, shapeButton); - } - - //joysticks - int halfWidth = (int) Math.round(shapeJoystick.getBounds().getWidth() / 2); - int halfHeight = (int) Math.round(shapeJoystick.getBounds().getHeight() / 2); - - // left joystick - JoystickEvent jl = event.getClassicControllerLeftJoystickEvent(); - int xCenter1 = 121; - int yCenter1 = 125; - - double xAng1 = Math.sin(jl.getAngle() * Math.PI / 180.0) * jl.getMagnitude(); - double yAng1 = Math.cos(jl.getAngle() * Math.PI / 180.0) * jl.getMagnitude(); - - int xShift1 = (int) Math.round(xAng1 * xAmplitude); - int yShift1 = (int) Math.round(yAng1 * yAmplitude); - int x1 = xCenter1 + xShift1 - halfWidth; - int y1 = yCenter1 - yShift1 - halfHeight; - // draw shape - drawFunction(g2, joystickColor, x1, y1, shapeJoystick); - - //Right joystick - JoystickEvent jr = event.getClassicControllerRightJoystickEvent(); - int xCenter2 = 213; - int yCenter2 = 125; - - double xAng2 = Math.sin(jr.getAngle() * Math.PI / 180.0) * jr.getMagnitude(); - double yAng2 = Math.cos(jr.getAngle() * Math.PI / 180.0) * jr.getMagnitude(); - - int xShift2 = (int) Math.round(xAng2 * xAmplitude); - int yShift2 = (int) Math.round(yAng2 * yAmplitude); - int x2 = xCenter2 + xShift2 - halfWidth; - int y2 = yCenter2 - yShift2 - halfHeight; - // draw shape - drawFunction(g2, joystickColor, x2, y2, shapeJoystick); - - event = null; - } - - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * Function used to factorize code. - * - * @param g2 - * where to draw a shape. - * @param col - * color to use. - * @param x - * x coordinates. - * @param y - * y coordinates. - * @param sh - * shape to draw. - */ - private void drawFunction(Graphics2D g2, Color col, int x, int y, Shape sh) { - g2.setPaint(col); - g2.translate(x, y); - g2.draw(sh); - g2.fill(sh); - g2.setTransform(new AffineTransform()); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - //do nothing - } - - public void onIrEvent(IREvent arg0) { - //do nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - //do nothing - } - - public void onExpansionEvent(ExpansionEvent arg0) { - if (arg0 instanceof ClassicControllerEvent) { - event = (ClassicControllerEvent) arg0; - } - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //do nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //do nothing - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - //do nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - //do nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - //do nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - //do nothing - } - - public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { - //do nothing - } - - public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { - clearView(); - } - - public Color getHeldColor() { - return heldColor; - } - - public Color getJoystickColor() { - return joystickColor; - } - - public Color getPressedColor() { - return pressedColor; - } - - public Color getReleasedColor() { - return releasedColor; - } - - public Color getShoulderColor() { - return shoulderColor; - } - - public Shape getShapeButton() { - return shapeButton; - } - - public Shape getShapeJoystick() { - return shapeJoystick; - } - - public void setHeldColor(Color heldColor) { - this.heldColor = heldColor; - } - - public void setJoystickColor(Color joystickColor) { - this.joystickColor = joystickColor; - } - - public void setPressedColor(Color pressedColor) { - this.pressedColor = pressedColor; - } - - public void setReleasedColor(Color releasedColor) { - this.releasedColor = releasedColor; - } - - public void setShoulderColor(Color shoulderColor) { - this.shoulderColor = shoulderColor; - } - - public void setShapeButton(Shape shapeButton) { - this.shapeButton = shapeButton; - } - - public void setShapeJoystick(Shape shapeJoystick) { - this.shapeJoystick = shapeJoystick; - } - - public void clearView() { - event = null; - repaint(); - } - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/GForceExpansionEventPanel.java b/java/src/wiiusej/utils/GForceExpansionEventPanel.java deleted file mode 100644 index d5852b0..0000000 --- a/java/src/wiiusej/utils/GForceExpansionEventPanel.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.values.GForce; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukEvent; - -/** - * Panel to display GForce in a MotionSensingEvent from an expansion. - * - * @author guiguito - */ -public class GForceExpansionEventPanel extends GForcePanel{ - - @Override - public GForce getGForceValue(GenericEvent e) { - if (e instanceof NunchukEvent){ - return ((NunchukEvent)e).getNunchukMotionSensingEvent().getGforce(); - } - return null; - } - -} diff --git a/java/src/wiiusej/utils/GForcePanel.java b/java/src/wiiusej/utils/GForcePanel.java deleted file mode 100644 index dc57b30..0000000 --- a/java/src/wiiusej/utils/GForcePanel.java +++ /dev/null @@ -1,304 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.util.ArrayList; - -import wiiusej.values.GForce; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to watch gravity force values from a MotionSensingEvent. - * - * @author guiguito - */ -public abstract class GForcePanel extends javax.swing.JPanel implements - WiimoteListener { - - private Image mImage;// image for double buffering - private Color xColor = Color.RED; - private Color yColor = Color.GREEN; - private Color zColor = Color.BLUE; - private Color backgroundColor = Color.WHITE; - private Color lineColor = Color.BLACK; - private ArrayList values = new ArrayList(); - - /** - * Default constructor of the AccelerationPanel. - */ - public GForcePanel() { - initComponents(); - } - - /** - * Constructor used to choose the colors used by the AccelerationPanel. - * - * @param bgColor - * background color. - * @param xxColor - * color of the acceleration on X axis. - * @param yyColor - * color of the acceleration on Y axis. - * @param zzColor - * color of the acceleration on Z axis. - * @param lColor - * line color. - */ - public GForcePanel(Color bgColor, Color xxColor, Color yyColor, - Color zzColor, Color lColor) { - backgroundColor = bgColor; - xColor = xxColor; - yColor = yyColor; - zColor = zzColor; - lineColor = lColor; - initComponents(); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - // draw medium line - double yMiddleFloat = getHeight() / 2.0; - int yMiddle = (int) Math.round(yMiddleFloat); - - g2.setPaint(lineColor); - g2.drawLine(0, yMiddle, getWidth(), yMiddle); - - GForce[] valuesArray = values.toArray(new GForce[0]); - double unit = yMiddleFloat / 5.0; - int previousX = 0; - int previousY = 0; - int previousZ = 0; - // draw curves - for (int i = 0; i < valuesArray.length && i < getWidth(); i++) { - GForce gforce = valuesArray[i]; - // draw X - g2.setPaint(xColor); - int yDelta = (int) Math.round(unit * gforce.getX()); - int y = -1 * yDelta + yMiddle; - g2.drawLine(i - 1, previousX, i, y); - g2.setTransform(new AffineTransform()); - previousX = y; - // draw Y - g2.setPaint(yColor); - yDelta = (int) Math.round(unit * gforce.getY()); - y = -1 * yDelta + yMiddle; - g2.drawLine(i - 1, previousY, i, y); - g2.setTransform(new AffineTransform()); - previousY = y; - // draw Z - g2.setPaint(zColor); - yDelta = (int) Math.round(unit * gforce.getZ()); - y = -1 * yDelta + yMiddle; - g2.drawLine(i - 1, previousZ, i, y); - g2.setTransform(new AffineTransform()); - previousZ = y; - } - - // draw legend - g2.setPaint(xColor); - g2.drawLine(5, getHeight() - 10, 25, getHeight() - 10); - g2.setPaint(yColor); - g2.drawLine(60, getHeight() - 10, 80, getHeight() - 10); - g2.setPaint(zColor); - g2.drawLine(120, getHeight() - 10, 140, getHeight() - 10); - - g2.setPaint(lineColor); - g2.drawString("X", 30, getHeight() - 5); - g2.drawString("Y", 85, getHeight() - 5); - g2.drawString("Z", 145, getHeight() - 5); - g2.drawString("0", 2, yMiddle - 5); - g2.drawString("5", 2, 10); - g2.drawString("-5", 2, getHeight() - 15); - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width - || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing - } - - public void onIrEvent(IREvent arg0) { - // nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - draw(arg0); - } - - public void onExpansionEvent(ExpansionEvent arg0) { - draw(arg0); - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // Clear points. - values.clear(); - repaint(); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - private void draw(GenericEvent arg0) { - if (values.size() >= getWidth()) { - // if there are as many values as pixels in the width - // clear points - values.clear(); - } - GForce gforce = getGForceValue(arg0); - if (gforce != null) - values.add(gforce); - repaint(); - } - - public abstract GForce getGForceValue(GenericEvent e); - - public Color getBackgroundColor() { - return backgroundColor; - } - - public Color getLineColor() { - return lineColor; - } - - public Color getXColor() { - return xColor; - } - - public Color getYColor() { - return yColor; - } - - public Color getZColor() { - return zColor; - } - - public void setBackgroundColor(Color backgroundColor) { - this.backgroundColor = backgroundColor; - } - - public void setLineColor(Color lineColor) { - this.lineColor = lineColor; - } - - public void setXColor(Color xColor) { - this.xColor = xColor; - } - - public void setYColor(Color yColor) { - this.yColor = yColor; - } - - public void setZColor(Color zColor) { - this.zColor = zColor; - } - - public void clearView() { - values.clear(); - repaint(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, - Short.MAX_VALUE)); - layout.setVerticalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, - Short.MAX_VALUE)); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/GForceWiimoteEventPanel.java b/java/src/wiiusej/utils/GForceWiimoteEventPanel.java deleted file mode 100644 index 1ae710e..0000000 --- a/java/src/wiiusej/utils/GForceWiimoteEventPanel.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.values.GForce; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; - -/** - * Panel to display GForce in a MotionSensingEvent from a wiimote. - * - * @author guiguito - */ -public class GForceWiimoteEventPanel extends GForcePanel { - - @Override - public GForce getGForceValue(GenericEvent e) { - if (e instanceof MotionSensingEvent) { - return ((MotionSensingEvent) e).getGforce(); - } - return null; - } -} diff --git a/java/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java b/java/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java deleted file mode 100644 index fe03337..0000000 --- a/java/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java +++ /dev/null @@ -1,274 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.GuitarHeroButtonsEvent; -import wiiusej.wiiusejevents.physicalevents.GuitarHeroEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to display what happens on the buttons of the - * Guitar Hero 3 controller. - * @author guiguito - */ -public class GuitarHero3ButtonsEventPanel extends javax.swing.JPanel implements WiimoteListener { - - /** Creates new form GuitarHero3ButtonsEventPanel */ - public GuitarHero3ButtonsEventPanel() { - initComponents(); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - leftPanel = new javax.swing.JPanel(); - plusButton = new javax.swing.JToggleButton(); - minusButton = new javax.swing.JToggleButton(); - strumPanel = new javax.swing.JPanel(); - strumUpButton = new javax.swing.JToggleButton(); - strumDownButton = new javax.swing.JToggleButton(); - RightPanel = new javax.swing.JPanel(); - coloredButtonsPanel = new javax.swing.JPanel(); - orangeButton = new javax.swing.JToggleButton(); - blueButton = new javax.swing.JToggleButton(); - yellowButton = new javax.swing.JToggleButton(); - redButton = new javax.swing.JToggleButton(); - greenButton = new javax.swing.JToggleButton(); - - setBackground(new java.awt.Color(0, 0, 0)); - setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.X_AXIS)); - - leftPanel.setBackground(new java.awt.Color(0, 0, 0)); - leftPanel.setLayout(new javax.swing.BoxLayout(leftPanel, javax.swing.BoxLayout.LINE_AXIS)); - - plusButton.setBackground(new java.awt.Color(255, 255, 255)); - plusButton.setFont(new java.awt.Font("Arial", 1, 24)); - plusButton.setText("+"); - leftPanel.add(plusButton); - - minusButton.setBackground(new java.awt.Color(255, 255, 255)); - minusButton.setFont(new java.awt.Font("Arial", 1, 24)); - minusButton.setText("-"); - leftPanel.add(minusButton); - - strumPanel.setBackground(new java.awt.Color(0, 0, 0)); - strumPanel.setLayout(new javax.swing.BoxLayout(strumPanel, javax.swing.BoxLayout.Y_AXIS)); - - strumUpButton.setBackground(new java.awt.Color(255, 255, 255)); - strumUpButton.setFont(new java.awt.Font("Arial", 1, 24)); - strumUpButton.setText("Strum UP"); - strumPanel.add(strumUpButton); - - strumDownButton.setBackground(new java.awt.Color(255, 255, 255)); - strumDownButton.setFont(new java.awt.Font("Arial", 1, 24)); - strumDownButton.setText("Strum DOWN"); - strumPanel.add(strumDownButton); - - leftPanel.add(strumPanel); - - add(leftPanel); - - RightPanel.setBackground(new java.awt.Color(0, 0, 0)); - RightPanel.setLayout(new javax.swing.BoxLayout(RightPanel, javax.swing.BoxLayout.LINE_AXIS)); - - coloredButtonsPanel.setLayout(new javax.swing.BoxLayout(coloredButtonsPanel, javax.swing.BoxLayout.LINE_AXIS)); - - orangeButton.setBackground(new java.awt.Color(255, 153, 0)); - orangeButton.setFont(new java.awt.Font("Arial", 1, 24)); - orangeButton.setText("O"); - coloredButtonsPanel.add(orangeButton); - - blueButton.setBackground(new java.awt.Color(0, 0, 204)); - blueButton.setFont(new java.awt.Font("Arial", 1, 24)); - blueButton.setText("O"); - coloredButtonsPanel.add(blueButton); - - yellowButton.setBackground(new java.awt.Color(255, 255, 0)); - yellowButton.setFont(new java.awt.Font("Arial", 1, 24)); - yellowButton.setText("O"); - coloredButtonsPanel.add(yellowButton); - - redButton.setBackground(new java.awt.Color(255, 0, 0)); - redButton.setFont(new java.awt.Font("Arial", 1, 24)); - redButton.setText("O"); - coloredButtonsPanel.add(redButton); - - greenButton.setBackground(new java.awt.Color(51, 255, 0)); - greenButton.setFont(new java.awt.Font("Arial", 1, 24)); - greenButton.setText("O"); - coloredButtonsPanel.add(greenButton); - - RightPanel.add(coloredButtonsPanel); - - add(RightPanel); - }// //GEN-END:initComponents - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - //do nothing - } - - public void onIrEvent(IREvent arg0) { - //do nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - //do nothing - } - - public void onExpansionEvent(ExpansionEvent arg0) { - if (arg0 instanceof GuitarHeroEvent) { - GuitarHeroEvent guitar = (GuitarHeroEvent) arg0; - GuitarHeroButtonsEvent buttons = guitar.getButtonsEvent(); - - //orange button - if (buttons.isButtonOrangeJustPressed()) { - orangeButton.setSelected(true); - orangeButton.setText("X"); - } else if (buttons.isButtonOrangeJustReleased()) { - orangeButton.setSelected(false); - orangeButton.setText("O"); - } - - //blue button - if (buttons.isButtonBlueJustPressed()) { - blueButton.setSelected(true); - blueButton.setText("X"); - } else if (buttons.isButtonBlueJustReleased()) { - blueButton.setSelected(false); - blueButton.setText("O"); - } - - //Yellow button - if (buttons.isButtonYellowJustPressed()) { - yellowButton.setSelected(true); - yellowButton.setText("X"); - } else if (buttons.isButtonYellowJustReleased()) { - yellowButton.setSelected(false); - yellowButton.setText("O"); - } - - //Red button - if (buttons.isButtonRedJustPressed()) { - redButton.setSelected(true); - redButton.setText("X"); - } else if (buttons.isButtonRedJustReleased()) { - redButton.setSelected(false); - redButton.setText("O"); - } - - //Green button - if (buttons.isButtonGreenJustPressed()) { - greenButton.setSelected(true); - greenButton.setText("X"); - } else if (buttons.isButtonGreenJustReleased()) { - greenButton.setSelected(false); - greenButton.setText("O"); - } - - //Plus button - if (buttons.isButtonPlusJustPressed()) { - plusButton.setSelected(true); - } else if (buttons.isButtonPlusJustReleased()) { - plusButton.setSelected(false); - } - - //Minus button - if (buttons.isButtonMinusJustPressed()) { - minusButton.setSelected(true); - } else if (buttons.isButtonMinusJustReleased()) { - minusButton.setSelected(false); - } - - //Strum up button - if (buttons.isButtonStrumUpJustPressed()) { - strumUpButton.setSelected(true); - } else if (buttons.isButtonStrumUpJustReleased()) { - strumUpButton.setSelected(false); - } - - //Strum down button - if (buttons.isButtonStrumDownJustPressed()) { - strumDownButton.setSelected(true); - } else if (buttons.isButtonStrumDownJustReleased()) { - strumDownButton.setSelected(false); - } - } - } - - public void onStatusEvent(StatusEvent arg0) { - //do nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //do nothing - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - //do nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - //do nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - //do nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - //do nothing - } - - public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { - //do nothing - } - - public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { - //do nothing - } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel RightPanel; - private javax.swing.JToggleButton blueButton; - private javax.swing.JPanel coloredButtonsPanel; - private javax.swing.JToggleButton greenButton; - private javax.swing.JPanel leftPanel; - private javax.swing.JToggleButton minusButton; - private javax.swing.JToggleButton orangeButton; - private javax.swing.JToggleButton plusButton; - private javax.swing.JToggleButton redButton; - private javax.swing.JToggleButton strumDownButton; - private javax.swing.JPanel strumPanel; - private javax.swing.JToggleButton strumUpButton; - private javax.swing.JToggleButton yellowButton; - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java b/java/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java deleted file mode 100644 index 6fd906f..0000000 --- a/java/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.GuitarHeroEvent; -import wiiusej.wiiusejevents.physicalevents.JoystickEvent; - -/** - * Panel to display Guitar Hero 3 controller joystick events. - * - * @author guiguito - */ -public class GuitarHeroJoystickEventPanel extends JoystickEventPanel{ - - @Override - public JoystickEvent getJoystickEvent(ExpansionEvent e) { - if (e instanceof GuitarHeroEvent){ - return ((GuitarHeroEvent)e).getGuitarHeroJoystickEvent(); - } - return null; - } - -} diff --git a/java/src/wiiusej/utils/IRPanel.java b/java/src/wiiusej/utils/IRPanel.java deleted file mode 100644 index 9d4cf79..0000000 --- a/java/src/wiiusej/utils/IRPanel.java +++ /dev/null @@ -1,275 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.geom.AffineTransform; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to see what the IR camera of the wiimote sees. - * - * @author guiguito - */ -public class IRPanel extends javax.swing.JPanel implements WiimoteListener { - - private static int MAX_NB_POINTS = 4; - private Color color = Color.YELLOW; - private Color backgroundColor = Color.BLACK; - private Color borderColor = Color.BLUE; - private Shape shape; - private Image mImage;// image for double buffering - private int[] xCoordinates; - private int[] yCoordinates; - private int nbPoints = -1; - - /** - * Default constructor for IR Panel. Background color : black. IR sources - * color : yellow. Border color of IR sources : blue. Shape of the IR - * sources : circle with a diameter of 10. - */ - public IRPanel() { - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 10, 10); - initArrays(); - initComponents(); - } - - /** - * Constructor used to parameterize the IR panel. - * - * @param bgColor - * color. - * @param ptColor - * IR sources color. - * @param bdColor - * border color of IR sources. - * @param sh - * Shape of the IR sources. - */ - public IRPanel(Color bgColor, Color ptColor, Color bdColor, Shape sh) { - backgroundColor = bgColor; - color = ptColor; - borderColor = bdColor; - shape = sh; - initArrays(); - initComponents(); - } - - private void initArrays() { - xCoordinates = new int[MAX_NB_POINTS]; - yCoordinates = new int[MAX_NB_POINTS]; - for (int i = 0; i < MAX_NB_POINTS; i++) { - xCoordinates[i] = -1; - yCoordinates[i] = -1; - } - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - // draw points - int i = 0; - while (i < nbPoints) { - double x = xCoordinates[i]; - double y = yCoordinates[i]; - - long xx = getWidth() - Math.round((double) getWidth() * x / 1024.0); - long yy = getHeight() - - Math.round((double) getHeight() * y / 768.0); - g2.translate(xx, yy); - - g2.setPaint(borderColor); - g2.draw(shape); - g2.setPaint(color); - g2.fill(shape); - - g2.setTransform(new AffineTransform()); - i++; - } - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width - || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing - repaint(); - } - - public void onIrEvent(IREvent arg0) { - // transfer points - wiiusej.values.IRSource[] points = arg0.getIRPoints(); - nbPoints = points.length; - for (int i = 0; i < points.length; i++) { - xCoordinates[i] = (int) points[i].getRx(); - yCoordinates[i] = (int) points[i].getRy(); - } - for (int i = points.length; i < MAX_NB_POINTS; i++) { - xCoordinates[i] = -1; - yCoordinates[i] = -1; - } - - // redraw panel - repaint(); - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - // nothing - } - - public void onExpansionEvent(ExpansionEvent e) { - // nothing - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // clear previous points - for (int i = 0; i < MAX_NB_POINTS; i++) { - xCoordinates[i] = -1; - yCoordinates[i] = -1; - } - // redraw panel - repaint(); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent e) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent e) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - public Color getBackgroundColor() { - return backgroundColor; - } - - public Color getBorderColor() { - return borderColor; - } - - public Color getColor() { - return color; - } - - public Shape getShape() { - return shape; - } - - public void setBackgroundColor(Color backgroundColor) { - this.backgroundColor = backgroundColor; - } - - public void setBorderColor(Color borderColor) { - this.borderColor = borderColor; - } - - public void setColor(Color color) { - this.color = color; - } - - public void setShape(Shape shape) { - this.shape = shape; - } - - public void clearView() { - initArrays(); - repaint(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, - Short.MAX_VALUE)); - layout.setVerticalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, - Short.MAX_VALUE)); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/JoystickEventPanel.java b/java/src/wiiusej/utils/JoystickEventPanel.java deleted file mode 100644 index 2883216..0000000 --- a/java/src/wiiusej/utils/JoystickEventPanel.java +++ /dev/null @@ -1,248 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.JoystickEvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * Panel to display joystick events. - * - * @author guiguito - */ -public abstract class JoystickEventPanel extends javax.swing.JPanel implements - WiimoteListener { - - private Image mImage;// image for double buffering - private Color backgroundColor = Color.BLACK; - private Color borderColor = Color.RED; - private Color pointColor = Color.RED; - private Shape shape = new java.awt.geom.Ellipse2D.Double(0, 0, 30, 30); - private JoystickEvent lastJoystickEvent = null; - - /** Creates new form JoystickPanel */ - public JoystickEventPanel() { - initComponents(); - } - - /** - * Constructor used to choose the colors used by the JoystickPanel. - * - * @param bgColor - * background color. - * @param pColor - * point color. - * @param bdColor - * border color for the shape. - * @param sh - * shape of what is drawn. - */ - public JoystickEventPanel(Color bgColor, Color pColor, Color bdColor, - Shape sh) { - backgroundColor = bgColor; - pointColor = pColor; - shape = sh; - borderColor = bdColor; - initComponents(); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g2.setTransform(new AffineTransform()); - - // compute center - int xCenter = (int) Math.round(d.getWidth() / 2.0); - int yCenter = (int) Math.round(d.getHeight() / 2.0); - - // compute coordinates - if (lastJoystickEvent != null) { - double xAng = Math.sin(lastJoystickEvent.getAngle() * Math.PI - / 180.0) - * lastJoystickEvent.getMagnitude(); - double yAng = Math.cos(lastJoystickEvent.getAngle() * Math.PI - / 180.0) - * lastJoystickEvent.getMagnitude(); - int halfWidth = (int) Math.round(shape.getBounds().getWidth() / 2); - int halHeight = (int) Math.round(shape.getBounds().getHeight() / 2); - int xAmplitude = (int) Math.round(xCenter - shape.getBounds().getWidth()); - int yAmplitude = (int) Math.round(xCenter - shape.getBounds().getHeight()); - int xShift = (int) Math.round(xAng * xAmplitude); - int yShift = (int) Math.round(yAng * yAmplitude); - int x = xCenter + xShift - halfWidth; - int y = yCenter - yShift - halHeight; - // shape - g2.translate(x, y); - g2.setPaint(borderColor); - g2.draw(shape); - g2.setPaint(pointColor); - g2.fill(shape); - } - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width - || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing - } - - public void onIrEvent(IREvent arg0) { - // nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - // nothing - } - - public void onExpansionEvent(ExpansionEvent arg0) { - JoystickEvent joy = getJoystickEvent(arg0); - if (joy != null) { - lastJoystickEvent = joy; - } - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // nothing - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - public Color getBackgroundColor() { - return backgroundColor; - } - - public Color getPointColor() { - return pointColor; - } - - public Color getBorderColor() { - return borderColor; - } - - public Shape getShape() { - return shape; - } - - public void setBackgroundColor(Color backgroundColor) { - this.backgroundColor = backgroundColor; - } - - public void setPointColor(Color pointColor) { - this.pointColor = pointColor; - } - - public void setBorderColor(Color borderColor) { - this.borderColor = borderColor; - } - - public void setShape(Shape shape) { - this.shape = shape; - } - - public abstract JoystickEvent getJoystickEvent(ExpansionEvent e); - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, - Short.MAX_VALUE)); - layout.setVerticalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, - Short.MAX_VALUE)); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/NunchukJoystickEventPanel.java b/java/src/wiiusej/utils/NunchukJoystickEventPanel.java deleted file mode 100644 index 9d088bc..0000000 --- a/java/src/wiiusej/utils/NunchukJoystickEventPanel.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.JoystickEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukEvent; - -/** - * Panel to display nunchuk joystick events. - * - * @author guiguito - */ -public class NunchukJoystickEventPanel extends JoystickEventPanel { - - @Override - public JoystickEvent getJoystickEvent(ExpansionEvent e) { - if (e instanceof NunchukEvent) { - return ((NunchukEvent) e).getNunchukJoystickEvent(); - } - return null; - } -} diff --git a/java/src/wiiusej/utils/OrientationExpansionEventPanel.java b/java/src/wiiusej/utils/OrientationExpansionEventPanel.java deleted file mode 100644 index f5e3856..0000000 --- a/java/src/wiiusej/utils/OrientationExpansionEventPanel.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.values.Orientation; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukEvent; - -/** - * Panel to display Orientation in a MotionSensingEvent from an expansion. - * - * @author guiguito - */ -public class OrientationExpansionEventPanel extends OrientationPanel { - - @Override - public Orientation getOrientationValue(GenericEvent e) { - if (e instanceof NunchukEvent) { - return ((NunchukEvent) e).getNunchukMotionSensingEvent() - .getOrientation(); - } - return null; - } -} diff --git a/java/src/wiiusej/utils/OrientationPanel.java b/java/src/wiiusej/utils/OrientationPanel.java deleted file mode 100644 index 839fdfd..0000000 --- a/java/src/wiiusej/utils/OrientationPanel.java +++ /dev/null @@ -1,305 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.util.ArrayList; - -import wiiusej.values.Orientation; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This panel is used to watch orientation values from a MotionSensingEvent. - * - * @author guiguito - */ -public abstract class OrientationPanel extends javax.swing.JPanel implements - WiimoteListener { - - private Image mImage;// image for double buffering - private Color rollColor = Color.RED; - private Color pitchColor = Color.GREEN; - private Color yawColor = Color.BLUE; - private Color backgroundColor = Color.WHITE; - private Color lineColor = Color.BLACK; - private ArrayList values = new ArrayList(); - - /** - * Default constructor. Background color : White. Roll color : Red. Pitch - * color : Green. Yaw color : Blue. - */ - public OrientationPanel() { - initComponents(); - } - - /** - * Constructor used to choose the colors used by the OrientationPanel. - * - * @param bgColor - * background color. - * @param rColor - * roll color. - * @param pColor - * pitch color. - * @param yColor - * yaw color. - * @param lColor - * line color. - */ - public OrientationPanel(Color bgColor, Color rColor, Color pColor, - Color yColor, Color lColor) { - backgroundColor = bgColor; - rollColor = rColor; - pitchColor = pColor; - yawColor = yColor; - lineColor = lColor; - initComponents(); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - Dimension d = getSize(); - checkOffScreenImage(); - Graphics offG = mImage.getGraphics(); - offG.setColor(backgroundColor); - offG.fillRect(0, 0, d.width, d.height); - Graphics2D g2 = (Graphics2D) mImage.getGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - // draw medium line - double yMiddleFloat = getHeight() / 2.0; - int yMiddle = (int) Math.round(yMiddleFloat); - - g2.setPaint(lineColor); - g2.drawLine(0, yMiddle, getWidth(), yMiddle); - - Orientation[] valuesArray = values.toArray(new Orientation[0]); - double unit = yMiddleFloat / 180.0; - int previousRoll = 0; - int previousPitch = 0; - int previousYaw = 0; - // draw curves - for (int i = 0; i < valuesArray.length && i < getWidth(); i++) { - Orientation orientation = valuesArray[i]; - // draw roll - g2.setPaint(rollColor); - int yDelta = (int) Math.round(unit * orientation.getRoll()); - int y = -1 * yDelta + yMiddle; - g2.drawLine(i - 1, previousRoll, i, y); - g2.setTransform(new AffineTransform()); - previousRoll = y; - // draw pitch - g2.setPaint(pitchColor); - yDelta = (int) Math.round(unit * orientation.getPitch()); - y = -1 * yDelta + yMiddle; - g2.drawLine(i - 1, previousPitch, i, y); - g2.setTransform(new AffineTransform()); - previousPitch = y; - // draw yaw - g2.setPaint(yawColor); - yDelta = (int) Math.round(unit * orientation.getYaw()); - y = -1 * yDelta + yMiddle; - g2.drawLine(i - 1, previousYaw, i, y); - g2.setTransform(new AffineTransform()); - previousYaw = y; - } - - // draw legend - g2.setPaint(rollColor); - g2.drawLine(5, getHeight() - 10, 25, getHeight() - 10); - g2.setPaint(pitchColor); - g2.drawLine(60, getHeight() - 10, 80, getHeight() - 10); - g2.setPaint(yawColor); - g2.drawLine(120, getHeight() - 10, 140, getHeight() - 10); - - g2.setPaint(lineColor); - g2.drawString("Roll", 30, getHeight() - 5); - g2.drawString("Pitch", 85, getHeight() - 5); - g2.drawString("Yaw", 145, getHeight() - 5); - g2.drawString("0", 2, yMiddle - 5); - g2.drawString("180", 2, 10); - g2.drawString("-180", 2, getHeight() - 15); - // put offscreen image on the screen - g.drawImage(mImage, 0, 0, null); - } - - /** - * check if the mImage variable has been initialized. If it's not the case - * it initializes it with the dimensions of the panel. mImage is for double - * buffering. - */ - private void checkOffScreenImage() { - Dimension d = getSize(); - if (mImage == null || mImage.getWidth(null) != d.width - || mImage.getHeight(null) != d.height) { - mImage = createImage(d.width, d.height); - } - } - - public void onButtonsEvent(WiimoteButtonsEvent arg0) { - // nothing - } - - public void onIrEvent(IREvent arg0) { - // nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - draw(arg0); - } - - public void onExpansionEvent(ExpansionEvent arg0) { - draw(arg0); - } - - public void onStatusEvent(StatusEvent arg0) { - // nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - // Clear points. - values.clear(); - repaint(); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { - // nothing - } - - public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing - } - - public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing - } - - public void onClassicControllerInsertedEvent( - ClassicControllerInsertedEvent arg0) { - // nothing - } - - public void onClassicControllerRemovedEvent( - ClassicControllerRemovedEvent arg0) { - // nothing - } - - private void draw(GenericEvent arg0) { - if (values.size() >= getWidth()) { - // if there are as many values as pixels in the width - // clear points - values.clear(); - } - Orientation orientation = getOrientationValue(arg0); - if (orientation != null) - values.add(orientation); - repaint(); - } - - public abstract Orientation getOrientationValue(GenericEvent e); - - public Color getBackgroundColor() { - return backgroundColor; - } - - public Color getLineColor() { - return lineColor; - } - - public Color getPitchColor() { - return pitchColor; - } - - public Color getRollColor() { - return rollColor; - } - - public Color getYawColor() { - return yawColor; - } - - public void setBackgroundColor(Color backgroundColor) { - this.backgroundColor = backgroundColor; - } - - public void setLineColor(Color lineColor) { - this.lineColor = lineColor; - } - - public void setPitchColor(Color pitchColor) { - this.pitchColor = pitchColor; - } - - public void setRollColor(Color rollColor) { - this.rollColor = rollColor; - } - - public void setYawColor(Color yawColor) { - this.yawColor = yawColor; - } - - public void clearView() { - values.clear(); - repaint(); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, - Short.MAX_VALUE)); - layout.setVerticalGroup(layout.createParallelGroup( - javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, - Short.MAX_VALUE)); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - // End of variables declaration//GEN-END:variables -} diff --git a/java/src/wiiusej/utils/OrientationWiimoteEventPanel.java b/java/src/wiiusej/utils/OrientationWiimoteEventPanel.java deleted file mode 100644 index e38f3c9..0000000 --- a/java/src/wiiusej/utils/OrientationWiimoteEventPanel.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file is part of WiiuseJ. - * - * WiiuseJ 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. - * - * WiiuseJ 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 WiiuseJ. If not, see . - */ -package wiiusej.utils; - -import wiiusej.values.Orientation; -import wiiusej.wiiusejevents.GenericEvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; - -/** - * Panel to display Orientation in a MotionSensingEvent from a wiimote. - * - * @author guiguito - */ -public class OrientationWiimoteEventPanel extends OrientationPanel { - - @Override - public Orientation getOrientationValue(GenericEvent e) { - if (e instanceof MotionSensingEvent) { - return ((MotionSensingEvent) e).getOrientation(); - } - return null; - } - -} diff --git a/java/wiiuse.dll b/java/wiiuse.dll index 777462038ef7bd27bbf8e52a984e32543646fd81..98b517f033cda63dbdfbe7b7edc7f0b4098ed63c 100644 GIT binary patch delta 7293 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 diff --git a/java/wiiusej.dll b/java/wiiusej.dll index 708f8fb46ee982972672beddaaf789159da18f78..f32060047d101126ccaaf46d2e35f4305f28bc87 100644 GIT binary patch delta 31 lcmZpez}PT>aY6^Pj?dDG-M&m;8#mt4(gpE0v+Mno1OUTy3^)J) delta 31 lcmZpez}PT>aY6@k<(_#HyM39Ok~ZGb(gpE0v+Mno1OU&K4H5tV diff --git a/java/wiiusej.jar b/java/wiiusej.jar new file mode 100644 index 0000000000000000000000000000000000000000..951377e3bcebd45f1af9a06f4ab2eadb1e7e6d25 GIT binary patch literal 222970 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