Buffered Joystick Data

To retrieve buffered data from the joystick, you must first set the buffer size (see Device Properties) and declare an array of DIDEVICEOBJECTDATA structures. The number of elements required in this array is the same as the buffer size. After acquiring the device, you can examine and flush the buffer anytime with the IDirectInputDevice:GetDeviceData method. (See Buffered and Immediate Data.)

Each element in the DIDEVICEOBJECTDATA array represents a change in state for a single object on the joystick. For instance, a simple joystick contains four objects or input sources: x-axis, y-axis, button 0 and button 1. If the user presses button 0 and moves the stick diagonally, the array passed to IDirectInputDevice::GetDeviceData will have three elements filled in: an element for button 0 being pressed, an element for the change in the x-axis, and an element for the change in the y-axis.

You can determine which object an element in the array refers to by checking the dwOfs member of the DIDEVICEOBJECTDATA structure against the following values:

·DIJOFS_X

·DIJOFS_Y

·DIJOFS_Z

·DIJOFS_Rx

·DIJOFS_Ry

·DIJOFS_Rz

·DIJOFS_BUTTON0 to DIJOFS_BUTTON31 or DIJOFS_BUTTON(n)

·DIJOFS_POV(n)

·DIJOFS_SLIDER(n)

Each of these values is equivalent to the offset of the data for the object in a DIJOYSTATE structure. For example, DIJOFS_BUTTON0 is equivalent to the offset of rgbButtons[0] in the DIJOYSTATE structure. You can use simple comparisons to determine which device object is associated with an item in the buffer. For example:

DIDEVICEOBJECTDATA *lpdidod;

int n;

.

.

.

/* JoyBuffer is an array of DIDEVICEOBJECTDATA structures

that has been set by a call to GetDeviceData.

n is incremented in a loop that examines all filled elements

in the array. */

lpdidod = &JoyBuffer[n];

if (( (int) lpdidod->dwOfs == DIJOFS_BUTTON0)

&& (lpdidod->dwData & 0x80))

{

; // do something in response to press of primary button

}

The data for the change of state of the device object is located in the dwData member of the DIDEVICEOBJECTDATA structure. For axes, the coordinate value is returned in this member. For button objects, only the low byte of dwData is significant; the high bit of this byte is set if the button is pressed and clear if the button is released.

For the other members, see Time Stamps and Sequence Numbers.