How to read values from a USB joystick?

Started by paul johansen, September 15, 2009, 12:30:12 PM

Previous topic - Next topic

paul johansen

Hi!

I wonder how I can read the three axes and buttons from a USB joystick? I think this is pretty simple!?

TechSupport

I have no idea how to do something like this...... maybe you would get more help for a question like this via the PowerBASIC user forums.

:)

jthompson

You'll have to make your own form, add some labels, and change the form and label handles, but this should get you started.  It is very easy.

This was the code I played with while learning it.  It should show the functions, just adjust everything else to make it work for you.

WM_CREATE

JOYSETCAPTURE hWndForm, %JOYSTICKID1, 0, %FALSE '%TRUE
'JOYSETTHRESHOLD %JOYSTICKID1, 65535


CUSTOM

LOCAL X AS SINGLE, Y AS SINGLE, Z AS SINGLE

LOCAL xxMin AS LONG, xxMed AS LONG, xxMax AS LONG
LOCAL yyMin AS LONG, yyMed AS LONG, yyMax AS LONG
LOCAL xx AS LONG, yy AS LONG

xxMin = 0 : xxMed = FIX(xxMax/2) : xxMax = 65535
yyMin = 0 : yyMed = FIX(yyMax/2) : yyMax = 65535

xx = ROUND((X/65535*10),2)-5

SELECT CASE wMsg

        CASE %MM_JOY1MOVE

            FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLX, STR$(LOWRD(lParam)))
            FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLY, STR$(HIWRD(lParam)))
           
'100: lParam/32767, -1, *100
X = ((LOWRD(lParam)/32767)-1)*100
Y = ((ABS(HIWRD(lParam)-65535)/32767)-1)*100

FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLXX, STR$(ROUND((LOWRD(lParam)/65535*10),2)-5))
FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLYY, STR$(ROUND((HIWRD(lParam)/65535*10),2)-5))

        CASE %MM_JOY1ZMOVE
       
FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLZ, STR$(lParam))
       
'100:
Z = (ABS(lParam-65535)/65535)*100
'Z = ROUND((ABS(lParam-65535)/65535)*5,2)
FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLZZ, FORMAT$( Z ,"#.##"))

        CASE %MM_JOY1BUTTONDOWN
            IF (wParam AND %JOY_BUTTON1CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN1, "X")
            IF (wParam AND %JOY_BUTTON2CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN2, "X")
            IF (wParam AND %JOY_BUTTON3CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN3, "X")
IF (wParam AND %JOY_BUTTON4CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN4, "X")
                                           
        CASE %MM_JOY1BUTTONUP
            IF (wParam AND %JOY_BUTTON1CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN1, "")
            IF (wParam AND %JOY_BUTTON2CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN2, "")
            IF (wParam AND %JOY_BUTTON3CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN3, "")
IF (wParam AND %JOY_BUTTON4CHG) THEN FF_CONTROL_SETTEXT (HWND_FRMJOYSTICK_LBLBTN4, "")
           
        CASE %WM_DESTROY

            'Stop forwarding the joystick's messages.
            JOYRELEASECAPTURE %JOYSTICKID1

      END SELECT


Anywhere (btnJoystickInfo, for example)

DIM MyJoyCaps AS JOYCAPS
JOYGETDEVCAPS %JOYSTICKID1, MyJoyCaps, SIZEOF(MyJoyCaps)
MSGBOX STR$(MyJoyCaps.wMid),,"Manufacturer ID"
MSGBOX STR$(MyJoyCaps.wPid),,"Product ID"
MSGBOX MyJoyCaps.szPname,,"Product Name"
MSGBOX STR$(MyJoyCaps.wXmin),,"X Min"
MSGBOX STR$(MyJoyCaps.wXmax),,"X Max"
MSGBOX STR$(MyJoyCaps.wYmin),,"Y Min"
MSGBOX STR$(MyJoyCaps.wYmax),,"Y Max"
MSGBOX STR$(MyJoyCaps.wZmin),,"Z Min"
MSGBOX STR$(MyJoyCaps.wZmax),,"Z Max"
MSGBOX STR$(MyJoyCaps.wNumButtons),,"Number of Buttons"