From 3fcd80e3c0e893867873efc7a145d885593ae4a7 Mon Sep 17 00:00:00 2001 From: "guilhem.duche" Date: Sun, 15 Jun 2008 13:15:24 +0000 Subject: [PATCH] Added gui and fixes for Guitar hero controller git-svn-id: http://wiiusej.googlecode.com/svn/trunk@184 ae48ae66-6a45-0410-b38e-211266189506 --- WiiUseJ/img/classiccontroller.png | Bin 0 -> 52666 bytes .../test/ClassicControllerGuiTest.java | 165 +++++++++++ .../src/wiiusej/test/GuitarHero3GuiTest.java | 172 +++++++++++ WiiUseJ/src/wiiusej/test/NunchukGuiTest.java | 14 +- WiiUseJ/src/wiiusej/test/WiiuseJGuiTest.java | 71 ++++- .../src/wiiusej/utils/ButtonsEventPanel.java | 9 +- .../utils/GuitarHero3ButtonsEventPanel.java | 274 ++++++++++++++++++ .../utils/GuitarHeroJoystickEventPanel.java | 39 +++ .../src/wiiusej/utils/JoystickEventPanel.java | 4 +- .../utils/NunchukJoystickEventPanel.java | 3 +- .../ClassicControllerEvent.java | 2 +- .../physicalevents/GuitarHeroEvent.java | 2 +- 12 files changed, 731 insertions(+), 24 deletions(-) create mode 100644 WiiUseJ/img/classiccontroller.png create mode 100644 WiiUseJ/src/wiiusej/test/ClassicControllerGuiTest.java create mode 100644 WiiUseJ/src/wiiusej/test/GuitarHero3GuiTest.java create mode 100644 WiiUseJ/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java create mode 100644 WiiUseJ/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java diff --git a/WiiUseJ/img/classiccontroller.png b/WiiUseJ/img/classiccontroller.png new file mode 100644 index 0000000000000000000000000000000000000000..87a80f452dfedd34722d519437ce32bc2019ac06 GIT binary patch literal 52666 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 P00000NkvXXu0mjf. + */ +package wiiusej.test; + +import wiiusej.Wiimote; +import wiiusej.utils.ClassicControllerButtonsEventPanel; +import wiiusej.wiiusejevents.physicalevents.ClassicControllerEvent; +import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; +import wiiusej.wiiusejevents.physicalevents.IREvent; +import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; +import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; +import wiiusej.wiiusejevents.utils.WiimoteListener; +import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; +import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; + +/** + * This frame is used to display events from a classic controller. + * + * @author guiguito + */ +public class ClassicControllerGuiTest extends javax.swing.JFrame implements WiimoteListener{ + + private Wiimote wiimote; + private static int MAX_SHOULDER = 100; + + /** Creates new form ClassicControllerGuiTest */ + public ClassicControllerGuiTest(Wiimote wiimote) { + initComponents(); + this.wiimote = wiimote; + registerListeners(); + leftShoulderBar.setMaximum(MAX_SHOULDER); + rightShoulderBar.setMaximum(MAX_SHOULDER); + } + + private void registerListeners() { + wiimote.addWiiMoteEventListeners(this); + wiimote.addWiiMoteEventListeners((ClassicControllerButtonsEventPanel)classicControllerPanel); + } + + public void unRegisterListeners() { + wiimote.removeWiiMoteEventListeners(this); + wiimote.removeWiiMoteEventListeners((ClassicControllerButtonsEventPanel)classicControllerPanel); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + shouldersPanel = new javax.swing.JPanel(); + leftShoulderBar = new javax.swing.JProgressBar(); + rightShoulderBar = new javax.swing.JProgressBar(); + classicControllerPanel = new wiiusej.utils.ClassicControllerButtonsEventPanel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("WiiuseJ Classic Controller Test GUI"); + setResizable(false); + getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS)); + + shouldersPanel.setLayout(new javax.swing.BoxLayout(shouldersPanel, javax.swing.BoxLayout.LINE_AXIS)); + shouldersPanel.add(leftShoulderBar); + shouldersPanel.add(rightShoulderBar); + + getContentPane().add(shouldersPanel); + + javax.swing.GroupLayout classicControllerPanelLayout = new javax.swing.GroupLayout(classicControllerPanel); + classicControllerPanel.setLayout(classicControllerPanelLayout); + classicControllerPanelLayout.setHorizontalGroup( + classicControllerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + classicControllerPanelLayout.setVerticalGroup( + classicControllerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 284, Short.MAX_VALUE) + ); + + getContentPane().add(classicControllerPanel); + + pack(); + }// //GEN-END:initComponents + + public void onButtonsEvent(WiimoteButtonsEvent arg0) { + // nothing to do + } + + public void onIrEvent(IREvent arg0) { + // nothing to do + } + + public void onMotionSensingEvent(MotionSensingEvent arg0) { + // nothing to do + } + + public void onExpansionEvent(ExpansionEvent arg0) { + if (arg0 instanceof ClassicControllerEvent){ + ClassicControllerEvent classicController = (ClassicControllerEvent)arg0; + float leftShoulder = classicController.getLeftShoulder(); + float rightShoulder = classicController.getRightShoulder(); + leftShoulderBar.setValue(Math.round(leftShoulder*MAX_SHOULDER)); + rightShoulderBar.setValue(Math.round(rightShoulder*MAX_SHOULDER)); + } + + } + + public void onStatusEvent(StatusEvent arg0) { + // nothing to do + } + + public void onDisconnectionEvent(DisconnectionEvent arg0) { + // nothing to do + } + + public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { + // nothing to do + } + + public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { + // nothing to do + } + + public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { + // nothing to do + } + + public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { + // nothing to do + } + + public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { + // nothing to do + } + + public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { + // nothing to do + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel classicControllerPanel; + private javax.swing.JProgressBar leftShoulderBar; + private javax.swing.JProgressBar rightShoulderBar; + private javax.swing.JPanel shouldersPanel; + // End of variables declaration//GEN-END:variables +} diff --git a/WiiUseJ/src/wiiusej/test/GuitarHero3GuiTest.java b/WiiUseJ/src/wiiusej/test/GuitarHero3GuiTest.java new file mode 100644 index 0000000..f9dc60a --- /dev/null +++ b/WiiUseJ/src/wiiusej/test/GuitarHero3GuiTest.java @@ -0,0 +1,172 @@ +/* + * GuitarHeroGUITest.java + * + * Created on 12 juin 2008, 23:10 + */ +package wiiusej.test; + +import wiiusej.Wiimote; +import wiiusej.utils.GuitarHero3ButtonsEventPanel; +import wiiusej.utils.GuitarHeroJoystickEventPanel; +import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; +import wiiusej.wiiusejevents.physicalevents.GuitarHeroButtonsEvent; +import wiiusej.wiiusejevents.physicalevents.GuitarHeroEvent; +import wiiusej.wiiusejevents.physicalevents.IREvent; +import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; +import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; +import wiiusej.wiiusejevents.utils.WiimoteListener; +import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; +import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; + +/** + * This frame is used to display events from a Guitar Hero 3. + * @author guiguito + */ +public class GuitarHero3GuiTest extends javax.swing.JFrame implements WiimoteListener { + + private Wiimote wiimote; + private static int MAX_WHAMMY_BAR = 100; + + /** Creates new form GuitarHeroGUITest */ + public GuitarHero3GuiTest(Wiimote wiimote) { + initComponents(); + this.wiimote = wiimote; + whammyProgressBar.setMaximum(MAX_WHAMMY_BAR); + registerListeners(); + } + + private void registerListeners() { + wiimote.addWiiMoteEventListeners(this); + //register panel buttons + wiimote.addWiiMoteEventListeners(guitarHero3ButtonsEventPanel); + //register joystick panel + wiimote.addWiiMoteEventListeners(guitarHero3JoystickPanel); + } + + public void unRegisterListeners() { + wiimote.removeWiiMoteEventListeners(this); + wiimote.removeWiiMoteEventListeners(guitarHero3ButtonsEventPanel); + wiimote.removeWiiMoteEventListeners(guitarHero3JoystickPanel); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonsEventPanel = new javax.swing.JPanel(); + guitarHero3ButtonsEventPanel = new wiiusej.utils.GuitarHero3ButtonsEventPanel(); + bottomPanel = new javax.swing.JPanel(); + guitarHero3JoystickPanel = new wiiusej.utils.GuitarHeroJoystickEventPanel(); + whammyProgressBar = new javax.swing.JProgressBar(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("WiiuseJ Guitar Hero 3 Test GUI"); + getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS)); + + buttonsEventPanel.setBackground(new java.awt.Color(0, 0, 0)); + + javax.swing.GroupLayout buttonsEventPanelLayout = new javax.swing.GroupLayout(buttonsEventPanel); + buttonsEventPanel.setLayout(buttonsEventPanelLayout); + buttonsEventPanelLayout.setHorizontalGroup( + buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 448, Short.MAX_VALUE) + .addGroup(buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(buttonsEventPanelLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(guitarHero3ButtonsEventPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE))) + ); + buttonsEventPanelLayout.setVerticalGroup( + buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 111, Short.MAX_VALUE) + .addGroup(buttonsEventPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(buttonsEventPanelLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(guitarHero3ButtonsEventPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE))) + ); + + getContentPane().add(buttonsEventPanel); + + bottomPanel.setBackground(new java.awt.Color(0, 0, 0)); + bottomPanel.setLayout(new javax.swing.BoxLayout(bottomPanel, javax.swing.BoxLayout.X_AXIS)); + bottomPanel.add(guitarHero3JoystickPanel); + + whammyProgressBar.setBackground(new java.awt.Color(255, 255, 255)); + whammyProgressBar.setForeground(new java.awt.Color(255, 0, 255)); + bottomPanel.add(whammyProgressBar); + + getContentPane().add(bottomPanel); + + pack(); + }// //GEN-END:initComponents + public void onButtonsEvent(WiimoteButtonsEvent arg0) { + // nothing to do + } + + public void onIrEvent(IREvent arg0) { + // nothing to do + } + + public void onMotionSensingEvent(MotionSensingEvent arg0) { + // nothing to do + } + + public void onExpansionEvent(ExpansionEvent arg0) { + if (arg0 instanceof GuitarHeroEvent) { + GuitarHeroEvent guitar = (GuitarHeroEvent) arg0; + //move progress bar for whammy bar + whammyProgressBar.setValue(Math.round(MAX_WHAMMY_BAR*guitar.getWhammyBar())); + } + + } + + public void onStatusEvent(StatusEvent arg0) { + // nothing to do + } + + public void onDisconnectionEvent(DisconnectionEvent arg0) { + // nothing to do + } + + public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { + // nothing to do + } + + public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { + // nothing to do + } + + public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { + // nothing to do + } + + public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { + // nothing to do + } + + public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { + // nothing to do + } + + public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { + // nothing to do + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel bottomPanel; + private javax.swing.JPanel buttonsEventPanel; + private wiiusej.utils.GuitarHero3ButtonsEventPanel guitarHero3ButtonsEventPanel; + private wiiusej.utils.GuitarHeroJoystickEventPanel guitarHero3JoystickPanel; + private javax.swing.JProgressBar whammyProgressBar; + // End of variables declaration//GEN-END:variables +} diff --git a/WiiUseJ/src/wiiusej/test/NunchukGuiTest.java b/WiiUseJ/src/wiiusej/test/NunchukGuiTest.java index 1068232..d7f284f 100644 --- a/WiiUseJ/src/wiiusej/test/NunchukGuiTest.java +++ b/WiiUseJ/src/wiiusej/test/NunchukGuiTest.java @@ -363,18 +363,22 @@ public class NunchukGuiTest extends javax.swing.JFrame implements if (arg0 instanceof NunchukEvent) { NunchukEvent nunchuk = (NunchukEvent) arg0; NunchukButtonsEvent buttons = nunchuk.getButtonsEvent(); + + //C button if (buttons.isButtonCJustPressed()) { cButton.setEnabled(false); - } - if (buttons.isButtonCJustReleased()) { + }else if (buttons.isButtonCJustReleased()) { cButton.setEnabled(true); } - if (buttons.isButtonZJustPressed()) { + + //Z button + if(buttons.isButtonZJustPressed()) { zButton.setEnabled(false); - } - if (buttons.isButtonZJustReleased()) { + }else if (buttons.isButtonZJustReleased()) { zButton.setEnabled(true); } + + if (isThresholdsRequested) { MotionSensingEvent evt = nunchuk.getNunchukMotionSensingEvent(); nunchukAccelerationTextField.setText(evt diff --git a/WiiUseJ/src/wiiusej/test/WiiuseJGuiTest.java b/WiiUseJ/src/wiiusej/test/WiiuseJGuiTest.java index e20623f..8dea3c9 100644 --- a/WiiUseJ/src/wiiusej/test/WiiuseJGuiTest.java +++ b/WiiUseJ/src/wiiusej/test/WiiuseJGuiTest.java @@ -87,11 +87,13 @@ public class WiiuseJGuiTest extends javax.swing.JFrame implements public void windowActivated(WindowEvent e) { showExpansionWiimoteButton.setEnabled(false); showExpansionWiimoteButton.setText("Hide Nunchuk"); + //@TODO adapt to the connected Expansion } public void windowDeactivated(WindowEvent e) { showExpansionWiimoteButton.setEnabled(true); showExpansionWiimoteButton.setText("Show Nunchuk"); + //@TODO adapt to the connected Expansion } }; @@ -235,10 +237,27 @@ public class WiiuseJGuiTest extends javax.swing.JFrame implements showExpansionWiimoteButton.setText("Show Nunchuk"); expansionFrame = new NunchukGuiTest(wiimote); expansionFrame - .setDefaultCloseOperation(NunchukGuiTest.HIDE_ON_CLOSE); + .setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); expansionFrame.addWindowListener(buttonSetter); isFirstStatusGot = true; - } + }else if(arg0.isClassicControllerConnected()){ + showExpansionWiimoteButton.setEnabled(true); + showExpansionWiimoteButton.setText("Show Classic Controller"); + expansionFrame = new ClassicControllerGuiTest(wiimote); + expansionFrame + .setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + expansionFrame.addWindowListener(buttonSetter); + isFirstStatusGot = true; + } + else if(arg0.isClassicControllerConnected()){ + showExpansionWiimoteButton.setEnabled(true); + showExpansionWiimoteButton.setText("Show Guitar Hero 3 Controller"); + expansionFrame = new GuitarHero3GuiTest(wiimote); + expansionFrame + .setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + expansionFrame.addWindowListener(buttonSetter); + isFirstStatusGot = true; + } } messageText.setText("Status received !"); batteryLevelText.setText(arg0.getBatteryLevel() + " %"); @@ -247,7 +266,7 @@ public class WiiuseJGuiTest extends javax.swing.JFrame implements led3Button.setEnabled(arg0.isLed3Set()); led4Button.setEnabled(arg0.isLed4Set()); if (arg0.isNunchukConnected()) { - ((NunchukGuiTest) expansionFrame).requestThresholdsUpdate(); + ((NunchukGuiTest) expansionFrame).requestThresholdsUpdate(); } // attachments int eventType = arg0.getEventType(); @@ -279,7 +298,7 @@ public class WiiuseJGuiTest extends javax.swing.JFrame implements showExpansionWiimoteButton.setEnabled(true); showExpansionWiimoteButton.setText("Show nunchuk"); expansionFrame = new NunchukGuiTest(wiimote); - expansionFrame.setDefaultCloseOperation(NunchukGuiTest.HIDE_ON_CLOSE); + expansionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); expansionFrame.addWindowListener(buttonSetter); } @@ -299,21 +318,55 @@ public class WiiuseJGuiTest extends javax.swing.JFrame implements } public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { - // nothing + messageText.setText("Guitar Hero 3 connected !"); + expansionText.setText("Expansion connected : Guitar Hero 3."); + showExpansionWiimoteButton.setEnabled(true); + showExpansionWiimoteButton.setText("Show Guitar Hero 3"); + expansionFrame = new GuitarHero3GuiTest(wiimote); + expansionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + expansionFrame.addWindowListener(buttonSetter); } public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { - // nothing + messageText.setText("Guitar Hero 3 disconnected !"); + expansionText.setText("No expansion connected."); + showExpansionWiimoteButton.setEnabled(false); + showExpansionWiimoteButton.setText("No expansion"); + if (expansionFrame != null) { + if (expansionFrame instanceof GuitarHero3GuiTest) { + ((GuitarHero3GuiTest) expansionFrame).unRegisterListeners(); + } + expansionFrame.setEnabled(false); + expansionFrame.dispose(); + expansionFrame = null; + } } public void onClassicControllerInsertedEvent( ClassicControllerInsertedEvent arg0) { - // nothing + messageText.setText("Nunchuk connected !"); + expansionText.setText("Expansion connected : Classic Controller."); + showExpansionWiimoteButton.setEnabled(true); + showExpansionWiimoteButton.setText("Show Classic Controller"); + expansionFrame = new ClassicControllerGuiTest(wiimote); + expansionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + expansionFrame.addWindowListener(buttonSetter); } public void onClassicControllerRemovedEvent( ClassicControllerRemovedEvent arg0) { - // nothing + messageText.setText("Classic controller disconnected !"); + expansionText.setText("No expansion connected."); + showExpansionWiimoteButton.setEnabled(false); + showExpansionWiimoteButton.setText("No expansion"); + if (expansionFrame != null) { + if (expansionFrame instanceof ClassicControllerGuiTest) { + ((ClassicControllerGuiTest) expansionFrame).unRegisterListeners(); + } + expansionFrame.setEnabled(false); + expansionFrame.dispose(); + expansionFrame = null; + } } /** @@ -1222,6 +1275,8 @@ public class WiiuseJGuiTest extends javax.swing.JFrame implements if (expansionFrame != null) { if (expansionFrame instanceof NunchukGuiTest) { ((NunchukGuiTest) expansionFrame).unRegisterListeners(); + }else if (expansionFrame instanceof ClassicControllerGuiTest) { + ((ClassicControllerGuiTest) expansionFrame).unRegisterListeners(); } expansionFrame.setEnabled(false); expansionFrame.dispose(); diff --git a/WiiUseJ/src/wiiusej/utils/ButtonsEventPanel.java b/WiiUseJ/src/wiiusej/utils/ButtonsEventPanel.java index c71c312..97f9b19 100644 --- a/WiiUseJ/src/wiiusej/utils/ButtonsEventPanel.java +++ b/WiiUseJ/src/wiiusej/utils/ButtonsEventPanel.java @@ -55,7 +55,7 @@ public class ButtonsEventPanel extends javax.swing.JPanel implements private Color pressedColor = Color.RED; private Color heldColor = Color.ORANGE; private Color releasedColor = Color.YELLOW; - private Shape shape; + private Shape shape = new java.awt.geom.Ellipse2D.Double(0, 0, 13, 13); /** * Default constructor. Red : button just pressed. Orange : button held. @@ -66,7 +66,6 @@ public class ButtonsEventPanel extends javax.swing.JPanel implements 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(); } @@ -89,8 +88,7 @@ public class ButtonsEventPanel extends javax.swing.JPanel implements 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); + wiimoteImage = toolkit.createImage("img\\wiimote.png"); initComponents(); } @@ -295,8 +293,7 @@ public class ButtonsEventPanel extends javax.swing.JPanel implements } public void onDisconnectionEvent(DisconnectionEvent arg0) { - buttons = null; - repaint(); + clearView(); } public void onNunchukInsertedEvent(NunchukInsertedEvent e) { diff --git a/WiiUseJ/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java b/WiiUseJ/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java new file mode 100644 index 0000000..907a5dc --- /dev/null +++ b/WiiUseJ/src/wiiusej/utils/GuitarHero3ButtonsEventPanel.java @@ -0,0 +1,274 @@ +/** + * This file is part of WiiuseJ. + * + * WiiuseJ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WiiuseJ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with WiiuseJ. If not, see . + */ +package wiiusej.utils; + +import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; +import wiiusej.wiiusejevents.physicalevents.GuitarHeroButtonsEvent; +import wiiusej.wiiusejevents.physicalevents.GuitarHeroEvent; +import wiiusej.wiiusejevents.physicalevents.IREvent; +import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent; +import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent; +import wiiusej.wiiusejevents.utils.WiimoteListener; +import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent; +import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent; +import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent; + +/** + * This panel is used to display what happens on the buttons of the + * Guitar Hero 3 controller. + * @author guiguito + */ +public class GuitarHero3ButtonsEventPanel extends javax.swing.JPanel implements WiimoteListener { + + /** Creates new form GuitarHero3ButtonsEventPanel */ + public GuitarHero3ButtonsEventPanel() { + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + leftPanel = new javax.swing.JPanel(); + plusButton = new javax.swing.JToggleButton(); + minusButton = new javax.swing.JToggleButton(); + strumPanel = new javax.swing.JPanel(); + strumUpButton = new javax.swing.JToggleButton(); + strumDownButton = new javax.swing.JToggleButton(); + RightPanel = new javax.swing.JPanel(); + coloredButtonsPanel = new javax.swing.JPanel(); + orangeButton = new javax.swing.JToggleButton(); + blueButton = new javax.swing.JToggleButton(); + yellowButton = new javax.swing.JToggleButton(); + redButton = new javax.swing.JToggleButton(); + greenButton = new javax.swing.JToggleButton(); + + setBackground(new java.awt.Color(0, 0, 0)); + setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.X_AXIS)); + + leftPanel.setBackground(new java.awt.Color(0, 0, 0)); + leftPanel.setLayout(new javax.swing.BoxLayout(leftPanel, javax.swing.BoxLayout.LINE_AXIS)); + + plusButton.setBackground(new java.awt.Color(255, 255, 255)); + plusButton.setFont(new java.awt.Font("Arial", 1, 24)); + plusButton.setText("+"); + leftPanel.add(plusButton); + + minusButton.setBackground(new java.awt.Color(255, 255, 255)); + minusButton.setFont(new java.awt.Font("Arial", 1, 24)); + minusButton.setText("-"); + leftPanel.add(minusButton); + + strumPanel.setBackground(new java.awt.Color(0, 0, 0)); + strumPanel.setLayout(new javax.swing.BoxLayout(strumPanel, javax.swing.BoxLayout.Y_AXIS)); + + strumUpButton.setBackground(new java.awt.Color(255, 255, 255)); + strumUpButton.setFont(new java.awt.Font("Arial", 1, 24)); + strumUpButton.setText("Strum UP"); + strumPanel.add(strumUpButton); + + strumDownButton.setBackground(new java.awt.Color(255, 255, 255)); + strumDownButton.setFont(new java.awt.Font("Arial", 1, 24)); + strumDownButton.setText("Strum DOWN"); + strumPanel.add(strumDownButton); + + leftPanel.add(strumPanel); + + add(leftPanel); + + RightPanel.setBackground(new java.awt.Color(0, 0, 0)); + RightPanel.setLayout(new javax.swing.BoxLayout(RightPanel, javax.swing.BoxLayout.LINE_AXIS)); + + coloredButtonsPanel.setLayout(new javax.swing.BoxLayout(coloredButtonsPanel, javax.swing.BoxLayout.LINE_AXIS)); + + orangeButton.setBackground(new java.awt.Color(255, 153, 0)); + orangeButton.setFont(new java.awt.Font("Arial", 1, 24)); + orangeButton.setText("O"); + coloredButtonsPanel.add(orangeButton); + + blueButton.setBackground(new java.awt.Color(0, 0, 204)); + blueButton.setFont(new java.awt.Font("Arial", 1, 24)); + blueButton.setText("O"); + coloredButtonsPanel.add(blueButton); + + yellowButton.setBackground(new java.awt.Color(255, 255, 0)); + yellowButton.setFont(new java.awt.Font("Arial", 1, 24)); + yellowButton.setText("O"); + coloredButtonsPanel.add(yellowButton); + + redButton.setBackground(new java.awt.Color(255, 0, 0)); + redButton.setFont(new java.awt.Font("Arial", 1, 24)); + redButton.setText("O"); + coloredButtonsPanel.add(redButton); + + greenButton.setBackground(new java.awt.Color(51, 255, 0)); + greenButton.setFont(new java.awt.Font("Arial", 1, 24)); + greenButton.setText("O"); + coloredButtonsPanel.add(greenButton); + + RightPanel.add(coloredButtonsPanel); + + add(RightPanel); + }// //GEN-END:initComponents + public void onButtonsEvent(WiimoteButtonsEvent arg0) { + //do nothing + } + + public void onIrEvent(IREvent arg0) { + //do nothing + } + + public void onMotionSensingEvent(MotionSensingEvent arg0) { + //do nothing + } + + public void onExpansionEvent(ExpansionEvent arg0) { + if (arg0 instanceof GuitarHeroEvent) { + GuitarHeroEvent guitar = (GuitarHeroEvent) arg0; + GuitarHeroButtonsEvent buttons = guitar.getButtonsEvent(); + + //orange button + if (buttons.isButtonOrangeJustPressed()) { + orangeButton.setSelected(true); + orangeButton.setText("X"); + } else if (buttons.isButtonOrangeJustReleased()) { + orangeButton.setSelected(false); + orangeButton.setText("O"); + } + + //blue button + if (buttons.isButtonBlueJustPressed()) { + blueButton.setSelected(true); + orangeButton.setText("X"); + } else if (buttons.isButtonBlueJustReleased()) { + blueButton.setSelected(false); + orangeButton.setText("O"); + } + + //Yellow button + if (buttons.isButtonYellowJustPressed()) { + yellowButton.setSelected(true); + yellowButton.setText("X"); + } else if (buttons.isButtonYellowJustReleased()) { + yellowButton.setSelected(false); + yellowButton.setText("O"); + } + + //Red button + if (buttons.isButtonRedJustPressed()) { + redButton.setSelected(true); + redButton.setText("X"); + } else if (buttons.isButtonRedJustReleased()) { + redButton.setSelected(false); + redButton.setText("O"); + } + + //Green button + if (buttons.isButtonGreenJustPressed()) { + greenButton.setSelected(true); + greenButton.setText("X"); + } else if (buttons.isButtonGreenJustReleased()) { + greenButton.setSelected(false); + greenButton.setText("O"); + } + + //Plus button + if (buttons.isButtonPlusJustPressed()) { + plusButton.setSelected(true); + } else if (buttons.isButtonPlusJustReleased()) { + plusButton.setSelected(false); + } + + //Minus button + if (buttons.isButtonMinusJustPressed()) { + minusButton.setSelected(true); + } else if (buttons.isButtonMinusJustReleased()) { + minusButton.setSelected(false); + } + + //Strum up button + if (buttons.isButtonStrumUpJustPressed()) { + strumUpButton.setSelected(true); + } else if (buttons.isButtonStrumUpJustReleased()) { + strumUpButton.setSelected(false); + } + + //Strum down button + if (buttons.isButtonStrumDownJustPressed()) { + strumDownButton.setSelected(true); + } else if (buttons.isButtonStrumDownJustReleased()) { + strumDownButton.setSelected(false); + } + } + } + + public void onStatusEvent(StatusEvent arg0) { + //do nothing + } + + public void onDisconnectionEvent(DisconnectionEvent arg0) { + //do nothing + } + + public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) { + //do nothing + } + + public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) { + //do nothing + } + + public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) { + //do nothing + } + + public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) { + //do nothing + } + + public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) { + //do nothing + } + + public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { + //do nothing + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel RightPanel; + private javax.swing.JToggleButton blueButton; + private javax.swing.JPanel coloredButtonsPanel; + private javax.swing.JToggleButton greenButton; + private javax.swing.JPanel leftPanel; + private javax.swing.JToggleButton minusButton; + private javax.swing.JToggleButton orangeButton; + private javax.swing.JToggleButton plusButton; + private javax.swing.JToggleButton redButton; + private javax.swing.JToggleButton strumDownButton; + private javax.swing.JPanel strumPanel; + private javax.swing.JToggleButton strumUpButton; + private javax.swing.JToggleButton yellowButton; + // End of variables declaration//GEN-END:variables +} diff --git a/WiiUseJ/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java b/WiiUseJ/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java new file mode 100644 index 0000000..6fd906f --- /dev/null +++ b/WiiUseJ/src/wiiusej/utils/GuitarHeroJoystickEventPanel.java @@ -0,0 +1,39 @@ +/** + * This file is part of WiiuseJ. + * + * WiiuseJ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * WiiuseJ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * You should have received a copy of the GNU General Public License + * along with WiiuseJ. If not, see . + */ +package wiiusej.utils; + +import wiiusej.wiiusejevents.physicalevents.ExpansionEvent; +import wiiusej.wiiusejevents.physicalevents.GuitarHeroEvent; +import wiiusej.wiiusejevents.physicalevents.JoystickEvent; + +/** + * Panel to display Guitar Hero 3 controller joystick events. + * + * @author guiguito + */ +public class GuitarHeroJoystickEventPanel extends JoystickEventPanel{ + + @Override + public JoystickEvent getJoystickEvent(ExpansionEvent e) { + if (e instanceof GuitarHeroEvent){ + return ((GuitarHeroEvent)e).getGuitarHeroJoystickEvent(); + } + return null; + } + +} diff --git a/WiiUseJ/src/wiiusej/utils/JoystickEventPanel.java b/WiiUseJ/src/wiiusej/utils/JoystickEventPanel.java index fe21c78..9e7efe2 100644 --- a/WiiUseJ/src/wiiusej/utils/JoystickEventPanel.java +++ b/WiiUseJ/src/wiiusej/utils/JoystickEventPanel.java @@ -155,7 +155,7 @@ public abstract class JoystickEventPanel extends javax.swing.JPanel implements } public void onExpansionEvent(ExpansionEvent arg0) { - JoystickEvent joy = getJoystikEvent(arg0); + JoystickEvent joy = getJoystickEvent(arg0); if (joy != null) { lastJoystickEvent = joy; } @@ -228,7 +228,7 @@ public abstract class JoystickEventPanel extends javax.swing.JPanel implements this.shape = shape; } - public abstract JoystickEvent getJoystikEvent(ExpansionEvent e); + public abstract JoystickEvent getJoystickEvent(ExpansionEvent e); /** * This method is called from within the constructor to initialize the form. diff --git a/WiiUseJ/src/wiiusej/utils/NunchukJoystickEventPanel.java b/WiiUseJ/src/wiiusej/utils/NunchukJoystickEventPanel.java index a534751..9d088bc 100644 --- a/WiiUseJ/src/wiiusej/utils/NunchukJoystickEventPanel.java +++ b/WiiUseJ/src/wiiusej/utils/NunchukJoystickEventPanel.java @@ -11,6 +11,7 @@ * 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 . */ @@ -28,7 +29,7 @@ import wiiusej.wiiusejevents.physicalevents.NunchukEvent; public class NunchukJoystickEventPanel extends JoystickEventPanel { @Override - public JoystickEvent getJoystikEvent(ExpansionEvent e) { + public JoystickEvent getJoystickEvent(ExpansionEvent e) { if (e instanceof NunchukEvent) { return ((NunchukEvent) e).getNunchukJoystickEvent(); } diff --git a/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/ClassicControllerEvent.java b/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/ClassicControllerEvent.java index 3474dc6..ce04bd7 100644 --- a/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/ClassicControllerEvent.java +++ b/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/ClassicControllerEvent.java @@ -164,7 +164,7 @@ public class ClassicControllerEvent extends ExpansionEvent { public String toString() { String out = ""; /* Status */ - out += "/*********** Classis Controller EVENT : WIIMOTE ID :" + out += "/*********** Classic Controller EVENT : WIIMOTE ID :" + getWiimoteId() + " ********/\n"; out += buttonsEvent; out += "Left shoulder : " + leftShoulder + "\n"; diff --git a/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/GuitarHeroEvent.java b/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/GuitarHeroEvent.java index f5c30b6..d4796a3 100644 --- a/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/GuitarHeroEvent.java +++ b/WiiUseJ/src/wiiusej/wiiusejevents/physicalevents/GuitarHeroEvent.java @@ -108,7 +108,7 @@ public class GuitarHeroEvent extends ExpansionEvent{ public String toString() { String out = ""; /* Status */ - out += "/*********** Classis Controller EVENT : WIIMOTE ID :" + getWiimoteId() + out += "/*********** Guitar Hero 3 EVENT : WIIMOTE ID :" + getWiimoteId() + " ********/\n"; out += buttonsEvent; out += "Whammy Bar : "+whammyBar+"\n";