diff --git a/src/native/win32/org_lwjgl_input_Joystick.cpp b/src/native/win32/org_lwjgl_input_Joystick.cpp index 88f3e97e..eb9e6cc0 100644 --- a/src/native/win32/org_lwjgl_input_Joystick.cpp +++ b/src/native/win32/org_lwjgl_input_Joystick.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * @@ -16,8 +16,7 @@ * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -38,31 +37,30 @@ * @author Brian Matzon * @version $Revision$ */ + #define WIN32_LEAN_AND_MEAN - #include "org_lwjgl_input_Joystick.h" - #include #undef DIRECTINPUT_VERSION #define DIRECTINPUT_VERSION 0x0500 #include -#define JOYMAX 1000 // Maxmimum range to which we'll gauge the swing -#define JOYMIN -1000 // Minimum range to which we'll gauge the swing +#define JOYMAX 1000 // Maxmimum range to which we'll gauge the swing +#define JOYMIN -1000 // Minimum range to which we'll gauge the swing -extern HWND hwnd; // Handle to window +extern HWND hwnd; // Handle to window -IDirectInput* lpDI; // DI instance -IDirectInputDevice2* lpDIDevice; // DI Device instance -DIJOYSTATE2 js; // State of joystick +IDirectInput* lpDI; // DI instance +IDirectInputDevice2* lpDIDevice; // DI Device instance +DIJOYSTATE2 js; // State of joystick -int buttoncount = 0; // Temporary buttoncount -bool hasz; // Temporary zaxis check -bool haspov; // Temporary pov check +int buttoncount = 0; // Temporary buttoncount +bool hasz; // Temporary zaxis check +bool haspov; // Temporary pov check -JNIEnv* environment; // JNIEnvironment copy +JNIEnv* environment; // JNIEnvironment copy -bool create_success; // bool used to determine successfull creation +bool create_success; // bool used to determine successfull creation // Cached fields of Joystick.java jclass clsJoystick; @@ -94,52 +92,52 @@ void PrintError(HRESULT error); * Initializes any field ids */ JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_initIDs(JNIEnv * env, jclass clazz) { - environment = env; + environment = env; } /** * Called when the Joystick instance is to be created */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Joystick_nCreate(JNIEnv *env, jobject obj) { - /* Cache fields in Joystick */ - CacheFields(obj); + /* Cache fields in Joystick */ + CacheFields(obj); - // Create the DirectInput object. - HRESULT hr; - hr = DirectInputCreate(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &lpDI, NULL); - if (FAILED(hr)) { - Shutdown(); - return JNI_FALSE; - } + // Create the DirectInput object. + HRESULT hr; + hr = DirectInputCreate(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &lpDI, NULL); + if (FAILED(hr)) { + Shutdown(); + return JNI_FALSE; + } - /* Find all joysticks */ - EnumerateJoysticks(); - if (!create_success) { - Shutdown(); - return JNI_FALSE; - } + /* Find all joysticks */ + EnumerateJoysticks(); + if (!create_success) { + Shutdown(); + return JNI_FALSE; + } - /* Enumerate capabilities of joystick */ - EnumerateCapabilities(); - if (!create_success) { - Shutdown(); - return JNI_FALSE; - } + /* Enumerate capabilities of joystick */ + EnumerateCapabilities(); + if (!create_success) { + Shutdown(); + return JNI_FALSE; + } - /* Initialize any fields on the Joystick */ - InitializeFields(); + /* Initialize any fields on the Joystick */ + InitializeFields(); - /* Set capabilities */ - SetCapabilities(); + /* Set capabilities */ + SetCapabilities(); - /* Aquire the joystick */ - hr = lpDIDevice->Acquire(); - if(FAILED(hr)) { - Shutdown(); - return JNI_FALSE; - } + /* Aquire the joystick */ + hr = lpDIDevice->Acquire(); + if(FAILED(hr)) { + Shutdown(); + return JNI_FALSE; + } - return create_success; + return create_success; } /* @@ -148,7 +146,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Joystick_nCreate(JNIEnv *env, jo * Signature: ()V */ JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_nDestroy(JNIEnv *env, jobject obj) { - Shutdown(); + Shutdown(); } /* @@ -157,271 +155,248 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_nDestroy(JNIEnv *env, jobje * Signature: ()V */ JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_nPoll(JNIEnv * env, jobject obj) { - lpDIDevice->Poll(); - UpdateFields(); + HRESULT hRes; + + // poll the joystick to read the current state + hRes = lpDIDevice->Poll(); + if (FAILED(hRes)) { +#if _DEBUG + printf("Poll fail\n"); +#endif + return; + } + + UpdateFields(); } /** * Shutdown DI */ void Shutdown() { - // release DI instance - if (lpDI != NULL) { - // release device - if (lpDIDevice != NULL) { - lpDIDevice->Unacquire(); - lpDIDevice->Release(); - lpDIDevice = NULL; - } - lpDI->Release(); - lpDI = NULL; - } + // release DI instance + if (lpDI != NULL) { + // release device + if (lpDIDevice != NULL) { + lpDIDevice->Unacquire(); + lpDIDevice->Release(); + lpDIDevice = NULL; + } + lpDI->Release(); + lpDI = NULL; + } - // Delete are global reference to the Joystick - if(objJoystick != NULL) { - environment->DeleteGlobalRef(objJoystick); - } + // Delete are global reference to the Joystick + if(objJoystick != NULL) { + environment->DeleteGlobalRef(objJoystick); + } } /** * Enumerates the capabilities of the joystick attached to the system */ void EnumerateCapabilities() { - HRESULT hr; - hr = lpDIDevice->EnumObjects(EnumJoystickObjectsCallback, NULL, DIDFT_ALL); - if FAILED(hr) { - create_success = false; - return; - } - create_success = true; + HRESULT hr; + hr = lpDIDevice->EnumObjects(EnumJoystickObjectsCallback, NULL, DIDFT_ALL); + if FAILED(hr) { + create_success = false; + return; + } + create_success = true; } /** * Enumerates the joysticks attached to the system */ void EnumerateJoysticks() { - HRESULT hr; - hr = lpDI->EnumDevices(DIDEVTYPE_JOYSTICK, EnumJoystickCallback, 0, DIEDFL_ATTACHEDONLY); - if FAILED(hr) { - create_success = false; - return; - } - create_success = true; + HRESULT hr; + hr = lpDI->EnumDevices(DIDEVTYPE_JOYSTICK, EnumJoystickCallback, 0, DIEDFL_ATTACHEDONLY); + if FAILED(hr) { + create_success = false; + return; + } + create_success = true; } /** * Callback from EnumDevices. Called for each joystick attached to the system */ BOOL CALLBACK EnumJoystickCallback(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef) { - /* Add the joystick */ - CreateJoystick(pdinst); - if(create_success) { - /* Do setup of joystick */ - SetupJoystick(); - } + /* Add the joystick */ + CreateJoystick(pdinst); + if(create_success) { + /* Do setup of joystick */ + SetupJoystick(); + } - /* just stop after 1st joystick */ - return DIENUM_STOP; + /* just stop after 1st joystick */ + return DIENUM_STOP; } /** * Callback from EnumObjects. Called for each "object" on the joystick. */ BOOL CALLBACK EnumJoystickObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { - if(lpddoi->guidType == GUID_Button) { - buttoncount++; - } else if(lpddoi->guidType == GUID_XAxis || lpddoi->guidType == GUID_YAxis) { - //do nothing - } else if(lpddoi->guidType == GUID_ZAxis || strcmp("Throttle", lpddoi->tszName) == 0){ - hasz = true; - } else if (lpddoi->guidType == GUID_POV){ - haspov = true; - } else { + if(lpddoi->guidType == GUID_Button) { + buttoncount++; + } else if(lpddoi->guidType == GUID_XAxis || lpddoi->guidType == GUID_YAxis) { + //do nothing + } else if(lpddoi->guidType == GUID_ZAxis || strcmp("Throttle", lpddoi->tszName) == 0){ + hasz = true; + } else if (lpddoi->guidType == GUID_POV){ + haspov = true; + } else { #ifdef _DEBUG - printf("Unhandled object found: %s\n", lpddoi->tszName); + printf("Unhandled object found: %s\n", lpddoi->tszName); #endif - } - return DIENUM_CONTINUE; + } + return DIENUM_CONTINUE; } /** * Creates the specified device as a joystick */ void CreateJoystick(LPCDIDEVICEINSTANCE lpddi) { - HRESULT hr; - hr = lpDI->CreateDevice(lpddi->guidInstance, (LPDIRECTINPUTDEVICE*) &lpDIDevice, NULL); - if FAILED(hr) { - create_success = false; - return; - } - create_success = true; + HRESULT hr; + hr = lpDI->CreateDevice(lpddi->guidInstance, (LPDIRECTINPUTDEVICE*) &lpDIDevice, NULL); + if FAILED(hr) { + create_success = false; + return; + } + create_success = true; } /** * Sets up the joystick properties */ void SetupJoystick() { - // set joystick data format - if(lpDIDevice->SetDataFormat(&c_dfDIJoystick2) != DI_OK) { - create_success = false; - return; - } + // set joystick data format + if(lpDIDevice->SetDataFormat(&c_dfDIJoystick2) != DI_OK) { + create_success = false; + return; + } - // set the cooperative level - if(lpDIDevice->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND) != DI_OK) { - create_success = false; - return; - } + // set the cooperative level + if(lpDIDevice->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND) != DI_OK) { + create_success = false; + return; + } - // set X-axis range to (-1000 ... +1000) - // This lets us test against 0 to see which way the stick is pointed. - DIPROPRANGE diprg; - diprg.diph.dwSize = sizeof(diprg); - diprg.diph.dwHeaderSize = sizeof(diprg.diph); - diprg.diph.dwObj = DIJOFS_X; - diprg.diph.dwHow = DIPH_BYOFFSET; - diprg.lMin = JOYMIN; - diprg.lMax = JOYMAX; + // set X-axis range to (-1000 ... +1000) + // This lets us test against 0 to see which way the stick is pointed. + DIPROPRANGE diprg; + diprg.diph.dwSize = sizeof(diprg); + diprg.diph.dwHeaderSize = sizeof(diprg.diph); + diprg.diph.dwObj = DIJOFS_X; + diprg.diph.dwHow = DIPH_BYOFFSET; + diprg.lMin = JOYMIN; + diprg.lMax = JOYMAX; - if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) { - create_success = false; - return; - } + if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) { + create_success = false; + return; + } - // - // And again for Y-axis range - // - diprg.diph.dwObj = DIJOFS_Y; + // + // And again for Y-axis range + // + diprg.diph.dwObj = DIJOFS_Y; - if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) - { - create_success = false; - return; - } + if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) + { + create_success = false; + return; + } - // - // And again for z-axis range (throttle) - // - diprg.diph.dwObj = DIJOFS_Z; + // + // And again for z-axis range (throttle) + // + diprg.diph.dwObj = DIJOFS_Z; - if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) { - create_success = false; - return; - } - create_success = true; -} - -/** - * Aquires the Joystick - */ -bool AcquireInput(void) { - HRESULT hRes; - - // if we have a device - if (lpDIDevice != NULL) { - // acquire the device - hRes = lpDIDevice->Acquire(); - - if (SUCCEEDED(hRes)) { - // acquisition successful - return TRUE; - } else { - // acquisition failed - return FALSE; - } - } else { - // we don't have a current device - return FALSE; - } + if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) { + create_success = false; + return; + } + create_success = true; } /** * Sets the fields on the Joystick */ void InitializeFields() { - //set buttons array - jbooleanArray buttonsArray = environment->NewBooleanArray(buttoncount); - environment->SetObjectField(objJoystick, fidButtons, buttonsArray); + //set buttons array + jbooleanArray buttonsArray = environment->NewBooleanArray(buttoncount); + environment->SetObjectField(objJoystick, fidButtons, buttonsArray); } /** * Updates the fields on the Joystick */ void UpdateFields() { - HRESULT hRes; + HRESULT hRes; - // poll the joystick to read the current state - hRes = lpDIDevice->Poll(); - if (FAILED(hRes)) { + // get data from the joystick + hRes = lpDIDevice->GetDeviceState(sizeof(DIJOYSTATE2), &js); + + if (hRes != DI_OK) { + // did the read fail because we lost input for some reason? + // if so, then attempt to reacquire. + if(hRes == DIERR_INPUTLOST) { + lpDIDevice->Acquire(); #if _DEBUG - printf("Poll fail\n"); + printf("DIERR_INPUTLOST, reaquiring input\n"); #endif - return; - } - - // get data from the joystick - hRes = lpDIDevice->GetDeviceState(sizeof(DIJOYSTATE2), &js); - - if (hRes != DI_OK) { - // did the read fail because we lost input for some reason? - // if so, then attempt to reacquire. - if(hRes == DIERR_INPUTLOST) { - AcquireInput(); -#if _DEBUG - printf("DIERR_INPUTLOST, reaquiring input\n"); -#endif - } - return; } - - //axis's - environment->SetIntField(objJoystick, fidX, js.lX); - environment->SetIntField(objJoystick, fidY, js.lY); - if(hasz) { - environment->SetIntField(objJoystick, fidZ, js.lZ); - } + return; + } - //buttons - jbooleanArray buttonsArray = (jbooleanArray) environment->GetObjectField(objJoystick, fidButtons); - BYTE * buttons = (BYTE *) environment->GetPrimitiveArrayCritical(buttonsArray, NULL); - memcpy(buttons, js.rgbButtons, 4); - environment->ReleasePrimitiveArrayCritical(buttonsArray, buttons, 0); + //axis's + environment->SetIntField(objJoystick, fidX, js.lX); + environment->SetIntField(objJoystick, fidY, js.lY); + if(hasz) { + environment->SetIntField(objJoystick, fidZ, js.lZ); + } - //pov - if(haspov) { - environment->SetIntField(objJoystick, fidPOV, js.rgdwPOV[0]); - } + //buttons + jbooleanArray buttonsArray = (jbooleanArray) environment->GetObjectField(objJoystick, fidButtons); + BYTE * buttons = (BYTE *) environment->GetPrimitiveArrayCritical(buttonsArray, NULL); + memcpy(buttons, js.rgbButtons, 4); + environment->ReleasePrimitiveArrayCritical(buttonsArray, buttons, 0); + + //pov + if(haspov) { + environment->SetIntField(objJoystick, fidPOV, js.rgdwPOV[0]); + } } /** * Sets the capabilities of the joystick */ void SetCapabilities() { - //set buttoncount - environment->SetIntField(objJoystick, fidButtonCount, buttoncount); + //set buttoncount + environment->SetIntField(objJoystick, fidButtonCount, buttoncount); - //set z axis - environment->SetIntField(objJoystick, fidHasZAxis, hasz); + //set z axis + environment->SetIntField(objJoystick, fidHasZAxis, hasz); - //set pov - environment->SetIntField(objJoystick, fidHasPOV, haspov); + //set pov + environment->SetIntField(objJoystick, fidHasPOV, haspov); } /** * Caches the field ids for quicker access */ void CacheFields(jobject obj) { - /* make certain that we're caching from a global object, and not a local */ - objJoystick = environment->NewGlobalRef(obj); - clsJoystick = environment->GetObjectClass(objJoystick); + /* make certain that we're caching from a global object, and not a local */ + objJoystick = environment->NewGlobalRef(obj); + clsJoystick = environment->GetObjectClass(objJoystick); - /* cache fields */ - fidButtonCount = environment->GetFieldID(clsJoystick, "buttonCount", "I"); - fidHasZAxis = environment->GetFieldID(clsJoystick, "hasZAxis", "Z"); - fidHasPOV = environment->GetFieldID(clsJoystick, "hasPOV", "Z"); - fidButtons = environment->GetFieldID(clsJoystick, "buttons", "[Z"); - fidX = environment->GetFieldID(clsJoystick, "x", "I"); - fidY = environment->GetFieldID(clsJoystick, "y", "I"); - fidZ = environment->GetFieldID(clsJoystick, "z", "I"); - fidPOV = environment->GetFieldID(clsJoystick, "pov", "I"); + /* cache fields */ + fidButtonCount = environment->GetFieldID(clsJoystick, "buttonCount", "I"); + fidHasZAxis = environment->GetFieldID(clsJoystick, "hasZAxis", "Z"); + fidHasPOV = environment->GetFieldID(clsJoystick, "hasPOV", "Z"); + fidButtons = environment->GetFieldID(clsJoystick, "buttons", "[Z"); + fidX = environment->GetFieldID(clsJoystick, "x", "I"); + fidY = environment->GetFieldID(clsJoystick, "y", "I"); + fidZ = environment->GetFieldID(clsJoystick, "z", "I"); + fidPOV = environment->GetFieldID(clsJoystick, "pov", "I"); } \ No newline at end of file