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; private boolean xaxis;
/** True if this event was caused by the y axis */ /** True if this event was caused by the y axis */
private boolean yaxis; private boolean yaxis;
/** The time stamp of this event */
private long timeStamp;
/** /**
* Create a new event * Create a new event
* *
* @param source The source of the 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 type The type of control generating this event
* @param index The index of the input that generated the 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 xaxis True if this event was caused by the x-axis
* @param yaxis True if this event was caused by the y-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.source = source;
this.timeStamp = timeStamp;
this.type = type; this.type = type;
this.index = index; this.index = index;
this.xaxis = xaxis; this.xaxis = xaxis;
this.yaxis = yaxis; 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 * Get the controller that generated this event
* *

View File

@ -234,6 +234,15 @@ public class Controllers {
return event.isPovY(); 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 * 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 java.util.ArrayList;
import net.java.games.input.Component; 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 * A wrapper round a JInput controller that attempts to make the interface
@ -159,68 +161,60 @@ class JInputController implements Controller {
public void poll() { public void poll() {
target.poll(); target.poll();
// read buttons to update events Event event = new Event();
for (int i=0;i<getButtonCount();i++) { EventQueue queue = target.getEventQueue();
Component button = (Component) buttons.get(i);
while (queue.getNextEvent(event)) {
float data = button.getPollData(); // 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 // 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; // handle pov events
} if (pov.contains(event.getComponent())) {
Component povComponent = event.getComponent();
// read povs to update events int povIndex = pov.indexOf(povComponent);
for (int i=0;i<pov.size();i++) {
Component p = (Component) pov.get(i);
float data = p.getPollData();
if (povValues[i] != data) {
float prevX = getPovX(); float prevX = getPovX();
float prevY = getPovY(); float prevY = getPovY();
povValues[povIndex] = event.getValue();
povValues[i] = data;
if (prevX != getPovX()) { 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()) { 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; // handle axis updates
} if (axes.contains(event.getComponent())) {
Component axis = event.getComponent();
// read axis to update events int axisIndex = axes.indexOf(axis);
for (int i=0;i<getAxisCount();i++) { float value = axis.getPollData();
Component axis = (Component) axes.get(i);
// fixed dead zone since most axis don't report it :(
float value = axis.getPollData(); if (Math.abs(value) < deadZones[axisIndex]) {
value = 0;
// fixed dead zone since most axis don't report it :( }
if (Math.abs(value) < deadZones[i]) { if (Math.abs(value) < axis.getDeadZone()) {
value = 0; value = 0;
} }
if (Math.abs(value) < axis.getDeadZone()) { if (Math.abs(value) > axesMax[axisIndex]) {
value = 0; axesMax[axisIndex] = Math.abs(value);
} }
if (Math.abs(value) > axesMax[i]) {
axesMax[i] = Math.abs(value); // normalize the value based on maximum value read in the past
} value /= axesMax[axisIndex];
// normalize the value based on maximum value read in the past
value /= axesMax[i];
if (axesValue[i] != value) {
// fire event // 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()) { while (Controllers.next()) {
System.out.println("Event Fired: "); 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.getEventSource()+":"+Controllers.getEventControlIndex()+":"+Controllers.isEventButton());
System.out.println("\t"+Controllers.isEventXAxis()+":"+Controllers.isEventYAxis()); System.out.println("\t"+Controllers.isEventXAxis()+":"+Controllers.isEventYAxis());
} }