/**
* Squidy Interaction Library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* Squidy Interaction Library 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squidy Interaction Library. If not, see
* <http://www.gnu.org/licenses/>.
*
* 2009 Human-Computer Interaction Group, University of Konstanz.
* <http://hci.uni-konstanz.de>
*
* Please contact info@squidy-lib.de or visit our website
* <http://www.squidy-lib.de> for further information.
*/
package org.squidy.nodes;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squidy.manager.controls.TextField;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.Processor.Status;
import org.squidy.manager.data.impl.DataAnalog;
import org.squidy.manager.data.impl.DataButton;
import org.squidy.manager.data.impl.DataInertial;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.manager.protocol.udp.UDPAdapter;
import org.squidy.manager.protocol.udp.UDPServer;
/**
* <code>WiiMote</code>.
*
* <pre>
* Date: Feb 13, 2008
* Time: 12:49:13 AM
* </pre>
*
* @author Werner Koenig, werner.koenig@uni-konstanz.de, University of Konstanz
* @author Roman Rädle, <a
* href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a>,
* University of Konstanz
* @version $Id: WiimoteRemote.java 772 2011-09-16 15:39:44Z raedle $
*/
@XmlType(name = "Wiimote Remote")
@Processor(
name = "Wiimote Remote",
types = { Processor.Type.INPUT },
description = "/org/squidy/nodes/html/WiimoteRemote.html",
tags = { "wiimote", "nintendo", "wii", "tracking", "ir", "infrared", "camera" },
status = Status.UNSTABLE
)
public class WiimoteRemote extends AbstractNode {
// Log to log info, error, debug,... messages.
private static final Log LOG = LogFactory.getLog(WiimoteRemote.class);
// ################################################################################
// BEGIN OF ADJUSTABLES
// ################################################################################
@XmlAttribute(name = "port")
@Property(
name = "Port",
description = "UDP Server Port"
)
@TextField
private int port = 13007;
/**
* @return the port
*/
public int getPort() {
return port;
}
/**
* @param port
* the port to set
*/
public void setPort(int port) {
this.port = port;
}
// ################################################################################
// END OF ADJUSTABLES
// ################################################################################
protected UDPServer server;
/* (non-Javadoc)
* @see org.squidy.manager.ReflectionProcessable#onStart()
*/
@Override
public void onStart() {
if (LOG.isDebugEnabled()) {
LOG.debug("Initializing Wiimote.");
}
server = new UDPServer(port);
server.addUDPListener(new UDPAdapter() {
/*
* (non-Javadoc)
*
* @see org.squidy.manager.udp.UDPListener#parseData(java.lang.String)
*/
public void parseData(String s) {
s = s.replace(',', '.');
String[] values = s.split("\\|");
// String timestamp = values[0];
// int accelCalibX0 = Integer.parseInt(values[1]);
// int accelCalibY0 = Integer.parseInt(values[2]);
// int accelCalibZ0 = Integer.parseInt(values[3]);
// int accelCalibXG = Integer.parseInt(values[4]);
// int accelCalibYG = Integer.parseInt(values[5]);
// int accelCalibZG = Integer.parseInt(values[6]);
// int accelStateRawX = Integer.parseInt(values[7]);
// int accelStateRawY = Integer.parseInt(values[8]);
// int accelStateRawZ = Integer.parseInt(values[9]);
double accelStateX = Double.parseDouble(values[10]);
double accelStateY = Double.parseDouble(values[11]);
double accelStateZ = Double.parseDouble(values[12]);
// int battery = Integer.parseInt(values[13]);
boolean buttonA = Boolean.parseBoolean(values[14]);
boolean buttonB = Boolean.parseBoolean(values[15]);
boolean buttonUp = Boolean.parseBoolean(values[16]);
boolean buttonRight = Boolean.parseBoolean(values[17]);
boolean buttonDown = Boolean.parseBoolean(values[18]);
boolean buttonLeft = Boolean.parseBoolean(values[19]);
boolean buttonHome = Boolean.parseBoolean(values[20]);
boolean buttonMinus = Boolean.parseBoolean(values[21]);
boolean buttonPlus = Boolean.parseBoolean(values[22]);
boolean buttonOne = Boolean.parseBoolean(values[23]);
boolean buttonTwo = Boolean.parseBoolean(values[24]);
// boolean buttonIRMode = Boolean.parseBoolean(values[25]);
// boolean irStateFound1 = Boolean.parseBoolean(values[26]);
// boolean irStateFound2 = Boolean.parseBoolean(values[27]);
// boolean irStateFound3 = Boolean.parseBoolean(values[28]);
// boolean irStateFound4 = Boolean.parseBoolean(values[29]);
// double irStateSize1 = Double.parseDouble(values[30]);
// double irStateSize2 = Double.parseDouble(values[31]);
// double irStateSize3 = Double.parseDouble(values[32]);
// double irStateSize4 = Double.parseDouble(values[33]);
// Raw values (absolute).
double irStateRawMidX = Double.parseDouble(values[34]);
double irStateRawMidY = Double.parseDouble(values[35]);
double irStateRawX1 = Double.parseDouble(values[36]);
double irStateRawY1 = Double.parseDouble(values[37]);
// double irStateRawX2 = Double.parseDouble(values[38]);
// double irStateRawY2 = Double.parseDouble(values[39]);
// double irStateRawX3 = Double.parseDouble(values[40]);
// double irStateRawY3 = Double.parseDouble(values[41]);
// double irStateRawX4 = Double.parseDouble(values[42]);
// double irStateRawY4 = Double.parseDouble(values[43]);
// Relative values.
// double irStateMidX = Double.parseDouble(values[44]);
// double irStateMidY = Double.parseDouble(values[45]);
// double irStateX1 = Double.parseDouble(values[46]);
// double irStateY1 = Double.parseDouble(values[47]);
// double irStateX2 = Double.parseDouble(values[48]);
// double irStateY2 = Double.parseDouble(values[49]);
// double irStateX3 = Double.parseDouble(values[50]);
// double irStateY3 = Double.parseDouble(values[51]);
// double irStateX4 = Double.parseDouble(values[52]);
// double irStateY4 = Double.parseDouble(values[53]);
// boolean LEDState1 = Boolean.parseBoolean(values[54]);
// boolean LEDState2 = Boolean.parseBoolean(values[55]);
// boolean LEDState3 = Boolean.parseBoolean(values[56]);
// boolean LEDState4 = Boolean.parseBoolean(values[57]);
// boolean rumble = Boolean.parseBoolean(values[58]);
double rotationX = Double.parseDouble(values[59]);
double rotationY = Double.parseDouble(values[60]);
double totalDegree = Double.parseDouble(values[61]);
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_1, buttonA));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_3, buttonB));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_2, buttonHome));
// Propagate pad keys. -> UP, RIGHT, DOWN, LEFT result in VK_UP, VK_RIGHT, VK_DOWN, VK_LEFT.
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_4, buttonUp));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_5, buttonRight));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_6, buttonDown));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_7, buttonLeft));
// Button (-) and (+) pressed -> result in VK_MINUS and VK_PLUS key event.
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_8, buttonMinus));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_9, buttonPlus));
// Button (1) and (2) pressed -> result in VK_1 and VK_2 key event.
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_10, buttonOne));
publish(new DataButton(WiimoteRemote.class, DataButton.BUTTON_11, buttonTwo));
// Send data position event.
double x = irStateRawX1 / 1023;
double y = irStateRawY1 / 767;
publish(new DataPosition2D(WiimoteRemote.class, x, y));
x = irStateRawMidX / 1023;
y = irStateRawMidY / 767;
publish(new DataPosition2D(WiimoteRemote.class, x, y));
x = rotationX / 1023;
y = rotationY / 767;
publish(new DataPosition2D(WiimoteRemote.class, x, y));
// Send accelerometer data.
publish(new DataInertial(WiimoteRemote.class, accelStateX, accelStateY, accelStateZ, false));
// Send current state of degree.
publish(new DataAnalog(WiimoteRemote.class, totalDegree));
}
});
}
/* (non-Javadoc)
* @see org.squidy.manager.ReflectionProcessable#onStop()
*/
@Override
public void onStop() {
if (LOG.isDebugEnabled()) {
LOG.debug("Closing Wiimote.");
}
server.close();
}
}