new and improved version - w00t
This commit is contained in:
parent
5d71ae31d3
commit
e781a7c83d
|
@ -91,19 +91,32 @@ public class ControllerTest extends Panel {
|
||||||
y += 20;
|
y += 20;
|
||||||
g.drawString("-----------------------------------------------", x, y);
|
g.drawString("-----------------------------------------------", x, y);
|
||||||
y += 20;
|
y += 20;
|
||||||
g.drawString("x : " + Controller.x, x, y);
|
|
||||||
y += 20;
|
if(Controller.hasXAxis) {
|
||||||
g.drawString("y : " + Controller.y, x, y);
|
g.drawString("x : " + Controller.x, x, y);
|
||||||
y += 20;
|
y += 20;
|
||||||
if (Controller.hasZAxis) {
|
}
|
||||||
|
|
||||||
|
if(Controller.hasYAxis) {
|
||||||
|
g.drawString("y : " + Controller.y, x, y);
|
||||||
|
y += 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Controller.hasZAxis) {
|
||||||
g.drawString("z : " + Controller.z, x, y);
|
g.drawString("z : " + Controller.z, x, y);
|
||||||
y += 20;
|
y += 20;
|
||||||
}
|
}
|
||||||
if (Controller.hasPOV) {
|
|
||||||
|
if (Controller.hasPOV) {
|
||||||
g.drawString("pov: " + Controller.pov, x, y);
|
g.drawString("pov: " + Controller.pov, x, y);
|
||||||
y += 20;
|
y += 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Controller.hasSlider) {
|
||||||
|
g.drawString("slder: " + Controller.slider, x, y);
|
||||||
|
y += 20;
|
||||||
|
}
|
||||||
|
|
||||||
//paint buttons
|
//paint buttons
|
||||||
g.drawString("btn: ", x, y);
|
g.drawString("btn: ", x, y);
|
||||||
x += g.getFontMetrics().stringWidth("btn: ");
|
x += g.getFontMetrics().stringWidth("btn: ");
|
||||||
|
|
|
@ -55,8 +55,11 @@ IDirectInputDevice2* lpDIDevice; // DI Device instance
|
||||||
DIJOYSTATE2 js; // State of Controller
|
DIJOYSTATE2 js; // State of Controller
|
||||||
|
|
||||||
int buttoncount = 0; // Temporary buttoncount
|
int buttoncount = 0; // Temporary buttoncount
|
||||||
|
bool hasx; // Temporary xaxis check
|
||||||
|
bool hasy; // Temporary yaxis check
|
||||||
bool hasz; // Temporary zaxis check
|
bool hasz; // Temporary zaxis check
|
||||||
bool haspov; // Temporary pov check
|
bool haspov; // Temporary pov check
|
||||||
|
bool hasslider; // Temporary slider check
|
||||||
|
|
||||||
JNIEnv* environment; // JNIEnvironment copy
|
JNIEnv* environment; // JNIEnvironment copy
|
||||||
|
|
||||||
|
@ -65,13 +68,17 @@ bool create_success; // bool used to determine successfull creati
|
||||||
// Cached fields of Controller.java
|
// Cached fields of Controller.java
|
||||||
jclass clsController;
|
jclass clsController;
|
||||||
jfieldID fidButtonCount;
|
jfieldID fidButtonCount;
|
||||||
|
jfieldID fidHasXAxis;
|
||||||
|
jfieldID fidHasYAxis;
|
||||||
jfieldID fidHasZAxis;
|
jfieldID fidHasZAxis;
|
||||||
jfieldID fidHasPOV;
|
jfieldID fidHasPOV;
|
||||||
|
jfieldID fidHasSlider;
|
||||||
jfieldID fidButtons;
|
jfieldID fidButtons;
|
||||||
jfieldID fidX;
|
jfieldID fidX;
|
||||||
jfieldID fidY;
|
jfieldID fidY;
|
||||||
jfieldID fidZ;
|
jfieldID fidZ;
|
||||||
jfieldID fidPOV;
|
jfieldID fidPOV;
|
||||||
|
jfieldID fidSlider;
|
||||||
|
|
||||||
// Function prototypes (defined in the cpp file, since header file is generic across platforms
|
// Function prototypes (defined in the cpp file, since header file is generic across platforms
|
||||||
void EnumerateCapabilities();
|
void EnumerateCapabilities();
|
||||||
|
@ -106,6 +113,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Controller_nCreate(JNIEnv *env,
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
hr = DirectInputCreate(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &lpDI, NULL);
|
hr = DirectInputCreate(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &lpDI, NULL);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("DirectInputCreate failed\n");
|
||||||
|
#endif
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return JNI_FALSE;
|
return JNI_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -113,6 +123,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Controller_nCreate(JNIEnv *env,
|
||||||
/* Find all Controllers */
|
/* Find all Controllers */
|
||||||
EnumerateControllers();
|
EnumerateControllers();
|
||||||
if (!create_success) {
|
if (!create_success) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("EnumerateControllers failed\n");
|
||||||
|
#endif
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return JNI_FALSE;
|
return JNI_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -120,10 +133,18 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Controller_nCreate(JNIEnv *env,
|
||||||
/* Enumerate capabilities of Controller */
|
/* Enumerate capabilities of Controller */
|
||||||
EnumerateCapabilities();
|
EnumerateCapabilities();
|
||||||
if (!create_success) {
|
if (!create_success) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("EnumerateCapabilities failed\n");
|
||||||
|
#endif
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return JNI_FALSE;
|
return JNI_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(create_success) {
|
||||||
|
/* Do setup of Controller */
|
||||||
|
SetupController();
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize any fields on the Controller */
|
/* Initialize any fields on the Controller */
|
||||||
InitializeFields();
|
InitializeFields();
|
||||||
|
|
||||||
|
@ -133,10 +154,12 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Controller_nCreate(JNIEnv *env,
|
||||||
/* Aquire the Controller */
|
/* Aquire the Controller */
|
||||||
hr = lpDIDevice->Acquire();
|
hr = lpDIDevice->Acquire();
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("Acquire failed\n");
|
||||||
|
#endif
|
||||||
Shutdown();
|
Shutdown();
|
||||||
return JNI_FALSE;
|
return JNI_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return create_success;
|
return create_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +216,9 @@ void EnumerateCapabilities() {
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
hr = lpDIDevice->EnumObjects(EnumControllerObjectsCallback, NULL, DIDFT_ALL);
|
hr = lpDIDevice->EnumObjects(EnumControllerObjectsCallback, NULL, DIDFT_ALL);
|
||||||
if FAILED(hr) {
|
if FAILED(hr) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("EnumObjects failed\n");
|
||||||
|
#endif
|
||||||
create_success = false;
|
create_success = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -206,6 +232,9 @@ void EnumerateControllers() {
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
hr = lpDI->EnumDevices(DIDEVTYPE_JOYSTICK, EnumControllerCallback, 0, DIEDFL_ATTACHEDONLY);
|
hr = lpDI->EnumDevices(DIDEVTYPE_JOYSTICK, EnumControllerCallback, 0, DIEDFL_ATTACHEDONLY);
|
||||||
if FAILED(hr) {
|
if FAILED(hr) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("EnumDevices failed\n");
|
||||||
|
#endif
|
||||||
create_success = false;
|
create_success = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -218,10 +247,6 @@ void EnumerateControllers() {
|
||||||
BOOL CALLBACK EnumControllerCallback(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef) {
|
BOOL CALLBACK EnumControllerCallback(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef) {
|
||||||
/* Add the Controller */
|
/* Add the Controller */
|
||||||
CreateController(pdinst);
|
CreateController(pdinst);
|
||||||
if(create_success) {
|
|
||||||
/* Do setup of Controller */
|
|
||||||
SetupController();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* just stop after 1st Controller */
|
/* just stop after 1st Controller */
|
||||||
return DIENUM_STOP;
|
return DIENUM_STOP;
|
||||||
|
@ -231,16 +256,23 @@ BOOL CALLBACK EnumControllerCallback(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef) {
|
||||||
* Callback from EnumObjects. Called for each "object" on the Controller.
|
* Callback from EnumObjects. Called for each "object" on the Controller.
|
||||||
*/
|
*/
|
||||||
BOOL CALLBACK EnumControllerObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) {
|
BOOL CALLBACK EnumControllerObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("found %s\n", lpddoi->tszName);
|
||||||
|
#endif
|
||||||
if(lpddoi->guidType == GUID_Button) {
|
if(lpddoi->guidType == GUID_Button) {
|
||||||
buttoncount++;
|
buttoncount++;
|
||||||
} else if(lpddoi->guidType == GUID_XAxis || lpddoi->guidType == GUID_YAxis) {
|
} else if(lpddoi->guidType == GUID_XAxis) {
|
||||||
//do nothing
|
hasx = true;
|
||||||
} else if(lpddoi->guidType == GUID_ZAxis || strcmp("Throttle", lpddoi->tszName) == 0){
|
} else if(lpddoi->guidType == GUID_YAxis) {
|
||||||
|
hasy = true;
|
||||||
|
} else if(lpddoi->guidType == GUID_ZAxis){
|
||||||
hasz = true;
|
hasz = true;
|
||||||
} else if (lpddoi->guidType == GUID_POV){
|
} else if (lpddoi->guidType == GUID_POV){
|
||||||
haspov = true;
|
haspov = true;
|
||||||
|
} else if (lpddoi->guidType == GUID_Slider){
|
||||||
|
hasslider = true;
|
||||||
|
#if _DEBUG
|
||||||
} else {
|
} else {
|
||||||
#ifdef _DEBUG
|
|
||||||
printf("Unhandled object found: %s\n", lpddoi->tszName);
|
printf("Unhandled object found: %s\n", lpddoi->tszName);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -254,6 +286,9 @@ void CreateController(LPCDIDEVICEINSTANCE lpddi) {
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
hr = lpDI->CreateDevice(lpddi->guidInstance, (LPDIRECTINPUTDEVICE*) &lpDIDevice, NULL);
|
hr = lpDI->CreateDevice(lpddi->guidInstance, (LPDIRECTINPUTDEVICE*) &lpDIDevice, NULL);
|
||||||
if FAILED(hr) {
|
if FAILED(hr) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("CreateDevice failed\n");
|
||||||
|
#endif
|
||||||
create_success = false;
|
create_success = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -266,12 +301,18 @@ void CreateController(LPCDIDEVICEINSTANCE lpddi) {
|
||||||
void SetupController() {
|
void SetupController() {
|
||||||
// set Controller data format
|
// set Controller data format
|
||||||
if(lpDIDevice->SetDataFormat(&c_dfDIJoystick2) != DI_OK) {
|
if(lpDIDevice->SetDataFormat(&c_dfDIJoystick2) != DI_OK) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("SetDataFormat failed\n");
|
||||||
|
#endif
|
||||||
create_success = false;
|
create_success = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the cooperative level
|
// set the cooperative level
|
||||||
if(lpDIDevice->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND) != DI_OK) {
|
if(lpDIDevice->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND) != DI_OK) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("SetCooperativeLevel failed\n");
|
||||||
|
#endif
|
||||||
create_success = false;
|
create_success = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -286,30 +327,56 @@ void SetupController() {
|
||||||
diprg.lMin = AXISMIN;
|
diprg.lMin = AXISMIN;
|
||||||
diprg.lMax = AXISMAX;
|
diprg.lMax = AXISMAX;
|
||||||
|
|
||||||
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) {
|
if(hasx) {
|
||||||
create_success = false;
|
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) {
|
||||||
return;
|
#if _DEBUG
|
||||||
|
printf("SetProperty(DIJOFS_X) failed\n");
|
||||||
|
#endif
|
||||||
|
create_success = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// And again for Y-axis range
|
// And again for Y-axis range
|
||||||
//
|
//
|
||||||
diprg.diph.dwObj = DIJOFS_Y;
|
if(hasy) {
|
||||||
|
diprg.diph.dwObj = DIJOFS_Y;
|
||||||
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK)
|
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) {
|
||||||
{
|
#if _DEBUG
|
||||||
create_success = false;
|
printf("SetProperty(DIJOFS_Y) failed\n");
|
||||||
return;
|
#endif
|
||||||
|
create_success = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// And again for z-axis range (throttle)
|
// And again for Z-axis range
|
||||||
//
|
//
|
||||||
diprg.diph.dwObj = DIJOFS_Z;
|
if(hasz) {
|
||||||
|
diprg.diph.dwObj = DIJOFS_Z;
|
||||||
|
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("SetProperty(DIJOFS_Z) failed\n");
|
||||||
|
#endif
|
||||||
|
create_success = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) {
|
//
|
||||||
create_success = false;
|
// Lastly slider
|
||||||
return;
|
//
|
||||||
|
if(hasslider) {
|
||||||
|
diprg.diph.dwObj = DIJOFS_Z;
|
||||||
|
if(lpDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK) {
|
||||||
|
#if _DEBUG
|
||||||
|
printf("SetProperty(DIJOFS_Z(SLIDER)) failed\n");
|
||||||
|
#endif
|
||||||
|
create_success = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
create_success = true;
|
create_success = true;
|
||||||
}
|
}
|
||||||
|
@ -338,15 +405,21 @@ void UpdateFields() {
|
||||||
if(hRes == DIERR_INPUTLOST) {
|
if(hRes == DIERR_INPUTLOST) {
|
||||||
lpDIDevice->Acquire();
|
lpDIDevice->Acquire();
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
printf("DIERR_INPUTLOST, reaquiring input\n");
|
printf("DIERR_INPUTLOST, reaquiring input : create_success=%d\n", create_success);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//axis's
|
//axis's
|
||||||
environment->SetStaticIntField(clsController, fidX, js.lX);
|
if(hasx) {
|
||||||
environment->SetStaticIntField(clsController, fidY, js.lY);
|
environment->SetStaticIntField(clsController, fidX, js.lX);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hasy) {
|
||||||
|
environment->SetStaticIntField(clsController, fidY, js.lY);
|
||||||
|
}
|
||||||
|
|
||||||
if(hasz) {
|
if(hasz) {
|
||||||
environment->SetStaticIntField(clsController, fidZ, js.lZ);
|
environment->SetStaticIntField(clsController, fidZ, js.lZ);
|
||||||
}
|
}
|
||||||
|
@ -361,6 +434,11 @@ void UpdateFields() {
|
||||||
if(haspov) {
|
if(haspov) {
|
||||||
environment->SetStaticIntField(clsController, fidPOV, js.rgdwPOV[0]);
|
environment->SetStaticIntField(clsController, fidPOV, js.rgdwPOV[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//slider
|
||||||
|
if(hasslider) {
|
||||||
|
environment->SetStaticIntField(clsController, fidSlider, js.lZ);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -370,11 +448,16 @@ void SetCapabilities() {
|
||||||
//set buttoncount
|
//set buttoncount
|
||||||
environment->SetStaticIntField(clsController, fidButtonCount, buttoncount);
|
environment->SetStaticIntField(clsController, fidButtonCount, buttoncount);
|
||||||
|
|
||||||
//set z axis
|
//set axis
|
||||||
|
environment->SetStaticIntField(clsController, fidHasXAxis, hasx);
|
||||||
|
environment->SetStaticIntField(clsController, fidHasYAxis, hasy);
|
||||||
environment->SetStaticIntField(clsController, fidHasZAxis, hasz);
|
environment->SetStaticIntField(clsController, fidHasZAxis, hasz);
|
||||||
|
|
||||||
//set pov
|
//set pov
|
||||||
environment->SetStaticIntField(clsController, fidHasPOV, haspov);
|
environment->SetStaticIntField(clsController, fidHasPOV, haspov);
|
||||||
|
|
||||||
|
//set slider
|
||||||
|
environment->SetStaticIntField(clsController, fidHasSlider, hasslider);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -382,11 +465,15 @@ void SetCapabilities() {
|
||||||
*/
|
*/
|
||||||
void CacheFields() {
|
void CacheFields() {
|
||||||
fidButtonCount = environment->GetStaticFieldID(clsController, "buttonCount", "I");
|
fidButtonCount = environment->GetStaticFieldID(clsController, "buttonCount", "I");
|
||||||
|
fidHasXAxis = environment->GetStaticFieldID(clsController, "hasXAxis", "Z");
|
||||||
|
fidHasYAxis = environment->GetStaticFieldID(clsController, "hasYAxis", "Z");
|
||||||
fidHasZAxis = environment->GetStaticFieldID(clsController, "hasZAxis", "Z");
|
fidHasZAxis = environment->GetStaticFieldID(clsController, "hasZAxis", "Z");
|
||||||
fidHasPOV = environment->GetStaticFieldID(clsController, "hasPOV", "Z");
|
fidHasPOV = environment->GetStaticFieldID(clsController, "hasPOV", "Z");
|
||||||
|
fidHasSlider = environment->GetStaticFieldID(clsController, "hasSlider", "Z");
|
||||||
fidButtons = environment->GetStaticFieldID(clsController, "buttons", "[Z");
|
fidButtons = environment->GetStaticFieldID(clsController, "buttons", "[Z");
|
||||||
fidX = environment->GetStaticFieldID(clsController, "x", "I");
|
fidX = environment->GetStaticFieldID(clsController, "x", "I");
|
||||||
fidY = environment->GetStaticFieldID(clsController, "y", "I");
|
fidY = environment->GetStaticFieldID(clsController, "y", "I");
|
||||||
fidZ = environment->GetStaticFieldID(clsController, "z", "I");
|
fidZ = environment->GetStaticFieldID(clsController, "z", "I");
|
||||||
fidPOV = environment->GetStaticFieldID(clsController, "pov", "I");
|
fidPOV = environment->GetStaticFieldID(clsController, "pov", "I");
|
||||||
|
fidSlider = environment->GetStaticFieldID(clsController, "slider", "I");
|
||||||
}
|
}
|
Loading…
Reference in New Issue