From 0f697f7c4da35251d4dbb533e320988cd7126d66 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Wed, 29 Oct 2014 22:04:36 +0000 Subject: [PATCH] Remove tagged directories --- WiiUseJC_0.1/.cproject | 337 ----- WiiUseJC_0.1/.project | 69 - WiiUseJC_0.1/lib/wiiuse.lib | Bin 7956 -> 0 bytes WiiUseJC_0.1/wiiuse.h | 632 -------- WiiUseJC_0.1/wiiusej_WiiUseApi.c | 476 ------ WiiUseJC_0.1/wiiusej_WiiUseApi.def | 27 - WiiUseJC_0.1/wiiusej_WiiUseApi.h | 213 --- WiiUseJC_0.11/.cproject | 338 ----- WiiUseJC_0.11/.project | 69 - WiiUseJC_0.11/lib/wiiuse.lib | Bin 7956 -> 0 bytes WiiUseJC_0.11/wiiuse.h | 632 -------- WiiUseJC_0.11/wiiusej_WiiUseApi.c | 477 ------ WiiUseJC_0.11/wiiusej_WiiUseApi.def | 27 - WiiUseJC_0.11/wiiusej_WiiUseApi.h | 213 --- WiiUseJC_0.11ThreadReqeuests/.cproject | 338 ----- WiiUseJC_0.11ThreadReqeuests/.project | 69 - WiiUseJC_0.11ThreadReqeuests/lib/wiiuse.lib | Bin 7956 -> 0 bytes WiiUseJC_0.11ThreadReqeuests/wiiuse.h | 632 -------- .../wiiusej_WiiUseApi.c | 477 ------ .../wiiusej_WiiUseApi.def | 27 - .../wiiusej_WiiUseApi.h | 213 --- WiiUseJC_0.12/.cproject | 338 ----- WiiUseJC_0.12/.project | 69 - WiiUseJC_0.12/lib/wiiuse.lib | Bin 8210 -> 0 bytes WiiUseJC_0.12/wiiuse.h | 653 -------- WiiUseJC_0.12/wiiusej_WiiUseApi.c | 583 -------- WiiUseJC_0.12/wiiusej_WiiUseApi.def | 34 - WiiUseJC_0.12/wiiusej_WiiUseApi.h | 277 ---- WiiUseJ_0.1/.classpath | 6 - WiiUseJ_0.1/.project | 17 - WiiUseJ_0.1/README.TXT | 38 - WiiUseJ_0.1/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.1/libWiiuseJ.dll | Bin 25448 -> 0 bytes WiiUseJ_0.1/src/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.1/src/wiiusej/WiiUseApi.java | 211 --- WiiUseJ_0.1/src/wiiusej/WiiUseApiManager.java | 567 ------- WiiUseJ_0.1/src/wiiusej/Wiimote.java | 323 ---- .../src/wiiusej/test/CloseGuiTestCleanly.java | 65 - WiiUseJ_0.1/src/wiiusej/test/Main.java | 40 - WiiUseJ_0.1/src/wiiusej/test/Tests.java | 354 ----- .../src/wiiusej/test/WiiuseJGuiTest.java | 836 ----------- .../src/wiiusej/utils/AccelerationPanel.java | 182 --- .../src/wiiusej/utils/ButtonsEventPanel.java | 297 ---- .../src/wiiusej/utils/GForcePanel.java | 201 --- WiiUseJ_0.1/src/wiiusej/utils/IRPanel.java | 192 --- .../src/wiiusej/utils/OrientationPanel.java | 205 --- WiiUseJ_0.1/src/wiiusej/values/GForce.java | 75 - WiiUseJ_0.1/src/wiiusej/values/IRSource.java | 109 -- .../src/wiiusej/values/Orientation.java | 76 - .../src/wiiusej/values/RawAcceleration.java | 75 - .../wiiusej/wiiuseapievents/ButtonsEvent.java | 335 ----- .../wiiuseapievents/DisconnectionEvent.java | 44 - .../wiiuseapievents/EventsGatherer.java | 241 --- .../wiiusej/wiiuseapievents/GenericEvent.java | 227 --- .../src/wiiusej/wiiuseapievents/IREvent.java | 285 ---- .../wiiuseapievents/MotionSensingEvent.java | 194 --- .../wiiusej/wiiuseapievents/StatusEvent.java | 258 ---- .../wiiuseapievents/WiiUseApiEvent.java | 62 - .../wiiuseapievents/WiiUseApiListener.java | 39 - .../wiiusej/wiiuseapievents/WiimoteEvent.java | 59 - .../wiiuseapievents/WiimoteListener.java | 69 - .../wiiuseapirequest/FloatValueRequest.java | 71 - .../wiiuseapirequest/IntValueRequest.java | 74 - .../wiiusej/wiiuseapirequest/LedsRequest.java | 125 -- .../wiiuseapirequest/TwoIntValueRequest.java | 73 - .../wiiuseapirequest/WiiUseApiRequest.java | 112 -- WiiUseJ_0.1/wiiuse.dll | Bin 114688 -> 0 bytes WiiUseJ_0.11/.classpath | 6 - WiiUseJ_0.11/.project | 17 - WiiUseJ_0.11/README.TXT | 38 - WiiUseJ_0.11/WiiUseJ.dll | Bin 25448 -> 0 bytes WiiUseJ_0.11/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.11/libWiiuseJ.so | Bin 14645 -> 0 bytes WiiUseJ_0.11/libwiiuse.so | Bin 39073 -> 0 bytes WiiUseJ_0.11/src/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.11/src/wiiusej/WiiUseApi.java | 265 ---- .../src/wiiusej/WiiUseApiManager.java | 571 ------- WiiUseJ_0.11/src/wiiusej/Wiimote.java | 323 ---- .../src/wiiusej/test/CloseGuiTestCleanly.java | 65 - WiiUseJ_0.11/src/wiiusej/test/Main.java | 40 - WiiUseJ_0.11/src/wiiusej/test/Tests.java | 354 ----- .../src/wiiusej/test/WiiuseJGuiTest.java | 836 ----------- .../src/wiiusej/utils/AccelerationPanel.java | 182 --- .../src/wiiusej/utils/ButtonsEventPanel.java | 297 ---- .../src/wiiusej/utils/GForcePanel.java | 201 --- WiiUseJ_0.11/src/wiiusej/utils/IRPanel.java | 193 --- .../src/wiiusej/utils/OrientationPanel.java | 205 --- WiiUseJ_0.11/src/wiiusej/values/GForce.java | 75 - WiiUseJ_0.11/src/wiiusej/values/IRSource.java | 109 -- .../src/wiiusej/values/Orientation.java | 76 - .../src/wiiusej/values/RawAcceleration.java | 75 - .../wiiusej/wiiuseapievents/ButtonsEvent.java | 335 ----- .../wiiuseapievents/DisconnectionEvent.java | 44 - .../wiiuseapievents/EventsGatherer.java | 241 --- .../wiiusej/wiiuseapievents/GenericEvent.java | 227 --- .../src/wiiusej/wiiuseapievents/IREvent.java | 285 ---- .../wiiuseapievents/MotionSensingEvent.java | 194 --- .../wiiusej/wiiuseapievents/StatusEvent.java | 258 ---- .../wiiuseapievents/WiiUseApiEvent.java | 62 - .../wiiuseapievents/WiiUseApiListener.java | 39 - .../wiiusej/wiiuseapievents/WiimoteEvent.java | 59 - .../wiiuseapievents/WiimoteListener.java | 69 - .../wiiuseapirequest/FloatValueRequest.java | 71 - .../wiiuseapirequest/IntValueRequest.java | 74 - .../wiiusej/wiiuseapirequest/LedsRequest.java | 125 -- .../wiiuseapirequest/TwoIntValueRequest.java | 73 - .../wiiuseapirequest/WiiUseApiRequest.java | 112 -- WiiUseJ_0.11/wiiuse.dll | Bin 114688 -> 0 bytes WiiUseJ_0.11ThreadReqeuests/.classpath | 6 - WiiUseJ_0.11ThreadReqeuests/.project | 17 - WiiUseJ_0.11ThreadReqeuests/README.TXT | 38 - WiiUseJ_0.11ThreadReqeuests/WiiUseJ.dll | Bin 25448 -> 0 bytes WiiUseJ_0.11ThreadReqeuests/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.11ThreadReqeuests/libWiiuseJ.so | Bin 14645 -> 0 bytes WiiUseJ_0.11ThreadReqeuests/libwiiuse.so | Bin 39073 -> 0 bytes .../src/img/wiimote.png | Bin 44340 -> 0 bytes .../src/wiiusej/WiiUseApi.java | 265 ---- .../src/wiiusej/WiiUseApiManager.java | 491 ------ .../src/wiiusej/WiiUseApiRequestsManager.java | 162 -- .../src/wiiusej/Wiimote.java | 323 ---- .../src/wiiusej/test/CloseGuiTestCleanly.java | 65 - .../src/wiiusej/test/Main.java | 40 - .../src/wiiusej/test/Tests.java | 354 ----- .../src/wiiusej/test/WiiuseJGuiTest.java | 836 ----------- .../src/wiiusej/utils/AccelerationPanel.java | 182 --- .../src/wiiusej/utils/ButtonsEventPanel.java | 297 ---- .../src/wiiusej/utils/GForcePanel.java | 201 --- .../src/wiiusej/utils/IRPanel.java | 193 --- .../src/wiiusej/utils/OrientationPanel.java | 205 --- .../src/wiiusej/values/GForce.java | 75 - .../src/wiiusej/values/IRSource.java | 109 -- .../src/wiiusej/values/Orientation.java | 76 - .../src/wiiusej/values/RawAcceleration.java | 75 - .../wiiusej/wiiuseapievents/ButtonsEvent.java | 335 ----- .../wiiuseapievents/DisconnectionEvent.java | 44 - .../wiiuseapievents/EventsGatherer.java | 241 --- .../wiiusej/wiiuseapievents/GenericEvent.java | 227 --- .../src/wiiusej/wiiuseapievents/IREvent.java | 285 ---- .../wiiuseapievents/MotionSensingEvent.java | 194 --- .../wiiusej/wiiuseapievents/StatusEvent.java | 258 ---- .../wiiuseapievents/WiiUseApiEvent.java | 62 - .../wiiuseapievents/WiiUseApiListener.java | 39 - .../wiiusej/wiiuseapievents/WiimoteEvent.java | 59 - .../wiiuseapievents/WiimoteListener.java | 69 - .../wiiuseapirequest/FloatValueRequest.java | 71 - .../wiiuseapirequest/IntValueRequest.java | 74 - .../wiiusej/wiiuseapirequest/LedsRequest.java | 125 -- .../wiiuseapirequest/TwoIntValueRequest.java | 73 - .../wiiuseapirequest/WiiUseApiRequest.java | 112 -- WiiUseJ_0.11ThreadReqeuests/wiiuse.dll | Bin 114688 -> 0 bytes WiiUseJ_0.12/.classpath | 6 - WiiUseJ_0.12/.project | 17 - .../.settings/org.eclipse.jdt.ui.prefs | 3 - WiiUseJ_0.12/README.TXT | 56 - WiiUseJ_0.12/WiiUseJ.dll | Bin 30473 -> 0 bytes WiiUseJ_0.12/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.12/libWiiuseJ.so | Bin 19652 -> 0 bytes WiiUseJ_0.12/libwiiuse.so | Bin 40551 -> 0 bytes WiiUseJ_0.12/src/img/wiimote.png | Bin 44340 -> 0 bytes WiiUseJ_0.12/src/wiiusej/WiiUseApi.java | 351 ----- .../src/wiiusej/WiiUseApiManager.java | 662 -------- WiiUseJ_0.12/src/wiiusej/Wiimote.java | 435 ------ .../src/wiiusej/test/CloseGuiTestCleanly.java | 58 - WiiUseJ_0.12/src/wiiusej/test/Main.java | 45 - .../src/wiiusej/test/NunchukGuiTest.java | 377 ----- WiiUseJ_0.12/src/wiiusej/test/Tests.java | 367 ----- .../src/wiiusej/test/WiiuseJGuiTest.java | 1329 ----------------- .../AccelerationExpansionEventPanel.java | 39 - .../src/wiiusej/utils/AccelerationPanel.java | 281 ---- .../utils/AccelerationWiimoteEventPanel.java | 37 - .../src/wiiusej/utils/ButtonsEventPanel.java | 363 ----- .../utils/GForceExpansionEventPanel.java | 38 - .../src/wiiusej/utils/GForcePanel.java | 282 ---- .../utils/GForceWiimoteEventPanel.java | 37 - WiiUseJ_0.12/src/wiiusej/utils/IRPanel.java | 253 ---- .../src/wiiusej/utils/JoystickEventPanel.java | 231 --- .../utils/NunchukJoystickEventPanel.java | 37 - .../utils/OrientationExpansionEventPanel.java | 38 - .../src/wiiusej/utils/OrientationPanel.java | 283 ---- .../utils/OrientationWiimoteEventPanel.java | 38 - WiiUseJ_0.12/src/wiiusej/values/GForce.java | 80 - WiiUseJ_0.12/src/wiiusej/values/IRSource.java | 106 -- .../src/wiiusej/values/Orientation.java | 117 -- .../src/wiiusej/values/RawAcceleration.java | 81 - .../wiiusej/wiiusejevents/GenericEvent.java | 59 - .../physicalevents/ButtonsEvent.java | 128 -- .../physicalevents/ExpansionEvent.java | 40 - .../wiiusejevents/physicalevents/IREvent.java | 317 ---- .../physicalevents/JoystickEvent.java | 135 -- .../physicalevents/MotionSensingEvent.java | 203 --- .../physicalevents/NunchukButtonsEvent.java | 90 -- .../physicalevents/NunchukEvent.java | 169 --- .../physicalevents/WiimoteButtonsEvent.java | 267 ---- .../wiiusejevents/utils/EventsGatherer.java | 355 ----- .../utils/WiiUseApiListener.java | 37 - .../wiiusejevents/utils/WiimoteListener.java | 107 -- .../wiiuseapievents/DisconnectionEvent.java | 45 - .../wiiuseapievents/NunchukInsertedEvent.java | 51 - .../wiiuseapievents/NunchukRemovedEvent.java | 50 - .../wiiuseapievents/StatusEvent.java | 293 ---- .../wiiuseapievents/WiiUseApiEvent.java | 66 - .../wiiuseapievents/WiimoteEvent.java | 345 ----- WiiUseJ_0.12/wiiuse.dll | Bin 114688 -> 0 bytes tag1/WiiUseJ/.classpath | 6 - tag1/WiiUseJ/.project | 17 - tag1/WiiUseJ/libWiiuseJ.dll | Bin 23146 -> 0 bytes tag1/WiiUseJ/src/tests/LedsTask.java | 30 - tag1/WiiUseJ/src/tests/Tests.java | 388 ----- tag1/WiiUseJ/src/wiiusej/GForce.java | 81 - tag1/WiiUseJ/src/wiiusej/LedsRequest.java | 109 -- .../src/wiiusej/OrientThresholdRequest.java | 54 - tag1/WiiUseJ/src/wiiusej/Orientation.java | 77 - tag1/WiiUseJ/src/wiiusej/Point2DInteger.java | 35 - tag1/WiiUseJ/src/wiiusej/WiiMoteEvent.java | 624 -------- tag1/WiiUseJ/src/wiiusej/WiiUseApi.java | 174 --- .../src/wiiusej/WiiUseApiListener.java | 9 - .../WiiUseJ/src/wiiusej/WiiUseApiManager.java | 430 ------ .../WiiUseJ/src/wiiusej/WiiUseApiRequest.java | 82 - tag1/WiiUseJ/src/wiiusej/Wiimote.java | 191 --- tag1/WiiUseJ/src/wiiusej/WiimoteListener.java | 8 - tag1/WiiUseJ/wiiuse.dll | Bin 114688 -> 0 bytes tag1/WiiUseJC/.cproject | 648 -------- tag1/WiiUseJC/.project | 69 - tag1/WiiUseJC/wiiuse.c | 168 --- tag1/WiiUseJC/wiiuse.h | 687 --------- tag1/WiiUseJC/wiiusej_WiiUseApi.c | 462 ------ tag1/WiiUseJC/wiiusej_WiiUseApi.def | 19 - tag1/WiiUseJC/wiiusej_WiiUseApi.h | 157 -- 228 files changed, 39160 deletions(-) delete mode 100644 WiiUseJC_0.1/.cproject delete mode 100644 WiiUseJC_0.1/.project delete mode 100644 WiiUseJC_0.1/lib/wiiuse.lib delete mode 100644 WiiUseJC_0.1/wiiuse.h delete mode 100644 WiiUseJC_0.1/wiiusej_WiiUseApi.c delete mode 100644 WiiUseJC_0.1/wiiusej_WiiUseApi.def delete mode 100644 WiiUseJC_0.1/wiiusej_WiiUseApi.h delete mode 100644 WiiUseJC_0.11/.cproject delete mode 100644 WiiUseJC_0.11/.project delete mode 100644 WiiUseJC_0.11/lib/wiiuse.lib delete mode 100644 WiiUseJC_0.11/wiiuse.h delete mode 100644 WiiUseJC_0.11/wiiusej_WiiUseApi.c delete mode 100644 WiiUseJC_0.11/wiiusej_WiiUseApi.def delete mode 100644 WiiUseJC_0.11/wiiusej_WiiUseApi.h delete mode 100644 WiiUseJC_0.11ThreadReqeuests/.cproject delete mode 100644 WiiUseJC_0.11ThreadReqeuests/.project delete mode 100644 WiiUseJC_0.11ThreadReqeuests/lib/wiiuse.lib delete mode 100644 WiiUseJC_0.11ThreadReqeuests/wiiuse.h delete mode 100644 WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.c delete mode 100644 WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.def delete mode 100644 WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.h delete mode 100644 WiiUseJC_0.12/.cproject delete mode 100644 WiiUseJC_0.12/.project delete mode 100644 WiiUseJC_0.12/lib/wiiuse.lib delete mode 100644 WiiUseJC_0.12/wiiuse.h delete mode 100644 WiiUseJC_0.12/wiiusej_WiiUseApi.c delete mode 100644 WiiUseJC_0.12/wiiusej_WiiUseApi.def delete mode 100644 WiiUseJC_0.12/wiiusej_WiiUseApi.h delete mode 100644 WiiUseJ_0.1/.classpath delete mode 100644 WiiUseJ_0.1/.project delete mode 100644 WiiUseJ_0.1/README.TXT delete mode 100644 WiiUseJ_0.1/img/wiimote.png delete mode 100644 WiiUseJ_0.1/libWiiuseJ.dll delete mode 100644 WiiUseJ_0.1/src/img/wiimote.png delete mode 100644 WiiUseJ_0.1/src/wiiusej/WiiUseApi.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/WiiUseApiManager.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/Wiimote.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/test/CloseGuiTestCleanly.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/test/Main.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/test/Tests.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/test/WiiuseJGuiTest.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/utils/AccelerationPanel.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/utils/ButtonsEventPanel.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/utils/GForcePanel.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/utils/IRPanel.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/utils/OrientationPanel.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/values/GForce.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/values/IRSource.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/values/Orientation.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/values/RawAcceleration.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/ButtonsEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/DisconnectionEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/EventsGatherer.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/GenericEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/IREvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/MotionSensingEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/StatusEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiListener.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteEvent.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteListener.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/FloatValueRequest.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/IntValueRequest.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/LedsRequest.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java delete mode 100644 WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java delete mode 100644 WiiUseJ_0.1/wiiuse.dll delete mode 100644 WiiUseJ_0.11/.classpath delete mode 100644 WiiUseJ_0.11/.project delete mode 100644 WiiUseJ_0.11/README.TXT delete mode 100644 WiiUseJ_0.11/WiiUseJ.dll delete mode 100644 WiiUseJ_0.11/img/wiimote.png delete mode 100644 WiiUseJ_0.11/libWiiuseJ.so delete mode 100644 WiiUseJ_0.11/libwiiuse.so delete mode 100644 WiiUseJ_0.11/src/img/wiimote.png delete mode 100644 WiiUseJ_0.11/src/wiiusej/WiiUseApi.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/WiiUseApiManager.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/Wiimote.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/test/CloseGuiTestCleanly.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/test/Main.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/test/Tests.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/test/WiiuseJGuiTest.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/utils/AccelerationPanel.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/utils/ButtonsEventPanel.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/utils/GForcePanel.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/utils/IRPanel.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/utils/OrientationPanel.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/values/GForce.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/values/IRSource.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/values/Orientation.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/values/RawAcceleration.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/ButtonsEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/DisconnectionEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/EventsGatherer.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/GenericEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/IREvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/MotionSensingEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/StatusEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiListener.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteEvent.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteListener.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/FloatValueRequest.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/IntValueRequest.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/LedsRequest.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java delete mode 100644 WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java delete mode 100644 WiiUseJ_0.11/wiiuse.dll delete mode 100644 WiiUseJ_0.11ThreadReqeuests/.classpath delete mode 100644 WiiUseJ_0.11ThreadReqeuests/.project delete mode 100644 WiiUseJ_0.11ThreadReqeuests/README.TXT delete mode 100644 WiiUseJ_0.11ThreadReqeuests/WiiUseJ.dll delete mode 100644 WiiUseJ_0.11ThreadReqeuests/img/wiimote.png delete mode 100644 WiiUseJ_0.11ThreadReqeuests/libWiiuseJ.so delete mode 100644 WiiUseJ_0.11ThreadReqeuests/libwiiuse.so delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/img/wiimote.png delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApi.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiManager.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiRequestsManager.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/Wiimote.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/CloseGuiTestCleanly.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Main.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Tests.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/WiiuseJGuiTest.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/AccelerationPanel.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/ButtonsEventPanel.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/GForcePanel.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/IRPanel.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/OrientationPanel.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/GForce.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/IRSource.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/Orientation.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/RawAcceleration.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/ButtonsEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/DisconnectionEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/EventsGatherer.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/GenericEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/IREvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/MotionSensingEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/StatusEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiListener.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteEvent.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteListener.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/FloatValueRequest.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/IntValueRequest.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/LedsRequest.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java delete mode 100644 WiiUseJ_0.11ThreadReqeuests/wiiuse.dll delete mode 100644 WiiUseJ_0.12/.classpath delete mode 100644 WiiUseJ_0.12/.project delete mode 100644 WiiUseJ_0.12/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 WiiUseJ_0.12/README.TXT delete mode 100644 WiiUseJ_0.12/WiiUseJ.dll delete mode 100644 WiiUseJ_0.12/img/wiimote.png delete mode 100644 WiiUseJ_0.12/libWiiuseJ.so delete mode 100644 WiiUseJ_0.12/libwiiuse.so delete mode 100644 WiiUseJ_0.12/src/img/wiimote.png delete mode 100644 WiiUseJ_0.12/src/wiiusej/WiiUseApi.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/WiiUseApiManager.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/Wiimote.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/test/CloseGuiTestCleanly.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/test/Main.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/test/NunchukGuiTest.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/test/Tests.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/test/WiiuseJGuiTest.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/AccelerationExpansionEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/AccelerationPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/AccelerationWiimoteEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/ButtonsEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/GForceExpansionEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/GForcePanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/GForceWiimoteEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/IRPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/JoystickEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/NunchukJoystickEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/OrientationExpansionEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/OrientationPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/utils/OrientationWiimoteEventPanel.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/values/GForce.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/values/IRSource.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/values/Orientation.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/values/RawAcceleration.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/GenericEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ButtonsEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ExpansionEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/IREvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/JoystickEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/MotionSensingEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukButtonsEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/WiimoteButtonsEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/EventsGatherer.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiiUseApiListener.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiimoteListener.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/DisconnectionEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukInsertedEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukRemovedEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/StatusEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiiUseApiEvent.java delete mode 100644 WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiimoteEvent.java delete mode 100644 WiiUseJ_0.12/wiiuse.dll delete mode 100644 tag1/WiiUseJ/.classpath delete mode 100644 tag1/WiiUseJ/.project delete mode 100644 tag1/WiiUseJ/libWiiuseJ.dll delete mode 100644 tag1/WiiUseJ/src/tests/LedsTask.java delete mode 100644 tag1/WiiUseJ/src/tests/Tests.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/GForce.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/LedsRequest.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/OrientThresholdRequest.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/Orientation.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/Point2DInteger.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/WiiMoteEvent.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/WiiUseApi.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/WiiUseApiListener.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/WiiUseApiManager.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/WiiUseApiRequest.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/Wiimote.java delete mode 100644 tag1/WiiUseJ/src/wiiusej/WiimoteListener.java delete mode 100644 tag1/WiiUseJ/wiiuse.dll delete mode 100644 tag1/WiiUseJC/.cproject delete mode 100644 tag1/WiiUseJC/.project delete mode 100644 tag1/WiiUseJC/wiiuse.c delete mode 100644 tag1/WiiUseJC/wiiuse.h delete mode 100644 tag1/WiiUseJC/wiiusej_WiiUseApi.c delete mode 100644 tag1/WiiUseJC/wiiusej_WiiUseApi.def delete mode 100644 tag1/WiiUseJC/wiiusej_WiiUseApi.h diff --git a/WiiUseJC_0.1/.cproject b/WiiUseJC_0.1/.cproject deleted file mode 100644 index c46ae82..0000000 --- a/WiiUseJC_0.1/.cproject +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - - - diff --git a/WiiUseJC_0.1/.project b/WiiUseJC_0.1/.project deleted file mode 100644 index 0f99eae..0000000 --- a/WiiUseJC_0.1/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - WiiUseJavaC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/WiiUseJavaC/Debug} - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.append_environment - true - - - ?name? - - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.cnature - - diff --git a/WiiUseJC_0.1/lib/wiiuse.lib b/WiiUseJC_0.1/lib/wiiuse.lib deleted file mode 100644 index c9973964982e8c8a9000fc37f557b7d924a6dcd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7956 zcmcIoOK%iM5H7F7%h>q+ey}7KkPFym*I<+&lMuxS^N=wY4h-wvv3JCHXSFkH1UW=P z9CPLeAcYfBBo0WqAw@zQ$RS9%a6sY@aNrM+s_E|O?s<8ZB_q{LcXf4tUES4H)pO*# zQlnfw*L5Rs#oJu~@I64!bAaA=0R2M%!><_)O#u)M zykRtW4uEKUh0(-O0HX0{j7C2I5KTVdl*2F5%vnYQn>Y^A&__mtPjNh?p@)pd-U1L! z-Dfnmfpw%Q9D`_dhtbGm0HP_xA{y;xH2n&IXyOs0>04Mwnt8%#_$KOwG*TckjEk4A zU0qu@F8p-;$F+;s)~~J^cP*>wnqU}LZmh0G+u>Ixz?#=rZd|!!TsXge9y?gub%S>| z>W*!LUeVe&ty(2$XBDlz?9^&z*$YI1x+Ybz+@OI^OJ!-YuIU+8BN$LrV`Pk-hUta` zIWJDS?zom`Ikj*P$&d6Zxph>|Xq2#@)=h7S^s6;%<{4fUCt7uExss$+ zvQXl9rE=M{cNs1sqm8y>He7WLg1RPEw#`zlSr1eW>Y9{Qv*gCJiqoUSJx|*?`T~k zZIRxodmn9#^pET#KR7h;NSoFhjqP5o986bKH5nSkv$jpADYsDLY0{16_J)nVhEG9M zH5t#@+OkbUv~kf8SL;D|wpr0Pkuh{RujDlqDPGlN?lvsXG%6)e?y$N9%FIZv=Mgq5Wa*K+ad$(?%aeraMAX zQ%Gj;xEVxti5P)L)%A#TSZR(iJ}9gHjC@pyqshyL0QZ46x-&*YJom% z&s;`JBo!Ox&BA&`RSzh!7RyDWwyHEltW;@>CJ2$VQn5*;Bid>tvy8+kVOJ3gR0a|< zQNvP%QX6%9Q+frKCU|;`3|SW!3hav46^lx`EilOw729S}ZnxW7VM$!$Zg;JAbiyC* zUq2u00E`{}({Z9=ZZx-Mud^z^c`W=UD*U?)eLtMAD3;GIh$akg@Hf(X&gjJNGR(c; za*LdekqO`vl8__*GUQ+6@Y|2ki=Hm2)NvT>+lMR~jvkukv6lmvt#ZS0olP%)eC^x( z>cuOU{MPV`z^EsU02nT*)Q9gqeo3O>6w1za9p`%NcJjaMf0kXvTnkq^;f^j%B;%@`KF$A%$kX*N z0_{#6~$~e@#jX%c32P#ny0@@bTn5x z$Y)`SjnDodY>G%LcT9C7*>*1tt3$=&QM?_j;CO}f!n7Z)Md~Hf0Z`y%F`H(^1@Z4r zU&TD4b;hD$@*zQ#Vm7=&As!DeKIn#}c79&d4$e|M4jt+}3XV*f6tLE9F-5Dr3Ywpe zDL}HAZS{%?IA5by`xKl|rYB*(=zi^25d9>w9h{W?I-ual{8RyJeZTlEJ|8+`c*Vw> zva~{;`zlbfm~F=jDM$xZB$igo;alFRV!{d@L!G)6q_~V-fo*v$iwPReB5qF@SG~C^ zpt6{4Rnv4m6v7N&G$ht%#DRo0Ca=;P!ey73w$Kt*maMcdgoYO+1xgk(u4ggcTYiH` z{ShR2_mViRuVqnOH$rES65xR-rhl(%2d{7@UPnqw=nt9rMM~$xzcVUevY2f>7ZY-m zlZZ7G!V*`_@O4yTw!XHD3A)Z9{%`_* - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * This file is part of wiiuse. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * $Header$ - * - */ - -/** - * @file - * - * @brief API header file. - * - * If this file is included from inside the wiiuse source - * and not from a third party program, then wiimote_internal.h - * is also included which extends this file. - */ - -#ifndef WIIUSE_H_INCLUDED -#define WIIUSE_H_INCLUDED - -#ifdef _WIN32 - /* windows */ - #include -#else - /* nix */ - #include -#endif - -#ifdef WIIUSE_INTERNAL_H_INCLUDED - #define WCONST -#else - #define WCONST const -#endif - -/* led bit masks */ -#define WIIMOTE_LED_NONE 0x00 -#define WIIMOTE_LED_1 0x10 -#define WIIMOTE_LED_2 0x20 -#define WIIMOTE_LED_3 0x40 -#define WIIMOTE_LED_4 0x80 - -/* button codes */ -#define WIIMOTE_BUTTON_TWO 0x0001 -#define WIIMOTE_BUTTON_ONE 0x0002 -#define WIIMOTE_BUTTON_B 0x0004 -#define WIIMOTE_BUTTON_A 0x0008 -#define WIIMOTE_BUTTON_MINUS 0x0010 -#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020 -#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040 -#define WIIMOTE_BUTTON_HOME 0x0080 -#define WIIMOTE_BUTTON_LEFT 0x0100 -#define WIIMOTE_BUTTON_RIGHT 0x0200 -#define WIIMOTE_BUTTON_DOWN 0x0400 -#define WIIMOTE_BUTTON_UP 0x0800 -#define WIIMOTE_BUTTON_PLUS 0x1000 -#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000 -#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000 -#define WIIMOTE_BUTTON_UNKNOWN 0x8000 -#define WIIMOTE_BUTTON_ALL 0x1F9F - -/* nunchul button codes */ -#define NUNCHUK_BUTTON_Z 0x01 -#define NUNCHUK_BUTTON_C 0x02 -#define NUNCHUK_BUTTON_ALL 0x03 - -/* classic controller button codes */ -#define CLASSIC_CTRL_BUTTON_UP 0x0001 -#define CLASSIC_CTRL_BUTTON_LEFT 0x0002 -#define CLASSIC_CTRL_BUTTON_ZR 0x0004 -#define CLASSIC_CTRL_BUTTON_X 0x0008 -#define CLASSIC_CTRL_BUTTON_A 0x0010 -#define CLASSIC_CTRL_BUTTON_Y 0x0020 -#define CLASSIC_CTRL_BUTTON_B 0x0040 -#define CLASSIC_CTRL_BUTTON_ZL 0x0080 -#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200 -#define CLASSIC_CTRL_BUTTON_PLUS 0x0400 -#define CLASSIC_CTRL_BUTTON_HOME 0x0800 -#define CLASSIC_CTRL_BUTTON_MINUS 0x1000 -#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000 -#define CLASSIC_CTRL_BUTTON_DOWN 0x4000 -#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000 -#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF - -/* guitar hero 3 button codes */ -#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001 -#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008 -#define GUITAR_HERO_3_BUTTON_GREEN 0x0010 -#define GUITAR_HERO_3_BUTTON_BLUE 0x0020 -#define GUITAR_HERO_3_BUTTON_RED 0x0040 -#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080 -#define GUITAR_HERO_3_BUTTON_PLUS 0x0400 -#define GUITAR_HERO_3_BUTTON_MINUS 0x1000 -#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000 -#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF - - -/* wiimote option flags */ -#define WIIUSE_SMOOTHING 0x01 -#define WIIUSE_CONTINUOUS 0x02 -#define WIIUSE_ORIENT_THRESH 0x04 -#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH) - -#define WIIUSE_ORIENT_PRECISION 100.0f - -/* expansion codes */ -#define EXP_NONE 0 -#define EXP_NUNCHUK 1 -#define EXP_CLASSIC 2 -#define EXP_GUITAR_HERO_3 3 - -/* IR correction types */ -typedef enum ir_position_t { - WIIUSE_IR_ABOVE, - WIIUSE_IR_BELOW -} ir_position_t; - -/** - * @brief Check if a button is pressed. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_PRESSED(dev, button) ((dev->btns & button) == button) - -/** - * @brief Check if a button is being held. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is held, 0 if not. - */ -#define IS_HELD(dev, button) ((dev->btns_held & button) == button) - -/** - * @brief Check if a button is released on this event. \n\n - * This does not mean the button is not pressed, it means \n - * this button was just now released. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is released, 0 if not. - * - */ -#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button) - -/** - * @brief Check if a button has just been pressed this event. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button)) - -#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020) -#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040) -#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080) -#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100) - -#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num) - -/* - * Largest known payload is 21 bytes. - * Add 2 for the prefix and round up to a power of 2. - */ -#define MAX_PAYLOAD 32 - -/* - * This is left over from an old hack, but it may actually - * be a useful feature to keep so it wasn't removed. - */ -#ifdef WIN32 - #define WIIMOTE_DEFAULT_TIMEOUT 10 - #define WIIMOTE_EXP_TIMEOUT 10 -#endif - -typedef unsigned char byte; -typedef char sbyte; - -struct wiimote_t; -struct vec3b_t; -struct orient_t; -struct gforce_t; - - -/** - * @brief Callback that handles a read event. - * - * @param wm Pointer to a wiimote_t structure. - * @param data Pointer to the filled data block. - * @param len Length in bytes of the data block. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when the wiimote has returned the full data requested by a previous - * call to wiiuse_read_data(). - */ -typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len); - - -/** - * @struct read_req_t - * @brief Data read request structure. - */ -struct read_req_t { - wiiuse_read_cb cb; /**< read data callback */ - byte* buf; /**< buffer where read data is written */ - unsigned int addr; /**< the offset that the read started at */ - unsigned short size; /**< the length of the data read */ - unsigned short wait; /**< num bytes still needed to finish read */ - - struct read_req_t* next; /**< next read request in the queue */ -}; - - -/** - * @struct vec2b_t - * @brief Unsigned x,y byte vector. - */ -typedef struct vec2b_t { - byte x, y; -} vec2b_t; - - -/** - * @struct vec3b_t - * @brief Unsigned x,y,z byte vector. - */ -typedef struct vec3b_t { - byte x, y, z; -} vec3b_t; - - -/** - * @struct vec3f_t - * @brief Signed x,y,z float struct. - */ -typedef struct vec3f_t { - float x, y, z; -} vec3f_t; - - -/** - * @struct orient_t - * @brief Orientation struct. - * - * Yaw, pitch, and roll range from -180 to 180 degrees. - */ -typedef struct orient_t { - float roll; /**< roll, this may be smoothed if enabled */ - float pitch; /**< pitch, this may be smoothed if enabled */ - float yaw; - - float a_roll; /**< absolute roll, unsmoothed */ - float a_pitch; /**< absolute pitch, unsmoothed */ -} orient_t; - - -/** - * @struct gforce_t - * @brief Gravity force struct. - */ -typedef struct gforce_t { - float x, y, z; -} gforce_t; - - -/** - * @struct accel_t - * @brief Accelerometer struct. For any device with an accelerometer. - */ -typedef struct accel_t { - struct vec3b_t cal_zero; /**< zero calibration */ - struct vec3b_t cal_g; /**< 1g difference around 0cal */ - - float st_roll; /**< last smoothed roll value */ - float st_pitch; /**< last smoothed roll pitch */ - float st_alpha; /**< alpha value for smoothing [0-1] */ -} accel_t; - - -/** - * @struct ir_dot_t - * @brief A single IR source. - */ -typedef struct ir_dot_t { - byte visible; /**< if the IR source is visible */ - - unsigned int x; /**< interpolated X coordinate */ - unsigned int y; /**< interpolated Y coordinate */ - - short rx; /**< raw X coordinate (0-1023) */ - short ry; /**< raw Y coordinate (0-767) */ - - byte order; /**< increasing order by x-axis value */ - - byte size; /**< size of the IR dot (0-15) */ -} ir_dot_t; - - -/** - * @enum aspect_t - * @brief Screen aspect ratio. - */ -typedef enum aspect_t { - WIIUSE_ASPECT_4_3, - WIIUSE_ASPECT_16_9 -} aspect_t; - - -/** - * @struct ir_t - * @brief IR struct. Hold all data related to the IR tracking. - */ -typedef struct ir_t { - struct ir_dot_t dot[4]; /**< IR dots */ - byte num_dots; /**< number of dots at this time */ - - enum aspect_t aspect; /**< aspect ratio of the screen */ - - enum ir_position_t pos; /**< IR sensor bar position */ - - unsigned int vres[2]; /**< IR virtual screen resolution */ - int offset[2]; /**< IR XY correction offset */ - int state; /**< keeps track of the IR state */ - - int ax; /**< absolute X coordinate */ - int ay; /**< absolute Y coordinate */ - - int x; /**< calculated X coordinate */ - int y; /**< calculated Y coordinate */ - - float distance; /**< pixel distance between first 2 dots*/ - float z; /**< calculated distance */ -} ir_t; - - -/** - * @struct joystick_t - * @brief Joystick calibration structure. - * - * The angle \a ang is relative to the positive y-axis into quadrant I - * and ranges from 0 to 360 degrees. So if the joystick is held straight - * upwards then angle is 0 degrees. If it is held to the right it is 90, - * down is 180, and left is 270. - * - * The magnitude \a mag is the distance from the center to where the - * joystick is being held. The magnitude ranges from 0 to 1. - * If the joystick is only slightly tilted from the center the magnitude - * will be low, but if it is closer to the outter edge the value will - * be higher. - */ -typedef struct joystick_t { - struct vec2b_t max; /**< maximum joystick values */ - struct vec2b_t min; /**< minimum joystick values */ - struct vec2b_t center; /**< center joystick values */ - - float ang; /**< angle the joystick is being held */ - float mag; /**< magnitude of the joystick (range 0-1) */ -} joystick_t; - - -/** - * @struct nunchuk_t - * @brief Nunchuk expansion device. - */ -typedef struct nunchuk_t { - struct accel_t accel_calib; /**< nunchuk accelerometer calibration */ - struct joystick_t js; /**< joystick calibration */ - - int* flags; /**< options flag (points to wiimote_t.flags) */ - - byte btns; /**< what buttons have just been pressed */ - byte btns_held; /**< what buttons are being held down */ - byte btns_released; /**< what buttons were just released this */ - - float orient_threshold; /**< threshold for orient to generate an event */ - int accel_threshold; /**< threshold for accel to generate an event */ - - struct vec3b_t accel; /**< current raw acceleration data */ - struct orient_t orient; /**< current orientation on each axis */ - struct gforce_t gforce; /**< current gravity forces on each axis */ -} nunchuk_t; - - -/** - * @struct classic_ctrl_t - * @brief Classic controller expansion device. - */ -typedef struct classic_ctrl_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float r_shoulder; /**< right shoulder button (range 0-1) */ - float l_shoulder; /**< left shoulder button (range 0-1) */ - - struct joystick_t ljs; /**< left joystick calibration */ - struct joystick_t rjs; /**< right joystick calibration */ -} classic_ctrl_t; - - -/** - * @struct guitar_hero_3_t - * @brief Guitar Hero 3 expansion device. - */ -typedef struct guitar_hero_3_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float whammy_bar; /**< whammy bar (range 0-1) */ - - struct joystick_t js; /**< joystick calibration */ -} guitar_hero_3_t; - - -/** - * @struct expansion_t - * @brief Generic expansion device plugged into wiimote. - */ -typedef struct expansion_t { - int type; /**< type of expansion attached */ - - union { - struct nunchuk_t nunchuk; - struct classic_ctrl_t classic; - struct guitar_hero_3_t gh3; - }; -} expansion_t; - - -/** - * @enum win32_bt_stack_t - * @brief Available bluetooth stacks for Windows. - */ -typedef enum win_bt_stack_t { - WIIUSE_STACK_UNKNOWN, - WIIUSE_STACK_MS, - WIIUSE_STACK_BLUESOLEIL -} win_bt_stack_t; - - -/** - * @struct wiimote_state_t - * @brief Significant data from the previous event. - */ -typedef struct wiimote_state_t { - /* expansion_t */ - float exp_ljs_ang; - float exp_rjs_ang; - float exp_ljs_mag; - float exp_rjs_mag; - unsigned short exp_btns; - struct orient_t exp_orient; - struct vec3b_t exp_accel; - float exp_r_shoulder; - float exp_l_shoulder; - - /* ir_t */ - int ir_ax; - int ir_ay; - float ir_distance; - - struct orient_t orient; - unsigned short btns; - - struct vec3b_t accel; -} wiimote_state_t; - - -/** - * @enum WIIUSE_EVENT_TYPE - * @brief Events that wiiuse can generate from a poll. - */ -typedef enum WIIUSE_EVENT_TYPE { - WIIUSE_NONE = 0, - WIIUSE_EVENT, - WIIUSE_STATUS, - WIIUSE_DISCONNECT, - WIIUSE_NUNCHUK_INSERTED, - WIIUSE_NUNCHUK_REMOVED, - WIIUSE_CLASSIC_CTRL_INSERTED, - WIIUSE_CLASSIC_CTRL_REMOVED, - WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED -} WIIUSE_EVENT_TYPE; - -/** - * @struct wiimote_t - * @brief Wiimote structure. - */ -typedef struct wiimote_t { - WCONST int unid; /**< user specified id */ - - #ifndef WIN32 - WCONST bdaddr_t bdaddr; /**< bt address */ - WCONST char bdaddr_str[18]; /**< readable bt address */ - WCONST int out_sock; /**< output socket */ - WCONST int in_sock; /**< input socket */ - #else - WCONST HANDLE dev_handle; /**< HID handle */ - WCONST OVERLAPPED hid_overlap; /**< overlap handle */ - WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */ - WCONST int timeout; /**< read timeout */ - WCONST byte normal_timeout; /**< normal timeout */ - WCONST byte exp_timeout; /**< timeout for expansion handshake */ - #endif - - WCONST int state; /**< various state flags */ - WCONST byte leds; /**< currently lit leds */ - WCONST float battery_level; /**< battery level */ - - WCONST int flags; /**< options flag */ - - WCONST byte handshake_state; /**< the state of the connection handshake */ - - WCONST struct read_req_t* read_req; /**< list of data read requests */ - WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */ - WCONST struct expansion_t exp; /**< wiimote expansion device */ - - WCONST struct vec3b_t accel; /**< current raw acceleration data */ - WCONST struct orient_t orient; /**< current orientation on each axis */ - WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ - - WCONST struct ir_t ir; /**< IR data */ - - WCONST unsigned short btns; /**< what buttons have just been pressed */ - WCONST unsigned short btns_held; /**< what buttons are being held down */ - WCONST unsigned short btns_released; /**< what buttons were just released this */ - - WCONST float orient_threshold; /**< threshold for orient to generate an event */ - WCONST int accel_threshold; /**< threshold for accel to generate an event */ - - WCONST struct wiimote_state_t lstate; /**< last saved state */ - - WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */ - WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */ -} wiimote; - - -/***************************************** - * - * Include API specific stuff - * - *****************************************/ - -#ifdef _WIN32 - #define WIIUSE_EXPORT_DECL __declspec(dllexport) - #define WIIUSE_IMPORT_DECL __declspec(dllimport) -#else - #define WIIUSE_EXPORT_DECL - #define WIIUSE_IMPORT_DECL -#endif - -#ifdef WIIUSE_COMPILE_LIB - #define WIIUSE_EXPORT WIIUSE_EXPORT_DECL -#else - #define WIIUSE_EXPORT WIIUSE_IMPORT_DECL -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* wiiuse.c */ -WIIUSE_EXPORT extern const char* wiiuse_version(); - -WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnected(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_cleanup(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_rumble(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_toggle_rumble(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds); -WIIUSE_EXPORT extern void wiiuse_motion_sensing(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern int wiiuse_read_data(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len); -WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len); -WIIUSE_EXPORT extern void wiiuse_status(struct wiimote_t* wm); -WIIUSE_EXPORT extern struct wiimote_t* wiiuse_get_by_id(struct wiimote_t** wm, int wiimotes, int unid); -WIIUSE_EXPORT extern int wiiuse_set_flags(struct wiimote_t* wm, int enable, int disable); -WIIUSE_EXPORT extern float wiiuse_set_smooth_alpha(struct wiimote_t* wm, float alpha); -WIIUSE_EXPORT extern void wiiuse_set_bluetooth_stack(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type); -WIIUSE_EXPORT extern void wiiuse_set_orient_threshold(struct wiimote_t* wm, float threshold); -WIIUSE_EXPORT extern void wiiuse_resync(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout); -WIIUSE_EXPORT extern void wiiuse_set_accel_threshold(struct wiimote_t* wm, int threshold); - -/* connect.c */ -WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm); - -/* events.c */ -WIIUSE_EXPORT extern int wiiuse_poll(struct wiimote_t** wm, int wiimotes); - -/* ir.c */ -WIIUSE_EXPORT extern void wiiuse_set_ir(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_set_ir_vres(struct wiimote_t* wm, unsigned int x, unsigned int y); -WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos); -WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect); - -/* nunchuk.c */ -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_orient_threshold(struct nunchuk_t* nc, float threshold); -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct nunchuk_t* nc, int threshold); - - -#ifdef __cplusplus -} -#endif - - -#endif /* WIIUSE_H_INCLUDED */ - diff --git a/WiiUseJC_0.1/wiiusej_WiiUseApi.c b/WiiUseJC_0.1/wiiusej_WiiUseApi.c deleted file mode 100644 index 40319fd..0000000 --- a/WiiUseJC_0.1/wiiusej_WiiUseApi.c +++ /dev/null @@ -1,476 +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 . - */ -#ifndef WIN32 -#include -#define WIIUSE_PATH "./wiiuse.so" -#else -#define WIIUSE_PATH "wiiuse.dll" -#endif - -#include "wiiusej_WiiUseApi.h" -#include "wiiuse.h" -/* - * These are some identifiers for wiimotes - * - * See below in main() for what they are used for. - */ -#define WIIMOTE_STATE_RUMBLE 0x08 -#define WIIMOTE_STATE_CONNECTED 0x04 -#define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s)) -#define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s)) - -/********************* VARIABLES DECLARATIONS *****************************/ - -/* - * Make a temp array of wiimote ids. - * Here I only anticipate connecting up to - * two wiimotes. Each wiimote connected - * will get one of these ids. - */ -static wiimote** wiimotes; - -static int nbMaxWiiMotes=0; - -/****************** GENERAL FUNCTIONS DEFINITIONS *************************/ - -/** - * Try to connect to 2 wiimotes. - * Make them rumble to show they are connected. - * @param nbConnects number of connections maximum. - * @return 0 if there is an error otherwise it returns - * the number of wiimotes connected.. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections -(JNIEnv *env, jobject obj, jint nbConnects) { - - /* variables declarations */ - int found, connected, i; - short leds; - - nbMaxWiiMotes = nbConnects; - - /* initialize wiimotes array with the maximum number of wiimotes */ - wiimotes = wiiuse_init(nbMaxWiiMotes); - - /* - * Find wiimote devices - * Now we need to find some wiimotes. - * Give the function the wiimote array we created, and tell it there - * are 2 wiimotes we are interested in. - * Set the timeout to be 5 seconds. - * This will return the number of actual wiimotes that are in discovery mode. - */ - found = wiiuse_find(wiimotes, nbMaxWiiMotes, 5); - if (!found) return 0; - - /* - * Connect to the wiimotes - * Now that we found some wiimotes, connect to them. - * Give the function the wiimote array and the number of wiimote devices we found. - * This will return the number of established connections to the found wiimotes. - */ - connected = wiiuse_connect(wiimotes, nbMaxWiiMotes); - if (!connected) return 0; - - //no problems during connection show that wiimotes are connected - - /* - * Now set the LEDs and rumble for a second so it's easy - * to tell which wiimotes are connected (just like the wii does). - */ - for (i=0;iGetObjectClass(env, gath); - jmethodID mid; - - if (wiiuse_poll(wiimotes, nbMaxWiiMotes)) { - /* - * This happens if something happened on any wiimote. - * So go through each one and check if anything happened. - */ - for (i=0; i < nbMaxWiiMotes; ++i) { - switch (wiimotes[i]->event) { - case WIIUSE_EVENT: - /* a generic event occured */ - mid = (*env)->GetMethodID(env, cls, "prepareWiiMoteEvent", "(ISSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid, wiimotes[i]->btns, - wiimotes[i]->btns_released, wiimotes[i]->btns_held); - /* - * If IR tracking is enabled then print the coordinates - * on the virtual screen that the wiimote is pointing to. - * - * Also make sure that we see at least 1 dot. - */ - if (WIIUSE_USING_IR(wiimotes[i])) { - int a = 0; - - mid = (*env)->GetMethodID(env, cls, "prepareIRevent", - "(IIIIIIIIISS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.x, wiimotes[i]->ir.y, wiimotes[i]->ir.z, - wiimotes[i]->ir.ax, wiimotes[i]->ir.ay, - wiimotes[i]->ir.vres[0], wiimotes[i]->ir.vres[1], - wiimotes[i]->ir.offset[0], wiimotes[i]->ir.offset[1], - wiimotes[i]->ir.pos, wiimotes[i]->ir.aspect); - - mid = (*env)->GetMethodID(env, cls, "addIRPointToPreparedWiiMoteEvent", - "(IISSS)V"); - if (mid == 0) { - return; - } - /* go through each of the 4 possible IR sources */ - for (; a < 4; a++) { - /* check if the source is visible */ - if (wiimotes[i]->ir.dot[a].visible) { - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.dot[a].x, wiimotes[i]->ir.dot[a].y, - wiimotes[i]->ir.dot[a].rx, wiimotes[i]->ir.dot[a].ry, - wiimotes[i]->ir.dot[a].size); - } - } - } - - /* Motion Sensing */ - if (WIIUSE_USING_ACC(wiimotes[i])) { - /* set orientation and gravity force */ - mid = (*env)->GetMethodID(env, cls, - "addMotionSensingValues", "(FIZFFFFFFFSSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->orient_threshold, wiimotes[i]->accel_threshold, - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_SMOOTHING), wiimotes[i]->accel_calib.st_alpha, - wiimotes[i]->orient.roll, wiimotes[i]->orient.pitch, wiimotes[i]->orient.yaw, - wiimotes[i]->gforce.x, wiimotes[i]->gforce.y, wiimotes[i]->gforce.z, - wiimotes[i]->accel.x, wiimotes[i]->accel.y, wiimotes[i]->accel.z); - } - - /* add generic event to java object used to gather events in c environment */ - mid = (*env)->GetMethodID(env, cls, "addWiimoteEvent", - "()V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid); - break; - - case WIIUSE_STATUS: - /* a status event occured */ - mid = (*env)->GetMethodID(env, cls, "addStatusEvent", "(IZFSZIZZZZ)V"); - if (mid == 0) { - return; - } - /* LEDS */ - if (WIIUSE_IS_LED_SET(wiimotes[i], 1)) leds += 1; - if (WIIUSE_IS_LED_SET(wiimotes[i], 2)) leds += 2; - if (WIIUSE_IS_LED_SET(wiimotes[i], 3)) leds += 4; - if (WIIUSE_IS_LED_SET(wiimotes[i], 4)) leds += 8; - - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->unid, WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_CONNECTED), - wiimotes[i]->battery_level, leds, WIIUSE_USING_SPEAKER(wiimotes[i]), - wiimotes[i]->exp.type,WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_RUMBLE), - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_CONTINUOUS), - WIIUSE_USING_IR(wiimotes[i]),WIIUSE_USING_ACC(wiimotes[i])); - break; - - case WIIUSE_DISCONNECT: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addDisconnectionEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - default: - break; - } - } - } -} diff --git a/WiiUseJC_0.1/wiiusej_WiiUseApi.def b/WiiUseJC_0.1/wiiusej_WiiUseApi.def deleted file mode 100644 index a83a234..0000000 --- a/WiiUseJC_0.1/wiiusej_WiiUseApi.def +++ /dev/null @@ -1,27 +0,0 @@ -EXPORTS -Java_wiiusej_WiiUseApi_doConnections -Java_wiiusej_WiiUseApi_closeConnection -Java_wiiusej_WiiUseApi_shutdownApi -Java_wiiusej_WiiUseApi_activateRumble -Java_wiiusej_WiiUseApi_deactivateRumble -Java_wiiusej_WiiUseApi_activateIRTracking -Java_wiiusej_WiiUseApi_deactivateIRTracking -Java_wiiusej_WiiUseApi_activateMotionSensing -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_setLeds -Java_wiiusej_WiiUseApi_setOrientThreshold -Java_wiiusej_WiiUseApi_setAccelThreshold -Java_wiiusej_WiiUseApi_setAlphaSmoothing -Java_wiiusej_WiiUseApi_reSync -Java_wiiusej_WiiUseApi_activateSmoothing -Java_wiiusej_WiiUseApi_deactivateSmoothing -Java_wiiusej_WiiUseApi_activateContinuous -Java_wiiusej_WiiUseApi_deactivateContinuous -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_getStatus -Java_wiiusej_WiiUseApi_specialPoll -Java_wiiusej_WiiUseApi_setScreenRatio43 -Java_wiiusej_WiiUseApi_setScreenRatio169 -Java_wiiusej_WiiUseApi_setSensorBarAboveScreen -Java_wiiusej_WiiUseApi_setSensorBarBelowScreen -Java_wiiusej_WiiUseApi_setVirtualScreenResolution diff --git a/WiiUseJC_0.1/wiiusej_WiiUseApi.h b/WiiUseJC_0.1/wiiusej_WiiUseApi.h deleted file mode 100644 index fdf22a6..0000000 --- a/WiiUseJC_0.1/wiiusej_WiiUseApi.h +++ /dev/null @@ -1,213 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class wiiusej_WiiUseApi */ - -#ifndef _Included_wiiusej_WiiUseApi -#define _Included_wiiusej_WiiUseApi -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: wiiusej_WiiUseApi - * Method: doConnections - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: closeConnection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: shutdownApi - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setLeds - * Signature: (IZZZZ)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds - (JNIEnv *, jobject, jint, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: setOrientThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAccelThreshold - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAccelThreshold - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAlphaSmoothing - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAlphaSmoothing - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: reSync - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_reSync - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio43 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio43 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio169 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio169 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarAboveScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarAboveScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarBelowScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarBelowScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setVirtualScreenResolution - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setVirtualScreenResolution - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getStatus - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: specialPoll - * Signature: (Lwiiusej/wiiuseapievents/EventsGatherer;)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/WiiUseJC_0.11/.cproject b/WiiUseJC_0.11/.cproject deleted file mode 100644 index 1ca9232..0000000 --- a/WiiUseJC_0.11/.cproject +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - - - diff --git a/WiiUseJC_0.11/.project b/WiiUseJC_0.11/.project deleted file mode 100644 index 0f99eae..0000000 --- a/WiiUseJC_0.11/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - WiiUseJavaC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/WiiUseJavaC/Debug} - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.append_environment - true - - - ?name? - - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.cnature - - diff --git a/WiiUseJC_0.11/lib/wiiuse.lib b/WiiUseJC_0.11/lib/wiiuse.lib deleted file mode 100644 index c9973964982e8c8a9000fc37f557b7d924a6dcd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7956 zcmcIoOK%iM5H7F7%h>q+ey}7KkPFym*I<+&lMuxS^N=wY4h-wvv3JCHXSFkH1UW=P z9CPLeAcYfBBo0WqAw@zQ$RS9%a6sY@aNrM+s_E|O?s<8ZB_q{LcXf4tUES4H)pO*# zQlnfw*L5Rs#oJu~@I64!bAaA=0R2M%!><_)O#u)M zykRtW4uEKUh0(-O0HX0{j7C2I5KTVdl*2F5%vnYQn>Y^A&__mtPjNh?p@)pd-U1L! z-Dfnmfpw%Q9D`_dhtbGm0HP_xA{y;xH2n&IXyOs0>04Mwnt8%#_$KOwG*TckjEk4A zU0qu@F8p-;$F+;s)~~J^cP*>wnqU}LZmh0G+u>Ixz?#=rZd|!!TsXge9y?gub%S>| z>W*!LUeVe&ty(2$XBDlz?9^&z*$YI1x+Ybz+@OI^OJ!-YuIU+8BN$LrV`Pk-hUta` zIWJDS?zom`Ikj*P$&d6Zxph>|Xq2#@)=h7S^s6;%<{4fUCt7uExss$+ zvQXl9rE=M{cNs1sqm8y>He7WLg1RPEw#`zlSr1eW>Y9{Qv*gCJiqoUSJx|*?`T~k zZIRxodmn9#^pET#KR7h;NSoFhjqP5o986bKH5nSkv$jpADYsDLY0{16_J)nVhEG9M zH5t#@+OkbUv~kf8SL;D|wpr0Pkuh{RujDlqDPGlN?lvsXG%6)e?y$N9%FIZv=Mgq5Wa*K+ad$(?%aeraMAX zQ%Gj;xEVxti5P)L)%A#TSZR(iJ}9gHjC@pyqshyL0QZ46x-&*YJom% z&s;`JBo!Ox&BA&`RSzh!7RyDWwyHEltW;@>CJ2$VQn5*;Bid>tvy8+kVOJ3gR0a|< zQNvP%QX6%9Q+frKCU|;`3|SW!3hav46^lx`EilOw729S}ZnxW7VM$!$Zg;JAbiyC* zUq2u00E`{}({Z9=ZZx-Mud^z^c`W=UD*U?)eLtMAD3;GIh$akg@Hf(X&gjJNGR(c; za*LdekqO`vl8__*GUQ+6@Y|2ki=Hm2)NvT>+lMR~jvkukv6lmvt#ZS0olP%)eC^x( z>cuOU{MPV`z^EsU02nT*)Q9gqeo3O>6w1za9p`%NcJjaMf0kXvTnkq^;f^j%B;%@`KF$A%$kX*N z0_{#6~$~e@#jX%c32P#ny0@@bTn5x z$Y)`SjnDodY>G%LcT9C7*>*1tt3$=&QM?_j;CO}f!n7Z)Md~Hf0Z`y%F`H(^1@Z4r zU&TD4b;hD$@*zQ#Vm7=&As!DeKIn#}c79&d4$e|M4jt+}3XV*f6tLE9F-5Dr3Ywpe zDL}HAZS{%?IA5by`xKl|rYB*(=zi^25d9>w9h{W?I-ual{8RyJeZTlEJ|8+`c*Vw> zva~{;`zlbfm~F=jDM$xZB$igo;alFRV!{d@L!G)6q_~V-fo*v$iwPReB5qF@SG~C^ zpt6{4Rnv4m6v7N&G$ht%#DRo0Ca=;P!ey73w$Kt*maMcdgoYO+1xgk(u4ggcTYiH` z{ShR2_mViRuVqnOH$rES65xR-rhl(%2d{7@UPnqw=nt9rMM~$xzcVUevY2f>7ZY-m zlZZ7G!V*`_@O4yTw!XHD3A)Z9{%`_* - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * This file is part of wiiuse. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * $Header$ - * - */ - -/** - * @file - * - * @brief API header file. - * - * If this file is included from inside the wiiuse source - * and not from a third party program, then wiimote_internal.h - * is also included which extends this file. - */ - -#ifndef WIIUSE_H_INCLUDED -#define WIIUSE_H_INCLUDED - -#ifdef _WIN32 - /* windows */ - #include -#else - /* nix */ - #include -#endif - -#ifdef WIIUSE_INTERNAL_H_INCLUDED - #define WCONST -#else - #define WCONST const -#endif - -/* led bit masks */ -#define WIIMOTE_LED_NONE 0x00 -#define WIIMOTE_LED_1 0x10 -#define WIIMOTE_LED_2 0x20 -#define WIIMOTE_LED_3 0x40 -#define WIIMOTE_LED_4 0x80 - -/* button codes */ -#define WIIMOTE_BUTTON_TWO 0x0001 -#define WIIMOTE_BUTTON_ONE 0x0002 -#define WIIMOTE_BUTTON_B 0x0004 -#define WIIMOTE_BUTTON_A 0x0008 -#define WIIMOTE_BUTTON_MINUS 0x0010 -#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020 -#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040 -#define WIIMOTE_BUTTON_HOME 0x0080 -#define WIIMOTE_BUTTON_LEFT 0x0100 -#define WIIMOTE_BUTTON_RIGHT 0x0200 -#define WIIMOTE_BUTTON_DOWN 0x0400 -#define WIIMOTE_BUTTON_UP 0x0800 -#define WIIMOTE_BUTTON_PLUS 0x1000 -#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000 -#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000 -#define WIIMOTE_BUTTON_UNKNOWN 0x8000 -#define WIIMOTE_BUTTON_ALL 0x1F9F - -/* nunchul button codes */ -#define NUNCHUK_BUTTON_Z 0x01 -#define NUNCHUK_BUTTON_C 0x02 -#define NUNCHUK_BUTTON_ALL 0x03 - -/* classic controller button codes */ -#define CLASSIC_CTRL_BUTTON_UP 0x0001 -#define CLASSIC_CTRL_BUTTON_LEFT 0x0002 -#define CLASSIC_CTRL_BUTTON_ZR 0x0004 -#define CLASSIC_CTRL_BUTTON_X 0x0008 -#define CLASSIC_CTRL_BUTTON_A 0x0010 -#define CLASSIC_CTRL_BUTTON_Y 0x0020 -#define CLASSIC_CTRL_BUTTON_B 0x0040 -#define CLASSIC_CTRL_BUTTON_ZL 0x0080 -#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200 -#define CLASSIC_CTRL_BUTTON_PLUS 0x0400 -#define CLASSIC_CTRL_BUTTON_HOME 0x0800 -#define CLASSIC_CTRL_BUTTON_MINUS 0x1000 -#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000 -#define CLASSIC_CTRL_BUTTON_DOWN 0x4000 -#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000 -#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF - -/* guitar hero 3 button codes */ -#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001 -#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008 -#define GUITAR_HERO_3_BUTTON_GREEN 0x0010 -#define GUITAR_HERO_3_BUTTON_BLUE 0x0020 -#define GUITAR_HERO_3_BUTTON_RED 0x0040 -#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080 -#define GUITAR_HERO_3_BUTTON_PLUS 0x0400 -#define GUITAR_HERO_3_BUTTON_MINUS 0x1000 -#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000 -#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF - - -/* wiimote option flags */ -#define WIIUSE_SMOOTHING 0x01 -#define WIIUSE_CONTINUOUS 0x02 -#define WIIUSE_ORIENT_THRESH 0x04 -#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH) - -#define WIIUSE_ORIENT_PRECISION 100.0f - -/* expansion codes */ -#define EXP_NONE 0 -#define EXP_NUNCHUK 1 -#define EXP_CLASSIC 2 -#define EXP_GUITAR_HERO_3 3 - -/* IR correction types */ -typedef enum ir_position_t { - WIIUSE_IR_ABOVE, - WIIUSE_IR_BELOW -} ir_position_t; - -/** - * @brief Check if a button is pressed. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_PRESSED(dev, button) ((dev->btns & button) == button) - -/** - * @brief Check if a button is being held. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is held, 0 if not. - */ -#define IS_HELD(dev, button) ((dev->btns_held & button) == button) - -/** - * @brief Check if a button is released on this event. \n\n - * This does not mean the button is not pressed, it means \n - * this button was just now released. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is released, 0 if not. - * - */ -#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button) - -/** - * @brief Check if a button has just been pressed this event. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button)) - -#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020) -#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040) -#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080) -#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100) - -#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num) - -/* - * Largest known payload is 21 bytes. - * Add 2 for the prefix and round up to a power of 2. - */ -#define MAX_PAYLOAD 32 - -/* - * This is left over from an old hack, but it may actually - * be a useful feature to keep so it wasn't removed. - */ -#ifdef WIN32 - #define WIIMOTE_DEFAULT_TIMEOUT 10 - #define WIIMOTE_EXP_TIMEOUT 10 -#endif - -typedef unsigned char byte; -typedef char sbyte; - -struct wiimote_t; -struct vec3b_t; -struct orient_t; -struct gforce_t; - - -/** - * @brief Callback that handles a read event. - * - * @param wm Pointer to a wiimote_t structure. - * @param data Pointer to the filled data block. - * @param len Length in bytes of the data block. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when the wiimote has returned the full data requested by a previous - * call to wiiuse_read_data(). - */ -typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len); - - -/** - * @struct read_req_t - * @brief Data read request structure. - */ -struct read_req_t { - wiiuse_read_cb cb; /**< read data callback */ - byte* buf; /**< buffer where read data is written */ - unsigned int addr; /**< the offset that the read started at */ - unsigned short size; /**< the length of the data read */ - unsigned short wait; /**< num bytes still needed to finish read */ - - struct read_req_t* next; /**< next read request in the queue */ -}; - - -/** - * @struct vec2b_t - * @brief Unsigned x,y byte vector. - */ -typedef struct vec2b_t { - byte x, y; -} vec2b_t; - - -/** - * @struct vec3b_t - * @brief Unsigned x,y,z byte vector. - */ -typedef struct vec3b_t { - byte x, y, z; -} vec3b_t; - - -/** - * @struct vec3f_t - * @brief Signed x,y,z float struct. - */ -typedef struct vec3f_t { - float x, y, z; -} vec3f_t; - - -/** - * @struct orient_t - * @brief Orientation struct. - * - * Yaw, pitch, and roll range from -180 to 180 degrees. - */ -typedef struct orient_t { - float roll; /**< roll, this may be smoothed if enabled */ - float pitch; /**< pitch, this may be smoothed if enabled */ - float yaw; - - float a_roll; /**< absolute roll, unsmoothed */ - float a_pitch; /**< absolute pitch, unsmoothed */ -} orient_t; - - -/** - * @struct gforce_t - * @brief Gravity force struct. - */ -typedef struct gforce_t { - float x, y, z; -} gforce_t; - - -/** - * @struct accel_t - * @brief Accelerometer struct. For any device with an accelerometer. - */ -typedef struct accel_t { - struct vec3b_t cal_zero; /**< zero calibration */ - struct vec3b_t cal_g; /**< 1g difference around 0cal */ - - float st_roll; /**< last smoothed roll value */ - float st_pitch; /**< last smoothed roll pitch */ - float st_alpha; /**< alpha value for smoothing [0-1] */ -} accel_t; - - -/** - * @struct ir_dot_t - * @brief A single IR source. - */ -typedef struct ir_dot_t { - byte visible; /**< if the IR source is visible */ - - unsigned int x; /**< interpolated X coordinate */ - unsigned int y; /**< interpolated Y coordinate */ - - short rx; /**< raw X coordinate (0-1023) */ - short ry; /**< raw Y coordinate (0-767) */ - - byte order; /**< increasing order by x-axis value */ - - byte size; /**< size of the IR dot (0-15) */ -} ir_dot_t; - - -/** - * @enum aspect_t - * @brief Screen aspect ratio. - */ -typedef enum aspect_t { - WIIUSE_ASPECT_4_3, - WIIUSE_ASPECT_16_9 -} aspect_t; - - -/** - * @struct ir_t - * @brief IR struct. Hold all data related to the IR tracking. - */ -typedef struct ir_t { - struct ir_dot_t dot[4]; /**< IR dots */ - byte num_dots; /**< number of dots at this time */ - - enum aspect_t aspect; /**< aspect ratio of the screen */ - - enum ir_position_t pos; /**< IR sensor bar position */ - - unsigned int vres[2]; /**< IR virtual screen resolution */ - int offset[2]; /**< IR XY correction offset */ - int state; /**< keeps track of the IR state */ - - int ax; /**< absolute X coordinate */ - int ay; /**< absolute Y coordinate */ - - int x; /**< calculated X coordinate */ - int y; /**< calculated Y coordinate */ - - float distance; /**< pixel distance between first 2 dots*/ - float z; /**< calculated distance */ -} ir_t; - - -/** - * @struct joystick_t - * @brief Joystick calibration structure. - * - * The angle \a ang is relative to the positive y-axis into quadrant I - * and ranges from 0 to 360 degrees. So if the joystick is held straight - * upwards then angle is 0 degrees. If it is held to the right it is 90, - * down is 180, and left is 270. - * - * The magnitude \a mag is the distance from the center to where the - * joystick is being held. The magnitude ranges from 0 to 1. - * If the joystick is only slightly tilted from the center the magnitude - * will be low, but if it is closer to the outter edge the value will - * be higher. - */ -typedef struct joystick_t { - struct vec2b_t max; /**< maximum joystick values */ - struct vec2b_t min; /**< minimum joystick values */ - struct vec2b_t center; /**< center joystick values */ - - float ang; /**< angle the joystick is being held */ - float mag; /**< magnitude of the joystick (range 0-1) */ -} joystick_t; - - -/** - * @struct nunchuk_t - * @brief Nunchuk expansion device. - */ -typedef struct nunchuk_t { - struct accel_t accel_calib; /**< nunchuk accelerometer calibration */ - struct joystick_t js; /**< joystick calibration */ - - int* flags; /**< options flag (points to wiimote_t.flags) */ - - byte btns; /**< what buttons have just been pressed */ - byte btns_held; /**< what buttons are being held down */ - byte btns_released; /**< what buttons were just released this */ - - float orient_threshold; /**< threshold for orient to generate an event */ - int accel_threshold; /**< threshold for accel to generate an event */ - - struct vec3b_t accel; /**< current raw acceleration data */ - struct orient_t orient; /**< current orientation on each axis */ - struct gforce_t gforce; /**< current gravity forces on each axis */ -} nunchuk_t; - - -/** - * @struct classic_ctrl_t - * @brief Classic controller expansion device. - */ -typedef struct classic_ctrl_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float r_shoulder; /**< right shoulder button (range 0-1) */ - float l_shoulder; /**< left shoulder button (range 0-1) */ - - struct joystick_t ljs; /**< left joystick calibration */ - struct joystick_t rjs; /**< right joystick calibration */ -} classic_ctrl_t; - - -/** - * @struct guitar_hero_3_t - * @brief Guitar Hero 3 expansion device. - */ -typedef struct guitar_hero_3_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float whammy_bar; /**< whammy bar (range 0-1) */ - - struct joystick_t js; /**< joystick calibration */ -} guitar_hero_3_t; - - -/** - * @struct expansion_t - * @brief Generic expansion device plugged into wiimote. - */ -typedef struct expansion_t { - int type; /**< type of expansion attached */ - - union { - struct nunchuk_t nunchuk; - struct classic_ctrl_t classic; - struct guitar_hero_3_t gh3; - }; -} expansion_t; - - -/** - * @enum win32_bt_stack_t - * @brief Available bluetooth stacks for Windows. - */ -typedef enum win_bt_stack_t { - WIIUSE_STACK_UNKNOWN, - WIIUSE_STACK_MS, - WIIUSE_STACK_BLUESOLEIL -} win_bt_stack_t; - - -/** - * @struct wiimote_state_t - * @brief Significant data from the previous event. - */ -typedef struct wiimote_state_t { - /* expansion_t */ - float exp_ljs_ang; - float exp_rjs_ang; - float exp_ljs_mag; - float exp_rjs_mag; - unsigned short exp_btns; - struct orient_t exp_orient; - struct vec3b_t exp_accel; - float exp_r_shoulder; - float exp_l_shoulder; - - /* ir_t */ - int ir_ax; - int ir_ay; - float ir_distance; - - struct orient_t orient; - unsigned short btns; - - struct vec3b_t accel; -} wiimote_state_t; - - -/** - * @enum WIIUSE_EVENT_TYPE - * @brief Events that wiiuse can generate from a poll. - */ -typedef enum WIIUSE_EVENT_TYPE { - WIIUSE_NONE = 0, - WIIUSE_EVENT, - WIIUSE_STATUS, - WIIUSE_DISCONNECT, - WIIUSE_NUNCHUK_INSERTED, - WIIUSE_NUNCHUK_REMOVED, - WIIUSE_CLASSIC_CTRL_INSERTED, - WIIUSE_CLASSIC_CTRL_REMOVED, - WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED -} WIIUSE_EVENT_TYPE; - -/** - * @struct wiimote_t - * @brief Wiimote structure. - */ -typedef struct wiimote_t { - WCONST int unid; /**< user specified id */ - - #ifndef WIN32 - WCONST bdaddr_t bdaddr; /**< bt address */ - WCONST char bdaddr_str[18]; /**< readable bt address */ - WCONST int out_sock; /**< output socket */ - WCONST int in_sock; /**< input socket */ - #else - WCONST HANDLE dev_handle; /**< HID handle */ - WCONST OVERLAPPED hid_overlap; /**< overlap handle */ - WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */ - WCONST int timeout; /**< read timeout */ - WCONST byte normal_timeout; /**< normal timeout */ - WCONST byte exp_timeout; /**< timeout for expansion handshake */ - #endif - - WCONST int state; /**< various state flags */ - WCONST byte leds; /**< currently lit leds */ - WCONST float battery_level; /**< battery level */ - - WCONST int flags; /**< options flag */ - - WCONST byte handshake_state; /**< the state of the connection handshake */ - - WCONST struct read_req_t* read_req; /**< list of data read requests */ - WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */ - WCONST struct expansion_t exp; /**< wiimote expansion device */ - - WCONST struct vec3b_t accel; /**< current raw acceleration data */ - WCONST struct orient_t orient; /**< current orientation on each axis */ - WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ - - WCONST struct ir_t ir; /**< IR data */ - - WCONST unsigned short btns; /**< what buttons have just been pressed */ - WCONST unsigned short btns_held; /**< what buttons are being held down */ - WCONST unsigned short btns_released; /**< what buttons were just released this */ - - WCONST float orient_threshold; /**< threshold for orient to generate an event */ - WCONST int accel_threshold; /**< threshold for accel to generate an event */ - - WCONST struct wiimote_state_t lstate; /**< last saved state */ - - WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */ - WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */ -} wiimote; - - -/***************************************** - * - * Include API specific stuff - * - *****************************************/ - -#ifdef _WIN32 - #define WIIUSE_EXPORT_DECL __declspec(dllexport) - #define WIIUSE_IMPORT_DECL __declspec(dllimport) -#else - #define WIIUSE_EXPORT_DECL - #define WIIUSE_IMPORT_DECL -#endif - -#ifdef WIIUSE_COMPILE_LIB - #define WIIUSE_EXPORT WIIUSE_EXPORT_DECL -#else - #define WIIUSE_EXPORT WIIUSE_IMPORT_DECL -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* wiiuse.c */ -WIIUSE_EXPORT extern const char* wiiuse_version(); - -WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnected(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_cleanup(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_rumble(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_toggle_rumble(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds); -WIIUSE_EXPORT extern void wiiuse_motion_sensing(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern int wiiuse_read_data(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len); -WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len); -WIIUSE_EXPORT extern void wiiuse_status(struct wiimote_t* wm); -WIIUSE_EXPORT extern struct wiimote_t* wiiuse_get_by_id(struct wiimote_t** wm, int wiimotes, int unid); -WIIUSE_EXPORT extern int wiiuse_set_flags(struct wiimote_t* wm, int enable, int disable); -WIIUSE_EXPORT extern float wiiuse_set_smooth_alpha(struct wiimote_t* wm, float alpha); -WIIUSE_EXPORT extern void wiiuse_set_bluetooth_stack(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type); -WIIUSE_EXPORT extern void wiiuse_set_orient_threshold(struct wiimote_t* wm, float threshold); -WIIUSE_EXPORT extern void wiiuse_resync(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout); -WIIUSE_EXPORT extern void wiiuse_set_accel_threshold(struct wiimote_t* wm, int threshold); - -/* connect.c */ -WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm); - -/* events.c */ -WIIUSE_EXPORT extern int wiiuse_poll(struct wiimote_t** wm, int wiimotes); - -/* ir.c */ -WIIUSE_EXPORT extern void wiiuse_set_ir(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_set_ir_vres(struct wiimote_t* wm, unsigned int x, unsigned int y); -WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos); -WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect); - -/* nunchuk.c */ -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_orient_threshold(struct nunchuk_t* nc, float threshold); -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct nunchuk_t* nc, int threshold); - - -#ifdef __cplusplus -} -#endif - - -#endif /* WIIUSE_H_INCLUDED */ - diff --git a/WiiUseJC_0.11/wiiusej_WiiUseApi.c b/WiiUseJC_0.11/wiiusej_WiiUseApi.c deleted file mode 100644 index be218e7..0000000 --- a/WiiUseJC_0.11/wiiusej_WiiUseApi.c +++ /dev/null @@ -1,477 +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 . - */ -#ifndef WIN32 - #include -#else - -#endif - -#include "wiiusej_WiiUseApi.h" -#include "wiiuse.h" -/* - * These are some identifiers for wiimotes - * - * See below in main() for what they are used for. - */ -#define WIIMOTE_STATE_RUMBLE 0x08 -#define WIIMOTE_STATE_CONNECTED 0x04 -#define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s)) -#define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s)) - -/********************* VARIABLES DECLARATIONS *****************************/ - -/* - * Make a temp array of wiimote ids. - * Here I only anticipate connecting up to - * two wiimotes. Each wiimote connected - * will get one of these ids. - */ -static wiimote** wiimotes; - -static int nbMaxWiiMotes=0; - -/****************** GENERAL FUNCTIONS DEFINITIONS *************************/ - -/** - * Try to connect to 2 wiimotes. - * Make them rumble to show they are connected. - * @param nbConnects number of connections maximum. - * @param rumble - * make the connected wiimotes rumble. - * @return 0 if there is an error otherwise it returns - * the number of wiimotes connected.. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections -(JNIEnv *env, jobject obj, jint nbConnects, jboolean rumble) { - - /* variables declarations */ - int found, connected, i; - short leds; - - nbMaxWiiMotes = nbConnects; - - /* initialize wiimotes array with the maximum number of wiimotes */ - wiimotes = wiiuse_init(nbMaxWiiMotes); - - /* - * Find wiimote devices - * Now we need to find some wiimotes. - * Give the function the wiimote array we created, and tell it there - * are 2 wiimotes we are interested in. - * Set the timeout to be 5 seconds. - * This will return the number of actual wiimotes that are in discovery mode. - */ - found = wiiuse_find(wiimotes, nbMaxWiiMotes, 5); - if (!found) return 0; - - /* - * Connect to the wiimotes - * Now that we found some wiimotes, connect to them. - * Give the function the wiimote array and the number of wiimote devices we found. - * This will return the number of established connections to the found wiimotes. - */ - connected = wiiuse_connect(wiimotes, nbMaxWiiMotes); - if (!connected) return 0; - - //no problems during connection show that wiimotes are connected - - /* - * Now set the LEDs and rumble for a second so it's easy - * to tell which wiimotes are connected (just like the wii does). - */ - for (i=0;iGetObjectClass(env, gath); - jmethodID mid; - - if (wiiuse_poll(wiimotes, nbMaxWiiMotes)) { - /* - * This happens if something happened on any wiimote. - * So go through each one and check if anything happened. - */ - for (i=0; i < nbMaxWiiMotes; ++i) { - switch (wiimotes[i]->event) { - case WIIUSE_EVENT: - /* a generic event occured */ - mid = (*env)->GetMethodID(env, cls, "prepareWiiMoteEvent", "(ISSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid, wiimotes[i]->btns, - wiimotes[i]->btns_released, wiimotes[i]->btns_held); - /* - * If IR tracking is enabled then print the coordinates - * on the virtual screen that the wiimote is pointing to. - * - * Also make sure that we see at least 1 dot. - */ - if (WIIUSE_USING_IR(wiimotes[i])) { - int a = 0; - - mid = (*env)->GetMethodID(env, cls, "prepareIRevent", - "(IIIIIIIIISS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.x, wiimotes[i]->ir.y, wiimotes[i]->ir.z, - wiimotes[i]->ir.ax, wiimotes[i]->ir.ay, - wiimotes[i]->ir.vres[0], wiimotes[i]->ir.vres[1], - wiimotes[i]->ir.offset[0], wiimotes[i]->ir.offset[1], - wiimotes[i]->ir.pos, wiimotes[i]->ir.aspect); - - mid = (*env)->GetMethodID(env, cls, "addIRPointToPreparedWiiMoteEvent", - "(IISSS)V"); - if (mid == 0) { - return; - } - /* go through each of the 4 possible IR sources */ - for (; a < 4; a++) { - /* check if the source is visible */ - if (wiimotes[i]->ir.dot[a].visible) { - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.dot[a].x, wiimotes[i]->ir.dot[a].y, - wiimotes[i]->ir.dot[a].rx, wiimotes[i]->ir.dot[a].ry, - wiimotes[i]->ir.dot[a].size); - } - } - } - - /* Motion Sensing */ - if (WIIUSE_USING_ACC(wiimotes[i])) { - /* set orientation and gravity force */ - mid = (*env)->GetMethodID(env, cls, - "addMotionSensingValues", "(FIZFFFFFFFSSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->orient_threshold, wiimotes[i]->accel_threshold, - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_SMOOTHING), wiimotes[i]->accel_calib.st_alpha, - wiimotes[i]->orient.roll, wiimotes[i]->orient.pitch, wiimotes[i]->orient.yaw, - wiimotes[i]->gforce.x, wiimotes[i]->gforce.y, wiimotes[i]->gforce.z, - wiimotes[i]->accel.x, wiimotes[i]->accel.y, wiimotes[i]->accel.z); - } - - /* add generic event to java object used to gather events in c environment */ - mid = (*env)->GetMethodID(env, cls, "addWiimoteEvent", - "()V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid); - break; - - case WIIUSE_STATUS: - /* a status event occured */ - mid = (*env)->GetMethodID(env, cls, "addStatusEvent", "(IZFSZIZZZZ)V"); - if (mid == 0) { - return; - } - /* LEDS */ - if (WIIUSE_IS_LED_SET(wiimotes[i], 1)) leds += 1; - if (WIIUSE_IS_LED_SET(wiimotes[i], 2)) leds += 2; - if (WIIUSE_IS_LED_SET(wiimotes[i], 3)) leds += 4; - if (WIIUSE_IS_LED_SET(wiimotes[i], 4)) leds += 8; - - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->unid, WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_CONNECTED), - wiimotes[i]->battery_level, leds, WIIUSE_USING_SPEAKER(wiimotes[i]), - wiimotes[i]->exp.type,WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_RUMBLE), - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_CONTINUOUS), - WIIUSE_USING_IR(wiimotes[i]),WIIUSE_USING_ACC(wiimotes[i])); - break; - - case WIIUSE_DISCONNECT: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addDisconnectionEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - default: - break; - } - } - } -} diff --git a/WiiUseJC_0.11/wiiusej_WiiUseApi.def b/WiiUseJC_0.11/wiiusej_WiiUseApi.def deleted file mode 100644 index a83a234..0000000 --- a/WiiUseJC_0.11/wiiusej_WiiUseApi.def +++ /dev/null @@ -1,27 +0,0 @@ -EXPORTS -Java_wiiusej_WiiUseApi_doConnections -Java_wiiusej_WiiUseApi_closeConnection -Java_wiiusej_WiiUseApi_shutdownApi -Java_wiiusej_WiiUseApi_activateRumble -Java_wiiusej_WiiUseApi_deactivateRumble -Java_wiiusej_WiiUseApi_activateIRTracking -Java_wiiusej_WiiUseApi_deactivateIRTracking -Java_wiiusej_WiiUseApi_activateMotionSensing -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_setLeds -Java_wiiusej_WiiUseApi_setOrientThreshold -Java_wiiusej_WiiUseApi_setAccelThreshold -Java_wiiusej_WiiUseApi_setAlphaSmoothing -Java_wiiusej_WiiUseApi_reSync -Java_wiiusej_WiiUseApi_activateSmoothing -Java_wiiusej_WiiUseApi_deactivateSmoothing -Java_wiiusej_WiiUseApi_activateContinuous -Java_wiiusej_WiiUseApi_deactivateContinuous -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_getStatus -Java_wiiusej_WiiUseApi_specialPoll -Java_wiiusej_WiiUseApi_setScreenRatio43 -Java_wiiusej_WiiUseApi_setScreenRatio169 -Java_wiiusej_WiiUseApi_setSensorBarAboveScreen -Java_wiiusej_WiiUseApi_setSensorBarBelowScreen -Java_wiiusej_WiiUseApi_setVirtualScreenResolution diff --git a/WiiUseJC_0.11/wiiusej_WiiUseApi.h b/WiiUseJC_0.11/wiiusej_WiiUseApi.h deleted file mode 100644 index 9ee751c..0000000 --- a/WiiUseJC_0.11/wiiusej_WiiUseApi.h +++ /dev/null @@ -1,213 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class wiiusej_WiiUseApi */ - -#ifndef _Included_wiiusej_WiiUseApi -#define _Included_wiiusej_WiiUseApi -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: wiiusej_WiiUseApi - * Method: doConnections - * Signature: (IZ)I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections - (JNIEnv *, jobject, jint, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: closeConnection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: shutdownApi - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setLeds - * Signature: (IZZZZ)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds - (JNIEnv *, jobject, jint, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: setOrientThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAccelThreshold - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAccelThreshold - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAlphaSmoothing - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAlphaSmoothing - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: reSync - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_reSync - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio43 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio43 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio169 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio169 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarAboveScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarAboveScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarBelowScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarBelowScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setVirtualScreenResolution - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setVirtualScreenResolution - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getStatus - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: specialPoll - * Signature: (Lwiiusej/wiiuseapievents/EventsGatherer;)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/WiiUseJC_0.11ThreadReqeuests/.cproject b/WiiUseJC_0.11ThreadReqeuests/.cproject deleted file mode 100644 index 1ca9232..0000000 --- a/WiiUseJC_0.11ThreadReqeuests/.cproject +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - - - diff --git a/WiiUseJC_0.11ThreadReqeuests/.project b/WiiUseJC_0.11ThreadReqeuests/.project deleted file mode 100644 index 0f99eae..0000000 --- a/WiiUseJC_0.11ThreadReqeuests/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - WiiUseJavaC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/WiiUseJavaC/Debug} - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.append_environment - true - - - ?name? - - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.cnature - - diff --git a/WiiUseJC_0.11ThreadReqeuests/lib/wiiuse.lib b/WiiUseJC_0.11ThreadReqeuests/lib/wiiuse.lib deleted file mode 100644 index c9973964982e8c8a9000fc37f557b7d924a6dcd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7956 zcmcIoOK%iM5H7F7%h>q+ey}7KkPFym*I<+&lMuxS^N=wY4h-wvv3JCHXSFkH1UW=P z9CPLeAcYfBBo0WqAw@zQ$RS9%a6sY@aNrM+s_E|O?s<8ZB_q{LcXf4tUES4H)pO*# zQlnfw*L5Rs#oJu~@I64!bAaA=0R2M%!><_)O#u)M zykRtW4uEKUh0(-O0HX0{j7C2I5KTVdl*2F5%vnYQn>Y^A&__mtPjNh?p@)pd-U1L! z-Dfnmfpw%Q9D`_dhtbGm0HP_xA{y;xH2n&IXyOs0>04Mwnt8%#_$KOwG*TckjEk4A zU0qu@F8p-;$F+;s)~~J^cP*>wnqU}LZmh0G+u>Ixz?#=rZd|!!TsXge9y?gub%S>| z>W*!LUeVe&ty(2$XBDlz?9^&z*$YI1x+Ybz+@OI^OJ!-YuIU+8BN$LrV`Pk-hUta` zIWJDS?zom`Ikj*P$&d6Zxph>|Xq2#@)=h7S^s6;%<{4fUCt7uExss$+ zvQXl9rE=M{cNs1sqm8y>He7WLg1RPEw#`zlSr1eW>Y9{Qv*gCJiqoUSJx|*?`T~k zZIRxodmn9#^pET#KR7h;NSoFhjqP5o986bKH5nSkv$jpADYsDLY0{16_J)nVhEG9M zH5t#@+OkbUv~kf8SL;D|wpr0Pkuh{RujDlqDPGlN?lvsXG%6)e?y$N9%FIZv=Mgq5Wa*K+ad$(?%aeraMAX zQ%Gj;xEVxti5P)L)%A#TSZR(iJ}9gHjC@pyqshyL0QZ46x-&*YJom% z&s;`JBo!Ox&BA&`RSzh!7RyDWwyHEltW;@>CJ2$VQn5*;Bid>tvy8+kVOJ3gR0a|< zQNvP%QX6%9Q+frKCU|;`3|SW!3hav46^lx`EilOw729S}ZnxW7VM$!$Zg;JAbiyC* zUq2u00E`{}({Z9=ZZx-Mud^z^c`W=UD*U?)eLtMAD3;GIh$akg@Hf(X&gjJNGR(c; za*LdekqO`vl8__*GUQ+6@Y|2ki=Hm2)NvT>+lMR~jvkukv6lmvt#ZS0olP%)eC^x( z>cuOU{MPV`z^EsU02nT*)Q9gqeo3O>6w1za9p`%NcJjaMf0kXvTnkq^;f^j%B;%@`KF$A%$kX*N z0_{#6~$~e@#jX%c32P#ny0@@bTn5x z$Y)`SjnDodY>G%LcT9C7*>*1tt3$=&QM?_j;CO}f!n7Z)Md~Hf0Z`y%F`H(^1@Z4r zU&TD4b;hD$@*zQ#Vm7=&As!DeKIn#}c79&d4$e|M4jt+}3XV*f6tLE9F-5Dr3Ywpe zDL}HAZS{%?IA5by`xKl|rYB*(=zi^25d9>w9h{W?I-ual{8RyJeZTlEJ|8+`c*Vw> zva~{;`zlbfm~F=jDM$xZB$igo;alFRV!{d@L!G)6q_~V-fo*v$iwPReB5qF@SG~C^ zpt6{4Rnv4m6v7N&G$ht%#DRo0Ca=;P!ey73w$Kt*maMcdgoYO+1xgk(u4ggcTYiH` z{ShR2_mViRuVqnOH$rES65xR-rhl(%2d{7@UPnqw=nt9rMM~$xzcVUevY2f>7ZY-m zlZZ7G!V*`_@O4yTw!XHD3A)Z9{%`_* - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * This file is part of wiiuse. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * $Header$ - * - */ - -/** - * @file - * - * @brief API header file. - * - * If this file is included from inside the wiiuse source - * and not from a third party program, then wiimote_internal.h - * is also included which extends this file. - */ - -#ifndef WIIUSE_H_INCLUDED -#define WIIUSE_H_INCLUDED - -#ifdef _WIN32 - /* windows */ - #include -#else - /* nix */ - #include -#endif - -#ifdef WIIUSE_INTERNAL_H_INCLUDED - #define WCONST -#else - #define WCONST const -#endif - -/* led bit masks */ -#define WIIMOTE_LED_NONE 0x00 -#define WIIMOTE_LED_1 0x10 -#define WIIMOTE_LED_2 0x20 -#define WIIMOTE_LED_3 0x40 -#define WIIMOTE_LED_4 0x80 - -/* button codes */ -#define WIIMOTE_BUTTON_TWO 0x0001 -#define WIIMOTE_BUTTON_ONE 0x0002 -#define WIIMOTE_BUTTON_B 0x0004 -#define WIIMOTE_BUTTON_A 0x0008 -#define WIIMOTE_BUTTON_MINUS 0x0010 -#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020 -#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040 -#define WIIMOTE_BUTTON_HOME 0x0080 -#define WIIMOTE_BUTTON_LEFT 0x0100 -#define WIIMOTE_BUTTON_RIGHT 0x0200 -#define WIIMOTE_BUTTON_DOWN 0x0400 -#define WIIMOTE_BUTTON_UP 0x0800 -#define WIIMOTE_BUTTON_PLUS 0x1000 -#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000 -#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000 -#define WIIMOTE_BUTTON_UNKNOWN 0x8000 -#define WIIMOTE_BUTTON_ALL 0x1F9F - -/* nunchul button codes */ -#define NUNCHUK_BUTTON_Z 0x01 -#define NUNCHUK_BUTTON_C 0x02 -#define NUNCHUK_BUTTON_ALL 0x03 - -/* classic controller button codes */ -#define CLASSIC_CTRL_BUTTON_UP 0x0001 -#define CLASSIC_CTRL_BUTTON_LEFT 0x0002 -#define CLASSIC_CTRL_BUTTON_ZR 0x0004 -#define CLASSIC_CTRL_BUTTON_X 0x0008 -#define CLASSIC_CTRL_BUTTON_A 0x0010 -#define CLASSIC_CTRL_BUTTON_Y 0x0020 -#define CLASSIC_CTRL_BUTTON_B 0x0040 -#define CLASSIC_CTRL_BUTTON_ZL 0x0080 -#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200 -#define CLASSIC_CTRL_BUTTON_PLUS 0x0400 -#define CLASSIC_CTRL_BUTTON_HOME 0x0800 -#define CLASSIC_CTRL_BUTTON_MINUS 0x1000 -#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000 -#define CLASSIC_CTRL_BUTTON_DOWN 0x4000 -#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000 -#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF - -/* guitar hero 3 button codes */ -#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001 -#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008 -#define GUITAR_HERO_3_BUTTON_GREEN 0x0010 -#define GUITAR_HERO_3_BUTTON_BLUE 0x0020 -#define GUITAR_HERO_3_BUTTON_RED 0x0040 -#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080 -#define GUITAR_HERO_3_BUTTON_PLUS 0x0400 -#define GUITAR_HERO_3_BUTTON_MINUS 0x1000 -#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000 -#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF - - -/* wiimote option flags */ -#define WIIUSE_SMOOTHING 0x01 -#define WIIUSE_CONTINUOUS 0x02 -#define WIIUSE_ORIENT_THRESH 0x04 -#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH) - -#define WIIUSE_ORIENT_PRECISION 100.0f - -/* expansion codes */ -#define EXP_NONE 0 -#define EXP_NUNCHUK 1 -#define EXP_CLASSIC 2 -#define EXP_GUITAR_HERO_3 3 - -/* IR correction types */ -typedef enum ir_position_t { - WIIUSE_IR_ABOVE, - WIIUSE_IR_BELOW -} ir_position_t; - -/** - * @brief Check if a button is pressed. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_PRESSED(dev, button) ((dev->btns & button) == button) - -/** - * @brief Check if a button is being held. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is held, 0 if not. - */ -#define IS_HELD(dev, button) ((dev->btns_held & button) == button) - -/** - * @brief Check if a button is released on this event. \n\n - * This does not mean the button is not pressed, it means \n - * this button was just now released. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is released, 0 if not. - * - */ -#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button) - -/** - * @brief Check if a button has just been pressed this event. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button)) - -#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020) -#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040) -#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080) -#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100) - -#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num) - -/* - * Largest known payload is 21 bytes. - * Add 2 for the prefix and round up to a power of 2. - */ -#define MAX_PAYLOAD 32 - -/* - * This is left over from an old hack, but it may actually - * be a useful feature to keep so it wasn't removed. - */ -#ifdef WIN32 - #define WIIMOTE_DEFAULT_TIMEOUT 10 - #define WIIMOTE_EXP_TIMEOUT 10 -#endif - -typedef unsigned char byte; -typedef char sbyte; - -struct wiimote_t; -struct vec3b_t; -struct orient_t; -struct gforce_t; - - -/** - * @brief Callback that handles a read event. - * - * @param wm Pointer to a wiimote_t structure. - * @param data Pointer to the filled data block. - * @param len Length in bytes of the data block. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when the wiimote has returned the full data requested by a previous - * call to wiiuse_read_data(). - */ -typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len); - - -/** - * @struct read_req_t - * @brief Data read request structure. - */ -struct read_req_t { - wiiuse_read_cb cb; /**< read data callback */ - byte* buf; /**< buffer where read data is written */ - unsigned int addr; /**< the offset that the read started at */ - unsigned short size; /**< the length of the data read */ - unsigned short wait; /**< num bytes still needed to finish read */ - - struct read_req_t* next; /**< next read request in the queue */ -}; - - -/** - * @struct vec2b_t - * @brief Unsigned x,y byte vector. - */ -typedef struct vec2b_t { - byte x, y; -} vec2b_t; - - -/** - * @struct vec3b_t - * @brief Unsigned x,y,z byte vector. - */ -typedef struct vec3b_t { - byte x, y, z; -} vec3b_t; - - -/** - * @struct vec3f_t - * @brief Signed x,y,z float struct. - */ -typedef struct vec3f_t { - float x, y, z; -} vec3f_t; - - -/** - * @struct orient_t - * @brief Orientation struct. - * - * Yaw, pitch, and roll range from -180 to 180 degrees. - */ -typedef struct orient_t { - float roll; /**< roll, this may be smoothed if enabled */ - float pitch; /**< pitch, this may be smoothed if enabled */ - float yaw; - - float a_roll; /**< absolute roll, unsmoothed */ - float a_pitch; /**< absolute pitch, unsmoothed */ -} orient_t; - - -/** - * @struct gforce_t - * @brief Gravity force struct. - */ -typedef struct gforce_t { - float x, y, z; -} gforce_t; - - -/** - * @struct accel_t - * @brief Accelerometer struct. For any device with an accelerometer. - */ -typedef struct accel_t { - struct vec3b_t cal_zero; /**< zero calibration */ - struct vec3b_t cal_g; /**< 1g difference around 0cal */ - - float st_roll; /**< last smoothed roll value */ - float st_pitch; /**< last smoothed roll pitch */ - float st_alpha; /**< alpha value for smoothing [0-1] */ -} accel_t; - - -/** - * @struct ir_dot_t - * @brief A single IR source. - */ -typedef struct ir_dot_t { - byte visible; /**< if the IR source is visible */ - - unsigned int x; /**< interpolated X coordinate */ - unsigned int y; /**< interpolated Y coordinate */ - - short rx; /**< raw X coordinate (0-1023) */ - short ry; /**< raw Y coordinate (0-767) */ - - byte order; /**< increasing order by x-axis value */ - - byte size; /**< size of the IR dot (0-15) */ -} ir_dot_t; - - -/** - * @enum aspect_t - * @brief Screen aspect ratio. - */ -typedef enum aspect_t { - WIIUSE_ASPECT_4_3, - WIIUSE_ASPECT_16_9 -} aspect_t; - - -/** - * @struct ir_t - * @brief IR struct. Hold all data related to the IR tracking. - */ -typedef struct ir_t { - struct ir_dot_t dot[4]; /**< IR dots */ - byte num_dots; /**< number of dots at this time */ - - enum aspect_t aspect; /**< aspect ratio of the screen */ - - enum ir_position_t pos; /**< IR sensor bar position */ - - unsigned int vres[2]; /**< IR virtual screen resolution */ - int offset[2]; /**< IR XY correction offset */ - int state; /**< keeps track of the IR state */ - - int ax; /**< absolute X coordinate */ - int ay; /**< absolute Y coordinate */ - - int x; /**< calculated X coordinate */ - int y; /**< calculated Y coordinate */ - - float distance; /**< pixel distance between first 2 dots*/ - float z; /**< calculated distance */ -} ir_t; - - -/** - * @struct joystick_t - * @brief Joystick calibration structure. - * - * The angle \a ang is relative to the positive y-axis into quadrant I - * and ranges from 0 to 360 degrees. So if the joystick is held straight - * upwards then angle is 0 degrees. If it is held to the right it is 90, - * down is 180, and left is 270. - * - * The magnitude \a mag is the distance from the center to where the - * joystick is being held. The magnitude ranges from 0 to 1. - * If the joystick is only slightly tilted from the center the magnitude - * will be low, but if it is closer to the outter edge the value will - * be higher. - */ -typedef struct joystick_t { - struct vec2b_t max; /**< maximum joystick values */ - struct vec2b_t min; /**< minimum joystick values */ - struct vec2b_t center; /**< center joystick values */ - - float ang; /**< angle the joystick is being held */ - float mag; /**< magnitude of the joystick (range 0-1) */ -} joystick_t; - - -/** - * @struct nunchuk_t - * @brief Nunchuk expansion device. - */ -typedef struct nunchuk_t { - struct accel_t accel_calib; /**< nunchuk accelerometer calibration */ - struct joystick_t js; /**< joystick calibration */ - - int* flags; /**< options flag (points to wiimote_t.flags) */ - - byte btns; /**< what buttons have just been pressed */ - byte btns_held; /**< what buttons are being held down */ - byte btns_released; /**< what buttons were just released this */ - - float orient_threshold; /**< threshold for orient to generate an event */ - int accel_threshold; /**< threshold for accel to generate an event */ - - struct vec3b_t accel; /**< current raw acceleration data */ - struct orient_t orient; /**< current orientation on each axis */ - struct gforce_t gforce; /**< current gravity forces on each axis */ -} nunchuk_t; - - -/** - * @struct classic_ctrl_t - * @brief Classic controller expansion device. - */ -typedef struct classic_ctrl_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float r_shoulder; /**< right shoulder button (range 0-1) */ - float l_shoulder; /**< left shoulder button (range 0-1) */ - - struct joystick_t ljs; /**< left joystick calibration */ - struct joystick_t rjs; /**< right joystick calibration */ -} classic_ctrl_t; - - -/** - * @struct guitar_hero_3_t - * @brief Guitar Hero 3 expansion device. - */ -typedef struct guitar_hero_3_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float whammy_bar; /**< whammy bar (range 0-1) */ - - struct joystick_t js; /**< joystick calibration */ -} guitar_hero_3_t; - - -/** - * @struct expansion_t - * @brief Generic expansion device plugged into wiimote. - */ -typedef struct expansion_t { - int type; /**< type of expansion attached */ - - union { - struct nunchuk_t nunchuk; - struct classic_ctrl_t classic; - struct guitar_hero_3_t gh3; - }; -} expansion_t; - - -/** - * @enum win32_bt_stack_t - * @brief Available bluetooth stacks for Windows. - */ -typedef enum win_bt_stack_t { - WIIUSE_STACK_UNKNOWN, - WIIUSE_STACK_MS, - WIIUSE_STACK_BLUESOLEIL -} win_bt_stack_t; - - -/** - * @struct wiimote_state_t - * @brief Significant data from the previous event. - */ -typedef struct wiimote_state_t { - /* expansion_t */ - float exp_ljs_ang; - float exp_rjs_ang; - float exp_ljs_mag; - float exp_rjs_mag; - unsigned short exp_btns; - struct orient_t exp_orient; - struct vec3b_t exp_accel; - float exp_r_shoulder; - float exp_l_shoulder; - - /* ir_t */ - int ir_ax; - int ir_ay; - float ir_distance; - - struct orient_t orient; - unsigned short btns; - - struct vec3b_t accel; -} wiimote_state_t; - - -/** - * @enum WIIUSE_EVENT_TYPE - * @brief Events that wiiuse can generate from a poll. - */ -typedef enum WIIUSE_EVENT_TYPE { - WIIUSE_NONE = 0, - WIIUSE_EVENT, - WIIUSE_STATUS, - WIIUSE_DISCONNECT, - WIIUSE_NUNCHUK_INSERTED, - WIIUSE_NUNCHUK_REMOVED, - WIIUSE_CLASSIC_CTRL_INSERTED, - WIIUSE_CLASSIC_CTRL_REMOVED, - WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED -} WIIUSE_EVENT_TYPE; - -/** - * @struct wiimote_t - * @brief Wiimote structure. - */ -typedef struct wiimote_t { - WCONST int unid; /**< user specified id */ - - #ifndef WIN32 - WCONST bdaddr_t bdaddr; /**< bt address */ - WCONST char bdaddr_str[18]; /**< readable bt address */ - WCONST int out_sock; /**< output socket */ - WCONST int in_sock; /**< input socket */ - #else - WCONST HANDLE dev_handle; /**< HID handle */ - WCONST OVERLAPPED hid_overlap; /**< overlap handle */ - WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */ - WCONST int timeout; /**< read timeout */ - WCONST byte normal_timeout; /**< normal timeout */ - WCONST byte exp_timeout; /**< timeout for expansion handshake */ - #endif - - WCONST int state; /**< various state flags */ - WCONST byte leds; /**< currently lit leds */ - WCONST float battery_level; /**< battery level */ - - WCONST int flags; /**< options flag */ - - WCONST byte handshake_state; /**< the state of the connection handshake */ - - WCONST struct read_req_t* read_req; /**< list of data read requests */ - WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */ - WCONST struct expansion_t exp; /**< wiimote expansion device */ - - WCONST struct vec3b_t accel; /**< current raw acceleration data */ - WCONST struct orient_t orient; /**< current orientation on each axis */ - WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ - - WCONST struct ir_t ir; /**< IR data */ - - WCONST unsigned short btns; /**< what buttons have just been pressed */ - WCONST unsigned short btns_held; /**< what buttons are being held down */ - WCONST unsigned short btns_released; /**< what buttons were just released this */ - - WCONST float orient_threshold; /**< threshold for orient to generate an event */ - WCONST int accel_threshold; /**< threshold for accel to generate an event */ - - WCONST struct wiimote_state_t lstate; /**< last saved state */ - - WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */ - WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */ -} wiimote; - - -/***************************************** - * - * Include API specific stuff - * - *****************************************/ - -#ifdef _WIN32 - #define WIIUSE_EXPORT_DECL __declspec(dllexport) - #define WIIUSE_IMPORT_DECL __declspec(dllimport) -#else - #define WIIUSE_EXPORT_DECL - #define WIIUSE_IMPORT_DECL -#endif - -#ifdef WIIUSE_COMPILE_LIB - #define WIIUSE_EXPORT WIIUSE_EXPORT_DECL -#else - #define WIIUSE_EXPORT WIIUSE_IMPORT_DECL -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* wiiuse.c */ -WIIUSE_EXPORT extern const char* wiiuse_version(); - -WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnected(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_cleanup(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_rumble(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_toggle_rumble(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds); -WIIUSE_EXPORT extern void wiiuse_motion_sensing(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern int wiiuse_read_data(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len); -WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len); -WIIUSE_EXPORT extern void wiiuse_status(struct wiimote_t* wm); -WIIUSE_EXPORT extern struct wiimote_t* wiiuse_get_by_id(struct wiimote_t** wm, int wiimotes, int unid); -WIIUSE_EXPORT extern int wiiuse_set_flags(struct wiimote_t* wm, int enable, int disable); -WIIUSE_EXPORT extern float wiiuse_set_smooth_alpha(struct wiimote_t* wm, float alpha); -WIIUSE_EXPORT extern void wiiuse_set_bluetooth_stack(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type); -WIIUSE_EXPORT extern void wiiuse_set_orient_threshold(struct wiimote_t* wm, float threshold); -WIIUSE_EXPORT extern void wiiuse_resync(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout); -WIIUSE_EXPORT extern void wiiuse_set_accel_threshold(struct wiimote_t* wm, int threshold); - -/* connect.c */ -WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm); - -/* events.c */ -WIIUSE_EXPORT extern int wiiuse_poll(struct wiimote_t** wm, int wiimotes); - -/* ir.c */ -WIIUSE_EXPORT extern void wiiuse_set_ir(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_set_ir_vres(struct wiimote_t* wm, unsigned int x, unsigned int y); -WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos); -WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect); - -/* nunchuk.c */ -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_orient_threshold(struct nunchuk_t* nc, float threshold); -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct nunchuk_t* nc, int threshold); - - -#ifdef __cplusplus -} -#endif - - -#endif /* WIIUSE_H_INCLUDED */ - diff --git a/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.c b/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.c deleted file mode 100644 index be218e7..0000000 --- a/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.c +++ /dev/null @@ -1,477 +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 . - */ -#ifndef WIN32 - #include -#else - -#endif - -#include "wiiusej_WiiUseApi.h" -#include "wiiuse.h" -/* - * These are some identifiers for wiimotes - * - * See below in main() for what they are used for. - */ -#define WIIMOTE_STATE_RUMBLE 0x08 -#define WIIMOTE_STATE_CONNECTED 0x04 -#define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s)) -#define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s)) - -/********************* VARIABLES DECLARATIONS *****************************/ - -/* - * Make a temp array of wiimote ids. - * Here I only anticipate connecting up to - * two wiimotes. Each wiimote connected - * will get one of these ids. - */ -static wiimote** wiimotes; - -static int nbMaxWiiMotes=0; - -/****************** GENERAL FUNCTIONS DEFINITIONS *************************/ - -/** - * Try to connect to 2 wiimotes. - * Make them rumble to show they are connected. - * @param nbConnects number of connections maximum. - * @param rumble - * make the connected wiimotes rumble. - * @return 0 if there is an error otherwise it returns - * the number of wiimotes connected.. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections -(JNIEnv *env, jobject obj, jint nbConnects, jboolean rumble) { - - /* variables declarations */ - int found, connected, i; - short leds; - - nbMaxWiiMotes = nbConnects; - - /* initialize wiimotes array with the maximum number of wiimotes */ - wiimotes = wiiuse_init(nbMaxWiiMotes); - - /* - * Find wiimote devices - * Now we need to find some wiimotes. - * Give the function the wiimote array we created, and tell it there - * are 2 wiimotes we are interested in. - * Set the timeout to be 5 seconds. - * This will return the number of actual wiimotes that are in discovery mode. - */ - found = wiiuse_find(wiimotes, nbMaxWiiMotes, 5); - if (!found) return 0; - - /* - * Connect to the wiimotes - * Now that we found some wiimotes, connect to them. - * Give the function the wiimote array and the number of wiimote devices we found. - * This will return the number of established connections to the found wiimotes. - */ - connected = wiiuse_connect(wiimotes, nbMaxWiiMotes); - if (!connected) return 0; - - //no problems during connection show that wiimotes are connected - - /* - * Now set the LEDs and rumble for a second so it's easy - * to tell which wiimotes are connected (just like the wii does). - */ - for (i=0;iGetObjectClass(env, gath); - jmethodID mid; - - if (wiiuse_poll(wiimotes, nbMaxWiiMotes)) { - /* - * This happens if something happened on any wiimote. - * So go through each one and check if anything happened. - */ - for (i=0; i < nbMaxWiiMotes; ++i) { - switch (wiimotes[i]->event) { - case WIIUSE_EVENT: - /* a generic event occured */ - mid = (*env)->GetMethodID(env, cls, "prepareWiiMoteEvent", "(ISSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid, wiimotes[i]->btns, - wiimotes[i]->btns_released, wiimotes[i]->btns_held); - /* - * If IR tracking is enabled then print the coordinates - * on the virtual screen that the wiimote is pointing to. - * - * Also make sure that we see at least 1 dot. - */ - if (WIIUSE_USING_IR(wiimotes[i])) { - int a = 0; - - mid = (*env)->GetMethodID(env, cls, "prepareIRevent", - "(IIIIIIIIISS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.x, wiimotes[i]->ir.y, wiimotes[i]->ir.z, - wiimotes[i]->ir.ax, wiimotes[i]->ir.ay, - wiimotes[i]->ir.vres[0], wiimotes[i]->ir.vres[1], - wiimotes[i]->ir.offset[0], wiimotes[i]->ir.offset[1], - wiimotes[i]->ir.pos, wiimotes[i]->ir.aspect); - - mid = (*env)->GetMethodID(env, cls, "addIRPointToPreparedWiiMoteEvent", - "(IISSS)V"); - if (mid == 0) { - return; - } - /* go through each of the 4 possible IR sources */ - for (; a < 4; a++) { - /* check if the source is visible */ - if (wiimotes[i]->ir.dot[a].visible) { - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.dot[a].x, wiimotes[i]->ir.dot[a].y, - wiimotes[i]->ir.dot[a].rx, wiimotes[i]->ir.dot[a].ry, - wiimotes[i]->ir.dot[a].size); - } - } - } - - /* Motion Sensing */ - if (WIIUSE_USING_ACC(wiimotes[i])) { - /* set orientation and gravity force */ - mid = (*env)->GetMethodID(env, cls, - "addMotionSensingValues", "(FIZFFFFFFFSSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->orient_threshold, wiimotes[i]->accel_threshold, - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_SMOOTHING), wiimotes[i]->accel_calib.st_alpha, - wiimotes[i]->orient.roll, wiimotes[i]->orient.pitch, wiimotes[i]->orient.yaw, - wiimotes[i]->gforce.x, wiimotes[i]->gforce.y, wiimotes[i]->gforce.z, - wiimotes[i]->accel.x, wiimotes[i]->accel.y, wiimotes[i]->accel.z); - } - - /* add generic event to java object used to gather events in c environment */ - mid = (*env)->GetMethodID(env, cls, "addWiimoteEvent", - "()V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid); - break; - - case WIIUSE_STATUS: - /* a status event occured */ - mid = (*env)->GetMethodID(env, cls, "addStatusEvent", "(IZFSZIZZZZ)V"); - if (mid == 0) { - return; - } - /* LEDS */ - if (WIIUSE_IS_LED_SET(wiimotes[i], 1)) leds += 1; - if (WIIUSE_IS_LED_SET(wiimotes[i], 2)) leds += 2; - if (WIIUSE_IS_LED_SET(wiimotes[i], 3)) leds += 4; - if (WIIUSE_IS_LED_SET(wiimotes[i], 4)) leds += 8; - - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->unid, WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_CONNECTED), - wiimotes[i]->battery_level, leds, WIIUSE_USING_SPEAKER(wiimotes[i]), - wiimotes[i]->exp.type,WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_RUMBLE), - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_CONTINUOUS), - WIIUSE_USING_IR(wiimotes[i]),WIIUSE_USING_ACC(wiimotes[i])); - break; - - case WIIUSE_DISCONNECT: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addDisconnectionEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - default: - break; - } - } - } -} diff --git a/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.def b/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.def deleted file mode 100644 index a83a234..0000000 --- a/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.def +++ /dev/null @@ -1,27 +0,0 @@ -EXPORTS -Java_wiiusej_WiiUseApi_doConnections -Java_wiiusej_WiiUseApi_closeConnection -Java_wiiusej_WiiUseApi_shutdownApi -Java_wiiusej_WiiUseApi_activateRumble -Java_wiiusej_WiiUseApi_deactivateRumble -Java_wiiusej_WiiUseApi_activateIRTracking -Java_wiiusej_WiiUseApi_deactivateIRTracking -Java_wiiusej_WiiUseApi_activateMotionSensing -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_setLeds -Java_wiiusej_WiiUseApi_setOrientThreshold -Java_wiiusej_WiiUseApi_setAccelThreshold -Java_wiiusej_WiiUseApi_setAlphaSmoothing -Java_wiiusej_WiiUseApi_reSync -Java_wiiusej_WiiUseApi_activateSmoothing -Java_wiiusej_WiiUseApi_deactivateSmoothing -Java_wiiusej_WiiUseApi_activateContinuous -Java_wiiusej_WiiUseApi_deactivateContinuous -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_getStatus -Java_wiiusej_WiiUseApi_specialPoll -Java_wiiusej_WiiUseApi_setScreenRatio43 -Java_wiiusej_WiiUseApi_setScreenRatio169 -Java_wiiusej_WiiUseApi_setSensorBarAboveScreen -Java_wiiusej_WiiUseApi_setSensorBarBelowScreen -Java_wiiusej_WiiUseApi_setVirtualScreenResolution diff --git a/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.h b/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.h deleted file mode 100644 index 9ee751c..0000000 --- a/WiiUseJC_0.11ThreadReqeuests/wiiusej_WiiUseApi.h +++ /dev/null @@ -1,213 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class wiiusej_WiiUseApi */ - -#ifndef _Included_wiiusej_WiiUseApi -#define _Included_wiiusej_WiiUseApi -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: wiiusej_WiiUseApi - * Method: doConnections - * Signature: (IZ)I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections - (JNIEnv *, jobject, jint, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: closeConnection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: shutdownApi - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setLeds - * Signature: (IZZZZ)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds - (JNIEnv *, jobject, jint, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: setOrientThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAccelThreshold - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAccelThreshold - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAlphaSmoothing - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAlphaSmoothing - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: reSync - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_reSync - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio43 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio43 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio169 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio169 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarAboveScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarAboveScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarBelowScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarBelowScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setVirtualScreenResolution - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setVirtualScreenResolution - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getStatus - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: specialPoll - * Signature: (Lwiiusej/wiiuseapievents/EventsGatherer;)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/WiiUseJC_0.12/.cproject b/WiiUseJC_0.12/.cproject deleted file mode 100644 index 1ca9232..0000000 --- a/WiiUseJC_0.12/.cproject +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - - - diff --git a/WiiUseJC_0.12/.project b/WiiUseJC_0.12/.project deleted file mode 100644 index 0f99eae..0000000 --- a/WiiUseJC_0.12/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - WiiUseJavaC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/WiiUseJavaC/Debug} - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.append_environment - true - - - ?name? - - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.cnature - - diff --git a/WiiUseJC_0.12/lib/wiiuse.lib b/WiiUseJC_0.12/lib/wiiuse.lib deleted file mode 100644 index 4f1b69b85d3d9fe04cfceef86f1325ee47a95c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8210 zcmb_hOK%iM5H8z1jWK>dvAs^LKsbPHc5QY8k;QN4v-k_duEbHp^ zTQ^tNtSi6V{(1H4t+ku0))NQb=8+TS#qV4c35D1#re!Fwynsw#!+GXtEY*j7M z-Kx6fGUyepeZ#2~!}g$}wHMq<#V&ZENLbgTicURj5Yyr;O}1`(mQ%B~Yj!;xRpZ4; zSKYefIc~-5q4<$r`Fa&6Zq@SGPwS>PMEc>}>UM?TwjJ-W*3)c?>1)UvyFq$Z8kIt+ z@xXFxj$QFAuY?Oxa?5HLl7%9ea=d(@V3&6pE+V6iwr$tye2v4pCRHfg`AVZ2DjL=` zDW~EnqX{ZnyD|@3X|6Lh`AuB8^~aW@gc(PZq~+Tv=Qnlh5}b%+eam&dl9ex4OZiYG z8bWV~^jj}CY|rmn_wt1YTGvQhq<7-pM;jykBl{>09Zfvaru9Z+dt51m)0I_ChDPz6 zE!%CVE!23Lbgi+qUPeD9rXZ`DjOT7{mTgP62~mTq^&q^mUDP)*VCZsQ-fJ)^QPpG~ z)*R2aig{1%FlTA9TQ0eozynk^L#<4<)~9CYi~8`2(|S}~2&3XO#+ggq02@63FM9#j zh5%j-0Nm{d*g={Z2e>!}uss6s8o%#G0iIKkLt2^w_|ymRWDp>WeY)_wj_r>yczr;5 z3Sys!0nQ+O#PSRL?o8qr$GnH%SJ?kO_IZPt7@DCC+Mx#y!C~lwgU}DXkbwg*4Wlp) zBhU#$FaTX}6pq0W9J(8h!!QiO7);`1PQcWj`gWifZ9P8faWLLXg+WW(PvwRT_pKVp zX=#08LT57v72^#P%_|7u8k({%eHO9DS)Mv=gxx)bFQLWI$N;-Lx@KXc%4- z;(3bTE0T)HJmdTZ;x&z&kpZM+3fG)MWS7tqx?X)6ah@&7gT_a1?)Zco4v&Vc8!4Z% z`p_LJ7K`3mD#?sr469`XrojstEn8(qE}Erz%c>rEVoh3zMva*@M9i4AMKcL9T_&Iz ztwB-Tlji-dEAA!VXA$Al6abyH-$LL-zsJ8wNfz|6dC!Vn36A^j^D9r#^_*|$P&L9j8#0enG{a>QST%-eSS_G0{_U#C*)H1ziz zMivc6Kbq#LoxbZ%q2|`z4KH(g_4~}q)f?CRR`U;mQBN8HFx*lJa{&y%R8lB7g@U_P z#kro^c?w@}egPi!pdU@H9i+<30RD7KlH)5!Jvt;OOESoSP$s81#K-I){L$!`aD;Wj zx`nl`3EIufge_@0JDJbPcLuVPcHd6^#7PB{g;+Z&G8L%E?Bu*`B0Kp*R>YU=gvQNvoD{x^iNHeAA`V#eeK{WhI{s_HS7c-+f)( zG%HFO^uF0)RxW6UUb*OKuC$TQ!ZaIyN5W7dgRt5$?nct>UJ_Ot#}Wa4FIeI6GW5c$ z16qsHOJxe&Un%5tn&sw&SsG{=MC*t}!@NX+uwpvAthj?^3_Q9x9bkBV%Ci@o3-Nl< zp+3lPR5r!HTK0)aS{-6&ex}BNR59J^$#-3I^}a!^4l^7h2~;rqx?e{aqMu*x1t(#@ zjxrpTx-ziV_iG{EI`FEGH*R&tL|V+CR59I-WfPF-MlTayag|iVx4cuiCM$Rfb?RbB zamhS`ZFwzoO*EWA+~X!Lzx6UuRZO?4NxF6$nC2ZsVSPm$XtKuSRZbYV!Tn}WXiZj@ zthC2K!@CoMQpJ?(nTtOU-y%|P1WCOmD4f>UGPe|u`5j{RMKSr6kHM;9N=?K6ndw;r zrQQ8eRR1=qFk06#+eAxBg$4{f|E9{oR56`y3r#YjbBHx)V95)vc?njSt?RnbMAuow zA8LXhxkIxFsA5X}<;BFvElwl;uz|myxJe#x#K6^_1(bs9@TSu>mte=E2Bv&*U~nya z`J^~D#_@vJ3RCm0rc;9+q8 E0}hP#`~Uy| diff --git a/WiiUseJC_0.12/wiiuse.h b/WiiUseJC_0.12/wiiuse.h deleted file mode 100644 index 9dff81c..0000000 --- a/WiiUseJC_0.12/wiiuse.h +++ /dev/null @@ -1,653 +0,0 @@ -/* - * wiiuse - * - * Written By: - * Michael Laforest < para > - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * This file is part of wiiuse. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * $Header$ - * - */ - -/** - * @file - * - * @brief API header file. - * - * If this file is included from inside the wiiuse source - * and not from a third party program, then wiimote_internal.h - * is also included which extends this file. - */ - -#ifndef WIIUSE_H_INCLUDED -#define WIIUSE_H_INCLUDED - -#ifdef _WIN32 - /* windows */ - #include -#else - /* nix */ - #include -#endif - -#ifdef WIIUSE_INTERNAL_H_INCLUDED - #define WCONST -#else - #define WCONST const -#endif - -/* led bit masks */ -#define WIIMOTE_LED_NONE 0x00 -#define WIIMOTE_LED_1 0x10 -#define WIIMOTE_LED_2 0x20 -#define WIIMOTE_LED_3 0x40 -#define WIIMOTE_LED_4 0x80 - -/* button codes */ -#define WIIMOTE_BUTTON_TWO 0x0001 -#define WIIMOTE_BUTTON_ONE 0x0002 -#define WIIMOTE_BUTTON_B 0x0004 -#define WIIMOTE_BUTTON_A 0x0008 -#define WIIMOTE_BUTTON_MINUS 0x0010 -#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020 -#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040 -#define WIIMOTE_BUTTON_HOME 0x0080 -#define WIIMOTE_BUTTON_LEFT 0x0100 -#define WIIMOTE_BUTTON_RIGHT 0x0200 -#define WIIMOTE_BUTTON_DOWN 0x0400 -#define WIIMOTE_BUTTON_UP 0x0800 -#define WIIMOTE_BUTTON_PLUS 0x1000 -#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000 -#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000 -#define WIIMOTE_BUTTON_UNKNOWN 0x8000 -#define WIIMOTE_BUTTON_ALL 0x1F9F - -/* nunchul button codes */ -#define NUNCHUK_BUTTON_Z 0x01 -#define NUNCHUK_BUTTON_C 0x02 -#define NUNCHUK_BUTTON_ALL 0x03 - -/* classic controller button codes */ -#define CLASSIC_CTRL_BUTTON_UP 0x0001 -#define CLASSIC_CTRL_BUTTON_LEFT 0x0002 -#define CLASSIC_CTRL_BUTTON_ZR 0x0004 -#define CLASSIC_CTRL_BUTTON_X 0x0008 -#define CLASSIC_CTRL_BUTTON_A 0x0010 -#define CLASSIC_CTRL_BUTTON_Y 0x0020 -#define CLASSIC_CTRL_BUTTON_B 0x0040 -#define CLASSIC_CTRL_BUTTON_ZL 0x0080 -#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200 -#define CLASSIC_CTRL_BUTTON_PLUS 0x0400 -#define CLASSIC_CTRL_BUTTON_HOME 0x0800 -#define CLASSIC_CTRL_BUTTON_MINUS 0x1000 -#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000 -#define CLASSIC_CTRL_BUTTON_DOWN 0x4000 -#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000 -#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF - -/* guitar hero 3 button codes */ -#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001 -#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008 -#define GUITAR_HERO_3_BUTTON_GREEN 0x0010 -#define GUITAR_HERO_3_BUTTON_BLUE 0x0020 -#define GUITAR_HERO_3_BUTTON_RED 0x0040 -#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080 -#define GUITAR_HERO_3_BUTTON_PLUS 0x0400 -#define GUITAR_HERO_3_BUTTON_MINUS 0x1000 -#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000 -#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF - - -/* wiimote option flags */ -#define WIIUSE_SMOOTHING 0x01 -#define WIIUSE_CONTINUOUS 0x02 -#define WIIUSE_ORIENT_THRESH 0x04 -#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH) - -#define WIIUSE_ORIENT_PRECISION 100.0f - -/* expansion codes */ -#define EXP_NONE 0 -#define EXP_NUNCHUK 1 -#define EXP_CLASSIC 2 -#define EXP_GUITAR_HERO_3 3 - -/* IR correction types */ -typedef enum ir_position_t { - WIIUSE_IR_ABOVE, - WIIUSE_IR_BELOW -} ir_position_t; - -/** - * @brief Check if a button is pressed. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_PRESSED(dev, button) ((dev->btns & button) == button) - -/** - * @brief Check if a button is being held. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is held, 0 if not. - */ -#define IS_HELD(dev, button) ((dev->btns_held & button) == button) - -/** - * @brief Check if a button is released on this event. \n\n - * This does not mean the button is not pressed, it means \n - * this button was just now released. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is released, 0 if not. - * - */ -#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button) - -/** - * @brief Check if a button has just been pressed this event. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button)) - -/** - * @brief Return the IR sensitivity level. - * @param wm Pointer to a wiimote_t structure. - * @param lvl [out] Pointer to an int that will hold the level setting. - * If no level is set 'lvl' will be set to 0. - */ -#define WIIUSE_GET_IR_SENSITIVITY(dev, lvl) \ - do { \ - if ((wm->state & 0x0200) == 0x0200) *lvl = 1; \ - else if ((wm->state & 0x0400) == 0x0400) *lvl = 2; \ - else if ((wm->state & 0x0800) == 0x0800) *lvl = 3; \ - else if ((wm->state & 0x1000) == 0x1000) *lvl = 4; \ - else if ((wm->state & 0x2000) == 0x2000) *lvl = 5; \ - else *lvl = 0; \ - } while (0) - -#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020) -#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040) -#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080) -#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100) - -#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num) - -/* - * Largest known payload is 21 bytes. - * Add 2 for the prefix and round up to a power of 2. - */ -#define MAX_PAYLOAD 32 - -/* - * This is left over from an old hack, but it may actually - * be a useful feature to keep so it wasn't removed. - */ -#ifdef WIN32 - #define WIIMOTE_DEFAULT_TIMEOUT 10 - #define WIIMOTE_EXP_TIMEOUT 10 -#endif - -typedef unsigned char byte; -typedef char sbyte; - -struct wiimote_t; -struct vec3b_t; -struct orient_t; -struct gforce_t; - - -/** - * @brief Callback that handles a read event. - * - * @param wm Pointer to a wiimote_t structure. - * @param data Pointer to the filled data block. - * @param len Length in bytes of the data block. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when the wiimote has returned the full data requested by a previous - * call to wiiuse_read_data(). - */ -typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len); - - -/** - * @struct read_req_t - * @brief Data read request structure. - */ -struct read_req_t { - wiiuse_read_cb cb; /**< read data callback */ - byte* buf; /**< buffer where read data is written */ - unsigned int addr; /**< the offset that the read started at */ - unsigned short size; /**< the length of the data read */ - unsigned short wait; /**< num bytes still needed to finish read */ - byte dirty; /**< set to 1 if not using callback and needs to be cleaned up */ - - struct read_req_t* next; /**< next read request in the queue */ -}; - - -/** - * @struct vec2b_t - * @brief Unsigned x,y byte vector. - */ -typedef struct vec2b_t { - byte x, y; -} vec2b_t; - - -/** - * @struct vec3b_t - * @brief Unsigned x,y,z byte vector. - */ -typedef struct vec3b_t { - byte x, y, z; -} vec3b_t; - - -/** - * @struct vec3f_t - * @brief Signed x,y,z float struct. - */ -typedef struct vec3f_t { - float x, y, z; -} vec3f_t; - - -/** - * @struct orient_t - * @brief Orientation struct. - * - * Yaw, pitch, and roll range from -180 to 180 degrees. - */ -typedef struct orient_t { - float roll; /**< roll, this may be smoothed if enabled */ - float pitch; /**< pitch, this may be smoothed if enabled */ - float yaw; - - float a_roll; /**< absolute roll, unsmoothed */ - float a_pitch; /**< absolute pitch, unsmoothed */ -} orient_t; - - -/** - * @struct gforce_t - * @brief Gravity force struct. - */ -typedef struct gforce_t { - float x, y, z; -} gforce_t; - - -/** - * @struct accel_t - * @brief Accelerometer struct. For any device with an accelerometer. - */ -typedef struct accel_t { - struct vec3b_t cal_zero; /**< zero calibration */ - struct vec3b_t cal_g; /**< 1g difference around 0cal */ - - float st_roll; /**< last smoothed roll value */ - float st_pitch; /**< last smoothed roll pitch */ - float st_alpha; /**< alpha value for smoothing [0-1] */ -} accel_t; - - -/** - * @struct ir_dot_t - * @brief A single IR source. - */ -typedef struct ir_dot_t { - byte visible; /**< if the IR source is visible */ - - unsigned int x; /**< interpolated X coordinate */ - unsigned int y; /**< interpolated Y coordinate */ - - short rx; /**< raw X coordinate (0-1023) */ - short ry; /**< raw Y coordinate (0-767) */ - - byte order; /**< increasing order by x-axis value */ - - byte size; /**< size of the IR dot (0-15) */ -} ir_dot_t; - - -/** - * @enum aspect_t - * @brief Screen aspect ratio. - */ -typedef enum aspect_t { - WIIUSE_ASPECT_4_3, - WIIUSE_ASPECT_16_9 -} aspect_t; - - -/** - * @struct ir_t - * @brief IR struct. Hold all data related to the IR tracking. - */ -typedef struct ir_t { - struct ir_dot_t dot[4]; /**< IR dots */ - byte num_dots; /**< number of dots at this time */ - - enum aspect_t aspect; /**< aspect ratio of the screen */ - - enum ir_position_t pos; /**< IR sensor bar position */ - - unsigned int vres[2]; /**< IR virtual screen resolution */ - int offset[2]; /**< IR XY correction offset */ - int state; /**< keeps track of the IR state */ - - int ax; /**< absolute X coordinate */ - int ay; /**< absolute Y coordinate */ - - int x; /**< calculated X coordinate */ - int y; /**< calculated Y coordinate */ - - float distance; /**< pixel distance between first 2 dots*/ - float z; /**< calculated distance */ -} ir_t; - - -/** - * @struct joystick_t - * @brief Joystick calibration structure. - * - * The angle \a ang is relative to the positive y-axis into quadrant I - * and ranges from 0 to 360 degrees. So if the joystick is held straight - * upwards then angle is 0 degrees. If it is held to the right it is 90, - * down is 180, and left is 270. - * - * The magnitude \a mag is the distance from the center to where the - * joystick is being held. The magnitude ranges from 0 to 1. - * If the joystick is only slightly tilted from the center the magnitude - * will be low, but if it is closer to the outter edge the value will - * be higher. - */ -typedef struct joystick_t { - struct vec2b_t max; /**< maximum joystick values */ - struct vec2b_t min; /**< minimum joystick values */ - struct vec2b_t center; /**< center joystick values */ - - float ang; /**< angle the joystick is being held */ - float mag; /**< magnitude of the joystick (range 0-1) */ -} joystick_t; - - -/** - * @struct nunchuk_t - * @brief Nunchuk expansion device. - */ -typedef struct nunchuk_t { - struct accel_t accel_calib; /**< nunchuk accelerometer calibration */ - struct joystick_t js; /**< joystick calibration */ - - int* flags; /**< options flag (points to wiimote_t.flags) */ - - byte btns; /**< what buttons have just been pressed */ - byte btns_held; /**< what buttons are being held down */ - byte btns_released; /**< what buttons were just released this */ - - float orient_threshold; /**< threshold for orient to generate an event */ - int accel_threshold; /**< threshold for accel to generate an event */ - - struct vec3b_t accel; /**< current raw acceleration data */ - struct orient_t orient; /**< current orientation on each axis */ - struct gforce_t gforce; /**< current gravity forces on each axis */ -} nunchuk_t; - - -/** - * @struct classic_ctrl_t - * @brief Classic controller expansion device. - */ -typedef struct classic_ctrl_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float r_shoulder; /**< right shoulder button (range 0-1) */ - float l_shoulder; /**< left shoulder button (range 0-1) */ - - struct joystick_t ljs; /**< left joystick calibration */ - struct joystick_t rjs; /**< right joystick calibration */ -} classic_ctrl_t; - - -/** - * @struct guitar_hero_3_t - * @brief Guitar Hero 3 expansion device. - */ -typedef struct guitar_hero_3_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float whammy_bar; /**< whammy bar (range 0-1) */ - - struct joystick_t js; /**< joystick calibration */ -} guitar_hero_3_t; - - -/** - * @struct expansion_t - * @brief Generic expansion device plugged into wiimote. - */ -typedef struct expansion_t { - int type; /**< type of expansion attached */ - - union { - struct nunchuk_t nunchuk; - struct classic_ctrl_t classic; - struct guitar_hero_3_t gh3; - }; -} expansion_t; - - -/** - * @enum win32_bt_stack_t - * @brief Available bluetooth stacks for Windows. - */ -typedef enum win_bt_stack_t { - WIIUSE_STACK_UNKNOWN, - WIIUSE_STACK_MS, - WIIUSE_STACK_BLUESOLEIL -} win_bt_stack_t; - - -/** - * @struct wiimote_state_t - * @brief Significant data from the previous event. - */ -typedef struct wiimote_state_t { - /* expansion_t */ - float exp_ljs_ang; - float exp_rjs_ang; - float exp_ljs_mag; - float exp_rjs_mag; - unsigned short exp_btns; - struct orient_t exp_orient; - struct vec3b_t exp_accel; - float exp_r_shoulder; - float exp_l_shoulder; - - /* ir_t */ - int ir_ax; - int ir_ay; - float ir_distance; - - struct orient_t orient; - unsigned short btns; - - struct vec3b_t accel; -} wiimote_state_t; - - -/** - * @enum WIIUSE_EVENT_TYPE - * @brief Events that wiiuse can generate from a poll. - */ -typedef enum WIIUSE_EVENT_TYPE { - WIIUSE_NONE = 0, - WIIUSE_EVENT, - WIIUSE_STATUS, - WIIUSE_CONNECT, - WIIUSE_DISCONNECT, - WIIUSE_UNEXPECTED_DISCONNECT, - WIIUSE_READ_DATA, - WIIUSE_NUNCHUK_INSERTED, - WIIUSE_NUNCHUK_REMOVED, - WIIUSE_CLASSIC_CTRL_INSERTED, - WIIUSE_CLASSIC_CTRL_REMOVED, - WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED -} WIIUSE_EVENT_TYPE; - -/** - * @struct wiimote_t - * @brief Wiimote structure. - */ -typedef struct wiimote_t { - WCONST int unid; /**< user specified id */ - - #ifndef WIN32 - WCONST bdaddr_t bdaddr; /**< bt address */ - WCONST char bdaddr_str[18]; /**< readable bt address */ - WCONST int out_sock; /**< output socket */ - WCONST int in_sock; /**< input socket */ - #else - WCONST HANDLE dev_handle; /**< HID handle */ - WCONST OVERLAPPED hid_overlap; /**< overlap handle */ - WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */ - WCONST int timeout; /**< read timeout */ - WCONST byte normal_timeout; /**< normal timeout */ - WCONST byte exp_timeout; /**< timeout for expansion handshake */ - #endif - - WCONST int state; /**< various state flags */ - WCONST byte leds; /**< currently lit leds */ - WCONST float battery_level; /**< battery level */ - - WCONST int flags; /**< options flag */ - - WCONST byte handshake_state; /**< the state of the connection handshake */ - - WCONST struct read_req_t* read_req; /**< list of data read requests */ - WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */ - WCONST struct expansion_t exp; /**< wiimote expansion device */ - - WCONST struct vec3b_t accel; /**< current raw acceleration data */ - WCONST struct orient_t orient; /**< current orientation on each axis */ - WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ - - WCONST struct ir_t ir; /**< IR data */ - - WCONST unsigned short btns; /**< what buttons have just been pressed */ - WCONST unsigned short btns_held; /**< what buttons are being held down */ - WCONST unsigned short btns_released; /**< what buttons were just released this */ - - WCONST float orient_threshold; /**< threshold for orient to generate an event */ - WCONST int accel_threshold; /**< threshold for accel to generate an event */ - - WCONST struct wiimote_state_t lstate; /**< last saved state */ - - WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */ - WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */ -} wiimote; - - -/***************************************** - * - * Include API specific stuff - * - *****************************************/ - -#ifdef _WIN32 - #define WIIUSE_EXPORT_DECL __declspec(dllexport) - #define WIIUSE_IMPORT_DECL __declspec(dllimport) -#else - #define WIIUSE_EXPORT_DECL - #define WIIUSE_IMPORT_DECL -#endif - -#ifdef WIIUSE_COMPILE_LIB - #define WIIUSE_EXPORT WIIUSE_EXPORT_DECL -#else - #define WIIUSE_EXPORT WIIUSE_IMPORT_DECL -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* wiiuse.c */ -WIIUSE_EXPORT extern const char* wiiuse_version(); - -WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnected(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_cleanup(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_rumble(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_toggle_rumble(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds); -WIIUSE_EXPORT extern void wiiuse_motion_sensing(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern int wiiuse_read_data(struct wiimote_t* wm, byte* buffer, unsigned int offset, unsigned short len); -WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len); -WIIUSE_EXPORT extern void wiiuse_status(struct wiimote_t* wm); -WIIUSE_EXPORT extern struct wiimote_t* wiiuse_get_by_id(struct wiimote_t** wm, int wiimotes, int unid); -WIIUSE_EXPORT extern int wiiuse_set_flags(struct wiimote_t* wm, int enable, int disable); -WIIUSE_EXPORT extern float wiiuse_set_smooth_alpha(struct wiimote_t* wm, float alpha); -WIIUSE_EXPORT extern void wiiuse_set_bluetooth_stack(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type); -WIIUSE_EXPORT extern void wiiuse_set_orient_threshold(struct wiimote_t* wm, float threshold); -WIIUSE_EXPORT extern void wiiuse_resync(struct wiimote_t* wm); -WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout); -WIIUSE_EXPORT extern void wiiuse_set_accel_threshold(struct wiimote_t* wm, int threshold); - -/* connect.c */ -WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes); -WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm); - -/* events.c */ -WIIUSE_EXPORT extern int wiiuse_poll(struct wiimote_t** wm, int wiimotes); - -/* ir.c */ -WIIUSE_EXPORT extern void wiiuse_set_ir(struct wiimote_t* wm, int status); -WIIUSE_EXPORT extern void wiiuse_set_ir_vres(struct wiimote_t* wm, unsigned int x, unsigned int y); -WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos); -WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect); -WIIUSE_EXPORT extern void wiiuse_set_ir_sensitivity(struct wiimote_t* wm, int level); - -/* nunchuk.c */ -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_orient_threshold(struct wiimote_t* wm, float threshold); -WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct wiimote_t* wm, int threshold); - - -#ifdef __cplusplus -} -#endif - - -#endif /* WIIUSE_H_INCLUDED */ - diff --git a/WiiUseJC_0.12/wiiusej_WiiUseApi.c b/WiiUseJC_0.12/wiiusej_WiiUseApi.c deleted file mode 100644 index 0a33786..0000000 --- a/WiiUseJC_0.12/wiiusej_WiiUseApi.c +++ /dev/null @@ -1,583 +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 . - */ -#ifndef WIN32 -#include -#else - -#endif - -#include "wiiusej_WiiUseApi.h" -#include "wiiuse.h" -/* - * These are some identifiers for wiimotes - * - * See below in main() for what they are used for. - */ -#define WIIMOTE_STATE_RUMBLE 0x0010 -#define WIIMOTE_STATE_CONNECTED 0x0008 -#define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s)) -#define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s)) -#define WIIUSE_GET_IR_SENSITIVITY_CORRECTED(wm, lvl) \ - do { \ - if ((wm->state & 0x0200) == 0x0200) *lvl = 1; \ - else if ((wm->state & 0x0400) == 0x0400) *lvl = 2; \ - else if ((wm->state & 0x0800) == 0x0800) *lvl = 3; \ - else if ((wm->state & 0x1000) == 0x1000) *lvl = 4; \ - else if ((wm->state & 0x2000) == 0x2000) *lvl = 5; \ - else *lvl = 0; \ - } while (0) - -/********************* VARIABLES DECLARATIONS *****************************/ - -/* - * Make a temp array of wiimote ids. - * Here I only anticipate connecting up to - * two wiimotes. Each wiimote connected - * will get one of these ids. - */ -static wiimote** wiimotes; -static int nbMaxWiimotes; - -/****************** GENERAL FUNCTIONS DEFINITIONS *************************/ - -/** - * Connect to a wiimote or wiimotes once an address is known. - * @param nbWiimotes The number of wiimotes. - * @return The number of wiimotes that successfully connected. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_connect -(JNIEnv *env, jobject obj, jint nbWiimotes) { - return wiiuse_connect(wiimotes, nbWiimotes); -} - -/** - * Find a wiimote or wiimotes. - * @param nbMaxWiimotes The number of wiimotes. - * @param timeout The number of seconds before the search times out. - * @return The number of wiimotes found. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_find -(JNIEnv *env, jobject obj, jint nbMaxWiimotes, jint timeout) { - return wiiuse_find(wiimotes, nbMaxWiimotes, timeout); -} - -/** - * Initialize an array of wiimote structures (for the C side of the library). - * @param nbPossibleWiimotes size of the array. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_init -(JNIEnv *env, jobject obj, jint nbPossibleWiimotes) { - wiimotes = wiiuse_init(nbPossibleWiimotes); - nbMaxWiimotes = nbPossibleWiimotes; -} - -/** - * Close connection to the wiimote with the given id. - * - * @param id the id of the wiimote to disconnect.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection -(JNIEnv *env, jobject obj, jint id) { - wiiuse_disconnect(wiimotes[id]); -} - -/** - * Get unique id of a wiimote in the wiimotes array. - * Please make sure you call an existing index with a - * wiimote initialized at this index, - * other wise you'll get a wrong value. - * @param index index of the wiimote in the wiimotes array. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_getUnId -(JNIEnv *env, jobject obj, jint index) { - return wiimotes[index]->unid; -} - -/** - * Shutdown api. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_cleanUp -(JNIEnv *env, jobject obj) { - wiiuse_cleanup(wiimotes, nbMaxWiimotes); -} - -/** - * Activate rumble for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble -(JNIEnv *env, jobject obj, jint id) { - wiiuse_rumble(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 1); -} - -/** - * Deactivate rumble for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble -(JNIEnv *env, jobject obj, jint id) { - wiiuse_rumble(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 0); -} - -/** - * Activate IR TRacking for the wiimote with the given id. - * @param id the id of the wiimote. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 1); -} - -/** - * Deactivate IR TRacking for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 0); -} - -/** - * Activate Motion Sensing for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_motion_sensing(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 1); -} - -/** - * Deactivate Motion Sensing for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_motion_sensing(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 0); -} - -/** - * Set wiimote leds status. - * @param id the id of the wiimote concerned - * @param led1 status of led1: True=ON, False=OFF - * @param led2 status of led2: True=ON, False=OFF - * @param led3 status of led3: True=ON, False=OFF - * @param led4 status of led4: True=ON, False=OFF - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds -(JNIEnv *env, jobject obj, jint id, jboolean led1, jboolean led2, jboolean led3, jboolean led4) { - int leds = 0; - - if (led1) leds |= WIIMOTE_LED_1; - if (led2) leds |= WIIMOTE_LED_2; - if (led3) leds |= WIIMOTE_LED_3; - if (led4) leds |= WIIMOTE_LED_4; - - wiiuse_set_leds(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), leds); -} - -/** - * Set how many degrees an angle must change to generate an event. - * @param id id of the wiimote concerned - * @param thresh minimum angle detected by an event - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold -(JNIEnv *env, jobject obj, jint id, jfloat thresh) { - wiiuse_set_orient_threshold(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), thresh); -} - -/** - * Set how much acceleration must change to generate an event. - * @param id id of the wiimote concerned - * @param val minimum value detected by an event - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAccelThreshold -(JNIEnv *env, jobject obj, jint id, jint val) { - wiiuse_set_accel_threshold(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), val); -} - -/** - * Set alpha smoothing parameter for the given id. - * @param id id of the wiimote concerned - * @param value alpha smoothing value - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAlphaSmoothing -(JNIEnv *env, jobject obj, jint id, jfloat val) { - wiiuse_set_smooth_alpha(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), val); -} - -/** - * Try to resync with the wiimote by starting a new handshake. - * @param id id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_reSync -(JNIEnv *env, jobject obj, jint id) { - wiiuse_resync(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id)); -} - -/** - * Make the the accelerometers give smoother results. - * This is set by default. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), WIIUSE_SMOOTHING, 0); -} - -/** - * Make the the accelerometers give raw results. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 0, WIIUSE_SMOOTHING); -} - -/** - * Make the wiimote generate an event each time we poll. - * Not set by default. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), WIIUSE_CONTINUOUS, 0); -} - -/** - * Make the wiimote generate an event only when there is one. - * (default behavior) - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), 0, WIIUSE_CONTINUOUS); -} - -/** - * Notify wiiuse that your screen has an aspect ratio of 4/3. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio43 -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_aspect_ratio(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), WIIUSE_ASPECT_4_3); -} - -/** - * Notify wiiuse that your screen has an aspect ratio of 16/9. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio169 -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_aspect_ratio(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), WIIUSE_ASPECT_4_3); -} - -/** - * Notify wiiuse that the sensor bar is above your screen. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarAboveScreen -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir_position(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), WIIUSE_IR_ABOVE); -} - -/** - * Notify wiiuse that the sensor bar is below your screen. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarBelowScreen -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir_position(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), WIIUSE_IR_BELOW); -} - -/** - * Set virtual screen resolution. It is used to automatically - * compute the position of a cursor on this virtual screen - * using the sensor bar. These results come in the IREvent. - * @param id the id of the wiimote concerned - * @param x x resolution. - * @param y y resolution. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setVirtualScreenResolution -(JNIEnv *env, jobject obj, jint id, jint x, jint y) { - wiiuse_set_ir_vres(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), x, y); -} - -/** - * Get status from the wiimotes and send it through call backs. - * - * @param id the id of the wiimote. Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus -(JNIEnv *env, jobject obj, jint id) { - wiiuse_status(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id)); -} - -/** - * Set the normal and expansion handshake timeouts. - * - * @param id - * the id of the wiimote concerned. - * @param normalTimeout - * The timeout in milliseconds for a normal read. - * @param expansionTimeout - * The timeout in millisecondsd to wait for an expansion - * handshake. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setTimeout -(JNIEnv *env, jobject obj, jint id, jshort normalTimeout, jshort expansionTimeout) { - wiiuse_set_timeout(wiimotes, nbMaxWiimotes, normalTimeout, expansionTimeout); -} - -/** - * Set the IR sensitivity. - * - * @param id - * the id of the wiimote concerned. - * @param level - * 1-5, same as Wii system sensitivity setting. If the level is < - * 1, then level will be set to 1. If the level is > 5, then - * level will be set to 5. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setIrSensitivity -(JNIEnv *env, jobject obj, jint id, jint level) { - wiiuse_set_ir_sensitivity(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), level); -} - -/** - * Set how many degrees an angle must change to generate an event for the nunchuk. - * @param id id of the wiimote concerned - * @param thresh minimum angle detected by an event - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setNunchukOrientationThreshold -(JNIEnv *env, jobject obj, jint id, jfloat thresh) { - wiiuse_set_nunchuk_orient_threshold(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), thresh); -} - -/** - * Set how much acceleration must change to generate an event for the nunchuk. - * @param id id of the wiimote concerned - * @param val minimum value detected by an event - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setNunchukAccelerationThreshold -(JNIEnv *env, jobject obj, jint id, jint val) { - wiiuse_set_nunchuk_accel_threshold(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), val); -} - -/** - * Force the bluetooth stack type.(useful only for windows) - * - * @param bluetoothStackType - * must be WiiUseApi.WIIUSE_STACK_UNKNOWN or WiiUseApi.WIIUSE_STACK_MS or - * WiiUseApi.WIIUSE_STACK_BLUESOLEIL. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_windowsSetBluetoothStack -(JNIEnv *env, jobject obj, jint bluetoothStackType) { - if (bluetoothStackType == 0) { - wiiuse_set_bluetooth_stack(wiimotes, nbMaxWiimotes, WIIUSE_STACK_UNKNOWN); - } else if (bluetoothStackType == 1) { - wiiuse_set_bluetooth_stack(wiimotes, nbMaxWiimotes, WIIUSE_STACK_MS); - } else if (bluetoothStackType == 2) { - wiiuse_set_bluetooth_stack(wiimotes, nbMaxWiimotes, WIIUSE_STACK_BLUESOLEIL); - } -} - -/** - * Get status and values from the wiimotes and send it through callbacks. - * @param wim the wiimote object to fill with the datas. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll -(JNIEnv *env, jobject obj, jobject gath) { - - /* Variables Declarations */ - int i; - short leds = 0; - jclass cls = (*env)->GetObjectClass(env, gath); - jmethodID mid; - - if (wiiuse_poll(wiimotes, nbMaxWiimotes)) { - /* - * This happens if something happened on any wiimote. - * So go through each one and check if anything happened. - */ - for (i=0; i < nbMaxWiimotes; ++i) { - switch (wiimotes[i]->event) { - case WIIUSE_EVENT: - /* a generic event occured */ - mid = (*env)->GetMethodID(env, cls, "prepareWiiMoteEvent", "(ISSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid, wiimotes[i]->btns, - wiimotes[i]->btns_released, wiimotes[i]->btns_held); - /* - * If IR tracking is enabled then print the coordinates - * on the virtual screen that the wiimote is pointing to. - * - * Also make sure that we see at least 1 dot. - */ - if (WIIUSE_USING_IR(wiimotes[i])) { - int a; - WIIUSE_GET_IR_SENSITIVITY_CORRECTED(wiimotes[i], &a); - - mid = (*env)->GetMethodID(env, cls, "prepareIRevent", - "(IIFIIIIIISSSF)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.x, wiimotes[i]->ir.y, wiimotes[i]->ir.z, - wiimotes[i]->ir.ax, wiimotes[i]->ir.ay, - wiimotes[i]->ir.vres[0], wiimotes[i]->ir.vres[1], - wiimotes[i]->ir.offset[0], wiimotes[i]->ir.offset[1], - wiimotes[i]->ir.pos, wiimotes[i]->ir.aspect, - a , wiimotes[i]->ir.distance); - - mid = (*env)->GetMethodID(env, cls, "addIRPointToPreparedWiiMoteEvent", - "(IISSS)V"); - if (mid == 0) { - return; - } - /* go through each of the 4 possible IR sources */ - for (a=0; a < 4; a++) { - /* check if the source is visible */ - if (wiimotes[i]->ir.dot[a].visible) { - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->ir.dot[a].x, wiimotes[i]->ir.dot[a].y, - wiimotes[i]->ir.dot[a].rx, wiimotes[i]->ir.dot[a].ry, - wiimotes[i]->ir.dot[a].size); - } - } - } - - /* Motion Sensing */ - if (WIIUSE_USING_ACC(wiimotes[i])) { - /* set orientation and gravity force */ - mid = (*env)->GetMethodID(env, cls, - "addMotionSensingValues", "(FIZFFFFFFFFFSSS)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->orient_threshold, wiimotes[i]->accel_threshold, - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_SMOOTHING), wiimotes[i]->accel_calib.st_alpha, - wiimotes[i]->orient.roll, wiimotes[i]->orient.pitch, wiimotes[i]->orient.yaw, - wiimotes[i]->orient.a_roll, wiimotes[i]->orient.a_pitch, - wiimotes[i]->gforce.x, wiimotes[i]->gforce.y, wiimotes[i]->gforce.z, - wiimotes[i]->accel.x, wiimotes[i]->accel.y, wiimotes[i]->accel.z); - } - - /* Expansions support support*/ - if (WIIUSE_USING_EXP(wiimotes[i])) { - /* Nunchuk support */ - if (wiimotes[i]->exp.type == EXP_NUNCHUK) { - /* put nunchuk values to wiimote generic event */ - mid = (*env)->GetMethodID(env, cls, - "addNunchunkEventToPreparedWiimoteEvent", "(SSSFIZFFFFFFFFFSSSFFSSSSSS)V"); - if (mid == 0) { - return; - } - struct nunchuk_t* nc = (nunchuk_t*)&wiimotes[i]->exp.nunchuk; - - (*env)->CallVoidMethod(env, gath, mid, - /* buttons */ - nc->btns,nc->btns_released,nc->btns_held, - /* motion sensing */ - nc->orient_threshold,nc->accel_threshold, - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_SMOOTHING),nc->accel_calib.st_alpha, - nc->orient.roll, nc->orient.pitch, nc->orient.yaw, - nc->orient.a_roll, nc->orient.a_pitch, - nc->gforce.x, nc->gforce.y, nc->gforce.z, - nc->accel.x, nc->accel.y, nc->accel.z, - /* joystick */ - nc->js.ang,nc->js.mag, - nc->js.max.x,nc->js.max.y, - nc->js.min.x,nc->js.min.y, - nc->js.center.x,nc->js.center.y); - } - } - - /* add generic event to java object used to gather events in c environment */ - mid = (*env)->GetMethodID(env, cls, "addWiimoteEvent", - "()V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid); - break; - - case WIIUSE_DISCONNECT: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addDisconnectionEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - case WIIUSE_UNEXPECTED_DISCONNECT: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addDisconnectionEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - case WIIUSE_NUNCHUK_INSERTED: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addNunchukInsertedEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - case WIIUSE_NUNCHUK_REMOVED: - /* the wiimote disconnected */ - mid = (*env)->GetMethodID(env, cls, "addNunchukRemovedEvent", "(I)V"); - if (mid == 0) { - return; - } - (*env)->CallVoidMethod(env, gath, mid, wiimotes[i]->unid); - break; - - case WIIUSE_STATUS: - /* a status event occured */ - mid = (*env)->GetMethodID(env, cls, "addStatusEvent", "(IZFSZIZZZZ)V"); - if (mid == 0) { - return; - } - /* LEDS */ - if (WIIUSE_IS_LED_SET(wiimotes[i], 1)) leds += 1; - if (WIIUSE_IS_LED_SET(wiimotes[i], 2)) leds += 2; - if (WIIUSE_IS_LED_SET(wiimotes[i], 3)) leds += 4; - if (WIIUSE_IS_LED_SET(wiimotes[i], 4)) leds += 8; - - (*env)->CallVoidMethod(env, gath, mid, - wiimotes[i]->unid, WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_CONNECTED), - wiimotes[i]->battery_level, leds, WIIUSE_USING_SPEAKER(wiimotes[i]), - wiimotes[i]->exp.type,WIIMOTE_IS_SET(wiimotes[i], WIIMOTE_STATE_RUMBLE), - WIIMOTE_IS_FLAG_SET(wiimotes[i],WIIUSE_CONTINUOUS), - WIIUSE_USING_IR(wiimotes[i]),WIIUSE_USING_ACC(wiimotes[i])); - break; - - default: - break; - } - } - } -} diff --git a/WiiUseJC_0.12/wiiusej_WiiUseApi.def b/WiiUseJC_0.12/wiiusej_WiiUseApi.def deleted file mode 100644 index e7aebd3..0000000 --- a/WiiUseJC_0.12/wiiusej_WiiUseApi.def +++ /dev/null @@ -1,34 +0,0 @@ -EXPORTS -Java_wiiusej_WiiUseApi_connect -Java_wiiusej_WiiUseApi_find -Java_wiiusej_WiiUseApi_init -Java_wiiusej_WiiUseApi_closeConnection -Java_wiiusej_WiiUseApi_getUnId -Java_wiiusej_WiiUseApi_cleanUp -Java_wiiusej_WiiUseApi_activateRumble -Java_wiiusej_WiiUseApi_deactivateRumble -Java_wiiusej_WiiUseApi_activateIRTracking -Java_wiiusej_WiiUseApi_deactivateIRTracking -Java_wiiusej_WiiUseApi_activateMotionSensing -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_setLeds -Java_wiiusej_WiiUseApi_setOrientThreshold -Java_wiiusej_WiiUseApi_setAccelThreshold -Java_wiiusej_WiiUseApi_setAlphaSmoothing -Java_wiiusej_WiiUseApi_reSync -Java_wiiusej_WiiUseApi_activateSmoothing -Java_wiiusej_WiiUseApi_deactivateSmoothing -Java_wiiusej_WiiUseApi_activateContinuous -Java_wiiusej_WiiUseApi_deactivateContinuous -Java_wiiusej_WiiUseApi_setScreenRatio43 -Java_wiiusej_WiiUseApi_setScreenRatio169 -Java_wiiusej_WiiUseApi_setSensorBarAboveScreen -Java_wiiusej_WiiUseApi_setSensorBarBelowScreen -Java_wiiusej_WiiUseApi_setVirtualScreenResolution -Java_wiiusej_WiiUseApi_getStatus -Java_wiiusej_WiiUseApi_setTimeout -Java_wiiusej_WiiUseApi_setIrSensitivity -Java_wiiusej_WiiUseApi_setNunchukOrientationThreshold -Java_wiiusej_WiiUseApi_setNunchukAccelerationThreshold -Java_wiiusej_WiiUseApi_windowsSetBluetoothStack -Java_wiiusej_WiiUseApi_specialPoll diff --git a/WiiUseJC_0.12/wiiusej_WiiUseApi.h b/WiiUseJC_0.12/wiiusej_WiiUseApi.h deleted file mode 100644 index 3680631..0000000 --- a/WiiUseJC_0.12/wiiusej_WiiUseApi.h +++ /dev/null @@ -1,277 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class wiiusej_WiiUseApi */ - -#ifndef _Included_wiiusej_WiiUseApi -#define _Included_wiiusej_WiiUseApi -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: wiiusej_WiiUseApi - * Method: connect - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_connect - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: find - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_find - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: init - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_init - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: closeConnection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getUnId - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_getUnId - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: cleanUp - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_cleanUp - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setLeds - * Signature: (IZZZZ)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds - (JNIEnv *, jobject, jint, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: setOrientThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAccelThreshold - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAccelThreshold - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setAlphaSmoothing - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setAlphaSmoothing - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: reSync - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_reSync - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio43 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio43 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setScreenRatio169 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setScreenRatio169 - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarAboveScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarAboveScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setSensorBarBelowScreen - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setSensorBarBelowScreen - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setVirtualScreenResolution - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setVirtualScreenResolution - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getStatus - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setTimeout - * Signature: (ISS)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setTimeout - (JNIEnv *, jobject, jint, jshort, jshort); - -/* - * Class: wiiusej_WiiUseApi - * Method: setIrSensitivity - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setIrSensitivity - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setNunchukOrientationThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setNunchukOrientationThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: setNunchukAccelerationThreshold - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setNunchukAccelerationThreshold - (JNIEnv *, jobject, jint, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: windowsSetBluetoothStack - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_windowsSetBluetoothStack - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: specialPoll - * Signature: (Lwiiusej/wiiusejevents/utils/EventsGatherer;)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/WiiUseJ_0.1/.classpath b/WiiUseJ_0.1/.classpath deleted file mode 100644 index d171cd4..0000000 --- a/WiiUseJ_0.1/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/WiiUseJ_0.1/.project b/WiiUseJ_0.1/.project deleted file mode 100644 index 9485f4a..0000000 --- a/WiiUseJ_0.1/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - WiiUseJava - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/WiiUseJ_0.1/README.TXT b/WiiUseJ_0.1/README.TXT deleted file mode 100644 index 268d31d..0000000 --- a/WiiUseJ_0.1/README.TXT +++ /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 . - */ - - -WiiuseJ is a java API to use wiimotes on your computer. This API is built on top of an excellent API call Wiiuse using JNI. - -WiiuseJ intent to be a very simple, easy to use and lightweight java API for wiimotes. - -Some of the great aspects of this API are : - - * The compatibility which is as large as Wiiuse's API compatibility - - * Cross-platform : Windows and linux (like Wiiuse) - - * Easy to use - - -WiiuseJ is made by Guilhem Duché : guiguito1@hotmail.com. -You can contact me if you need more information. - -Go to : http://wiiusej.googlecode.com/ for further documentations. - - - diff --git a/WiiUseJ_0.1/img/wiimote.png b/WiiUseJ_0.1/img/wiimote.png deleted file mode 100644 index 3f26f5202b22a89c5fa3e1c1eb524f78e4e76e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44340 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.1/libWiiuseJ.dll b/WiiUseJ_0.1/libWiiuseJ.dll deleted file mode 100644 index d06e041082d970078e1f9eb77cc10be3ba72dc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25448 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 bT;gSDD~7i%83zPoFQL=&a+-;%?drb(*%kiw diff --git a/WiiUseJ_0.1/src/img/wiimote.png b/WiiUseJ_0.1/src/img/wiimote.png deleted file mode 100644 index 3f26f5202b22a89c5fa3e1c1eb524f78e4e76e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44340 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.1/src/wiiusej/WiiUseApi.java b/WiiUseJ_0.1/src/wiiusej/WiiUseApi.java deleted file mode 100644 index f9be625..0000000 --- a/WiiUseJ_0.1/src/wiiusej/WiiUseApi.java +++ /dev/null @@ -1,211 +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; - -import wiiusej.wiiuseapievents.EventsGatherer; - -/** - * Singleton used to manipulate WiiUse Api. - * @author guiguito - */ -public class WiiUseApi { - - static { - System.loadLibrary("libWiiuseJ"); - } - - private static WiiUseApi instance = new WiiUseApi(); - - /** - * Get the only instance of WiiUseApi. - * @return the only instace of WiiUseApi. - */ - static WiiUseApi getInstance(){ - return instance; - } - - /** - * Try to connect to 2 wiimotes. Make them rumble to show they are - * connected. - * @param nb number of wiimotes to connect - * @return 0 if there is an error otherwise it returns the number of - * wiimotes connected. - */ - native int doConnections(int nb); - - /** - * Close connection to the wiimote with the given id. - * - */ - native void closeConnection(int id); - - /** - * Shutdown Wiiuse API. - */ - native void shutdownApi(); - - /** - * Activate rumble on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateRumble(int id); - - /** - * Deactivate rumble on the wiimote with the given id. - * - * @param id the id of the wiimote. - */ - native void deactivateRumble(int id); - - /** - * Activate IR Tracking on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateIRTracking(int id); - - /** - * Deactivate IR Tracking on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void deactivateIRTracking(int id); - - /** - * Activate motion sensing on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateMotionSensing(int id); - - /** - * Deactivate motion sensing on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void deactivateMotionSensing(int id); - - /** - * Set wiimote leds status. - * @param id the id of the wiimote concerned - * @param led1 status of led1: True=ON, False=OFF - * @param led2 status of led2: True=ON, False=OFF - * @param led3 status of led3: True=ON, False=OFF - * @param led4 status of led4: True=ON, False=OFF - */ - native void setLeds(int id, boolean led1, boolean led2, boolean led3, boolean led4); - - /** - * Set how many degrees an angle must change to generate an event. - * @param id id of the wiimote concerned - * @param angle minimum angle detected by an event - */ - native void setOrientThreshold(int id, float angle); - - /** - * Set how much acceleration must change to generate an event. - * @param id id of the wiimote concerned - * @param value minimum value detected by an event - */ - native void setAccelThreshold(int id, int value); - - /** - * Set alpha smoothing parameter for the given id. - * @param id id of the wiimote concerned - * @param value alpha smoothing value - */ - native void setAlphaSmoothing(int id, float value); - - /** - * Try to resync with the wiimote by starting a new handshake. - * @param id id of the wiimote concerned - */ - native void reSync(int id); - - /** - * Make the the accelerometers give smoother results. - * This is set by default. - * @param id the id of the wiimote concerned - */ - native void activateSmoothing(int id); - - /** - * Make the the accelerometers give raw results. - * @param id the id of the wiimote concerned - */ - native void deactivateSmoothing(int id); - - /** - * Make the wiimote generate an event each time we poll. - * Not set by default. - * @param id the id of the wiimote concerned - */ - native void activateContinuous(int id); - - /** - * Make the wiimote generate an event only when there is one. - * @param id the id of the wiimote concerned - */ - native void deactivateContinuous(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 4/3. - * @param id the id of the wiimote of which we want the status. - */ - native void setScreenRatio43(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 16/9. - * @param id the id of the wiimote of which we want the status. - */ - native void setScreenRatio169(int id); - - /** - * Notify wiiuse that the sensor bar is above your screen. - * @param id the id of the wiimote of which we want the status. - */ - native void setSensorBarAboveScreen(int id); - - /** - * Notify wiiuse that the sensor bar is below your screen. - * @param id the id of the wiimote of which we want the status. - */ - native void setSensorBarBelowScreen(int id); - - /** - * Set virtual screen resolution. It is used to automatically - * compute the position of a cursor on this virtual screen - * using the sensor bar. These results come in the IREvent. - * @param id the id of the wiimote of which we want the status. - * @param x x resolution. - * @param y y resolution. - */ - native void setVirtualScreenResolution(int id, int x, int y); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param id the id of the wiimote of which we want the status. - */ - native void getStatus(int id); - - /** - * Check for new Events and Get it. - * - * @param gath the object where we store all the new events. - */ - native void specialPoll(EventsGatherer gath); - - - -} diff --git a/WiiUseJ_0.1/src/wiiusej/WiiUseApiManager.java b/WiiUseJ_0.1/src/wiiusej/WiiUseApiManager.java deleted file mode 100644 index 647fbd8..0000000 --- a/WiiUseJ_0.1/src/wiiusej/WiiUseApiManager.java +++ /dev/null @@ -1,567 +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; - -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiuseapievents.EventsGatherer; -import wiiusej.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiuseapievents.WiiUseApiListener; -import wiiusej.wiiuseapirequest.FloatValueRequest; -import wiiusej.wiiuseapirequest.IntValueRequest; -import wiiusej.wiiuseapirequest.LedsRequest; -import wiiusej.wiiuseapirequest.TwoIntValueRequest; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * Class that manages the use of Wiiuse API. - * - * @author guiguito - */ -public class WiiUseApiManager extends Thread { - - private static WiiUseApiManager instance = new WiiUseApiManager(); - - private final EventListenerList listeners = new EventListenerList(); - - private Wiimote[] wiimotes; - - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - - private int connected = -1; - - private int nbMaxWiimotes = -1; - - private AtomicBoolean running = new AtomicBoolean(false); - - private ConcurrentLinkedQueue requests = new ConcurrentLinkedQueue(); - - public static WiiUseApiManager getInstance() { - return instance; - } - - /** - * Get wiimotes. Load library if necessary. Connect to wiimotes if - * necessary. Start polling if necessary. Return an array with the connected - * wiimotes. - * - * @param nb - * try to connect nb wiimotes - * @return an array with connected wiimotes or NULL. - */ - public synchronized static Wiimote[] getWiimotes(int nb) { - WiiUseApiManager manager = getInstance(); - if (manager.connected < 0) { - int nbWiimotes = manager.connectWiimotes(nb); - manager.wiimotes = new Wiimote[nbWiimotes]; - for (int i = 1; i <= nbWiimotes; i++) { - Wiimote wim = new Wiimote(i, manager); - manager.wiimotes[i - 1] = wim; - manager.addWiiUseApiListener(wim); - } - } - - if (manager.connected == 0) { - return new Wiimote[0]; - } - - if (!manager.isAlive()) - manager.start(); - - return manager.wiimotes; - } - - /** - * Connect wiimote and get the number of wiimotes connected. Supposed to be - * used once. - * - * @param nb - * try to connect nb wiimotes - * @return 0 if nothing connected or the number of wiimotes connected. - */ - private int connectWiimotes(int nb) { - nbMaxWiimotes = nb; - if (connected < 0) { - connected = wiiuse.doConnections(nb); - return connected; - } else {// library not loaded, no wiimotes connected - return 0; - } - } - - /** - * Ask the thread to close a connection. - * - * @param id - * id of the wiimote to disconnect. - */ - public void closeConnection(int id) { - removeWiiUseApiListener(wiimotes[id - 1]); - wiimotes[id - 1] = null; - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST)); - // System.out.println("Wiimote " + id + " disconnected !"); - } - - /** - * Get the number of wiimotes connected. - * - * @return the number of wiimotes connected. - */ - public int getNbConnectedWiimotes() { - return connected; - } - - /** - * Stop thread and shutdown wiiuse Api. - */ - public void shutdown() { - if (connected > 0) { - for (Wiimote wim : wiimotes) { - if (wim != null) - wim.disconnect(); - } - } - running.set(false); - wiiuse.shutdownApi(); - } - - /** - * Activate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Deactivate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Activate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Deactivate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Activate motion sensing for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Deactivate motion sensing for the wiimoter with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Activate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Deactivate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Activate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Deactivate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote - */ - public void deactivateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Set leds for the wiimotes with the given id. - * - * @param id - * id of the wiimote - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(int id, boolean l1, boolean l2, boolean l3, boolean l4) { - requests.add(new LedsRequest(id, WiiUseApiRequest.WIIUSE_LEDS_REQUEST, - l1, l2, l3, l4)); - } - - /** - * Set the orientation threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(int id, float th) { - requests.add(new FloatValueRequest(id, - WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST, th)); - } - - /** - * Set the acceleration threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold - */ - public void setAccelerationThreshold(int id, int th) { - requests.add(new IntValueRequest(id, - WiiUseApiRequest.WIIUSE_ACCEL_THRESHOLHD_REQUEST, th)); - } - - /** - * Set alpha smoothing for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold - */ - public void setAlphaSmoothing(int id, float th) { - requests.add(new FloatValueRequest(id, - WiiUseApiRequest.WIIUSE_ALPHA_SMOOTHING_REQUEST, th)); - } - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote - */ - public void reSync(int id) { - requests.add(new WiiUseApiRequest(id, WiiUseApiRequest.WIIUSE_RESYNC)); - } - - /** - * Set screen aspect ratio to 4/3 for the given id. - * - * @param id - * id of the wiimote - */ - public void setScreenAspectRatio43(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ASPECT_RATIO_4_3)); - } - - /** - * Set screen aspect ratio to 16/9 for the given id. - * - * @param id - * id of the wiimote - */ - public void setScreenAspectRatio169(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ASPECT_RATIO_16_9)); - } - - /** - * Set the sensor bar to be above the screen. - * - * @param id - * id of the wiimote - */ - public void setSensorBarAboveScreen(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_SENSOR_BAR_ABOVE)); - } - - /** - * Set the sensor bar to be below the screen. - * - * @param id - * id of the wiimote - */ - public void setSensorBarBelowScreen(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_SENSOR_BAR_BELOW)); - } - - /** - * Set virtual resolution. It is used to automatically compute the position - * of a cursor on this virtual screen using the sensor bar. These results - * come in the IREvent. - * - * @param id - * id of the wiimote - * @param x - * x resolution - * @param y - * y resolution - */ - public void setVirtualResolution(int id, int x, int y) { - requests.add(new TwoIntValueRequest(id, - WiiUseApiRequest.WIIUSE_SET_VIRTUAL_RESOLUTION, x, y)); - } - - /** - * Get Status for the wiimote for the given id. - * - * @param id - * id of the wiimote - */ - public void getStatus(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_STATUS_REQUEST)); - } - - @Override - public void run() { - - if (connected > 0) { - running.set(true); - - EventsGatherer gather = new EventsGatherer(nbMaxWiimotes); - - // Start polling and tell the observers when there Wiimote events - while (running.get() && connected > 0) { - - /* Polling */ - wiiuse.specialPoll(gather); - - /* deal with events gathered in Wiiuse API */ - for (WiiUseApiEvent evt : gather.getEvents()) { - if (evt.getWiimoteId() != -1) {// event filled - // there is an event notify observers - notifyWiiUseApiListener(evt); - if (evt.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT) { - // check if it was a disconnection - // in this case disconnect the wiimote - closeConnection(evt.getWiimoteId()); - } - } else { - System.out - .println("There is an event with id == -1 ??? there is a problem !!! : " - + evt); - } - } - gather.clearEvents(); - - /* deal with request done to wiiuse API */ - WiiUseApiRequest req = requests.poll(); - if (req != null) {// there is a request for the wiiuse api - int id = req.getId(); - if (req.getRequestType() == WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST) { - /* Close connections requests */ - wiiuse.closeConnection(id); - - connected--; - if (connected == 0) {// stop this thread if there is - // no more wiimotes connected. - // System.out.println("No more wiimotes connected - // !!!"); - shutdown(); - } - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_STATUS_REQUEST) { - /* Status requests */ - wiiuse.getStatus(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST) { - /* Activate Rumble requests */ - wiiuse.activateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST) { - /* Deactivate Rumble requests */ - wiiuse.deactivateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST) { - /* Activate IR Tracking requests */ - wiiuse.activateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST) { - /* Deactivate IR Tracking requests */ - wiiuse.deactivateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST) { - /* Activate Motion sensing requests */ - wiiuse.activateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST) { - /* Deactivate Motion sensing requests */ - wiiuse.deactivateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_LEDS_REQUEST) { - /* leds requests */ - LedsRequest reqLed = (LedsRequest) req; - wiiuse.setLeds(id, reqLed.isLed1(), reqLed.isLed2(), - reqLed.isLed3(), reqLed.isLed4()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST) { - /* Activate smoothing requests */ - wiiuse.activateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST) { - /* Deactivate smoothing requests */ - wiiuse.deactivateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST) { - /* Activate continuous requests */ - wiiuse.activateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST) { - /* Deactivate continuous requests */ - wiiuse.deactivateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST) { - /* set orientation threshold request */ - wiiuse.setOrientThreshold(req.getId(), - ((FloatValueRequest) req).getFloatValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACCEL_THRESHOLHD_REQUEST) { - /* set acceleration threshold request */ - wiiuse.setAccelThreshold(req.getId(), - ((IntValueRequest) req).getIntValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ALPHA_SMOOTHING_REQUEST) { - /* set alpha smoothing request */ - wiiuse.setAlphaSmoothing(req.getId(), - ((FloatValueRequest) req).getFloatValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_RESYNC) { - /* set resync request */ - wiiuse.reSync(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ASPECT_RATIO_4_3) { - /* set screen aspect ratio to 4/3 */ - wiiuse.setScreenRatio43(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ASPECT_RATIO_16_9) { - /* set screen aspect ratio to 16/9 */ - wiiuse.setScreenRatio169(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SENSOR_BAR_ABOVE) { - /* set sensor bar above the screen */ - wiiuse.setSensorBarAboveScreen(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SENSOR_BAR_BELOW) { - /* set sensor bar above the screen */ - wiiuse.setSensorBarBelowScreen(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SET_VIRTUAL_RESOLUTION) { - /* set virtual resolution */ - wiiuse.setVirtualScreenResolution(req.getId(), - ((TwoIntValueRequest) req).getIntValue(), - ((TwoIntValueRequest) req).getSecondIntValue()); - } else { - System.out.println("Bad request to Wiiuse API !!!!!"); - } - } - } - } else { - if (connected <= 0) { - System.out.println("No wiimotes connected !"); - } - } - - } - - /** - * Add WiiUseApiListener to the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void addWiiUseApiListener(WiiUseApiListener listener) { - listeners.add(WiiUseApiListener.class, listener); - } - - /** - * Remove WiiUseApiListener from the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void removeWiiUseApiListener(WiiUseApiListener listener) { - listeners.remove(WiiUseApiListener.class, listener); - } - - /** - * Get the list of WiiUseApiListeners. - * - * @return the list of WiiUseApiListeners. - */ - public WiiUseApiListener[] getWiiUseApiListeners() { - return listeners.getListeners(WiiUseApiListener.class); - } - - /** - * Notify WiiUseApiListeners that an event occured. - * - * @param evt - * WiimoteEvent occured - */ - private void notifyWiiUseApiListener(WiiUseApiEvent evt) { - for (WiiUseApiListener listener : getWiiUseApiListeners()) { - listener.onWiiUseApiEvent(evt); - } - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/Wiimote.java b/WiiUseJ_0.1/src/wiiusej/Wiimote.java deleted file mode 100644 index f04e66c..0000000 --- a/WiiUseJ_0.1/src/wiiusej/Wiimote.java +++ /dev/null @@ -1,323 +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; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.GenericEvent; -import wiiusej.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiuseapievents.WiiUseApiListener; -import wiiusej.wiiuseapievents.WiimoteListener; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * Class that represents a wiimote. - * You can register as an observer of this wiimote to listen events from it. - * You manage it. - * @author guiguito - */ -public class Wiimote implements WiiUseApiListener { - - private int id = -1;//wiimote id - - private EventListenerList listeners = new EventListenerList(); - - private WiiUseApiManager manager; - - - /** - * Constructor. - * @param idd id of the wiimote - * @param manager manager wo built it. - */ - public Wiimote(int idd, WiiUseApiManager manager){ - id = idd; - this.manager = manager; - } - - /** - * Disconnect this wiimote. - */ - public void disconnect(){ - deactivateIRTRacking(); - deactivateMotionSensing(); - deactivateRumble(); - manager.closeConnection(id); - } - - /** - * Activate the rumble. - */ - public void activateRumble() { - manager.activateRumble(id); - } - - /** - * Deactivate the rumble. - */ - public void deactivateRumble() { - manager.deactivateRumble(id); - } - - /** - * Activate IR Tracking. - */ - public void activateIRTRacking() { - manager.activateIRTRacking(id); - } - - /** - * Deactivate IR Tracking. - */ - public void deactivateIRTRacking() { - manager.deactivateIRTRacking(id); - } - - /** - * Activate motion sensing. - */ - public void activateMotionSensing() { - manager.activateMotionSensing(id); - } - - /** - * Deactivate motion sensing. - */ - public void deactivateMotionSensing() { - manager.deactivateMotionSensing(id); - } - - /** - * Activate smoothing. - */ - public void activateSmoothing() { - manager.activateSmoothing(id); - } - - /** - * Deactivate smoothing. - */ - public void deactivateSmoothing() { - manager.deactivateSmoothing(id); - } - - /** - * Activate continuous. - */ - public void activateContinuous() { - manager.activateContinuous(id); - } - - /** - * Deactivate continuous. - */ - public void deactivateContinuous() { - manager.deactivateContinuous(id); - - } - - /** - * Set leds status. - * - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(boolean l1, boolean l2, boolean l3, boolean l4) { - manager.setLeds(id, l1, l2, l3, l4); - } - - /** - * Set the orientation threshold (minimum angle between two degrees with accelerometer). - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(float th) { - manager.setOrientationThreshold(id,th); - } - - /** - * Set the acceleration threshold . - * @param th - * threshold - */ - public void setAccelerationThreshold(int th) { - manager.setAccelerationThreshold(id,th); - } - - /** - * Set the alpha smoothing value. - * @param th - * threshold - */ - public void setAlphaSmoothingValue(float th) { - manager.setAlphaSmoothing(id,th); - } - - /** - * Set the screen aspect ratio to be considered as 4/3. - */ - public void setScreenAspectRatio43() { - manager.setScreenAspectRatio43(id); - } - - /** - * Set the screen aspect ratio to be considered as 16/9. - */ - public void setScreenAspectRatio169() { - manager.setScreenAspectRatio169(id); - } - - /** - * Set the sensor bar to be considered above the screen. - */ - public void setSensorBarAboveScreen() { - manager.setSensorBarAboveScreen(id); - } - - /** - * Set the sensor bar to be considered below the screen. - */ - public void setSensorBarBelowScreen() { - manager.setSensorBarBelowScreen(id); - } - - /** - * Set the screen resolution of the you are pointing at - * with your wiimote. - * - * @param x x resolution. - * @param y y resolution. - */ - public void setVirtualResolution(int x, int y) { - manager.setVirtualResolution(id, x ,y); - } - - /** - * Try to resync the wiimote by starting a new handshake. - */ - public void reSync() { - manager.reSync(id); - } - - /** - * Ask for the status of the wiimote. - * The result will be received in a status event object. - * Implements onStatusEvent on wiimote listener to get it. - */ - public void getStatus() { - manager.getStatus(id); - } - - /** - * Method called when a WiiUseApiEvent occurs. - * @param e the WiiUseApiEvent. - */ - public void onWiiUseApiEvent(WiiUseApiEvent e) { - if (e.getWiimoteId() == id){ - if (e.getEventType() == WiiUseApiEvent.GENERIC_EVENT){ - notifyWiiMoteEventListeners((GenericEvent)e); - }else if (e.getEventType() == WiiUseApiEvent.STATUS_EVENT - ||e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_REMOVED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_REMOVED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_REMOVED){ - notifyStatusEventListeners((StatusEvent)e); - }else if (e.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT){ - notifyDisconnectionEventListeners((DisconnectionEvent)e); - } - } - } - - /** - * Add a WiimoteListener to the listeners list. - * @param listener a WiimoteListener - */ - public void addWiiMoteEventListeners(WiimoteListener listener) { - listeners.add(WiimoteListener.class, listener); - } - - /** - * Remove a WiimoteListener from the listeners list. - * @param listener a WiimoteListener - */ - public void removeWiiMoteEventListeners(WiimoteListener listener) { - listeners.remove(WiimoteListener.class, listener); - } - - /** - * Get the list of WiimoteListener. - * @return the list of WiimoteListener. - */ - public WiimoteListener[] getWiiMoteEventListeners() { - return listeners.getListeners(WiimoteListener.class); - } - - /** - * Notify WiimoteListeners that an event occured. - * Notify in first the listeners for Buttons Events. - * In second the listeners for IR Events. - * In third the listeners for Motion sensing events. - * @param evt WiimoteEvent occured - */ - private void notifyWiiMoteEventListeners(GenericEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onButtonsEvent(evt.getButtonsEvent()); - if (evt.isThereIrEvent()){ - listener.onIrEvent(evt.getIREvent()); - } - if (evt.isThereMotionSensingEvent()){ - listener.onMotionSensingEvent(evt.getMotionSensingEvent()); - } - } - } - - /** - * Notify WiimoteListener that a status event occured. - * @param evt status event occured - */ - private void notifyStatusEventListeners(StatusEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onStatusEvent(evt); - } - } - - /** - * Notify WiimoteListener that a status event occured. - * @param evt status event occured - */ - private void notifyDisconnectionEventListeners(DisconnectionEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onDisconnectionEvent(evt); - } - } - - @Override - public String toString() { - return "Wiimote with ID : "+id; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/test/CloseGuiTestCleanly.java b/WiiUseJ_0.1/src/wiiusej/test/CloseGuiTestCleanly.java deleted file mode 100644 index ae136bf..0000000 --- a/WiiUseJ_0.1/src/wiiusej/test/CloseGuiTestCleanly.java +++ /dev/null @@ -1,65 +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; -import wiiusej.Wiimote; - -/** - * This class is used to close wiiusej cleanly. - * @author guiguito - */ -public class CloseGuiTestCleanly implements WindowListener{ - - Wiimote wiimote; - - - public CloseGuiTestCleanly(Wiimote wim) { - wiimote = wim; - } - - public void windowOpened(WindowEvent e) { - //nothing - } - - public void windowClosing(WindowEvent e) { - WiiUseApiManager.getInstance().shutdown(); - } - - 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/WiiUseJ_0.1/src/wiiusej/test/Main.java b/WiiUseJ_0.1/src/wiiusej/test/Main.java deleted file mode 100644 index 0f873bb..0000000 --- a/WiiUseJ_0.1/src/wiiusej/test/Main.java +++ /dev/null @@ -1,40 +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); - if (wiimotes.length>0){ - WiiuseJGuiTest gui = new WiiuseJGuiTest(wiimotes[0]); - gui.setDefaultCloseOperation(gui.EXIT_ON_CLOSE); - gui.setVisible(true); - } - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/test/Tests.java b/WiiUseJ_0.1/src/wiiusej/test/Tests.java deleted file mode 100644 index f9e20f9..0000000 --- a/WiiUseJ_0.1/src/wiiusej/test/Tests.java +++ /dev/null @@ -1,354 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.GenericEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This class used to test WiiuseJ. - * - * @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(); - } - } - - private static int nb = 0; - - public void onButtonsEvent(ButtonsEvent 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(); - } - - } 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 onStatusEvent(StatusEvent e) { - // Display status variables - System.out.println(e); - } - - public void onDisconnectionEvent(DisconnectionEvent e) { - System.out.println(" wiimote " + e.getWiimoteId() - + "has been disconnected !!"); - } - - /** - * @param args - */ - public static void main(String[] args) { - Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(4); - if (wiimotes.length > 0) { - System.out.println(wiimotes[0]); - Tests tests = 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/WiiUseJ_0.1/src/wiiusej/test/WiiuseJGuiTest.java b/WiiUseJ_0.1/src/wiiusej/test/WiiuseJGuiTest.java deleted file mode 100644 index 8bac8ae..0000000 --- a/WiiUseJ_0.1/src/wiiusej/test/WiiuseJGuiTest.java +++ /dev/null @@ -1,836 +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.util.logging.Level; -import java.util.logging.Logger; -import wiiusej.utils.IRPanel; -import wiiusej.Wiimote; -import wiiusej.utils.AccelerationPanel; -import wiiusej.utils.GForcePanel; -import wiiusej.utils.ButtonsEventPanel; -import wiiusej.utils.OrientationPanel; -import wiiusej.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * 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; - - /** Creates new form WiiuseJGuiTest */ - public WiiuseJGuiTest(Wiimote wiimote) { - initComponents(); - this.wiimote = wiimote; - wiimote.addWiiMoteEventListeners((IRPanel) irViewPanel); - wiimote.addWiiMoteEventListeners((ButtonsEventPanel) buttonsPanel); - wiimote.addWiiMoteEventListeners((OrientationPanel) motionSensingPanel); - wiimote.addWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote.addWiiMoteEventListeners((AccelerationPanel) accelerationPanel); - wiimote.addWiiMoteEventListeners(this); - wiimote.deactivateContinuous(); - wiimote.deactivateSmoothing(); - wiimote.setScreenAspectRatio169(); - wiimote.setSensorBarBelowScreen(); - getStatusButtonMousePressed(null); - this.addWindowListener(new CloseGuiTestCleanly(wiimote)); - } - - public void onButtonsEvent(ButtonsEvent 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 onStatusEvent(StatusEvent arg0) { - messageText.setText("Status received !"); - batteryLevelText.setText(arg0.getBatteryLevel() + " %"); - led1Button.setEnabled(arg0.isLed1Set()); - led2Button.setEnabled(arg0.isLed2Set()); - led3Button.setEnabled(arg0.isLed3Set()); - led4Button.setEnabled(arg0.isLed4Set()); - //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 !"); - } - - /** 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(); - motionSensingPanel = new OrientationPanel(); - gForcePanel = new wiiusej.utils.GForcePanel(); - accelerationPanel = new AccelerationPanel(); - rightPanel = new javax.swing.JPanel(); - fixedWiimotePanel = new javax.swing.JPanel(); - buttonsPanel = new ButtonsEventPanel(); - controlsPanel = new javax.swing.JPanel(); - activateRumblePanel = new javax.swing.JPanel(); - toggleRumbleButton = new javax.swing.JButton(); - deactivateRumblePanel = new javax.swing.JPanel(); - toggleIRTrackingButton = new javax.swing.JButton(); - activateIRtrackingPanel = new javax.swing.JPanel(); - toggleMotionSensingTrackingButton = new javax.swing.JButton(); - deactivateIRTrackingPanel = new javax.swing.JPanel(); - toggleSmoothingButton = new javax.swing.JButton(); - activateMotionSensingTrackingPanel = new javax.swing.JPanel(); - toggleContinuousButton = new javax.swing.JButton(); - deactivateMotionSensingTrackingPanel = 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(); - activateSmoothingPanel = new javax.swing.JPanel(); - alphaSmoothingTextField = new javax.swing.JTextField(); - alphaSmoothingButton = new javax.swing.JButton(); - deactivateSmoothingPanel = new javax.swing.JPanel(); - orientationThresholdTextField = new javax.swing.JTextField(); - orientationThresholdButton = new javax.swing.JButton(); - activateContinuousPanel = new javax.swing.JPanel(); - accelerationThresholdTextField = new javax.swing.JTextField(); - accelerationThresholdButton = new javax.swing.JButton(); - deactivateContinuousPanel = new javax.swing.JPanel(); - getStatusButton = new javax.swing.JButton(); - batteryText = new javax.swing.JLabel(); - batteryLevelText = new javax.swing.JLabel(); - ledsPanel = new javax.swing.JPanel(); - toggleSensorBarPositionButton = new javax.swing.JButton(); - alphaSmoothingPanel = new javax.swing.JPanel(); - toggleScreenAspectRatioButton = new javax.swing.JButton(); - orientationThresholdPanel = 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(); - accelerationThresholdPanel = new javax.swing.JPanel(); - mouseIRControlButton = new javax.swing.JButton(); - batteryPanel = new javax.swing.JPanel(); - expansionText = new javax.swing.JLabel(); - messagesPanel = new javax.swing.JPanel(); - 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))); - - 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) - ); - - 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 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("Raw Acceleration", accelerationPanel); - - 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); - } - }); - activateRumblePanel.add(toggleRumbleButton); - - controlsPanel.add(activateRumblePanel); - - toggleIRTrackingButton.setText("Activate IR Tracking"); - toggleIRTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleIRTrackingButtonMousePressed(evt); - } - }); - deactivateRumblePanel.add(toggleIRTrackingButton); - - controlsPanel.add(deactivateRumblePanel); - - toggleMotionSensingTrackingButton.setText("Activate motion sensing Tracking"); - toggleMotionSensingTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleMotionSensingTrackingButtonMousePressed(evt); - } - }); - activateIRtrackingPanel.add(toggleMotionSensingTrackingButton); - - controlsPanel.add(activateIRtrackingPanel); - - toggleSmoothingButton.setText("Activate Smoothing"); - toggleSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSmoothingButtonMousePressed(evt); - } - }); - deactivateIRTrackingPanel.add(toggleSmoothingButton); - - controlsPanel.add(deactivateIRTrackingPanel); - - toggleContinuousButton.setText("Activate Continuous"); - toggleContinuousButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleContinuousButtonMousePressed(evt); - } - }); - activateMotionSensingTrackingPanel.add(toggleContinuousButton); - - controlsPanel.add(activateMotionSensingTrackingPanel); - - led1Button.setText("Led1"); - led1Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led1ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led1Button); - - led2Button.setText("Led2"); - led2Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led2ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led2Button); - - led3Button.setText("Led3"); - led3Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led3ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led3Button); - - led4Button.setText("Led4"); - led4Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led4ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led4Button); - - setLedsButton.setText("Set leds"); - setLedsButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setLedsButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(setLedsButton); - - controlsPanel.add(deactivateMotionSensingTrackingPanel); - - alphaSmoothingTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - alphaSmoothingTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - activateSmoothingPanel.add(alphaSmoothingTextField); - - alphaSmoothingButton.setText("Set alpha smoothing"); - alphaSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - alphaSmoothingButtonMousePressed(evt); - } - }); - activateSmoothingPanel.add(alphaSmoothingButton); - - controlsPanel.add(activateSmoothingPanel); - - orientationThresholdTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - orientationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - deactivateSmoothingPanel.add(orientationThresholdTextField); - - orientationThresholdButton.setText("Set orientation threshold"); - orientationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - orientationThresholdButtonMousePressed(evt); - } - }); - deactivateSmoothingPanel.add(orientationThresholdButton); - - controlsPanel.add(deactivateSmoothingPanel); - - accelerationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - activateContinuousPanel.add(accelerationThresholdTextField); - - accelerationThresholdButton.setText("Set acceleration threshold"); - accelerationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - accelerationThresholdButtonMousePressed(evt); - } - }); - activateContinuousPanel.add(accelerationThresholdButton); - - controlsPanel.add(activateContinuousPanel); - - getStatusButton.setText("Get status"); - getStatusButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - getStatusButtonMousePressed(evt); - } - }); - deactivateContinuousPanel.add(getStatusButton); - - batteryText.setFont(new java.awt.Font("Tahoma", 0, 14)); - batteryText.setText("Battery level :"); - deactivateContinuousPanel.add(batteryText); - - batteryLevelText.setFont(new java.awt.Font("Arial", 0, 14)); - batteryLevelText.setText(" %"); - deactivateContinuousPanel.add(batteryLevelText); - - controlsPanel.add(deactivateContinuousPanel); - - toggleSensorBarPositionButton.setText("Set sensor bar above"); - toggleSensorBarPositionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSensorBarPositionButtonMousePressed(evt); - } - }); - ledsPanel.add(toggleSensorBarPositionButton); - - controlsPanel.add(ledsPanel); - - 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); - } - }); - alphaSmoothingPanel.add(toggleScreenAspectRatioButton); - - controlsPanel.add(alphaSmoothingPanel); - - xLabel.setText("X"); - orientationThresholdPanel.add(xLabel); - - xResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - xResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - orientationThresholdPanel.add(xResolutionTextField); - - yLabel.setText("Y"); - orientationThresholdPanel.add(yLabel); - - yResolutionTextField.setFocusTraversalPolicyProvider(true); - yResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - yResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - orientationThresholdPanel.add(yResolutionTextField); - - setVirtualResolutionButton.setText("Set virtual resolution"); - setVirtualResolutionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setVirtualResolutionButtonMousePressed(evt); - } - }); - orientationThresholdPanel.add(setVirtualResolutionButton); - - controlsPanel.add(orientationThresholdPanel); - - mouseIRControlButton.setText("Start infrared mouse control"); - mouseIRControlButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - mouseIRControlButtonMousePressed(evt); - } - }); - accelerationThresholdPanel.add(mouseIRControlButton); - - controlsPanel.add(accelerationThresholdPanel); - - expansionText.setText("No expansion connected"); - batteryPanel.add(expansionText); - - controlsPanel.add(batteryPanel); - - 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; - }//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 - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel accelerationPanel; - private javax.swing.JButton accelerationThresholdButton; - private javax.swing.JPanel accelerationThresholdPanel; - private javax.swing.JTextField accelerationThresholdTextField; - private javax.swing.JPanel activateContinuousPanel; - private javax.swing.JPanel activateIRtrackingPanel; - private javax.swing.JPanel activateMotionSensingTrackingPanel; - private javax.swing.JPanel activateRumblePanel; - private javax.swing.JPanel activateSmoothingPanel; - private javax.swing.JButton alphaSmoothingButton; - private javax.swing.JPanel alphaSmoothingPanel; - private javax.swing.JTextField alphaSmoothingTextField; - private javax.swing.JLabel batteryLevelText; - private javax.swing.JPanel batteryPanel; - private javax.swing.JLabel batteryText; - private javax.swing.JPanel buttonsPanel; - private javax.swing.JPanel controlsPanel; - private javax.swing.JPanel deactivateContinuousPanel; - private javax.swing.JPanel deactivateIRTrackingPanel; - private javax.swing.JPanel deactivateMotionSensingTrackingPanel; - private javax.swing.JPanel deactivateRumblePanel; - private javax.swing.JPanel deactivateSmoothingPanel; - private javax.swing.JLabel expansionText; - private javax.swing.JPanel fixedWiimotePanel; - private javax.swing.JPanel gForcePanel; - private javax.swing.JButton getStatusButton; - 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 ledsPanel; - 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.JButton orientationThresholdButton; - private javax.swing.JPanel orientationThresholdPanel; - private javax.swing.JTextField orientationThresholdTextField; - private javax.swing.JPanel rightPanel; - private javax.swing.JButton setLedsButton; - private javax.swing.JButton setVirtualResolutionButton; - 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/WiiUseJ_0.1/src/wiiusej/utils/AccelerationPanel.java b/WiiUseJ_0.1/src/wiiusej/utils/AccelerationPanel.java deleted file mode 100644 index 0403255..0000000 --- a/WiiUseJ_0.1/src/wiiusej/utils/AccelerationPanel.java +++ /dev/null @@ -1,182 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch raw acceleration values from a MotionSensingEvent. - * @author guiguito - */ -public 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(); - } - - @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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getRawAcceleration()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.1/src/wiiusej/utils/ButtonsEventPanel.java b/WiiUseJ_0.1/src/wiiusej/utils/ButtonsEventPanel.java deleted file mode 100644 index 2a4a48f..0000000 --- a/WiiUseJ_0.1/src/wiiusej/utils/ButtonsEventPanel.java +++ /dev/null @@ -1,297 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to see what buttons are pressed. - * 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 ButtonsEvent buttons; - private Color pressedColor = Color.RED; - private Color heldColor = Color.ORANGE; - private Color releasedColor = Color.YELLOW; - private Shape shape; - - /** - * 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); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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"); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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(ButtonsEvent 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 onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - 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/WiiUseJ_0.1/src/wiiusej/utils/GForcePanel.java b/WiiUseJ_0.1/src/wiiusej/utils/GForcePanel.java deleted file mode 100644 index 9802688..0000000 --- a/WiiUseJ_0.1/src/wiiusej/utils/GForcePanel.java +++ /dev/null @@ -1,201 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch gravity force values from a MotionSensingEvent. - * @author guiguito - */ -public 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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getGforce()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.1/src/wiiusej/utils/IRPanel.java b/WiiUseJ_0.1/src/wiiusej/utils/IRPanel.java deleted file mode 100644 index b4213a1..0000000 --- a/WiiUseJ_0.1/src/wiiusej/utils/IRPanel.java +++ /dev/null @@ -1,192 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * 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 (xCoordinates[i] != -1 && yCoordinates[i] != -1 && 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(ButtonsEvent arg0) { - //nothing - } - - 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 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(); - } - - /** 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/WiiUseJ_0.1/src/wiiusej/utils/OrientationPanel.java b/WiiUseJ_0.1/src/wiiusej/utils/OrientationPanel.java deleted file mode 100644 index b50a2ce..0000000 --- a/WiiUseJ_0.1/src/wiiusej/utils/OrientationPanel.java +++ /dev/null @@ -1,205 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch orientation values from a MotionSensingEvent. - * @author guiguito - */ -public 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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getOrientation()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.1/src/wiiusej/values/GForce.java b/WiiUseJ_0.1/src/wiiusej/values/GForce.java deleted file mode 100644 index 9732121..0000000 --- a/WiiUseJ_0.1/src/wiiusej/values/GForce.java +++ /dev/null @@ -1,75 +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.values; - -/** - * Represents gravity force on each axis. - * @author guiguito - */ -public class GForce { - - private float x; - private float y; - private float z; - - /** - * Default constructor; - */ - public GForce(){ - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with gravity force on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public GForce(float xx, float yy, float zz){ - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public float getX() { - return x; - } - - /** - * @return the y - */ - public float getY() { - return y; - } - - /** - * @return the z - */ - public float getZ() { - return z; - } - - @Override - public String toString() { - return "Gravity force : ("+x+", "+y+","+z+")"; - } -} diff --git a/WiiUseJ_0.1/src/wiiusej/values/IRSource.java b/WiiUseJ_0.1/src/wiiusej/values/IRSource.java deleted file mode 100644 index 7caef55..0000000 --- a/WiiUseJ_0.1/src/wiiusej/values/IRSource.java +++ /dev/null @@ -1,109 +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.values; - -/** - * Class used for IR sources. - * @author guiguito - */ -public class IRSource{ - - private int x; - private int y; - private short rx; - private short ry; - private short size; - - /** - * Build an IR source with all details. - * - * @param xx - * xx interpolated coordinates. - * @param yy - * yy interpolated coordinates. - * @param rxx - * raw X coordinate (0-1023). - * @param ryy - * raw Y coordinate (0-1023). - * @param si - * size of the IR dot (0-15). - */ - public IRSource(int xx, int yy, short rxx, short ryy, short si) { - x = xx; - y = yy; - rx = rxx; - ry = ryy; - size = si; - } - - - /** - * Return x interpolated coordinates. - * @return the x - */ - public int getX() { - return x; - } - - - - /** - * Return y interpolated coordinates. - * @return the y - */ - public int getY() { - return y; - } - - - - /** - * Return raw X coordinate (0-1023). - * @return the rx - */ - public short getRx() { - return rx; - } - - - - /** - * Return raw Y coordinate (0-1023). - * @return the ry - */ - public short getRy() { - return ry; - } - - - - /** - * Return size of the IR dot (0-15). - * @return the size - */ - public short getSize() { - return size; - } - - - - @Override - public String toString() { - return "Interpolated coordinates ("+x+","+y+"), Raw coordinates("+rx+","+ry+"), source size : "+size+")"; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/values/Orientation.java b/WiiUseJ_0.1/src/wiiusej/values/Orientation.java deleted file mode 100644 index 4c4f741..0000000 --- a/WiiUseJ_0.1/src/wiiusej/values/Orientation.java +++ /dev/null @@ -1,76 +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.values; - -/** - * Class that represents the orientation of the wiimote. - * @author guiguito - */ -public class Orientation { - - private float roll; - private float pitch; - private float yaw; - - /** - * Default constructor. - */ - public Orientation(){ - roll = 0; - pitch = 0; - yaw = 0; - } - - /** - * Contructor with raw, pitch , yaw. - * @param r raw - * @param p pitch - * @param y yaw - */ - public Orientation(float r, float p, float y){ - roll = r; - pitch = p; - yaw = y; - } - - /** - * @return the roll - */ - public float getRoll() { - return roll; - } - - /** - * @return the pitch - */ - public float getPitch() { - return pitch; - } - - /** - * @return the yaw - */ - public float getYaw() { - return yaw; - } - - @Override - public String toString() { - return "Orientation : (roll: "+roll+", pitch: "+pitch+", yaw: "+yaw+")"; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/values/RawAcceleration.java b/WiiUseJ_0.1/src/wiiusej/values/RawAcceleration.java deleted file mode 100644 index 903a51c..0000000 --- a/WiiUseJ_0.1/src/wiiusej/values/RawAcceleration.java +++ /dev/null @@ -1,75 +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.values; - -/** - * Represents raw acceleration on each axis. - * @author guiguito - */ -public class RawAcceleration { - - private short x; - private short y; - private short z; - - /** - * Default constructor; - */ - public RawAcceleration() { - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with raw acceleration on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public RawAcceleration(short xx, short yy, short zz) { - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public short getX() { - return x; - } - /** - * @return the y - */ - public short getY() { - return y; - } - - /** - * @return the z - */ - public short getZ() { - return z; - } - - @Override - public String toString() { - return "Raw acceleration : ("+x+", "+y+","+z+")"; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/ButtonsEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/ButtonsEvent.java deleted file mode 100644 index ce78551..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/ButtonsEvent.java +++ /dev/null @@ -1,335 +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.wiiuseapievents; - -/** - * Class which represents a buttons event. - * @author guiguito - */ -public class ButtonsEvent extends WiimoteEvent{ - - /* Buttons MACRO */ - private static short WIIMOTE_BUTTON_TWO = 0x0001; - private static short WIIMOTE_BUTTON_ONE = 0x0002; - private static short WIIMOTE_BUTTON_B = 0x0004; - private static short WIIMOTE_BUTTON_A = 0x0008; - private static short WIIMOTE_BUTTON_MINUS = 0x0010; - private static short WIIMOTE_BUTTON_ZACCEL_BIT6 = 0x0020; - private static short WIIMOTE_BUTTON_ZACCEL_BIT7 = 0x0040; - private static short WIIMOTE_BUTTON_HOME = 0x0080; - private static short WIIMOTE_BUTTON_LEFT = 0x0100; - private static short WIIMOTE_BUTTON_RIGHT = 0x0200; - private static short WIIMOTE_BUTTON_DOWN = 0x0400; - private static short WIIMOTE_BUTTON_UP = 0x0800; - private static short WIIMOTE_BUTTON_PLUS = 0x1000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT4 = 0x2000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT5 = 0x4000; - private static int WIIMOTE_BUTTON_UNKNOWN = 0x8000; - private static short WIIMOTE_BUTTON_ALL = 0x1F9F; - - /* Buttons */ - private short buttonsJustPressed = 0; - private short buttonsJustReleased = 0; - private short buttonsHeld = 0; - - /** - * Constructor of the button Event. - * @param id id of the wiimote concerned. - * @param buttonsJustPressed buttons just pressed. - * @param buttonsJustReleased buttons just released. - * @param buttonsHeld buttons just held. - */ - public ButtonsEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld){ - super(id); - setAllButtons(buttonsJustPressed, buttonsJustReleased, buttonsHeld); - } - - /** - * Set all buttons in one method. - * - * @param buttonsJustPressed - * @param buttonsJustReleased - * @param buttonsHeld - */ - private void setAllButtons(short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - this.buttonsJustPressed = buttonsJustPressed; - this.buttonsJustReleased = buttonsJustReleased; - this.buttonsHeld = buttonsHeld; - } - - /** - * Get the short storing the buttons just pressed - * - * @return the short storing the buttons just pressed - */ - public short getButtonsJustPressed() { - return buttonsJustPressed; - } - - /** - * Get the short storing the buttons just released - * - * @return the short storing the buttons just released - */ - public short getButtonsJustReleased() { - return buttonsJustReleased; - } - - /** - * get the short storing the buttons held - * - * @return the short storing the buttons held - */ - public short getButtonsHeld() { - return buttonsHeld; - } - - /** **************** BUTTONS Methods ***************** */ - /* generic button functions */ - - private boolean buttonTest(short buttonBitsDefinition, short buttons) { - return (buttons & buttonBitsDefinition) == buttonBitsDefinition; - } - - private boolean isButtonJustPressed(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustPressed) - && !isButtonHeld(buttonBitsDefinition); - } - - private boolean isButtonJustReleased(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustReleased); - } - - private boolean isButtonHeld(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsHeld); - } - - private boolean isButtonPressed(short buttonBitsDefinition) { - return isButtonHeld(buttonBitsDefinition)||isButtonJustPressed(buttonBitsDefinition); - } - /* Button ONE */ - - public boolean isButtonOneJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneHeld() { - return isButtonHeld(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOnePressed() { - return isButtonPressed(WIIMOTE_BUTTON_ONE); - } - - /* Button TWO */ - - public boolean isButtonTwoJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoHeld() { - return isButtonHeld(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoPressed() { - return isButtonPressed(WIIMOTE_BUTTON_TWO); - } - - /* Button A */ - - public boolean isButtonAJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAHeld() { - return isButtonHeld(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAPressed() { - return isButtonPressed(WIIMOTE_BUTTON_A); - } - - /* Button B */ - - public boolean isButtonBJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBHeld() { - return isButtonHeld(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBPressed() { - return isButtonPressed(WIIMOTE_BUTTON_B); - } - - /* Button LEFT */ - - public boolean isButtonLeftJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftHeld() { - return isButtonHeld(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftPressed() { - return isButtonPressed(WIIMOTE_BUTTON_LEFT); - } - - /* Button RIGHT */ - - public boolean isButtonRightJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightHeld() { - return isButtonHeld(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightPressed() { - return isButtonPressed(WIIMOTE_BUTTON_RIGHT); - } - - /* Button UP */ - - public boolean isButtonUpJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpHeld() { - return isButtonHeld(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpPressed() { - return isButtonPressed(WIIMOTE_BUTTON_UP); - } - - /* Button DOWN */ - - public boolean isButtonDownJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownHeld() { - return isButtonHeld(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownPressed() { - return isButtonPressed(WIIMOTE_BUTTON_DOWN); - } - - /* Button - */ - - public boolean isButtonMinusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_MINUS); - } - - /* Button + */ - - public boolean isButtonPlusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_PLUS); - } - - /* Button HOME */ - - public boolean isButtonHomeJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeHeld() { - return isButtonHeld(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomePressed() { - return isButtonPressed(WIIMOTE_BUTTON_HOME); - } - - @Override - public String toString() { - String out = ""; - /* Display buttons */ - out += "/******** Buttons ********/\n"; - out += "--- Buttons just pressed : " + buttonsJustPressed + "\n"; - out += "--- Buttons just released : " + buttonsJustReleased + "\n"; - out += "--- Buttons held : " + buttonsHeld + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/DisconnectionEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/DisconnectionEvent.java deleted file mode 100644 index 341b626..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/DisconnectionEvent.java +++ /dev/null @@ -1,44 +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.wiiuseapievents; - -/** - * Class representing a disconnection event. - * @author guiguito - */ -public class DisconnectionEvent extends WiiUseApiEvent { - - /** - * Construct the DisconnectionEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public DisconnectionEvent(int id) { - super(id,WiiUseApiEvent.DISCONNECTION_EVENT); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** DISCONNECTION EVENT : WIIMOTE ID :" + super.getWiimoteId() + " ********/\n"; - - return out; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/EventsGatherer.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/EventsGatherer.java deleted file mode 100644 index 5c83d78..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/EventsGatherer.java +++ /dev/null @@ -1,241 +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.wiiuseapievents; - -/** - * This class is used to gather events during a call to the Wiiuse API. - * - * @author guiguito - */ -public class EventsGatherer { - - private WiiUseApiEvent[] events; - private int index = 0; - private GenericEvent genericEvent = null; - - /** - * Create EventsGatherer. - * - * @param nbWiimotes - * nb wiimotes (nb a of events possible in a call to Wiiuse API) - */ - public EventsGatherer(int nbWiimotes) { - events = new WiiUseApiEvent[nbWiimotes]; - } - - /** - * Add an event to the array. - * - * @param e - * the event to add. - */ - private void addEvent(WiiUseApiEvent e) { - events[index] = e; - index++; - } - - /** - * Prepare a wiimote event to add. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public void prepareWiiMoteEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - genericEvent = new GenericEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public void prepareIRevent(int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - genericEvent.prepareIRevent(x, y, z, ax, ay, xVRes, yVRes, xOffset, - yOffset, sensorBarPostion, screenAsPectRatio); - - } - - /** - * Add an IR point to the WiiMoteEvent prepared - * - * @param x - * x coordinates - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRPointToPreparedWiiMoteEvent(int x, int y, short rx, - short ry, short size) { - if (genericEvent != null) { - genericEvent.addIRpoint(x, y, rx, ry, size); - } - } - - /** - * Set orientation and gravity force of the prepared event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public void addMotionSensingValues(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - if (genericEvent != null) { - genericEvent.setMotionSensingEvent(orientationThreshold, - accelerationThreshold, smoothingState, alphaSmooth, r, p, - ya, x, y, z, xx, yy, zz); - } - } - - /** - * Add the prepared WiimoteEvent to the gatherer. - */ - public void addWiimoteEvent() { - if (genericEvent != null) { - addEvent(genericEvent); - genericEvent = null; - } - } - - /** - * Add a StatusEvent to the gatherer. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public void addStatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - StatusEvent evt = new StatusEvent(id, connect, batt, led, speak, - attach, rumbleState, continuousState, irState, - motionSensingState); - addEvent(evt); - } - - /** - * Add a DisconnectionEvent to the gatherer. - * - * @param id - * id of the wiimote - */ - public void addDisconnectionEvent(int id) { - DisconnectionEvent evt = new DisconnectionEvent(id); - addEvent(evt); - } - - /** - * Return an array containing the events. - * - * @return events received - */ - public WiiUseApiEvent[] getEvents() { - return java.util.Arrays.copyOfRange(events, 0, index); - } - - /** - * Clear the gatherer and remove objects. - */ - public void clearEvents() { - for (int i = 0; i < events.length; i++) { - events[i] = null; - } - genericEvent = null; - index = 0; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/GenericEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/GenericEvent.java deleted file mode 100644 index e8ea39b..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/GenericEvent.java +++ /dev/null @@ -1,227 +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.wiiuseapievents; - -/** - * Class that is a bean to be filled by the wiiuse API. - * - * @author guiguito - */ -public class GenericEvent extends WiiUseApiEvent { - - ButtonsEvent buttonsEvent = null; - IREvent infraredEvent = null; - MotionSensingEvent motionSensingEvent = null; - - /** - * Construct the Wiimote setting up the id. - * - * @param id - * the Wiimote id - */ - public GenericEvent(int id) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - } - - /** - * Construct the Wiimote setting up the id and the buttons. - * - * @param id - * the Wiimote id - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public GenericEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - buttonsEvent = new ButtonsEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Tell if there is an IR Event. - * - * @return TRUE if there is an IR event. - */ - public boolean isThereIrEvent() { - return infraredEvent != null; - } - - /** - * Tell if there is a motion sensing Event. - * - * @return TRUE if there is a motion sensing event. - */ - public boolean isThereMotionSensingEvent() { - return motionSensingEvent != null; - } - - /** - * Get buttons event. - * - * @return the buttons event. - */ - public ButtonsEvent getButtonsEvent() { - return buttonsEvent; - } - - /** - * Get IR event. - * - * @return the IR event if there is one or null. - */ - public IREvent getIREvent() { - return infraredEvent; - } - - /** - * Get motion sensing event. - * - * @return the motion sensing event if there is one or null. - */ - public MotionSensingEvent getMotionSensingEvent() { - return motionSensingEvent; - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public void prepareIRevent(int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - if (infraredEvent == null) { - infraredEvent = new IREvent(getWiimoteId(), x, y, z, ax, ay, xVRes, - yVRes, xOffset, yOffset, sensorBarPostion, - screenAsPectRatio); - } - } - - /** - * Add an IR point to the generic event. Create an IR Event if it's not - * created yet. - * - * @param x - * x coordinates. - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - if (infraredEvent != null) - infraredEvent.addIRpoint(x, y, rx, ry, size); - } - - /** - * Set the Motion Sensing Event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public void setMotionSensingEvent(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - motionSensingEvent = new MotionSensingEvent(getWiimoteId(), - orientationThreshold, accelerationThreshold, smoothingState, - alphaSmooth, r, p, ya, x, y, z, xx, yy, zz); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** GENERIC EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - - out += buttonsEvent; - - if (infraredEvent != null) { - out += infraredEvent; - } else { - out += "/******** IR Tracking ********/\n"; - out += "--- Active : false\n"; - } - - if (motionSensingEvent != null) { - out += motionSensingEvent; - } else { - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : false \n"; - } - - return out; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/IREvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/IREvent.java deleted file mode 100644 index 6007e97..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/IREvent.java +++ /dev/null @@ -1,285 +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.wiiuseapievents; - -import wiiusej.values.IRSource; - -/** - * Class which represents an IR event. - * - * @author guiguito - */ -public class IREvent extends WiimoteEvent { - - /* IR Tracking */ - private IRSource[] IRPoints; - private short indexPoints = 0; - private int x; - private int y; - private int z;// distance from the sensor bar - private int ax; - private int ay; - private int xVRes; - private int yVRes; - private int xOffset; - private int yOffset; - private short sensorBarPostion; - private short screenAsPectRatio; - - static private short WIIUSE_IR_ABOVE = 0; - static private short WIIUSE_IR_BELOW = 1; - static private short WIIUSE_SCREEN_RATIO_4_3 = 0; - static private short WIIUSE_SCREEN_RATIO_16_9 = 1; - - private static short NB_POINTS = 4;// number of points IR can track - - /** - * Constructor of IREvent with full infos. - * - * @param id - * d of the wiimote concerned. - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public IREvent(int id, int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - super(id); - this.x = x; - this.y = y; - this.z = z; - this.ax = ax; - this.ay = ay; - this.xVRes = xVRes; - this.yVRes = yVRes; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.sensorBarPostion = sensorBarPostion; - this.screenAsPectRatio = screenAsPectRatio; - IRPoints = new IRSource[NB_POINTS]; - } - - /** - * Get list of IR points. - * - * @return the list of 2D points - */ - public IRSource[] getIRPoints() { - return java.util.Arrays.copyOfRange(IRPoints, 0, indexPoints); - } - - /** - * Add IR Point in the list (Max 4 points) - * - * @param x - * x value - * @param y - * y value - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - IRPoints[indexPoints] = new IRSource(x, y, rx, ry, size); - indexPoints++; - return; - } - - /** - * Return calculated X coordinate. - * - * @return the x - */ - public int getX() { - return x; - } - - /** - * Return calculated Y coordinate. - * - * @return the y - */ - public int getY() { - return y; - } - - /** - * Return calculated distance. - * - * @return the z - */ - public int getZ() { - return z; - } - - /** - * Return absolute X coordinate. - * - * @return the ax - */ - public int getAx() { - return ax; - } - - /** - * Return absolute Y coordinate. - * - * @return the ay - */ - public int getAy() { - return ay; - } - - /** - * Return IR virtual screen x resolution. - * - * @return the xVRes - */ - public int getXVRes() { - return xVRes; - } - - /** - * Return IR virtual screen y resolution. - * - * @return the yVRes - */ - public int getYVRes() { - return yVRes; - } - - /** - * Return IR X correction offset. - * - * @return the xOffset - */ - public int getXOffset() { - return xOffset; - } - - /** - * Return IR Y correction offset. - * - * @return the yOffset - */ - public int getYOffset() { - return yOffset; - } - - /** - * Return true if the sensor bar is above. - * - * @return true if the sensor bar is above. - */ - public boolean isSensorBarAbove() { - return sensorBarPostion == WIIUSE_IR_ABOVE; - } - - /** - * Return true if the sensor bar is below. - * - * @return true if the sensor bar is below. - */ - public boolean isSensorBarBelow() { - return sensorBarPostion == WIIUSE_IR_BELOW; - } - - /** - * Return true if screen aspect ratio set is 4/3. - * - * @return true if screen aspect ratio set is 4/3. - */ - public boolean isScreenAspectRatio43() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_4_3; - } - - /** - * Return true if screen aspect ratio set is 16/9. - * - * @return true if screen aspect ratio set is 16/9. - */ - public boolean isScreenAspectRatio169() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_16_9; - } - - /** - * Return aspect ratio of the screen. - * - * @return the screenAsPectRatio - */ - public short getScreenAsPectRatio() { - return screenAsPectRatio; - } - - @Override - public String toString() { - String out = ""; - /* Display IR Tracking */ - out += "/******** IR Tracking ********/\n"; - out += "--- Active : true\n"; - out += "--- calculated X coordinate : " + x + "\n"; - out += "--- calculated Y coordinate : " + y + "\n"; - out += "--- calculated distance : " + z + "\n"; - out += "--- absolute X coordinate : " + ax + "\n"; - out += "--- absolute Y coordinate : " + ay + "\n"; - out += "--- IR virtual screen x resolution : " + xVRes + "\n"; - out += "--- IR virtual screen y resolution : " + yVRes + "\n"; - out += "--- IR X correction offset : " + xOffset + "\n"; - out += "--- IR Y correction offset : " + yOffset + "\n"; - if (isScreenAspectRatio43()) { - out += "--- aspect ratio of the screen : 4/3\n"; - } else if (isScreenAspectRatio169()) { - out += "--- aspect ratio of the screen : 16/9\n"; - } - if (isSensorBarAbove()) { - out += "--- IR sensor bar position. : Above\n"; - } else if (isSensorBarBelow()) { - out += "--- IR sensor bar position. : Below\n"; - } - out += "--- Seen points\n"; - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] != null) { - out += IRPoints[i].toString(); - } - } - out += "\n"; - return out; - } -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/MotionSensingEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/MotionSensingEvent.java deleted file mode 100644 index 6ec7712..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/MotionSensingEvent.java +++ /dev/null @@ -1,194 +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.wiiuseapievents; - -import wiiusej.values.GForce; -import wiiusej.values.Orientation; -import wiiusej.values.RawAcceleration; - -/** - * Class which represents a motion sensing event. - * - * @author guiguito - */ -public class MotionSensingEvent extends WiimoteEvent { - - /* Motion Sensing */ - private Orientation orientation; - private GForce gforce; - private RawAcceleration acceleration; - - private float orientationThreshold = 0; - private int accelerationThreshold = 0; - private float alphaSmoothing = 0; - private boolean isSmoothingActive = false; - - /** - * Constructor for a Motion Sensing Event. - * - * @param id - * id of the wiimote concerned. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public MotionSensingEvent(int id, float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - super(id); - this.orientationThreshold = orientationThreshold; - this.accelerationThreshold = accelerationThreshold; - this.isSmoothingActive = smoothingState; - this.alphaSmoothing = alphaSmooth; - setOrientationAndGforce(r, p, ya, x, y, z, xx, yy, zz); - } - - /** - * Set orientation, gravity force and raw acceleration. - * - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - private void setOrientationAndGforce(float r, float p, float ya, float x, - float y, float z, short xx, short yy, short zz) { - this.orientation = new Orientation(r, p, ya); - this.gforce = new GForce(x, y, z); - this.acceleration = new RawAcceleration(xx, yy, zz); - } - - /** - * @return the orientation - */ - public Orientation getOrientation() { - return orientation; - } - - /** - * Get the gravity force. - * - * @return the gforce - */ - public GForce getGforce() { - return gforce; - } - - /** - * Get the raw acceleration. - * - * @return the raw acceleration - */ - public RawAcceleration getRawAcceleration() { - return acceleration; - } - - /** - * Get orientation threshold. - * - * @return the orientationThreshold - */ - public float getOrientationThreshold() { - return orientationThreshold; - } - - /** - * Get acceleration threshold. - * - * @return the accelerationThreshold - */ - public int getAccelerationThreshold() { - return accelerationThreshold; - } - - /** - * Get alpha smoothing. - * - * @return the alphaSmoothing - */ - public float getAlphaSmoothing() { - return alphaSmoothing; - } - - /** - * Tell if the option SMOOTHING is activated. - * - * @return the isSmoothingActive - */ - public boolean isSmoothingActive() { - return isSmoothingActive; - } - - @Override - public String toString() { - String out = ""; - /* Motion sensing */ - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : true \n"; - out += "--- Orientation threshold value ? : " + orientationThreshold - + "\n"; - out += "--- Acceleration threshold value ? : " + accelerationThreshold - + "\n"; - out += "--- Alpha smoothing threshold value ? : " + alphaSmoothing - + "\n"; - out += "--- Smoothing ? : " + isSmoothingActive + "\n"; - out += "--- " + orientation + "\n"; - out += "--- " + gforce + "\n"; - out += "--- " + acceleration + "\n"; - return out; - } -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/StatusEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/StatusEvent.java deleted file mode 100644 index 7a365fc..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/StatusEvent.java +++ /dev/null @@ -1,258 +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.wiiuseapievents; - -/** - * Class used to represent a status event. This class is used to know what are - * the settings of the wiimote. - * - * @author guiguito - */ -public class StatusEvent extends WiiUseApiEvent { - - private static short WIIMOTE_LED_1 = 1; - private static short WIIMOTE_LED_2 = 2; - private static short WIIMOTE_LED_3 = 4; - private static short WIIMOTE_LED_4 = 8; - - /* ATTACHMENT CONSTANTS */ - - private static short EXP_NONE = 0; - private static short EXP_NUNCHUK = 1; - private static short EXP_CLASSIC = 2; - private static short EXP_GUITAR_HERO_3 = 3; - - /* Status variables */ - private boolean connected = false; - - private float batteryLevel = -1; - - private short leds = 0; - - private boolean isSpeakerEnabled = false; - - private int attachment = 0; - - private boolean isRumbleActive = false; - - private boolean isContinuousActive = false; - - private boolean isIrActive = false; - - private boolean isMotionSensingActive = false; - - /** - * Construct the StatusEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public StatusEvent(int id) { - super(id, WiiUseApiEvent.STATUS_EVENT); - } - - /** - * Build a StatusEvent with all fields set. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public StatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - super(id, WiiUseApiEvent.STATUS_EVENT); - connected = connect; - this.batteryLevel = batt; - this.leds = led; - this.isSpeakerEnabled = speak; - this.attachment = attach; - isRumbleActive = rumbleState; - isContinuousActive = continuousState; - isIrActive = irState; - isMotionSensingActive = motionSensingState; - } - - /** - * True if the wiimote is connected false otherwise. - * - * @return return the connected status. - */ - public boolean isConnected() { - return connected; - } - - /** - * Get battery level. - * - * @return battery level. 1 = 100% - */ - public float getBatteryLevel() { - return batteryLevel; - } - - /** - * Get status of the leds . - * - * @return a short representing LEDS turned on. - */ - public short getLeds() { - return leds; - } - - /** - * Get led1 status. - * - * @return true if the led is set. - */ - public boolean isLed1Set() { - if ((leds & WIIMOTE_LED_1) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led2 status. - * - * @return true if the led is set. - */ - public boolean isLed2Set() { - if ((leds & WIIMOTE_LED_2) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led3 status. - * - * @return true if the led is set. - */ - public boolean isLed3Set() { - if ((leds & WIIMOTE_LED_3) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led4 status. - * - * @return true if the led is set. - */ - public boolean isLed4Set() { - if ((leds & WIIMOTE_LED_4) > 0) { - return true; - } else { - return false; - } - } - - /** - * Tell if the speaker is enable for this wiimote - * - * @return TRUE if it enabled false otherwise - */ - public boolean isSpeakerEnabled() { - return isSpeakerEnabled; - } - - /** - * Get the int representing the attachment type. - * - * @return value of the Attachment Type - */ - public int getAttachment() { - return attachment; - } - - /** - * Get the status of rumble. - * - * @return true if the rumble is active false otherwise - */ - public boolean isRumbleActive() { - return isRumbleActive; - } - - /** - * Tell if the CONTINUOUS option is activated. - * - * @return the isContinuousActive - */ - public boolean isContinuousActive() { - return isContinuousActive; - } - - /** - * Tell if the IR Tracking is active. - * - * @return TRUE if it is active or false otherwise. - */ - public boolean isIrActive() { - return isIrActive; - } - - /** - * Get the flag indicating if the motion sensing is active. - * - * @return true if the motion sensing is active false otherwise - */ - public boolean isMotionSensingActive() { - return isMotionSensingActive; - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** STATUS EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - out += "--- connected : " + connected + "\n"; - out += "--- Battery level : " + batteryLevel + "\n"; - out += "--- Leds : " + leds + "\n"; - out += "--- Speaker enabled : " + isSpeakerEnabled + "\n"; - out += "--- Attachment ? : " + attachment + "\n"; - out += "--- Rumble ? : " + isRumbleActive + "\n"; - out += "--- Continuous ? : " + isContinuousActive + "\n"; - out += "--- IR active ? : " + isIrActive + "\n"; - out += "--- Motion sensing active ? : " + isMotionSensingActive + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java deleted file mode 100644 index 880c632..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java +++ /dev/null @@ -1,62 +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.wiiuseapievents; - -/** - * This class describes the structure of an event from the WiiUse API event. - * - * @author guiguito - */ -public abstract class WiiUseApiEvent extends WiimoteEvent{ - - public static int GENERIC_EVENT = 1; - public static int STATUS_EVENT = 2; - public static int DISCONNECTION_EVENT = 3; - public static int WIIUSE_NUNCHUK_INSERTED = 4; - public static int WIIUSE_NUNCHUK_REMOVED = 5; - public static int WIIUSE_CLASSIC_CTRL_INSERTED = 6; - public static int WIIUSE_CLASSIC_CTRL_REMOVED = 7; - public static int WIIUSE_GUITAR_HERO_3_CTRL_INSERTED = 8; - public static int WIIUSE_GUITAR_HERO_3_CTRL_REMOVED = 9; - - /* Event Type */ - private int eventType; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - * @param type - * type of the event - */ - public WiiUseApiEvent(int id, int type) { - super(id); - eventType = type; - } - - /** - * Get the event type. - * @return the eventType - */ - public int getEventType() { - return eventType; - } - - public abstract String toString(); - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiListener.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiListener.java deleted file mode 100644 index 3f6bb22..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiiUseApiListener.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.wiiuseapievents; - - - -/** - * This is the interface to implement to listen to events from the wiiuse API. - * - * @author guiguito - */ -public interface WiiUseApiListener extends java.util.EventListener { - - /** - * Method called when a WiiUseApiEvent occurs. - * A WiiUseApiEvent can be : - * - GenericEvent (Storing ButtonsEvent and - * eventually IREvent and MotionSensingEvent) - * - StatusEvent - * - DisconnectionEvent - * @param e - */ - void onWiiUseApiEvent(WiiUseApiEvent e); - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteEvent.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteEvent.java deleted file mode 100644 index 1504a37..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteEvent.java +++ /dev/null @@ -1,59 +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.wiiuseapievents; - -/** - * Abstract mother class representing an event with a wiimote id. - * - * @author guiguito - */ -public abstract class WiimoteEvent { - - /* ID */ - private int wiimoteId = -1; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public WiimoteEvent(int id) { - wiimoteId = id; - } - - /** - * Get Wiimote ID - * - * @return the wiimote id. - */ - public int getWiimoteId() { - return wiimoteId; - } - - /** - * Set Wiimote ID - * - * @param wiimoteId - * id of the wiimote - */ - void setWiimoteId(int wiimoteId) { - this.wiimoteId = wiimoteId; - } - - public abstract String toString(); -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteListener.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteListener.java deleted file mode 100644 index 3ea3c05..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapievents/WiimoteListener.java +++ /dev/null @@ -1,69 +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.wiiuseapievents; - -/** - * This is the interface to implement to listen to events from wiimotes. - * The differents methods are called in this order : - * onButtonsEvent, onIrEvent, onMotionSensingEvent, onStatusEvent, onDisconnectionEvent. - * - * @author guiguito - */ -public interface WiimoteListener extends java.util.EventListener { - - /** - * Method called on a button Event. - * @param e the buttonEvent with the last informations - * about the buttons of the wiimote. - */ - void onButtonsEvent(ButtonsEvent e); - - /** - * Method called when an IR event occurs. - * @param e the IREvent with the IR points seen. - */ - void onIrEvent(IREvent e); - - /** - * Method called when a motion sensing event occurs. - * @param e the motion sensing event with orientation and acceleration. - */ - void onMotionSensingEvent(MotionSensingEvent e); - - /** - * Method called on a status event. - * A status event occurs when : - * - we ask it - * - an expansion controller has been plugged - * - an expansion controller has been unplugged - * This is where you can get the different values of - * the parameters setup on your wiimote. - * @param e the status event. - */ - void onStatusEvent(StatusEvent e); - - /** - * This is the method called when a disconnection event occurs. - * A disconnection event happens when : - * - there are no battery left - * - the wiimote has just been turned off - * - the connection is dropped - * @param e the disconnection event. - */ - void onDisconnectionEvent(DisconnectionEvent e); - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/FloatValueRequest.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/FloatValueRequest.java deleted file mode 100644 index a003239..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/FloatValueRequest.java +++ /dev/null @@ -1,71 +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.wiiuseapirequest; - -/** - * Represents a request with a float value to pass to wiiuse API. - * - * @author guiguito - */ -public class FloatValueRequest extends WiiUseApiRequest { - - private float floatValue; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public FloatValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * threshold in degrees - */ - public FloatValueRequest(int id, int type, float th) { - super(id, type); - floatValue = th; - } - - /** - * Get the float value. - * @return the float value - */ - public float getFloatValue() { - return floatValue; - } - - /** - * Set the float value. - * @param val the value to set - */ - public void setFloatValue(float val) { - this.floatValue = val; - } - - - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/IntValueRequest.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/IntValueRequest.java deleted file mode 100644 index 801093d..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/IntValueRequest.java +++ /dev/null @@ -1,74 +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.wiiuseapirequest; - -/** - * Represents a request with an int value to pass to wiiuse API. - * - * @author guiguito - */ -public class IntValueRequest extends WiiUseApiRequest { - - private int intValue; - - /** - * Constructor setting the id of the wiimote - * concerned and the type of the request. - * - * @param id - * the id of the wiimote concerned. - */ - public IntValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote - * concerned, the type of the request - * and the int value. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * the int value. - */ - public IntValueRequest(int id, int type, int th) { - super(id, type); - intValue = th; - } - - /** - * Get the int value. - * @return the int value - */ - public int getIntValue() { - return intValue; - } - - /** - * Set the int value. - * @param val the value to set - */ - public void setIntValue(int val) { - this.intValue = val; - } - - - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/LedsRequest.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/LedsRequest.java deleted file mode 100644 index 1a21024..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/LedsRequest.java +++ /dev/null @@ -1,125 +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.wiiuseapirequest; - -/** - * Represents a request to set leds of the wiimote with WiiUse API. - * - * @author guiguito - */ -public class LedsRequest extends wiiusej.wiiuseapirequest.WiiUseApiRequest { - - private boolean led1, led2, led3, led4; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - */ - public LedsRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - * @param l1 - * led1 status. True=ON, False=OFF - * @param l2 - * led2 status. True=ON, False=OFF - * @param l3 - * led3 status. True=ON, False=OFF - * @param l4 - * led4 status. True=ON, False=OFF - */ - public LedsRequest(int id, int type, boolean l1, boolean l2, boolean l3, - boolean l4) { - super(id, type); - led1 = l1; - led2 = l2; - led3 = l3; - led4 = l4; - } - - /** - * @return the led1 - */ - public boolean isLed1() { - return led1; - } - - /** - * @param led1 - * the led1 to set - */ - public void setLed1(boolean led1) { - this.led1 = led1; - } - - /** - * @return the led2 - */ - public boolean isLed2() { - return led2; - } - - /** - * @param led2 - * the led2 to set - */ - public void setLed2(boolean led2) { - this.led2 = led2; - } - - /** - * @return the led3 - */ - public boolean isLed3() { - return led3; - } - - /** - * @param led3 - * the led3 to set - */ - public void setLed3(boolean led3) { - this.led3 = led3; - } - - /** - * @return the led4 - */ - public boolean isLed4() { - return led4; - } - - /** - * @param led4 - * the led4 to set - */ - public void setLed4(boolean led4) { - this.led4 = led4; - } - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java deleted file mode 100644 index 98e907e..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java +++ /dev/null @@ -1,73 +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.wiiuseapirequest; - - -/** - * Represents a request with two int values to pass to wiiuse API. - * - * @author guiguito - */ -public class TwoIntValueRequest extends IntValueRequest { - - private int secondIntValue; - - /** - * Constructor setting the id of the wiimote - * concerned and the type of the request. - * - * @param id the id of the wiimote concerned. - * @param type type of the request - */ - public TwoIntValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote - * concerned, the type of the request - * and the two int values. - * - * @param id the id of the wiimote concerned. - * @param type type of the request - * @param x first int value. - * @param y second int value. - */ - public TwoIntValueRequest(int id, int type, int x, int y) { - super(id, type, x); - secondIntValue = y; - } - - /** - * Get the second int value. - * @return the secondIntValue - */ - public int getSecondIntValue() { - return secondIntValue; - } - - /** - * Set the second int value. - * @param secondIntValue the secondIntValue to set. - */ - public void setSecondIntValue(int secondIntValue) { - this.secondIntValue = secondIntValue; - } - - - -} diff --git a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java b/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java deleted file mode 100644 index 1f4525b..0000000 --- a/WiiUseJ_0.1/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java +++ /dev/null @@ -1,112 +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.wiiuseapirequest; - -/** - * Represents a request we could do to the WiiUse API. - * - * @author guiguito - */ -public class WiiUseApiRequest { - - public static int WIIUSE_STATUS_REQUEST = 1; - public static int WIIUSE_ACTIVATE_SMOOTHING_REQUEST = 2; - public static int WIIUSE_DEACTIVATE_SMOOTHING_REQUEST = -2; - public static int WIIUSE_ACTIVATE_IR_TRACKING_REQUEST = 3; - public static int WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST = -3; - public static int WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST = 4; - public static int WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST = -4; - public static int WIIUSE_CLOSE_CONNECTION_REQUEST = 5; - public static int WIIUSE_ACTIVATE_CONTINUOUS_REQUEST = 6; - public static int WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST = -6; - public static int WIIUSE_ACTIVATE_RUMBLE_REQUEST = 7; - public static int WIIUSE_DEACTIVATE_RUMBLE_REQUEST = -7; - public static int WIIUSE_LEDS_REQUEST = 8; - public static int WIIUSE_ORIENT_THRESHOLHD_REQUEST = 9; - public static int WIIUSE_ACCEL_THRESHOLHD_REQUEST = 10; - public static int WIIUSE_ALPHA_SMOOTHING_REQUEST = 11; - public static int WIIUSE_RESYNC = 12; - public static int WIIUSE_ASPECT_RATIO_4_3 = 13; - public static int WIIUSE_ASPECT_RATIO_16_9 = 14; - public static int WIIUSE_SENSOR_BAR_ABOVE = 15; - public static int WIIUSE_SENSOR_BAR_BELOW = 16; - public static int WIIUSE_SET_VIRTUAL_RESOLUTION = 17; - - private int wiimoteId = 0; - private int requestType = 0; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public WiiUseApiRequest(int id) { - wiimoteId = id; - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * - */ - public WiiUseApiRequest(int id, int type) { - wiimoteId = id; - requestType = type; - } - - /** - * Get id of the wiimote concerned by this request. - * - * @return id of the wiimote concerned - */ - public int getId() { - return wiimoteId; - } - - /** - * Set id of the wiimote concerned by this request. - * - * @param id - * id fh the wiimote concernet - */ - public void setId(int id) { - wiimoteId = id; - } - - /** - * Get the request type. - * - * @return the requestType - */ - public int getRequestType() { - return requestType; - } - - /** - * Set the request type. - * - * @param requestType - * the requestType to set - */ - public void setRequestType(int requestType) { - this.requestType = requestType; - } - -} diff --git a/WiiUseJ_0.1/wiiuse.dll b/WiiUseJ_0.1/wiiuse.dll deleted file mode 100644 index 6855619edad1c5156421d3af3983f527fe6db9ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 zcmeFaeS8!}wm06B=}9`tBt6Ikf<_52xY2+&8gPjNng|o3k~kq`Lc}EOF6L&lzOdM> zhzU%#6P->oiqER6*O!$?@BO)V-`xA`0=_a~FfWK2z+E#y*x<6-aS)@hNx+!-eNXjF zGO+INbDw+f=l7RRXys_K;9wv97$9LM7qiE!L5yy;ⅆWhv29TXT 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%0DW3JW=zRe^+{#()v8bV)K4_M-8%`rIzQ0g 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 - - - - - diff --git a/WiiUseJ_0.11/.project b/WiiUseJ_0.11/.project deleted file mode 100644 index 9485f4a..0000000 --- a/WiiUseJ_0.11/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - WiiUseJava - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/WiiUseJ_0.11/README.TXT b/WiiUseJ_0.11/README.TXT deleted file mode 100644 index 268d31d..0000000 --- a/WiiUseJ_0.11/README.TXT +++ /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 . - */ - - -WiiuseJ is a java API to use wiimotes on your computer. This API is built on top of an excellent API call Wiiuse using JNI. - -WiiuseJ intent to be a very simple, easy to use and lightweight java API for wiimotes. - -Some of the great aspects of this API are : - - * The compatibility which is as large as Wiiuse's API compatibility - - * Cross-platform : Windows and linux (like Wiiuse) - - * Easy to use - - -WiiuseJ is made by Guilhem Duché : guiguito1@hotmail.com. -You can contact me if you need more information. - -Go to : http://wiiusej.googlecode.com/ for further documentations. - - - diff --git a/WiiUseJ_0.11/WiiUseJ.dll b/WiiUseJ_0.11/WiiUseJ.dll deleted file mode 100644 index 6999b85fbbbf9b878b4a06dd2f4cee4e6524785c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25448 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.11/libWiiuseJ.so b/WiiUseJ_0.11/libWiiuseJ.so deleted file mode 100644 index 47ab1f2e1c853f69a5c42e2121404627b3bd504a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14645 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 aiX^-E7|fi*NVcm~2Y4^kjI8v)k^Mi6e4j1= diff --git a/WiiUseJ_0.11/libwiiuse.so b/WiiUseJ_0.11/libwiiuse.so deleted file mode 100644 index 2f9247b8348316799484be79d6a74c48c8c7af65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39073 zcmeIbe|%KM)jxhW*}wvkjTnVmtcwH-{s;*o0@9j9Hc?9;AW5u>OGtJ}YJQR2<%bGp z*#vUAu3{0e{q&<)ZA)9VP;J0pxB;2~VjHN{tO7=~x{*{PA_AiMzTY$VZgvCs*ysDa zK7TzonVmT^XU?2CbLPz4nYs7g@0^xxu~-!IidW(lLUV^I%6Rz0>SW4z#i3Z0(fGYY zq{~?OyLFMG&?OK|Qbf9lTZwqMq&U!l>u01RsO$y)UZl~r1EyoT6>jFg)Dn1STxR-> zNVy&EGC1N7hvRh-+zoKI!QBkUYa-k%xWRCCI9^~;al%~X-x5DvCl-_s#z1+YQ?RAb^lywdqWj!qlC)Wty z0zVCIfB`2PezZ3|8t4=LNgp^B@O4Jqm3`7i8}J~*pA3H_T#5mk-c<;kX99*lDhj?J zDttb|V+?qz;r|Feb@O|0*Bf!BHvxf5;Yg1@b;zvyc(h`M!#xs>lo1CC2}*n&l9lGk zk55ITXISejx44F6So&EMs}%}+%lm^~xG*Vi(r*_Ivym3tpSsNYkiOYIX1%EctQ+Oc zi+V`?pnj4s%8hzKx$vU?WWcfQ*oKs~*%s6#>N@*`sXx?7>J$47ukiCnQ(t)^>2S{j zQ${>}@BKGDxnc5x+-Gin+CAmcnVYW7t(kcJXWss_y z@}DmFcWBhq(#p4gdL-n#thOe2^>vPI^=p1H?~84ooVjs>etpA(KVG(O%-5Nl$1OYB z@xZL*`Bje`xOd~PKYD8ar(MHd8rZ(zw&5LbK6YfJ>%ylt?CANyv#xCwFTMZs`(~B@ zrRcLqZ@vAAc}LHCKa_mejn02|ee~K(!&5$7v;Oz@Trr;KLy8&wv+HlBmaX2{I!w)ZUaVl5SI&h#9waUQ`ZSUBT^N`XQYo#kP&A2 zUm59U`2&sgwFdsJ27mVhkMu4w@Vnq&26v5-{!4_J{uA)i0b!I1c#yF5X)vgF3VMT- zZAed>FUNo(${=L~`7c+L-x>G|0IxpD94wPIf$)8ZUk!ss`%L&bE&+btNNH=Bz87@Upj`cp^jYAi4fRVf;LCs?yi8G~z6?^nLHZ`h_eIcU z{&@J^$X|pEgue%P?u{5HZ4zDwI-5|RH3t8U@aNv4D8B$*;@=MZP2exZD9;W$)zymf zoPqyWl(!mP=M_L=EV0KX3SK7-z~@HPi&l2w>*_7=Fia%xjGD z-$8mF+E@1HLCRpz+wfCG*=(dw1HHB=dSifJ4gN+O^j-sAQjwy(WxxZFJ{RS&->^LD zWjE3%8t|k({E_c&hoWo;9`Qef{2WpG@hiX_Y&gy^{RsH0gFNOL@I%N)=FRd$0P|44 zMkC#d@@_K*>LDCqU9R~RRh6z@^D0tnt5PR0G_Tz2R;#MiQpSu^iiuNJ>?&4k%3bb-?n+fDE-Ei} z{j6$9ty)%mH%n99v1lb_wZ&DHmF{BIT@ss8T2xt5TUvCtTd622FRvp~x7O{daTk@iN{ZAXQJ}XR#kl5ss%nbeN>O!n`4U%c1=%dCoUfGCmQ{M9 z(5h<6z-W<5Y9N5L+66VLM*(9+^UB>(WzF}NL0Ya-cTJV+8dnVCmEOwYQt#cdkp^$o zHEu|*#5K>Ws#TS>O08PruBlNx)iq_6D92OdcAM2$R8t1VMLkT4kxDDE#h)u)irvgD zA(N4+@^YotT@G0*9#IrjxTdD6CQ2Ifir9c+4)~zDGx(Z6CE%npM?CiZ--QsjVu$+a2K(eV{}sEiQA-C&N`e8ax6KR}r2ylO8k!{Cyj z++oBe3w*0G-+*QQxJdpW##9^f?KJ$SFktnAm^RYK82U7Q5Z^@qhl=t%{Vc41(7yy@ zJpBF``}WeunAk=i^OQH}gHAjBF^Y14K6vP$-%n9KppVH^n0}6;bkV;8V=#T2q8y`- znw+42nWCJgKM;(9&;FPcTIml0@AMO~RzM$;Nur;Dc_Dq=1r4KrBkp(TW1+-Beg`mAKEmPKICx|eJ9ou=qF>$r;ka~ zZ2AQl^XX#}awmP<6wjqUR8dOkV?JC;AM^Bb`k4P!)4xVhRQk6l%3}Js5x$RpD&`#Y z(=hj@KLYa$`WGw81N6U-`5gUQ73C57xFLR&KIS36qVK?*ihjDHJVhVvxRHJ~+L?YK z+L=Du^?CaFXlMGEH@-|Ci%R+0zx-Xc@YiVCa3l01{Ju+3cJEMno&%utJc*_gSI?7Z z6fqlAIy-uBJxL8MWpZbmfFUfUl#!i50YeB%DStXQ2^dT(r4GUy1k7ORXu_)noI)6q zP&(@b%%swZgsTO772yoRa|KM)(whk93796KG>>qGfSI-QHo|EFh7u^Ha|t^HoI$vh zaFT$h60Rn!2$-Zx7ZdLO1`$s}X_V4B!W{x;QKgN9+XOtD@M^+A0ki1RM+t8d@STJ= z5Z)l*xr8?oUM=7f!kY-!37D*vZY5kT;Bvx2!gB>oR!esg&J(aoxQ%dzfXRAkJK;0| z-$%HEutUIggu{fB1YA$Jo3J9_M#3iucYn?LKR_7v3H2B7YQi?cZ32FTa1!C5fFC71 zjPND_|BA4K@CE^IAUvAzY5_k*IE`?ffHxAJNVr=1B}a4F#=0q-PSO;`~yMO(U8kANO-P**;J*w z2{k=Qsld4Hj@>&}M=s)r9|W>*$4KBJYu!tUAf|XH>VDF12&&)L{Z>S2)|BuZ#2gvq z4_Y<94N*P&b>Ztt4g0;FEq>;-_;*_Gn6o4B{N?09(1(2l{THf+zUGPrt|GhnHK-iq5kfn{_R8k!J&O>El4iz72W+&cymwufG-Cv z?IxYVC?aUU;UMDQIsA^hTxcToawY$TL}bYnG0>(yF$rhH^gAP_zrV%SCz6ac%t!yIo7AK2ve&aq+nbbNIIb}#i6RSr z9M@Plgjy%!k`Wg#;@FX_BJKjjC5X5S5!Wvmj&ICyAg+J#5^DY23B;i9 zwN6b*Vl4bbhw_wFQ&Xt>+SC+Vc;A;jJ?X(Ce~Q>H24El11q;x{bZ?T!-jrp{<8K0b z8_WrUmPjZr63U8aXY2$5{ga^|058)b@w1E!0^`up(C*M(Rwl<8$p#f9qiY`OM3=tH zcGsL8t9$L8zw0L5nWW7*7M}1Gd&+BfqfdBG=w6%ughg9=8huC|=06dq-m1?zrXykL zX|2obb)jrqD0ndZZpUNy3^|yb5}MN6}D^!-|aP0N2Hc$9=TLT{nSYv*{{=I@cXH^HgYSX#qRP;25m=ZQ%CUy_9Q>G(3lD~l zj5075ric1VjN1=}5dSzz-mOhf)N*CXNoL7~*3eyvo!6lCOp=2_{Y{EP4~9Amn3Q9c z#1H{uuODph{0X8Dwug2f*>kY{$jc0M{tQuUPhs!xgt+vjNqT-_xEl)M+tKhdXhn_< zx&ghO9^aVzuDxlXz3C#fO*5N(J6c3Gk@H>Ab^u_r89a&P42wr|HX)F0v~#xgU1!tT z5aUe5I3P%h*;FS}U)by?L;f)A{K5AjH~UHs-l1@4@4*iUuIL1Ku>Ig+k@hQ@_L@Xp zu~Vk85$r4H2>>}|W7t>B6cMP9y=niLHhWY4yIOPe$xG9BjoCG+?fylfPeOvu!FO7n z9S~N}WA^3T=Lqcybsz>Ij6YrA%OtpR2nmKl+o7eyQ=rOoc7^6_4corJ7_hXXr(N#` za{F_~`0GExjLuyl=T>|D)spJakSp0#W#cL47}%xfZU0^&k@I)6g~VpIfPI;wN{2VTZqsF?q7`jQ8A4mlG;&ZO`NbVuKgruo$40;@5O3vKb1+=CvD z_WA_nLk9{HjMUKf&<;rWLuk!Caq4{s-$s8iw9S7NoA`iW`ZZ{GeBPMt81bR3$tiN= zKXkJF$G*`}{`{vHiPH9qt~ zFUIN6j&{_9>7l)yS5j49JM@8(p^R0IxnQ6CUBfi*X*8%d=S28cXqs{9%jg^m|fXZOzW3GU#(K3P@vLFdGdN{_*F~U11b3hf*8HE=5*m=!NiGqn6>xV>wkb+2G*9NV(GzFC+}>P z7aaJ}-fDGrA46MdYx9tZ+X~&A_#)e`;kf<5^I@tnG^gWk#uljV(c}Cd#vji}vDq62 zfnNIlz%7klA=ob`VLR7dC;4sE-?8K=wvkl zk!t+e;N5}kilZ~nf8M~h)zRQ|aCM*d`j|LO6u!e}@JEe{l0^uJJ30=Zr2 zi%IP1YG>hcp^)W6YL6^IqBBwES6mTVA9&_h^6K2Cs2B z*Om0YFsDa*@nr%9DfRp9jWpIWUJg+9`V&|w#vo;{{{!U_hD`S(5XkJ9GSt2@EJ_IK z&-**NdU`B}dOkF5cpA9Z(^!jbmVr4yZwpELq>C2w z?W8>s(=+X@&M?*_;Ej;pFQs=Yyt8%cT$^r@DjnF5+biUI4W7O&gOyz|6~EdxPP+AN zc?_@EAYz_kjF5{_{{{sz>iir^slUY0$=>u?V9g_BT$RIs-k&z~YF1aO1-tb+ed|t8 zg6Ug}`Pn|pTB={?vt(5?m;MTy2zBQ~G+d4P>uVXKizfANPYhpmiV)-c!8kp@mg13^m8`4y~#&~n7G}(d?_XixOK2M z1+{%+n(d8$z{ZO)6Ox4ASy6%ZxMIU9BO4YEo3hkRVE z4f(jx9Lem6%6#wu?q?XmyO7XsS&ij>>W*x#b*zBCf~D&Zl8nBM`mL>F_4IW?hF6e7 z?Lii$ZF`=->$qIf`4$obn@J$BWD5HgA{AlpFfaNBE4Pe8QIWWh5!ZP=bzWF6EC=dS z8aau256h#nyOBiaFxfkn;qDooWU}x)t2>XKh-lfeay`3R+g1v6ec655ifRT{)Um8> zpph7>wWBq_WDOK@JZ>&2@N8Z z&Oe`K*)+0&m#W#bFu)}KIq)0}270xaCW>1)R9QctCghoqz&(uS7ym+~v)Ol~#Fv%o z+2tnd;F7G{w_s)^*u*4PFqcXxWmoIVRBZ)o$=m%LkcQ@UdL`T+4qcyI$uOR928i>FgJXIam`dP>H*XY zsHXZfyo+S}st|rdKB2rmsk~CV8iFGEMUlKo~Iz@LY}&C2J*X@6@JM#kP$ z81HML6dE5E6>rM1YJb;frukc^H2PR?ZC3)T=|60NS>t><(bVN3q$sSU5#!swlNm6v z55FnWqAg`YI1YDKk^_BaN@tg_n=~5wUx+719BVl7jGS@dUASM721YMT>HITuo~4HS zu`Xe6nh_^?YFs7SwkaoGd()`la#_O}R_!f4OVn_csNp_ev#4T+1*5u6+zCwK@MjH= z1xab@(H|L;AZiFfgpV;vjs?Q>`L`#Cc{=*-?++tMb|F+W{v7O%{BN`C@32UY1*>Ek zoY7#^y&qv$#`LnwMH{256{K`lafwzmUF-n&5D7#$znNH~az;fLO*E_M0V3z`lQ0pN zB%n!gTARPaKE-CQuY-2I%p4SqdlMC+lv=CB+LthtlJveYK4Zs$4^MOAa`EZYxaaLNUJ35s-#0x)L06F) z2iuX5CtFu8F8B|}wLfNhJ+CfWtT^c*u_v*`>JI8hJ*Cd8A`5o>4K;}BJPtNj>o06T{PizzqG)fpon(BR9EN;({51ymhD_4X?>~-g z6A;AWqmZ|K%NE%<53xNw+7>bEeu!qjb1<_sVR3Z3wr9+Cdt)X{v9W&FxeSD4>mARc ziX7w|7sFdB8%DNdP6{+%+ZmZkrrfV(r9|e}z&-pfn5m{w6g@GtoFiH&t2DxM04i=@ zwGzLf=wLc)I)+~iy*2lFCjD7ZZa9n>PGvo-?e!_>E}`Z3k>TYJK&p`` z*bxY@&qR<>(G$Tsi7)4sJlY;wUMC2xjwZCqAY@Dg2}Vr>;{nQwhgQ}z^U6n}GmnkR zEGB}Ch@J@gTQD1!9R$+|&L8Ye>o~XIYQy8xr}UN`WXPg(;@EcPuo#cQW9{Thr`-tTGNZS#3-ycze5Y4cp4o#@fl zPKR0bXxW2n`gvNj2cv*3&3fQAj^n4|v#|+!>dI^z*VFvX3A|P2t=IMg$l_l%7~S+9 zEIMK8nP}KB;OW?bz&$5WdoJocDtcbzwnv+R#Z&e?U`R`SsJSzX3#u4Hz_hq)rO#6C zJOu4t!g;A&q+HX^d8vh{6Ae^IK;bPN)+EATgQ?EteagG!EafF3PWSW9GVoF|r?*_w zusNeiVv2z2QTPueITj@QvV1dYJ@d%N)V0nvB=?*k=l>Ns987YPqR9zyB!=%Gxtn3Z zd3peBM?i)ei&V&N4+4Fur6JD5Ww-Em z5L;}XAV=sdIab58MctfgO91z+ayjDqmUMBSeDP<=cN`4}DNQ^}_O(cgE_NBBtCqQ5|6pl^N@zuLnzQu@QcV%SGJqrE_bp>1yD@52w^x6_7(ijm7c zOt2$z*#p2#h0GQ*tsU}OV8lnY&4nV(Xq!X;lDUviSW2I?l*Zk_8i?DzD!?WYe1!z> z5i6{UT<@j??$Ku5Erwt zaFxaTsa`lSFk_0I1-p}`bvNe7V1}j9`8kdciTI4TM(5GS%s2^H8=aqO-J_kK+MAr8 z;vA7)gRI#JR}de|dIb7iLHq>$7O|AG0>!ct%fPsvlR~ci9bfx*S?hyZPKsUQz7hub zoZbN*$d-19a0XJMMJUeS%-IpWpD6YNoJl_8jxdEQs3ZxiO5OV$>U1&fEWx70U#}=c-u0 zsEU0`>BkBR6%>P<2)r^j;udzrdPDQ8iKsyiZkQbmH;-QgolAdCn!e*B}m4C-`vMx9P+TgWgYx_bsAZNwJ(mbYHPN zh^`nuMc4T@mVMYcHe=8;gph63oY0|y7}>{kj{KwHA%bzKLtf-PyACZIPP?~mpA^Io zzeNz+Q8`l(Vd~_!=uoyn?_=VfT@aImy=5iOA&8?a4}!QIzHwTn^BIh*fk z{RNSvf$RJ|W);0iclRQ-MIrr+NY7=k+oBBe+qobn>KaB(MU+v(nyAc|lZ{B`0mQr@ zhO^^s$R|a6M^wH~a7TOOyy)S=I6vjzJQid z^y>n7JeJv#JwR#6w!!s>>j#$rXI1=56R|IZXK=(3P3~HXBbo=1)qg5Z+z-lQIykFo zujfR7hc)N(u;x@8*5o!aPDB)1H^;SPp@b}ykcASmP(l_;$g(Q>_=m7Pdam+yt4Pg2 z-VEf;K;8`G%|PA^lg=g_M>NkP2%l>__ILQML6(W zkfX>N-Vlk^OwI%ca=^Ur@1&ndP3I%pdVpCmNqA5vw3bl%@z#a|@KKJ^+R$Ny0$Dx& zj(Dx14Y2Cbj>hMA*WEL~YOm*t1?F1*mcf33Y?%~bZhPQE_yD7`!RW%w3ekVRipCoNC0RDvIk3+w1!F4xkhaH&E8@BuZ)o;b9`IWhwraE6C{fcoUP%*dMr!le<^gx-_r{*?dBJ zzMV8N@*Me^Dzpa2`ssV2DiPrx`Dfs{RZKxkj*m@wDGKX}fWDMiXuZL)SZnL<892(` zunZ$s-93YFm!TqrjoIWBe{djmBwPV~)a?O(7zFh5{mlb0k>QfOmABSXKcrriybc5$ zp114PaayL;zGdn-t4GVU>HYn!R=;4`;=d`y(s@3Lh{#y|!CBj`3pkxa1y=({c@K~` z@0&4v{gcIg7ryqQ#%JYgXcS+!fUjD#gA~Uz7(}Evp5$;6EsndsYq9y?wOBrbBa6K& zQta%$#ePI;-=(&PUOPu^?NPP88MXZk6AW4G_anug-?!N6?^^8qa~0cH$j?TKZ51Kv z+$)^xL<{*OsePB)cJGn372T4W7YEJL1!UhcI}Z9c)28=jVS0oGcZ7vI`m(U_yRuMW zvcPWN%L1Wuv(SaPhdHT`=j-wC&@l7_7;YRm!?vQf>MEMKO3aM zJ8hO-x*f--$HqImCpF(c8eCc0^owxP`;vI)u}RzSzv#+bn`TG!n1249w!5~XAO(-- zAe5{R6kU#m8o*u#1R`M0{ z4+A`A@R+#J(&O*+J9HFhKaW3;#arjGcbv9EI3XRXIQGsDLKVl~i97V!JI=&IBI061 z`0>P-aUM71PXv|COWs#2@ocyXTgJ?eB)yWA?tUSh9O(s83xX4TDG-)&mo)w?@h=L`?9SR z8=eU9W!p%&ZdtNoujf0DaIE{)nTfuSnLf+@Y9WbtEO@5PmuVC{S_w=atyZ9@NR4Oqtug8wDb*=TmHHK1 zYQ8LWW}i}>ky0~zOPzvJr+7zjjofG-o@l2SAVqt_2@cdeZxSPn1%j_ngfzw*3*_I4 zuS0vZnO5jylq|dvt`?YF8H`{_{X-Ogmisf<2lRpRz@|2+xxJ~*f%Xaygev)VJdQ`o zkLRQ~8l5lM8#qNw-`}#5=?WA}?JvU?)J@B6V=dMGbt2gU{near)GZqw6$K^E-CMV8 zN^g|CNnlUGU7ZS|wX<7SP9bqzE!j!1i)}3#@VsvbD1UEDR+7@X@+JeNb>*~3XtojZ z?<^N{Kz;ot5E09lQ>=?RC0(e9qIGj(n2!<6-jw^&#D`cJ`-%Zb5@qDJwPdp3H_~^D zqKz`0FOxpcyIQqC@`}32P-{L9Qg=@hhUDKd1bGapTb87F6ZLHC^;y>M?f-KBh<&I+ z-9$wlR<{@_LjuW~o?*Ry>N;y}KXJ#qTF-w2#MFyP$eWCEqfipKM1=*Jy)hVjV=ypX zCQqo#%Z<}kB>BOpf9cCs`$HqaaQg0Eb{l3w?L4dfCy~Y%FqGr3dRy z;porf2qFoS|Cv^;tvP%t29ue#eJ8Y)87M|`c4_OUGLYYm`FOzF9e!d5D6Zu28_4g{ z@}Jk&b9B}p;*iKOPj^1g(eG&JaUMMiUxqCz9# zgz{)xs5s*J^0R7_b0-RrBKU|D^V?dTI}uRW?hS7+%J~MO*gR-mdqXp$pxcuW=3OBS zzdwa$d3WgXJi?DtKUDF?)P$-){2`m2kEjEj@ z+mhSm2ZEma28uyErfxGue7=l#?xms)(Y8awVsjW0?m{b^y7bGXyL5=RnWY%8_K;|i zm7+PEUEyKddmEx#%inZnLu`s}h+lju8^Xs~;Y!g2>qT?Omg8e@o4By79Swg2R6Vy_ z_jYLyu@@T+k;9oK6^>^Z4TZ~nLzt9ag}aR8O@-69h!UV#>q$q?6o-gp)9YKvgSMWP z3an>KYr;@yqJjab0k{QR0A@P(Lh;d(>_&R-PIL-9#-QZ}?GJH0K~D=Lt`n_F+35K@ zw-WJ6XE2cXbALzw!0ZQM<({_J{~57oVgDz>!fxKkz^t#2#INTe^8|}TZZt-XloZ_8Ww|I&O=6SEKTbw6? zCEm;G7MF{N-?oXcmkoA zuyw$`7ki*Po-ugPsSwXD3cTqS-{Bw-n-9kgz;jVE1~cA&*zWP2?1{Ipts{}fLOc*% zkPz7V0V(oPQ^gLs7#Y_?vV}(WHz%vOBiXsS7qzE0r{Y2+nbWqHv3k$YUbp9?p zeJkEwkl*FoPSId~$OoZO=p;S=821h!?T)nO4(otc&zNsKS`Eq-=}WLf1M`1uR1n#k zJK_ek`nC&sYRd)-;uwWY)Oaj^VCAj3!*&K0v@((sn>+dqXx%EB6ZtXr^#=<}5@6Mg zs=wuH5z-xV0%uIXgGA`pTlcp-B4Z{q;+}hHmr>w$Un}eH8I%7pTK8kADiUjeQSf%% zc?|J`J-)?*d*am@dTv)s#`#K%j}k#OyFI>pnD7&iZyEfSI7>^``HFgr$9F%$epuWF zcvDM%OH0oA7{|K&JCi8v&%c0PFJwfE&^uT=gOv9#A}FaT-X@ch;(gJxx}|>ZtiCX(+G>K09 z7NWzE28PH)3`1$kCUK_qY38-2~nZIOAHdU=1u9 z-&i<7w*?A$I@mmm?0=7ksT0HhZbF0POfya>voXRiLXPGeOT_c8w}ubBz)II%K_i7Z zJR8h*Tcl~xh}f6#|HWLekqb+G&La%R(_hRj zChEO-p-E$ZSa3^YA@n*E$|c|IQ-~Lqu*JCF5JkM%@kPKlbM{I(1<}1^OUHUAqgyrk$_V##>Ie82w20- z&$GuR%BT9G-haRj3YxII8CL1pq?ahYBly#rwqY?L)CR{mzK#j}7BKkz`E1edxzM>e!Z?#M7c1 zwd4%`YfDa2M@!Cmr&@CC2%q1YdH#P;1WGq0Hk#vO{hE zlju+{m^&5H4{yWiVqbG%ig@+LoPci%lz0ahk|OUnC@jFx%ZGHSKlTUz4p#L3*QeR* zn;FVY!~^J=J$RP-z5Z&Mf4fDuuAhX&r^qqa&H38(7cMCTL?n)2hSDeqt#|wl01)1Xw5lMJ^$^}?{I{IbXm-|OL6GzTW8?arQ znRb`f7SrF*Uqhd8ei&2-V_9`^o+XqqP0O36#sf{uE0G&7z4Gh}%lXRy&Tqt%n%|aA zquV#VFD&+NoVIWnnt}HpT!tPSREM`@jE^~Eh2|0C{vfD@+^CWD=XuB5*x>o%l}t|x zA`?Lb^I@%7_aN&V7pp3r+q<$M5-V6t9yvrq2DG z2E(ZH)Li)DXE9|dhzoezqUJNWPA-%EAzBX9DTWj&oz;Byst>5ph){f%I`MFap-`nkf z?`wbagvQ*@1Ky+LSxmo;`wPDQpOfgT!E-}!8Qw1D{QSrz=*D%qM=eLz)d$sQ8uknO zJP!O^cjV>tV2p%;kcfowN1nv*wMYJM-AQok52oXY?~&Dry5`6#IW3g(#eP&`xDlG; z+i{5lwRCa@o{aMV;>7Fdrztq@Heo$?ZpynH&XXf?XUyNt_L?Z@y^hnRAU1_Nnc)8(_}x&Zf}~yBnQfsn_{$NlB{9{mN2zPl~d{ijXys+p8|}9!cKXq2ND@8dA0V z^HM%N@>;aKlBtikiSqu9m(Zeq!}KgZZQ$=tY7SfF<7d|JpMG!l#pwM=ydO<=F}%A?o99pQaBNsYOGSMP6iz5|(H1@~R)y)V6wq{q`(N{jPT zp{eRD9A%zfzgxW};C#ov2kYo~qn4KcP9VPnZw&*JoR#qoBkcMEJ82u0kDUa*)jV2` zTa)l6Y$c1{e5V0_XAyn=JV~?g*W$tsSI(xda^!!B24i$ zf&8ObN44+5$z!~KGLc;L0~a2=#D|sy8?VR7(NM(k1kGjOruUR}RQvONM0~59xZmG_ zR`cz+4dn^p4Z{)px$M5`?J$67r&~P~4(uUpXb#3)N;^DX$RSa~f={y6+=>kuT-faQ zXbZ3_xL`2PDd2W3(~7rzT94rMLV6a4PVbkSEZQweLO9VcveRZvWY;~6#+TB2FLwP- zyg!Mr!{hS+7YKeg4hO$WPlL53INtfvou8npk*C1}+qg_Grqbe>@Lzzic;QBR@O11U z^p@<=N^3TTezaxwM0zdRw`wyxltkVN245%~O%@;OjWM`9W^x;-)f43|Ur zz8w~@$ybrSl!V-T|INL~h>9573k}D;NxHM!yk!vm6&(eujqJ#AU>gH*!*1*ZEW^vp zY><8!bOH-{!XIu#+R|2erPJCj^8631)h}N1RtCk_FmLaQ_A*)swsal4tnzgrTmqb^s z@HE?H)$hQ-B33P~Ron`Ss)-k6h^l29Rl5vT^Q<--ZILycj*Mq-uKui3_Gz(HD9^6q zCg6~T=mS|Xvmgrn_noD=}uoTREE!)-4Zb{wjEM=m2AC_3p#t4ZWRa^MCXffZ8 z>v4<8jm!t2N%AT4fSyT7bEx%CV(1gcr!Phhc8T+Wgm+ij>pOsq_gC5Lw~7ExPOlaLtC-J} z`oH1n>2La}4%i6Kt8v(D6VF4|802fj$=DRoN4jo(fz>ZC(#F4t$09gbB*Y|N*EjjY zUq|O2);GB|Cix_3pz@OQ_$t=$NVAm9gz}AKyiH_LJn^kDxhF*B7Q+136NUgp?x9h+6PUY& z$&s>8kQM~Mviq^L-^Jt(8Obagr%7!j&=5mlON0P(mm!S;Xz1Ziy1bdqN1Qos=!wR= zuX#ty`DyqQG>~tHA9IxOUXY5u<3&1#r`H9-JRsmLd$9R|>eG70X}o1hP4s_a?P=5d zA?!WI^GgOz9teZh@g3n;k?t{w;HP*qIKJ$Vi9O+02fj7(WqfVn#&_&DXW**?S%|yg zj>61Y({G-hGslr%d3R;iqDn{PdqWO>v?kSYV^xWJvLkKrsKoNAk~d7rVW*VkQLUq*sKhM_imsQ*DL1?kZf`Bmmba|dfzK{E#FuxjuBt3w0#@V)q-wtt z4_;H^{4SBB7;<)uT8y00yc=!8?@L|fC@x}!RR=#71mTydjyu>oqH*RRqf-!?>Q?db z79O8eZn`mu8Olhwa_HEbP{{w(eT{*>437C;gsH8AYlmST4thVv6w~;k5SkyKtik7H zM0+c}v9XFEz9DpuuMF{%L+0m&peHv^&z>;{%4d8oi<)LC*BwGhSm6j>c9pl1n&XIk zj>my77nK#eO~o_lNj#I#=ux#}9MRN9O~t9s8}Wq``1|44O}_TjgHx2?{ZnD^vH180 z1>fz8r(|)mG&3zVJ>6tfe&5I;KC0vJR;Q-29c3K~jXu%)Q6?yIbg4$(g{0>wuYwAf zqz-gAvX)GC&sORChR#Z?tQMvhWd zt)4t~tfZG(i9XUNs@B6;$v@uokBec`XPBcNA3>)N0SKSpyy3bozo~W}e140NL;mw{ zUwqS3l?I7$TD1WU!n+*;Y?}q}2fwLZt{WJQ_b-B*=i{ zz9E;CVNR=dfdF`{LK`S}I;3g{;8O;SsQ+IVza4B|D^Tb3HKq~akze9 z`Xac?;U>Uk!xg}J;10C*AGVdBDl-pCctIG6~KAm7Q(H7 zTL<@BxF)z3xHsWGggXw`4>z(G!CekF0WKS^0L}xq5N-wBI=J7$HNmyOy$Sar+;O;m z5cWlIm%~kf%Z4j}3*rgzos>h)jW8#$(A8;P0gWH? zznK3krT3Nw?*>X+Xy z-u8XlDBA_J%4fzrir6^uHD`RfZdR#w5F8m+njZ!suqdLV8uteCQ zTE!2sL>P>WgRH~~IPzNzM=saHnU^_Ul3*1a32lfC%*EBOjQ*X{FrHKiF=-R zz6(>0%K2_m5g`_Z5kG0OuTZZD`!Sc%y(v`yy-v3BzrGBMs^Tea=a6fJ)>g9_KD}oU@ph z&>H~P!kP0A&OPYJqggKV(`CVNzQQo)EOc`bW_gUG&ubnI^kyp;WsIzoX-^gW_i%$qg@T!4B*KHPxG~&^fMd7h8(52jo zNaI4a#8rh~vt0HOI;^HfF0)*(fyer?pU@?niHI|UOQZ0fUj!M$nQ2IhggI4VxnzAS zfUUrz9L&qi^B^Kjyddy`=fGPVg|`cMyUtPWFM&rHvs}&__X4jSVY58?-$Y5KX+zQFxrI1(%$?zFUCD^2y&W;O#mG9u@&a zx$wkAJg$M67kT3KS2#0Fc-Vc=Ee4E>W$}6gE*h^Ic*CP2%wR_!ya&+WDTp&K6Ymp5 zm|>=E0-pIzdctPfsi-jHcP+ymF9XJ9@`r9CWMalA-48jLL=b5P=|_n{8PtcA1z5|#zAuS=K~RQ72Ji<3Q(aV}om3Ccby z({V-v7yBcxc*QP!_B&qjLUL%M2rL;h@4w>3ogey2qlqsWWxwDRFYXwj`_O9%}b8udR%}_`B)&I3c#j(ERfH=fKB;Wa7WClvwqYk3+lHX{!XL57JM!KF~F;h zYO*})R(BNKxBMW|UpC~=@?Qrm?)%`g{I}uL=JK*AgOxD+Xnu|X&V%jd#qy%{ob?+R z6+t+w56pvE=Ed~FKJZ+?X`}G$u0fxtz3v-l<`|?b1pID#FMKcH(O34ub%1|9Sg&GwEPq*Mb=1DuTfae(;}${!j78{x+Q zoBf&eeg~LW4IJ-}UIdKKpo=@CA*j!5fE^w=_al4=a2wJS1pXl9B;XBzM;Y+>hOI;v zLGLoad1Z?7Gb3HtQY6wckls%We1M7r?)E-#CE&Cl;aj^%BmPpr85rQ^Le7NO0Op*A z*AT3L{ldu4dlc5^4+i|Oz{i@40T&qQy8w5TV%{d;K}tK|xi?~rvPt?M0M5HxQGR2j ze*u`6Nk4%Nh3g-1EN>{`az*)_fCnj88tFea(tiYa6U^Eg$c_BZHqzfW(n}23X}~oG zJivhcfUBX8Ccpm&uw#xaoAkCB_)^}A@;AU4m{eXP@()tpH_{d>dE>HW=Fx54af4XAUsEgnLZtG9oqYdNFSuQ0CzxsCjEtkQQi%P zd{zKn4Q8_p{9geMUS`&Rkn$|kq0h88q`wPrwFfrKfZqU|HXnyV4frtNHrO{_tlvj~ zd0h@ie!m2~3H|3q^fS_nw=q>w)*AJ_0C2ZMQMMcW{g7}GUbqV!;^SRc;==S%(7PFM zv^?_wr@P$a$_V3OAOWJZWX&6*Isw+M5UVE z1Y{_wa?LNVnpafr5=$1YBJW~FEM>S#ycHEo%mSR#r}ok}f$UkCxlWe}u`n~-OI56g z2&(_-G8b11xsp^|UQ}CKR*cFT3n{e-y16;WfZUdIMK(~C)M?kH@h6=>(8QB|dux{AuHON*4+1vRSYEalXA zE3mm8ovo<2*jz9kvf8wkdkzv9l3YRj#KO{N4r2j zRCguz_|O`PORU|A9pq>}qW3~8+!d&IbgDs_(kORB4Gb8hO3W~ebct0xhN3f9V_&|i zCOXE*9=$!Ocx%hu?&@ePL-k$7YE8Ll_uA5;yWQxYZg(^qIq%)zg|1beO~7QmsJ5Ew zTvMc$Rheuv-q1}~Uy-x1qDwOIV)&M)4WiME+LQL?LXS68v;;FN<>tCm16(fJ_u z;_4;QF~wE2XRAwfRe8C|Kh$GMWpPwnSJjlkIIxP9CJyU}mM^QtT51gWh=R;3f{h_g z6tj|0lmp^Qj^LOS0y@!s~X({CqqQP!OsFOHog^4 zbq(xTjKo|ntXP}lP(*t3VIYg$N(Bb0s^VzojB<>#31?WRUexhs?W5K4Tn#{FpSQ$S z7U_DjeO=X6wPm8&i>j;3m$;C-xm?AIi)b2)%FFJF(x>#)Yb3`@iWZ5ZBvnuq R7Y=&#;klPKPL!b5{~uu!5+VQq diff --git a/WiiUseJ_0.11/src/img/wiimote.png b/WiiUseJ_0.11/src/img/wiimote.png deleted file mode 100644 index 3f26f5202b22a89c5fa3e1c1eb524f78e4e76e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44340 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.11/src/wiiusej/WiiUseApi.java b/WiiUseJ_0.11/src/wiiusej/WiiUseApi.java deleted file mode 100644 index 3f169e6..0000000 --- a/WiiUseJ_0.11/src/wiiusej/WiiUseApi.java +++ /dev/null @@ -1,265 +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; - -import wiiusej.wiiuseapievents.EventsGatherer; - -/** - * Singleton used to manipulate WiiUse Api. - * - * @author guiguito - */ -public class WiiUseApi { - - static { - System.loadLibrary("WiiuseJ"); - } - - private static WiiUseApi instance = new WiiUseApi(); - - /** - * Get the only instance of WiiUseApi. - * - * @return the only instace of WiiUseApi. - */ - static WiiUseApi getInstance() { - return instance; - } - - /** - * Try to connect to 2 wiimotes. Make them rumble to show they are - * connected. - * - * @param nb - * number of wiimotes to connect - * @param rumble - * make the connected wiimotes rumble - * @return 0 if there is an error otherwise it returns the number of - * wiimotes connected. - */ - native int doConnections(int nb, boolean rumble); - - /** - * Close connection to the wiimote with the given id. - * - */ - native void closeConnection(int id); - - /** - * Shutdown Wiiuse API. - */ - native void shutdownApi(); - - /** - * Activate rumble on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void activateRumble(int id); - - /** - * Deactivate rumble on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void deactivateRumble(int id); - - /** - * Activate IR Tracking on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void activateIRTracking(int id); - - /** - * Deactivate IR Tracking on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void deactivateIRTracking(int id); - - /** - * Activate motion sensing on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void activateMotionSensing(int id); - - /** - * Deactivate motion sensing on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void deactivateMotionSensing(int id); - - /** - * Set wiimote leds status. - * - * @param id - * the id of the wiimote concerned - * @param led1 - * status of led1: True=ON, False=OFF - * @param led2 - * status of led2: True=ON, False=OFF - * @param led3 - * status of led3: True=ON, False=OFF - * @param led4 - * status of led4: True=ON, False=OFF - */ - native void setLeds(int id, boolean led1, boolean led2, boolean led3, - boolean led4); - - /** - * Set how many degrees an angle must change to generate an event. - * - * @param id - * id of the wiimote concerned - * @param angle - * minimum angle detected by an event - */ - native void setOrientThreshold(int id, float angle); - - /** - * Set how much acceleration must change to generate an event. - * - * @param id - * id of the wiimote concerned - * @param value - * minimum value detected by an event - */ - native void setAccelThreshold(int id, int value); - - /** - * Set alpha smoothing parameter for the given id. - * - * @param id - * id of the wiimote concerned - * @param value - * alpha smoothing value - */ - native void setAlphaSmoothing(int id, float value); - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote concerned - */ - native void reSync(int id); - - /** - * Make the the accelerometers give smoother results. This is set by - * default. - * - * @param id - * the id of the wiimote concerned - */ - native void activateSmoothing(int id); - - /** - * Make the the accelerometers give raw results. - * - * @param id - * the id of the wiimote concerned - */ - native void deactivateSmoothing(int id); - - /** - * Make the wiimote generate an event each time we poll. Not set by default. - * - * @param id - * the id of the wiimote concerned - */ - native void activateContinuous(int id); - - /** - * Make the wiimote generate an event only when there is one. - * - * @param id - * the id of the wiimote concerned - */ - native void deactivateContinuous(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 4/3. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setScreenRatio43(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 16/9. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setScreenRatio169(int id); - - /** - * Notify wiiuse that the sensor bar is above your screen. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setSensorBarAboveScreen(int id); - - /** - * Notify wiiuse that the sensor bar is below your screen. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setSensorBarBelowScreen(int id); - - /** - * Set virtual screen resolution. It is used to automatically compute the - * position of a cursor on this virtual screen using the sensor bar. These - * results come in the IREvent. - * - * @param id - * the id of the wiimote of which we want the status. - * @param x - * x resolution. - * @param y - * y resolution. - */ - native void setVirtualScreenResolution(int id, int x, int y); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void getStatus(int id); - - /** - * Check for new Events and Get it. - * - * @param gath - * the object where we store all the new events. - */ - native void specialPoll(EventsGatherer gath); - -} diff --git a/WiiUseJ_0.11/src/wiiusej/WiiUseApiManager.java b/WiiUseJ_0.11/src/wiiusej/WiiUseApiManager.java deleted file mode 100644 index 2d258d5..0000000 --- a/WiiUseJ_0.11/src/wiiusej/WiiUseApiManager.java +++ /dev/null @@ -1,571 +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; - -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiuseapievents.EventsGatherer; -import wiiusej.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiuseapievents.WiiUseApiListener; -import wiiusej.wiiuseapirequest.FloatValueRequest; -import wiiusej.wiiuseapirequest.IntValueRequest; -import wiiusej.wiiuseapirequest.LedsRequest; -import wiiusej.wiiuseapirequest.TwoIntValueRequest; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * Class that manages the use of Wiiuse API. - * - * @author guiguito - */ -public class WiiUseApiManager extends Thread { - - private static WiiUseApiManager instance = new WiiUseApiManager(); - - private final EventListenerList listeners = new EventListenerList(); - - private Wiimote[] wiimotes; - - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - - private int connected = -1; - - private int nbMaxWiimotes = -1; - - private AtomicBoolean running = new AtomicBoolean(false); - - private ConcurrentLinkedQueue requests = new ConcurrentLinkedQueue(); - - public static WiiUseApiManager getInstance() { - return instance; - } - - /** - * Get wiimotes. Load library if necessary. Connect to wiimotes if - * necessary. Start polling if necessary. Return an array with the connected - * wiimotes. - * - * @param nb - * try to connect nb wiimotes - * @param rumble - * make the connected wiimotes rumble - * @return an array with connected wiimotes or NULL. - */ - public synchronized static Wiimote[] getWiimotes(int nb, boolean rumble) { - WiiUseApiManager manager = getInstance(); - if (manager.connected < 0) { - int nbWiimotes = manager.connectWiimotes(nb, rumble); - manager.wiimotes = new Wiimote[nbWiimotes]; - for (int i = 1; i <= nbWiimotes; i++) { - Wiimote wim = new Wiimote(i, manager); - manager.wiimotes[i - 1] = wim; - manager.addWiiUseApiListener(wim); - } - } - - if (manager.connected == 0) { - return new Wiimote[0]; - } - - if (!manager.isAlive()) - manager.start(); - - return manager.wiimotes; - } - - /** - * Connect wiimote and get the number of wiimotes connected. Supposed to be - * used once. - * - * @param nb - * try to connect nb wiimotes - * @param rumble - * make the connected wiimotes rumble - * @return 0 if nothing connected or the number of wiimotes connected. - */ - private int connectWiimotes(int nb, boolean rumble) { - nbMaxWiimotes = nb; - if (connected < 0) { - connected = wiiuse.doConnections(nb, rumble); - return connected; - } else {// library not loaded, no wiimotes connected - return 0; - } - } - - /** - * Ask the thread to close a connection. - * - * @param id - * id of the wiimote to disconnect. - */ - public void closeConnection(int id) { - removeWiiUseApiListener(wiimotes[id - 1]); - wiimotes[id - 1] = null; - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST)); - // System.out.println("Wiimote " + id + " disconnected !"); - } - - /** - * Get the number of wiimotes connected. - * - * @return the number of wiimotes connected. - */ - public int getNbConnectedWiimotes() { - return connected; - } - - /** - * Stop thread and shutdown wiiuse Api. - */ - public void shutdown() { - if (connected > 0) { - for (Wiimote wim : wiimotes) { - if (wim != null) - wim.disconnect(); - } - } - running.set(false); - wiiuse.shutdownApi(); - } - - /** - * Activate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Deactivate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Activate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Deactivate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Activate motion sensing for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Deactivate motion sensing for the wiimoter with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Activate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Deactivate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Activate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Deactivate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote - */ - public void deactivateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Set leds for the wiimotes with the given id. - * - * @param id - * id of the wiimote - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(int id, boolean l1, boolean l2, boolean l3, boolean l4) { - requests.add(new LedsRequest(id, WiiUseApiRequest.WIIUSE_LEDS_REQUEST, - l1, l2, l3, l4)); - } - - /** - * Set the orientation threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(int id, float th) { - requests.add(new FloatValueRequest(id, - WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST, th)); - } - - /** - * Set the acceleration threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold - */ - public void setAccelerationThreshold(int id, int th) { - requests.add(new IntValueRequest(id, - WiiUseApiRequest.WIIUSE_ACCEL_THRESHOLHD_REQUEST, th)); - } - - /** - * Set alpha smoothing for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold - */ - public void setAlphaSmoothing(int id, float th) { - requests.add(new FloatValueRequest(id, - WiiUseApiRequest.WIIUSE_ALPHA_SMOOTHING_REQUEST, th)); - } - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote - */ - public void reSync(int id) { - requests.add(new WiiUseApiRequest(id, WiiUseApiRequest.WIIUSE_RESYNC)); - } - - /** - * Set screen aspect ratio to 4/3 for the given id. - * - * @param id - * id of the wiimote - */ - public void setScreenAspectRatio43(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ASPECT_RATIO_4_3)); - } - - /** - * Set screen aspect ratio to 16/9 for the given id. - * - * @param id - * id of the wiimote - */ - public void setScreenAspectRatio169(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ASPECT_RATIO_16_9)); - } - - /** - * Set the sensor bar to be above the screen. - * - * @param id - * id of the wiimote - */ - public void setSensorBarAboveScreen(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_SENSOR_BAR_ABOVE)); - } - - /** - * Set the sensor bar to be below the screen. - * - * @param id - * id of the wiimote - */ - public void setSensorBarBelowScreen(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_SENSOR_BAR_BELOW)); - } - - /** - * Set virtual resolution. It is used to automatically compute the position - * of a cursor on this virtual screen using the sensor bar. These results - * come in the IREvent. - * - * @param id - * id of the wiimote - * @param x - * x resolution - * @param y - * y resolution - */ - public void setVirtualResolution(int id, int x, int y) { - requests.add(new TwoIntValueRequest(id, - WiiUseApiRequest.WIIUSE_SET_VIRTUAL_RESOLUTION, x, y)); - } - - /** - * Get Status for the wiimote for the given id. - * - * @param id - * id of the wiimote - */ - public void getStatus(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_STATUS_REQUEST)); - } - - @Override - public void run() { - - if (connected > 0) { - running.set(true); - - EventsGatherer gather = new EventsGatherer(nbMaxWiimotes); - - // Start polling and tell the observers when there Wiimote events - while (running.get() && connected > 0) { - - /* Polling */ - wiiuse.specialPoll(gather); - - /* deal with events gathered in Wiiuse API */ - for (WiiUseApiEvent evt : gather.getEvents()) { - if (evt.getWiimoteId() != -1) {// event filled - // there is an event notify observers - notifyWiiUseApiListener(evt); - if (evt.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT) { - // check if it was a disconnection - // in this case disconnect the wiimote - closeConnection(evt.getWiimoteId()); - } - } else { - System.out - .println("There is an event with id == -1 ??? there is a problem !!! : " - + evt); - } - } - gather.clearEvents(); - - /* deal with request done to wiiuse API */ - WiiUseApiRequest req = requests.poll(); - if (req != null) {// there is a request for the wiiuse api - int id = req.getId(); - if (req.getRequestType() == WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST) { - /* Close connections requests */ - wiiuse.closeConnection(id); - - connected--; - if (connected == 0) {// stop this thread if there is - // no more wiimotes connected. - // System.out.println("No more wiimotes connected - // !!!"); - shutdown(); - } - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_STATUS_REQUEST) { - /* Status requests */ - wiiuse.getStatus(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST) { - /* Activate Rumble requests */ - wiiuse.activateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST) { - /* Deactivate Rumble requests */ - wiiuse.deactivateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST) { - /* Activate IR Tracking requests */ - wiiuse.activateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST) { - /* Deactivate IR Tracking requests */ - wiiuse.deactivateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST) { - /* Activate Motion sensing requests */ - wiiuse.activateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST) { - /* Deactivate Motion sensing requests */ - wiiuse.deactivateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_LEDS_REQUEST) { - /* leds requests */ - LedsRequest reqLed = (LedsRequest) req; - wiiuse.setLeds(id, reqLed.isLed1(), reqLed.isLed2(), - reqLed.isLed3(), reqLed.isLed4()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST) { - /* Activate smoothing requests */ - wiiuse.activateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST) { - /* Deactivate smoothing requests */ - wiiuse.deactivateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST) { - /* Activate continuous requests */ - wiiuse.activateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST) { - /* Deactivate continuous requests */ - wiiuse.deactivateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST) { - /* set orientation threshold request */ - wiiuse.setOrientThreshold(req.getId(), - ((FloatValueRequest) req).getFloatValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACCEL_THRESHOLHD_REQUEST) { - /* set acceleration threshold request */ - wiiuse.setAccelThreshold(req.getId(), - ((IntValueRequest) req).getIntValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ALPHA_SMOOTHING_REQUEST) { - /* set alpha smoothing request */ - wiiuse.setAlphaSmoothing(req.getId(), - ((FloatValueRequest) req).getFloatValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_RESYNC) { - /* set resync request */ - wiiuse.reSync(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ASPECT_RATIO_4_3) { - /* set screen aspect ratio to 4/3 */ - wiiuse.setScreenRatio43(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ASPECT_RATIO_16_9) { - /* set screen aspect ratio to 16/9 */ - wiiuse.setScreenRatio169(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SENSOR_BAR_ABOVE) { - /* set sensor bar above the screen */ - wiiuse.setSensorBarAboveScreen(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SENSOR_BAR_BELOW) { - /* set sensor bar above the screen */ - wiiuse.setSensorBarBelowScreen(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SET_VIRTUAL_RESOLUTION) { - /* set virtual resolution */ - wiiuse.setVirtualScreenResolution(req.getId(), - ((TwoIntValueRequest) req).getIntValue(), - ((TwoIntValueRequest) req).getSecondIntValue()); - } else { - System.out.println("Bad request to Wiiuse API !!!!!"); - } - } - } - } else { - if (connected <= 0) { - System.out.println("No wiimotes connected !"); - } - } - - } - - /** - * Add WiiUseApiListener to the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void addWiiUseApiListener(WiiUseApiListener listener) { - listeners.add(WiiUseApiListener.class, listener); - } - - /** - * Remove WiiUseApiListener from the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void removeWiiUseApiListener(WiiUseApiListener listener) { - listeners.remove(WiiUseApiListener.class, listener); - } - - /** - * Get the list of WiiUseApiListeners. - * - * @return the list of WiiUseApiListeners. - */ - public WiiUseApiListener[] getWiiUseApiListeners() { - return listeners.getListeners(WiiUseApiListener.class); - } - - /** - * Notify WiiUseApiListeners that an event occured. - * - * @param evt - * WiimoteEvent occured - */ - private void notifyWiiUseApiListener(WiiUseApiEvent evt) { - for (WiiUseApiListener listener : getWiiUseApiListeners()) { - listener.onWiiUseApiEvent(evt); - } - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/Wiimote.java b/WiiUseJ_0.11/src/wiiusej/Wiimote.java deleted file mode 100644 index f04e66c..0000000 --- a/WiiUseJ_0.11/src/wiiusej/Wiimote.java +++ /dev/null @@ -1,323 +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; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.GenericEvent; -import wiiusej.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiuseapievents.WiiUseApiListener; -import wiiusej.wiiuseapievents.WiimoteListener; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * Class that represents a wiimote. - * You can register as an observer of this wiimote to listen events from it. - * You manage it. - * @author guiguito - */ -public class Wiimote implements WiiUseApiListener { - - private int id = -1;//wiimote id - - private EventListenerList listeners = new EventListenerList(); - - private WiiUseApiManager manager; - - - /** - * Constructor. - * @param idd id of the wiimote - * @param manager manager wo built it. - */ - public Wiimote(int idd, WiiUseApiManager manager){ - id = idd; - this.manager = manager; - } - - /** - * Disconnect this wiimote. - */ - public void disconnect(){ - deactivateIRTRacking(); - deactivateMotionSensing(); - deactivateRumble(); - manager.closeConnection(id); - } - - /** - * Activate the rumble. - */ - public void activateRumble() { - manager.activateRumble(id); - } - - /** - * Deactivate the rumble. - */ - public void deactivateRumble() { - manager.deactivateRumble(id); - } - - /** - * Activate IR Tracking. - */ - public void activateIRTRacking() { - manager.activateIRTRacking(id); - } - - /** - * Deactivate IR Tracking. - */ - public void deactivateIRTRacking() { - manager.deactivateIRTRacking(id); - } - - /** - * Activate motion sensing. - */ - public void activateMotionSensing() { - manager.activateMotionSensing(id); - } - - /** - * Deactivate motion sensing. - */ - public void deactivateMotionSensing() { - manager.deactivateMotionSensing(id); - } - - /** - * Activate smoothing. - */ - public void activateSmoothing() { - manager.activateSmoothing(id); - } - - /** - * Deactivate smoothing. - */ - public void deactivateSmoothing() { - manager.deactivateSmoothing(id); - } - - /** - * Activate continuous. - */ - public void activateContinuous() { - manager.activateContinuous(id); - } - - /** - * Deactivate continuous. - */ - public void deactivateContinuous() { - manager.deactivateContinuous(id); - - } - - /** - * Set leds status. - * - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(boolean l1, boolean l2, boolean l3, boolean l4) { - manager.setLeds(id, l1, l2, l3, l4); - } - - /** - * Set the orientation threshold (minimum angle between two degrees with accelerometer). - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(float th) { - manager.setOrientationThreshold(id,th); - } - - /** - * Set the acceleration threshold . - * @param th - * threshold - */ - public void setAccelerationThreshold(int th) { - manager.setAccelerationThreshold(id,th); - } - - /** - * Set the alpha smoothing value. - * @param th - * threshold - */ - public void setAlphaSmoothingValue(float th) { - manager.setAlphaSmoothing(id,th); - } - - /** - * Set the screen aspect ratio to be considered as 4/3. - */ - public void setScreenAspectRatio43() { - manager.setScreenAspectRatio43(id); - } - - /** - * Set the screen aspect ratio to be considered as 16/9. - */ - public void setScreenAspectRatio169() { - manager.setScreenAspectRatio169(id); - } - - /** - * Set the sensor bar to be considered above the screen. - */ - public void setSensorBarAboveScreen() { - manager.setSensorBarAboveScreen(id); - } - - /** - * Set the sensor bar to be considered below the screen. - */ - public void setSensorBarBelowScreen() { - manager.setSensorBarBelowScreen(id); - } - - /** - * Set the screen resolution of the you are pointing at - * with your wiimote. - * - * @param x x resolution. - * @param y y resolution. - */ - public void setVirtualResolution(int x, int y) { - manager.setVirtualResolution(id, x ,y); - } - - /** - * Try to resync the wiimote by starting a new handshake. - */ - public void reSync() { - manager.reSync(id); - } - - /** - * Ask for the status of the wiimote. - * The result will be received in a status event object. - * Implements onStatusEvent on wiimote listener to get it. - */ - public void getStatus() { - manager.getStatus(id); - } - - /** - * Method called when a WiiUseApiEvent occurs. - * @param e the WiiUseApiEvent. - */ - public void onWiiUseApiEvent(WiiUseApiEvent e) { - if (e.getWiimoteId() == id){ - if (e.getEventType() == WiiUseApiEvent.GENERIC_EVENT){ - notifyWiiMoteEventListeners((GenericEvent)e); - }else if (e.getEventType() == WiiUseApiEvent.STATUS_EVENT - ||e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_REMOVED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_REMOVED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_REMOVED){ - notifyStatusEventListeners((StatusEvent)e); - }else if (e.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT){ - notifyDisconnectionEventListeners((DisconnectionEvent)e); - } - } - } - - /** - * Add a WiimoteListener to the listeners list. - * @param listener a WiimoteListener - */ - public void addWiiMoteEventListeners(WiimoteListener listener) { - listeners.add(WiimoteListener.class, listener); - } - - /** - * Remove a WiimoteListener from the listeners list. - * @param listener a WiimoteListener - */ - public void removeWiiMoteEventListeners(WiimoteListener listener) { - listeners.remove(WiimoteListener.class, listener); - } - - /** - * Get the list of WiimoteListener. - * @return the list of WiimoteListener. - */ - public WiimoteListener[] getWiiMoteEventListeners() { - return listeners.getListeners(WiimoteListener.class); - } - - /** - * Notify WiimoteListeners that an event occured. - * Notify in first the listeners for Buttons Events. - * In second the listeners for IR Events. - * In third the listeners for Motion sensing events. - * @param evt WiimoteEvent occured - */ - private void notifyWiiMoteEventListeners(GenericEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onButtonsEvent(evt.getButtonsEvent()); - if (evt.isThereIrEvent()){ - listener.onIrEvent(evt.getIREvent()); - } - if (evt.isThereMotionSensingEvent()){ - listener.onMotionSensingEvent(evt.getMotionSensingEvent()); - } - } - } - - /** - * Notify WiimoteListener that a status event occured. - * @param evt status event occured - */ - private void notifyStatusEventListeners(StatusEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onStatusEvent(evt); - } - } - - /** - * Notify WiimoteListener that a status event occured. - * @param evt status event occured - */ - private void notifyDisconnectionEventListeners(DisconnectionEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onDisconnectionEvent(evt); - } - } - - @Override - public String toString() { - return "Wiimote with ID : "+id; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/test/CloseGuiTestCleanly.java b/WiiUseJ_0.11/src/wiiusej/test/CloseGuiTestCleanly.java deleted file mode 100644 index ae136bf..0000000 --- a/WiiUseJ_0.11/src/wiiusej/test/CloseGuiTestCleanly.java +++ /dev/null @@ -1,65 +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; -import wiiusej.Wiimote; - -/** - * This class is used to close wiiusej cleanly. - * @author guiguito - */ -public class CloseGuiTestCleanly implements WindowListener{ - - Wiimote wiimote; - - - public CloseGuiTestCleanly(Wiimote wim) { - wiimote = wim; - } - - public void windowOpened(WindowEvent e) { - //nothing - } - - public void windowClosing(WindowEvent e) { - WiiUseApiManager.getInstance().shutdown(); - } - - 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/WiiUseJ_0.11/src/wiiusej/test/Main.java b/WiiUseJ_0.11/src/wiiusej/test/Main.java deleted file mode 100644 index daaca2a..0000000 --- a/WiiUseJ_0.11/src/wiiusej/test/Main.java +++ /dev/null @@ -1,40 +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); - if (wiimotes.length>0){ - WiiuseJGuiTest gui = new WiiuseJGuiTest(wiimotes[0]); - gui.setDefaultCloseOperation(gui.EXIT_ON_CLOSE); - gui.setVisible(true); - } - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/test/Tests.java b/WiiUseJ_0.11/src/wiiusej/test/Tests.java deleted file mode 100644 index 1a82547..0000000 --- a/WiiUseJ_0.11/src/wiiusej/test/Tests.java +++ /dev/null @@ -1,354 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.GenericEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This class used to test WiiuseJ. - * - * @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(); - } - } - - private static int nb = 0; - - public void onButtonsEvent(ButtonsEvent 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(); - } - - } 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 onStatusEvent(StatusEvent e) { - // Display status variables - System.out.println(e); - } - - public void onDisconnectionEvent(DisconnectionEvent e) { - System.out.println(" wiimote " + e.getWiimoteId() - + "has been disconnected !!"); - } - - /** - * @param args - */ - public static void main(String[] args) { - Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(4, true); - if (wiimotes.length > 0) { - System.out.println(wiimotes[0]); - Tests tests = 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/WiiUseJ_0.11/src/wiiusej/test/WiiuseJGuiTest.java b/WiiUseJ_0.11/src/wiiusej/test/WiiuseJGuiTest.java deleted file mode 100644 index 8bac8ae..0000000 --- a/WiiUseJ_0.11/src/wiiusej/test/WiiuseJGuiTest.java +++ /dev/null @@ -1,836 +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.util.logging.Level; -import java.util.logging.Logger; -import wiiusej.utils.IRPanel; -import wiiusej.Wiimote; -import wiiusej.utils.AccelerationPanel; -import wiiusej.utils.GForcePanel; -import wiiusej.utils.ButtonsEventPanel; -import wiiusej.utils.OrientationPanel; -import wiiusej.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * 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; - - /** Creates new form WiiuseJGuiTest */ - public WiiuseJGuiTest(Wiimote wiimote) { - initComponents(); - this.wiimote = wiimote; - wiimote.addWiiMoteEventListeners((IRPanel) irViewPanel); - wiimote.addWiiMoteEventListeners((ButtonsEventPanel) buttonsPanel); - wiimote.addWiiMoteEventListeners((OrientationPanel) motionSensingPanel); - wiimote.addWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote.addWiiMoteEventListeners((AccelerationPanel) accelerationPanel); - wiimote.addWiiMoteEventListeners(this); - wiimote.deactivateContinuous(); - wiimote.deactivateSmoothing(); - wiimote.setScreenAspectRatio169(); - wiimote.setSensorBarBelowScreen(); - getStatusButtonMousePressed(null); - this.addWindowListener(new CloseGuiTestCleanly(wiimote)); - } - - public void onButtonsEvent(ButtonsEvent 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 onStatusEvent(StatusEvent arg0) { - messageText.setText("Status received !"); - batteryLevelText.setText(arg0.getBatteryLevel() + " %"); - led1Button.setEnabled(arg0.isLed1Set()); - led2Button.setEnabled(arg0.isLed2Set()); - led3Button.setEnabled(arg0.isLed3Set()); - led4Button.setEnabled(arg0.isLed4Set()); - //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 !"); - } - - /** 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(); - motionSensingPanel = new OrientationPanel(); - gForcePanel = new wiiusej.utils.GForcePanel(); - accelerationPanel = new AccelerationPanel(); - rightPanel = new javax.swing.JPanel(); - fixedWiimotePanel = new javax.swing.JPanel(); - buttonsPanel = new ButtonsEventPanel(); - controlsPanel = new javax.swing.JPanel(); - activateRumblePanel = new javax.swing.JPanel(); - toggleRumbleButton = new javax.swing.JButton(); - deactivateRumblePanel = new javax.swing.JPanel(); - toggleIRTrackingButton = new javax.swing.JButton(); - activateIRtrackingPanel = new javax.swing.JPanel(); - toggleMotionSensingTrackingButton = new javax.swing.JButton(); - deactivateIRTrackingPanel = new javax.swing.JPanel(); - toggleSmoothingButton = new javax.swing.JButton(); - activateMotionSensingTrackingPanel = new javax.swing.JPanel(); - toggleContinuousButton = new javax.swing.JButton(); - deactivateMotionSensingTrackingPanel = 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(); - activateSmoothingPanel = new javax.swing.JPanel(); - alphaSmoothingTextField = new javax.swing.JTextField(); - alphaSmoothingButton = new javax.swing.JButton(); - deactivateSmoothingPanel = new javax.swing.JPanel(); - orientationThresholdTextField = new javax.swing.JTextField(); - orientationThresholdButton = new javax.swing.JButton(); - activateContinuousPanel = new javax.swing.JPanel(); - accelerationThresholdTextField = new javax.swing.JTextField(); - accelerationThresholdButton = new javax.swing.JButton(); - deactivateContinuousPanel = new javax.swing.JPanel(); - getStatusButton = new javax.swing.JButton(); - batteryText = new javax.swing.JLabel(); - batteryLevelText = new javax.swing.JLabel(); - ledsPanel = new javax.swing.JPanel(); - toggleSensorBarPositionButton = new javax.swing.JButton(); - alphaSmoothingPanel = new javax.swing.JPanel(); - toggleScreenAspectRatioButton = new javax.swing.JButton(); - orientationThresholdPanel = 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(); - accelerationThresholdPanel = new javax.swing.JPanel(); - mouseIRControlButton = new javax.swing.JButton(); - batteryPanel = new javax.swing.JPanel(); - expansionText = new javax.swing.JLabel(); - messagesPanel = new javax.swing.JPanel(); - 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))); - - 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) - ); - - 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 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("Raw Acceleration", accelerationPanel); - - 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); - } - }); - activateRumblePanel.add(toggleRumbleButton); - - controlsPanel.add(activateRumblePanel); - - toggleIRTrackingButton.setText("Activate IR Tracking"); - toggleIRTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleIRTrackingButtonMousePressed(evt); - } - }); - deactivateRumblePanel.add(toggleIRTrackingButton); - - controlsPanel.add(deactivateRumblePanel); - - toggleMotionSensingTrackingButton.setText("Activate motion sensing Tracking"); - toggleMotionSensingTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleMotionSensingTrackingButtonMousePressed(evt); - } - }); - activateIRtrackingPanel.add(toggleMotionSensingTrackingButton); - - controlsPanel.add(activateIRtrackingPanel); - - toggleSmoothingButton.setText("Activate Smoothing"); - toggleSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSmoothingButtonMousePressed(evt); - } - }); - deactivateIRTrackingPanel.add(toggleSmoothingButton); - - controlsPanel.add(deactivateIRTrackingPanel); - - toggleContinuousButton.setText("Activate Continuous"); - toggleContinuousButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleContinuousButtonMousePressed(evt); - } - }); - activateMotionSensingTrackingPanel.add(toggleContinuousButton); - - controlsPanel.add(activateMotionSensingTrackingPanel); - - led1Button.setText("Led1"); - led1Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led1ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led1Button); - - led2Button.setText("Led2"); - led2Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led2ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led2Button); - - led3Button.setText("Led3"); - led3Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led3ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led3Button); - - led4Button.setText("Led4"); - led4Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led4ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led4Button); - - setLedsButton.setText("Set leds"); - setLedsButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setLedsButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(setLedsButton); - - controlsPanel.add(deactivateMotionSensingTrackingPanel); - - alphaSmoothingTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - alphaSmoothingTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - activateSmoothingPanel.add(alphaSmoothingTextField); - - alphaSmoothingButton.setText("Set alpha smoothing"); - alphaSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - alphaSmoothingButtonMousePressed(evt); - } - }); - activateSmoothingPanel.add(alphaSmoothingButton); - - controlsPanel.add(activateSmoothingPanel); - - orientationThresholdTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - orientationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - deactivateSmoothingPanel.add(orientationThresholdTextField); - - orientationThresholdButton.setText("Set orientation threshold"); - orientationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - orientationThresholdButtonMousePressed(evt); - } - }); - deactivateSmoothingPanel.add(orientationThresholdButton); - - controlsPanel.add(deactivateSmoothingPanel); - - accelerationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - activateContinuousPanel.add(accelerationThresholdTextField); - - accelerationThresholdButton.setText("Set acceleration threshold"); - accelerationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - accelerationThresholdButtonMousePressed(evt); - } - }); - activateContinuousPanel.add(accelerationThresholdButton); - - controlsPanel.add(activateContinuousPanel); - - getStatusButton.setText("Get status"); - getStatusButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - getStatusButtonMousePressed(evt); - } - }); - deactivateContinuousPanel.add(getStatusButton); - - batteryText.setFont(new java.awt.Font("Tahoma", 0, 14)); - batteryText.setText("Battery level :"); - deactivateContinuousPanel.add(batteryText); - - batteryLevelText.setFont(new java.awt.Font("Arial", 0, 14)); - batteryLevelText.setText(" %"); - deactivateContinuousPanel.add(batteryLevelText); - - controlsPanel.add(deactivateContinuousPanel); - - toggleSensorBarPositionButton.setText("Set sensor bar above"); - toggleSensorBarPositionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSensorBarPositionButtonMousePressed(evt); - } - }); - ledsPanel.add(toggleSensorBarPositionButton); - - controlsPanel.add(ledsPanel); - - 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); - } - }); - alphaSmoothingPanel.add(toggleScreenAspectRatioButton); - - controlsPanel.add(alphaSmoothingPanel); - - xLabel.setText("X"); - orientationThresholdPanel.add(xLabel); - - xResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - xResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - orientationThresholdPanel.add(xResolutionTextField); - - yLabel.setText("Y"); - orientationThresholdPanel.add(yLabel); - - yResolutionTextField.setFocusTraversalPolicyProvider(true); - yResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - yResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - orientationThresholdPanel.add(yResolutionTextField); - - setVirtualResolutionButton.setText("Set virtual resolution"); - setVirtualResolutionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setVirtualResolutionButtonMousePressed(evt); - } - }); - orientationThresholdPanel.add(setVirtualResolutionButton); - - controlsPanel.add(orientationThresholdPanel); - - mouseIRControlButton.setText("Start infrared mouse control"); - mouseIRControlButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - mouseIRControlButtonMousePressed(evt); - } - }); - accelerationThresholdPanel.add(mouseIRControlButton); - - controlsPanel.add(accelerationThresholdPanel); - - expansionText.setText("No expansion connected"); - batteryPanel.add(expansionText); - - controlsPanel.add(batteryPanel); - - 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; - }//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 - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel accelerationPanel; - private javax.swing.JButton accelerationThresholdButton; - private javax.swing.JPanel accelerationThresholdPanel; - private javax.swing.JTextField accelerationThresholdTextField; - private javax.swing.JPanel activateContinuousPanel; - private javax.swing.JPanel activateIRtrackingPanel; - private javax.swing.JPanel activateMotionSensingTrackingPanel; - private javax.swing.JPanel activateRumblePanel; - private javax.swing.JPanel activateSmoothingPanel; - private javax.swing.JButton alphaSmoothingButton; - private javax.swing.JPanel alphaSmoothingPanel; - private javax.swing.JTextField alphaSmoothingTextField; - private javax.swing.JLabel batteryLevelText; - private javax.swing.JPanel batteryPanel; - private javax.swing.JLabel batteryText; - private javax.swing.JPanel buttonsPanel; - private javax.swing.JPanel controlsPanel; - private javax.swing.JPanel deactivateContinuousPanel; - private javax.swing.JPanel deactivateIRTrackingPanel; - private javax.swing.JPanel deactivateMotionSensingTrackingPanel; - private javax.swing.JPanel deactivateRumblePanel; - private javax.swing.JPanel deactivateSmoothingPanel; - private javax.swing.JLabel expansionText; - private javax.swing.JPanel fixedWiimotePanel; - private javax.swing.JPanel gForcePanel; - private javax.swing.JButton getStatusButton; - 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 ledsPanel; - 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.JButton orientationThresholdButton; - private javax.swing.JPanel orientationThresholdPanel; - private javax.swing.JTextField orientationThresholdTextField; - private javax.swing.JPanel rightPanel; - private javax.swing.JButton setLedsButton; - private javax.swing.JButton setVirtualResolutionButton; - 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/WiiUseJ_0.11/src/wiiusej/utils/AccelerationPanel.java b/WiiUseJ_0.11/src/wiiusej/utils/AccelerationPanel.java deleted file mode 100644 index 0403255..0000000 --- a/WiiUseJ_0.11/src/wiiusej/utils/AccelerationPanel.java +++ /dev/null @@ -1,182 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch raw acceleration values from a MotionSensingEvent. - * @author guiguito - */ -public 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(); - } - - @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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getRawAcceleration()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.11/src/wiiusej/utils/ButtonsEventPanel.java b/WiiUseJ_0.11/src/wiiusej/utils/ButtonsEventPanel.java deleted file mode 100644 index 2a4a48f..0000000 --- a/WiiUseJ_0.11/src/wiiusej/utils/ButtonsEventPanel.java +++ /dev/null @@ -1,297 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to see what buttons are pressed. - * 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 ButtonsEvent buttons; - private Color pressedColor = Color.RED; - private Color heldColor = Color.ORANGE; - private Color releasedColor = Color.YELLOW; - private Shape shape; - - /** - * 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); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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"); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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(ButtonsEvent 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 onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - 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/WiiUseJ_0.11/src/wiiusej/utils/GForcePanel.java b/WiiUseJ_0.11/src/wiiusej/utils/GForcePanel.java deleted file mode 100644 index 9802688..0000000 --- a/WiiUseJ_0.11/src/wiiusej/utils/GForcePanel.java +++ /dev/null @@ -1,201 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch gravity force values from a MotionSensingEvent. - * @author guiguito - */ -public 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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getGforce()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.11/src/wiiusej/utils/IRPanel.java b/WiiUseJ_0.11/src/wiiusej/utils/IRPanel.java deleted file mode 100644 index 3352e66..0000000 --- a/WiiUseJ_0.11/src/wiiusej/utils/IRPanel.java +++ /dev/null @@ -1,193 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * 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 (xCoordinates[i] != -1 && yCoordinates[i] != -1 && 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(ButtonsEvent 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 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(); - } - - /** 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/WiiUseJ_0.11/src/wiiusej/utils/OrientationPanel.java b/WiiUseJ_0.11/src/wiiusej/utils/OrientationPanel.java deleted file mode 100644 index b50a2ce..0000000 --- a/WiiUseJ_0.11/src/wiiusej/utils/OrientationPanel.java +++ /dev/null @@ -1,205 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch orientation values from a MotionSensingEvent. - * @author guiguito - */ -public 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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getOrientation()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.11/src/wiiusej/values/GForce.java b/WiiUseJ_0.11/src/wiiusej/values/GForce.java deleted file mode 100644 index 9732121..0000000 --- a/WiiUseJ_0.11/src/wiiusej/values/GForce.java +++ /dev/null @@ -1,75 +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.values; - -/** - * Represents gravity force on each axis. - * @author guiguito - */ -public class GForce { - - private float x; - private float y; - private float z; - - /** - * Default constructor; - */ - public GForce(){ - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with gravity force on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public GForce(float xx, float yy, float zz){ - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public float getX() { - return x; - } - - /** - * @return the y - */ - public float getY() { - return y; - } - - /** - * @return the z - */ - public float getZ() { - return z; - } - - @Override - public String toString() { - return "Gravity force : ("+x+", "+y+","+z+")"; - } -} diff --git a/WiiUseJ_0.11/src/wiiusej/values/IRSource.java b/WiiUseJ_0.11/src/wiiusej/values/IRSource.java deleted file mode 100644 index 7caef55..0000000 --- a/WiiUseJ_0.11/src/wiiusej/values/IRSource.java +++ /dev/null @@ -1,109 +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.values; - -/** - * Class used for IR sources. - * @author guiguito - */ -public class IRSource{ - - private int x; - private int y; - private short rx; - private short ry; - private short size; - - /** - * Build an IR source with all details. - * - * @param xx - * xx interpolated coordinates. - * @param yy - * yy interpolated coordinates. - * @param rxx - * raw X coordinate (0-1023). - * @param ryy - * raw Y coordinate (0-1023). - * @param si - * size of the IR dot (0-15). - */ - public IRSource(int xx, int yy, short rxx, short ryy, short si) { - x = xx; - y = yy; - rx = rxx; - ry = ryy; - size = si; - } - - - /** - * Return x interpolated coordinates. - * @return the x - */ - public int getX() { - return x; - } - - - - /** - * Return y interpolated coordinates. - * @return the y - */ - public int getY() { - return y; - } - - - - /** - * Return raw X coordinate (0-1023). - * @return the rx - */ - public short getRx() { - return rx; - } - - - - /** - * Return raw Y coordinate (0-1023). - * @return the ry - */ - public short getRy() { - return ry; - } - - - - /** - * Return size of the IR dot (0-15). - * @return the size - */ - public short getSize() { - return size; - } - - - - @Override - public String toString() { - return "Interpolated coordinates ("+x+","+y+"), Raw coordinates("+rx+","+ry+"), source size : "+size+")"; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/values/Orientation.java b/WiiUseJ_0.11/src/wiiusej/values/Orientation.java deleted file mode 100644 index 4c4f741..0000000 --- a/WiiUseJ_0.11/src/wiiusej/values/Orientation.java +++ /dev/null @@ -1,76 +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.values; - -/** - * Class that represents the orientation of the wiimote. - * @author guiguito - */ -public class Orientation { - - private float roll; - private float pitch; - private float yaw; - - /** - * Default constructor. - */ - public Orientation(){ - roll = 0; - pitch = 0; - yaw = 0; - } - - /** - * Contructor with raw, pitch , yaw. - * @param r raw - * @param p pitch - * @param y yaw - */ - public Orientation(float r, float p, float y){ - roll = r; - pitch = p; - yaw = y; - } - - /** - * @return the roll - */ - public float getRoll() { - return roll; - } - - /** - * @return the pitch - */ - public float getPitch() { - return pitch; - } - - /** - * @return the yaw - */ - public float getYaw() { - return yaw; - } - - @Override - public String toString() { - return "Orientation : (roll: "+roll+", pitch: "+pitch+", yaw: "+yaw+")"; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/values/RawAcceleration.java b/WiiUseJ_0.11/src/wiiusej/values/RawAcceleration.java deleted file mode 100644 index 903a51c..0000000 --- a/WiiUseJ_0.11/src/wiiusej/values/RawAcceleration.java +++ /dev/null @@ -1,75 +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.values; - -/** - * Represents raw acceleration on each axis. - * @author guiguito - */ -public class RawAcceleration { - - private short x; - private short y; - private short z; - - /** - * Default constructor; - */ - public RawAcceleration() { - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with raw acceleration on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public RawAcceleration(short xx, short yy, short zz) { - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public short getX() { - return x; - } - /** - * @return the y - */ - public short getY() { - return y; - } - - /** - * @return the z - */ - public short getZ() { - return z; - } - - @Override - public String toString() { - return "Raw acceleration : ("+x+", "+y+","+z+")"; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/ButtonsEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/ButtonsEvent.java deleted file mode 100644 index ce78551..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/ButtonsEvent.java +++ /dev/null @@ -1,335 +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.wiiuseapievents; - -/** - * Class which represents a buttons event. - * @author guiguito - */ -public class ButtonsEvent extends WiimoteEvent{ - - /* Buttons MACRO */ - private static short WIIMOTE_BUTTON_TWO = 0x0001; - private static short WIIMOTE_BUTTON_ONE = 0x0002; - private static short WIIMOTE_BUTTON_B = 0x0004; - private static short WIIMOTE_BUTTON_A = 0x0008; - private static short WIIMOTE_BUTTON_MINUS = 0x0010; - private static short WIIMOTE_BUTTON_ZACCEL_BIT6 = 0x0020; - private static short WIIMOTE_BUTTON_ZACCEL_BIT7 = 0x0040; - private static short WIIMOTE_BUTTON_HOME = 0x0080; - private static short WIIMOTE_BUTTON_LEFT = 0x0100; - private static short WIIMOTE_BUTTON_RIGHT = 0x0200; - private static short WIIMOTE_BUTTON_DOWN = 0x0400; - private static short WIIMOTE_BUTTON_UP = 0x0800; - private static short WIIMOTE_BUTTON_PLUS = 0x1000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT4 = 0x2000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT5 = 0x4000; - private static int WIIMOTE_BUTTON_UNKNOWN = 0x8000; - private static short WIIMOTE_BUTTON_ALL = 0x1F9F; - - /* Buttons */ - private short buttonsJustPressed = 0; - private short buttonsJustReleased = 0; - private short buttonsHeld = 0; - - /** - * Constructor of the button Event. - * @param id id of the wiimote concerned. - * @param buttonsJustPressed buttons just pressed. - * @param buttonsJustReleased buttons just released. - * @param buttonsHeld buttons just held. - */ - public ButtonsEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld){ - super(id); - setAllButtons(buttonsJustPressed, buttonsJustReleased, buttonsHeld); - } - - /** - * Set all buttons in one method. - * - * @param buttonsJustPressed - * @param buttonsJustReleased - * @param buttonsHeld - */ - private void setAllButtons(short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - this.buttonsJustPressed = buttonsJustPressed; - this.buttonsJustReleased = buttonsJustReleased; - this.buttonsHeld = buttonsHeld; - } - - /** - * Get the short storing the buttons just pressed - * - * @return the short storing the buttons just pressed - */ - public short getButtonsJustPressed() { - return buttonsJustPressed; - } - - /** - * Get the short storing the buttons just released - * - * @return the short storing the buttons just released - */ - public short getButtonsJustReleased() { - return buttonsJustReleased; - } - - /** - * get the short storing the buttons held - * - * @return the short storing the buttons held - */ - public short getButtonsHeld() { - return buttonsHeld; - } - - /** **************** BUTTONS Methods ***************** */ - /* generic button functions */ - - private boolean buttonTest(short buttonBitsDefinition, short buttons) { - return (buttons & buttonBitsDefinition) == buttonBitsDefinition; - } - - private boolean isButtonJustPressed(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustPressed) - && !isButtonHeld(buttonBitsDefinition); - } - - private boolean isButtonJustReleased(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustReleased); - } - - private boolean isButtonHeld(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsHeld); - } - - private boolean isButtonPressed(short buttonBitsDefinition) { - return isButtonHeld(buttonBitsDefinition)||isButtonJustPressed(buttonBitsDefinition); - } - /* Button ONE */ - - public boolean isButtonOneJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneHeld() { - return isButtonHeld(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOnePressed() { - return isButtonPressed(WIIMOTE_BUTTON_ONE); - } - - /* Button TWO */ - - public boolean isButtonTwoJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoHeld() { - return isButtonHeld(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoPressed() { - return isButtonPressed(WIIMOTE_BUTTON_TWO); - } - - /* Button A */ - - public boolean isButtonAJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAHeld() { - return isButtonHeld(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAPressed() { - return isButtonPressed(WIIMOTE_BUTTON_A); - } - - /* Button B */ - - public boolean isButtonBJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBHeld() { - return isButtonHeld(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBPressed() { - return isButtonPressed(WIIMOTE_BUTTON_B); - } - - /* Button LEFT */ - - public boolean isButtonLeftJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftHeld() { - return isButtonHeld(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftPressed() { - return isButtonPressed(WIIMOTE_BUTTON_LEFT); - } - - /* Button RIGHT */ - - public boolean isButtonRightJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightHeld() { - return isButtonHeld(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightPressed() { - return isButtonPressed(WIIMOTE_BUTTON_RIGHT); - } - - /* Button UP */ - - public boolean isButtonUpJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpHeld() { - return isButtonHeld(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpPressed() { - return isButtonPressed(WIIMOTE_BUTTON_UP); - } - - /* Button DOWN */ - - public boolean isButtonDownJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownHeld() { - return isButtonHeld(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownPressed() { - return isButtonPressed(WIIMOTE_BUTTON_DOWN); - } - - /* Button - */ - - public boolean isButtonMinusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_MINUS); - } - - /* Button + */ - - public boolean isButtonPlusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_PLUS); - } - - /* Button HOME */ - - public boolean isButtonHomeJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeHeld() { - return isButtonHeld(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomePressed() { - return isButtonPressed(WIIMOTE_BUTTON_HOME); - } - - @Override - public String toString() { - String out = ""; - /* Display buttons */ - out += "/******** Buttons ********/\n"; - out += "--- Buttons just pressed : " + buttonsJustPressed + "\n"; - out += "--- Buttons just released : " + buttonsJustReleased + "\n"; - out += "--- Buttons held : " + buttonsHeld + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/DisconnectionEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/DisconnectionEvent.java deleted file mode 100644 index 341b626..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/DisconnectionEvent.java +++ /dev/null @@ -1,44 +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.wiiuseapievents; - -/** - * Class representing a disconnection event. - * @author guiguito - */ -public class DisconnectionEvent extends WiiUseApiEvent { - - /** - * Construct the DisconnectionEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public DisconnectionEvent(int id) { - super(id,WiiUseApiEvent.DISCONNECTION_EVENT); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** DISCONNECTION EVENT : WIIMOTE ID :" + super.getWiimoteId() + " ********/\n"; - - return out; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/EventsGatherer.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/EventsGatherer.java deleted file mode 100644 index 5c83d78..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/EventsGatherer.java +++ /dev/null @@ -1,241 +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.wiiuseapievents; - -/** - * This class is used to gather events during a call to the Wiiuse API. - * - * @author guiguito - */ -public class EventsGatherer { - - private WiiUseApiEvent[] events; - private int index = 0; - private GenericEvent genericEvent = null; - - /** - * Create EventsGatherer. - * - * @param nbWiimotes - * nb wiimotes (nb a of events possible in a call to Wiiuse API) - */ - public EventsGatherer(int nbWiimotes) { - events = new WiiUseApiEvent[nbWiimotes]; - } - - /** - * Add an event to the array. - * - * @param e - * the event to add. - */ - private void addEvent(WiiUseApiEvent e) { - events[index] = e; - index++; - } - - /** - * Prepare a wiimote event to add. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public void prepareWiiMoteEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - genericEvent = new GenericEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public void prepareIRevent(int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - genericEvent.prepareIRevent(x, y, z, ax, ay, xVRes, yVRes, xOffset, - yOffset, sensorBarPostion, screenAsPectRatio); - - } - - /** - * Add an IR point to the WiiMoteEvent prepared - * - * @param x - * x coordinates - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRPointToPreparedWiiMoteEvent(int x, int y, short rx, - short ry, short size) { - if (genericEvent != null) { - genericEvent.addIRpoint(x, y, rx, ry, size); - } - } - - /** - * Set orientation and gravity force of the prepared event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public void addMotionSensingValues(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - if (genericEvent != null) { - genericEvent.setMotionSensingEvent(orientationThreshold, - accelerationThreshold, smoothingState, alphaSmooth, r, p, - ya, x, y, z, xx, yy, zz); - } - } - - /** - * Add the prepared WiimoteEvent to the gatherer. - */ - public void addWiimoteEvent() { - if (genericEvent != null) { - addEvent(genericEvent); - genericEvent = null; - } - } - - /** - * Add a StatusEvent to the gatherer. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public void addStatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - StatusEvent evt = new StatusEvent(id, connect, batt, led, speak, - attach, rumbleState, continuousState, irState, - motionSensingState); - addEvent(evt); - } - - /** - * Add a DisconnectionEvent to the gatherer. - * - * @param id - * id of the wiimote - */ - public void addDisconnectionEvent(int id) { - DisconnectionEvent evt = new DisconnectionEvent(id); - addEvent(evt); - } - - /** - * Return an array containing the events. - * - * @return events received - */ - public WiiUseApiEvent[] getEvents() { - return java.util.Arrays.copyOfRange(events, 0, index); - } - - /** - * Clear the gatherer and remove objects. - */ - public void clearEvents() { - for (int i = 0; i < events.length; i++) { - events[i] = null; - } - genericEvent = null; - index = 0; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/GenericEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/GenericEvent.java deleted file mode 100644 index e8ea39b..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/GenericEvent.java +++ /dev/null @@ -1,227 +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.wiiuseapievents; - -/** - * Class that is a bean to be filled by the wiiuse API. - * - * @author guiguito - */ -public class GenericEvent extends WiiUseApiEvent { - - ButtonsEvent buttonsEvent = null; - IREvent infraredEvent = null; - MotionSensingEvent motionSensingEvent = null; - - /** - * Construct the Wiimote setting up the id. - * - * @param id - * the Wiimote id - */ - public GenericEvent(int id) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - } - - /** - * Construct the Wiimote setting up the id and the buttons. - * - * @param id - * the Wiimote id - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public GenericEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - buttonsEvent = new ButtonsEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Tell if there is an IR Event. - * - * @return TRUE if there is an IR event. - */ - public boolean isThereIrEvent() { - return infraredEvent != null; - } - - /** - * Tell if there is a motion sensing Event. - * - * @return TRUE if there is a motion sensing event. - */ - public boolean isThereMotionSensingEvent() { - return motionSensingEvent != null; - } - - /** - * Get buttons event. - * - * @return the buttons event. - */ - public ButtonsEvent getButtonsEvent() { - return buttonsEvent; - } - - /** - * Get IR event. - * - * @return the IR event if there is one or null. - */ - public IREvent getIREvent() { - return infraredEvent; - } - - /** - * Get motion sensing event. - * - * @return the motion sensing event if there is one or null. - */ - public MotionSensingEvent getMotionSensingEvent() { - return motionSensingEvent; - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public void prepareIRevent(int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - if (infraredEvent == null) { - infraredEvent = new IREvent(getWiimoteId(), x, y, z, ax, ay, xVRes, - yVRes, xOffset, yOffset, sensorBarPostion, - screenAsPectRatio); - } - } - - /** - * Add an IR point to the generic event. Create an IR Event if it's not - * created yet. - * - * @param x - * x coordinates. - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - if (infraredEvent != null) - infraredEvent.addIRpoint(x, y, rx, ry, size); - } - - /** - * Set the Motion Sensing Event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public void setMotionSensingEvent(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - motionSensingEvent = new MotionSensingEvent(getWiimoteId(), - orientationThreshold, accelerationThreshold, smoothingState, - alphaSmooth, r, p, ya, x, y, z, xx, yy, zz); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** GENERIC EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - - out += buttonsEvent; - - if (infraredEvent != null) { - out += infraredEvent; - } else { - out += "/******** IR Tracking ********/\n"; - out += "--- Active : false\n"; - } - - if (motionSensingEvent != null) { - out += motionSensingEvent; - } else { - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : false \n"; - } - - return out; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/IREvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/IREvent.java deleted file mode 100644 index 6007e97..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/IREvent.java +++ /dev/null @@ -1,285 +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.wiiuseapievents; - -import wiiusej.values.IRSource; - -/** - * Class which represents an IR event. - * - * @author guiguito - */ -public class IREvent extends WiimoteEvent { - - /* IR Tracking */ - private IRSource[] IRPoints; - private short indexPoints = 0; - private int x; - private int y; - private int z;// distance from the sensor bar - private int ax; - private int ay; - private int xVRes; - private int yVRes; - private int xOffset; - private int yOffset; - private short sensorBarPostion; - private short screenAsPectRatio; - - static private short WIIUSE_IR_ABOVE = 0; - static private short WIIUSE_IR_BELOW = 1; - static private short WIIUSE_SCREEN_RATIO_4_3 = 0; - static private short WIIUSE_SCREEN_RATIO_16_9 = 1; - - private static short NB_POINTS = 4;// number of points IR can track - - /** - * Constructor of IREvent with full infos. - * - * @param id - * d of the wiimote concerned. - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public IREvent(int id, int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - super(id); - this.x = x; - this.y = y; - this.z = z; - this.ax = ax; - this.ay = ay; - this.xVRes = xVRes; - this.yVRes = yVRes; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.sensorBarPostion = sensorBarPostion; - this.screenAsPectRatio = screenAsPectRatio; - IRPoints = new IRSource[NB_POINTS]; - } - - /** - * Get list of IR points. - * - * @return the list of 2D points - */ - public IRSource[] getIRPoints() { - return java.util.Arrays.copyOfRange(IRPoints, 0, indexPoints); - } - - /** - * Add IR Point in the list (Max 4 points) - * - * @param x - * x value - * @param y - * y value - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - IRPoints[indexPoints] = new IRSource(x, y, rx, ry, size); - indexPoints++; - return; - } - - /** - * Return calculated X coordinate. - * - * @return the x - */ - public int getX() { - return x; - } - - /** - * Return calculated Y coordinate. - * - * @return the y - */ - public int getY() { - return y; - } - - /** - * Return calculated distance. - * - * @return the z - */ - public int getZ() { - return z; - } - - /** - * Return absolute X coordinate. - * - * @return the ax - */ - public int getAx() { - return ax; - } - - /** - * Return absolute Y coordinate. - * - * @return the ay - */ - public int getAy() { - return ay; - } - - /** - * Return IR virtual screen x resolution. - * - * @return the xVRes - */ - public int getXVRes() { - return xVRes; - } - - /** - * Return IR virtual screen y resolution. - * - * @return the yVRes - */ - public int getYVRes() { - return yVRes; - } - - /** - * Return IR X correction offset. - * - * @return the xOffset - */ - public int getXOffset() { - return xOffset; - } - - /** - * Return IR Y correction offset. - * - * @return the yOffset - */ - public int getYOffset() { - return yOffset; - } - - /** - * Return true if the sensor bar is above. - * - * @return true if the sensor bar is above. - */ - public boolean isSensorBarAbove() { - return sensorBarPostion == WIIUSE_IR_ABOVE; - } - - /** - * Return true if the sensor bar is below. - * - * @return true if the sensor bar is below. - */ - public boolean isSensorBarBelow() { - return sensorBarPostion == WIIUSE_IR_BELOW; - } - - /** - * Return true if screen aspect ratio set is 4/3. - * - * @return true if screen aspect ratio set is 4/3. - */ - public boolean isScreenAspectRatio43() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_4_3; - } - - /** - * Return true if screen aspect ratio set is 16/9. - * - * @return true if screen aspect ratio set is 16/9. - */ - public boolean isScreenAspectRatio169() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_16_9; - } - - /** - * Return aspect ratio of the screen. - * - * @return the screenAsPectRatio - */ - public short getScreenAsPectRatio() { - return screenAsPectRatio; - } - - @Override - public String toString() { - String out = ""; - /* Display IR Tracking */ - out += "/******** IR Tracking ********/\n"; - out += "--- Active : true\n"; - out += "--- calculated X coordinate : " + x + "\n"; - out += "--- calculated Y coordinate : " + y + "\n"; - out += "--- calculated distance : " + z + "\n"; - out += "--- absolute X coordinate : " + ax + "\n"; - out += "--- absolute Y coordinate : " + ay + "\n"; - out += "--- IR virtual screen x resolution : " + xVRes + "\n"; - out += "--- IR virtual screen y resolution : " + yVRes + "\n"; - out += "--- IR X correction offset : " + xOffset + "\n"; - out += "--- IR Y correction offset : " + yOffset + "\n"; - if (isScreenAspectRatio43()) { - out += "--- aspect ratio of the screen : 4/3\n"; - } else if (isScreenAspectRatio169()) { - out += "--- aspect ratio of the screen : 16/9\n"; - } - if (isSensorBarAbove()) { - out += "--- IR sensor bar position. : Above\n"; - } else if (isSensorBarBelow()) { - out += "--- IR sensor bar position. : Below\n"; - } - out += "--- Seen points\n"; - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] != null) { - out += IRPoints[i].toString(); - } - } - out += "\n"; - return out; - } -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/MotionSensingEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/MotionSensingEvent.java deleted file mode 100644 index 6ec7712..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/MotionSensingEvent.java +++ /dev/null @@ -1,194 +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.wiiuseapievents; - -import wiiusej.values.GForce; -import wiiusej.values.Orientation; -import wiiusej.values.RawAcceleration; - -/** - * Class which represents a motion sensing event. - * - * @author guiguito - */ -public class MotionSensingEvent extends WiimoteEvent { - - /* Motion Sensing */ - private Orientation orientation; - private GForce gforce; - private RawAcceleration acceleration; - - private float orientationThreshold = 0; - private int accelerationThreshold = 0; - private float alphaSmoothing = 0; - private boolean isSmoothingActive = false; - - /** - * Constructor for a Motion Sensing Event. - * - * @param id - * id of the wiimote concerned. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public MotionSensingEvent(int id, float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - super(id); - this.orientationThreshold = orientationThreshold; - this.accelerationThreshold = accelerationThreshold; - this.isSmoothingActive = smoothingState; - this.alphaSmoothing = alphaSmooth; - setOrientationAndGforce(r, p, ya, x, y, z, xx, yy, zz); - } - - /** - * Set orientation, gravity force and raw acceleration. - * - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - private void setOrientationAndGforce(float r, float p, float ya, float x, - float y, float z, short xx, short yy, short zz) { - this.orientation = new Orientation(r, p, ya); - this.gforce = new GForce(x, y, z); - this.acceleration = new RawAcceleration(xx, yy, zz); - } - - /** - * @return the orientation - */ - public Orientation getOrientation() { - return orientation; - } - - /** - * Get the gravity force. - * - * @return the gforce - */ - public GForce getGforce() { - return gforce; - } - - /** - * Get the raw acceleration. - * - * @return the raw acceleration - */ - public RawAcceleration getRawAcceleration() { - return acceleration; - } - - /** - * Get orientation threshold. - * - * @return the orientationThreshold - */ - public float getOrientationThreshold() { - return orientationThreshold; - } - - /** - * Get acceleration threshold. - * - * @return the accelerationThreshold - */ - public int getAccelerationThreshold() { - return accelerationThreshold; - } - - /** - * Get alpha smoothing. - * - * @return the alphaSmoothing - */ - public float getAlphaSmoothing() { - return alphaSmoothing; - } - - /** - * Tell if the option SMOOTHING is activated. - * - * @return the isSmoothingActive - */ - public boolean isSmoothingActive() { - return isSmoothingActive; - } - - @Override - public String toString() { - String out = ""; - /* Motion sensing */ - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : true \n"; - out += "--- Orientation threshold value ? : " + orientationThreshold - + "\n"; - out += "--- Acceleration threshold value ? : " + accelerationThreshold - + "\n"; - out += "--- Alpha smoothing threshold value ? : " + alphaSmoothing - + "\n"; - out += "--- Smoothing ? : " + isSmoothingActive + "\n"; - out += "--- " + orientation + "\n"; - out += "--- " + gforce + "\n"; - out += "--- " + acceleration + "\n"; - return out; - } -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/StatusEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/StatusEvent.java deleted file mode 100644 index 7a365fc..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/StatusEvent.java +++ /dev/null @@ -1,258 +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.wiiuseapievents; - -/** - * Class used to represent a status event. This class is used to know what are - * the settings of the wiimote. - * - * @author guiguito - */ -public class StatusEvent extends WiiUseApiEvent { - - private static short WIIMOTE_LED_1 = 1; - private static short WIIMOTE_LED_2 = 2; - private static short WIIMOTE_LED_3 = 4; - private static short WIIMOTE_LED_4 = 8; - - /* ATTACHMENT CONSTANTS */ - - private static short EXP_NONE = 0; - private static short EXP_NUNCHUK = 1; - private static short EXP_CLASSIC = 2; - private static short EXP_GUITAR_HERO_3 = 3; - - /* Status variables */ - private boolean connected = false; - - private float batteryLevel = -1; - - private short leds = 0; - - private boolean isSpeakerEnabled = false; - - private int attachment = 0; - - private boolean isRumbleActive = false; - - private boolean isContinuousActive = false; - - private boolean isIrActive = false; - - private boolean isMotionSensingActive = false; - - /** - * Construct the StatusEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public StatusEvent(int id) { - super(id, WiiUseApiEvent.STATUS_EVENT); - } - - /** - * Build a StatusEvent with all fields set. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public StatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - super(id, WiiUseApiEvent.STATUS_EVENT); - connected = connect; - this.batteryLevel = batt; - this.leds = led; - this.isSpeakerEnabled = speak; - this.attachment = attach; - isRumbleActive = rumbleState; - isContinuousActive = continuousState; - isIrActive = irState; - isMotionSensingActive = motionSensingState; - } - - /** - * True if the wiimote is connected false otherwise. - * - * @return return the connected status. - */ - public boolean isConnected() { - return connected; - } - - /** - * Get battery level. - * - * @return battery level. 1 = 100% - */ - public float getBatteryLevel() { - return batteryLevel; - } - - /** - * Get status of the leds . - * - * @return a short representing LEDS turned on. - */ - public short getLeds() { - return leds; - } - - /** - * Get led1 status. - * - * @return true if the led is set. - */ - public boolean isLed1Set() { - if ((leds & WIIMOTE_LED_1) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led2 status. - * - * @return true if the led is set. - */ - public boolean isLed2Set() { - if ((leds & WIIMOTE_LED_2) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led3 status. - * - * @return true if the led is set. - */ - public boolean isLed3Set() { - if ((leds & WIIMOTE_LED_3) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led4 status. - * - * @return true if the led is set. - */ - public boolean isLed4Set() { - if ((leds & WIIMOTE_LED_4) > 0) { - return true; - } else { - return false; - } - } - - /** - * Tell if the speaker is enable for this wiimote - * - * @return TRUE if it enabled false otherwise - */ - public boolean isSpeakerEnabled() { - return isSpeakerEnabled; - } - - /** - * Get the int representing the attachment type. - * - * @return value of the Attachment Type - */ - public int getAttachment() { - return attachment; - } - - /** - * Get the status of rumble. - * - * @return true if the rumble is active false otherwise - */ - public boolean isRumbleActive() { - return isRumbleActive; - } - - /** - * Tell if the CONTINUOUS option is activated. - * - * @return the isContinuousActive - */ - public boolean isContinuousActive() { - return isContinuousActive; - } - - /** - * Tell if the IR Tracking is active. - * - * @return TRUE if it is active or false otherwise. - */ - public boolean isIrActive() { - return isIrActive; - } - - /** - * Get the flag indicating if the motion sensing is active. - * - * @return true if the motion sensing is active false otherwise - */ - public boolean isMotionSensingActive() { - return isMotionSensingActive; - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** STATUS EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - out += "--- connected : " + connected + "\n"; - out += "--- Battery level : " + batteryLevel + "\n"; - out += "--- Leds : " + leds + "\n"; - out += "--- Speaker enabled : " + isSpeakerEnabled + "\n"; - out += "--- Attachment ? : " + attachment + "\n"; - out += "--- Rumble ? : " + isRumbleActive + "\n"; - out += "--- Continuous ? : " + isContinuousActive + "\n"; - out += "--- IR active ? : " + isIrActive + "\n"; - out += "--- Motion sensing active ? : " + isMotionSensingActive + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java deleted file mode 100644 index 880c632..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java +++ /dev/null @@ -1,62 +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.wiiuseapievents; - -/** - * This class describes the structure of an event from the WiiUse API event. - * - * @author guiguito - */ -public abstract class WiiUseApiEvent extends WiimoteEvent{ - - public static int GENERIC_EVENT = 1; - public static int STATUS_EVENT = 2; - public static int DISCONNECTION_EVENT = 3; - public static int WIIUSE_NUNCHUK_INSERTED = 4; - public static int WIIUSE_NUNCHUK_REMOVED = 5; - public static int WIIUSE_CLASSIC_CTRL_INSERTED = 6; - public static int WIIUSE_CLASSIC_CTRL_REMOVED = 7; - public static int WIIUSE_GUITAR_HERO_3_CTRL_INSERTED = 8; - public static int WIIUSE_GUITAR_HERO_3_CTRL_REMOVED = 9; - - /* Event Type */ - private int eventType; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - * @param type - * type of the event - */ - public WiiUseApiEvent(int id, int type) { - super(id); - eventType = type; - } - - /** - * Get the event type. - * @return the eventType - */ - public int getEventType() { - return eventType; - } - - public abstract String toString(); - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiListener.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiListener.java deleted file mode 100644 index 3f6bb22..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiiUseApiListener.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.wiiuseapievents; - - - -/** - * This is the interface to implement to listen to events from the wiiuse API. - * - * @author guiguito - */ -public interface WiiUseApiListener extends java.util.EventListener { - - /** - * Method called when a WiiUseApiEvent occurs. - * A WiiUseApiEvent can be : - * - GenericEvent (Storing ButtonsEvent and - * eventually IREvent and MotionSensingEvent) - * - StatusEvent - * - DisconnectionEvent - * @param e - */ - void onWiiUseApiEvent(WiiUseApiEvent e); - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteEvent.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteEvent.java deleted file mode 100644 index 1504a37..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteEvent.java +++ /dev/null @@ -1,59 +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.wiiuseapievents; - -/** - * Abstract mother class representing an event with a wiimote id. - * - * @author guiguito - */ -public abstract class WiimoteEvent { - - /* ID */ - private int wiimoteId = -1; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public WiimoteEvent(int id) { - wiimoteId = id; - } - - /** - * Get Wiimote ID - * - * @return the wiimote id. - */ - public int getWiimoteId() { - return wiimoteId; - } - - /** - * Set Wiimote ID - * - * @param wiimoteId - * id of the wiimote - */ - void setWiimoteId(int wiimoteId) { - this.wiimoteId = wiimoteId; - } - - public abstract String toString(); -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteListener.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteListener.java deleted file mode 100644 index 3ea3c05..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapievents/WiimoteListener.java +++ /dev/null @@ -1,69 +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.wiiuseapievents; - -/** - * This is the interface to implement to listen to events from wiimotes. - * The differents methods are called in this order : - * onButtonsEvent, onIrEvent, onMotionSensingEvent, onStatusEvent, onDisconnectionEvent. - * - * @author guiguito - */ -public interface WiimoteListener extends java.util.EventListener { - - /** - * Method called on a button Event. - * @param e the buttonEvent with the last informations - * about the buttons of the wiimote. - */ - void onButtonsEvent(ButtonsEvent e); - - /** - * Method called when an IR event occurs. - * @param e the IREvent with the IR points seen. - */ - void onIrEvent(IREvent e); - - /** - * Method called when a motion sensing event occurs. - * @param e the motion sensing event with orientation and acceleration. - */ - void onMotionSensingEvent(MotionSensingEvent e); - - /** - * Method called on a status event. - * A status event occurs when : - * - we ask it - * - an expansion controller has been plugged - * - an expansion controller has been unplugged - * This is where you can get the different values of - * the parameters setup on your wiimote. - * @param e the status event. - */ - void onStatusEvent(StatusEvent e); - - /** - * This is the method called when a disconnection event occurs. - * A disconnection event happens when : - * - there are no battery left - * - the wiimote has just been turned off - * - the connection is dropped - * @param e the disconnection event. - */ - void onDisconnectionEvent(DisconnectionEvent e); - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/FloatValueRequest.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/FloatValueRequest.java deleted file mode 100644 index a003239..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/FloatValueRequest.java +++ /dev/null @@ -1,71 +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.wiiuseapirequest; - -/** - * Represents a request with a float value to pass to wiiuse API. - * - * @author guiguito - */ -public class FloatValueRequest extends WiiUseApiRequest { - - private float floatValue; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public FloatValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * threshold in degrees - */ - public FloatValueRequest(int id, int type, float th) { - super(id, type); - floatValue = th; - } - - /** - * Get the float value. - * @return the float value - */ - public float getFloatValue() { - return floatValue; - } - - /** - * Set the float value. - * @param val the value to set - */ - public void setFloatValue(float val) { - this.floatValue = val; - } - - - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/IntValueRequest.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/IntValueRequest.java deleted file mode 100644 index 801093d..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/IntValueRequest.java +++ /dev/null @@ -1,74 +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.wiiuseapirequest; - -/** - * Represents a request with an int value to pass to wiiuse API. - * - * @author guiguito - */ -public class IntValueRequest extends WiiUseApiRequest { - - private int intValue; - - /** - * Constructor setting the id of the wiimote - * concerned and the type of the request. - * - * @param id - * the id of the wiimote concerned. - */ - public IntValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote - * concerned, the type of the request - * and the int value. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * the int value. - */ - public IntValueRequest(int id, int type, int th) { - super(id, type); - intValue = th; - } - - /** - * Get the int value. - * @return the int value - */ - public int getIntValue() { - return intValue; - } - - /** - * Set the int value. - * @param val the value to set - */ - public void setIntValue(int val) { - this.intValue = val; - } - - - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/LedsRequest.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/LedsRequest.java deleted file mode 100644 index 1a21024..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/LedsRequest.java +++ /dev/null @@ -1,125 +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.wiiuseapirequest; - -/** - * Represents a request to set leds of the wiimote with WiiUse API. - * - * @author guiguito - */ -public class LedsRequest extends wiiusej.wiiuseapirequest.WiiUseApiRequest { - - private boolean led1, led2, led3, led4; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - */ - public LedsRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - * @param l1 - * led1 status. True=ON, False=OFF - * @param l2 - * led2 status. True=ON, False=OFF - * @param l3 - * led3 status. True=ON, False=OFF - * @param l4 - * led4 status. True=ON, False=OFF - */ - public LedsRequest(int id, int type, boolean l1, boolean l2, boolean l3, - boolean l4) { - super(id, type); - led1 = l1; - led2 = l2; - led3 = l3; - led4 = l4; - } - - /** - * @return the led1 - */ - public boolean isLed1() { - return led1; - } - - /** - * @param led1 - * the led1 to set - */ - public void setLed1(boolean led1) { - this.led1 = led1; - } - - /** - * @return the led2 - */ - public boolean isLed2() { - return led2; - } - - /** - * @param led2 - * the led2 to set - */ - public void setLed2(boolean led2) { - this.led2 = led2; - } - - /** - * @return the led3 - */ - public boolean isLed3() { - return led3; - } - - /** - * @param led3 - * the led3 to set - */ - public void setLed3(boolean led3) { - this.led3 = led3; - } - - /** - * @return the led4 - */ - public boolean isLed4() { - return led4; - } - - /** - * @param led4 - * the led4 to set - */ - public void setLed4(boolean led4) { - this.led4 = led4; - } - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java deleted file mode 100644 index 98e907e..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java +++ /dev/null @@ -1,73 +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.wiiuseapirequest; - - -/** - * Represents a request with two int values to pass to wiiuse API. - * - * @author guiguito - */ -public class TwoIntValueRequest extends IntValueRequest { - - private int secondIntValue; - - /** - * Constructor setting the id of the wiimote - * concerned and the type of the request. - * - * @param id the id of the wiimote concerned. - * @param type type of the request - */ - public TwoIntValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote - * concerned, the type of the request - * and the two int values. - * - * @param id the id of the wiimote concerned. - * @param type type of the request - * @param x first int value. - * @param y second int value. - */ - public TwoIntValueRequest(int id, int type, int x, int y) { - super(id, type, x); - secondIntValue = y; - } - - /** - * Get the second int value. - * @return the secondIntValue - */ - public int getSecondIntValue() { - return secondIntValue; - } - - /** - * Set the second int value. - * @param secondIntValue the secondIntValue to set. - */ - public void setSecondIntValue(int secondIntValue) { - this.secondIntValue = secondIntValue; - } - - - -} diff --git a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java b/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java deleted file mode 100644 index 1f4525b..0000000 --- a/WiiUseJ_0.11/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java +++ /dev/null @@ -1,112 +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.wiiuseapirequest; - -/** - * Represents a request we could do to the WiiUse API. - * - * @author guiguito - */ -public class WiiUseApiRequest { - - public static int WIIUSE_STATUS_REQUEST = 1; - public static int WIIUSE_ACTIVATE_SMOOTHING_REQUEST = 2; - public static int WIIUSE_DEACTIVATE_SMOOTHING_REQUEST = -2; - public static int WIIUSE_ACTIVATE_IR_TRACKING_REQUEST = 3; - public static int WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST = -3; - public static int WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST = 4; - public static int WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST = -4; - public static int WIIUSE_CLOSE_CONNECTION_REQUEST = 5; - public static int WIIUSE_ACTIVATE_CONTINUOUS_REQUEST = 6; - public static int WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST = -6; - public static int WIIUSE_ACTIVATE_RUMBLE_REQUEST = 7; - public static int WIIUSE_DEACTIVATE_RUMBLE_REQUEST = -7; - public static int WIIUSE_LEDS_REQUEST = 8; - public static int WIIUSE_ORIENT_THRESHOLHD_REQUEST = 9; - public static int WIIUSE_ACCEL_THRESHOLHD_REQUEST = 10; - public static int WIIUSE_ALPHA_SMOOTHING_REQUEST = 11; - public static int WIIUSE_RESYNC = 12; - public static int WIIUSE_ASPECT_RATIO_4_3 = 13; - public static int WIIUSE_ASPECT_RATIO_16_9 = 14; - public static int WIIUSE_SENSOR_BAR_ABOVE = 15; - public static int WIIUSE_SENSOR_BAR_BELOW = 16; - public static int WIIUSE_SET_VIRTUAL_RESOLUTION = 17; - - private int wiimoteId = 0; - private int requestType = 0; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public WiiUseApiRequest(int id) { - wiimoteId = id; - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * - */ - public WiiUseApiRequest(int id, int type) { - wiimoteId = id; - requestType = type; - } - - /** - * Get id of the wiimote concerned by this request. - * - * @return id of the wiimote concerned - */ - public int getId() { - return wiimoteId; - } - - /** - * Set id of the wiimote concerned by this request. - * - * @param id - * id fh the wiimote concernet - */ - public void setId(int id) { - wiimoteId = id; - } - - /** - * Get the request type. - * - * @return the requestType - */ - public int getRequestType() { - return requestType; - } - - /** - * Set the request type. - * - * @param requestType - * the requestType to set - */ - public void setRequestType(int requestType) { - this.requestType = requestType; - } - -} diff --git a/WiiUseJ_0.11/wiiuse.dll b/WiiUseJ_0.11/wiiuse.dll deleted file mode 100644 index 6855619edad1c5156421d3af3983f527fe6db9ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 zcmeFaeS8!}wm06B=}9`tBt6Ikf<_52xY2+&8gPjNng|o3k~kq`Lc}EOF6L&lzOdM> zhzU%#6P->oiqER6*O!$?@BO)V-`xA`0=_a~FfWK2z+E#y*x<6-aS)@hNx+!-eNXjF zGO+INbDw+f=l7RRXys_K;9wv97$9LM7qiE!L5yy;ⅆWhv29TXT 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%0DW3JW=zRe^+{#()v8bV)K4_M-8%`rIzQ0g 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 - - - - - diff --git a/WiiUseJ_0.11ThreadReqeuests/.project b/WiiUseJ_0.11ThreadReqeuests/.project deleted file mode 100644 index 9485f4a..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - WiiUseJava - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/WiiUseJ_0.11ThreadReqeuests/README.TXT b/WiiUseJ_0.11ThreadReqeuests/README.TXT deleted file mode 100644 index 268d31d..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/README.TXT +++ /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 . - */ - - -WiiuseJ is a java API to use wiimotes on your computer. This API is built on top of an excellent API call Wiiuse using JNI. - -WiiuseJ intent to be a very simple, easy to use and lightweight java API for wiimotes. - -Some of the great aspects of this API are : - - * The compatibility which is as large as Wiiuse's API compatibility - - * Cross-platform : Windows and linux (like Wiiuse) - - * Easy to use - - -WiiuseJ is made by Guilhem Duché : guiguito1@hotmail.com. -You can contact me if you need more information. - -Go to : http://wiiusej.googlecode.com/ for further documentations. - - - diff --git a/WiiUseJ_0.11ThreadReqeuests/WiiUseJ.dll b/WiiUseJ_0.11ThreadReqeuests/WiiUseJ.dll deleted file mode 100644 index 6999b85fbbbf9b878b4a06dd2f4cee4e6524785c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25448 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.11ThreadReqeuests/libWiiuseJ.so b/WiiUseJ_0.11ThreadReqeuests/libWiiuseJ.so deleted file mode 100644 index 47ab1f2e1c853f69a5c42e2121404627b3bd504a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14645 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 aiX^-E7|fi*NVcm~2Y4^kjI8v)k^Mi6e4j1= diff --git a/WiiUseJ_0.11ThreadReqeuests/libwiiuse.so b/WiiUseJ_0.11ThreadReqeuests/libwiiuse.so deleted file mode 100644 index 2f9247b8348316799484be79d6a74c48c8c7af65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39073 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 R7Y=&#;klPKPL!b5{~uu!5+VQq diff --git a/WiiUseJ_0.11ThreadReqeuests/src/img/wiimote.png b/WiiUseJ_0.11ThreadReqeuests/src/img/wiimote.png deleted file mode 100644 index 3f26f5202b22a89c5fa3e1c1eb524f78e4e76e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44340 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApi.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApi.java deleted file mode 100644 index 3f169e6..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApi.java +++ /dev/null @@ -1,265 +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; - -import wiiusej.wiiuseapievents.EventsGatherer; - -/** - * Singleton used to manipulate WiiUse Api. - * - * @author guiguito - */ -public class WiiUseApi { - - static { - System.loadLibrary("WiiuseJ"); - } - - private static WiiUseApi instance = new WiiUseApi(); - - /** - * Get the only instance of WiiUseApi. - * - * @return the only instace of WiiUseApi. - */ - static WiiUseApi getInstance() { - return instance; - } - - /** - * Try to connect to 2 wiimotes. Make them rumble to show they are - * connected. - * - * @param nb - * number of wiimotes to connect - * @param rumble - * make the connected wiimotes rumble - * @return 0 if there is an error otherwise it returns the number of - * wiimotes connected. - */ - native int doConnections(int nb, boolean rumble); - - /** - * Close connection to the wiimote with the given id. - * - */ - native void closeConnection(int id); - - /** - * Shutdown Wiiuse API. - */ - native void shutdownApi(); - - /** - * Activate rumble on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void activateRumble(int id); - - /** - * Deactivate rumble on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void deactivateRumble(int id); - - /** - * Activate IR Tracking on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void activateIRTracking(int id); - - /** - * Deactivate IR Tracking on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void deactivateIRTracking(int id); - - /** - * Activate motion sensing on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void activateMotionSensing(int id); - - /** - * Deactivate motion sensing on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - native void deactivateMotionSensing(int id); - - /** - * Set wiimote leds status. - * - * @param id - * the id of the wiimote concerned - * @param led1 - * status of led1: True=ON, False=OFF - * @param led2 - * status of led2: True=ON, False=OFF - * @param led3 - * status of led3: True=ON, False=OFF - * @param led4 - * status of led4: True=ON, False=OFF - */ - native void setLeds(int id, boolean led1, boolean led2, boolean led3, - boolean led4); - - /** - * Set how many degrees an angle must change to generate an event. - * - * @param id - * id of the wiimote concerned - * @param angle - * minimum angle detected by an event - */ - native void setOrientThreshold(int id, float angle); - - /** - * Set how much acceleration must change to generate an event. - * - * @param id - * id of the wiimote concerned - * @param value - * minimum value detected by an event - */ - native void setAccelThreshold(int id, int value); - - /** - * Set alpha smoothing parameter for the given id. - * - * @param id - * id of the wiimote concerned - * @param value - * alpha smoothing value - */ - native void setAlphaSmoothing(int id, float value); - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote concerned - */ - native void reSync(int id); - - /** - * Make the the accelerometers give smoother results. This is set by - * default. - * - * @param id - * the id of the wiimote concerned - */ - native void activateSmoothing(int id); - - /** - * Make the the accelerometers give raw results. - * - * @param id - * the id of the wiimote concerned - */ - native void deactivateSmoothing(int id); - - /** - * Make the wiimote generate an event each time we poll. Not set by default. - * - * @param id - * the id of the wiimote concerned - */ - native void activateContinuous(int id); - - /** - * Make the wiimote generate an event only when there is one. - * - * @param id - * the id of the wiimote concerned - */ - native void deactivateContinuous(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 4/3. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setScreenRatio43(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 16/9. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setScreenRatio169(int id); - - /** - * Notify wiiuse that the sensor bar is above your screen. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setSensorBarAboveScreen(int id); - - /** - * Notify wiiuse that the sensor bar is below your screen. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void setSensorBarBelowScreen(int id); - - /** - * Set virtual screen resolution. It is used to automatically compute the - * position of a cursor on this virtual screen using the sensor bar. These - * results come in the IREvent. - * - * @param id - * the id of the wiimote of which we want the status. - * @param x - * x resolution. - * @param y - * y resolution. - */ - native void setVirtualScreenResolution(int id, int x, int y); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param id - * the id of the wiimote of which we want the status. - */ - native void getStatus(int id); - - /** - * Check for new Events and Get it. - * - * @param gath - * the object where we store all the new events. - */ - native void specialPoll(EventsGatherer gath); - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiManager.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiManager.java deleted file mode 100644 index 4f273b4..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiManager.java +++ /dev/null @@ -1,491 +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; - -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiuseapievents.EventsGatherer; -import wiiusej.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiuseapievents.WiiUseApiListener; -import wiiusej.wiiuseapirequest.FloatValueRequest; -import wiiusej.wiiuseapirequest.IntValueRequest; -import wiiusej.wiiuseapirequest.LedsRequest; -import wiiusej.wiiuseapirequest.TwoIntValueRequest; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * Class that manages the use of Wiiuse API. - * - * @author guiguito - */ -public class WiiUseApiManager extends Thread { - - private static WiiUseApiManager instance = new WiiUseApiManager(); - - private final EventListenerList listeners = new EventListenerList(); - - private Wiimote[] wiimotes; - - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - - private int connected = -1; - - private AtomicBoolean running = new AtomicBoolean(false); - - private WiiUseApiRequestsManager requestManager = WiiUseApiRequestsManager - .getInstance(); - - public static WiiUseApiManager getInstance() { - return instance; - } - - /** - * Get wiimotes. Load library if necessary. Connect to wiimotes if - * necessary. Start polling if necessary. Return an array with the connected - * wiimotes. - * - * @param nb - * try to connect nb wiimotes - * @param rumble - * make the connected wiimotes rumble - * @return an array with connected wiimotes or NULL. - */ - public synchronized static Wiimote[] getWiimotes(int nb, boolean rumble) { - WiiUseApiManager manager = getInstance(); - if (manager.connected <= 0 && !manager.running.get()) { - int nbWiimotes = manager.connectWiimotes(nb, rumble); - manager.wiimotes = new Wiimote[nbWiimotes]; - for (int i = 1; i <= nbWiimotes; i++) { - Wiimote wim = new Wiimote(i, manager); - manager.wiimotes[i - 1] = wim; - manager.addWiiUseApiListener(wim); - } - } - - if (manager.connected == 0) { - return new Wiimote[0]; - } - - if (!manager.isAlive()){ - manager.start(); - manager.requestManager.start(); - } - - return manager.wiimotes; - } - - /** - * Connect wiimote and get the number of wiimotes connected. Supposed to be - * used once. - * - * @param nb - * try to connect nb wiimotes - * @param rumble - * make the connected wiimotes rumble - * @return 0 if nothing connected or the number of wiimotes connected. - */ - private int connectWiimotes(int nb, boolean rumble) { - if (connected <= 0) { - connected = wiiuse.doConnections(nb, rumble); - return connected; - } else {// library not loaded, no wiimotes connected - return 0; - } - } - - /** - * Ask the thread to close a connection. - * - * @param id - * id of the wiimote to disconnect. - */ - public void closeConnection(int id) { - removeWiiUseApiListener(wiimotes[id - 1]); - wiimotes[id - 1] = null; - connected--; - if (connected == 0) {// stop this thread if there is - // no more wiimotes connected. - //stop thread - shutdown(); - } - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST)); - // System.out.println("Wiimote " + id + " disconnected !"); - } - - /** - * Get the number of wiimotes connected. - * - * @return the number of wiimotes connected. - */ - public int getNbConnectedWiimotes() { - return connected; - } - - /** - * Stop thread and shutdown wiiuse Api. - */ - public void shutdown() { - if (connected > 0) { - for (Wiimote wim : wiimotes) { - if (wim != null) - wim.disconnect(); - } - } - running.set(false); - wiiuse.shutdownApi(); - } - - /** - * Activate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateRumble(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Deactivate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateRumble(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Activate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateIRTRacking(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Deactivate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateIRTRacking(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Activate motion sensing for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateMotionSensing(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Deactivate motion sensing for the wiimoter with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateMotionSensing(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Activate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateSmoothing(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Deactivate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateSmoothing(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Activate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateContinuous(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Deactivate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote - */ - public void deactivateContinuous(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Set leds for the wiimotes with the given id. - * - * @param id - * id of the wiimote - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(int id, boolean l1, boolean l2, boolean l3, boolean l4) { - requestManager.addRequests(new LedsRequest(id, - WiiUseApiRequest.WIIUSE_LEDS_REQUEST, l1, l2, l3, l4)); - } - - /** - * Set the orientation threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(int id, float th) { - requestManager.addRequests(new FloatValueRequest(id, - WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST, th)); - } - - /** - * Set the acceleration threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold - */ - public void setAccelerationThreshold(int id, int th) { - requestManager.addRequests(new IntValueRequest(id, - WiiUseApiRequest.WIIUSE_ACCEL_THRESHOLHD_REQUEST, th)); - } - - /** - * Set alpha smoothing for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold - */ - public void setAlphaSmoothing(int id, float th) { - requestManager.addRequests(new FloatValueRequest(id, - WiiUseApiRequest.WIIUSE_ALPHA_SMOOTHING_REQUEST, th)); - } - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote - */ - public void reSync(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_RESYNC)); - } - - /** - * Set screen aspect ratio to 4/3 for the given id. - * - * @param id - * id of the wiimote - */ - public void setScreenAspectRatio43(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ASPECT_RATIO_4_3)); - } - - /** - * Set screen aspect ratio to 16/9 for the given id. - * - * @param id - * id of the wiimote - */ - public void setScreenAspectRatio169(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ASPECT_RATIO_16_9)); - } - - /** - * Set the sensor bar to be above the screen. - * - * @param id - * id of the wiimote - */ - public void setSensorBarAboveScreen(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_SENSOR_BAR_ABOVE)); - } - - /** - * Set the sensor bar to be below the screen. - * - * @param id - * id of the wiimote - */ - public void setSensorBarBelowScreen(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_SENSOR_BAR_BELOW)); - } - - /** - * Set virtual resolution. It is used to automatically compute the position - * of a cursor on this virtual screen using the sensor bar. These results - * come in the IREvent. - * - * @param id - * id of the wiimote - * @param x - * x resolution - * @param y - * y resolution - */ - public void setVirtualResolution(int id, int x, int y) { - requestManager.addRequests(new TwoIntValueRequest(id, - WiiUseApiRequest.WIIUSE_SET_VIRTUAL_RESOLUTION, x, y)); - } - - /** - * Get Status for the wiimote for the given id. - * - * @param id - * id of the wiimote - */ - public void getStatus(int id) { - requestManager.addRequests(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_STATUS_REQUEST)); - } - - @Override - public void run() { - - if (connected > 0) { - running.set(true); - - EventsGatherer gather = new EventsGatherer(connected); - - // Start polling and tell the observers when there are Wiimote - // events - while (running.get() && connected > 0) { - - /* Polling */ - synchronized (wiiuse) { - wiiuse.specialPoll(gather); - } - - /* deal with events gathered in Wiiuse API */ - for (WiiUseApiEvent evt : gather.getEvents()) { - if (evt.getWiimoteId() != -1) {// event filled - // there is an event notify observers - notifyWiiUseApiListener(evt); - if (evt.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT) { - // check if it was a disconnection - // in this case disconnect the wiimote - closeConnection(evt.getWiimoteId()); - } - } else { - System.out - .println("There is an event with id == -1 ??? there is a problem !!! : " - + evt); - } - } - gather.clearEvents(); - } - } else { - if (connected <= 0) { - System.out.println("No wiimotes connected !"); - } - } - - } - - /** - * Add WiiUseApiListener to the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void addWiiUseApiListener(WiiUseApiListener listener) { - listeners.add(WiiUseApiListener.class, listener); - } - - /** - * Remove WiiUseApiListener from the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void removeWiiUseApiListener(WiiUseApiListener listener) { - listeners.remove(WiiUseApiListener.class, listener); - } - - /** - * Get the list of WiiUseApiListeners. - * - * @return the list of WiiUseApiListeners. - */ - public WiiUseApiListener[] getWiiUseApiListeners() { - return listeners.getListeners(WiiUseApiListener.class); - } - - /** - * Notify WiiUseApiListeners that an event occured. - * - * @param evt - * WiimoteEvent occured - */ - private void notifyWiiUseApiListener(WiiUseApiEvent evt) { - for (WiiUseApiListener listener : getWiiUseApiListeners()) { - listener.onWiiUseApiEvent(evt); - } - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiRequestsManager.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiRequestsManager.java deleted file mode 100644 index b3ac993..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/WiiUseApiRequestsManager.java +++ /dev/null @@ -1,162 +0,0 @@ -package wiiusej; - -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.Semaphore; - -import wiiusej.wiiuseapirequest.FloatValueRequest; -import wiiusej.wiiuseapirequest.IntValueRequest; -import wiiusej.wiiuseapirequest.LedsRequest; -import wiiusej.wiiuseapirequest.TwoIntValueRequest; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * This class is thread dedicated to send request to WiiUseApi. It is used only - * (and must be used only) by WiiUseApiManager. - * - * @author guiguito - * - */ -public class WiiUseApiRequestsManager extends Thread { - - //protected Semaphore semaphore = new Semaphore(0); - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - private ConcurrentLinkedQueue requests = new ConcurrentLinkedQueue(); - private static WiiUseApiRequestsManager instance = new WiiUseApiRequestsManager(); - private boolean running = false; - - /** - * Default constructor. - */ - WiiUseApiRequestsManager() { - super(); - } - - public static WiiUseApiRequestsManager getInstance() { - return instance; - } - - public void addRequests(WiiUseApiRequest request) { - requests.add(request); - //semaphore.release(); - synchronized (requests) { - requests.notify(); - } - } - - public void run() { - running = true; - while (running) { - /* deal with requests done to wiiuse API */ - - /* - try { - semaphore.acquire(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - */ - if (requests.size()==0){ - synchronized (requests) { - try { - requests.wait(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - WiiUseApiRequest req = requests.poll(); - if (req != null) {// there is a request for the wiiuse api - int id = req.getId(); - synchronized (wiiuse) {// synchronized on wiiuseApi - if (req.getRequestType() == WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST) { - /* Close connections requests */ - wiiuse.closeConnection(id); - if (WiiUseApiManager.getInstance() - .getNbConnectedWiimotes() <= 0) { - this.shutdown(); - } - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_STATUS_REQUEST) { - /* Status requests */ - wiiuse.getStatus(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST) { - /* Activate Rumble requests */ - wiiuse.activateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST) { - /* Deactivate Rumble requests */ - wiiuse.deactivateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST) { - /* Activate IR Tracking requests */ - wiiuse.activateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST) { - /* Deactivate IR Tracking requests */ - wiiuse.deactivateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST) { - /* Activate Motion sensing requests */ - wiiuse.activateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST) { - /* Deactivate Motion sensing requests */ - wiiuse.deactivateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_LEDS_REQUEST) { - /* leds requests */ - LedsRequest reqLed = (LedsRequest) req; - wiiuse.setLeds(id, reqLed.isLed1(), reqLed.isLed2(), - reqLed.isLed3(), reqLed.isLed4()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST) { - /* Activate smoothing requests */ - wiiuse.activateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST) { - /* Deactivate smoothing requests */ - wiiuse.deactivateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST) { - /* Activate continuous requests */ - wiiuse.activateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST) { - /* Deactivate continuous requests */ - wiiuse.deactivateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST) { - /* set orientation threshold request */ - wiiuse.setOrientThreshold(req.getId(), - ((FloatValueRequest) req).getFloatValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACCEL_THRESHOLHD_REQUEST) { - /* set acceleration threshold request */ - wiiuse.setAccelThreshold(req.getId(), - ((IntValueRequest) req).getIntValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ALPHA_SMOOTHING_REQUEST) { - /* set alpha smoothing request */ - wiiuse.setAlphaSmoothing(req.getId(), - ((FloatValueRequest) req).getFloatValue()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_RESYNC) { - /* set resync request */ - wiiuse.reSync(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ASPECT_RATIO_4_3) { - /* set screen aspect ratio to 4/3 */ - wiiuse.setScreenRatio43(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ASPECT_RATIO_16_9) { - /* set screen aspect ratio to 16/9 */ - wiiuse.setScreenRatio169(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SENSOR_BAR_ABOVE) { - /* set sensor bar above the screen */ - wiiuse.setSensorBarAboveScreen(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SENSOR_BAR_BELOW) { - /* set sensor bar above the screen */ - wiiuse.setSensorBarBelowScreen(req.getId()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_SET_VIRTUAL_RESOLUTION) { - /* set virtual resolution */ - wiiuse.setVirtualScreenResolution(req.getId(), - ((TwoIntValueRequest) req).getIntValue(), - ((TwoIntValueRequest) req).getSecondIntValue()); - } else { - System.out.println("Bad request to Wiiuse API !!!!!"); - } - }// end synchronized on wiiuseApi - }//if (req != null) - }//end while(running) - } - - public void shutdown() { - running = false; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/Wiimote.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/Wiimote.java deleted file mode 100644 index f04e66c..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/Wiimote.java +++ /dev/null @@ -1,323 +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; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.GenericEvent; -import wiiusej.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiuseapievents.WiiUseApiListener; -import wiiusej.wiiuseapievents.WiimoteListener; -import wiiusej.wiiuseapirequest.WiiUseApiRequest; - -/** - * Class that represents a wiimote. - * You can register as an observer of this wiimote to listen events from it. - * You manage it. - * @author guiguito - */ -public class Wiimote implements WiiUseApiListener { - - private int id = -1;//wiimote id - - private EventListenerList listeners = new EventListenerList(); - - private WiiUseApiManager manager; - - - /** - * Constructor. - * @param idd id of the wiimote - * @param manager manager wo built it. - */ - public Wiimote(int idd, WiiUseApiManager manager){ - id = idd; - this.manager = manager; - } - - /** - * Disconnect this wiimote. - */ - public void disconnect(){ - deactivateIRTRacking(); - deactivateMotionSensing(); - deactivateRumble(); - manager.closeConnection(id); - } - - /** - * Activate the rumble. - */ - public void activateRumble() { - manager.activateRumble(id); - } - - /** - * Deactivate the rumble. - */ - public void deactivateRumble() { - manager.deactivateRumble(id); - } - - /** - * Activate IR Tracking. - */ - public void activateIRTRacking() { - manager.activateIRTRacking(id); - } - - /** - * Deactivate IR Tracking. - */ - public void deactivateIRTRacking() { - manager.deactivateIRTRacking(id); - } - - /** - * Activate motion sensing. - */ - public void activateMotionSensing() { - manager.activateMotionSensing(id); - } - - /** - * Deactivate motion sensing. - */ - public void deactivateMotionSensing() { - manager.deactivateMotionSensing(id); - } - - /** - * Activate smoothing. - */ - public void activateSmoothing() { - manager.activateSmoothing(id); - } - - /** - * Deactivate smoothing. - */ - public void deactivateSmoothing() { - manager.deactivateSmoothing(id); - } - - /** - * Activate continuous. - */ - public void activateContinuous() { - manager.activateContinuous(id); - } - - /** - * Deactivate continuous. - */ - public void deactivateContinuous() { - manager.deactivateContinuous(id); - - } - - /** - * Set leds status. - * - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(boolean l1, boolean l2, boolean l3, boolean l4) { - manager.setLeds(id, l1, l2, l3, l4); - } - - /** - * Set the orientation threshold (minimum angle between two degrees with accelerometer). - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(float th) { - manager.setOrientationThreshold(id,th); - } - - /** - * Set the acceleration threshold . - * @param th - * threshold - */ - public void setAccelerationThreshold(int th) { - manager.setAccelerationThreshold(id,th); - } - - /** - * Set the alpha smoothing value. - * @param th - * threshold - */ - public void setAlphaSmoothingValue(float th) { - manager.setAlphaSmoothing(id,th); - } - - /** - * Set the screen aspect ratio to be considered as 4/3. - */ - public void setScreenAspectRatio43() { - manager.setScreenAspectRatio43(id); - } - - /** - * Set the screen aspect ratio to be considered as 16/9. - */ - public void setScreenAspectRatio169() { - manager.setScreenAspectRatio169(id); - } - - /** - * Set the sensor bar to be considered above the screen. - */ - public void setSensorBarAboveScreen() { - manager.setSensorBarAboveScreen(id); - } - - /** - * Set the sensor bar to be considered below the screen. - */ - public void setSensorBarBelowScreen() { - manager.setSensorBarBelowScreen(id); - } - - /** - * Set the screen resolution of the you are pointing at - * with your wiimote. - * - * @param x x resolution. - * @param y y resolution. - */ - public void setVirtualResolution(int x, int y) { - manager.setVirtualResolution(id, x ,y); - } - - /** - * Try to resync the wiimote by starting a new handshake. - */ - public void reSync() { - manager.reSync(id); - } - - /** - * Ask for the status of the wiimote. - * The result will be received in a status event object. - * Implements onStatusEvent on wiimote listener to get it. - */ - public void getStatus() { - manager.getStatus(id); - } - - /** - * Method called when a WiiUseApiEvent occurs. - * @param e the WiiUseApiEvent. - */ - public void onWiiUseApiEvent(WiiUseApiEvent e) { - if (e.getWiimoteId() == id){ - if (e.getEventType() == WiiUseApiEvent.GENERIC_EVENT){ - notifyWiiMoteEventListeners((GenericEvent)e); - }else if (e.getEventType() == WiiUseApiEvent.STATUS_EVENT - ||e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_REMOVED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_REMOVED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_INSERTED - ||e.getEventType() == WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_REMOVED){ - notifyStatusEventListeners((StatusEvent)e); - }else if (e.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT){ - notifyDisconnectionEventListeners((DisconnectionEvent)e); - } - } - } - - /** - * Add a WiimoteListener to the listeners list. - * @param listener a WiimoteListener - */ - public void addWiiMoteEventListeners(WiimoteListener listener) { - listeners.add(WiimoteListener.class, listener); - } - - /** - * Remove a WiimoteListener from the listeners list. - * @param listener a WiimoteListener - */ - public void removeWiiMoteEventListeners(WiimoteListener listener) { - listeners.remove(WiimoteListener.class, listener); - } - - /** - * Get the list of WiimoteListener. - * @return the list of WiimoteListener. - */ - public WiimoteListener[] getWiiMoteEventListeners() { - return listeners.getListeners(WiimoteListener.class); - } - - /** - * Notify WiimoteListeners that an event occured. - * Notify in first the listeners for Buttons Events. - * In second the listeners for IR Events. - * In third the listeners for Motion sensing events. - * @param evt WiimoteEvent occured - */ - private void notifyWiiMoteEventListeners(GenericEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onButtonsEvent(evt.getButtonsEvent()); - if (evt.isThereIrEvent()){ - listener.onIrEvent(evt.getIREvent()); - } - if (evt.isThereMotionSensingEvent()){ - listener.onMotionSensingEvent(evt.getMotionSensingEvent()); - } - } - } - - /** - * Notify WiimoteListener that a status event occured. - * @param evt status event occured - */ - private void notifyStatusEventListeners(StatusEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onStatusEvent(evt); - } - } - - /** - * Notify WiimoteListener that a status event occured. - * @param evt status event occured - */ - private void notifyDisconnectionEventListeners(DisconnectionEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onDisconnectionEvent(evt); - } - } - - @Override - public String toString() { - return "Wiimote with ID : "+id; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/CloseGuiTestCleanly.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/CloseGuiTestCleanly.java deleted file mode 100644 index ae136bf..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/CloseGuiTestCleanly.java +++ /dev/null @@ -1,65 +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; -import wiiusej.Wiimote; - -/** - * This class is used to close wiiusej cleanly. - * @author guiguito - */ -public class CloseGuiTestCleanly implements WindowListener{ - - Wiimote wiimote; - - - public CloseGuiTestCleanly(Wiimote wim) { - wiimote = wim; - } - - public void windowOpened(WindowEvent e) { - //nothing - } - - public void windowClosing(WindowEvent e) { - WiiUseApiManager.getInstance().shutdown(); - } - - 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Main.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Main.java deleted file mode 100644 index daaca2a..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Main.java +++ /dev/null @@ -1,40 +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); - if (wiimotes.length>0){ - WiiuseJGuiTest gui = new WiiuseJGuiTest(wiimotes[0]); - gui.setDefaultCloseOperation(gui.EXIT_ON_CLOSE); - gui.setVisible(true); - } - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Tests.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Tests.java deleted file mode 100644 index 1a82547..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/Tests.java +++ /dev/null @@ -1,354 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.GenericEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This class used to test WiiuseJ. - * - * @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(); - } - } - - private static int nb = 0; - - public void onButtonsEvent(ButtonsEvent 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(); - } - - } 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 onStatusEvent(StatusEvent e) { - // Display status variables - System.out.println(e); - } - - public void onDisconnectionEvent(DisconnectionEvent e) { - System.out.println(" wiimote " + e.getWiimoteId() - + "has been disconnected !!"); - } - - /** - * @param args - */ - public static void main(String[] args) { - Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(4, true); - if (wiimotes.length > 0) { - System.out.println(wiimotes[0]); - Tests tests = 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/WiiuseJGuiTest.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/WiiuseJGuiTest.java deleted file mode 100644 index 8bac8ae..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/test/WiiuseJGuiTest.java +++ /dev/null @@ -1,836 +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.util.logging.Level; -import java.util.logging.Logger; -import wiiusej.utils.IRPanel; -import wiiusej.Wiimote; -import wiiusej.utils.AccelerationPanel; -import wiiusej.utils.GForcePanel; -import wiiusej.utils.ButtonsEventPanel; -import wiiusej.utils.OrientationPanel; -import wiiusej.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * 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; - - /** Creates new form WiiuseJGuiTest */ - public WiiuseJGuiTest(Wiimote wiimote) { - initComponents(); - this.wiimote = wiimote; - wiimote.addWiiMoteEventListeners((IRPanel) irViewPanel); - wiimote.addWiiMoteEventListeners((ButtonsEventPanel) buttonsPanel); - wiimote.addWiiMoteEventListeners((OrientationPanel) motionSensingPanel); - wiimote.addWiiMoteEventListeners((GForcePanel) gForcePanel); - wiimote.addWiiMoteEventListeners((AccelerationPanel) accelerationPanel); - wiimote.addWiiMoteEventListeners(this); - wiimote.deactivateContinuous(); - wiimote.deactivateSmoothing(); - wiimote.setScreenAspectRatio169(); - wiimote.setSensorBarBelowScreen(); - getStatusButtonMousePressed(null); - this.addWindowListener(new CloseGuiTestCleanly(wiimote)); - } - - public void onButtonsEvent(ButtonsEvent 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 onStatusEvent(StatusEvent arg0) { - messageText.setText("Status received !"); - batteryLevelText.setText(arg0.getBatteryLevel() + " %"); - led1Button.setEnabled(arg0.isLed1Set()); - led2Button.setEnabled(arg0.isLed2Set()); - led3Button.setEnabled(arg0.isLed3Set()); - led4Button.setEnabled(arg0.isLed4Set()); - //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 !"); - } - - /** 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(); - motionSensingPanel = new OrientationPanel(); - gForcePanel = new wiiusej.utils.GForcePanel(); - accelerationPanel = new AccelerationPanel(); - rightPanel = new javax.swing.JPanel(); - fixedWiimotePanel = new javax.swing.JPanel(); - buttonsPanel = new ButtonsEventPanel(); - controlsPanel = new javax.swing.JPanel(); - activateRumblePanel = new javax.swing.JPanel(); - toggleRumbleButton = new javax.swing.JButton(); - deactivateRumblePanel = new javax.swing.JPanel(); - toggleIRTrackingButton = new javax.swing.JButton(); - activateIRtrackingPanel = new javax.swing.JPanel(); - toggleMotionSensingTrackingButton = new javax.swing.JButton(); - deactivateIRTrackingPanel = new javax.swing.JPanel(); - toggleSmoothingButton = new javax.swing.JButton(); - activateMotionSensingTrackingPanel = new javax.swing.JPanel(); - toggleContinuousButton = new javax.swing.JButton(); - deactivateMotionSensingTrackingPanel = 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(); - activateSmoothingPanel = new javax.swing.JPanel(); - alphaSmoothingTextField = new javax.swing.JTextField(); - alphaSmoothingButton = new javax.swing.JButton(); - deactivateSmoothingPanel = new javax.swing.JPanel(); - orientationThresholdTextField = new javax.swing.JTextField(); - orientationThresholdButton = new javax.swing.JButton(); - activateContinuousPanel = new javax.swing.JPanel(); - accelerationThresholdTextField = new javax.swing.JTextField(); - accelerationThresholdButton = new javax.swing.JButton(); - deactivateContinuousPanel = new javax.swing.JPanel(); - getStatusButton = new javax.swing.JButton(); - batteryText = new javax.swing.JLabel(); - batteryLevelText = new javax.swing.JLabel(); - ledsPanel = new javax.swing.JPanel(); - toggleSensorBarPositionButton = new javax.swing.JButton(); - alphaSmoothingPanel = new javax.swing.JPanel(); - toggleScreenAspectRatioButton = new javax.swing.JButton(); - orientationThresholdPanel = 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(); - accelerationThresholdPanel = new javax.swing.JPanel(); - mouseIRControlButton = new javax.swing.JButton(); - batteryPanel = new javax.swing.JPanel(); - expansionText = new javax.swing.JLabel(); - messagesPanel = new javax.swing.JPanel(); - 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))); - - 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) - ); - - 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 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("Raw Acceleration", accelerationPanel); - - 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); - } - }); - activateRumblePanel.add(toggleRumbleButton); - - controlsPanel.add(activateRumblePanel); - - toggleIRTrackingButton.setText("Activate IR Tracking"); - toggleIRTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleIRTrackingButtonMousePressed(evt); - } - }); - deactivateRumblePanel.add(toggleIRTrackingButton); - - controlsPanel.add(deactivateRumblePanel); - - toggleMotionSensingTrackingButton.setText("Activate motion sensing Tracking"); - toggleMotionSensingTrackingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleMotionSensingTrackingButtonMousePressed(evt); - } - }); - activateIRtrackingPanel.add(toggleMotionSensingTrackingButton); - - controlsPanel.add(activateIRtrackingPanel); - - toggleSmoothingButton.setText("Activate Smoothing"); - toggleSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSmoothingButtonMousePressed(evt); - } - }); - deactivateIRTrackingPanel.add(toggleSmoothingButton); - - controlsPanel.add(deactivateIRTrackingPanel); - - toggleContinuousButton.setText("Activate Continuous"); - toggleContinuousButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleContinuousButtonMousePressed(evt); - } - }); - activateMotionSensingTrackingPanel.add(toggleContinuousButton); - - controlsPanel.add(activateMotionSensingTrackingPanel); - - led1Button.setText("Led1"); - led1Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led1ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led1Button); - - led2Button.setText("Led2"); - led2Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led2ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led2Button); - - led3Button.setText("Led3"); - led3Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led3ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led3Button); - - led4Button.setText("Led4"); - led4Button.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - led4ButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(led4Button); - - setLedsButton.setText("Set leds"); - setLedsButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setLedsButtonMousePressed(evt); - } - }); - deactivateMotionSensingTrackingPanel.add(setLedsButton); - - controlsPanel.add(deactivateMotionSensingTrackingPanel); - - alphaSmoothingTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - alphaSmoothingTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - activateSmoothingPanel.add(alphaSmoothingTextField); - - alphaSmoothingButton.setText("Set alpha smoothing"); - alphaSmoothingButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - alphaSmoothingButtonMousePressed(evt); - } - }); - activateSmoothingPanel.add(alphaSmoothingButton); - - controlsPanel.add(activateSmoothingPanel); - - orientationThresholdTextField.setMinimumSize(new java.awt.Dimension(100, 20)); - orientationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - deactivateSmoothingPanel.add(orientationThresholdTextField); - - orientationThresholdButton.setText("Set orientation threshold"); - orientationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - orientationThresholdButtonMousePressed(evt); - } - }); - deactivateSmoothingPanel.add(orientationThresholdButton); - - controlsPanel.add(deactivateSmoothingPanel); - - accelerationThresholdTextField.setPreferredSize(new java.awt.Dimension(100, 20)); - activateContinuousPanel.add(accelerationThresholdTextField); - - accelerationThresholdButton.setText("Set acceleration threshold"); - accelerationThresholdButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - accelerationThresholdButtonMousePressed(evt); - } - }); - activateContinuousPanel.add(accelerationThresholdButton); - - controlsPanel.add(activateContinuousPanel); - - getStatusButton.setText("Get status"); - getStatusButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - getStatusButtonMousePressed(evt); - } - }); - deactivateContinuousPanel.add(getStatusButton); - - batteryText.setFont(new java.awt.Font("Tahoma", 0, 14)); - batteryText.setText("Battery level :"); - deactivateContinuousPanel.add(batteryText); - - batteryLevelText.setFont(new java.awt.Font("Arial", 0, 14)); - batteryLevelText.setText(" %"); - deactivateContinuousPanel.add(batteryLevelText); - - controlsPanel.add(deactivateContinuousPanel); - - toggleSensorBarPositionButton.setText("Set sensor bar above"); - toggleSensorBarPositionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - toggleSensorBarPositionButtonMousePressed(evt); - } - }); - ledsPanel.add(toggleSensorBarPositionButton); - - controlsPanel.add(ledsPanel); - - 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); - } - }); - alphaSmoothingPanel.add(toggleScreenAspectRatioButton); - - controlsPanel.add(alphaSmoothingPanel); - - xLabel.setText("X"); - orientationThresholdPanel.add(xLabel); - - xResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - xResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - orientationThresholdPanel.add(xResolutionTextField); - - yLabel.setText("Y"); - orientationThresholdPanel.add(yLabel); - - yResolutionTextField.setFocusTraversalPolicyProvider(true); - yResolutionTextField.setMinimumSize(new java.awt.Dimension(40, 20)); - yResolutionTextField.setPreferredSize(new java.awt.Dimension(40, 20)); - orientationThresholdPanel.add(yResolutionTextField); - - setVirtualResolutionButton.setText("Set virtual resolution"); - setVirtualResolutionButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - setVirtualResolutionButtonMousePressed(evt); - } - }); - orientationThresholdPanel.add(setVirtualResolutionButton); - - controlsPanel.add(orientationThresholdPanel); - - mouseIRControlButton.setText("Start infrared mouse control"); - mouseIRControlButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - mouseIRControlButtonMousePressed(evt); - } - }); - accelerationThresholdPanel.add(mouseIRControlButton); - - controlsPanel.add(accelerationThresholdPanel); - - expansionText.setText("No expansion connected"); - batteryPanel.add(expansionText); - - controlsPanel.add(batteryPanel); - - 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; - }//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 - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel accelerationPanel; - private javax.swing.JButton accelerationThresholdButton; - private javax.swing.JPanel accelerationThresholdPanel; - private javax.swing.JTextField accelerationThresholdTextField; - private javax.swing.JPanel activateContinuousPanel; - private javax.swing.JPanel activateIRtrackingPanel; - private javax.swing.JPanel activateMotionSensingTrackingPanel; - private javax.swing.JPanel activateRumblePanel; - private javax.swing.JPanel activateSmoothingPanel; - private javax.swing.JButton alphaSmoothingButton; - private javax.swing.JPanel alphaSmoothingPanel; - private javax.swing.JTextField alphaSmoothingTextField; - private javax.swing.JLabel batteryLevelText; - private javax.swing.JPanel batteryPanel; - private javax.swing.JLabel batteryText; - private javax.swing.JPanel buttonsPanel; - private javax.swing.JPanel controlsPanel; - private javax.swing.JPanel deactivateContinuousPanel; - private javax.swing.JPanel deactivateIRTrackingPanel; - private javax.swing.JPanel deactivateMotionSensingTrackingPanel; - private javax.swing.JPanel deactivateRumblePanel; - private javax.swing.JPanel deactivateSmoothingPanel; - private javax.swing.JLabel expansionText; - private javax.swing.JPanel fixedWiimotePanel; - private javax.swing.JPanel gForcePanel; - private javax.swing.JButton getStatusButton; - 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 ledsPanel; - 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.JButton orientationThresholdButton; - private javax.swing.JPanel orientationThresholdPanel; - private javax.swing.JTextField orientationThresholdTextField; - private javax.swing.JPanel rightPanel; - private javax.swing.JButton setLedsButton; - private javax.swing.JButton setVirtualResolutionButton; - 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/AccelerationPanel.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/AccelerationPanel.java deleted file mode 100644 index 0403255..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/AccelerationPanel.java +++ /dev/null @@ -1,182 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch raw acceleration values from a MotionSensingEvent. - * @author guiguito - */ -public 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(); - } - - @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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getRawAcceleration()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/ButtonsEventPanel.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/ButtonsEventPanel.java deleted file mode 100644 index 2a4a48f..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/ButtonsEventPanel.java +++ /dev/null @@ -1,297 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to see what buttons are pressed. - * 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 ButtonsEvent buttons; - private Color pressedColor = Color.RED; - private Color heldColor = Color.ORANGE; - private Color releasedColor = Color.YELLOW; - private Shape shape; - - /** - * 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); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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"); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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(ButtonsEvent 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 onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/GForcePanel.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/GForcePanel.java deleted file mode 100644 index 9802688..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/GForcePanel.java +++ /dev/null @@ -1,201 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch gravity force values from a MotionSensingEvent. - * @author guiguito - */ -public 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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getGforce()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/IRPanel.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/IRPanel.java deleted file mode 100644 index 4526206..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/IRPanel.java +++ /dev/null @@ -1,193 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * 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(ButtonsEvent 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 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(); - } - - /** 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/OrientationPanel.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/OrientationPanel.java deleted file mode 100644 index b50a2ce..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/utils/OrientationPanel.java +++ /dev/null @@ -1,205 +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.wiiuseapievents.ButtonsEvent; -import wiiusej.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiuseapievents.IREvent; -import wiiusej.wiiuseapievents.MotionSensingEvent; -import wiiusej.wiiuseapievents.StatusEvent; -import wiiusej.wiiuseapievents.WiimoteListener; - -/** - * This panel is used to watch orientation values from a MotionSensingEvent. - * @author guiguito - */ -public 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(ButtonsEvent arg0) { - //nothing - } - - public void onIrEvent(IREvent arg0) { - //nothing - } - - public void onMotionSensingEvent(MotionSensingEvent arg0) { - if (values.size() >= getWidth()) { - //if there are as many values as pixels in the width - //clear points - values.clear(); - } - values.add(arg0.getOrientation()); - repaint(); - } - - public void onStatusEvent(StatusEvent arg0) { - //nothing - } - - public void onDisconnectionEvent(DisconnectionEvent arg0) { - //Clear points. - 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/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/GForce.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/GForce.java deleted file mode 100644 index 9732121..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/GForce.java +++ /dev/null @@ -1,75 +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.values; - -/** - * Represents gravity force on each axis. - * @author guiguito - */ -public class GForce { - - private float x; - private float y; - private float z; - - /** - * Default constructor; - */ - public GForce(){ - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with gravity force on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public GForce(float xx, float yy, float zz){ - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public float getX() { - return x; - } - - /** - * @return the y - */ - public float getY() { - return y; - } - - /** - * @return the z - */ - public float getZ() { - return z; - } - - @Override - public String toString() { - return "Gravity force : ("+x+", "+y+","+z+")"; - } -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/IRSource.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/IRSource.java deleted file mode 100644 index 7caef55..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/IRSource.java +++ /dev/null @@ -1,109 +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.values; - -/** - * Class used for IR sources. - * @author guiguito - */ -public class IRSource{ - - private int x; - private int y; - private short rx; - private short ry; - private short size; - - /** - * Build an IR source with all details. - * - * @param xx - * xx interpolated coordinates. - * @param yy - * yy interpolated coordinates. - * @param rxx - * raw X coordinate (0-1023). - * @param ryy - * raw Y coordinate (0-1023). - * @param si - * size of the IR dot (0-15). - */ - public IRSource(int xx, int yy, short rxx, short ryy, short si) { - x = xx; - y = yy; - rx = rxx; - ry = ryy; - size = si; - } - - - /** - * Return x interpolated coordinates. - * @return the x - */ - public int getX() { - return x; - } - - - - /** - * Return y interpolated coordinates. - * @return the y - */ - public int getY() { - return y; - } - - - - /** - * Return raw X coordinate (0-1023). - * @return the rx - */ - public short getRx() { - return rx; - } - - - - /** - * Return raw Y coordinate (0-1023). - * @return the ry - */ - public short getRy() { - return ry; - } - - - - /** - * Return size of the IR dot (0-15). - * @return the size - */ - public short getSize() { - return size; - } - - - - @Override - public String toString() { - return "Interpolated coordinates ("+x+","+y+"), Raw coordinates("+rx+","+ry+"), source size : "+size+")"; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/Orientation.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/Orientation.java deleted file mode 100644 index 4c4f741..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/Orientation.java +++ /dev/null @@ -1,76 +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.values; - -/** - * Class that represents the orientation of the wiimote. - * @author guiguito - */ -public class Orientation { - - private float roll; - private float pitch; - private float yaw; - - /** - * Default constructor. - */ - public Orientation(){ - roll = 0; - pitch = 0; - yaw = 0; - } - - /** - * Contructor with raw, pitch , yaw. - * @param r raw - * @param p pitch - * @param y yaw - */ - public Orientation(float r, float p, float y){ - roll = r; - pitch = p; - yaw = y; - } - - /** - * @return the roll - */ - public float getRoll() { - return roll; - } - - /** - * @return the pitch - */ - public float getPitch() { - return pitch; - } - - /** - * @return the yaw - */ - public float getYaw() { - return yaw; - } - - @Override - public String toString() { - return "Orientation : (roll: "+roll+", pitch: "+pitch+", yaw: "+yaw+")"; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/RawAcceleration.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/RawAcceleration.java deleted file mode 100644 index 903a51c..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/values/RawAcceleration.java +++ /dev/null @@ -1,75 +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.values; - -/** - * Represents raw acceleration on each axis. - * @author guiguito - */ -public class RawAcceleration { - - private short x; - private short y; - private short z; - - /** - * Default constructor; - */ - public RawAcceleration() { - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with raw acceleration on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public RawAcceleration(short xx, short yy, short zz) { - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public short getX() { - return x; - } - /** - * @return the y - */ - public short getY() { - return y; - } - - /** - * @return the z - */ - public short getZ() { - return z; - } - - @Override - public String toString() { - return "Raw acceleration : ("+x+", "+y+","+z+")"; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/ButtonsEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/ButtonsEvent.java deleted file mode 100644 index ce78551..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/ButtonsEvent.java +++ /dev/null @@ -1,335 +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.wiiuseapievents; - -/** - * Class which represents a buttons event. - * @author guiguito - */ -public class ButtonsEvent extends WiimoteEvent{ - - /* Buttons MACRO */ - private static short WIIMOTE_BUTTON_TWO = 0x0001; - private static short WIIMOTE_BUTTON_ONE = 0x0002; - private static short WIIMOTE_BUTTON_B = 0x0004; - private static short WIIMOTE_BUTTON_A = 0x0008; - private static short WIIMOTE_BUTTON_MINUS = 0x0010; - private static short WIIMOTE_BUTTON_ZACCEL_BIT6 = 0x0020; - private static short WIIMOTE_BUTTON_ZACCEL_BIT7 = 0x0040; - private static short WIIMOTE_BUTTON_HOME = 0x0080; - private static short WIIMOTE_BUTTON_LEFT = 0x0100; - private static short WIIMOTE_BUTTON_RIGHT = 0x0200; - private static short WIIMOTE_BUTTON_DOWN = 0x0400; - private static short WIIMOTE_BUTTON_UP = 0x0800; - private static short WIIMOTE_BUTTON_PLUS = 0x1000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT4 = 0x2000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT5 = 0x4000; - private static int WIIMOTE_BUTTON_UNKNOWN = 0x8000; - private static short WIIMOTE_BUTTON_ALL = 0x1F9F; - - /* Buttons */ - private short buttonsJustPressed = 0; - private short buttonsJustReleased = 0; - private short buttonsHeld = 0; - - /** - * Constructor of the button Event. - * @param id id of the wiimote concerned. - * @param buttonsJustPressed buttons just pressed. - * @param buttonsJustReleased buttons just released. - * @param buttonsHeld buttons just held. - */ - public ButtonsEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld){ - super(id); - setAllButtons(buttonsJustPressed, buttonsJustReleased, buttonsHeld); - } - - /** - * Set all buttons in one method. - * - * @param buttonsJustPressed - * @param buttonsJustReleased - * @param buttonsHeld - */ - private void setAllButtons(short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - this.buttonsJustPressed = buttonsJustPressed; - this.buttonsJustReleased = buttonsJustReleased; - this.buttonsHeld = buttonsHeld; - } - - /** - * Get the short storing the buttons just pressed - * - * @return the short storing the buttons just pressed - */ - public short getButtonsJustPressed() { - return buttonsJustPressed; - } - - /** - * Get the short storing the buttons just released - * - * @return the short storing the buttons just released - */ - public short getButtonsJustReleased() { - return buttonsJustReleased; - } - - /** - * get the short storing the buttons held - * - * @return the short storing the buttons held - */ - public short getButtonsHeld() { - return buttonsHeld; - } - - /** **************** BUTTONS Methods ***************** */ - /* generic button functions */ - - private boolean buttonTest(short buttonBitsDefinition, short buttons) { - return (buttons & buttonBitsDefinition) == buttonBitsDefinition; - } - - private boolean isButtonJustPressed(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustPressed) - && !isButtonHeld(buttonBitsDefinition); - } - - private boolean isButtonJustReleased(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustReleased); - } - - private boolean isButtonHeld(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsHeld); - } - - private boolean isButtonPressed(short buttonBitsDefinition) { - return isButtonHeld(buttonBitsDefinition)||isButtonJustPressed(buttonBitsDefinition); - } - /* Button ONE */ - - public boolean isButtonOneJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneHeld() { - return isButtonHeld(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOnePressed() { - return isButtonPressed(WIIMOTE_BUTTON_ONE); - } - - /* Button TWO */ - - public boolean isButtonTwoJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoHeld() { - return isButtonHeld(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoPressed() { - return isButtonPressed(WIIMOTE_BUTTON_TWO); - } - - /* Button A */ - - public boolean isButtonAJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAHeld() { - return isButtonHeld(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAPressed() { - return isButtonPressed(WIIMOTE_BUTTON_A); - } - - /* Button B */ - - public boolean isButtonBJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBHeld() { - return isButtonHeld(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBPressed() { - return isButtonPressed(WIIMOTE_BUTTON_B); - } - - /* Button LEFT */ - - public boolean isButtonLeftJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftHeld() { - return isButtonHeld(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftPressed() { - return isButtonPressed(WIIMOTE_BUTTON_LEFT); - } - - /* Button RIGHT */ - - public boolean isButtonRightJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightHeld() { - return isButtonHeld(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightPressed() { - return isButtonPressed(WIIMOTE_BUTTON_RIGHT); - } - - /* Button UP */ - - public boolean isButtonUpJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpHeld() { - return isButtonHeld(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpPressed() { - return isButtonPressed(WIIMOTE_BUTTON_UP); - } - - /* Button DOWN */ - - public boolean isButtonDownJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownHeld() { - return isButtonHeld(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownPressed() { - return isButtonPressed(WIIMOTE_BUTTON_DOWN); - } - - /* Button - */ - - public boolean isButtonMinusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_MINUS); - } - - /* Button + */ - - public boolean isButtonPlusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_PLUS); - } - - /* Button HOME */ - - public boolean isButtonHomeJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeHeld() { - return isButtonHeld(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomePressed() { - return isButtonPressed(WIIMOTE_BUTTON_HOME); - } - - @Override - public String toString() { - String out = ""; - /* Display buttons */ - out += "/******** Buttons ********/\n"; - out += "--- Buttons just pressed : " + buttonsJustPressed + "\n"; - out += "--- Buttons just released : " + buttonsJustReleased + "\n"; - out += "--- Buttons held : " + buttonsHeld + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/DisconnectionEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/DisconnectionEvent.java deleted file mode 100644 index 341b626..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/DisconnectionEvent.java +++ /dev/null @@ -1,44 +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.wiiuseapievents; - -/** - * Class representing a disconnection event. - * @author guiguito - */ -public class DisconnectionEvent extends WiiUseApiEvent { - - /** - * Construct the DisconnectionEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public DisconnectionEvent(int id) { - super(id,WiiUseApiEvent.DISCONNECTION_EVENT); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** DISCONNECTION EVENT : WIIMOTE ID :" + super.getWiimoteId() + " ********/\n"; - - return out; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/EventsGatherer.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/EventsGatherer.java deleted file mode 100644 index 5c83d78..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/EventsGatherer.java +++ /dev/null @@ -1,241 +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.wiiuseapievents; - -/** - * This class is used to gather events during a call to the Wiiuse API. - * - * @author guiguito - */ -public class EventsGatherer { - - private WiiUseApiEvent[] events; - private int index = 0; - private GenericEvent genericEvent = null; - - /** - * Create EventsGatherer. - * - * @param nbWiimotes - * nb wiimotes (nb a of events possible in a call to Wiiuse API) - */ - public EventsGatherer(int nbWiimotes) { - events = new WiiUseApiEvent[nbWiimotes]; - } - - /** - * Add an event to the array. - * - * @param e - * the event to add. - */ - private void addEvent(WiiUseApiEvent e) { - events[index] = e; - index++; - } - - /** - * Prepare a wiimote event to add. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public void prepareWiiMoteEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - genericEvent = new GenericEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public void prepareIRevent(int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - genericEvent.prepareIRevent(x, y, z, ax, ay, xVRes, yVRes, xOffset, - yOffset, sensorBarPostion, screenAsPectRatio); - - } - - /** - * Add an IR point to the WiiMoteEvent prepared - * - * @param x - * x coordinates - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRPointToPreparedWiiMoteEvent(int x, int y, short rx, - short ry, short size) { - if (genericEvent != null) { - genericEvent.addIRpoint(x, y, rx, ry, size); - } - } - - /** - * Set orientation and gravity force of the prepared event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public void addMotionSensingValues(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - if (genericEvent != null) { - genericEvent.setMotionSensingEvent(orientationThreshold, - accelerationThreshold, smoothingState, alphaSmooth, r, p, - ya, x, y, z, xx, yy, zz); - } - } - - /** - * Add the prepared WiimoteEvent to the gatherer. - */ - public void addWiimoteEvent() { - if (genericEvent != null) { - addEvent(genericEvent); - genericEvent = null; - } - } - - /** - * Add a StatusEvent to the gatherer. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public void addStatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - StatusEvent evt = new StatusEvent(id, connect, batt, led, speak, - attach, rumbleState, continuousState, irState, - motionSensingState); - addEvent(evt); - } - - /** - * Add a DisconnectionEvent to the gatherer. - * - * @param id - * id of the wiimote - */ - public void addDisconnectionEvent(int id) { - DisconnectionEvent evt = new DisconnectionEvent(id); - addEvent(evt); - } - - /** - * Return an array containing the events. - * - * @return events received - */ - public WiiUseApiEvent[] getEvents() { - return java.util.Arrays.copyOfRange(events, 0, index); - } - - /** - * Clear the gatherer and remove objects. - */ - public void clearEvents() { - for (int i = 0; i < events.length; i++) { - events[i] = null; - } - genericEvent = null; - index = 0; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/GenericEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/GenericEvent.java deleted file mode 100644 index e8ea39b..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/GenericEvent.java +++ /dev/null @@ -1,227 +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.wiiuseapievents; - -/** - * Class that is a bean to be filled by the wiiuse API. - * - * @author guiguito - */ -public class GenericEvent extends WiiUseApiEvent { - - ButtonsEvent buttonsEvent = null; - IREvent infraredEvent = null; - MotionSensingEvent motionSensingEvent = null; - - /** - * Construct the Wiimote setting up the id. - * - * @param id - * the Wiimote id - */ - public GenericEvent(int id) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - } - - /** - * Construct the Wiimote setting up the id and the buttons. - * - * @param id - * the Wiimote id - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public GenericEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - buttonsEvent = new ButtonsEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Tell if there is an IR Event. - * - * @return TRUE if there is an IR event. - */ - public boolean isThereIrEvent() { - return infraredEvent != null; - } - - /** - * Tell if there is a motion sensing Event. - * - * @return TRUE if there is a motion sensing event. - */ - public boolean isThereMotionSensingEvent() { - return motionSensingEvent != null; - } - - /** - * Get buttons event. - * - * @return the buttons event. - */ - public ButtonsEvent getButtonsEvent() { - return buttonsEvent; - } - - /** - * Get IR event. - * - * @return the IR event if there is one or null. - */ - public IREvent getIREvent() { - return infraredEvent; - } - - /** - * Get motion sensing event. - * - * @return the motion sensing event if there is one or null. - */ - public MotionSensingEvent getMotionSensingEvent() { - return motionSensingEvent; - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public void prepareIRevent(int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - if (infraredEvent == null) { - infraredEvent = new IREvent(getWiimoteId(), x, y, z, ax, ay, xVRes, - yVRes, xOffset, yOffset, sensorBarPostion, - screenAsPectRatio); - } - } - - /** - * Add an IR point to the generic event. Create an IR Event if it's not - * created yet. - * - * @param x - * x coordinates. - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - if (infraredEvent != null) - infraredEvent.addIRpoint(x, y, rx, ry, size); - } - - /** - * Set the Motion Sensing Event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public void setMotionSensingEvent(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - motionSensingEvent = new MotionSensingEvent(getWiimoteId(), - orientationThreshold, accelerationThreshold, smoothingState, - alphaSmooth, r, p, ya, x, y, z, xx, yy, zz); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** GENERIC EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - - out += buttonsEvent; - - if (infraredEvent != null) { - out += infraredEvent; - } else { - out += "/******** IR Tracking ********/\n"; - out += "--- Active : false\n"; - } - - if (motionSensingEvent != null) { - out += motionSensingEvent; - } else { - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : false \n"; - } - - return out; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/IREvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/IREvent.java deleted file mode 100644 index 6007e97..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/IREvent.java +++ /dev/null @@ -1,285 +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.wiiuseapievents; - -import wiiusej.values.IRSource; - -/** - * Class which represents an IR event. - * - * @author guiguito - */ -public class IREvent extends WiimoteEvent { - - /* IR Tracking */ - private IRSource[] IRPoints; - private short indexPoints = 0; - private int x; - private int y; - private int z;// distance from the sensor bar - private int ax; - private int ay; - private int xVRes; - private int yVRes; - private int xOffset; - private int yOffset; - private short sensorBarPostion; - private short screenAsPectRatio; - - static private short WIIUSE_IR_ABOVE = 0; - static private short WIIUSE_IR_BELOW = 1; - static private short WIIUSE_SCREEN_RATIO_4_3 = 0; - static private short WIIUSE_SCREEN_RATIO_16_9 = 1; - - private static short NB_POINTS = 4;// number of points IR can track - - /** - * Constructor of IREvent with full infos. - * - * @param id - * d of the wiimote concerned. - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - */ - public IREvent(int id, int x, int y, int z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio) { - super(id); - this.x = x; - this.y = y; - this.z = z; - this.ax = ax; - this.ay = ay; - this.xVRes = xVRes; - this.yVRes = yVRes; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.sensorBarPostion = sensorBarPostion; - this.screenAsPectRatio = screenAsPectRatio; - IRPoints = new IRSource[NB_POINTS]; - } - - /** - * Get list of IR points. - * - * @return the list of 2D points - */ - public IRSource[] getIRPoints() { - return java.util.Arrays.copyOfRange(IRPoints, 0, indexPoints); - } - - /** - * Add IR Point in the list (Max 4 points) - * - * @param x - * x value - * @param y - * y value - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - IRPoints[indexPoints] = new IRSource(x, y, rx, ry, size); - indexPoints++; - return; - } - - /** - * Return calculated X coordinate. - * - * @return the x - */ - public int getX() { - return x; - } - - /** - * Return calculated Y coordinate. - * - * @return the y - */ - public int getY() { - return y; - } - - /** - * Return calculated distance. - * - * @return the z - */ - public int getZ() { - return z; - } - - /** - * Return absolute X coordinate. - * - * @return the ax - */ - public int getAx() { - return ax; - } - - /** - * Return absolute Y coordinate. - * - * @return the ay - */ - public int getAy() { - return ay; - } - - /** - * Return IR virtual screen x resolution. - * - * @return the xVRes - */ - public int getXVRes() { - return xVRes; - } - - /** - * Return IR virtual screen y resolution. - * - * @return the yVRes - */ - public int getYVRes() { - return yVRes; - } - - /** - * Return IR X correction offset. - * - * @return the xOffset - */ - public int getXOffset() { - return xOffset; - } - - /** - * Return IR Y correction offset. - * - * @return the yOffset - */ - public int getYOffset() { - return yOffset; - } - - /** - * Return true if the sensor bar is above. - * - * @return true if the sensor bar is above. - */ - public boolean isSensorBarAbove() { - return sensorBarPostion == WIIUSE_IR_ABOVE; - } - - /** - * Return true if the sensor bar is below. - * - * @return true if the sensor bar is below. - */ - public boolean isSensorBarBelow() { - return sensorBarPostion == WIIUSE_IR_BELOW; - } - - /** - * Return true if screen aspect ratio set is 4/3. - * - * @return true if screen aspect ratio set is 4/3. - */ - public boolean isScreenAspectRatio43() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_4_3; - } - - /** - * Return true if screen aspect ratio set is 16/9. - * - * @return true if screen aspect ratio set is 16/9. - */ - public boolean isScreenAspectRatio169() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_16_9; - } - - /** - * Return aspect ratio of the screen. - * - * @return the screenAsPectRatio - */ - public short getScreenAsPectRatio() { - return screenAsPectRatio; - } - - @Override - public String toString() { - String out = ""; - /* Display IR Tracking */ - out += "/******** IR Tracking ********/\n"; - out += "--- Active : true\n"; - out += "--- calculated X coordinate : " + x + "\n"; - out += "--- calculated Y coordinate : " + y + "\n"; - out += "--- calculated distance : " + z + "\n"; - out += "--- absolute X coordinate : " + ax + "\n"; - out += "--- absolute Y coordinate : " + ay + "\n"; - out += "--- IR virtual screen x resolution : " + xVRes + "\n"; - out += "--- IR virtual screen y resolution : " + yVRes + "\n"; - out += "--- IR X correction offset : " + xOffset + "\n"; - out += "--- IR Y correction offset : " + yOffset + "\n"; - if (isScreenAspectRatio43()) { - out += "--- aspect ratio of the screen : 4/3\n"; - } else if (isScreenAspectRatio169()) { - out += "--- aspect ratio of the screen : 16/9\n"; - } - if (isSensorBarAbove()) { - out += "--- IR sensor bar position. : Above\n"; - } else if (isSensorBarBelow()) { - out += "--- IR sensor bar position. : Below\n"; - } - out += "--- Seen points\n"; - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] != null) { - out += IRPoints[i].toString(); - } - } - out += "\n"; - return out; - } -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/MotionSensingEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/MotionSensingEvent.java deleted file mode 100644 index 6ec7712..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/MotionSensingEvent.java +++ /dev/null @@ -1,194 +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.wiiuseapievents; - -import wiiusej.values.GForce; -import wiiusej.values.Orientation; -import wiiusej.values.RawAcceleration; - -/** - * Class which represents a motion sensing event. - * - * @author guiguito - */ -public class MotionSensingEvent extends WiimoteEvent { - - /* Motion Sensing */ - private Orientation orientation; - private GForce gforce; - private RawAcceleration acceleration; - - private float orientationThreshold = 0; - private int accelerationThreshold = 0; - private float alphaSmoothing = 0; - private boolean isSmoothingActive = false; - - /** - * Constructor for a Motion Sensing Event. - * - * @param id - * id of the wiimote concerned. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer - * @param smoothingState - * true if smoothing flag is activated - * @param alphaSmooth - * value of the alpha smoothing parameter - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - public MotionSensingEvent(int id, float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float x, float y, - float z, short xx, short yy, short zz) { - super(id); - this.orientationThreshold = orientationThreshold; - this.accelerationThreshold = accelerationThreshold; - this.isSmoothingActive = smoothingState; - this.alphaSmoothing = alphaSmooth; - setOrientationAndGforce(r, p, ya, x, y, z, xx, yy, zz); - } - - /** - * Set orientation, gravity force and raw acceleration. - * - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - private void setOrientationAndGforce(float r, float p, float ya, float x, - float y, float z, short xx, short yy, short zz) { - this.orientation = new Orientation(r, p, ya); - this.gforce = new GForce(x, y, z); - this.acceleration = new RawAcceleration(xx, yy, zz); - } - - /** - * @return the orientation - */ - public Orientation getOrientation() { - return orientation; - } - - /** - * Get the gravity force. - * - * @return the gforce - */ - public GForce getGforce() { - return gforce; - } - - /** - * Get the raw acceleration. - * - * @return the raw acceleration - */ - public RawAcceleration getRawAcceleration() { - return acceleration; - } - - /** - * Get orientation threshold. - * - * @return the orientationThreshold - */ - public float getOrientationThreshold() { - return orientationThreshold; - } - - /** - * Get acceleration threshold. - * - * @return the accelerationThreshold - */ - public int getAccelerationThreshold() { - return accelerationThreshold; - } - - /** - * Get alpha smoothing. - * - * @return the alphaSmoothing - */ - public float getAlphaSmoothing() { - return alphaSmoothing; - } - - /** - * Tell if the option SMOOTHING is activated. - * - * @return the isSmoothingActive - */ - public boolean isSmoothingActive() { - return isSmoothingActive; - } - - @Override - public String toString() { - String out = ""; - /* Motion sensing */ - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : true \n"; - out += "--- Orientation threshold value ? : " + orientationThreshold - + "\n"; - out += "--- Acceleration threshold value ? : " + accelerationThreshold - + "\n"; - out += "--- Alpha smoothing threshold value ? : " + alphaSmoothing - + "\n"; - out += "--- Smoothing ? : " + isSmoothingActive + "\n"; - out += "--- " + orientation + "\n"; - out += "--- " + gforce + "\n"; - out += "--- " + acceleration + "\n"; - return out; - } -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/StatusEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/StatusEvent.java deleted file mode 100644 index 7a365fc..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/StatusEvent.java +++ /dev/null @@ -1,258 +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.wiiuseapievents; - -/** - * Class used to represent a status event. This class is used to know what are - * the settings of the wiimote. - * - * @author guiguito - */ -public class StatusEvent extends WiiUseApiEvent { - - private static short WIIMOTE_LED_1 = 1; - private static short WIIMOTE_LED_2 = 2; - private static short WIIMOTE_LED_3 = 4; - private static short WIIMOTE_LED_4 = 8; - - /* ATTACHMENT CONSTANTS */ - - private static short EXP_NONE = 0; - private static short EXP_NUNCHUK = 1; - private static short EXP_CLASSIC = 2; - private static short EXP_GUITAR_HERO_3 = 3; - - /* Status variables */ - private boolean connected = false; - - private float batteryLevel = -1; - - private short leds = 0; - - private boolean isSpeakerEnabled = false; - - private int attachment = 0; - - private boolean isRumbleActive = false; - - private boolean isContinuousActive = false; - - private boolean isIrActive = false; - - private boolean isMotionSensingActive = false; - - /** - * Construct the StatusEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public StatusEvent(int id) { - super(id, WiiUseApiEvent.STATUS_EVENT); - } - - /** - * Build a StatusEvent with all fields set. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public StatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - super(id, WiiUseApiEvent.STATUS_EVENT); - connected = connect; - this.batteryLevel = batt; - this.leds = led; - this.isSpeakerEnabled = speak; - this.attachment = attach; - isRumbleActive = rumbleState; - isContinuousActive = continuousState; - isIrActive = irState; - isMotionSensingActive = motionSensingState; - } - - /** - * True if the wiimote is connected false otherwise. - * - * @return return the connected status. - */ - public boolean isConnected() { - return connected; - } - - /** - * Get battery level. - * - * @return battery level. 1 = 100% - */ - public float getBatteryLevel() { - return batteryLevel; - } - - /** - * Get status of the leds . - * - * @return a short representing LEDS turned on. - */ - public short getLeds() { - return leds; - } - - /** - * Get led1 status. - * - * @return true if the led is set. - */ - public boolean isLed1Set() { - if ((leds & WIIMOTE_LED_1) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led2 status. - * - * @return true if the led is set. - */ - public boolean isLed2Set() { - if ((leds & WIIMOTE_LED_2) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led3 status. - * - * @return true if the led is set. - */ - public boolean isLed3Set() { - if ((leds & WIIMOTE_LED_3) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led4 status. - * - * @return true if the led is set. - */ - public boolean isLed4Set() { - if ((leds & WIIMOTE_LED_4) > 0) { - return true; - } else { - return false; - } - } - - /** - * Tell if the speaker is enable for this wiimote - * - * @return TRUE if it enabled false otherwise - */ - public boolean isSpeakerEnabled() { - return isSpeakerEnabled; - } - - /** - * Get the int representing the attachment type. - * - * @return value of the Attachment Type - */ - public int getAttachment() { - return attachment; - } - - /** - * Get the status of rumble. - * - * @return true if the rumble is active false otherwise - */ - public boolean isRumbleActive() { - return isRumbleActive; - } - - /** - * Tell if the CONTINUOUS option is activated. - * - * @return the isContinuousActive - */ - public boolean isContinuousActive() { - return isContinuousActive; - } - - /** - * Tell if the IR Tracking is active. - * - * @return TRUE if it is active or false otherwise. - */ - public boolean isIrActive() { - return isIrActive; - } - - /** - * Get the flag indicating if the motion sensing is active. - * - * @return true if the motion sensing is active false otherwise - */ - public boolean isMotionSensingActive() { - return isMotionSensingActive; - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** STATUS EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - out += "--- connected : " + connected + "\n"; - out += "--- Battery level : " + batteryLevel + "\n"; - out += "--- Leds : " + leds + "\n"; - out += "--- Speaker enabled : " + isSpeakerEnabled + "\n"; - out += "--- Attachment ? : " + attachment + "\n"; - out += "--- Rumble ? : " + isRumbleActive + "\n"; - out += "--- Continuous ? : " + isContinuousActive + "\n"; - out += "--- IR active ? : " + isIrActive + "\n"; - out += "--- Motion sensing active ? : " + isMotionSensingActive + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java deleted file mode 100644 index 880c632..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiEvent.java +++ /dev/null @@ -1,62 +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.wiiuseapievents; - -/** - * This class describes the structure of an event from the WiiUse API event. - * - * @author guiguito - */ -public abstract class WiiUseApiEvent extends WiimoteEvent{ - - public static int GENERIC_EVENT = 1; - public static int STATUS_EVENT = 2; - public static int DISCONNECTION_EVENT = 3; - public static int WIIUSE_NUNCHUK_INSERTED = 4; - public static int WIIUSE_NUNCHUK_REMOVED = 5; - public static int WIIUSE_CLASSIC_CTRL_INSERTED = 6; - public static int WIIUSE_CLASSIC_CTRL_REMOVED = 7; - public static int WIIUSE_GUITAR_HERO_3_CTRL_INSERTED = 8; - public static int WIIUSE_GUITAR_HERO_3_CTRL_REMOVED = 9; - - /* Event Type */ - private int eventType; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - * @param type - * type of the event - */ - public WiiUseApiEvent(int id, int type) { - super(id); - eventType = type; - } - - /** - * Get the event type. - * @return the eventType - */ - public int getEventType() { - return eventType; - } - - public abstract String toString(); - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiListener.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiListener.java deleted file mode 100644 index 3f6bb22..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiiUseApiListener.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.wiiuseapievents; - - - -/** - * This is the interface to implement to listen to events from the wiiuse API. - * - * @author guiguito - */ -public interface WiiUseApiListener extends java.util.EventListener { - - /** - * Method called when a WiiUseApiEvent occurs. - * A WiiUseApiEvent can be : - * - GenericEvent (Storing ButtonsEvent and - * eventually IREvent and MotionSensingEvent) - * - StatusEvent - * - DisconnectionEvent - * @param e - */ - void onWiiUseApiEvent(WiiUseApiEvent e); - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteEvent.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteEvent.java deleted file mode 100644 index 1504a37..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteEvent.java +++ /dev/null @@ -1,59 +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.wiiuseapievents; - -/** - * Abstract mother class representing an event with a wiimote id. - * - * @author guiguito - */ -public abstract class WiimoteEvent { - - /* ID */ - private int wiimoteId = -1; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public WiimoteEvent(int id) { - wiimoteId = id; - } - - /** - * Get Wiimote ID - * - * @return the wiimote id. - */ - public int getWiimoteId() { - return wiimoteId; - } - - /** - * Set Wiimote ID - * - * @param wiimoteId - * id of the wiimote - */ - void setWiimoteId(int wiimoteId) { - this.wiimoteId = wiimoteId; - } - - public abstract String toString(); -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteListener.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteListener.java deleted file mode 100644 index 3ea3c05..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapievents/WiimoteListener.java +++ /dev/null @@ -1,69 +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.wiiuseapievents; - -/** - * This is the interface to implement to listen to events from wiimotes. - * The differents methods are called in this order : - * onButtonsEvent, onIrEvent, onMotionSensingEvent, onStatusEvent, onDisconnectionEvent. - * - * @author guiguito - */ -public interface WiimoteListener extends java.util.EventListener { - - /** - * Method called on a button Event. - * @param e the buttonEvent with the last informations - * about the buttons of the wiimote. - */ - void onButtonsEvent(ButtonsEvent e); - - /** - * Method called when an IR event occurs. - * @param e the IREvent with the IR points seen. - */ - void onIrEvent(IREvent e); - - /** - * Method called when a motion sensing event occurs. - * @param e the motion sensing event with orientation and acceleration. - */ - void onMotionSensingEvent(MotionSensingEvent e); - - /** - * Method called on a status event. - * A status event occurs when : - * - we ask it - * - an expansion controller has been plugged - * - an expansion controller has been unplugged - * This is where you can get the different values of - * the parameters setup on your wiimote. - * @param e the status event. - */ - void onStatusEvent(StatusEvent e); - - /** - * This is the method called when a disconnection event occurs. - * A disconnection event happens when : - * - there are no battery left - * - the wiimote has just been turned off - * - the connection is dropped - * @param e the disconnection event. - */ - void onDisconnectionEvent(DisconnectionEvent e); - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/FloatValueRequest.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/FloatValueRequest.java deleted file mode 100644 index a003239..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/FloatValueRequest.java +++ /dev/null @@ -1,71 +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.wiiuseapirequest; - -/** - * Represents a request with a float value to pass to wiiuse API. - * - * @author guiguito - */ -public class FloatValueRequest extends WiiUseApiRequest { - - private float floatValue; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public FloatValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * threshold in degrees - */ - public FloatValueRequest(int id, int type, float th) { - super(id, type); - floatValue = th; - } - - /** - * Get the float value. - * @return the float value - */ - public float getFloatValue() { - return floatValue; - } - - /** - * Set the float value. - * @param val the value to set - */ - public void setFloatValue(float val) { - this.floatValue = val; - } - - - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/IntValueRequest.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/IntValueRequest.java deleted file mode 100644 index 801093d..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/IntValueRequest.java +++ /dev/null @@ -1,74 +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.wiiuseapirequest; - -/** - * Represents a request with an int value to pass to wiiuse API. - * - * @author guiguito - */ -public class IntValueRequest extends WiiUseApiRequest { - - private int intValue; - - /** - * Constructor setting the id of the wiimote - * concerned and the type of the request. - * - * @param id - * the id of the wiimote concerned. - */ - public IntValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote - * concerned, the type of the request - * and the int value. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * the int value. - */ - public IntValueRequest(int id, int type, int th) { - super(id, type); - intValue = th; - } - - /** - * Get the int value. - * @return the int value - */ - public int getIntValue() { - return intValue; - } - - /** - * Set the int value. - * @param val the value to set - */ - public void setIntValue(int val) { - this.intValue = val; - } - - - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/LedsRequest.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/LedsRequest.java deleted file mode 100644 index 1a21024..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/LedsRequest.java +++ /dev/null @@ -1,125 +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.wiiuseapirequest; - -/** - * Represents a request to set leds of the wiimote with WiiUse API. - * - * @author guiguito - */ -public class LedsRequest extends wiiusej.wiiuseapirequest.WiiUseApiRequest { - - private boolean led1, led2, led3, led4; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - */ - public LedsRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - * @param l1 - * led1 status. True=ON, False=OFF - * @param l2 - * led2 status. True=ON, False=OFF - * @param l3 - * led3 status. True=ON, False=OFF - * @param l4 - * led4 status. True=ON, False=OFF - */ - public LedsRequest(int id, int type, boolean l1, boolean l2, boolean l3, - boolean l4) { - super(id, type); - led1 = l1; - led2 = l2; - led3 = l3; - led4 = l4; - } - - /** - * @return the led1 - */ - public boolean isLed1() { - return led1; - } - - /** - * @param led1 - * the led1 to set - */ - public void setLed1(boolean led1) { - this.led1 = led1; - } - - /** - * @return the led2 - */ - public boolean isLed2() { - return led2; - } - - /** - * @param led2 - * the led2 to set - */ - public void setLed2(boolean led2) { - this.led2 = led2; - } - - /** - * @return the led3 - */ - public boolean isLed3() { - return led3; - } - - /** - * @param led3 - * the led3 to set - */ - public void setLed3(boolean led3) { - this.led3 = led3; - } - - /** - * @return the led4 - */ - public boolean isLed4() { - return led4; - } - - /** - * @param led4 - * the led4 to set - */ - public void setLed4(boolean led4) { - this.led4 = led4; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java deleted file mode 100644 index 98e907e..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/TwoIntValueRequest.java +++ /dev/null @@ -1,73 +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.wiiuseapirequest; - - -/** - * Represents a request with two int values to pass to wiiuse API. - * - * @author guiguito - */ -public class TwoIntValueRequest extends IntValueRequest { - - private int secondIntValue; - - /** - * Constructor setting the id of the wiimote - * concerned and the type of the request. - * - * @param id the id of the wiimote concerned. - * @param type type of the request - */ - public TwoIntValueRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote - * concerned, the type of the request - * and the two int values. - * - * @param id the id of the wiimote concerned. - * @param type type of the request - * @param x first int value. - * @param y second int value. - */ - public TwoIntValueRequest(int id, int type, int x, int y) { - super(id, type, x); - secondIntValue = y; - } - - /** - * Get the second int value. - * @return the secondIntValue - */ - public int getSecondIntValue() { - return secondIntValue; - } - - /** - * Set the second int value. - * @param secondIntValue the secondIntValue to set. - */ - public void setSecondIntValue(int secondIntValue) { - this.secondIntValue = secondIntValue; - } - - - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java b/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java deleted file mode 100644 index 1f4525b..0000000 --- a/WiiUseJ_0.11ThreadReqeuests/src/wiiusej/wiiuseapirequest/WiiUseApiRequest.java +++ /dev/null @@ -1,112 +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.wiiuseapirequest; - -/** - * Represents a request we could do to the WiiUse API. - * - * @author guiguito - */ -public class WiiUseApiRequest { - - public static int WIIUSE_STATUS_REQUEST = 1; - public static int WIIUSE_ACTIVATE_SMOOTHING_REQUEST = 2; - public static int WIIUSE_DEACTIVATE_SMOOTHING_REQUEST = -2; - public static int WIIUSE_ACTIVATE_IR_TRACKING_REQUEST = 3; - public static int WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST = -3; - public static int WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST = 4; - public static int WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST = -4; - public static int WIIUSE_CLOSE_CONNECTION_REQUEST = 5; - public static int WIIUSE_ACTIVATE_CONTINUOUS_REQUEST = 6; - public static int WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST = -6; - public static int WIIUSE_ACTIVATE_RUMBLE_REQUEST = 7; - public static int WIIUSE_DEACTIVATE_RUMBLE_REQUEST = -7; - public static int WIIUSE_LEDS_REQUEST = 8; - public static int WIIUSE_ORIENT_THRESHOLHD_REQUEST = 9; - public static int WIIUSE_ACCEL_THRESHOLHD_REQUEST = 10; - public static int WIIUSE_ALPHA_SMOOTHING_REQUEST = 11; - public static int WIIUSE_RESYNC = 12; - public static int WIIUSE_ASPECT_RATIO_4_3 = 13; - public static int WIIUSE_ASPECT_RATIO_16_9 = 14; - public static int WIIUSE_SENSOR_BAR_ABOVE = 15; - public static int WIIUSE_SENSOR_BAR_BELOW = 16; - public static int WIIUSE_SET_VIRTUAL_RESOLUTION = 17; - - private int wiimoteId = 0; - private int requestType = 0; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public WiiUseApiRequest(int id) { - wiimoteId = id; - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * - */ - public WiiUseApiRequest(int id, int type) { - wiimoteId = id; - requestType = type; - } - - /** - * Get id of the wiimote concerned by this request. - * - * @return id of the wiimote concerned - */ - public int getId() { - return wiimoteId; - } - - /** - * Set id of the wiimote concerned by this request. - * - * @param id - * id fh the wiimote concernet - */ - public void setId(int id) { - wiimoteId = id; - } - - /** - * Get the request type. - * - * @return the requestType - */ - public int getRequestType() { - return requestType; - } - - /** - * Set the request type. - * - * @param requestType - * the requestType to set - */ - public void setRequestType(int requestType) { - this.requestType = requestType; - } - -} diff --git a/WiiUseJ_0.11ThreadReqeuests/wiiuse.dll b/WiiUseJ_0.11ThreadReqeuests/wiiuse.dll deleted file mode 100644 index 6855619edad1c5156421d3af3983f527fe6db9ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 zcmeFaeS8!}wm06B=}9`tBt6Ikf<_52xY2+&8gPjNng|o3k~kq`Lc}EOF6L&lzOdM> zhzU%#6P->oiqER6*O!$?@BO)V-`xA`0=_a~FfWK2z+E#y*x<6-aS)@hNx+!-eNXjF zGO+INbDw+f=l7RRXys_K;9wv97$9LM7qiE!L5yy;ⅆWhv29TXT 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%0DW3JW=zRe^+{#()v8bV)K4_M-8%`rIzQ0g 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 - - - - - diff --git a/WiiUseJ_0.12/.project b/WiiUseJ_0.12/.project deleted file mode 100644 index 9485f4a..0000000 --- a/WiiUseJ_0.12/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - WiiUseJava - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/WiiUseJ_0.12/.settings/org.eclipse.jdt.ui.prefs b/WiiUseJ_0.12/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 81f7b8f..0000000 --- a/WiiUseJ_0.12/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,3 +0,0 @@ -#Thu May 08 01:25:43 CEST 2008 -eclipse.preferences.version=1 -org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/WiiUseJ_0.12/README.TXT b/WiiUseJ_0.12/README.TXT deleted file mode 100644 index ba8e176..0000000 --- a/WiiUseJ_0.12/README.TXT +++ /dev/null @@ -1,56 +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 . - */ - - -WiiuseJ is a java API to use wiimotes on your computer. This API is built on top of an excellent API call Wiiuse using JNI. - -WiiuseJ intent to be a very simple, easy to use and lightweight java API for wiimotes. - -Some of the great aspects of this API are : - - * The compatibility which is as large as Wiiuse's API compatibility - - * Cross-platform : Windows and linux (like Wiiuse) - - * Easy to use - - -WiiuseJ is made by Guilhem Duché : guiguito1@hotmail.com. -You can contact me if you need more information. - -Go to : http://wiiusej.googlecode.com/ for further documentations. - - - -CHANGELOG : - -wiiusej 0.12 : -- added nunchuk support. -- all new stuffs from wiiuse 0.12. -- added timeout method. -- added IR sensitivity. -- updated to be able to reconnect wiimotes. -- new architecture behind the scene. -- cleaning of the project. - -wiiusej 0.11 : -- updated with new stuffs from wiiuse 0.11. -- Linux version. -- selectionnable rumble on wiimotes connection. - -wiiusej 0.1 : -- first version on wiiuse 0.1. \ No newline at end of file diff --git a/WiiUseJ_0.12/WiiUseJ.dll b/WiiUseJ_0.12/WiiUseJ.dll deleted file mode 100644 index aeebf074fd0f7c8a792644a62f9f2f42686bf09a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30473 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%0DhO3{%PeE6n}D<^ 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 W8wDsT*@Df(ctTw;crkI^@P7e1{>1+P diff --git a/WiiUseJ_0.12/img/wiimote.png b/WiiUseJ_0.12/img/wiimote.png deleted file mode 100644 index 3f26f5202b22a89c5fa3e1c1eb524f78e4e76e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44340 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.12/libWiiuseJ.so b/WiiUseJ_0.12/libWiiuseJ.so deleted file mode 100644 index 0caea089a41f707ad3162de0ab895835a0dad99b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19652 zcmeHPdvsLQxj&OcjFOUo(Ne)W*jR%?5+J-P*5NTgTmg|JND&<-$-oRwX3}{ew4o*r zsYy>msYvVcY8S12*e-3U@@h-lNNB;Ut%|KBUecRVY==S>yU>d*HTU=1XYZLak29gJ z{&Uy5JL@}p|MvIoZ-4uF_BnID-0!SiXtUWg74o%wO`t0@ts0q&XBeDn&8`(_<+xsB z@KpiCXDbZ4gn1>J!LLGEQY#d;fksGv9^z8)6uk^gBEJB1#~YDmL>WQxuLoy7=)<5} zr4-9u4I)p4OOcoaDh5piIY10If~J9{fIbGg88i>XFd9?|DgxaA8U>mKngC+B2{azW zZn*|@If%_EMj|c&jgeT48`5PGo1;%i@FB#7GF>X;u`*^f88j305dwrO zK^zPA5zCPrnpW?y6}CP3u}SmnQ%;mb3JSHwQ@;6p-q*)`q@&=;xs+v4eP&0R{i5tr zW6O54&&+{i%CX^io5z7;$?@S>bBx#@w3C5-$iOzTkJ!%+5Q7?vJ-`3n)35*am8mVG ze=%du*G4~A_p4i<`^&3uje75$=`q*Dy;t7w`pec?!C-;U#Nyua^5zk7P6_g&9d zPj}Vz|Hm`mjvu}J&#&%Sdh@u|m7Sme-c;X`HNQSyJ?+6c)9#qPJ@393`aivL{FWP| zum0qZ54E+uRy6A8V;-%Y818+q{zpH1Z@%-lXP)nP@BR^AJN(i2cW Mo+a3RGvS$ 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 B4XOYD diff --git a/WiiUseJ_0.12/libwiiuse.so b/WiiUseJ_0.12/libwiiuse.so deleted file mode 100644 index 481e0e20e582d736d0abaeef24676b37ffcfea74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40551 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 b94{+aBCMtls^Z2`o<2PH(8ie|)cSt|kSxZ* diff --git a/WiiUseJ_0.12/src/img/wiimote.png b/WiiUseJ_0.12/src/img/wiimote.png deleted file mode 100644 index 3f26f5202b22a89c5fa3e1c1eb524f78e4e76e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44340 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 z 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 Ef|!^34gdfE diff --git a/WiiUseJ_0.12/src/wiiusej/WiiUseApi.java b/WiiUseJ_0.12/src/wiiusej/WiiUseApi.java deleted file mode 100644 index 428f522..0000000 --- a/WiiUseJ_0.12/src/wiiusej/WiiUseApi.java +++ /dev/null @@ -1,351 +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; - -import wiiusej.wiiusejevents.utils.EventsGatherer; - -/** - * Singleton used to manipulate WiiUse Api. - * - * @author guiguito - */ -public class WiiUseApi { - - static { - System.loadLibrary("WiiuseJ"); - } - - private static WiiUseApi instance = new WiiUseApi(); - - /** - * Get the only instance of WiiUseApi. - * - * @return the only instace of WiiUseApi. - */ - protected static WiiUseApi getInstance() { - return instance; - } - - /** - * Connect to a wiimote or wiimotes once an address is known. - * - * @param nbWiimotes - * The number of wiimotes. - * @return The number of wiimotes that successfully connected. - */ - synchronized native int connect(int nbWiimotes); - - /** - * Find a wiimote or wiimotes. - * - * @param nbMaxWiimotes - * The number of wiimotes. - * @param timeout - * The number of seconds before the search times out. - * @return The number of wiimotes found. - */ - synchronized native int find(int nbMaxWiimotes, int timeout); - - /** - * Initialize an array of wiimote structures (for the C side of the - * library). - * - * @param nbPossibleWiimotes - * size of the array. - */ - synchronized native void init(int nbPossibleWiimotes); - - /** - * Close connection to the wiimote with the given id. - * - */ - synchronized native void closeConnection(int id); - - /** - * Get unique id of a wiimote in the wiimotes array. Please make sure you - * call an existing index with a wiimote initialized at this index, other - * wise you'll get a wrong value. - * - * @param index - * index of the wiimote in the wiimotes array. - * @return the unid of the wiimote, or a wrong value if the index was false. - * - */ - synchronized native int getUnId(int index); - - /** - * CleanUp Wiiuse API. - */ - synchronized native void cleanUp(); - - /** - * Activate rumble on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - synchronized native void activateRumble(int id); - - /** - * Deactivate rumble on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - synchronized native void deactivateRumble(int id); - - /** - * Activate IR Tracking on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - synchronized native void activateIRTracking(int id); - - /** - * Deactivate IR Tracking on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - synchronized native void deactivateIRTracking(int id); - - /** - * Activate motion sensing on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - synchronized native void activateMotionSensing(int id); - - /** - * Deactivate motion sensing on the wiimote with the given id. - * - * @param id - * the id of the wiimote. - */ - synchronized native void deactivateMotionSensing(int id); - - /** - * Set wiimote leds status. - * - * @param id - * the id of the wiimote concerned. - * @param led1 - * status of led1: True=ON, False=OFF. - * @param led2 - * status of led2: True=ON, False=OFF. - * @param led3 - * status of led3: True=ON, False=OFF. - * @param led4 - * status of led4: True=ON, False=OFF. - */ - synchronized native void setLeds(int id, boolean led1, boolean led2, - boolean led3, boolean led4); - - /** - * Set how many degrees an angle must change to generate an event. - * - * @param id - * id of the wiimote concerned. - * @param angle - * minimum angle detected by an event. - */ - synchronized native void setOrientThreshold(int id, float angle); - - /** - * Set how much acceleration must change to generate an event. - * - * @param id - * id of the wiimote concerned. - * @param value - * minimum value detected by an event. - */ - synchronized native void setAccelThreshold(int id, int value); - - /** - * Set alpha smoothing parameter for the given id. - * - * @param id - * id of the wiimote concerned. - * @param value - * alpha smoothing value. - */ - synchronized native void setAlphaSmoothing(int id, float value); - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote concerned. - */ - synchronized native void reSync(int id); - - /** - * Make the the accelerometers give smoother results. This is set by - * default. - * - * @param id - * the id of the wiimote concerned. - */ - synchronized native void activateSmoothing(int id); - - /** - * Make the the accelerometers give raw results. - * - * @param id - * the id of the wiimote concerned. - */ - synchronized native void deactivateSmoothing(int id); - - /** - * Make the wiimote generate an event each time we poll. Not set by default. - * - * @param id - * the id of the wiimote concerned. - */ - synchronized native void activateContinuous(int id); - - /** - * Make the wiimote generate an event only when there is one. - * - * @param id - * the id of the wiimote concerned. - */ - synchronized native void deactivateContinuous(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 4/3. - * - * @param id - * the id of the wiimote of which we want the status. - */ - synchronized native void setScreenRatio43(int id); - - /** - * Notify wiiuse that your screen has an aspect ratio of 16/9. - * - * @param id - * the id of the wiimote of which we want the status. - */ - synchronized native void setScreenRatio169(int id); - - /** - * Notify wiiuse that the sensor bar is above your screen. - * - * @param id - * the id of the wiimote of which we want the status. - */ - synchronized native void setSensorBarAboveScreen(int id); - - /** - * Notify wiiuse that the sensor bar is below your screen. - * - * @param id - * the id of the wiimote of which we want the status. - */ - synchronized native void setSensorBarBelowScreen(int id); - - /** - * Set virtual screen resolution. It is used to automatically compute the - * position of a cursor on this virtual screen using the sensor bar. These - * results come in the IREvent. - * - * @param id - * the id of the wiimote of which we want the status. - * @param x - * x resolution. - * @param y - * y resolution. - */ - synchronized native void setVirtualScreenResolution(int id, int x, int y); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param id - * the id of the wiimote of which we want the status. - */ - synchronized native void getStatus(int id); - - /** - * Set the normal and expansion handshake timeouts. - * - * @param id - * the id of the wiimote concerned. - * @param normalTimeout - * The timeout in milliseconds for a normal read. - * @param expansionTimeout - * The timeout in millisecondsd to wait for an expansion - * handshake. - */ - synchronized native void setTimeout(int id, short normalTimeout, - short expansionTimeout); - - /** - * Set the IR sensitivity. - * - * @param id - * the id of the wiimote concerned. - * @param level - * 1-5, same as Wii system sensitivity setting. If the level is < - * 1, then level will be set to 1. If the level is > 5, then - * level will be set to 5. - */ - synchronized native void setIrSensitivity(int id, int level); - - /** - * Set how many degrees an angle must change to generate an event for the - * nunchuk. - * - * @param id - * id of the wiimote concerned. - * @param angle - * minimum angle detected by an event. - */ - synchronized native void setNunchukOrientationThreshold(int id, float angle); - - /** - * Set how much acceleration must change to generate an event for the - * nunchuk. - * - * @param id - * id of the wiimote concerned. - * @param value - * minimum value detected by an event. - */ - synchronized native void setNunchukAccelerationThreshold(int id, int value); - - /** - * Force the bluetooth stack type.(useful only for windows) - * - * @param bluetoothStackType - * must be WiiUseApi.WIIUSE_STACK_UNKNOWN or - * WiiUseApi.WIIUSE_STACK_MS or - * WiiUseApi.WIIUSE_STACK_BLUESOLEIL. - */ - native void windowsSetBluetoothStack(int bluetoothStackType); - - /** - * Check for new Events and Get it. - * - * @param gath - * the object where we store all the new events. - */ - native void specialPoll(EventsGatherer gath); - -} diff --git a/WiiUseJ_0.12/src/wiiusej/WiiUseApiManager.java b/WiiUseJ_0.12/src/wiiusej/WiiUseApiManager.java deleted file mode 100644 index 9378660..0000000 --- a/WiiUseJ_0.12/src/wiiusej/WiiUseApiManager.java +++ /dev/null @@ -1,662 +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; - -import java.util.concurrent.Semaphore; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiusejevents.utils.EventsGatherer; -import wiiusej.wiiusejevents.utils.WiiUseApiListener; -import wiiusej.wiiusejevents.wiiuseapievents.WiiUseApiEvent; - -/** - * Class that manages the use of Wiiuse API. - * - * @author guiguito - */ -public class WiiUseApiManager extends Thread { - - private static WiiUseApiManager instance = new WiiUseApiManager(); - - private final EventListenerList listeners = new EventListenerList(); - - private Semaphore semaphore = new Semaphore(0); - - private Wiimote[] wiimotes; - - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - - private int connected = -1; - - private AtomicBoolean running = new AtomicBoolean(false); - - private boolean leave = false; - - public static int WIIUSE_STACK_UNKNOWN = 0; - public static int WIIUSE_STACK_MS = 1; - public static int WIIUSE_STACK_BLUESOLEIL = 2; - - private static WiiUseApiManager getInstance() { - return instance; - } - - /** - * Get wiimotes. Load library if necessary. Connect to wiimotes if - * necessary. Start polling if necessary. Return an array with the connected - * wiimotes. - * - * @param nb - * try to connect nb wiimotes. - * @param rumble - * make the connected wiimotes rumble. - * - * @return an array with connected wiimotes or NULL. - */ - public static Wiimote[] getWiimotes(int nb, boolean rumble) { - return getWiimotesPrivate(nb, rumble, false, WIIUSE_STACK_UNKNOWN); - } - - /** - * Get wiimotes. Load library if necessary. Connect to wiimotes if - * necessary. Start polling if necessary. Return an array with the connected - * wiimotes. - * - * @param nb - * try to connect nb wiimotes. - * @param rumble - * make the connected wiimotes rumble.* - * @param stackType - * the stack type : WiiUseApiManager.WIIUSE_STACK_UNKNOWN or - * WiiUseApiManager.WIIUSE_STACK_MS or - * WiiUseApiManager.WIIUSE_STACK_BLUESOLEIL - * - * @return an array with connected wiimotes or NULL. - */ - public static Wiimote[] getWiimotes(int nb, boolean rumble, int stackType) { - return getWiimotesPrivate(nb, rumble, true, stackType); - } - - /** - * Get wiimotes. Load library if necessary. Connect to wiimotes if - * necessary. Start polling if necessary. Return an array with the connected - * wiimotes. - * - * @param nb - * try to connect nb wiimotes. - * @param rumble - * make the connected wiimotes rumble.* - * @param forceStackType - * true if we want to force the stack type. - * @param stackType - * the stack type : WiiUseApiManager.WIIUSE_STACK_UNKNOWN or - * WiiUseApiManager.WIIUSE_STACK_MS or - * WiiUseApiManager.WIIUSE_STACK_BLUESOLEIL - * - * @return an array with connected wiimotes or NULL. - */ - private synchronized static Wiimote[] getWiimotesPrivate(int nb, - boolean rumble, boolean forceStackType, int stackType) { - WiiUseApiManager manager = getInstance(); - - if (manager.leave) - return null;// wiiusej definitively stopped - - if (manager.connected <= 0 && !manager.running.get()) { - // connect wiimotes. - int nbWiimotes = manager.connectWiimotes(nb, rumble, - forceStackType, stackType); - manager.wiimotes = new Wiimote[nbWiimotes]; - for (int i = 0; i < nbWiimotes; i++) { - Wiimote wim = new Wiimote(WiiUseApi.getInstance().getUnId(i), - manager); - manager.wiimotes[i] = wim; - manager.addWiiUseApiListener(wim); - } - // Set leds on wiimote - for (Wiimote wiimote : manager.wiimotes) { - int id = wiimote.getId(); - if (id % 4 == 0) { - wiimote.setLeds(true, true, true, true); - } else if (id % 4 == 1) { - wiimote.setLeds(true, false, false, false); - } else if (id % 4 == 2) { - wiimote.setLeds(true, true, false, false); - } else if (id % 4 == 3) { - wiimote.setLeds(true, true, true, false); - } - } - // make the connected wiimotes rumble - if (rumble) { - for (Wiimote wiimote : manager.wiimotes) { - wiimote.activateRumble(); - } - try { - sleep(500); - } catch (InterruptedException e) { - } - for (Wiimote wiimote : manager.wiimotes) { - wiimote.deactivateRumble(); - } - } - } - - if (manager.connected == 0) {// no wiimote connected - // return empty array - return new Wiimote[0]; - } - - if (!manager.isAlive())// start wiiuseJ polling - manager.start(); - - manager.semaphore.release(1); - - return manager.wiimotes; - } - - /** - * Connect wiimote and get the number of wiimotes connected. Supposed to be - * used once. - * - * @param nb - * try to connect nb wiimotes - * @param rumble - * make the connected wiimotes rumble - * @param forceStackType - * true if we want to force the stack type. - * @param stackType - * the stack type : WiiUseApiManager.WIIUSE_STACK_UNKNOWN or - * WiiUseApiManager.WIIUSE_STACK_MS or - * WiiUseApiManager.WIIUSE_STACK_BLUESOLEIL - * @return 0 if nothing connected or the number of wiimotes connected. - */ - private int connectWiimotes(int nb, boolean rumble, boolean forceStackType, - int stackType) { - if (connected <= 0) { - int nbWiimotesFound; - wiiuse.init(nb); - // force bluetooth stack type ? - if (forceStackType) - setBlueToothstackType(stackType); - nbWiimotesFound = wiiuse.find(nb, 3); - connected = wiiuse.connect(nbWiimotesFound); - return connected; - } else {// library not loaded, no wiimotes connected - return 0; - } - } - - /** - * Ask the thread to close a connection. - * - * @param id - * id of the wiimote to disconnect. - */ - protected void closeConnection(int id) { - int index = 0; - boolean found = false; - while (index < wiimotes.length && !found) { - if (wiimotes[index].getId() == id) {// we have a wiimote with this - // id - // remove the wiimote - removeWiiUseApiListener(wiimotes[index]); - wiimotes[index] = null; - connected--; - if (connected == 0) {// stop this thread if there is - // no more wiimotes connected. - // stop thread - running.set(false); - } - /* Close connection in wiiuse */ - wiiuse.closeConnection(index); - } - index++; - } - - } - - /** - * Get the number of wiimotes connected. - * - * @return the number of wiimotes connected. - */ - public static int getNbConnectedWiimotes() { - return getInstance().connected; - } - - /** - * Stop thread and shutdown wiiuse Api. - */ - public static void shutdown() { - WiiUseApiManager manager = getInstance(); - if (manager.connected > 0) { - for (Wiimote wim : manager.wiimotes) { - if (wim != null) - wim.disconnect(); - } - } - manager.running.set(false); - manager.wiiuse.cleanUp(); - } - - /** - * Stop wiiuseJ definitively for this program. It finishes Wiiusej thread - * and shutdown wiiuse API. - */ - public static void definitiveShutdown() { - getInstance().leave = true; - shutdown(); - } - - /** - * Activate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - protected void activateRumble(int id) { - wiiuse.activateRumble(id); - } - - /** - * Deactivate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - protected void deactivateRumble(int id) { - wiiuse.deactivateRumble(id); - } - - /** - * Activate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - protected void activateIRTRacking(int id) { - wiiuse.activateIRTracking(id); - } - - /** - * Deactivate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - protected void deactivateIRTRacking(int id) { - wiiuse.deactivateIRTracking(id); - } - - /** - * Activate motion sensing for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - protected void activateMotionSensing(int id) { - wiiuse.activateMotionSensing(id); - } - - /** - * Deactivate motion sensing for the wiimoter with the given id. - * - * @param id - * id of the wiimote. - */ - protected void deactivateMotionSensing(int id) { - wiiuse.deactivateMotionSensing(id); - } - - /** - * Activate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - protected void activateSmoothing(int id) { - wiiuse.activateSmoothing(id); - } - - /** - * Deactivate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - protected void deactivateSmoothing(int id) { - wiiuse.deactivateSmoothing(id); - } - - /** - * Activate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - protected void activateContinuous(int id) { - wiiuse.activateContinuous(id); - } - - /** - * Deactivate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - protected void deactivateContinuous(int id) { - wiiuse.deactivateContinuous(id); - } - - /** - * Set leds for the wiimotes with the given id. - * - * @param id - * id of the wiimote - * @param l1 - * status of led1. True : ON, False : OFF. - * @param l2 - * status of led2. True : ON, False : OFF. - * @param l3 - * status of led3. True : ON, False : OFF. - * @param l4 - * status of led4. True : ON, False : OFF. - */ - protected void setLeds(int id, boolean l1, boolean l2, boolean l3, - boolean l4) { - wiiuse.setLeds(id, l1, l2, l3, l4); - } - - /** - * Set the orientation threshold for the given id. (minimum angle between - * two events) - * - * @param id - * id of the wiimote. - * @param th - * threshold in degrees. - */ - protected void setOrientationThreshold(int id, float th) { - wiiuse.setOrientThreshold(id, th); - } - - /** - * Set the acceleration threshold for the given id. (minimum angle between - * two events) - * - * @param id - * id of the wiimote. - * @param th - * threshold. - */ - protected void setAccelerationThreshold(int id, int th) { - wiiuse.setAccelThreshold(id, th); - } - - /** - * Set alpha smoothing for the given id. - * - * @param id - * id of the wiimote. - * @param th - * threshold. - */ - protected void setAlphaSmoothing(int id, float th) { - wiiuse.setAlphaSmoothing(id, th); - } - - /** - * Try to resync with the wiimote by starting a new handshake. - * - * @param id - * id of the wiimote. - */ - protected void reSync(int id) { - wiiuse.reSync(id); - } - - /** - * Set screen aspect ratio to 4/3 for the given id. - * - * @param id - * id of the wiimote. - */ - protected void setScreenAspectRatio43(int id) { - wiiuse.setScreenRatio43(id); - } - - /** - * Set screen aspect ratio to 16/9 for the given id. - * - * @param id - * id of the wiimote. - */ - protected void setScreenAspectRatio169(int id) { - wiiuse.setScreenRatio169(id); - } - - /** - * Set the sensor bar to be above the screen. - * - * @param id - * id of the wiimote. - */ - protected void setSensorBarAboveScreen(int id) { - wiiuse.setSensorBarAboveScreen(id); - } - - /** - * Set the sensor bar to be below the screen. - * - * @param id - * id of the wiimote. - */ - protected void setSensorBarBelowScreen(int id) { - wiiuse.setSensorBarBelowScreen(id); - } - - /** - * Set virtual resolution. It is used to automatically compute the position - * of a cursor on this virtual screen using the sensor bar. These results - * come in the IREvent. - * - * @param id - * id of the wiimote. - * @param x - * x resolution. - * @param y - * y resolution. - */ - protected void setVirtualResolution(int id, int x, int y) { - wiiuse.setVirtualScreenResolution(id, x, y); - } - - /** - * Get Status for the wiimote for the given id. - * - * @param id - * id of the wiimote. - */ - protected void getStatus(int id) { - wiiuse.getStatus(id); - } - - /** - * Set the normal and expansion handshake timeouts. - * - * @param id - * the id of the wiimote concerned. - * @param normalTimeout - * The timeout in milliseconds for a normal read. - * @param expansionTimeout - * The timeout in millisecondsd to wait for an expansion - * handshake. - */ - protected void setTimeout(int id, short normalTimeout, - short expansionTimeout) { - wiiuse.setTimeout(id, normalTimeout, expansionTimeout); - } - - /** - * Set the IR sensitivity. - * - * @param id - * the id of the wiimote concerned. - * @param level - * 1-5, same as Wii system sensitivity setting. If the level is < - * 1, then level will be set to 1. If the level is > 5, then - * level will be set to 5. - */ - protected void setIrSensitivity(int id, int level) { - wiiuse.setIrSensitivity(id, level); - } - - /** - * Set the nunchuk orientation threshold for the given id. (minimum angle - * between two events) - * - * @param id - * id of the wiimote. - * @param th - * threshold in degrees. - */ - protected void setNunchukOrientationThreshold(int id, float th) { - wiiuse.setNunchukOrientationThreshold(id, th); - } - - /** - * Set the nunchuk acceleration threshold for the given id. (minimum angle - * between two events) - * - * @param id - * id of the wiimote. - * @param th - * threshold. - */ - protected void setNunchukAccelerationThreshold(int id, int th) { - wiiuse.setNunchukAccelerationThreshold(id, th); - } - - /** - * Force the bluetooth stack type.(useful only for windows) - * - * @param type - * must be WIIUSE_STACK_UNKNOWN or WIIUSE_STACK_MS or - * WIIUSE_STACK_BLUESOLEIL. - */ - private void setBlueToothstackType(int type) { - wiiuse.windowsSetBluetoothStack(type); - } - - @Override - public void run() { - - while (!leave) { - try { - semaphore.acquire(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - if (connected > 0) { - running.set(true); - - EventsGatherer gather = new EventsGatherer(connected); - - // Start polling and tell the observers when there are Wiimote - // events - while (running.get() && connected > 0) { - - /* Polling */ - wiiuse.specialPoll(gather); - - /* deal with events gathered in Wiiuse API */ - for (WiiUseApiEvent evt : gather.getEvents()) { - if (evt.getWiimoteId() != -1) {// event filled - // there is an event notify observers - notifyWiiUseApiListener(evt); - if (evt.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT) { - // check if it was a disconnection - // in this case disconnect the wiimote - closeConnection(evt.getWiimoteId()); - } - } else { - System.out - .println("There is an event with id == -1 ??? there is a problem !!! : " - + evt); - } - } - gather.clearEvents(); - } - }/* else { - if (connected <= 0) { - System.out.println("No wiimotes connected !"); - } - }*/ - }// end while true - } - - /** - * Add WiiUseApiListener to the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - protected void addWiiUseApiListener(WiiUseApiListener listener) { - listeners.add(WiiUseApiListener.class, listener); - } - - /** - * Remove WiiUseApiListener from the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - protected void removeWiiUseApiListener(WiiUseApiListener listener) { - listeners.remove(WiiUseApiListener.class, listener); - } - - /** - * Get the list of WiiUseApiListeners. - * - * @return the list of WiiUseApiListeners. - */ - protected WiiUseApiListener[] getWiiUseApiListeners() { - return listeners.getListeners(WiiUseApiListener.class); - } - - /** - * Notify WiiUseApiListeners that an event occured. - * - * @param evt - * GenericEvent occured - */ - private void notifyWiiUseApiListener(WiiUseApiEvent evt) { - for (WiiUseApiListener listener : getWiiUseApiListeners()) { - listener.onWiiUseApiEvent(evt); - } - } - - /** - * Called by the garbage collector at the end. - */ - protected void finalize() throws Throwable { - shutdown(); - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/Wiimote.java b/WiiUseJ_0.12/src/wiiusej/Wiimote.java deleted file mode 100644 index 98a5233..0000000 --- a/WiiUseJ_0.12/src/wiiusej/Wiimote.java +++ /dev/null @@ -1,435 +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; - -import javax.swing.event.EventListenerList; - -import wiiusej.wiiusejevents.utils.WiiUseApiListener; -import wiiusej.wiiusejevents.utils.WiimoteListener; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; -import wiiusej.wiiusejevents.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiusejevents.wiiuseapievents.WiimoteEvent; - -/** - * Class that represents a wiimote. You can register as an observer of this - * wiimote to listen events from it. You manage it. - * - * @author guiguito - */ -public class Wiimote implements WiiUseApiListener { - - private int id = -1;// wiimote id - - private EventListenerList listeners = new EventListenerList(); - - private WiiUseApiManager manager; - - /** - * Constructor. - * - * @param idd - * id of the wiimote - * @param manager - * manager wo built it. - */ - public Wiimote(int idd, WiiUseApiManager manager) { - id = idd; - this.manager = manager; - } - - /** - * Get the unique id of the wiimote. - * - * @return the id - */ - public int getId() { - return id; - } - - /** - * Disconnect this wiimote. - */ - public void disconnect() { - deactivateIRTRacking(); - deactivateMotionSensing(); - deactivateRumble(); - manager.closeConnection(id); - } - - /** - * Activate the rumble. - */ - public void activateRumble() { - manager.activateRumble(id); - } - - /** - * Deactivate the rumble. - */ - public void deactivateRumble() { - manager.deactivateRumble(id); - } - - /** - * Activate IR Tracking. - */ - public void activateIRTRacking() { - manager.activateIRTRacking(id); - } - - /** - * Deactivate IR Tracking. - */ - public void deactivateIRTRacking() { - manager.deactivateIRTRacking(id); - } - - /** - * Activate motion sensing. - */ - public void activateMotionSensing() { - manager.activateMotionSensing(id); - } - - /** - * Deactivate motion sensing. - */ - public void deactivateMotionSensing() { - manager.deactivateMotionSensing(id); - } - - /** - * Activate smoothing. - */ - public void activateSmoothing() { - manager.activateSmoothing(id); - } - - /** - * Deactivate smoothing. - */ - public void deactivateSmoothing() { - manager.deactivateSmoothing(id); - } - - /** - * Activate continuous. - */ - public void activateContinuous() { - manager.activateContinuous(id); - } - - /** - * Deactivate continuous. - */ - public void deactivateContinuous() { - manager.deactivateContinuous(id); - - } - - /** - * Set leds status. - * - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(boolean l1, boolean l2, boolean l3, boolean l4) { - manager.setLeds(id, l1, l2, l3, l4); - } - - /** - * Set the orientation threshold (minimum angle between two degrees with - * accelerometer). - * - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(float th) { - manager.setOrientationThreshold(id, th); - } - - /** - * Set the acceleration threshold(minimum angle between two degrees with - * accelerometer). - * - * @param th - * threshold - */ - public void setAccelerationThreshold(int th) { - manager.setAccelerationThreshold(id, th); - } - - /** - * Set the alpha smoothing value. - * - * @param th - * threshold - */ - public void setAlphaSmoothingValue(float th) { - manager.setAlphaSmoothing(id, th); - } - - /** - * Set the screen aspect ratio to be considered as 4/3. - */ - public void setScreenAspectRatio43() { - manager.setScreenAspectRatio43(id); - } - - /** - * Set the screen aspect ratio to be considered as 16/9. - */ - public void setScreenAspectRatio169() { - manager.setScreenAspectRatio169(id); - } - - /** - * Set the sensor bar to be considered above the screen. - */ - public void setSensorBarAboveScreen() { - manager.setSensorBarAboveScreen(id); - } - - /** - * Set the sensor bar to be considered below the screen. - */ - public void setSensorBarBelowScreen() { - manager.setSensorBarBelowScreen(id); - } - - /** - * Set the screen resolution of the you are pointing at with your wiimote. - * - * @param x - * x resolution. - * @param y - * y resolution. - */ - public void setVirtualResolution(int x, int y) { - manager.setVirtualResolution(id, x, y); - } - - /** - * Set the nunchuk orientation threshold for the given id. (minimum angle - * between two events) - * - * @param th - * threshold in degrees. - */ - public void setNunchukOrientationThreshold(float th) { - manager.setNunchukOrientationThreshold(id, th); - } - - /** - * Set the nunchuk acceleration threshold for the given id. (minimum angle - * between two events) - * - * @param th - * threshold. - */ - public void setNunchukAccelerationThreshold(int th) { - manager.setNunchukAccelerationThreshold(id, th); - } - - /** - * Try to resync the wiimote by starting a new handshake. - */ - public void reSync() { - manager.reSync(id); - } - - /** - * Ask for the status of the wiimote. The result will be received in a - * status event object. Implements onStatusEvent on wiimote listener to get - * it. - */ - public void getStatus() { - manager.getStatus(id); - } - - /** - * Set the normal and expansion handshake timeouts for this wiimote. Normal - * time out is for classic polling. The expansion timeout is used when an - * expansion is detected until the expansion successfully handshakes. - * - * @param normalTimeout - * The timeout in milliseconds for a normal read. - * @param expansionTimeout - * The timeout in millisecondsd to wait for an expansion - * handshake. - */ - public void setTimeout(short normalTimeout, short expansionTimeout) { - manager.setTimeout(id, normalTimeout, expansionTimeout); - } - - /** - * Set the IR sensitivity. - * - * @param level - * 1-5, same as Wii system sensitivity setting. If the level is < - * 1, then level will be set to 1. If the level is > 5, then - * level will be set to 5. - */ - public void setIrSensitivity(int level) { - manager.setIrSensitivity(id, level); - } - - /** - * Method called when a WiiUseApiEvent occurs. - * - * @param e - * the WiiUseApiEvent. - */ - public void onWiiUseApiEvent(WiiUseApiEvent e) { - if (e.getWiimoteId() == id) { - if (e.getEventType() == WiiUseApiEvent.GENERIC_EVENT) { - notifyWiiMoteEventListeners((WiimoteEvent) e); - } else if (e.getEventType() == WiiUseApiEvent.STATUS_EVENT) { - notifyStatusEventListeners((StatusEvent) e); - } else if (e.getEventType() == WiiUseApiEvent.DISCONNECTION_EVENT) { - notifyDisconnectionEventListeners((DisconnectionEvent) e); - } else if (e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_INSERTED) { - notifyNunchukInsertedEventListeners((NunchukInsertedEvent) e); - } else if (e.getEventType() == WiiUseApiEvent.WIIUSE_NUNCHUK_REMOVED) { - notifyNunchukRemovedEventListeners((NunchukRemovedEvent) e); - } - /* - * events not managed yet || e.getEventType() == WIIUSE_READ_DATA - * WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_INSERTED || e.getEventType() == - * WiiUseApiEvent.WIIUSE_CLASSIC_CTRL_REMOVED || e.getEventType() == - * WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_INSERTED || - * e.getEventType() == - * WiiUseApiEvent.WIIUSE_GUITAR_HERO_3_CTRL_REMOVED - */ - } - } - - /** - * Add a WiimoteListener to the listeners list. - * - * @param listener - * a WiimoteListener - */ - public void addWiiMoteEventListeners(WiimoteListener listener) { - listeners.add(WiimoteListener.class, listener); - } - - /** - * Remove a WiimoteListener from the listeners list. - * - * @param listener - * a WiimoteListener - */ - public void removeWiiMoteEventListeners(WiimoteListener listener) { - listeners.remove(WiimoteListener.class, listener); - } - - /** - * Get the list of WiimoteListener. - * - * @return the list of WiimoteListener. - */ - public WiimoteListener[] getWiiMoteEventListeners() { - return listeners.getListeners(WiimoteListener.class); - } - - /** - * Notify WiimoteListeners that an event occured. Notify in first the - * listeners for Buttons Events. In second the listeners for IR Events. In - * third the listeners for Motion sensing events. - * - * @param evt - * GenericEvent occured - */ - private void notifyWiiMoteEventListeners(WiimoteEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onButtonsEvent(evt.getButtonsEvent()); - if (evt.isThereIrEvent()) { - listener.onIrEvent(evt.getIREvent()); - } - if (evt.isThereMotionSensingEvent()) { - listener.onMotionSensingEvent(evt.getMotionSensingEvent()); - } - if (evt.isThereExpansionEvent()) { - listener.onExpansionEvent(evt.getExpansionEvent()); - } - } - } - - /** - * Notify WiimoteListener that a status event occured. - * - * @param evt - * status event occured - */ - private void notifyStatusEventListeners(StatusEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onStatusEvent(evt); - } - } - - /** - * Notify WiimoteListener that a disconnection event occured. - * - * @param evt - * disconnection event occured - */ - private void notifyDisconnectionEventListeners(DisconnectionEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onDisconnectionEvent(evt); - } - } - - /** - * Notify WiimoteListener that a NunchukInserted Event occured. - * - * @param evt - * NunchukInserted Event occured - */ - private void notifyNunchukInsertedEventListeners(NunchukInsertedEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onNunchukInsertedEvent(evt); - } - } - - /** - * Notify WiimoteListener that a NunchukRemoved Event occured. - * - * @param evt - * NunchukRemoved Event occured - */ - private void notifyNunchukRemovedEventListeners(NunchukRemovedEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.onNunchukRemovedEvent(evt); - } - } - - @Override - public String toString() { - return "Wiimote with ID : " + id; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/test/CloseGuiTestCleanly.java b/WiiUseJ_0.12/src/wiiusej/test/CloseGuiTestCleanly.java deleted file mode 100644 index 584f2d9..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/test/Main.java b/WiiUseJ_0.12/src/wiiusej/test/Main.java deleted file mode 100644 index 67ef279..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/test/NunchukGuiTest.java b/WiiUseJ_0.12/src/wiiusej/test/NunchukGuiTest.java deleted file mode 100644 index 7054de8..0000000 --- a/WiiUseJ_0.12/src/wiiusej/test/NunchukGuiTest.java +++ /dev/null @@ -1,377 +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.DisconnectionEvent; -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 = 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(); - if (buttons.isButtonCJustPressed()) { - cButton.setEnabled(false); - } - if (buttons.isButtonCJustReleased()) { - cButton.setEnabled(true); - } - if (buttons.isButtonZJustPressed()) { - zButton.setEnabled(false); - } - 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 - } - - // 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/WiiUseJ_0.12/src/wiiusej/test/Tests.java b/WiiUseJ_0.12/src/wiiusej/test/Tests.java deleted file mode 100644 index 6a3cdb7..0000000 --- a/WiiUseJ_0.12/src/wiiusej/test/Tests.java +++ /dev/null @@ -1,367 +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.DisconnectionEvent; -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(); - } - - } 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); - } - - /** - * @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/WiiUseJ_0.12/src/wiiusej/test/WiiuseJGuiTest.java b/WiiUseJ_0.12/src/wiiusej/test/WiiuseJGuiTest.java deleted file mode 100644 index 2a8f229..0000000 --- a/WiiUseJ_0.12/src/wiiusej/test/WiiuseJGuiTest.java +++ /dev/null @@ -1,1329 +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.DisconnectionEvent; -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); - showExpansionWiimoteButton.setText("Hide Nunchuk"); - } - - public void windowDeactivated(WindowEvent e) { - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Nunchuk"); - } - }; - - /** - * 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(NunchukGuiTest.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(NunchukGuiTest.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; - } - } - - /** - * 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(); - 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); - - showExpansionWiimoteButton.setText("No expansion connected"); - showExpansionWiimoteButton - .addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - showExpansionWiimoteButtonMousePressed(evt); - } - }); - exPansionPanel.add(showExpansionWiimoteButton); - - controlsPanel.add(exPansionPanel); - - 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(); - } - 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); - showExpansionWiimoteButton.setText("Hide Nunchuk"); - messageText.setText("Nunchuk displayed !"); - } else {// already being shown - expansionFrame.setEnabled(false); - expansionFrame.setVisible(false); - showExpansionWiimoteButton.setEnabled(true); - showExpansionWiimoteButton.setText("Show Nunchuk"); - messageText.setText("Nunchuk 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.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/WiiUseJ_0.12/src/wiiusej/utils/AccelerationExpansionEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/AccelerationExpansionEventPanel.java deleted file mode 100644 index cb3021f..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/utils/AccelerationPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/AccelerationPanel.java deleted file mode 100644 index 6caa3b6..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/AccelerationPanel.java +++ /dev/null @@ -1,281 +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.DisconnectionEvent; -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 - } - - 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/WiiUseJ_0.12/src/wiiusej/utils/AccelerationWiimoteEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/AccelerationWiimoteEventPanel.java deleted file mode 100644 index 4e716de..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/utils/ButtonsEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/ButtonsEventPanel.java deleted file mode 100644 index ba01ef4..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/ButtonsEventPanel.java +++ /dev/null @@ -1,363 +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.DisconnectionEvent; -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; - - /** - * 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); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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"); - shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); - 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) { - buttons = null; - repaint(); - } - - public void onNunchukInsertedEvent(NunchukInsertedEvent e) { - // nothing - } - - public void onNunchukRemovedEvent(NunchukRemovedEvent e) { - // 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/WiiUseJ_0.12/src/wiiusej/utils/GForceExpansionEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/GForceExpansionEventPanel.java deleted file mode 100644 index d5852b0..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/utils/GForcePanel.java b/WiiUseJ_0.12/src/wiiusej/utils/GForcePanel.java deleted file mode 100644 index 14de5f2..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/GForcePanel.java +++ /dev/null @@ -1,282 +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.DisconnectionEvent; -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 - } - - 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/WiiUseJ_0.12/src/wiiusej/utils/GForceWiimoteEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/GForceWiimoteEventPanel.java deleted file mode 100644 index 1ae710e..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/utils/IRPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/IRPanel.java deleted file mode 100644 index c826fee..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/IRPanel.java +++ /dev/null @@ -1,253 +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.DisconnectionEvent; -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 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/WiiUseJ_0.12/src/wiiusej/utils/JoystickEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/JoystickEventPanel.java deleted file mode 100644 index 6f04ce6..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/JoystickEventPanel.java +++ /dev/null @@ -1,231 +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.DisconnectionEvent; -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 dx = (int) Math.round(shape.getBounds().getWidth() / 2); - int dy = (int) Math.round(shape.getBounds().getHeight() / 2); - double xTemp = xAng * (xCenter - dx * 2); - double yTemp = yAng * (yCenter - dy * 2); - int x = xCenter - dx + (int) xTemp; - int y = yCenter - dy - (int) yTemp; - // System.out.println("--------------------------------------------------------------------"); - // System.out.println(lastJoystickEvent); - // System.out.println("xCenter ,yCenter : "+xCenter+" , "+yCenter); - // System.out.println("xAng, yAng : "+xAng+" , "+yAng); - // System.out.println("dx, dy : "+dx+" , "+dy); - // System.out.println("xTemp, yTemp : "+xTemp+" , "+yTemp); - // System.out.println("x, y : "+x+" , "+y); - // 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 = getJoystikEvent(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 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 getJoystikEvent(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/WiiUseJ_0.12/src/wiiusej/utils/NunchukJoystickEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/NunchukJoystickEventPanel.java deleted file mode 100644 index a534751..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/NunchukJoystickEventPanel.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.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 getJoystikEvent(ExpansionEvent e) { - if (e instanceof NunchukEvent) { - return ((NunchukEvent) e).getNunchukJoystickEvent(); - } - return null; - } -} diff --git a/WiiUseJ_0.12/src/wiiusej/utils/OrientationExpansionEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/OrientationExpansionEventPanel.java deleted file mode 100644 index f5e3856..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/utils/OrientationPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/OrientationPanel.java deleted file mode 100644 index b298911..0000000 --- a/WiiUseJ_0.12/src/wiiusej/utils/OrientationPanel.java +++ /dev/null @@ -1,283 +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.DisconnectionEvent; -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 - } - - 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/WiiUseJ_0.12/src/wiiusej/utils/OrientationWiimoteEventPanel.java b/WiiUseJ_0.12/src/wiiusej/utils/OrientationWiimoteEventPanel.java deleted file mode 100644 index e38f3c9..0000000 --- a/WiiUseJ_0.12/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/WiiUseJ_0.12/src/wiiusej/values/GForce.java b/WiiUseJ_0.12/src/wiiusej/values/GForce.java deleted file mode 100644 index da79ed2..0000000 --- a/WiiUseJ_0.12/src/wiiusej/values/GForce.java +++ /dev/null @@ -1,80 +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.values; - -/** - * Represents gravity force on each axis. - * - * @author guiguito - */ -public class GForce { - - private float x; - private float y; - private float z; - - /** - * Default constructor; - */ - public GForce() { - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with gravity force on each axis. - * - * @param xx - * x value - * @param yy - * x value - * @param zz - * x value - */ - public GForce(float xx, float yy, float zz) { - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public float getX() { - return x; - } - - /** - * @return the y - */ - public float getY() { - return y; - } - - /** - * @return the z - */ - public float getZ() { - return z; - } - - @Override - public String toString() { - return "Gravity force : (" + x + ", " + y + "," + z + ")"; - } -} diff --git a/WiiUseJ_0.12/src/wiiusej/values/IRSource.java b/WiiUseJ_0.12/src/wiiusej/values/IRSource.java deleted file mode 100644 index a738c05..0000000 --- a/WiiUseJ_0.12/src/wiiusej/values/IRSource.java +++ /dev/null @@ -1,106 +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.values; - -/** - * Class used for IR sources. - * - * @author guiguito - */ -public class IRSource { - - private int x; - private int y; - private short rx; - private short ry; - private short size; - - /** - * Build an IR source with all details. - * - * @param xx - * xx interpolated coordinates. - * @param yy - * yy interpolated coordinates. - * @param rxx - * raw X coordinate (0-1023). - * @param ryy - * raw Y coordinate (0-1023). - * @param si - * size of the IR dot (0-15). - */ - public IRSource(int xx, int yy, short rxx, short ryy, short si) { - x = xx; - y = yy; - rx = rxx; - ry = ryy; - size = si; - } - - /** - * Return x interpolated coordinates. - * - * @return the x - */ - public int getX() { - return x; - } - - /** - * Return y interpolated coordinates. - * - * @return the y - */ - public int getY() { - return y; - } - - /** - * Return raw X coordinate (0-1023). - * - * @return the rx - */ - public short getRx() { - return rx; - } - - /** - * Return raw Y coordinate (0-1023). - * - * @return the ry - */ - public short getRy() { - return ry; - } - - /** - * Return size of the IR dot (0-15). - * - * @return the size - */ - public short getSize() { - return size; - } - - @Override - public String toString() { - return "Interpolated coordinates (" + x + "," + y - + "), Raw coordinates(" + rx + "," + ry + "), source size : " - + size + ")"; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/values/Orientation.java b/WiiUseJ_0.12/src/wiiusej/values/Orientation.java deleted file mode 100644 index 124d890..0000000 --- a/WiiUseJ_0.12/src/wiiusej/values/Orientation.java +++ /dev/null @@ -1,117 +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.values; - -/** - * Class that represents the orientation of the wiimote. - * - * @author guiguito - */ -public class Orientation { - - private float roll; - private float pitch; - private float yaw; - private float a_roll; - private float a_pitch; - - /** - * Default constructor. - */ - public Orientation() { - roll = 0; - pitch = 0; - yaw = 0; - a_roll = 0; - a_pitch = 0; - } - - /** - * Contructor with raw, pitch , yaw. - * - * @param r - * roll (can be smoothed) - * @param p - * pitch (can be smoothed) - * @param y - * yaw - * @param ar - * absolute roll - * @param ap - * absolute pitch - */ - public Orientation(float r, float p, float y, float ar, float ap) { - roll = r; - pitch = p; - yaw = y; - a_roll = ar; - a_pitch = ap; - } - - /** - * Get the roll (can be smoothed). - * - * @return the roll - */ - public float getRoll() { - return roll; - } - - /** - * Get the pitch (can be smoothed). - * - * @return the pitch - */ - public float getPitch() { - return pitch; - } - - /** - * Get the yaw. - * - * @return the yaw - */ - public float getYaw() { - return yaw; - } - - /** - * Get absolute roll (can not be smoothed). - * - * @return the a_roll - */ - public float getARoll() { - return a_roll; - } - - /** - * Get absolute pitch (can not be smoothed). - * - * @return the a_pitch - */ - public float getAPitch() { - return a_pitch; - } - - @Override - public String toString() { - return "Orientation : (roll: " + roll + ", pitch: " + pitch + ", yaw: " - + yaw + ", absolute roll: " + a_roll + ", absolute pitch: " - + a_pitch + ")"; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/values/RawAcceleration.java b/WiiUseJ_0.12/src/wiiusej/values/RawAcceleration.java deleted file mode 100644 index 83f9578..0000000 --- a/WiiUseJ_0.12/src/wiiusej/values/RawAcceleration.java +++ /dev/null @@ -1,81 +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.values; - -/** - * Represents raw acceleration on each axis. - * - * @author guiguito - */ -public class RawAcceleration { - - private short x; - private short y; - private short z; - - /** - * Default constructor; - */ - public RawAcceleration() { - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with raw acceleration on each axis. - * - * @param xx - * x value - * @param yy - * x value - * @param zz - * x value - */ - public RawAcceleration(short xx, short yy, short zz) { - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public short getX() { - return x; - } - - /** - * @return the y - */ - public short getY() { - return y; - } - - /** - * @return the z - */ - public short getZ() { - return z; - } - - @Override - public String toString() { - return "Raw acceleration : (" + x + ", " + y + "," + z + ")"; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/GenericEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/GenericEvent.java deleted file mode 100644 index 18d8429..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/GenericEvent.java +++ /dev/null @@ -1,59 +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.wiiusejevents; - -/** - * Abstract mother class representing an event with a wiimote id. - * - * @author guiguito - */ -public abstract class GenericEvent { - - /* ID */ - private int wiimoteId = -1; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public GenericEvent(int id) { - wiimoteId = id; - } - - /** - * Get Wiimote ID - * - * @return the wiimote id. - */ - public int getWiimoteId() { - return wiimoteId; - } - - /** - * Set Wiimote ID - * - * @param wiimoteId - * id of the wiimote - */ - void setWiimoteId(int wiimoteId) { - this.wiimoteId = wiimoteId; - } - - public abstract String toString(); -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ButtonsEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ButtonsEvent.java deleted file mode 100644 index d9705fa..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ButtonsEvent.java +++ /dev/null @@ -1,128 +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.wiiusejevents.physicalevents; - -import wiiusej.wiiusejevents.GenericEvent; - -/** - * Class which represents a buttons event. - * - * @author guiguito - */ -public abstract class ButtonsEvent extends GenericEvent { - - /* Buttons */ - private short buttonsJustPressed = 0; - private short buttonsJustReleased = 0; - private short buttonsHeld = 0; - - /** - * Constructor of the button Event. - * - * @param id - * id of the wiimote concerned. - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons just held. - */ - public ButtonsEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id); - setAllButtons(buttonsJustPressed, buttonsJustReleased, buttonsHeld); - } - - /** - * Set all buttons in one method. - * - * @param buttonsJustPressed - * @param buttonsJustReleased - * @param buttonsHeld - */ - private void setAllButtons(short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - this.buttonsJustPressed = buttonsJustPressed; - this.buttonsJustReleased = buttonsJustReleased; - this.buttonsHeld = buttonsHeld; - } - - /** - * Get the short storing the buttons just pressed - * - * @return the short storing the buttons just pressed - */ - public short getButtonsJustPressed() { - return buttonsJustPressed; - } - - /** - * Get the short storing the buttons just released - * - * @return the short storing the buttons just released - */ - public short getButtonsJustReleased() { - return buttonsJustReleased; - } - - /** - * get the short storing the buttons held - * - * @return the short storing the buttons held - */ - public short getButtonsHeld() { - return buttonsHeld; - } - - /** **************** BUTTONS Methods ***************** */ - /* generic button functions */ - - protected boolean buttonTest(short buttonBitsDefinition, short buttons) { - return (buttons & buttonBitsDefinition) == buttonBitsDefinition; - } - - protected boolean isButtonJustPressed(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustPressed) - && !isButtonHeld(buttonBitsDefinition); - } - - protected boolean isButtonJustReleased(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustReleased); - } - - protected boolean isButtonHeld(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsHeld); - } - - protected boolean isButtonPressed(short buttonBitsDefinition) { - return isButtonHeld(buttonBitsDefinition) - || isButtonJustPressed(buttonBitsDefinition); - } - - @Override - public String toString() { - String out = ""; - /* Display buttons */ - out += "/******** Buttons ********/\n"; - out += "--- Buttons just pressed : " + buttonsJustPressed + "\n"; - out += "--- Buttons just released : " + buttonsJustReleased + "\n"; - out += "--- Buttons held : " + buttonsHeld + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ExpansionEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ExpansionEvent.java deleted file mode 100644 index 868f33c..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/ExpansionEvent.java +++ /dev/null @@ -1,40 +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.wiiusejevents.physicalevents; - -import wiiusej.wiiusejevents.GenericEvent; - -/** - * Mother Class of all expansions event. - * - * @author guiguito - */ -public abstract class ExpansionEvent extends GenericEvent { - - /** - * Constructor of an ExpansionEvent. - * - * @param id - * id of the wiimote to which the expansion is connected. - */ - public ExpansionEvent(int id) { - super(id); - } - - public abstract String toString(); - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/IREvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/IREvent.java deleted file mode 100644 index 1873a8c..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/IREvent.java +++ /dev/null @@ -1,317 +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.wiiusejevents.physicalevents; - -import wiiusej.values.IRSource; -import wiiusej.wiiusejevents.GenericEvent; - -/** - * Class which represents an IR event. - * - * @author guiguito - */ -public class IREvent extends GenericEvent { - - /* IR Tracking */ - private IRSource[] IRPoints; - private short indexPoints = 0; - private int x; - private int y; - private float z;// distance from the sensor bar - private int ax; - private int ay; - private int xVRes; - private int yVRes; - private int xOffset; - private int yOffset; - private short sensorBarPostion; - private short screenAsPectRatio; - private short irSensitivity; - private float distance; - - static private short WIIUSE_IR_ABOVE = 0; - static private short WIIUSE_IR_BELOW = 1; - static private short WIIUSE_SCREEN_RATIO_4_3 = 0; - static private short WIIUSE_SCREEN_RATIO_16_9 = 1; - - private static short NB_POINTS = 4;// number of points IR can track - - /** - * Constructor of IREvent with full infos. - * - * @param id - * d of the wiimote concerned. - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - * @param irSensitivity - * Sensitivity of the infrared camera. - * @param distance - * Pixel Distance between first two dots - */ - public IREvent(int id, int x, int y, float z, int ax, int ay, int xVRes, - int yVRes, int xOffset, int yOffset, short sensorBarPostion, - short screenAsPectRatio, short irSensitivity, float distance) { - super(id); - this.x = x; - this.y = y; - this.z = z; - this.ax = ax; - this.ay = ay; - this.xVRes = xVRes; - this.yVRes = yVRes; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.sensorBarPostion = sensorBarPostion; - this.screenAsPectRatio = screenAsPectRatio; - this.irSensitivity = irSensitivity; - this.distance = distance; - IRPoints = new IRSource[NB_POINTS]; - } - - /** - * Get list of IR points. - * - * @return the list of 2D points - */ - public IRSource[] getIRPoints() { - return java.util.Arrays.copyOfRange(IRPoints, 0, indexPoints); - } - - /** - * Add IR Point in the list (Max 4 points) - * - * @param x - * x value - * @param y - * y value - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - IRPoints[indexPoints] = new IRSource(x, y, rx, ry, size); - indexPoints++; - return; - } - - /** - * Return calculated X coordinate. - * - * @return the x - */ - public int getX() { - return x; - } - - /** - * Return calculated Y coordinate. - * - * @return the y - */ - public int getY() { - return y; - } - - /** - * Return calculated distance. - * - * @return the z - */ - public float getZ() { - return z; - } - - /** - * Return absolute X coordinate. - * - * @return the ax - */ - public int getAx() { - return ax; - } - - /** - * Return absolute Y coordinate. - * - * @return the ay - */ - public int getAy() { - return ay; - } - - /** - * Return IR virtual screen x resolution. - * - * @return the xVRes - */ - public int getXVRes() { - return xVRes; - } - - /** - * Return IR virtual screen y resolution. - * - * @return the yVRes - */ - public int getYVRes() { - return yVRes; - } - - /** - * Return IR X correction offset. - * - * @return the xOffset - */ - public int getXOffset() { - return xOffset; - } - - /** - * Return IR Y correction offset. - * - * @return the yOffset - */ - public int getYOffset() { - return yOffset; - } - - /** - * Return true if the sensor bar is above. - * - * @return true if the sensor bar is above. - */ - public boolean isSensorBarAbove() { - return sensorBarPostion == WIIUSE_IR_ABOVE; - } - - /** - * Return true if the sensor bar is below. - * - * @return true if the sensor bar is below. - */ - public boolean isSensorBarBelow() { - return sensorBarPostion == WIIUSE_IR_BELOW; - } - - /** - * Return true if screen aspect ratio set is 4/3. - * - * @return true if screen aspect ratio set is 4/3. - */ - public boolean isScreenAspectRatio43() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_4_3; - } - - /** - * Return true if screen aspect ratio set is 16/9. - * - * @return true if screen aspect ratio set is 16/9. - */ - public boolean isScreenAspectRatio169() { - return screenAsPectRatio == WIIUSE_SCREEN_RATIO_16_9; - } - - /** - * Return aspect ratio of the screen. - * - * @return the screenAsPectRatio - */ - public short getScreenAsPectRatio() { - return screenAsPectRatio; - } - - /** - * The sensitivity of the IR camera can be turned up or down depending on - * your needs. Like the Wii, wiiusej and wiiuse can set the camera - * sensitivity to a degree between 1 (lowest) and 5 (highest). The default - * is 3. - * - * @return the irSensitivity - */ - public short getIrSensitivity() { - return irSensitivity; - } - - /** - * Pixel distance between first 2 dots. - * - * @return the distance between first 2 dots. - */ - public float getDistance() { - return distance; - } - - @Override - public String toString() { - String out = ""; - /* Display IR Tracking */ - out += "/******** IR Tracking ********/\n"; - out += "--- Active : true\n"; - out += "--- calculated X coordinate : " + x + "\n"; - out += "--- calculated Y coordinate : " + y + "\n"; - out += "--- calculated Z coordinate : " + z + "\n"; - out += "--- calculated distance : " + distance + "\n"; - out += "--- absolute X coordinate : " + ax + "\n"; - out += "--- absolute Y coordinate : " + ay + "\n"; - out += "--- IR virtual screen x resolution : " + xVRes + "\n"; - out += "--- IR virtual screen y resolution : " + yVRes + "\n"; - out += "--- IR X correction offset : " + xOffset + "\n"; - out += "--- IR Y correction offset : " + yOffset + "\n"; - out += "--- IR Sensitivity (between 1-5) : " + irSensitivity + "\n"; - if (isScreenAspectRatio43()) { - out += "--- aspect ratio of the screen : 4/3\n"; - } else if (isScreenAspectRatio169()) { - out += "--- aspect ratio of the screen : 16/9\n"; - } - if (isSensorBarAbove()) { - out += "--- IR sensor bar position. : Above\n"; - } else if (isSensorBarBelow()) { - out += "--- IR sensor bar position. : Below\n"; - } - out += "--- Seen points\n"; - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] != null) { - out += IRPoints[i].toString(); - } - } - out += "\n"; - return out; - } -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/JoystickEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/JoystickEvent.java deleted file mode 100644 index 5dc7f2f..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/JoystickEvent.java +++ /dev/null @@ -1,135 +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.wiiusejevents.physicalevents; - -import wiiusej.wiiusejevents.GenericEvent; - -/** - * Class that stores values on a joystick Event. - * - * @author guiguito - */ -public class JoystickEvent extends GenericEvent { - - private float angle; - private float magnitude; - private short[] max; - private short[] min; - private short[] center; - - /** - * Constructor of a JoystickEvent. - * - * @param id - * id of the wiimote connected. - * @param angle - * angle the joystick is being held. - * @param magnitude - * magnitude of the joystick (range 0-1). - * @param max1 - * maximum joystick value 1. - * @param max2 - * maximum joystick value 2. - * @param min1 - * minimum joystick value 1. - * @param min2 - * minimum joystick value 2. - * @param center1 - * center joystick value 1. - * @param center2 - * center joystick value 2. - */ - public JoystickEvent(int id, float angle, float magnitude, short max1, - short max2, short min1, short min2, short center1, short center2) { - super(id); - this.angle = angle; - this.magnitude = magnitude; - max = new short[2]; - max[0] = max1; - max[1] = max2; - min = new short[2]; - min[0] = min1; - min[1] = min2; - center = new short[2]; - center[0] = center1; - center[1] = center2; - } - - /** - * Get angle the joystick is being held. - * - * @return the angle angle the joystick. - */ - public float getAngle() { - return angle; - } - - /** - * Get magnitude of the joystick (range 0-1). - * - * @return the magnitude magnitude of the joystick. - */ - public float getMagnitude() { - return magnitude; - } - - /** - * Maximum joystick values. - * - * @return the max - */ - public short[] getMax() { - return max; - } - - /** - * Minimum joystick values. - * - * @return the min - */ - public short[] getMin() { - return min; - } - - /** - * Center joystick values. - * - * @return the center - */ - public short[] getCenter() { - return center; - } - - /* - * (non-Javadoc) - * - * @see wiiusej.wiiusejevents.GenericEvent#toString() - */ - @Override - public String toString() { - String out = ""; - /* Display IR Tracking */ - out += "/******** Joystick ********/\n"; - out += "--- angle : " + angle + "\n"; - out += "--- magnitude : " + magnitude + "\n"; - out += "--- maximum values : " + max[0] + "," + max[1] + "\n"; - out += "--- minimum values : " + min[0] + "," + min[1] + "\n"; - out += "--- center values : " + center[0] + "," + center[1] + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/MotionSensingEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/MotionSensingEvent.java deleted file mode 100644 index 0945a48..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/MotionSensingEvent.java +++ /dev/null @@ -1,203 +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.wiiusejevents.physicalevents; - -import wiiusej.values.GForce; -import wiiusej.values.Orientation; -import wiiusej.values.RawAcceleration; -import wiiusej.wiiusejevents.GenericEvent; - -/** - * Class which represents a motion sensing event. - * - * @author guiguito - */ -public class MotionSensingEvent extends GenericEvent { - - /* Motion Sensing */ - private Orientation orientation; - private GForce gforce; - private RawAcceleration acceleration; - - private float orientationThreshold = 0; - private int accelerationThreshold = 0; - private float alphaSmoothing = 0; - private boolean isSmoothingActive = false; - - /** - * Constructor for a Motion Sensing Event. - * - * @param id - * id of the wiimote concerned. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer. - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer. - * @param smoothingState - * true if smoothing flag is activated. - * @param alphaSmooth - * value of the alpha smoothing parameter. - * @param r - * roll. - * @param p - * pitch. - * @param ya - * yaw. - * @param ar - * absolute roll. - * @param ap - * absolute pitch. - * @param x - * gravity force on x axis. - * @param y - * gravity force on y axis. - * @param z - * gravity force on z axis. - * @param xx - * raw acceleration on x axis. - * @param yy - * raw acceleration on y axis. - * @param zz - * raw acceleration on z axis. - */ - public MotionSensingEvent(int id, float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float ar, float ap, - float x, float y, float z, short xx, short yy, short zz) { - super(id); - this.orientationThreshold = orientationThreshold; - this.accelerationThreshold = accelerationThreshold; - this.isSmoothingActive = smoothingState; - this.alphaSmoothing = alphaSmooth; - setOrientationAndGforce(r, p, ya, ar, ap, x, y, z, xx, yy, zz); - } - - /** - * Set orientation, gravity force and raw acceleration. - * - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param ar - * absolute roll - * @param ap - * absolute pitch - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - * @param xx - * raw acceleration on x axis - * @param yy - * raw acceleration on y axis - * @param zz - * raw acceleration on z axis - */ - private void setOrientationAndGforce(float r, float p, float ya, float ar, - float ap, float x, float y, float z, short xx, short yy, short zz) { - this.orientation = new Orientation(r, p, ya, ar, ap); - this.gforce = new GForce(x, y, z); - this.acceleration = new RawAcceleration(xx, yy, zz); - } - - /** - * @return the orientation - */ - public Orientation getOrientation() { - return orientation; - } - - /** - * Get the gravity force. - * - * @return the gforce - */ - public GForce getGforce() { - return gforce; - } - - /** - * Get the raw acceleration. - * - * @return the raw acceleration - */ - public RawAcceleration getRawAcceleration() { - return acceleration; - } - - /** - * Get orientation threshold. - * - * @return the orientationThreshold - */ - public float getOrientationThreshold() { - return orientationThreshold; - } - - /** - * Get acceleration threshold. - * - * @return the accelerationThreshold - */ - public int getAccelerationThreshold() { - return accelerationThreshold; - } - - /** - * Get alpha smoothing. - * - * @return the alphaSmoothing - */ - public float getAlphaSmoothing() { - return alphaSmoothing; - } - - /** - * Tell if the option SMOOTHING is activated. - * - * @return the isSmoothingActive - */ - public boolean isSmoothingActive() { - return isSmoothingActive; - } - - @Override - public String toString() { - String out = ""; - /* Motion sensing */ - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : true \n"; - out += "--- Orientation threshold value ? : " + orientationThreshold - + "\n"; - out += "--- Acceleration threshold value ? : " + accelerationThreshold - + "\n"; - out += "--- Alpha smoothing threshold value ? : " + alphaSmoothing - + "\n"; - out += "--- Smoothing ? : " + isSmoothingActive + "\n"; - out += "--- " + orientation + "\n"; - out += "--- " + gforce + "\n"; - out += "--- " + acceleration + "\n"; - return out; - } -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukButtonsEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukButtonsEvent.java deleted file mode 100644 index b6584d6..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukButtonsEvent.java +++ /dev/null @@ -1,90 +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.wiiusejevents.physicalevents; - -/** - * Class which represents a buttons event for a generic event. It means buttons - * from a wiimote. - * - * @author guiguito - */ -public class NunchukButtonsEvent extends ButtonsEvent { - - private static short NUNCHUK_BUTTON_Z = 0x01; - private static short NUNCHUK_BUTTON_C = 0x02; - private static short NUNCHUK_BUTTON_ALL = 0x03; - - /** - * Constructor of the nunchuk button Event. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons just pressed. - */ - public NunchukButtonsEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id, buttonsJustPressed, buttonsJustReleased, buttonsHeld); - } - - /* Button Z */ - - public boolean isButtonZJustPressed() { - return isButtonJustPressed(NUNCHUK_BUTTON_Z); - } - - public boolean isButtonZJustReleased() { - return isButtonJustReleased(NUNCHUK_BUTTON_Z); - } - - public boolean isButtonZeHeld() { - return isButtonHeld(NUNCHUK_BUTTON_Z); - } - - public boolean isButtonZPressed() { - return isButtonPressed(NUNCHUK_BUTTON_Z); - } - - /* Button Z */ - - public boolean isButtonCJustPressed() { - return isButtonJustPressed(NUNCHUK_BUTTON_C); - } - - public boolean isButtonCJustReleased() { - return isButtonJustReleased(NUNCHUK_BUTTON_C); - } - - public boolean isButtonCHeld() { - return isButtonHeld(NUNCHUK_BUTTON_C); - } - - public boolean isButtonCPressed() { - return isButtonPressed(NUNCHUK_BUTTON_C); - } - - @Override - public String toString() { - return "/******** Buttons for Nunchuk Event ********/\n" - + super.toString(); - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukEvent.java deleted file mode 100644 index eec7b97..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/NunchukEvent.java +++ /dev/null @@ -1,169 +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.wiiusejevents.physicalevents; - -/** - * This class represents the values from the joystick and its events. - * - * @author guiguito - */ -public class NunchukEvent extends ExpansionEvent { - - NunchukButtonsEvent buttonsEvent; - MotionSensingEvent nunchukMotionSensingEvent; - JoystickEvent nunchukJoystickEvent; - - /** - * Constructor of NunchukEvent. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons just pressed. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer. - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer. - * @param smoothingState - * true if smoothing flag is activated. - * @param alphaSmooth - * value of the alpha smoothing parameter. - * @param r - * roll. - * @param p - * pitch. - * @param ya - * yaw. - * @param ar - * absolute roll. - * @param ap - * absolute pitch. - * @param x - * gravity force on x axis. - * @param y - * gravity force on y axis. - * @param z - * gravity force on z axis. - * @param xx - * raw acceleration on x axis. - * @param yy - * raw acceleration on y axis. - * @param zz - * raw acceleration on z axis. - * @param angle - * angle the joystick is being held. - * @param magnitude - * magnitude of the joystick (range 0-1). - * @param max1 - * maximum joystick value 1. - * @param max2 - * maximum joystick value 2. - * @param min1 - * minimum joystick value 1. - * @param min2 - * minimum joystick value 2. - * @param center1 - * center joystick value 1. - * @param center2 - * center joystick value 2. - */ - public NunchukEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld, - float orientationThreshold, int accelerationThreshold, - boolean smoothingState, float alphaSmooth, float r, float p, - float ya, float ar, float ap, float x, float y, float z, short xx, - short yy, short zz, float angle, float magnitude, short max1, - short max2, short min1, short min2, short center1, short center2) { - super(id); - buttonsEvent = new NunchukButtonsEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - nunchukMotionSensingEvent = new MotionSensingEvent(id, - orientationThreshold, accelerationThreshold, smoothingState, - alphaSmooth, r, p, ya, ar, ap, x, y, z, xx, yy, zz); - nunchukJoystickEvent = new JoystickEvent(id, angle, magnitude, max1, - max2, min1, min2, center1, center2); - } - - /** - * Tell if there is a nunchuk motion sensing Event. - * - * @return TRUE if there is a nunchuk motion sensing event, false otherwise. - */ - public boolean isThereMotionSensingEvent() { - return nunchukMotionSensingEvent != null; - } - - /** - * Tell if there is a nunchuk joystick event. - * - * @return TRUE if there is a nunchuk joystick event, false otherwise. - */ - public boolean isThereNunchukJoystickEvent() { - return nunchukJoystickEvent != null; - } - - /** - * Get joystick buttons event. - * - * @return the joystick buttons event if there is one or null. - */ - public NunchukButtonsEvent getButtonsEvent() { - return buttonsEvent; - } - - /** - * Get the nunchuk motion sensing event. - * - * @return the nunchuk motion sensing event if there is one or null. - */ - public MotionSensingEvent getNunchukMotionSensingEvent() { - return nunchukMotionSensingEvent; - } - - /** - * Get the nunchuk joystick event. - * - * @return the nunchuk Joystick Event if there is one or null. - */ - public JoystickEvent getNunchukJoystickEvent() { - return nunchukJoystickEvent; - } - - /* - * (non-Javadoc) - * - * @see wiiusej.wiiusejevents.GenericEvent#toString() - */ - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** Nunchuk EVENT : WIIMOTE ID :" + getWiimoteId() - + " ********/\n"; - out += buttonsEvent; - out += nunchukJoystickEvent; - out += nunchukMotionSensingEvent; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/WiimoteButtonsEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/WiimoteButtonsEvent.java deleted file mode 100644 index 106fc1c..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/physicalevents/WiimoteButtonsEvent.java +++ /dev/null @@ -1,267 +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.wiiusejevents.physicalevents; - -/** - * Class which represents a buttons event for a generic event. It means buttons - * from a wiimote. - * - * @author guiguito - */ -public class WiimoteButtonsEvent extends ButtonsEvent { - - /* Buttons MACRO */ - private static short WIIMOTE_BUTTON_TWO = 0x0001; - private static short WIIMOTE_BUTTON_ONE = 0x0002; - private static short WIIMOTE_BUTTON_B = 0x0004; - private static short WIIMOTE_BUTTON_A = 0x0008; - private static short WIIMOTE_BUTTON_MINUS = 0x0010; - private static short WIIMOTE_BUTTON_ZACCEL_BIT6 = 0x0020; - private static short WIIMOTE_BUTTON_ZACCEL_BIT7 = 0x0040; - private static short WIIMOTE_BUTTON_HOME = 0x0080; - private static short WIIMOTE_BUTTON_LEFT = 0x0100; - private static short WIIMOTE_BUTTON_RIGHT = 0x0200; - private static short WIIMOTE_BUTTON_DOWN = 0x0400; - private static short WIIMOTE_BUTTON_UP = 0x0800; - private static short WIIMOTE_BUTTON_PLUS = 0x1000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT4 = 0x2000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT5 = 0x4000; - private static int WIIMOTE_BUTTON_UNKNOWN = 0x8000; - private static short WIIMOTE_BUTTON_ALL = 0x1F9F; - - /** - * Constructor of the wiimote button Event. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons held. - */ - public WiimoteButtonsEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id, buttonsJustPressed, buttonsJustReleased, buttonsHeld); - } - - /* Button ONE */ - - public boolean isButtonOneJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneHeld() { - return isButtonHeld(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOnePressed() { - return isButtonPressed(WIIMOTE_BUTTON_ONE); - } - - /* Button TWO */ - - public boolean isButtonTwoJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoHeld() { - return isButtonHeld(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoPressed() { - return isButtonPressed(WIIMOTE_BUTTON_TWO); - } - - /* Button A */ - - public boolean isButtonAJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAHeld() { - return isButtonHeld(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAPressed() { - return isButtonPressed(WIIMOTE_BUTTON_A); - } - - /* Button B */ - - public boolean isButtonBJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBHeld() { - return isButtonHeld(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBPressed() { - return isButtonPressed(WIIMOTE_BUTTON_B); - } - - /* Button LEFT */ - - public boolean isButtonLeftJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftHeld() { - return isButtonHeld(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftPressed() { - return isButtonPressed(WIIMOTE_BUTTON_LEFT); - } - - /* Button RIGHT */ - - public boolean isButtonRightJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightHeld() { - return isButtonHeld(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightPressed() { - return isButtonPressed(WIIMOTE_BUTTON_RIGHT); - } - - /* Button UP */ - - public boolean isButtonUpJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpHeld() { - return isButtonHeld(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpPressed() { - return isButtonPressed(WIIMOTE_BUTTON_UP); - } - - /* Button DOWN */ - - public boolean isButtonDownJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownHeld() { - return isButtonHeld(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownPressed() { - return isButtonPressed(WIIMOTE_BUTTON_DOWN); - } - - /* Button - */ - - public boolean isButtonMinusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_MINUS); - } - - /* Button + */ - - public boolean isButtonPlusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusPressed() { - return isButtonPressed(WIIMOTE_BUTTON_PLUS); - } - - /* Button HOME */ - - public boolean isButtonHomeJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeHeld() { - return isButtonHeld(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomePressed() { - return isButtonPressed(WIIMOTE_BUTTON_HOME); - } - - @Override - public String toString() { - return "/******** Buttons for Wiimote generic Event ********/\n" - + super.toString(); - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/EventsGatherer.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/EventsGatherer.java deleted file mode 100644 index 31ed13a..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/EventsGatherer.java +++ /dev/null @@ -1,355 +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.wiiusejevents.utils; - -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; -import wiiusej.wiiusejevents.wiiuseapievents.WiiUseApiEvent; -import wiiusej.wiiusejevents.wiiuseapievents.WiimoteEvent; - -/** - * This class is used to gather events during a call to the Wiiuse API. - * - * @author guiguito - */ -public class EventsGatherer { - - private WiiUseApiEvent[] events; - private int index = 0; - private WiimoteEvent genericEvent = null; - - /** - * Create EventsGatherer. - * - * @param nbWiimotes - * nb wiimotes (nb a of events possible in a call to Wiiuse API). - */ - public EventsGatherer(int nbWiimotes) { - events = new WiiUseApiEvent[nbWiimotes]; - } - - /** - * Add an event to the array. - * - * @param e - * the event to add. - */ - private void addEvent(WiiUseApiEvent e) { - events[index] = e; - index++; - } - - /** - * Prepare a wiimote event to add. - * - * @param id - * id of the wiimote. - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons held. - */ - public void prepareWiiMoteEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - genericEvent = new WiimoteEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate. - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - * @param irSensitivity - * Sensitivity of the infrared camera. - * @param distance - * Pixel Distance between first two dots. - */ - public void prepareIRevent(int x, int y, float z, int ax, int ay, - int xVRes, int yVRes, int xOffset, int yOffset, - short sensorBarPostion, short screenAsPectRatio, - short irSensitivity, float distance) { - genericEvent.prepareIRevent(x, y, z, ax, ay, xVRes, yVRes, xOffset, - yOffset, sensorBarPostion, screenAsPectRatio, irSensitivity, - distance); - - } - - /** - * Add an IR point to the WiiMoteEvent prepared. - * - * @param x - * x coordinates. - * @param y - * y coordinates. - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRPointToPreparedWiiMoteEvent(int x, int y, short rx, - short ry, short size) { - if (genericEvent != null) { - genericEvent.addIRpoint(x, y, rx, ry, size); - } - } - - /** - * Set orientation and gravity force of the prepared event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer. - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer. - * @param smoothingState - * true if smoothing flag is activated. - * @param alphaSmooth - * value of the alpha smoothing parameter. - * @param r - * roll. - * @param p - * pitch. - * @param ya - * yaw. - * @param ar - * absolute roll. - * @param ap - * absolute pitch. - * @param x - * gravity force on x axis. - * @param y - * gravity force on y axis. - * @param z - * gravity force on z axis. - * @param xx - * raw acceleration on x axis. - * @param yy - * raw acceleration on y axis. - * @param zz - * raw acceleration on z axis. - */ - public void addMotionSensingValues(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float ar, float ap, - float x, float y, float z, short xx, short yy, short zz) { - if (genericEvent != null) { - genericEvent.setMotionSensingEvent(orientationThreshold, - accelerationThreshold, smoothingState, alphaSmooth, r, p, - ya, ar, ap, x, y, z, xx, yy, zz); - } - } - - /** - * Set a NunchukEvent to the prepared . - * - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons just pressed. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer. - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer. - * @param smoothingState - * true if smoothing flag is activated. - * @param alphaSmooth - * value of the alpha smoothing parameter. - * @param r - * roll. - * @param p - * pitch. - * @param ya - * yaw. - * @param ar - * absolute roll. - * @param ap - * absolute pitch. - * @param x - * gravity force on x axis. - * @param y - * gravity force on y axis. - * @param z - * gravity force on z axis. - * @param xx - * raw acceleration on x axis. - * @param yy - * raw acceleration on y axis. - * @param zz - * raw acceleration on z axis. - * @param angle - * angle the joystick is being held. - * @param magnitude - * magnitude of the joystick (range 0-1). - * @param max1 - * maximum joystick value 1. - * @param max2 - * maximum joystick value 2. - * @param min1 - * minimum joystick value 1. - * @param min2 - * minimum joystick value 2. - * @param center1 - * center joystick value 1. - * @param center2 - * center joystick value 2. - */ - public void addNunchunkEventToPreparedWiimoteEvent( - short buttonsJustPressed, short buttonsJustReleased, - short buttonsHeld, float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float ar, float ap, - float x, float y, float z, short xx, short yy, short zz, - float angle, float magnitude, short max1, short max2, short min1, - short min2, short center1, short center2) { - if (genericEvent != null) { - genericEvent.setNunchukEvent(buttonsJustPressed, - buttonsJustReleased, buttonsHeld, orientationThreshold, - accelerationThreshold, smoothingState, alphaSmooth, r, p, - ya, ar, ap, x, y, z, xx, yy, zz, angle, magnitude, max1, - max2, min1, min2, center1, center2); - } - } - - /** - * Add the prepared WiimoteEvent to the gatherer. - */ - public void addWiimoteEvent() { - if (genericEvent != null) { - addEvent(genericEvent); - genericEvent = null; - } - } - - /** - * Add a StatusEvent to the gatherer. - * - * @param id - * id of the wiimote. - * @param connect - * true if the wiimote is connected. - * @param batt - * battery level. - * @param led - * status of leds. - * @param speak - * speakers status. - * @param attach - * attachment status. - * @param rumbleState - * true if rumble is active. - * @param continuousState - * true if continuous flag is activated. - * @param irState - * true if ir is active. - * @param motionSensingState - * true if accelerometer is active. - */ - public void addStatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - StatusEvent evt = new StatusEvent(id, connect, batt, led, speak, - attach, rumbleState, continuousState, irState, - motionSensingState); - addEvent(evt); - } - - /** - * Add a DisconnectionEvent to the gatherer. - * - * @param id - * id of the wiimote. - */ - public void addDisconnectionEvent(int id) { - DisconnectionEvent evt = new DisconnectionEvent(id); - addEvent(evt); - } - - /** - * Add a NunchukInsertedEvent to the gatherer. - * - * @param id - * id of the wiimote. - */ - public void addNunchukInsertedEvent(int id) { - NunchukInsertedEvent evt = new NunchukInsertedEvent(id); - addEvent(evt); - } - - /** - * Add a NunchukRemovedEvent to the gatherer. - * - * @param id - * id of the wiimote. - */ - public void addNunchukRemovedEvent(int id) { - NunchukRemovedEvent evt = new NunchukRemovedEvent(id); - addEvent(evt); - } - - /** - * Return an array containing the events. - * - * @return events received. - */ - public WiiUseApiEvent[] getEvents() { - return java.util.Arrays.copyOfRange(events, 0, index); - } - - /** - * Clear the gatherer and remove objects. - */ - public void clearEvents() { - for (int i = 0; i < events.length; i++) { - events[i] = null; - } - genericEvent = null; - index = 0; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiiUseApiListener.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiiUseApiListener.java deleted file mode 100644 index ee1ce80..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiiUseApiListener.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.wiiusejevents.utils; - -import wiiusej.wiiusejevents.wiiuseapievents.WiiUseApiEvent; - -/** - * This is the interface to implement to listen to events from the wiiuse API. - * - * @author guiguito - */ -public interface WiiUseApiListener extends java.util.EventListener { - - /** - * Method called when a WiiUseApiEvent occurs. A WiiUseApiEvent can be : - - * WiimoteEvent (Storing ButtonsEvent and eventually IREvent and - * MotionSensingEvent) - StatusEvent - DisconnectionEvent - * - * @param e - */ - void onWiiUseApiEvent(WiiUseApiEvent e); - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiimoteListener.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiimoteListener.java deleted file mode 100644 index d066516..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/utils/WiimoteListener.java +++ /dev/null @@ -1,107 +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.wiiusejevents.utils; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; -import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; -import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; - -/** - * This is the interface to implement to listen to events from wiimotes. The - * differents methods are called in this order : onButtonsEvent, onIrEvent, - * onMotionSensingEvent, onExpansionEvent, onStatusEvent, onDisconnectionEvent - * onNunchukInsertedEvent, onNunchukRemovedEvent. - * - * @author guiguito - */ -public interface WiimoteListener extends java.util.EventListener { - - /** - * Method called on a button Event. - * - * @param e - * the buttonEvent with the last informations about the buttons - * of the wiimote. - */ - void onButtonsEvent(WiimoteButtonsEvent e); - - /** - * Method called when an IR event occurs. - * - * @param e - * the IREvent with the IR points seen. - */ - void onIrEvent(IREvent e); - - /** - * Method called when a motion sensing event occurs. - * - * @param e - * the motion sensing event with orientation and acceleration. - */ - void onMotionSensingEvent(MotionSensingEvent e); - - /** - * Method called when an expansion event occurs. - * - * @param e - * the expansion event occured. - */ - void onExpansionEvent(ExpansionEvent e); - - /** - * Method called on a status event. A status event occurs when : - we ask it - - * an expansion controller has been plugged - an expansion controller has - * been unplugged This is where you can get the different values of the - * parameters setup on your wiimote. - * - * @param e - * the status event. - */ - void onStatusEvent(StatusEvent e); - - /** - * This is the method called when a disconnection event occurs. A - * disconnection event happens when : - there are no battery left - the - * wiimote has just been turned off - the connection is dropped - * - * @param e - * the disconnection event. - */ - void onDisconnectionEvent(DisconnectionEvent e); - - /** - * This is the method called when a NunchukInsertedEvent occurs. - * - * @param e - * the NunchukInsertedEvent. - */ - void onNunchukInsertedEvent(NunchukInsertedEvent e); - - /** - * This is the method called when a NunchukRemovedEvent occurs. - * - * @param e - * the NunchukRemovedEvent. - */ - void onNunchukRemovedEvent(NunchukRemovedEvent e); -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/DisconnectionEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/DisconnectionEvent.java deleted file mode 100644 index 1c844c7..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/DisconnectionEvent.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.wiiusejevents.wiiuseapievents; - -/** - * Class representing a disconnection event. - * - * @author guiguito - */ -public class DisconnectionEvent extends WiiUseApiEvent { - - /** - * Construct the DisconnectionEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public DisconnectionEvent(int id) { - super(id, WiiUseApiEvent.DISCONNECTION_EVENT); - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** DISCONNECTION EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukInsertedEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukInsertedEvent.java deleted file mode 100644 index 6aff636..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukInsertedEvent.java +++ /dev/null @@ -1,51 +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.wiiusejevents.wiiuseapievents; - -/** - * Event that represents the connection of a nunchuk to a wiimote. - * - * @author guiguito - * - */ -public class NunchukInsertedEvent extends WiiUseApiEvent { - - /** - * Construct the NunchukInsertedEvent setting up the id. - * - * @param id - * id of the wiimote. - */ - public NunchukInsertedEvent(int id) { - super(id, WIIUSE_NUNCHUK_INSERTED); - } - - /* - * (non-Javadoc) - * - * @see wiiusej.wiiusejevents.WiiUseApiEvent#toString() - */ - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** NUNCHUK INSERTED EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukRemovedEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukRemovedEvent.java deleted file mode 100644 index c9c585d..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/NunchukRemovedEvent.java +++ /dev/null @@ -1,50 +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.wiiusejevents.wiiuseapievents; - -/** - * Event that represents the connection of a nunchuk to a wiimote. - * - * @author guiguito - */ -public class NunchukRemovedEvent extends WiiUseApiEvent { - - /** - * Construct the NunchukInsertedEvent setting up the id. - * - * @param id - * id of the wiimote. - */ - public NunchukRemovedEvent(int id) { - super(id, WIIUSE_NUNCHUK_REMOVED); - } - - /* - * (non-Javadoc) - * - * @see wiiusej.wiiusejevents.WiiUseApiEvent#toString() - */ - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** NUNCHUK REMOVED EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/StatusEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/StatusEvent.java deleted file mode 100644 index d200bb7..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/StatusEvent.java +++ /dev/null @@ -1,293 +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.wiiusejevents.wiiuseapievents; - -/** - * Class used to represent a status event. This class is used to know what are - * the settings of the wiimote. - * - * @author guiguito - */ -public class StatusEvent extends WiiUseApiEvent { - - protected static short WIIMOTE_LED_1 = 1; - protected static short WIIMOTE_LED_2 = 2; - protected static short WIIMOTE_LED_3 = 4; - protected static short WIIMOTE_LED_4 = 8; - - /* ATTACHMENT CONSTANTS */ - - private static short EXP_NONE = 0; - private static short EXP_NUNCHUK = 1; - private static short EXP_CLASSIC = 2; - private static short EXP_GUITAR_HERO_3 = 3; - - /* Status variables */ - private boolean connected = false; - - private float batteryLevel = -1; - - private short leds = 0; - - private boolean isSpeakerEnabled = false; - - private int attachment = 0; - - private boolean isRumbleActive = false; - - private boolean isContinuousActive = false; - - private boolean isIrActive = false; - - private boolean isMotionSensingActive = false; - - /** - * Construct the StatusEvent setting up the id. - * - * @param id - * the Wiimote id - */ - public StatusEvent(int id) { - super(id, WiiUseApiEvent.STATUS_EVENT); - } - - /** - * Build a StatusEvent with all fields set. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - * @param rumbleState - * true if rumble is active - * @param continuousState - * true if continuous flag is activated - * @param irState - * true if ir is active - * @param motionSensingState - * true if accelerometer is active - */ - public StatusEvent(int id, boolean connect, float batt, short led, - boolean speak, int attach, boolean rumbleState, - boolean continuousState, boolean irState, boolean motionSensingState) { - super(id, WiiUseApiEvent.STATUS_EVENT); - connected = connect; - this.batteryLevel = batt; - this.leds = led; - this.isSpeakerEnabled = speak; - this.attachment = attach; - isRumbleActive = rumbleState; - isContinuousActive = continuousState; - isIrActive = irState; - isMotionSensingActive = motionSensingState; - } - - /** - * True if the wiimote is connected false otherwise. - * - * @return return the connected status. - */ - public boolean isConnected() { - return connected; - } - - /** - * Get battery level. - * - * @return battery level. 1 = 100% - */ - public float getBatteryLevel() { - return batteryLevel; - } - - /** - * Get status of the leds . - * - * @return a short representing LEDS turned on. - */ - public short getLeds() { - return leds; - } - - /** - * Tells if the given led is turned on according to the leds status int. - * - * @param led - * the int encoding a led. - * @return true if the led is turned on false otherwise. - */ - private boolean ledStatusCheck(short led) { - if ((leds & led) > 0) { - return true; - } else { - return false; - } - } - - /** - * Get led1 status. - * - * @return true if the led is set. - */ - public boolean isLed1Set() { - return ledStatusCheck(WIIMOTE_LED_1); - } - - /** - * Get led2 status. - * - * @return true if the led is set. - */ - public boolean isLed2Set() { - return ledStatusCheck(WIIMOTE_LED_2); - } - - /** - * Get led3 status. - * - * @return true if the led is set. - */ - public boolean isLed3Set() { - return ledStatusCheck(WIIMOTE_LED_3); - } - - /** - * Get led4 status. - * - * @return true if the led is set. - */ - public boolean isLed4Set() { - return ledStatusCheck(WIIMOTE_LED_4); - } - - /** - * Tell if the speaker is enable for this wiimote - * - * @return TRUE if it enabled false otherwise - */ - public boolean isSpeakerEnabled() { - return isSpeakerEnabled; - } - - /** - * Get the int representing the attachment type. - * - * @return value of the Attachment Type - */ - public int getAttachment() { - return attachment; - } - - /** - * Get the status of rumble. - * - * @return true if the rumble is active false otherwise - */ - public boolean isRumbleActive() { - return isRumbleActive; - } - - /** - * Tell if the CONTINUOUS option is activated. - * - * @return the isContinuousActive - */ - public boolean isContinuousActive() { - return isContinuousActive; - } - - /** - * Tell if the IR Tracking is active. - * - * @return TRUE if it is active or false otherwise. - */ - public boolean isIrActive() { - return isIrActive; - } - - /** - * Get the flag indicating if the motion sensing is active. - * - * @return true if the motion sensing is active false otherwise - */ - public boolean isMotionSensingActive() { - return isMotionSensingActive; - } - - /** - * Tells if an attachment is connected. - * - * @return true if anything is connected to the wiimote false otherwise. - */ - public boolean isAttachmentConnected() { - return attachment == EXP_NONE; - } - - /** - * Tells if a nunchuk is connected. - * - * @return true if a nunchuk is connected to the wiimote false otherwise. - */ - public boolean isNunchukConnected() { - return attachment == EXP_NUNCHUK; - } - - /** - * Tells if a classic controller is connected. - * - * @return true if a classic controller is connected to the wiimote false otherwise. - */ - public boolean isClassicControllerConnected() { - return attachment == EXP_CLASSIC; - } - - /** - * Tells if a guitar hero controller is connected. - * - * @return true if a guitar hero controllerr is connected to the wiimote false otherwise. - */ - public boolean isGuitarHeroConnected() { - return attachment == EXP_GUITAR_HERO_3; - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** STATUS EVENT : WIIMOTE ID :" - + super.getWiimoteId() + " ********/\n"; - out += "--- connected : " + connected + "\n"; - out += "--- Battery level : " + batteryLevel + "\n"; - out += "--- Leds : " + leds + "\n"; - out += "--- Speaker enabled : " + isSpeakerEnabled + "\n"; - out += "--- Attachment ? : " + attachment + "\n"; - out += "--- Rumble ? : " + isRumbleActive + "\n"; - out += "--- Continuous ? : " + isContinuousActive + "\n"; - out += "--- IR active ? : " + isIrActive + "\n"; - out += "--- Motion sensing active ? : " + isMotionSensingActive + "\n"; - return out; - } - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiiUseApiEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiiUseApiEvent.java deleted file mode 100644 index 0527b13..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiiUseApiEvent.java +++ /dev/null @@ -1,66 +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.wiiusejevents.wiiuseapievents; - -import wiiusej.wiiusejevents.GenericEvent; - -/** - * This class describes the structure of an event from the WiiUse API event. - * - * @author guiguito - */ -public abstract class WiiUseApiEvent extends GenericEvent{ - - public static int NONE_EVENT = 0; - public static int GENERIC_EVENT = 1; - public static int STATUS_EVENT = 2; - public static int DISCONNECTION_EVENT = 3; - public static int WIIUSE_READ_DATA = 4; - public static int WIIUSE_NUNCHUK_INSERTED = 5; - public static int WIIUSE_NUNCHUK_REMOVED = 6; - public static int WIIUSE_CLASSIC_CTRL_INSERTED = 7; - public static int WIIUSE_CLASSIC_CTRL_REMOVED = 8; - public static int WIIUSE_GUITAR_HERO_3_CTRL_INSERTED = 9; - public static int WIIUSE_GUITAR_HERO_3_CTRL_REMOVED = 10; - - /* Event Type */ - private int eventType; - - /** - * Construct the WiiUseApiEvent setting up the id. - * - * @param id - * the Wiimote id - * @param type - * type of the event - */ - public WiiUseApiEvent(int id, int type) { - super(id); - eventType = type; - } - - /** - * Get the event type. - * @return the eventType - */ - public int getEventType() { - return eventType; - } - - public abstract String toString(); - -} diff --git a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiimoteEvent.java b/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiimoteEvent.java deleted file mode 100644 index 04c1840..0000000 --- a/WiiUseJ_0.12/src/wiiusej/wiiusejevents/wiiuseapievents/WiimoteEvent.java +++ /dev/null @@ -1,345 +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.wiiusejevents.wiiuseapievents; - -import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; -import wiiusej.wiiusejevents.physicalevents.IREvent; -import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; -import wiiusej.wiiusejevents.physicalevents.NunchukEvent; -import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; - -/** - * Class that is a bean to be filled by the wiiuse API on an event that occurs - * on a wiimote. - * - * @author guiguito - */ -public class WiimoteEvent extends WiiUseApiEvent { - - WiimoteButtonsEvent buttonsEvent = null; - IREvent infraredEvent = null; - MotionSensingEvent motionSensingEvent = null; - ExpansionEvent expansionEvent = null; - - /** - * Construct the Wiimote setting up the id. - * - * @param id - * the Wiimote id - */ - public WiimoteEvent(int id) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - } - - /** - * Construct the Wiimote setting up the id and the buttons. - * - * @param id - * the Wiimote id - * @param buttonsJustPressed - * buttons just pressed - * @param buttonsJustReleased - * buttons just released - * @param buttonsHeld - * buttons held - */ - public WiimoteEvent(int id, short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld) { - super(id, WiiUseApiEvent.GENERIC_EVENT); - buttonsEvent = new WiimoteButtonsEvent(id, buttonsJustPressed, - buttonsJustReleased, buttonsHeld); - } - - /** - * Tell if there is an IR Event. - * - * @return TRUE if there is an IR event. - */ - public boolean isThereIrEvent() { - return infraredEvent != null; - } - - /** - * Tell if there is a motion sensing Event. - * - * @return TRUE if there is a motion sensing event. - */ - public boolean isThereMotionSensingEvent() { - return motionSensingEvent != null; - } - - /** - * Tell if there is an expansion Event. - * - * @return TRUE if there is an expansion event. - */ - public boolean isThereExpansionEvent() { - return expansionEvent != null; - } - - /** - * Get buttons event. - * - * @return the buttons event. - */ - public WiimoteButtonsEvent getButtonsEvent() { - return buttonsEvent; - } - - /** - * Get the IR event. - * - * @return the IR event if there is one or null. - */ - public IREvent getIREvent() { - return infraredEvent; - } - - /** - * Get the motion sensing event. - * - * @return the motion sensing event if there is one or null. - */ - public MotionSensingEvent getMotionSensingEvent() { - return motionSensingEvent; - } - - /** - * Get the expansion event. - * - * @return the expansion event if there is one or null. - */ - public ExpansionEvent getExpansionEvent() { - return expansionEvent; - } - - /** - * Prepare an IR event to populate. - * - * @param x - * calculated X coordinate. - * @param y - * calculated Y coordinate. - * @param z - * calculated distance. - * @param ax - * absolute X coordinate. - * @param ay - * absolute Y coordinate - * @param xVRes - * IR virtual screen x resolution. - * @param yVRes - * IR virtual screen y resolution. - * @param xOffset - * IR X correction offset. - * @param yOffset - * IR Y correction offset. - * @param sensorBarPostion - * aspect ratio of the screen. - * @param screenAsPectRatio - * IR sensor bar position. - * @param irSensitivity - * Sensitivity of the infrared camera. - * @param distance - * Pixel Distance between first two dots - */ - public void prepareIRevent(int x, int y, float z, int ax, int ay, - int xVRes, int yVRes, int xOffset, int yOffset, - short sensorBarPostion, short screenAsPectRatio, - short irSensitivity, float distance) { - if (infraredEvent == null) { - infraredEvent = new IREvent(getWiimoteId(), x, y, z, ax, ay, xVRes, - yVRes, xOffset, yOffset, sensorBarPostion, - screenAsPectRatio, irSensitivity, distance); - } - } - - /** - * Add an IR point to the generic event. Create an IR Event if it's not - * created yet. - * - * @param x - * x coordinates. - * @param y - * y coordinates - * @param rx - * raw X coordinate (0-1023). - * @param ry - * raw Y coordinate (0-1023). - * @param size - * size of the IR dot (0-15). - */ - public void addIRpoint(int x, int y, short rx, short ry, short size) { - if (infraredEvent != null) - infraredEvent.addIRpoint(x, y, rx, ry, size); - } - - /** - * Set the Motion Sensing Event. - * - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer. - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer. - * @param smoothingState - * true if smoothing flag is activated. - * @param alphaSmooth - * value of the alpha smoothing parameter. - * @param r - * roll. - * @param p - * pitch. - * @param ya - * yaw. - * @param ar - * absolute roll. - * @param ap - * absolute pitch. - * @param x - * gravity force on x axis. - * @param y - * gravity force on y axis. - * @param z - * gravity force on z axis. - * @param xx - * raw acceleration on x axis. - * @param yy - * raw acceleration on y axis. - * @param zz - * raw acceleration on z axis. - */ - public void setMotionSensingEvent(float orientationThreshold, - int accelerationThreshold, boolean smoothingState, - float alphaSmooth, float r, float p, float ya, float ar, float ap, - float x, float y, float z, short xx, short yy, short zz) { - motionSensingEvent = new MotionSensingEvent(getWiimoteId(), - orientationThreshold, accelerationThreshold, smoothingState, - alphaSmooth, r, p, ya, ar, ap, x, y, z, xx, yy, zz); - } - - /** - * Set a NunchukEvent for the expansion event. - * - * @param buttonsJustPressed - * buttons just pressed. - * @param buttonsJustReleased - * buttons just released. - * @param buttonsHeld - * buttons just pressed. - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer. - * @param accelerationThreshold - * value of the value variation between two events with the - * accelerometer. - * @param smoothingState - * true if smoothing flag is activated. - * @param alphaSmooth - * value of the alpha smoothing parameter. - * @param r - * roll. - * @param p - * pitch. - * @param ya - * yaw. - * @param ar - * absolute roll. - * @param ap - * absolute pitch. - * @param x - * gravity force on x axis. - * @param y - * gravity force on y axis. - * @param z - * gravity force on z axis. - * @param xx - * raw acceleration on x axis. - * @param yy - * raw acceleration on y axis. - * @param zz - * raw acceleration on z axis. - * @param angle - * angle the joystick is being held. - * @param magnitude - * magnitude of the joystick (range 0-1). - * @param max1 - * maximum joystick value 1. - * @param max2 - * maximum joystick value 2. - * @param min1 - * minimum joystick value 1. - * @param min2 - * minimum joystick value 2. - * @param center1 - * center joystick value 1. - * @param center2 - * center joystick value 2. - */ - public void setNunchukEvent(short buttonsJustPressed, - short buttonsJustReleased, short buttonsHeld, - float orientationThreshold, int accelerationThreshold, - boolean smoothingState, float alphaSmooth, float r, float p, - float ya, float ar, float ap, float x, float y, float z, short xx, - short yy, short zz, float angle, float magnitude, short max1, - short max2, short min1, short min2, short center1, short center2) { - expansionEvent = new NunchukEvent(getWiimoteId(), buttonsJustPressed, - buttonsJustReleased, buttonsHeld, orientationThreshold, - accelerationThreshold, smoothingState, alphaSmooth, r, p, ya, - ar, ap, x, y, z, xx, yy, zz, angle, magnitude, max1, max2, - min1, min2, center1, center2); - } - - public void setClassicControllerEvent() { - // @TODO - } - - @Override - public String toString() { - String out = ""; - /* Status */ - out += "/*********** GENERIC EVENT : WIIMOTE ID :" + getWiimoteId() - + " ********/\n"; - - out += buttonsEvent; - - if (infraredEvent != null) { - out += infraredEvent; - } else { - out += "/******** IR Tracking ********/\n"; - out += "--- Active : false\n"; - } - - if (motionSensingEvent != null) { - out += motionSensingEvent; - } else { - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : false \n"; - } - - if (expansionEvent != null) { - out += expansionEvent; - } else { - out += "/******** Expansion ********/\n"; - out += "--- No expansion connected \n"; - } - - return out; - } - -} diff --git a/WiiUseJ_0.12/wiiuse.dll b/WiiUseJ_0.12/wiiuse.dll deleted file mode 100644 index a7e228c8743a1ff5cd537f1670304e79c2f46c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 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 r0_7Gcw?MfC$}LcCfpQC!TcF$m - - - - - diff --git a/tag1/WiiUseJ/.project b/tag1/WiiUseJ/.project deleted file mode 100644 index 9485f4a..0000000 --- a/tag1/WiiUseJ/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - WiiUseJava - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/tag1/WiiUseJ/libWiiuseJ.dll b/tag1/WiiUseJ/libWiiuseJ.dll deleted file mode 100644 index e38a95c851f6e2e90c6cf5200fb9392dd4c82cd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23146 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 - System.out.println(wiimotes[0]); - Tests tests = 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/tag1/WiiUseJ/src/wiiusej/GForce.java b/tag1/WiiUseJ/src/wiiusej/GForce.java deleted file mode 100644 index 3cd513d..0000000 --- a/tag1/WiiUseJ/src/wiiusej/GForce.java +++ /dev/null @@ -1,81 +0,0 @@ -package wiiusej; - -/** - * Represents gravity force on each axis. - * @author gduche - * - */ -public class GForce { - - private float x; - private float y; - private float z; - - /** - * Default constructor; - */ - public GForce(){ - x = 0; - y = 0; - z = 0; - } - - /** - * Constructor with gravity force on each axis. - * @param xx x value - * @param yy x value - * @param zz x value - */ - public GForce(float xx, float yy, float zz){ - x = xx; - y = yy; - z = zz; - } - - /** - * @return the x - */ - public float getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(float x) { - this.x = x; - } - - /** - * @return the y - */ - public float getY() { - return y; - } - - /** - * @param y the y to set - */ - public void setY(float y) { - this.y = y; - } - - /** - * @return the z - */ - public float getZ() { - return z; - } - - /** - * @param z the z to set - */ - public void setZ(float z) { - this.z = z; - } - - @Override - public String toString() { - return "Gravity force : ("+x+", "+y+","+z+")"; - } -} diff --git a/tag1/WiiUseJ/src/wiiusej/LedsRequest.java b/tag1/WiiUseJ/src/wiiusej/LedsRequest.java deleted file mode 100644 index c068ba3..0000000 --- a/tag1/WiiUseJ/src/wiiusej/LedsRequest.java +++ /dev/null @@ -1,109 +0,0 @@ -package wiiusej; - -/** - * Represents a request to set leds of the wiimote with WiiUse API. - * @author gduche - * - */ -public class LedsRequest extends wiiusej.WiiUseApiRequest { - - private boolean led1, led2, led3, led4; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - */ - public LedsRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * id of the wiimote concerned - * @param type - * type of the request - * @param l1 - * led1 status. True=ON, False=OFF - * @param l2 - * led2 status. True=ON, False=OFF - * @param l3 - * led3 status. True=ON, False=OFF - * @param l4 - * led4 status. True=ON, False=OFF - */ - public LedsRequest(int id, int type, boolean l1, boolean l2, boolean l3, - boolean l4) { - super(id, type); - led1 = l1; - led2 = l2; - led3 = l3; - led4 = l4; - } - - /** - * @return the led1 - */ - public boolean isLed1() { - return led1; - } - - /** - * @param led1 - * the led1 to set - */ - public void setLed1(boolean led1) { - this.led1 = led1; - } - - /** - * @return the led2 - */ - public boolean isLed2() { - return led2; - } - - /** - * @param led2 - * the led2 to set - */ - public void setLed2(boolean led2) { - this.led2 = led2; - } - - /** - * @return the led3 - */ - public boolean isLed3() { - return led3; - } - - /** - * @param led3 - * the led3 to set - */ - public void setLed3(boolean led3) { - this.led3 = led3; - } - - /** - * @return the led4 - */ - public boolean isLed4() { - return led4; - } - - /** - * @param led4 - * the led4 to set - */ - public void setLed4(boolean led4) { - this.led4 = led4; - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/OrientThresholdRequest.java b/tag1/WiiUseJ/src/wiiusej/OrientThresholdRequest.java deleted file mode 100644 index 0d3cc14..0000000 --- a/tag1/WiiUseJ/src/wiiusej/OrientThresholdRequest.java +++ /dev/null @@ -1,54 +0,0 @@ -package wiiusej; - -/** - * Represents a request to set orientation Threshold in Wiiuse API. - * Orientation Threshold is the minimum angle (in degrees) between two events. - * @author gduche - * - */ -public class OrientThresholdRequest extends WiiUseApiRequest { - - private float thresholhd; - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - */ - public OrientThresholdRequest(int id, int type) { - super(id, type); - } - - /** - * Constructor setting the id of the wiimote concerned. - * - * @param id - * the id of the wiimote concerned. - * @param type - * type of the request - * @param th - * threshold in degrees - */ - public OrientThresholdRequest(int id, int type, float th) { - super(id, type); - thresholhd = th; - } - - /** - * @return the thresholhd - */ - public float getThresholhd() { - return thresholhd; - } - - /** - * @param thresholhd the thresholhd to set - */ - public void setThresholhd(float thresholhd) { - this.thresholhd = thresholhd; - } - - - -} diff --git a/tag1/WiiUseJ/src/wiiusej/Orientation.java b/tag1/WiiUseJ/src/wiiusej/Orientation.java deleted file mode 100644 index 52ebd7c..0000000 --- a/tag1/WiiUseJ/src/wiiusej/Orientation.java +++ /dev/null @@ -1,77 +0,0 @@ -package wiiusej; - -/** - * Class that represents the orientation of the wiimote. - * @author gduche - * - */ -public class Orientation { - - private float roll; - private float pitch; - private float yaw; - - /** - * Default constructor. - */ - public Orientation(){ - roll = 0; - pitch = 0; - yaw = 0; - } - - /** - * Contructor with raw, pitch , yaw. - * @param r raw - * @param p pitch - * @param y yaw - */ - public Orientation(float r, float p, float y){ - roll = r; - pitch = p; - yaw = y; - } - - /** - * @return the roll - */ - public float getRoll() { - return roll; - } - /** - * @param roll the roll to set - */ - public void setRoll(float roll) { - this.roll = roll; - } - /** - * @return the pitch - */ - public float getPitch() { - return pitch; - } - /** - * @param pitch the pitch to set - */ - public void setPitch(float pitch) { - this.pitch = pitch; - } - /** - * @return the yaw - */ - public float getYaw() { - return yaw; - } - /** - * @param yaw the yaw to set - */ - public void setYaw(float yaw) { - this.yaw = yaw; - } - - @Override - public String toString() { - return "Orientation : (roll: "+roll+", pitch: "+pitch+", yaw: "+yaw+")"; - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/Point2DInteger.java b/tag1/WiiUseJ/src/wiiusej/Point2DInteger.java deleted file mode 100644 index f2f9181..0000000 --- a/tag1/WiiUseJ/src/wiiusej/Point2DInteger.java +++ /dev/null @@ -1,35 +0,0 @@ -package wiiusej; - -import java.awt.geom.Point2D; - -public class Point2DInteger extends Point2D { - private int x; - private int y; - - public Point2DInteger(int xx, int yy) { - super(); - setLocation(xx,yy); - } - - @Override - public double getX() { - return x; - } - - @Override - public double getY() { - return y; - } - - @Override - public void setLocation(double xx, double yy) { - this.x = (int)xx; - this.y = (int)yy; - } - - @Override - public String toString() { - return "("+x+","+y+")"; - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/WiiMoteEvent.java b/tag1/WiiUseJ/src/wiiusej/WiiMoteEvent.java deleted file mode 100644 index 8e2ee7c..0000000 --- a/tag1/WiiUseJ/src/wiiusej/WiiMoteEvent.java +++ /dev/null @@ -1,624 +0,0 @@ -package wiiusej; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - * Class that is a bean to be filled by the wiiuse API. - * - * @author gduche - * - */ -public class WiiMoteEvent { - - /* Buttons MACRO */ - private static short WIIMOTE_BUTTON_TWO = 0x0001; - private static short WIIMOTE_BUTTON_ONE = 0x0002; - private static short WIIMOTE_BUTTON_B = 0x0004; - private static short WIIMOTE_BUTTON_A = 0x0008; - private static short WIIMOTE_BUTTON_MINUS = 0x0010; - private static short WIIMOTE_BUTTON_ZACCEL_BIT6 = 0x0020; - private static short WIIMOTE_BUTTON_ZACCEL_BIT7 = 0x0040; - private static short WIIMOTE_BUTTON_HOME = 0x0080; - private static short WIIMOTE_BUTTON_LEFT = 0x0100; - private static short WIIMOTE_BUTTON_RIGHT = 0x0200; - private static short WIIMOTE_BUTTON_DOWN = 0x0400; - private static short WIIMOTE_BUTTON_UP = 0x0800; - private static short WIIMOTE_BUTTON_PLUS = 0x1000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT4 = 0x2000; - private static short WIIMOTE_BUTTON_ZACCEL_BIT5 = 0x4000; - private static int WIIMOTE_BUTTON_UNKNOWN = 0x8000; - private static short WIIMOTE_BUTTON_ALL = 0x1F9F; - - private static short WIIMOTE_LED_1 = 1; - private static short WIIMOTE_LED_2 = 2; - private static short WIIMOTE_LED_3 = 4; - private static short WIIMOTE_LED_4 = 8; - - private static short NB_LEDS = 4; - - /* ID */ - private int wiimoteId = -1; - - /* Status variables */ - private boolean connected = false; - - private float batteryLevel = -1; - - private short leds = 0; - - private boolean isSpeakerEnabled = false; - - private boolean isThereAttachment = false; - - private boolean isRumbleActive = false; - - private float orientationThreshold = 0; - - private boolean isContinuousActive = false; - - private boolean isSmoothingActive = false; - - /* Buttons */ - private short buttonsJustPressed = 0; - private short buttonsJustReleased = 0; - private short buttonsHeld = 0; - - /* IR Tracking */ - private boolean isIrActive = false; - private Point2DInteger[] IRPoints; - - /* Motion Sensing */ - private boolean isMotionSensingActive = false; - private Orientation orientation; - private GForce gforce; - - /** - * Default constructor - */ - public WiiMoteEvent() { - // init IRPoints array - IRPoints = new Point2DInteger[NB_LEDS]; - } - - /** - * Construct the Wiimote setting up the id. - * - * @param id - * the Wiimote id - */ - public WiiMoteEvent(int id) { - this(); - wiimoteId = id; - } - - /** - * Get Wiimote ID - * - * @return the wiimote id. - */ - public int getWiimoteId() { - return wiimoteId; - } - - /** - * Set Wiimote ID - * - * @param wiimoteId - * id of the wiimote - */ - void setWiimoteId(int wiimoteId) { - this.wiimoteId = wiimoteId; - } - - /** - * True if the wiimote is connected false otherwise. - * - * @return return the connected status. - */ - public boolean isConnected() { - return connected; - } - - /** - * Set the connected value to true. - */ - void setConnected() { - this.connected = true; - } - - /** - * Set the connected value to false. - */ - void setDisconnected() { - this.connected = false; - } - - /** - * Get battery level. - * - * @return battery level. 1 = 100% - */ - public float getBatteryLevel() { - return batteryLevel; - } - - /** - * Get status of the leds . - * - * @return a short representing LEDS turned on. - */ - public short getLeds() { - return leds; - } - - /** - * Tell if the speaker is enable for this wiimote - * - * @return TRUE if it enabled false otherwise - */ - public boolean isSpeakerEnabled() { - return isSpeakerEnabled; - } - - /** - * Tell if there is an attachment to the Wiimote - * - * @return TRUE if it there is one false otherwise - */ - public boolean isThereAttachment() { - return isThereAttachment; - } - - /** - * Set battery level, leds, speaker state and attachment in one method. - * These method is called (and those variables are filled) only when a - * status has been requested on this wiimote. - * - * @param batt - * battery level - * @param led - * status of leds - * @param speak - * speakers status - * @param attach - * attachment status - */ - void setBatteryLedsSpeakerAttachment(float batt, short led, boolean speak, - boolean attach) { - this.batteryLevel = batt; - this.leds = led; - this.isSpeakerEnabled = speak; - this.isThereAttachment = attach; - } - - /** - * Get the status of rumble. - * - * @return true if the rumble is active false otherwise - */ - public boolean isRumbleActive() { - return isRumbleActive; - } - - /** - * Set Rumble flag to Inactive. - */ - void setRumbleInactive() { - this.isRumbleActive = false; - } - - /** - * Get orientation threshold. - * - * @return the orientationThreshold - */ - public float getOrientationThreshold() { - return orientationThreshold; - } - - /** - * Tell if the CONTINUOUS option is activated. - * - * @return the isContinuousActive - */ - public boolean isContinuousActive() { - return isContinuousActive; - } - - /** - * Tell if the option SMOOTHING is activated. - * - * @return the isSmoothingActive - */ - public boolean isSmoothingActive() { - return isSmoothingActive; - } - - /** - * Get the short storing the buttons just pressed - * - * @return the short storing the buttons just pressed - */ - public short getButtonsJustPressed() { - return buttonsJustPressed; - } - - /** - * Get the short storing the buttons just released - * - * @return the short storing the buttons just released - */ - public short getButtonsJustReleased() { - return buttonsJustReleased; - } - - /** - * get the short storing the buttons held - * - * @return the short storing the buttons held - */ - public short getButtonsHeld() { - return buttonsHeld; - } - - /** - * Set all buttons in one method. - * - * @param buttonsJustPressed - * @param buttonsJustReleased - * @param buttonsHeld - */ - void setAllButtons(short buttonsJustPressed, short buttonsJustReleased, - short buttonsHeld) { - this.buttonsJustPressed = buttonsJustPressed; - this.buttonsJustReleased = buttonsJustReleased; - this.buttonsHeld = buttonsHeld; - } - - /** - * Tell if the IR Tracking is active. - * - * @return TRUE if it is active or false otherwise. - */ - public boolean isIrActive() { - return isIrActive; - } - - /** - * Get list of IR points. - * - * @return the list of 2D points - */ - public Point2DInteger[] getIRPoints() { - return IRPoints; - } - - /** - * Add IR Point in the list (Max 4 points) - * - * @param x - * x value - * @param y - * y value - */ - void addIRpoint(int x, int y) { - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] == null) { - IRPoints[i] = new Point2DInteger(x, y); - return; - } - } - return; - } - - /** - * Clear IR points. - */ - void EmptyIRPoints() { - for (int i = 0; i < IRPoints.length; i++) { - IRPoints[i] = null; - } - } - - /** - * Get the flag indicating if the motion sensing is active. - * - * @return true if the motion sensing is active false otherwise - */ - public boolean isMotionSensingActive() { - return isMotionSensingActive; - } - - /** - * Set status variables always filled during an event. - * - * @param id - * id of the wiimote - * @param connect - * true if the wiimote is connected - * @param irState - * true if ir is active - * @param rumbleState - * true if rumble is active - * @param motionSensingState - * true if accelerometer is active - * @param orientationThreshold - * value of the minimum angle between two events with the - * accelerometer - * @param continuousState - * true if continuous flag is activated - * @param smoothingState - * true if smoothing flag is activated - */ - void setPermanentStatus(int id, boolean connect, boolean irState, - boolean rumbleState, boolean motionSensingState, - float orientationThreshold, boolean continuousState, - boolean smoothingState) { - wiimoteId = id; - connected = connect; - isIrActive = irState; - isRumbleActive = rumbleState; - isMotionSensingActive = motionSensingState; - this.orientationThreshold = orientationThreshold; - isContinuousActive = continuousState; - isSmoothingActive = smoothingState; - } - - /** - * @return the orientation - */ - public Orientation getOrientation() { - return orientation; - } - - /** - * Get the gravity force. - * - * @return the gforce - */ - public GForce getGforce() { - return gforce; - } - - /** - * Set orientation and gravity force. - * - * @param r - * roll - * @param p - * pitch - * @param ya - * yaw - * @param x - * gravity force on x axis - * @param y - * gravity force on y axis - * @param z - * gravity force on z axis - */ - void setOrientationAndGforce(float r, float p, float ya, float x, float y, - float z) { - this.orientation = new Orientation(r, p, ya); - this.gforce = new GForce(x, y, z); - } - - /** **************** BUTTONS Methods ***************** */ - /* generic button functions */ - - private boolean buttonTest(short buttonBitsDefinition, short buttons) { - return (buttons & buttonBitsDefinition) == buttonBitsDefinition; - } - - private boolean isButtonJustPressed(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustPressed) - && !isButtonHeld(buttonBitsDefinition); - } - - private boolean isButtonJustReleased(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsJustReleased); - } - - private boolean isButtonHeld(short buttonBitsDefinition) { - return buttonTest(buttonBitsDefinition, buttonsHeld); - } - - /* Button ONE */ - - public boolean isButtonOneJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_ONE); - } - - public boolean isButtonOneHeld() { - return isButtonHeld(WIIMOTE_BUTTON_ONE); - } - - /* Button TWO */ - - public boolean isButtonTwoJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_TWO); - } - - public boolean isButtonTwoHeld() { - return isButtonHeld(WIIMOTE_BUTTON_TWO); - } - - /* Button A */ - - public boolean isButtonAJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_A); - } - - public boolean isButtonAHeld() { - return isButtonHeld(WIIMOTE_BUTTON_A); - } - - /* Button B */ - - public boolean isButtonBJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_B); - } - - public boolean isButtonBHeld() { - return isButtonHeld(WIIMOTE_BUTTON_B); - } - - /* Button LEFT */ - - public boolean isButtonLeftJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_LEFT); - } - - public boolean isButtonLeftHeld() { - return isButtonHeld(WIIMOTE_BUTTON_LEFT); - } - - /* Button RIGHT */ - - public boolean isButtonRightJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_RIGHT); - } - - public boolean isButtonRightHeld() { - return isButtonHeld(WIIMOTE_BUTTON_RIGHT); - } - - /* Button UP */ - - public boolean isButtonUpJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_UP); - } - - public boolean isButtonUpHeld() { - return isButtonHeld(WIIMOTE_BUTTON_UP); - } - - /* Button DOWN */ - - public boolean isButtonDownJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_DOWN); - } - - public boolean isButtonDownHeld() { - return isButtonHeld(WIIMOTE_BUTTON_DOWN); - } - - /* Button - */ - - public boolean isButtonMinusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_MINUS); - } - - public boolean isButtonMinusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_MINUS); - } - - /* Button + */ - - public boolean isButtonPlusJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_PLUS); - } - - public boolean isButtonPlusHeld() { - return isButtonHeld(WIIMOTE_BUTTON_PLUS); - } - - /* Button HOME */ - - public boolean isButtonHomeJustPressed() { - return isButtonJustPressed(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeJustReleased() { - return isButtonJustReleased(WIIMOTE_BUTTON_HOME); - } - - public boolean isButtonHomeHeld() { - return isButtonHeld(WIIMOTE_BUTTON_HOME); - } - - @Override - public String toString() { - super.toString(); - String out = ""; - /* Status */ - out += "/*********** WIIMOTE ID :" + wiimoteId + " ********/\n"; - out += "--- connected : " + connected + "\n"; - out += "--- Battery level : " + batteryLevel + "\n"; - out += "--- Leds : " + leds + "\n"; - out += "--- Speaker enabled : " + isSpeakerEnabled + "\n"; - out += "--- Attachment ? : " + isThereAttachment + "\n"; - out += "--- Rumble ? : " + isRumbleActive + "\n"; - out += "--- Orientation threshold value ? : " + orientationThreshold - + "\n"; - out += "--- Continuous ? : " + isContinuousActive + "\n"; - out += "--- Smoothing ? : " + isSmoothingActive + "\n"; - /* Display buttons */ - out += "/******** Buttons ********/\n"; - out += "--- Buttons just pressed : " + buttonsJustPressed + "\n"; - out += "--- Buttons just released : " + buttonsJustReleased + "\n"; - out += "--- Buttons held : " + buttonsHeld + "\n"; - - /* Display IR Tracking */ - out += "/******** IR Tracking ********/\n"; - out += "--- Active : " + isIrActive + "\n"; - if (isIrActive) { - out += "--- Seen points\n"; - for (int i = 0; i < IRPoints.length; i++) { - if (IRPoints[i] != null) { - out += IRPoints[i].toString(); - } - } - } - - /* Motion sensing */ - out += "/******** Motion sensing ********/\n"; - out += "--- Motion sensing : " + isMotionSensingActive + "\n"; - if (isMotionSensingActive) { - out += "--- " + orientation + "\n"; - out += "--- " + gforce + "\n"; - } - return out; - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/WiiUseApi.java b/tag1/WiiUseJ/src/wiiusej/WiiUseApi.java deleted file mode 100644 index 091f269..0000000 --- a/tag1/WiiUseJ/src/wiiusej/WiiUseApi.java +++ /dev/null @@ -1,174 +0,0 @@ -package wiiusej; - -/** - * Singleton used to manipulate WiiUse Api. - * @author gduche - * - */ -public class WiiUseApi { - - static { - System.loadLibrary("libWiiuseJ"); - } - - private static WiiUseApi instance = new WiiUseApi(); - - /** - * Get the only instance of WiiUseApi. - * @return - */ - static WiiUseApi getInstance(){ - return instance; - } - - /** - * Load the library. - * - * @return 0 if there is an error, 1 if everything is ok. - */ - native int loadLibrary(); - - /** - * Try to connect to 2 wiimotes. Make them rumble to show they are - * connected. - * - * @return 0 if there is an error otherwise it returns the number of - * wiimotes connected. - */ - native int doConnections(); - - /** - * Close connection to the wiimote with the given id. - * - */ - native void closeConnection(int id); - - /** - * Shutdown Wiiuse API. - * @return 0 if there is an error, 1 if everything is ok. - */ - native void shutdownApi(); - - /** - * Activate rumble on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateRumble(int id); - - /** - * Deactivate rumble on the wiimote with the given id. - * - * @param id the id of the wiimote. - */ - native void deactivateRumble(int id); - - /** - * Activate IR Tracking on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateIRTracking(int id); - - /** - * Deactivate IR Tracking on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void deactivateIRTracking(int id); - - /** - * Activate motion sensing on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void activateMotionSensing(int id); - - /** - * Deactivate motion sensing on the wiimote with the given id. - * @param id the id of the wiimote. - */ - native void deactivateMotionSensing(int id); - - /** - * Set wiimote leds status. - * @param id the id of the wiimote concerned - * @param led1 status of led1: True=ON, False=OFF - * @param led2 status of led2: True=ON, False=OFF - * @param led3 status of led3: True=ON, False=OFF - * @param led4 status of led4: True=ON, False=OFF - */ - native void setLeds(int id, boolean led1, boolean led2, boolean led3, boolean led4); - - /** - * Set how many degrees an angle must change to generate an event. - * @param id id of the wiimote concerned - * @param angle minimum angle detected by an event - */ - native void setOrientThreshold(int id, float angle); - - /** - * Make the the accelerometers give smoother results. - * This is set by default. - * @param id the id of the wiimote concerned - */ - native void activateSmoothing(int id); - - /** - * Make the the accelerometers give raw results. - * @param id the id of the wiimote concerned - */ - native void deactivateSmoothing(int id); - - /** - * Make the wiimote generate an event each time we poll. - * Not set by default. - * @param id the id of the wiimote concerned - */ - native void activateContinuous(int id); - - /** - * Make the wiimote generate an event only when there is one. - * @param id the id of the wiimote concerned - */ - native void deactivateContinuous(int id); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param id the id of the wiimote of which we want the status. - */ - native void getStatus(int id); - - /** - * Get status and values from the wiimotes and send it through callbacks. - * - * @param mote The WiimoteEvent object to fill with the datas. - */ - native void specialPoll(WiiMoteEvent mote); - - - /* Tests */ - public static void main(String[] args) { - - /* Test JNI Side */ - WiiUseApi manager = new WiiUseApi(); - - int value = manager.loadLibrary(); - System.out.println("loadLibrary : " + value); - - value = manager.doConnections(); - System.out.println("doConnections : " + value); - - WiiMoteEvent mote = new WiiMoteEvent(); - - manager.getStatus(1); - System.out.println("Status : \n" + mote); - - System.out.println(""); - System.out.println("!!!!!!!!!!!!!! Polling !!!!!!!!!"); - while (true) { - manager.specialPoll(mote); - System.out.println(mote); - mote.EmptyIRPoints(); - } - // manager.closeConnectionsAndShutDown(); - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/WiiUseApiListener.java b/tag1/WiiUseJ/src/wiiusej/WiiUseApiListener.java deleted file mode 100644 index 81f3792..0000000 --- a/tag1/WiiUseJ/src/wiiusej/WiiUseApiListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package wiiusej; - - - -public interface WiiUseApiListener extends java.util.EventListener { - - void wiimoteEvent(WiiMoteEvent e); - -} diff --git a/tag1/WiiUseJ/src/wiiusej/WiiUseApiManager.java b/tag1/WiiUseJ/src/wiiusej/WiiUseApiManager.java deleted file mode 100644 index 7ab9825..0000000 --- a/tag1/WiiUseJ/src/wiiusej/WiiUseApiManager.java +++ /dev/null @@ -1,430 +0,0 @@ -package wiiusej; - -import java.util.ArrayList; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.swing.event.EventListenerList; - -/** - * Class that manage the use of Wiiuse API. - * - * @author gduche - * - */ -public class WiiUseApiManager extends Thread { - - private static WiiUseApiManager instance = new WiiUseApiManager(); - - private final EventListenerList listeners = new EventListenerList(); - - private Wiimote[] wiimotes; - - private WiiUseApi wiiuse = WiiUseApi.getInstance(); - - private boolean loaded = false; - - private int connected = -1; - - private AtomicBoolean running = new AtomicBoolean(false); - - private ConcurrentLinkedQueue requests = new ConcurrentLinkedQueue(); - - public static WiiUseApiManager getInstance() { - return instance; - } - - /** - * Get wiimotes. - * Load library if necessary. - * Connect to wiimotes if necessary. - * Start polling if necessary. - * Return an array with the connected wiimotes. - * @return an array with connected wiimotes or NULL. - */ - public static Wiimote[] getWiimotes() { - WiiUseApiManager manager = getInstance(); - if (!manager.loaded){ - manager.loadLibrary(); - } - if (manager.connected<0){ - int nbWiimotes = manager.connectWiimotes(); - manager.wiimotes = new Wiimote[nbWiimotes]; - for (int i=0; i 0) { - loaded = true; - return true; - } else { - loaded = false; - System.out.println("Error loading the Wiimote library !!!"); - return false; - } - } - // already loaded - return loaded; - } - - /** - * Connect wiimote and get the number of wiimotes connected. Supposed to be - * used once. - * - * @return 0 if nothing connected or the number of wiimotes connected. - */ - public int connectWiimotes() { - if (connected < 0 && loaded) { - connected = wiiuse.doConnections(); - // System.out.println(connected + " wiimote(s) connected !!!"); - return connected; - } else {// library not loaded, no wiimotes connected - return 0; - } - } - - /** - * Ask the thread to close a connection. - * - * @param id - * id of the wiimote to disconnect. - */ - public void closeConnection(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST)); - } - - /** - * Get the number of wiimotes connected. - * - * @return the number of wiimotes connected. - */ - public int getNbConnectedWiimotes() { - return connected; - } - - /** - * Stop thread and shutdown wiiuse Api. - */ - public void shutdown() { - running.set(false); - loaded = false; - wiiuse.shutdownApi(); - } - - /** - * Activate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Deactivate the rumble for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateRumble(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST)); - } - - /** - * Activate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Deactivate IR Tracking for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateIRTRacking(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST)); - } - - /** - * Activate motion sensing for the wiimote with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Deactivate motion sensing for the wiimoter with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateMotionSensing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST)); - } - - /** - * Activate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Deactivate smoothing the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void deactivateSmoothing(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST)); - } - - /** - * Activate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote. - */ - public void activateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Deactivate continuous for the wiimotes with the given id. - * - * @param id - * id of the wiimote - */ - public void deactivateContinuous(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST)); - } - - /** - * Set leds for the wiimotes with the given id. - * - * @param id - * id of the wiimote - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(int id, boolean l1, boolean l2, boolean l3, boolean l4) { - requests.add(new LedsRequest(id, WiiUseApiRequest.WIIUSE_LEDS_REQUEST, - l1, l2, l3, l4)); - } - - /** - * Set the orientation threshold for the given id. - * - * @param id - * id of the wiimote - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(int id, float th) { - requests.add(new OrientThresholdRequest(id, - WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST, th)); - } - - /** - * Get Status for the wiimote for the given id. - * - * @param id - * id of the wiimote - */ - public void getStatus(int id) { - requests.add(new WiiUseApiRequest(id, - WiiUseApiRequest.WIIUSE_STATUS_REQUEST)); - } - - @Override - public void run() { - - if (loaded && (connected > 0)) { - running.set(true); - - WiiMoteEvent evt = new WiiMoteEvent(); - - // Start polling and tell the observers when there Wiimote events - while (running.get()) { - WiiUseApiRequest req = requests.poll(); - if (req != null) {// there is a request for the wiiuse api - int id = req.getId(); - if (req.getRequestType() == WiiUseApiRequest.WIIUSE_CLOSE_CONNECTION_REQUEST) { - /* Close connections requests */ - removeWiiUseApiListener(wiimotes[id]); - wiimotes[id]=null; - wiiuse.closeConnection(id); - connected--; - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_STATUS_REQUEST) { - /* Status requests */ - wiiuse.getStatus(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_RUMBLE_REQUEST) { - /* Activate Rumble requests */ - wiiuse.activateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_RUMBLE_REQUEST) { - /* Deactivate Rumble requests */ - wiiuse.deactivateRumble(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_IR_TRACKING_REQUEST) { - /* Activate IR Tracking requests */ - wiiuse.activateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST) { - /* Deactivate IR Tracking requests */ - wiiuse.deactivateIRTracking(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST) { - /* Activate Motion sensing requests */ - wiiuse.activateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST) { - /* Deactivate Motion sensing requests */ - wiiuse.deactivateMotionSensing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_LEDS_REQUEST) { - /* leds requests */ - LedsRequest reqLed = (LedsRequest) req; - wiiuse.setLeds(id, reqLed.isLed1(), reqLed.isLed2(), - reqLed.isLed3(), reqLed.isLed4()); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_SMOOTHING_REQUEST) { - /* Activate smoothing requests */ - wiiuse.activateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_SMOOTHING_REQUEST) { - /* Deactivate smoothing requests */ - wiiuse.deactivateSmoothing(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ACTIVATE_CONTINUOUS_REQUEST) { - /* Activate continuous requests */ - wiiuse.activateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST) { - /* Deactivate continuous requests */ - wiiuse.deactivateContinuous(id); - } else if (req.getRequestType() == WiiUseApiRequest.WIIUSE_ORIENT_THRESHOLHD_REQUEST) { - /* set orientation request */ - wiiuse.setOrientThreshold(req.getId(), - ((OrientThresholdRequest) req).getThresholhd()); - } else { - System.out.println("Bad request to Wiiuse API !!!!!"); - } - } - - /* Polling */ - wiiuse.specialPoll(evt); - - if (evt.getWiimoteId() != -1) {//event filled - if (!evt.isConnected()) {// check if it was a - // disconnection - connected--; - removeWiiUseApiListener(wiimotes[evt.getWiimoteId()]); - wiimotes[evt.getWiimoteId()]=null; - System.out.println("Wiimote " + evt.getWiimoteId() - + " disconnected !"); - } else {//there is an event notify observers - // not a disconnection notify listeners - notifyWiiUseApiListener(evt); - // create a new event to be filled - evt = new WiiMoteEvent(); - } - } - if (connected == 0) {// stop this thread if there is - //no more wiimotes connected. - System.out.println("No more wiimotes connected !!!"); - shutdown(); - } - } - } else { - if (!loaded) { - System.out.println("Library not Loaded !"); - } - if (connected <= 0) { - System.out.println("No wiimotes connected !"); - } - } - - } - - /** - * Add WiiUseApiListener to the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void addWiiUseApiListener(WiiUseApiListener listener) { - listeners.add(WiiUseApiListener.class, listener); - } - - /** - * Remove WiiUseApiListener from the listeners list. - * - * @param listener - * a WiiUseApiListener - */ - public void removeWiiUseApiListener(WiiUseApiListener listener) { - listeners.remove(WiiUseApiListener.class, listener); - } - - /** - * Get the list of WiiUseApiListeners. - * - * @return the list of WiiUseApiListeners. - */ - public WiiUseApiListener[] getWiiUseApiListeners() { - return listeners.getListeners(WiiUseApiListener.class); - } - - /** - * Notify WiiUseApiListeners that an event occured. - * - * @param evt - * WiimoteEvent occured - */ - private void notifyWiiUseApiListener(WiiMoteEvent evt) { - for (WiiUseApiListener listener : getWiiUseApiListeners()) { - listener.wiimoteEvent(evt); - } - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/WiiUseApiRequest.java b/tag1/WiiUseJ/src/wiiusej/WiiUseApiRequest.java deleted file mode 100644 index 56998c7..0000000 --- a/tag1/WiiUseJ/src/wiiusej/WiiUseApiRequest.java +++ /dev/null @@ -1,82 +0,0 @@ -package wiiusej; - -/** - * Represents a request we could do to the WiiUse API. - * @author gduche - * - */ -public class WiiUseApiRequest { - - public static int WIIUSE_STATUS_REQUEST=1; - public static int WIIUSE_ACTIVATE_SMOOTHING_REQUEST=2; - public static int WIIUSE_DEACTIVATE_SMOOTHING_REQUEST=-2; - public static int WIIUSE_ACTIVATE_IR_TRACKING_REQUEST=3; - public static int WIIUSE_DEACTIVATE_IR_TRACKING_REQUEST=-3; - public static int WIIUSE_ACTIVATE_MOTION_SENSING_REQUEST=4; - public static int WIIUSE_DEACTIVATE_MOTION_SENSING_REQUEST=-4; - public static int WIIUSE_CLOSE_CONNECTION_REQUEST=5; - public static int WIIUSE_ACTIVATE_CONTINUOUS_REQUEST=6; - public static int WIIUSE_DEACTIVATE_CONTINUOUS_REQUEST=-6; - public static int WIIUSE_ACTIVATE_RUMBLE_REQUEST=7; - public static int WIIUSE_DEACTIVATE_RUMBLE_REQUEST=-7; - public static int WIIUSE_LEDS_REQUEST=8; - public static int WIIUSE_ORIENT_THRESHOLHD_REQUEST=9; - - - private int wiimoteId=0; - private int requestType=0; - - /** - * Constructor setting the id of the wiimote concerned. - * @param id the id of the wiimote concerned. - */ - public WiiUseApiRequest(int id){ - wiimoteId = id; - } - - /** - * Constructor setting the id of the wiimote concerned. - * @param id the id of the wiimote concerned. - * - */ - public WiiUseApiRequest(int id, int type){ - wiimoteId = id; - requestType = type; - } - - /** - * Get id of the wiimote concerned by this request. - * @return id of the wiimote concerned - */ - public int getId(){ - return wiimoteId; - } - - /** - * Set id of the wiimote concerned by this request. - * @param id id fh the wiimote concernet - */ - public void setId(int id){ - wiimoteId = id; - } - - /** - * Get the request type. - * @return the requestType - */ - public int getRequestType() { - return requestType; - } - - /** - * Set the request type. - * @param requestType the requestType to set - */ - public void setRequestType(int requestType) { - this.requestType = requestType; - } - - - -} - diff --git a/tag1/WiiUseJ/src/wiiusej/Wiimote.java b/tag1/WiiUseJ/src/wiiusej/Wiimote.java deleted file mode 100644 index 5d7232e..0000000 --- a/tag1/WiiUseJ/src/wiiusej/Wiimote.java +++ /dev/null @@ -1,191 +0,0 @@ -package wiiusej; - -import javax.swing.event.EventListenerList; - -/** - * Class that represents a wiimote. - * You can register as an observer of this wiimote to listen events from it. - * You manage it. - * @author gduche - * - */ -public class Wiimote implements WiiUseApiListener { - - private int id;//wiimote id - - private EventListenerList listeners = new EventListenerList(); - - private WiiUseApiManager manager; - - - /** - * Contructor. - * @param idd id of the wiimote - * @param manager manager wo built it. - */ - public Wiimote(int idd, WiiUseApiManager manager){ - id = idd; - this.manager = manager; - } - - /** - * Disconnect this wiimote. - */ - public void disconnect(){ - deactivateIRTRacking(); - deactivateMotionSensing(); - deactivateRumble(); - manager.closeConnection(id); - } - - /** - * Activate the rumble. - */ - public void activateRumble() { - manager.activateRumble(id); - } - - /** - * Deactivate the rumble. - */ - public void deactivateRumble() { - manager.deactivateRumble(id); - } - - /** - * Activate IR Tracking. - */ - public void activateIRTRacking() { - manager.activateIRTRacking(id); - } - - /** - * Deactivate IR Tracking. - */ - public void deactivateIRTRacking() { - manager.deactivateIRTRacking(id); - } - - /** - * Activate motion sensing. - */ - public void activateMotionSensing() { - manager.activateMotionSensing(id); - } - - /** - * Deactivate motion sensing. - */ - public void deactivateMotionSensing() { - manager.deactivateMotionSensing(id); - } - - /** - * Activate smoothing. - */ - public void activateSmoothing() { - manager.activateSmoothing(id); - } - - /** - * Deactivate smoothing. - */ - public void deactivateSmoothing() { - manager.deactivateSmoothing(id); - } - - /** - * Activate continuous. - */ - public void activateContinuous() { - manager.activateContinuous(id); - } - - /** - * Deactivate continuous. - */ - public void deactivateContinuous() { - manager.deactivateContinuous(id); - - } - - /** - * Set leds status. - * - * @param l1 - * status of led1. True : ON, False : OFF - * @param l2 - * status of led2. True : ON, False : OFF - * @param l3 - * status of led3. True : ON, False : OFF - * @param l4 - * status of led4. True : ON, False : OFF - */ - public void setLeds(boolean l1, boolean l2, boolean l3, boolean l4) { - manager.setLeds(id, l1, l2, l3, l4); - } - - /** - * Set the orientation threshold (minimum angle between two degrees with accelerometer). - * @param th - * threshold in degrees - */ - public void setOrientationThreshold(float th) { - manager.setOrientationThreshold(id,th); - } - - /** - * Get Status of the wiimote. - */ - public void getStatus() { - manager.getStatus(id); - } - - - @Override - public void wiimoteEvent(WiiMoteEvent e) { - if (e.getWiimoteId() == id){ - notifyWiiMoteEventListeners(e); - } - } - - /** - * Add a WiimoteListener to the listeners list. - * @param listener a WiimoteListener - */ - public void addWiiMoteEventListeners(WiimoteListener listener) { - listeners.add(WiimoteListener.class, listener); - } - - /** - * Remove a WiimoteListener from the listeners list. - * @param listener a WiimoteListener - */ - public void removeWiiMoteEventListeners(WiimoteListener listener) { - listeners.remove(WiimoteListener.class, listener); - } - - /** - * Get the list of WiimoteListener. - * @return the list of WiimoteListener. - */ - public WiimoteListener[] getWiiMoteEventListeners() { - return listeners.getListeners(WiimoteListener.class); - } - - /** - * Notify WiimoteListener that an event occured. - * @param evt WiimoteEvent occured - */ - private void notifyWiiMoteEventListeners(WiiMoteEvent evt) { - for (WiimoteListener listener : getWiiMoteEventListeners()) { - listener.wiimoteEvent(evt); - } - } - - @Override - public String toString() { - return "Wiimote with ID : "+id; - } - -} diff --git a/tag1/WiiUseJ/src/wiiusej/WiimoteListener.java b/tag1/WiiUseJ/src/wiiusej/WiimoteListener.java deleted file mode 100644 index b0cb6cd..0000000 --- a/tag1/WiiUseJ/src/wiiusej/WiimoteListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package wiiusej; - - -public interface WiimoteListener extends java.util.EventListener { - - void wiimoteEvent(WiiMoteEvent e); - -} diff --git a/tag1/WiiUseJ/wiiuse.dll b/tag1/WiiUseJ/wiiuse.dll deleted file mode 100644 index c6ea93fa8adb95a0baf88aa7dc92a353dbbc9293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 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 HW#7B-J*0N`=WAU2% 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -make - -wiiusej_WiiUseApi.c -true -true -true - - - - - - - - - diff --git a/tag1/WiiUseJC/.project b/tag1/WiiUseJC/.project deleted file mode 100644 index ef5e371..0000000 --- a/tag1/WiiUseJC/.project +++ /dev/null @@ -1,69 +0,0 @@ - - - WiiUseJavaC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/WiiUseJavaC/Release} - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.append_environment - true - - - ?name? - - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.core.cnature - - diff --git a/tag1/WiiUseJC/wiiuse.c b/tag1/WiiUseJC/wiiuse.c deleted file mode 100644 index 23db02f..0000000 --- a/tag1/WiiUseJC/wiiuse.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * wiiuse - * - * Written By: - * Michael Laforest < para > - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * This file is part of wiiuse. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * $Header$ - * - */ - -/** - * @file - * @brief API source file - * - * The file must be linked to any third party - * program that is utilizing wiiuse as an - * external library. - */ - -#define WIIUSE_API_SRC - -#include -#include "wiiuse.h" - -#ifdef WIN32 - #define WIN32_LEAN_AND_MEAN - #include -#else - #include -#endif - -typedef int (*entry_func_t)(struct wiiuse_api_t**); - -struct wiiuse_api_t* wiiuse_api = NULL; -void* wiiuse_mod = NULL; - -/** - * @brief Load the wiiuse library and initialize the function pointers. - * - * @param wiiuse_file The relative or absolute path to the wiiuse library file. - * - * @return The version of the wiiuse library loaded. - * - * @see wiiuse_shutdown() - * - * If the version of wiiuse being used has a different API - * version as expected, this function will fail and return 0. - */ -const char* wiiuse_startup(char* wiiuse_file) { - entry_func_t entry_func = NULL; - - if (wiiuse_api) - /* already loaded */ - return wiiuse_api->version; - - if (!wiiuse_file) - return NULL; - - /* load the module */ - wiiuse_mod = dlopen(wiiuse_file, RTLD_NOW); - - if (!wiiuse_mod) - /* can not load module */ - return NULL; - - /* get the entry point */ - entry_func = (entry_func_t)dlsym(wiiuse_mod, "wiiuse_main"); - - if (!entry_func) { - wiiuse_shutdown(); - return NULL; - } - - /* call the entry function */ - entry_func(&wiiuse_api); - - /* make sure the API versions are the same */ - if (wiiuse_api->api_version != WIIUSE_API_VERSION) { - wiiuse_shutdown(); - return NULL; - } - - /* set all the function pointers */ - wiiuse_init = wiiuse_api->_wiiuse_init; - wiiuse_disconnected = wiiuse_api->_wiiuse_disconnected; - wiiuse_rumble = wiiuse_api->_wiiuse_rumble; - wiiuse_toggle_rumble = wiiuse_api->_wiiuse_toggle_rumble; - wiiuse_set_leds = wiiuse_api->_wiiuse_set_leds; - wiiuse_motion_sensing = wiiuse_api->_wiiuse_motion_sensing; - wiiuse_read_data = wiiuse_api->_wiiuse_read_data; - wiiuse_write_data = wiiuse_api->_wiiuse_write_data; - wiiuse_status = wiiuse_api->_wiiuse_status; - wiiuse_get_by_id = wiiuse_api->_wiiuse_get_by_id; - wiiuse_set_flags = wiiuse_api->_wiiuse_set_flags; - wiiuse_set_smooth_alpha = wiiuse_api->_wiiuse_set_smooth_alpha; - wiiuse_set_ir = wiiuse_api->_wiiuse_set_ir; - wiiuse_set_ir_vres = wiiuse_api->_wiiuse_set_ir_vres; - wiiuse_set_ir_position = wiiuse_api->_wiiuse_set_ir_position; - wiiuse_set_aspect_ratio = wiiuse_api->_wiiuse_set_aspect_ratio; - wiiuse_set_bluetooth_stack = wiiuse_api->_wiiuse_set_bluetooth_stack; - wiiuse_set_orient_threshold = wiiuse_api->_wiiuse_set_orient_threshold; - wiiuse_find = wiiuse_api->_wiiuse_find; - wiiuse_connect = wiiuse_api->_wiiuse_connect; - wiiuse_disconnect = wiiuse_api->_wiiuse_disconnect; - wiiuse_poll = wiiuse_api->_wiiuse_poll; - - printf("wiiuse v%s loaded ( http://wiiuse.net http://wiiuse.sf.net/ ).\n", wiiuse_api->version); - - return wiiuse_api->version; -} - - -/** - * @brief Unload the library. - * - * @see wiiuse_startup() - */ -void wiiuse_shutdown() { - if (!wiiuse_mod) - return; - - /* unload the module */ - dlclose(wiiuse_mod); - - wiiuse_api = NULL; - - wiiuse_init = NULL; - wiiuse_disconnected = NULL; - wiiuse_rumble = NULL; - wiiuse_toggle_rumble = NULL; - wiiuse_set_leds = NULL; - wiiuse_motion_sensing = NULL; - wiiuse_read_data = NULL; - wiiuse_write_data = NULL; - wiiuse_status = NULL; - wiiuse_get_by_id = NULL; - wiiuse_set_flags = NULL; - wiiuse_set_smooth_alpha = NULL; - wiiuse_set_ir = NULL; - wiiuse_set_ir_vres = NULL; - wiiuse_set_ir_position = NULL; - wiiuse_set_aspect_ratio = NULL; - wiiuse_set_bluetooth_stack = NULL; - wiiuse_set_orient_threshold = NULL; - wiiuse_find = NULL; - wiiuse_connect = NULL; - wiiuse_disconnect = NULL; - wiiuse_poll = NULL; - -} diff --git a/tag1/WiiUseJC/wiiuse.h b/tag1/WiiUseJC/wiiuse.h deleted file mode 100644 index 9a466d9..0000000 --- a/tag1/WiiUseJC/wiiuse.h +++ /dev/null @@ -1,687 +0,0 @@ -/* - * wiiuse - * - * Written By: - * Michael Laforest < para > - * Email: < thepara (--AT--) g m a i l [--DOT--] com > - * - * Copyright 2006-2007 - * - * This file is part of wiiuse. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * $Header$ - * - */ - -/** - * @file - * - * @brief API header file. - * - * If this file is included from inside the wiiuse source - * and not from a third party program, then wiimote_internal.h - * is also included which extends this file. - */ - -#ifndef WIIUSE_H_INCLUDED -#define WIIUSE_H_INCLUDED - -/* ignore this, this is used internally for wiiuse */ -#ifdef __WIIUSE__ - #ifndef WIIUSE_INTERNAL_H_INCLUDED - #error wiiuse.h included directly. Must include wiiuse_internal.h instead. - #endif - #define WCONST -#else - #define WCONST const -#endif - -#if defined(WIN32) || defined(__WIN32__) - /* windows */ - #include - #include - #include - #include - - #define dlopen(file, x) (void*)LoadLibrary(file) - #define dlsym(dll, func) (void*)GetProcAddress((HMODULE)(dll), (func)) - #define dlclose(dll) FreeLibrary((HMODULE)(dll)) - #define Dl_info MEMORY_BASIC_INFORMATION - #define dladdr(func, inf) VirtualQuery(func, inf, sizeof(*inf)) -#else - /* nix */ - #include -#endif - -/* wiiuse version and API version */ -#define WIIUSE_VERSION "0.9" -#define WIIUSE_API_VERSION 8 - -/* led bit masks */ -#define WIIMOTE_LED_NONE 0x00 -#define WIIMOTE_LED_1 0x10 -#define WIIMOTE_LED_2 0x20 -#define WIIMOTE_LED_3 0x40 -#define WIIMOTE_LED_4 0x80 - -/* button codes */ -#define WIIMOTE_BUTTON_TWO 0x0001 -#define WIIMOTE_BUTTON_ONE 0x0002 -#define WIIMOTE_BUTTON_B 0x0004 -#define WIIMOTE_BUTTON_A 0x0008 -#define WIIMOTE_BUTTON_MINUS 0x0010 -#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020 -#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040 -#define WIIMOTE_BUTTON_HOME 0x0080 -#define WIIMOTE_BUTTON_LEFT 0x0100 -#define WIIMOTE_BUTTON_RIGHT 0x0200 -#define WIIMOTE_BUTTON_DOWN 0x0400 -#define WIIMOTE_BUTTON_UP 0x0800 -#define WIIMOTE_BUTTON_PLUS 0x1000 -#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000 -#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000 -#define WIIMOTE_BUTTON_UNKNOWN 0x8000 -#define WIIMOTE_BUTTON_ALL 0x1F9F - -/* nunchul button codes */ -#define NUNCHUK_BUTTON_Z 0x01 -#define NUNCHUK_BUTTON_C 0x02 - -/* classic controller button codes */ -#define CLASSIC_CTRL_BUTTON_UP 0x0001 -#define CLASSIC_CTRL_BUTTON_LEFT 0x0002 -#define CLASSIC_CTRL_BUTTON_ZR 0x0004 -#define CLASSIC_CTRL_BUTTON_X 0x0008 -#define CLASSIC_CTRL_BUTTON_A 0x0010 -#define CLASSIC_CTRL_BUTTON_Y 0x0020 -#define CLASSIC_CTRL_BUTTON_B 0x0040 -#define CLASSIC_CTRL_BUTTON_ZL 0x0080 -#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200 -#define CLASSIC_CTRL_BUTTON_PLUS 0x0400 -#define CLASSIC_CTRL_BUTTON_HOME 0x0800 -#define CLASSIC_CTRL_BUTTON_MINUS 0x1000 -#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000 -#define CLASSIC_CTRL_BUTTON_DOWN 0x4000 -#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000 - -/* wiimote option flags */ -#define WIIUSE_SMOOTHING 0x01 -#define WIIUSE_CONTINUOUS 0x02 -#define WIIUSE_ORIENT_THRESH 0x04 -#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH) - -/* IR correction types */ -typedef enum ir_position_t { - WIIUSE_IR_ABOVE, - WIIUSE_IR_BELOW -} ir_position_t; - -/** - * @brief Check if a button is pressed. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_PRESSED(dev, button) ((dev->btns & button) == button) - -/** - * @brief Check if a button is being held. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is held, 0 if not. - */ -#define IS_HELD(dev, button) ((dev->btns_held & button) == button) - -/** - * @brief Check if a button is released on this event. \n\n - * This does not mean the button is not pressed, it means \n - * this button was just now released. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is released, 0 if not. - * - */ -#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button) - -/** - * @brief Check if a button has just been pressed this event. - * @param dev Pointer to a wiimote_t or expansion structure. - * @param button The button you are interested in. - * @return 1 if the button is pressed, 0 if not. - */ -#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button)) - -#define WIIUSE_USING_ACC(wm) ((wm->state & 0x10) == 0x10) -#define WIIUSE_USING_EXP(wm) ((wm->state & 0x20) == 0x20) -#define WIIUSE_USING_IR(wm) ((wm->state & 0x40) == 0x40) - -/* - * Largest known payload is 21 bytes. - * Add 2 for the prefix and round up to a power of 2. - */ -#define MAX_PAYLOAD 32 - -typedef unsigned char byte; -typedef char sbyte; - -struct wiimote_t; -struct vec3b_t; -struct orient_t; -struct gforce_t; - -/** - * @brief Event callback. - * - * @param wm Pointer to a wiimote_t structure. - * @param btns What buttons are currently pressed. They are OR'ed together. - * @param accel Acceleration of the device along each axis. - * This is the raw data reported by the wiimote. - * @param orient Orientation (roll, pitch, yaw) of the device. - * @param gforce Pull of gravity on each axis of the device (measured in gravity units). - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when an event occurs on the specified wiimote. - */ -typedef void (*wiiuse_event_cb)(struct wiimote_t* wm); - -/** - * @brief Callback that handles a read event. - * - * @param wm Pointer to a wiimote_t structure. - * @param data Pointer to the filled data block. - * @param len Length in bytes of the data block. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when the wiimote has returned the full data requested by a previous - * call to wiiuse_read_data(). - */ -typedef void (*wiiuse_read_cb)(struct wiimote_t* wm, byte* data, unsigned short len); - -/** - * @brief Callback that handles a controller status event. - * - * @param wm Pointer to a wiimote_t structure. - * @param attachment Is there an attachment? (1 for yes, 0 for no) - * @param speaker Is the speaker enabled? (1 for yes, 0 for no) - * @param ir Is the IR support enabled? (1 for yes, 0 for no) - * @param led What LEDs are lit. - * @param battery_level Battery level, between 0.0 (0%) and 1.0 (100%). - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when either the controller status changed or the controller - * status was requested explicitly by wiiuse_status(). - */ -typedef void (*wiiuse_ctrl_status_cb)(struct wiimote_t* wm, int attachment, int speaker, int ir, int led[4], float battery_level); - -/** - * @brief Callback that handles a disconnection event. - * - * @param wm Pointer to a wiimote_t structure. - * - * @see wiiuse_init() - * - * A registered function of this type is called automatically by the wiiuse - * library when a disconnection occurs. This can happen if the POWER button - * is pressed or if the connection is interrupted. - */ -typedef void (*wiiuse_dis_cb)(struct wiimote_t* wm); - - -/** - * @struct read_req_t - * @brief Data read request structure. - */ -struct read_req_t { - wiiuse_read_cb cb; /**< read data callback */ - byte* buf; /**< buffer where read data is written */ - unsigned int addr; /**< the offset that the read started at */ - unsigned short size; /**< the length of the data read */ - unsigned short wait; /**< num bytes still needed to finish read */ - - struct read_req_t* next; /**< next read request in the queue */ -}; - - -/** - * @struct vec2b_t - * @brief Unsigned x,y byte vector. - */ -typedef struct vec2b_t { - byte x, y; -} vec2b_t; - - -/** - * @struct vec3b_t - * @brief Unsigned x,y,z byte vector. - */ -typedef struct vec3b_t { - byte x, y, z; -} vec3b_t; - - -/** - * @struct vec3f_t - * @brief Signed x,y,z float struct. - */ -typedef struct vec3f_t { - float x, y, z; -} vec3f_t; - - -/** - * @struct orient_t - * @brief Orientation struct. - * - * Yaw, pitch, and roll range from -180 to 180 degrees. - */ -typedef struct orient_t { - float roll; - float pitch; - float yaw; -} orient_t; - - -/** - * @struct gforce_t - * @brief Gravity force struct. - */ -typedef struct gforce_t { - float x, y, z; -} gforce_t; - - -/** - * @struct accel_t - * @brief Accelerometer struct. For any device with an accelerometer. - */ -typedef struct accel_t { - struct vec3b_t cal_zero; /**< zero calibration */ - struct vec3b_t cal_g; /**< gravity calibration */ - - float st_roll; /**< last smoothed roll value */ - float st_pitch; /**< last smoothed roll pitch */ - float st_alpha; /**< alpha value for smoothing [0-1] */ -} accel_t; - - -/** - * @struct ir_dot_t - * @brief A single IR source. - */ -typedef struct ir_dot_t { - byte visible; /**< if the IR source is visible */ - - unsigned int x; /**< interpolated X coordinate */ - unsigned int y; /**< interpolated Y coordinate */ - - short rx; /**< raw X coordinate (0-1023) */ - short ry; /**< raw Y coordinate (0-767) */ - - byte order; /**< increasing order by x-axis value */ - - byte size; /**< size of the IR dot (0-15) */ -} ir_dot_t; - - -/** - * @enum aspect_t - * @brief Screen aspect ratio. - */ -typedef enum aspect_t { - WIIUSE_ASPECT_4_3, - WIIUSE_ASPECT_16_9 -} aspect_t; - - -/** - * @struct ir_t - * @brief IR struct. Hold all data related to the IR tracking. - */ -typedef struct ir_t { - struct ir_dot_t dot[4]; /**< IR dots */ - byte num_dots; /**< number of dots at this time */ - - enum aspect_t aspect; /**< aspect ratio of the screen */ - - enum ir_position_t pos; /**< IR sensor bar position */ - - unsigned int vres[2]; /**< IR virtual screen resolution */ - int offset[2]; /**< IR XY correction offset */ - int state; /**< keeps track of the IR state */ - - int ax; /**< absolute X coordinate */ - int ay; /**< absolute Y coordinate */ - - int x; /**< calculated X coordinate */ - int y; /**< calculated Y coordinate */ - - float distance; /**< pixel distance between first 2 dots*/ - float z; /**< calculated distance */ -} ir_t; - - -/** - * @struct joystick_t - * @brief Joystick calibration structure. - * - * The angle \a ang is relative to the positive y-axis into quadrant I - * and ranges from 0 to 360 degrees. So if the joystick is held straight - * upwards then angle is 0 degrees. If it is held to the right it is 90, - * down is 180, and left is 270. - * - * The magnitude \a mag is the distance from the center to where the - * joystick is being held. The magnitude ranges from 0 to 1. - * If the joystick is only slightly tilted from the center the magnitude - * will be low, but if it is closer to the outter edge the value will - * be higher. - */ -typedef struct joystick_t { - struct vec2b_t max; /**< maximum joystick values */ - struct vec2b_t min; /**< minimum joystick values */ - struct vec2b_t center; /**< center joystick values */ - - float ang; /**< angle the joystick is being held */ - float mag; /**< magnitude of the joystick (range 0-1) */ -} joystick_t; - - -/** - * @struct nunchuk_t - * @brief Nunchuk expansion device. - */ -typedef struct nunchuk_t { - struct accel_t accel_calib; /**< nunchuk accelerometer calibration */ - struct joystick_t js; /**< joystick calibration */ - - int* flags; /**< options flag (points to wiimote_t.flags) */ - - byte btns; /**< what buttons have just been pressed */ - byte btns_held; /**< what buttons are being held down */ - byte btns_released; /**< what buttons were just released this */ - - struct vec3b_t accel; /**< current raw acceleration data */ - struct orient_t orient; /**< current orientation on each axis */ - struct gforce_t gforce; /**< current gravity forces on each axis */ -} nunchuk_t; - - -/** - * @struct classic_ctrl_t - * @brief Classic controller expansion device. - */ -typedef struct classic_ctrl_t { - short btns; /**< what buttons have just been pressed */ - short btns_held; /**< what buttons are being held down */ - short btns_released; /**< what buttons were just released this */ - - float r_shoulder; /**< right shoulder button (range 0-1) */ - float l_shoulder; /**< left shoulder button (range 0-1) */ - - struct joystick_t ljs; /**< left joystick calibration */ - struct joystick_t rjs; /**< right joystick calibration */ -} classic_ctrl_t; - - -/** - * @struct expansion_t - * @brief Generic expansion device plugged into wiimote. - */ -typedef struct expansion_t { - enum { - EXP_NONE, - EXP_NUNCHUK, - EXP_CLASSIC - } type; /**< type of expansion attached */ - - union { - struct nunchuk_t nunchuk; - struct classic_ctrl_t classic; - }; -} expansion_t; - - -/** - * @enum win32_bt_stack_t - * @brief Available bluetooth stacks for Windows. - */ -typedef enum win_bt_stack_t { - WIIUSE_STACK_UNKNOWN, - WIIUSE_STACK_MS, - WIIUSE_STACK_BLUESOLEIL -} win_bt_stack_t; - - -typedef struct wiimote_state_t { - /* expansion_t */ - float exp_ljs_ang; - float exp_rjs_ang; - float exp_ljs_mag; - float exp_rjs_mag; - byte exp_btns; - struct orient_t exp_orient; - float exp_r_shoulder; - float exp_l_shoulder; - - /* ir_t */ - int ir_ax; - int ir_ay; - float ir_distance; - - struct orient_t orient; - unsigned short btns; -} wiimote_state_t; - - -/** - * @struct wiimote_t - * @brief Wiimote structure. - */ -typedef struct wiimote_t { - WCONST int unid; /**< user specified id */ - - #ifndef WIN32 - WCONST bdaddr_t bdaddr; /**< bt address */ - WCONST char bdaddr_str[18]; /**< readable bt address */ - WCONST int out_sock; /**< output socket */ - WCONST int in_sock; /**< input socket */ - #else - WCONST HANDLE dev_handle; /**< HID handle */ - WCONST OVERLAPPED hid_overlap; /**< overlap handle */ - WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */ - #endif - - WCONST int state; /**< various state flags */ - WCONST int leds; /**< currently lit leds */ - - WCONST int flags; /**< options flag */ - - WCONST wiiuse_event_cb event_cb; /**< event callback */ - WCONST wiiuse_dis_cb dis_cb; /**< disconnect callback */ - WCONST wiiuse_ctrl_status_cb stat_cb; /**< controller status callback */ - - WCONST byte handshake_state; /**< the state of the connection handshake */ - - WCONST struct read_req_t* read_req; /**< list of data read requests */ - WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */ - WCONST struct expansion_t exp; /**< wiimote expansion device */ - - WCONST struct vec3b_t accel; /**< current raw acceleration data */ - WCONST struct orient_t orient; /**< current orientation on each axis */ - WCONST struct gforce_t gforce; /**< current gravity forces on each axis */ - - WCONST struct ir_t ir; /**< IR data */ - - WCONST unsigned short btns; /**< what buttons have just been pressed */ - WCONST unsigned short btns_held; /**< what buttons are being held down */ - WCONST unsigned short btns_released; /**< what buttons were just released this */ - - WCONST float orient_threshold; /**< threshold for orient to generate an event */ - - WCONST struct wiimote_state_t lstate; /**< last saved state */ - - WCONST byte event[MAX_PAYLOAD]; /**< event buffer */ -} wiimote; - - -/***************************************** - * - * Include API specific stuff - * - *****************************************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* wiiuse.c */ -typedef struct wiimote_t** (*_wiiuse_init_fptr)(int wiimotes, int* unids, wiiuse_event_cb event_cb, wiiuse_ctrl_status_cb stat_cb, wiiuse_dis_cb dis_cb); -typedef void (*_wiiuse_disconnected_fptr)(struct wiimote_t* wm); -typedef void (*_wiiuse_rumble_fptr)(struct wiimote_t* wm, int status); -typedef void (*_wiiuse_toggle_rumble_fptr)(struct wiimote_t* wm); -typedef void (*_wiiuse_set_leds_fptr)(struct wiimote_t* wm, int leds); -typedef void (*_wiiuse_motion_sensing_fptr)(struct wiimote_t* wm, int status); -typedef int (*_wiiuse_read_data_fptr)(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len); -typedef int (*_wiiuse_write_data_fptr)(struct wiimote_t* wm, unsigned int addr, byte* data, byte len); -typedef void (*_wiiuse_status_fptr)(struct wiimote_t* wm); -typedef struct wiimote_t* (*_wiiuse_get_by_id_fptr)(struct wiimote_t** wm, int wiimotes, int unid); -typedef int (*_wiiuse_set_flags_fptr)(struct wiimote_t* wm, int enable, int disable); -typedef float (*_wiiuse_set_smooth_alpha_fptr)(struct wiimote_t* wm, float alpha); -typedef void (*_wiiuse_set_ir_fptr)(struct wiimote_t* wm, int status); -typedef void (*_wiiuse_set_ir_vres_fptr)(struct wiimote_t* wm, unsigned int x, unsigned int y); -typedef void (*_wiiuse_set_ir_position_fptr)(struct wiimote_t* wm, enum ir_position_t pos); -typedef void (*_wiiuse_set_aspect_ratio_fptr)(struct wiimote_t* wm, enum aspect_t aspect); -typedef void (*_wiiuse_set_bluetooth_stack_fptr)(struct wiimote_t** wm, int wiimotes, enum win_bt_stack_t type); -typedef void (*_wiiuse_set_orient_threshold_fptr)(struct wiimote_t* wm, float threshold); - -/* connect.c */ -typedef int (*_wiiuse_find_fptr)(struct wiimote_t** wm, int max_wiimotes, int timeout); -typedef int (*_wiiuse_connect_fptr)(struct wiimote_t** wm, int wiimotes); -typedef void (*_wiiuse_disconnect_fptr)(struct wiimote_t* wm); - -/* events.c */ -typedef void (*_wiiuse_poll_fptr)(struct wiimote_t** wm, int wiimotes); - -#ifdef __cplusplus -} -#endif - -/** - * @struct wiiuse_api_t - * @brief API structure that is filled by the library - * when the entry point is invoked. - * - * Unless you are modifying wiiuse, you probably - * will not be interested in any members - * that begin with an underscore (_). - */ -struct wiiuse_api_t { - const char* version; /**< wiiuse version */ - int api_version; /**< wiiuse API version */ - - _wiiuse_init_fptr _wiiuse_init; - _wiiuse_disconnected_fptr _wiiuse_disconnected; - _wiiuse_rumble_fptr _wiiuse_rumble; - _wiiuse_toggle_rumble_fptr _wiiuse_toggle_rumble; - _wiiuse_set_leds_fptr _wiiuse_set_leds; - _wiiuse_motion_sensing_fptr _wiiuse_motion_sensing; - _wiiuse_read_data_fptr _wiiuse_read_data; - _wiiuse_write_data_fptr _wiiuse_write_data; - _wiiuse_status_fptr _wiiuse_status; - _wiiuse_get_by_id_fptr _wiiuse_get_by_id; - _wiiuse_set_flags_fptr _wiiuse_set_flags; - _wiiuse_set_smooth_alpha_fptr _wiiuse_set_smooth_alpha; - _wiiuse_set_ir_fptr _wiiuse_set_ir; - _wiiuse_set_ir_vres_fptr _wiiuse_set_ir_vres; - _wiiuse_set_ir_position_fptr _wiiuse_set_ir_position; - _wiiuse_set_aspect_ratio_fptr _wiiuse_set_aspect_ratio; - _wiiuse_set_bluetooth_stack_fptr _wiiuse_set_bluetooth_stack; - _wiiuse_set_orient_threshold_fptr _wiiuse_set_orient_threshold; - - _wiiuse_find_fptr _wiiuse_find; - _wiiuse_connect_fptr _wiiuse_connect; - _wiiuse_disconnect_fptr _wiiuse_disconnect; - - _wiiuse_poll_fptr _wiiuse_poll; -}; - -#ifndef __WIIUSE__ - -/* - * Operating system dependent macros. - */ -#ifdef __WIN32__ - #define dlopen(file, x) (void*)LoadLibrary(file) - #define dlsym(dll, func) (void*)GetProcAddress((HMODULE)(dll), (func)) - #define dlclose(dll) FreeLibrary((HMODULE)(dll)) - - char* _dlerror(); - #define dlerror() _dlerror() -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* api/wiiuse.c */ -const char* wiiuse_startup(char* wiiuse_file); -void wiiuse_shutdown(); - -#ifdef WIIUSE_API_SRC - #define WEXTERN -#else - #define WEXTERN extern -#endif - -WEXTERN _wiiuse_init_fptr wiiuse_init; -WEXTERN _wiiuse_disconnected_fptr wiiuse_disconnected; -WEXTERN _wiiuse_rumble_fptr wiiuse_rumble; -WEXTERN _wiiuse_toggle_rumble_fptr wiiuse_toggle_rumble; -WEXTERN _wiiuse_set_leds_fptr wiiuse_set_leds; -WEXTERN _wiiuse_motion_sensing_fptr wiiuse_motion_sensing; -WEXTERN _wiiuse_read_data_fptr wiiuse_read_data; -WEXTERN _wiiuse_write_data_fptr wiiuse_write_data; -WEXTERN _wiiuse_status_fptr wiiuse_status; -WEXTERN _wiiuse_get_by_id_fptr wiiuse_get_by_id; -WEXTERN _wiiuse_set_flags_fptr wiiuse_set_flags; -WEXTERN _wiiuse_set_smooth_alpha_fptr wiiuse_set_smooth_alpha; -WEXTERN _wiiuse_set_ir_fptr wiiuse_set_ir; -WEXTERN _wiiuse_set_ir_vres_fptr wiiuse_set_ir_vres; -WEXTERN _wiiuse_set_ir_position_fptr wiiuse_set_ir_position; -WEXTERN _wiiuse_set_aspect_ratio_fptr wiiuse_set_aspect_ratio; -WEXTERN _wiiuse_set_bluetooth_stack_fptr wiiuse_set_bluetooth_stack; -WEXTERN _wiiuse_set_orient_threshold_fptr wiiuse_set_orient_threshold; - -WEXTERN _wiiuse_find_fptr wiiuse_find; -WEXTERN _wiiuse_connect_fptr wiiuse_connect; -WEXTERN _wiiuse_disconnect_fptr wiiuse_disconnect; - -WEXTERN _wiiuse_poll_fptr wiiuse_poll; - -#ifdef __cplusplus -} -#endif - -#endif /* __WIIUSE__ */ - -#endif /* WIIUSE_H_INCLUDED */ - diff --git a/tag1/WiiUseJC/wiiusej_WiiUseApi.c b/tag1/WiiUseJC/wiiusej_WiiUseApi.c deleted file mode 100644 index ddcd75e..0000000 --- a/tag1/WiiUseJC/wiiusej_WiiUseApi.c +++ /dev/null @@ -1,462 +0,0 @@ -#ifndef WIN32 -#include -#define WIIUSE_PATH "./wiiuse.so" -#else -#define WIIUSE_PATH "wiiuse.dll" -#endif - -#include "wiiusej_WiiUseApi.h" -#include "wiiuse.h" -/* - * These are some identifiers for wiimotes - * - * See below in main() for what they are used for. - */ -#define WIIMOTE_ID_1 0 -#define WIIMOTE_ID_2 1 -#define WIIMOTE_STATE_RUMBLE 0x08 -#define WIIMOTE_STATE_CONNECTED 0x04 -#define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s)) -#define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s)) - -/****************** CALLBACKS DECLARATIONS *************************/ - -static void handle_event(struct wiimote_t* wm); -static void handle_ctrl_status(struct wiimote_t* wm, int attachment, - int speaker, int ir, int led[4], float battery_level); -static void handle_disconnect(wiimote* wm); - -static void copy_common_status(struct wiimote_t* wm);/* function with common code for callbacks */ - -/********************* VARIABLES DECLARATIONS *****************************/ - -/* - * Make a temp array of wiimote ids. - * Here I only anticipate connecting up to - * two wiimotes. Each wiimote connected - * will get one of these ids. - */ -static int ids[] = { WIIMOTE_ID_1, WIIMOTE_ID_2 }; -static wiimote** wiimotes; -static JNIEnv *globalEnv; -static jobject globalObj; -static jobject globalWim; - -/****************** GENERAL FUNCTIONS DEFINITIONS *************************/ - -/* - * Load the wiiuse library - * - * This needs to be done before anything else can happen - * wiiuse_startup() will return the version of the library loaded. - * - * @return 0 if there is an error, 1 if everything is ok. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_loadLibrary -(JNIEnv *env, jobject obj) { - const char* version; - version = wiiuse_startup(WIIUSE_PATH); - //printf("Wiiuse Version = %s\n", version); - if (!version) { - return 0; - } - - /* no problems loading library */ - return 1; -} - -/** - * Try to connect to 2 wiimotes. - * Make them rumble to show they are connected. - * - * @return 0 if there is an error otherwise it returns - * the number of wiimotes connected.. - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections -(JNIEnv *env, jobject obj) { - - /* variables declarations */ - int found, connected; - - /* - * Initialize an array of wiimote objects. - * - * The first parameter is the number of wiimotes - * I want to create. I only have two wiimotes - * so I'm limiting the test to just 2. - * - * Then I get it the array of ids and a couple - * callback functions to invoke when something - * happens on one of the wiimotes. - * - * handle_event gets called when a generic event occurs (button press, motion sensing, etc) - * handle_ctrl_status gets called when a response to a status request arrives (battery power, etc) - * handle_disconnect gets called when the wiimote disconnect (holding power button) - */ - wiimotes = wiiuse_init(2, ids, handle_event, handle_ctrl_status, - handle_disconnect); - - /* - * Find wiimote devices - * Now we need to find some wiimotes. - * Give the function the wiimote array we created, and tell it there - * are 2 wiimotes we are interested in. - * Set the timeout to be 5 seconds. - * This will return the number of actual wiimotes that are in discovery mode. - */ - found = wiiuse_find(wiimotes, 2, 5); - if (!found) return 0; - - /* - * Connect to the wiimotes - * Now that we found some wiimotes, connect to them. - * Give the function the wiimote array and the number of wiimote devices we found. - * This will return the number of established connections to the found wiimotes. - */ - connected = wiiuse_connect(wiimotes, 2); - if (!connected) return 0; - - //no problems during connection show that wiimotes are connected - - /* - * Now set the LEDs and rumble for a second so it's easy - * to tell which wiimotes are connected (just like the wii does). - */ - wiiuse_set_leds(wiimotes[0], WIIMOTE_LED_1); - wiiuse_set_leds(wiimotes[1], WIIMOTE_LED_2); - wiiuse_rumble(wiimotes[0], 1); - wiiuse_rumble(wiimotes[1], 1); - -#ifndef WIN32 - usleep(200000); -#else - Sleep(200); -#endif - - wiiuse_rumble(wiimotes[0], 0); - wiiuse_rumble(wiimotes[1], 0); - - //no pb connecting leave - return connected; -} - -/** - * Close connection to the wiimote with the given id. - * - * @param id the id of the wiimote to disconnect.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection -(JNIEnv *env, jobject obj, jint id) { - wiiuse_disconnect(wiimotes[id]); -} - -/** - * Shutdown api. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi -(JNIEnv *env, jobject obj) { - wiiuse_shutdown(); -} - -/** - * Activate rumble for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble -(JNIEnv *env, jobject obj, jint id) { - wiiuse_rumble(wiimotes[id], 1); -} - -/** - * Deactivate rumble for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble -(JNIEnv *env, jobject obj, jint id) { - wiiuse_rumble(wiimotes[id], 0); -} - -/** - * Activate IR TRacking for the wiimote with the given id. - * @param id the id of the wiimote. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir(wiimotes[id], 1); -} - -/** - * Deactivate IR TRacking for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_ir(wiimotes[id], 0); -} - -/** - * Activate Motion Sensing for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_motion_sensing(wiimotes[id], 1); -} - -/** - * Deactivate Motion Sensing for the wiimote with the given id. - * @param id the id of the wiimote.Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_motion_sensing(wiimotes[id], 0); -} - -/** - * Set wiimote leds status. - * @param id the id of the wiimote concerned - * @param led1 status of led1: True=ON, False=OFF - * @param led2 status of led2: True=ON, False=OFF - * @param led3 status of led3: True=ON, False=OFF - * @param led4 status of led4: True=ON, False=OFF - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds -(JNIEnv *env, jobject obj, jint id, jboolean led1, jboolean led2, jboolean led3, jboolean led4) { - int leds = 0; - - if (led1) leds |= WIIMOTE_LED_1; - if (led2) leds |= WIIMOTE_LED_2; - if (led3) leds |= WIIMOTE_LED_3; - if (led4) leds |= WIIMOTE_LED_4; - - wiiuse_set_leds(wiimotes[id], leds); -} - -/** - * Set how many degrees an angle must change to generate an event. - * @param id id of the wiimote concerned - * @param angle minimum angle detected by an event - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold -(JNIEnv *env, jobject obj, jint id, jfloat thresh) { - wiiuse_set_orient_threshold(wiimotes[id], thresh); -} - -/** - * Make the the accelerometers give smoother results. - * This is set by default. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id], WIIUSE_SMOOTHING, 0); -} - -/** - * Make the the accelerometers give raw results. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id], 0, WIIUSE_SMOOTHING); -} - -/** - * Make the wiimote generate an event each time we poll. - * Not set by default. - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id], WIIUSE_CONTINUOUS, 0); -} - -/** - * Make the wiimote generate an event only when there is one. - * (default behavior) - * @param id the id of the wiimote concerned - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous -(JNIEnv *env, jobject obj, jint id) { - wiiuse_set_flags(wiimotes[id], 0, WIIUSE_CONTINUOUS); -} - -/** - * Get status from the wiimotes and send it through call backs. - * - * @param id the id of the wiimote. Must be 1 or 2. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus -(JNIEnv *env, jobject obj, jint id) { - wiiuse_status(wiimotes[id]); -} - -/** - * Get status and values from the wiimotes and send it through callbacks. - * @param wim the wiimote object to fill with the datas. - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll -(JNIEnv *env, jobject obj, jobject wim) { - - globalEnv = env; - globalObj = obj; - globalWim = wim; - - wiiuse_poll(wiimotes, 2); -} - -/****************** CALLBACKS DEFINITIONS *************************/ - -/** - * @brief Callback that handles an event. - * - * @param wm Pointer to a wiimote_t structure. - * - * This function is called automatically by the wiiuse library when an - * event occurs on the specified wiimote. - */ -static void handle_event(struct wiimote_t* wm) { - - /* Variables Declarations */ - jclass cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - jmethodID mid; - - /* fill java class */ - copy_common_status(wm); - - /* Set all buttons */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setAllButtons", "(SSS)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, wm->btns, - wm->btns_released, wm->btns_held); - - /* - * If IR tracking is enabled then print the coordinates - * on the virtual screen that the wiimote is pointing to. - * - * Also make sure that we see at least 1 dot. - */ - if (WIIUSE_USING_IR(wm)) { - int i = 0; - /* go through each of the 4 possible IR sources */ - for (; i < 4; ++i) { - /* check if the source is visible */ - if (wm->ir.dot[i].visible) { - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "addIRpoint", - "(II)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->ir.dot[i].x, wm->ir.dot[i].y); - } - } - //printf("IR cursor: (%u, %u)\n", wm->ir.x, wm->ir.y); - //printf("IR z distance: %f\n", wm->ir.z); - } - - /* Motion Sensing */ - if (WIIUSE_USING_ACC(wm)) { - /* set orientation and gravity force */ - cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setOrientationAndGforce", "(FFFFFF)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->orient.roll, wm->orient.pitch, wm->orient.yaw, - wm->gforce.x, wm->gforce.y, wm->gforce.z); - } -} - -/** - * @brief Callback that handles a controller status event. - * - * @param wm Pointer to a wiimote_t structure. - * @param attachment Is there an attachment? (1 for yes, 0 for no) - * @param speaker Is the speaker enabled? (1 for yes, 0 for no) - * @param ir Is the IR support enabled? (1 for yes, 0 for no) - * @param led What LEDs are lit. - * @param battery_level Battery level, between 0.0 (0%) and 1.0 (100%). - * - * This occurs when either the controller status changed - * or the controller status was requested explicitly by - * wiiuse_status(). - * - * One reason the status can change is if the nunchuk was - * inserted or removed from the expansion port. - */ -static void handle_ctrl_status(struct wiimote_t* wm, int attachment, - int speaker, int ir, int led[4], float battery_level) { - - /* Variables Declarations */ - jclass cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - jmethodID mid; - short leds = 0; - - /* fill java class */ - copy_common_status(wm); - - /* LEDS */ - if (led[0]) - leds += 1; - if (led[1]) - leds += 2; - if (led[2]) - leds += 4; - if (led[3]) - leds += 8; - - /* set values for battery, leds, speaker and attachment*/ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, - "setBatteryLedsSpeakerAttachment", "(FSZZ)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - battery_level, leds, speaker, attachment); - -} - -/** - * @brief Callback that handles a disconnection event. - * - * @param wm Pointer to a wiimote_t structure. - * - * This can happen if the POWER button is pressed, or - * if the connection is interrupted. - */ -static void handle_disconnect(wiimote* wm) { - - /* call java method handling disconnection */ - copy_common_status(wm); -} - -/** - * Fills status variables. This method fills some status variables always filled in a WiiMoteEvent object. - * This function is called in every callback function. - */ -static void copy_common_status(struct wiimote_t* wm) { - - /* Variables Declarations */ - jmethodID mid; - jclass cls = (*globalEnv)->GetObjectClass(globalEnv, globalWim); - - /* set statuses */ - mid = (*globalEnv)->GetMethodID(globalEnv, cls, "setPermanentStatus", - "(IZZZZFZZ)V"); - if (mid == 0) { - return; - } - (*globalEnv)->CallVoidMethod(globalEnv, globalWim, mid, - wm->unid, WIIMOTE_IS_SET(wm, WIIMOTE_STATE_CONNECTED), - WIIUSE_USING_IR(wm), WIIMOTE_IS_SET(wm, WIIMOTE_STATE_RUMBLE), - WIIUSE_USING_ACC(wm), wm->orient_threshold, - WIIMOTE_IS_FLAG_SET(wm,WIIUSE_CONTINUOUS), - WIIMOTE_IS_FLAG_SET(wm,WIIUSE_SMOOTHING)); - -} diff --git a/tag1/WiiUseJC/wiiusej_WiiUseApi.def b/tag1/WiiUseJC/wiiusej_WiiUseApi.def deleted file mode 100644 index 258bf8b..0000000 --- a/tag1/WiiUseJC/wiiusej_WiiUseApi.def +++ /dev/null @@ -1,19 +0,0 @@ -EXPORTS -Java_wiiusej_WiiUseApi_loadLibrary -Java_wiiusej_WiiUseApi_doConnections -Java_wiiusej_WiiUseApi_closeConnection -Java_wiiusej_WiiUseApi_shutdownApi -Java_wiiusej_WiiUseApi_activateRumble -Java_wiiusej_WiiUseApi_deactivateRumble -Java_wiiusej_WiiUseApi_activateIRTracking -Java_wiiusej_WiiUseApi_deactivateIRTracking -Java_wiiusej_WiiUseApi_activateMotionSensing -Java_wiiusej_WiiUseApi_setOrientThreshold -Java_wiiusej_WiiUseApi_activateSmoothing -Java_wiiusej_WiiUseApi_setLeds -Java_wiiusej_WiiUseApi_deactivateSmoothing -Java_wiiusej_WiiUseApi_activateContinuous -Java_wiiusej_WiiUseApi_deactivateContinuous -Java_wiiusej_WiiUseApi_deactivateMotionSensing -Java_wiiusej_WiiUseApi_getStatus -Java_wiiusej_WiiUseApi_specialPoll diff --git a/tag1/WiiUseJC/wiiusej_WiiUseApi.h b/tag1/WiiUseJC/wiiusej_WiiUseApi.h deleted file mode 100644 index 08efaf1..0000000 --- a/tag1/WiiUseJC/wiiusej_WiiUseApi.h +++ /dev/null @@ -1,157 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class wiiusej_WiiUseApi */ - -#ifndef _Included_wiiusej_WiiUseApi -#define _Included_wiiusej_WiiUseApi -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: wiiusej_WiiUseApi - * Method: loadLibrary - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_loadLibrary - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: doConnections - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_wiiusej_WiiUseApi_doConnections - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: closeConnection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_closeConnection - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: shutdownApi - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_shutdownApi - (JNIEnv *, jobject); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateRumble - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateRumble - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateIRTracking - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateIRTracking - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateMotionSensing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateMotionSensing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: setLeds - * Signature: (IZZZZ)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setLeds - (JNIEnv *, jobject, jint, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: wiiusej_WiiUseApi - * Method: setOrientThreshold - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateSmoothing - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateSmoothing - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: activateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_activateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: deactivateContinuous - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_deactivateContinuous - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: getStatus - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_getStatus - (JNIEnv *, jobject, jint); - -/* - * Class: wiiusej_WiiUseApi - * Method: specialPoll - * Signature: (Lwiiusej/WiiMoteEvent;)V - */ -JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_specialPoll - (JNIEnv *, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif