Updated Controllers event queue to make use of the new JInput

event queue, including adding getEventNanoseconds() to the 
Controllers interface. TestControllers against Logitech pad on
Win32 confirms that no behaviour changes are evident.
This commit is contained in:
Kevin Glass 2006-11-17 08:08:21 +00:00
parent 15fd0f6d81
commit 007fe5999e
4 changed files with 67 additions and 49 deletions

View File

@ -25,24 +25,38 @@ class ControllerEvent {
private boolean xaxis;
/** True if this event was caused by the y axis */
private boolean yaxis;
/** The time stamp of this event */
private long timeStamp;
/**
* Create a new event
*
* @param source The source of the event
* @param timeStamp The time stamp given for this event
* @param type The type of control generating this event
* @param index The index of the input that generated the event
* @param xaxis True if this event was caused by the x-axis
* @param yaxis True if this event was caused by the y-axis
*/
public ControllerEvent(Controller source,int type,int index,boolean xaxis,boolean yaxis) {
public ControllerEvent(Controller source,long timeStamp, int type,int index,boolean xaxis,boolean yaxis) {
this.source = source;
this.timeStamp = timeStamp;
this.type = type;
this.index = index;
this.xaxis = xaxis;
this.yaxis = yaxis;
}
/**
* Get the time stamp given for this event. As with nanoTime()
* this value means nothing other than giving ordering
*
* @return The time stamp given for this event
*/
public long getTimeStamp() {
return timeStamp;
}
/**
* Get the controller that generated this event
*

View File

@ -234,6 +234,15 @@ public class Controllers {
return event.isPovY();
}
/**
* Get the timestamp assigned to the current event
*
* @return The timestamp assigned ot the current event
*/
public static long getEventNanoseconds() {
return event.getTimeStamp();
}
/**
* Add an event to the stack of events that have been caused
*

View File

@ -3,6 +3,8 @@ package org.lwjgl.input;
import java.util.ArrayList;
import net.java.games.input.Component;
import net.java.games.input.Event;
import net.java.games.input.EventQueue;
/**
* A wrapper round a JInput controller that attempts to make the interface
@ -159,68 +161,60 @@ class JInputController implements Controller {
public void poll() {
target.poll();
// read buttons to update events
for (int i=0;i<getButtonCount();i++) {
Component button = (Component) buttons.get(i);
float data = button.getPollData();
Event event = new Event();
EventQueue queue = target.getEventQueue();
while (queue.getNextEvent(event)) {
// handle button event
if (buttons.contains(event.getComponent())) {
Component button = event.getComponent();
int buttonIndex = buttons.indexOf(button);
buttonState[buttonIndex] = event.getValue() != 0;
if (buttonState[i] != (data != 0)) {
// fire button pressed event
Controllers.addEvent(new ControllerEvent(this,ControllerEvent.BUTTON,i,false,false));
Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.BUTTON,buttonIndex,false,false));
}
buttonState[i] = data != 0;
}
// read povs to update events
for (int i=0;i<pov.size();i++) {
Component p = (Component) pov.get(i);
float data = p.getPollData();
if (povValues[i] != data) {
// handle pov events
if (pov.contains(event.getComponent())) {
Component povComponent = event.getComponent();
int povIndex = pov.indexOf(povComponent);
float prevX = getPovX();
float prevY = getPovY();
povValues[i] = data;
povValues[povIndex] = event.getValue();
if (prevX != getPovX()) {
Controllers.addEvent(new ControllerEvent(this,ControllerEvent.POVX,0,false,false));
Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.POVX,0,false,false));
}
if (prevY != getPovY()) {
Controllers.addEvent(new ControllerEvent(this,ControllerEvent.POVY,0,false,false));
Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.POVY,0,false,false));
}
}
povValues[i] = data;
}
// read axis to update events
for (int i=0;i<getAxisCount();i++) {
Component axis = (Component) axes.get(i);
float value = axis.getPollData();
// fixed dead zone since most axis don't report it :(
if (Math.abs(value) < deadZones[i]) {
value = 0;
}
if (Math.abs(value) < axis.getDeadZone()) {
value = 0;
}
if (Math.abs(value) > axesMax[i]) {
axesMax[i] = Math.abs(value);
}
// normalize the value based on maximum value read in the past
value /= axesMax[i];
if (axesValue[i] != value) {
// handle axis updates
if (axes.contains(event.getComponent())) {
Component axis = event.getComponent();
int axisIndex = axes.indexOf(axis);
float value = axis.getPollData();
// fixed dead zone since most axis don't report it :(
if (Math.abs(value) < deadZones[axisIndex]) {
value = 0;
}
if (Math.abs(value) < axis.getDeadZone()) {
value = 0;
}
if (Math.abs(value) > axesMax[axisIndex]) {
axesMax[axisIndex] = Math.abs(value);
}
// normalize the value based on maximum value read in the past
value /= axesMax[axisIndex];
// fire event
Controllers.addEvent(new ControllerEvent(this,ControllerEvent.AXIS,i,i == xaxis,i == yaxis));
Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.AXIS,axisIndex,
axisIndex == xaxis,axisIndex == yaxis));
axesValue[axisIndex] = value;
}
axesValue[i] = value;
}
}

View File

@ -142,6 +142,7 @@ public class TestControllers extends JPanel {
while (Controllers.next()) {
System.out.println("Event Fired: ");
System.out.println("\t"+Controllers.getEventNanoseconds());
System.out.println("\t"+Controllers.getEventSource()+":"+Controllers.getEventControlIndex()+":"+Controllers.isEventButton());
System.out.println("\t"+Controllers.isEventXAxis()+":"+Controllers.isEventYAxis());
}