Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 688
  • Last Modified:

does this code for XInput look correct?

I'm trying to get an XBOX 360 controller to work with a small game engine which has certain requirements for what the function can return and the parameters it can take. Therefore, the below code has to return *char.

No matter what I seem to do, I get a report in from the game engine which says that the controller is disconnected. Worse, I always get "160" back from this:

DWORD Result = XInputGetState(controllerNum, &controllerState);

Does anything look obviously wrong in the code below?

The correct controller drivers are installed, and the controllers work fine with other programs.

extern "C" R_CONTROLLER_API char *GetButtonPress(int n,char *v[])
{
   static char buf[500];
   *buf=0;
   ostringstream SS;
   XINPUT_STATE controllerState;
   DWORD dwResult;
   ZeroMemory(&controllerState, sizeof(XINPUT_STATE));
   int controllerNum = *(int *)v;
      
   
   if( (controllerState.Gamepad.sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && 
     controllerState.Gamepad.sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) && 
    (controllerState.Gamepad.sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && 
     controllerState.Gamepad.sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) )
    {	
        controllerState.Gamepad.sThumbLX = 0;
        controllerState.Gamepad.sThumbLY = 0;
    }
 
    if( (controllerState.Gamepad.sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && 
     controllerState.Gamepad.sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) && 
    (controllerState.Gamepad.sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && 
    controllerState.Gamepad.sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) ) 
    {
        controllerState.Gamepad.sThumbRX = 0;
        controllerState.Gamepad.sThumbRY = 0;
    }
   dwResult = XInputGetState(controllerNum, &controllerState);
 
/* For debugging, this snippet never finds any of the key presses
   if((XINPUT_GAMEPAD_A & dwResult)==XINPUT_GAMEPAD_A)
	Log2File("A");
   if((XINPUT_GAMEPAD_B & dwResult)==XINPUT_GAMEPAD_B)
	Log2File("B");
   if((XINPUT_GAMEPAD_X & dwResult)==XINPUT_GAMEPAD_X)
	Log2File("X");
   if((XINPUT_GAMEPAD_Y & dwResult)==XINPUT_GAMEPAD_Y)
	Log2File("Y");
*/
 
 
   SS << dwResult;
   strcat(buf,SS.str().c_str());
   Log2File(buf);
   return buf;
  
}
 
 
 
 
extern "C" __declspec(dllexport) char *IsConnected(int n,char *v[])
{
    XINPUT_STATE controllerState;
    int controllerNum = *(int *)v;
	ZeroMemory(&controllerState, sizeof(XINPUT_STATE)); 
 
    // Get the state
    DWORD Result = XInputGetState(controllerNum, &controllerState);
 
    if(Result == ERROR_SUCCESS)
    {
        return "true"; 
    }
    else
    {
        return "false";
    }
}

Open in new window

0
WriterOfCode
Asked:
WriterOfCode
  • 3
  • 2
1 Solution
 
jgordosCommented:
No, it doesn't.

Couple of questions...

This looks intentional, but I'm not sure if it's really what you meant to do, so I'll ask...

The routines you supplied both take two parameters: n and v
n is an integer
v is an array of char pointers...

You're doing this all over the place...

int controllerNum = *(int *)v;

But you never use 'n' that's supplied to the routine.  Is that really what you want?

Also, the routine always (ALWAYS) returns either ERROR_SUCCESS, ERROR_DEVICE_NOT_CONNECTED, or some error value.  The actual STATE of the buttons is not in the return code... it's in the data structure you passed in, so your code for button presses isn't correct.

In other words, you need to test for button A something like this....

if( ( controllerState.wButtons & XINPUT_GAMEPAD_A  ) == true )
{
// do something very profound here.
}

-john


0
 
WriterOfCodeAuthor Commented:
Well there seems to be more to it, because
 if( ( controllerState.wButtons & XINPUT_GAMEPAD_A  ) == true

or any of its equivalents, doesn't register with the wired controllers. That said, microsoft just released an update for the xbox 360 controllers on windows, so hopefully that'll help.
0
 
jgordosCommented:
Yeah, I think there is more to it.

I don't think you're calculating the controller number correctly..

-j
0
 
WriterOfCodeAuthor Commented:
Well, I'll accept your first answer as correct because I wouldn't believe it myself hadn't I tested it.

Apparently, XInputGetState(controllerNum, &controllerState); needs to precede a Sleep() type function because it takes a while to initialize. *sigh*

I also added a while loop to monitor the if statements until something is pressed.
0
 
WriterOfCodeAuthor Commented:
It was a good answer, it was also helpful in terms of understanding how some bits of the code worked. However, the true solution I stumbled across my self, because it was so inane.
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now