/*
* Copyright 2007-2008 Volker Fritzsch
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package motej.demos.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import motej.CalibrationDataReport;
import motej.IrCameraMode;
import motej.IrCameraSensitivity;
import motej.IrPoint;
import motej.Mote;
import motej.demos.common.SimpleMoteFinder;
import motej.demos.nunchuk.AccelerometerPanel;
import motej.event.AccelerometerEvent;
import motej.event.AccelerometerListener;
import motej.event.CoreButtonEvent;
import motej.event.CoreButtonListener;
import motej.event.IrCameraEvent;
import motej.event.IrCameraListener;
import motej.request.ReportModeRequest;
/**
*
* <p>
* @author <a href="mailto:vfritzsch@users.sourceforge.net">Volker Fritzsch</a>
*/
@SuppressWarnings("serial")
public class MoteGui {
private IrPoint p0, p1, p2, p3;
private AccelerometerPanel accelerometerPanel;
// protected class AccelerometerComponent implements GLEventListener {
//
// private GLU glu;
// private GLUT glut;
//
// public void init(GLAutoDrawable drawable) {
// GL gl = drawable.getGL();
// glu = new GLU();
// glut = new GLUT();
//
// gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// gl.glShadeModel(GL.GL_FLAT);
// }
//
// public void display(GLAutoDrawable drawable) {
// GL gl = drawable.getGL();
//
// gl.glClear(GL.GL_COLOR_BUFFER_BIT);
// gl.glColor3f(1.0f, 1.0f, 1.0f);
// gl.glLoadIdentity(); /* clear the matrix */
//
// /* viewing transformation */
// glu.gluLookAt(-2.5, 5.0, 8.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
// gl.glScalef(1.0f, 1.0f, 5.0f); /* modeling transformation */
// gl.glRotated(accx, 1d, 0d, 0d);
// gl.glRotated(accy, 0d, 1d, 0d);
// gl.glRotated(accz, 0d, 0d, 1d);
// glut.glutWireCube(1.0f);
// gl.glFlush();
// }
//
// public void displayChanged(GLAutoDrawable arg0, boolean arg1,
// boolean arg2) {
// }
//
// public void reshape(GLAutoDrawable drawable, int x, int y, int w,
// int h) {
// GL gl = drawable.getGL();
//
// gl.glMatrixMode(GL.GL_PROJECTION); /* prepare for and then */
// gl.glLoadIdentity(); /* define the projection */
// gl.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); /* transformation */
// gl.glMatrixMode(GL.GL_MODELVIEW); /* back to modelview matrix */
// gl.glViewport(0, 0, w, h); /* define the viewport */
// }
//
// }
protected class IRCompentent extends JPanel {
public IRCompentent() {
setMinimumSize(new Dimension(1024,768));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (p0 == null)
return;
Graphics2D g2 = (Graphics2D) g;
Color origColor = g2.getColor();
g2.setColor(Color.BLACK);
System.out.println("Intensity: " + p0.intensity + " min.x: " + p0.min.x + " min.y: " + p0.min.y + " max.x: " + p0.max.x + " max.y: " + p0.max.y);
g2.fillOval((int) p0.getX(), (int) p0.getY(), p0.getSize() * 5, p0.getSize() * 5);
g2.fillOval((int) p1.getX(), (int) p1.getY(), p1.getSize() * 5, p1.getSize() * 5);
g2.fillOval((int) p2.getX(), (int) p2.getY(), p2.getSize() * 5, p2.getSize() * 5);
g2.fillOval((int) p3.getX(), (int) p3.getY(), p3.getSize() * 5, p3.getSize() * 5);
g2.setColor(origColor);
}
}
private MoteGui.IRCompentent ircomp;
private Mote mote;
// private int accx, accy, accz;
private boolean[] leds = new boolean[] { false, false, false, false };
protected Action findAction = new AbstractAction("Find Motes") {
public void actionPerformed(ActionEvent arg0) {
SimpleMoteFinder simpleMoteFinder = new SimpleMoteFinder();
mote = simpleMoteFinder.findMote();
if (mote != null) {
while (mote.getStatusInformationReport() == null) {
System.out.println("waiting for status information report");
try {
Thread.sleep(10l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(mote.getStatusInformationReport());
while (mote.getCalibrationDataReport() == null) {
System.out.println("waiting for calibration data report");
try {
Thread.sleep(10l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(mote.getCalibrationDataReport());
CalibrationDataReport cali = mote.getCalibrationDataReport();
accelerometerPanel.setCalibrationDataX(cali.getZeroX(), cali.getGravityX());
accelerometerPanel.setCalibrationDataY(cali.getZeroY(), cali.getGravityY());
accelerometerPanel.setCalibrationDataZ(cali.getZeroZ(), cali.getGravityZ());
mote.addAccelerometerListener(new AccelerometerListener<Mote>() {
public void accelerometerChanged(AccelerometerEvent<Mote> evt) {
// accelerometerPanel.accelerometerValueChanged(evt.getX(), evt.getY(), evt.getZ());
// accx = evt.getX();
// accy = evt.getY();
// accz = evt.getZ();
//// glpanel.repaint();
}
});
mote.addIrCameraListener(new IrCameraListener() {
public void irImageChanged(IrCameraEvent evt) {
p0 = evt.getIrPoint(0);
p1 = evt.getIrPoint(1);
p2 = evt.getIrPoint(2);
p3 = evt.getIrPoint(3);
ircomp.repaint();
}
});
mote.addCoreButtonListener(new CoreButtonListener() {
public void buttonPressed(final CoreButtonEvent evt) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (evt.isButtonAPressed()) {
feedbackButtonA.setBackground(Color.BLUE);
} else {
feedbackButtonA.setBackground(origColor);
}
if (evt.isButtonBPressed())
feedbackButtonB.setBackground(Color.BLUE);
else
feedbackButtonB.setBackground(origColor);
if (evt.isButtonHomePressed())
feedbackButtonHome.setBackground(Color.BLUE);
else
feedbackButtonHome.setBackground(origColor);
if (evt.isButtonMinusPressed())
feedbackButtonMinus.setBackground(Color.BLUE);
else
feedbackButtonMinus.setBackground(origColor);
if (evt.isButtonOnePressed())
feedbackButtonOne.setBackground(Color.BLUE);
else
feedbackButtonOne.setBackground(origColor);
if (evt.isButtonPlusPressed())
feedbackButtonPlus.setBackground(Color.BLUE);
else
feedbackButtonPlus.setBackground(origColor);
if (evt.isButtonTwoPressed())
feedbackButtonTwo.setBackground(Color.BLUE);
else
feedbackButtonTwo.setBackground(origColor);
if (evt.isDPadDownPressed())
feedbackButtonDPadDown.setBackground(Color.BLUE);
else
feedbackButtonDPadDown.setBackground(origColor);
if (evt.isDPadLeftPressed())
feedbackButtonDPadLeft.setBackground(Color.BLUE);
else
feedbackButtonDPadLeft.setBackground(origColor);
if (evt.isDPadRightPressed())
feedbackButtonDPadRight.setBackground(Color.BLUE);
else
feedbackButtonDPadRight.setBackground(origColor);
if (evt.isDPadUpPressed())
feedbackButtonDPadUp.setBackground(Color.BLUE);
else
feedbackButtonDPadUp.setBackground(origColor);
}
});
}
});
}
}
};
protected Action cameraBasicAction = new AbstractAction("camera (basic / wii level 3)") {
public void actionPerformed(ActionEvent arg0) {
mote.enableIrCamera(IrCameraMode.BASIC, IrCameraSensitivity.WII_LEVEL_3);
}
};
protected Action cameraExtendedAction = new AbstractAction("camera (extended / Wii l3)") {
public void actionPerformed(ActionEvent arg0) {
mote.enableIrCamera(IrCameraMode.EXTENDED, IrCameraSensitivity.WII_LEVEL_3);
}
};
protected Action cameraFullAction = new AbstractAction("camera (full / Wii l3)") {
public void actionPerformed(ActionEvent arg0) {
mote.enableIrCamera(IrCameraMode.FULL, IrCameraSensitivity.WII_LEVEL_3);
}
};
protected Action report0x30Action = new AbstractAction("Report: 0x30") {
public void actionPerformed(ActionEvent arg0) {
mote.setReportMode(ReportModeRequest.DATA_REPORT_0x30);
};
};
protected Action report0x31Action = new AbstractAction("Report: 0x31") {
public void actionPerformed(ActionEvent arg0) {
mote.setReportMode(ReportModeRequest.DATA_REPORT_0x31);
};
};
protected Action report0x33Action = new AbstractAction("Report: 0x33") {
public void actionPerformed(ActionEvent arg0) {
mote.setReportMode(ReportModeRequest.DATA_REPORT_0x33);
};
};
protected Action report0x36Action = new AbstractAction("Report: 0x36") {
public void actionPerformed(ActionEvent arg0) {
mote.setReportMode(ReportModeRequest.DATA_REPORT_0x36);
};
};
protected Action report0x3eAction = new AbstractAction("Report: 0x3e") {
public void actionPerformed(ActionEvent arg0) {
mote.setReportMode(ReportModeRequest.DATA_REPORT_0x3e);
};
};
protected Action setLed1Action = new AbstractAction("LED 1") {
public void actionPerformed(ActionEvent arg0) {
leds[0] = leds[0] ? false : true;
mote.setPlayerLeds(leds);
}
};
protected Action setLed2Action = new AbstractAction("LED 2") {
public void actionPerformed(ActionEvent arg0) {
leds[1] = leds[1] ? false : true;
mote.setPlayerLeds(leds);
}
};
protected Action setLed3Action = new AbstractAction("LED 3") {
public void actionPerformed(ActionEvent arg0) {
leds[2] = leds[2] ? false : true;
mote.setPlayerLeds(leds);
}
};
protected Action setLed4Action = new AbstractAction("LED 4") {
public void actionPerformed(ActionEvent arg0) {
leds[3] = leds[3] ? false : true;
mote.setPlayerLeds(leds);
}
};
protected Action rumbleAction = new AbstractAction("Rumble") {
public void actionPerformed(ActionEvent arg0) {
mote.rumble(1000l);
}
};
private JButton feedbackButtonA;
private JButton feedbackButtonB;
private JButton feedbackButtonHome;
private JButton feedbackButtonPlus;
private JButton feedbackButtonMinus;
private JButton feedbackButtonDPadLeft;
private JButton feedbackButtonDPadRight;
private JButton feedbackButtonDPadUp;
private JButton feedbackButtonDPadDown;
private JButton feedbackButtonOne;
private JButton feedbackButtonTwo;
private Color origColor;
// private GLJPanel glpanel;
public MoteGui() {
final JFrame frame = new JFrame("MoteGui");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
ircomp = new MoteGui.IRCompentent();
ircomp.setBorder(BorderFactory.createLineBorder(Color.BLACK));
ircomp.setPreferredSize(new Dimension(1024, 768));
// glpanel = new GLJPanel();
// glpanel.addGLEventListener(new MoteGui.AccelerometerComponent());
// glpanel.setPreferredSize(new Dimension(600,600));
JPanel centerPanel = new JPanel(new FlowLayout());
centerPanel.add(ircomp);
accelerometerPanel = new AccelerometerPanel();
centerPanel.add(accelerometerPanel);
// centerPanel.add(glpanel);
frame.getContentPane().add(centerPanel, BorderLayout.CENTER);
JPanel topPanel = new JPanel(new FlowLayout());
frame.getContentPane().add(topPanel, BorderLayout.NORTH);
JPanel bottomPanel = new JPanel(new FlowLayout());
frame.getContentPane().add(bottomPanel, BorderLayout.SOUTH);
JButton findButton = new JButton("Find motes");
findButton.setAction(findAction);
topPanel.add(findButton);
JButton led1Button = new JButton("LED 1");
led1Button.setAction(setLed1Action);
topPanel.add(led1Button);
JButton led2Button = new JButton("LED 2");
led2Button.setAction(setLed2Action);
topPanel.add(led2Button);
JButton led3Button = new JButton("LED 3");
led3Button.setAction(setLed3Action);
topPanel.add(led3Button);
JButton led4Button = new JButton("LED 4");
led4Button.setAction(setLed4Action);
topPanel.add(led4Button);
JButton rumbleButton = new JButton(rumbleAction);
topPanel.add(rumbleButton);
JButton cameraBasicButton = new JButton(cameraBasicAction);
topPanel.add(cameraBasicButton);
JButton cameraExtendedButton = new JButton(cameraExtendedAction);
topPanel.add(cameraExtendedButton);
JButton cameraFullButton = new JButton(cameraFullAction);
topPanel.add(cameraFullButton);
JButton report0x30 = new JButton(report0x30Action);
report0x30.setToolTipText("core buttons");
topPanel.add(report0x30);
JButton report0x31 = new JButton(report0x31Action);
report0x31.setToolTipText("core buttons and accelerometer");
topPanel.add(report0x31);
JButton report0x33 = new JButton(report0x33Action);
report0x33.setToolTipText("core buttons, accelerometer and IR (extended)");
topPanel.add(report0x33);
JButton report0x36 = new JButton(report0x36Action);
report0x36.setToolTipText("core buttons, ir (basic) and extension");
topPanel.add(report0x36);
JButton report0x3e = new JButton(report0x3eAction);
report0x3e.setToolTipText("Interleaved Core Buttons and Accelerometer with 36 IR bytes");
topPanel.add(report0x3e);
feedbackButtonA = new JButton("A");
feedbackButtonA.setEnabled(false);
bottomPanel.add(feedbackButtonA);
feedbackButtonB = new JButton("B");
feedbackButtonB.setEnabled(false);
bottomPanel.add(feedbackButtonB);
feedbackButtonOne = new JButton("One");
feedbackButtonOne.setEnabled(false);
bottomPanel.add(feedbackButtonOne);
feedbackButtonTwo = new JButton("Two");
feedbackButtonTwo.setEnabled(false);
bottomPanel.add(feedbackButtonTwo);
feedbackButtonHome = new JButton("Home");
feedbackButtonHome.setEnabled(false);
bottomPanel.add(feedbackButtonHome);
feedbackButtonDPadLeft = new JButton("DPadLeft");
feedbackButtonDPadLeft.setEnabled(false);
bottomPanel.add(feedbackButtonDPadLeft);
feedbackButtonDPadRight = new JButton("DPadRight");
feedbackButtonDPadRight.setEnabled(false);
bottomPanel.add(feedbackButtonDPadRight);
feedbackButtonDPadUp = new JButton("DPadUp");
feedbackButtonDPadUp.setEnabled(false);
bottomPanel.add(feedbackButtonDPadUp);
feedbackButtonDPadDown = new JButton("DPadDown");
feedbackButtonDPadDown.setEnabled(false);
bottomPanel.add(feedbackButtonDPadDown);
feedbackButtonPlus = new JButton("Plus");
feedbackButtonPlus.setEnabled(false);
bottomPanel.add(feedbackButtonPlus);
feedbackButtonMinus = new JButton("Minus");
feedbackButtonMinus.setEnabled(false);
bottomPanel.add(feedbackButtonMinus);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
if (mote != null) {
mote.disconnect();
}
}
});
frame.setVisible(true);
frame.pack();
origColor = feedbackButtonA.getBackground();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MoteGui();
}
});
}
}