Issue number: Implemented OSXJoystick functionality

Submitted by:  Chris Cooper cjcdoomed@gmail.com
This commit is contained in:
cjcdoomed 2005-05-20 14:25:24 +00:00
parent ab7bba58d6
commit 0d155c818c

View file

@ -1,17 +1,34 @@
package net.java.games.input;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: gpierce
* Date: Aug 2, 2003
* Time: 3:58:45 PM
* To change this template use Options | File Templates.
* Joystick class which recognizes most of the enhanced joystick features
* including:
* x, y, and z axis
* x, y axis rotation
* slider
* hat
*
*/
public class OSXJoystick extends AbstractController implements InputController
{
private OSXEnvironmentPlugin plugin;
private long lpDevice;
private long lpQueue;
private int buttonCount = 0;
private List buttons = new ArrayList();
private Axis xAxis = null;
private Axis yAxis = null;
private Axis zAxis = null;
private Axis xAxisRotation = null;
private Axis yAxisRotation = null;
private Axis zAxisRotation = null;
private Axis slider = null;
private Axis hat = null;
public OSXJoystick( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
{
@ -22,7 +39,14 @@ public class OSXJoystick extends AbstractController implements InputController
openDevice();
}
/**
* Returns the type of the Controller.
*/
public Type getType() {
return Type.STICK;
}
public boolean poll()
{
plugin.pollDevice( lpQueue );
@ -45,19 +69,99 @@ public class OSXJoystick extends AbstractController implements InputController
plugin.pollDevice( this.lpQueue );
}
public Component[] getComponents() {
List cpList = new ArrayList(buttons);
if (xAxis != null) cpList.add(xAxis);
if (yAxis != null) cpList.add(yAxis);
if (zAxis != null) cpList.add(zAxis);
if (xAxisRotation != null) cpList.add(xAxisRotation);
if (yAxisRotation != null) cpList.add(yAxisRotation);
if (zAxisRotation != null) cpList.add(zAxisRotation);
if (slider != null) cpList.add(slider);
if (hat != null) cpList.add(hat);
Component[] ca = new Component[cpList.size()];
return (Component[]) cpList.toArray(ca);
}
public void addControllerElement(InputControllerElement element)
{
switch ( element.getElementType() )
{
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_MISC:
System.out.println("*Adding misc component");
break;
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON:
System.out.println("*Adding button");
Button button = null;
switch (buttonCount) {
case 0:
button = new Button(Component.Identifier.Button.TRIGGER, element);
break;
case 1:
button = new Button(Component.Identifier.Button._2, element);
break;
case 2:
button = new Button(Component.Identifier.Button._3, element);
break;
case 3:
button = new Button(Component.Identifier.Button._4, element);
break;
case 4:
button = new Button(Component.Identifier.Button._5, element);
break;
case 5:
button = new Button(Component.Identifier.Button._6, element);
break;
case 6:
button = new Button(Component.Identifier.Button._7, element);
break;
case 7:
button = new Button(Component.Identifier.Button._8, element);
break;
case 8:
button = new Button(Component.Identifier.Button._9, element);
break;
default:
String name = String.valueOf(buttonCount + 1);
button = new Button(new Component.Identifier.Button(name), element);
break;
}
buttons.add(button);
buttonCount++;
System.out.println("Adding button [" + buttonCount + "]");
break;
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_MISC:
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_AXIS:
switch (element.getUsage()) {
case OSXEnvironmentPlugin.HID_USAGE_XAXIS:
xAxis = new Axis(Component.Identifier.Axis.X, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_YAXIS:
yAxis = new Axis(Component.Identifier.Axis.Y, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_ZAXIS:
zAxis = new Axis(Component.Identifier.Axis.Z, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_XAXIS_ROTATION:
xAxisRotation = new Axis(Component.Identifier.Axis.RX, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_YAXIS_ROTATION:
yAxisRotation = new Axis(Component.Identifier.Axis.RY, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_ZAXIS_ROTATION:
zAxisRotation = new Axis(Component.Identifier.Axis.RZ, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_SLIDER:
slider = new Axis(Component.Identifier.Axis.SLIDER, element);
break;
case OSXEnvironmentPlugin.HID_USAGE_HAT:
hat = new Axis(Component.Identifier.Axis.POV, element);
break;
default:
System.out.println("*Unknown axis");
break;
}
System.out.println("*Adding axis");
break;
@ -80,4 +184,97 @@ public class OSXJoystick extends AbstractController implements InputController
}
}
/**
* Mouse button axis implementation
*/
class Button extends AbstractComponent
{
private long hidCookie;
private boolean isRelative;
/** Public constructor
* @param id An ID of a button to create an obejct to represent.
*
*/
public Button(Component.Identifier.Button id, InputControllerElement element)
{
super(id.getName(), id);
this.hidCookie = element.getHidCookie();
this.isRelative = element.isRelative();
}
/** Returns the data from the last time the control has been polled.
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
* If this axis is normalized, the value returned will be between -1.0f and
* 1.0f.
* @return state of controller. (Note: DX8 mice actually
* queue state so what is returned is the next state,
* not necessarily the most current one.)
*/
public float getPollData()
{
return (float) plugin.pollElement( lpDevice, hidCookie );
}
/** Returns <code>true</code> if data returned from <code>poll</code>
* is relative to the last call, or <code>false</code> if data
* is absolute.
* @return true if data is relative, otherwise false.
*/
public boolean isRelative()
{
return isRelative;
}
}
/**
* Mouse button axis implementation
*/
class Axis extends AbstractComponent
{
private long hidCookie;
private boolean isRelative;
/** Public constructor
* @param id An ID of a button to create an obejct to represent.
*
*/
public Axis(Component.Identifier id, InputControllerElement element)
{
super(id.getName(), id);
this.hidCookie = element.getHidCookie();
this.isRelative = element.isRelative();
}
/** Returns the data from the last time the control has been polled.
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
* If this axis is normalized, the value returned will be between -1.0f and
* 1.0f.
* @return state of controller. (Note: DX8 mice actually
* queue state so what is returned is the next state,
* not necessarily the most current one.)
*/
public float getPollData()
{
return (float) plugin.pollElement( lpDevice, hidCookie );
}
/** Returns <code>true</code> if data returned from <code>poll</code>
* is relative to the last call, or <code>false</code> if data
* is absolute.
* @return true if data is relative, otherwise false.
*/
public boolean isRelative()
{
return isRelative;
}
}
}