; German forum: http://www.purebasic.fr/german/viewtopic.php?t=10149&postdays=0&postorder=asc&start=60
; Author: GPI (updated for PB 4.00 by hardfalcon)
; Date: 02. February 2003
; OS: Windows
; Demo: No


;*** 
;*** Joytest 
;*** 
;*** GPI 02.02.2003 
;*** 

;Create_str (adr, an)  Rückgabe eines Strings in Speicher 
;                      bis man auf 0 trifft, maximal an Zeichen. 
Procedure.s create_str(adr.l,an) 
  a$="" 
  Repeat 
    a=PeekB(adr):adr+1:an-1 
    If a>0 
      a$+Chr(a) 
    EndIf 
  Until a=0 Or an=0 
  ProcedureReturn a$ 
EndProcedure 

;*** 
;-   Einige Struckturen 
;*** 
Structure joy_caps ; structure joycaps is too short! 
  wMid.w 
  wPid.w 
  szPname.b[#MAXPNAMELEN] 
  wXmin.l 
  wXmax.l 
  wYmin.l 
  wYmax.l 
  wZmin.l 
  wZmax.l 
  wNumButtons.l 
  wPeriodMin.l 
  wPeriodMax.l 
  wRmin.l 
  wRmax.l 
  wUmin.l 
  wUmax.l 
  wVmin.l 
  wVmax.l 
  wCaps.l 
  wMaxAxes.l 
  wNumAxes.l 
  wMaxButtons.l 
  szRegKey.b[#MAXPNAMELEN] 
  szOEMVxD.b[#MAX_JOYSTICKOEMVXDNAME] 
EndStructure 

Structure joy_infoex ; sizeof(JOYINFOEX) does not work! 
  size.l 
  flags.l 
  xpos.l 
  ypos.l 
  zpos.l 
  rpos.l 
  upos.l 
  vpos.l 
  buttons.l 
  buttonNumber.l 
  pov.l 
  reserved1.l 
  reserved2.l 
EndStructure 

;*** 
;-   Konstanten 
;*** 

#JOYCAPS_HASZ=1 
#JOYCAPS_HASR=2 
#JOYCAPS_HASU=4 
#JOYCAPS_HASV=8 
#JOYCAPS_HASPOV=16 
#JOYCAPS_POV4DIR=32 
#JOYCAPS_POVCTS=64 

;*** 
;-   main 
;*** 

;anzahl der JOYSTICK bestimmen 
If OpenWindow(0, 0,0, 500,500, "JOYSTICKtest", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
  If CreateGadgetList(WindowID(0)) 
     ;TreeGadget(0, 10, 10, 480,380, #PB_Tree_AlwaysShowSelection | #PB_Tree_NoButtons) 
     TreeGadget(0, 10, 10, 480,380) 
      
     ComboBoxGadget(1, 10, 400, 480, 100) 
     TextGadget(2,  10,425, 150,20,"X:",#PB_Text_Border ) 
     TextGadget(3, 170,425, 150,20,"Y:",#PB_Text_Border ) 
     TextGadget(4, 330,425, 150,20,"Z:",#PB_Text_Border ) 
     TextGadget(5,  10,450, 150,20,"R:",#PB_Text_Border ) 
     TextGadget(6, 170,450, 150,20,"U:",#PB_Text_Border ) 
     TextGadget(7, 330,450, 150,20,"V:",#PB_Text_Border ) 
     TextGadget(8,  10,475, 150,20,"POV:",#PB_Text_Border ) 
     TextGadget(9, 170,475, 310,20,"Buttons:",#PB_Text_Border ) 
     ;TextGadget(10,330,475, 150,20,"ButtonNr:",#PB_Text_Border ) 
                      
     joy_an=joyGetNumDevs_() 
      
     AddGadgetItem(0,-1,"Info") 
       AddGadgetItem(0,-1,"Number of JOYSTICKs:"+Str(joy_an)+" (i had only one, but API says that i have 16 ;)",0,1) 
       AddGadgetItem(0,-1,"JOYSTICKtest by GPI!",0,1) 
     SetGadgetItemState(0, 0, #PB_Tree_Expanded) 
      
;AddGadgetItem(0,-1,,0,1) 
      
Define.joy_caps joy_info 

     For i=0 To joy_an 
       ret=joyGetDevCaps_(i,@joy_info.joy_caps,SizeOf(joy_caps)) 
       If ret 
         AddGadgetItem(1, -1, "JOYSTICK "+Str(i)+ " (not present)") 
         AddGadgetItem(0,-1,"JOYSTICK "+Str(i)) 
           AddGadgetItem(0,-1,"not present",0,1) 
       Else 
         AddGadgetItem(1, -1, "JOYSTICK "+Str(i)) 
         AddGadgetItem(0,-1,"JOYSTICK "+Str(i)) 
         StartNode = CountGadgetItems(0)-1 
           AddGadgetItem(0,-1,"Driver Information",0,1) 
             AddGadgetItem(0,-1,"JOYSTICK produkt name:"+create_str (@joy_info\szpname[0],#MAXPNAMELEN),0,2) 
             AddGadgetItem(0,-1,"Manufacture and Product identifier:"+Str(joy_info\wmid)+" / "+Str(joy_info\wpid),0,2) 
             AddGadgetItem(0,-1,"registry key:"+create_str (@joy_info\szregkey[0],#MAXPNAMELEN),0,2) 
             AddGadgetItem(0,-1,"driver oem:"+create_str (@joy_info\szoemvxd[0],#MAXPNAMELEN),0,2) 
           AddGadgetItem(0,-1,"Axis",0,1) 
             AddGadgetItem(0,-1,"Number of axes supported:"+Str(joy_info\wmaxaxes),0,2) 
             AddGadgetItem(0,-1,"Number of axes in use:"+Str(joy_info\wnumaxes),0,2) 
             AddGadgetItem(0,-1,"X-Axis:"+Str(joy_info\wxmin)+" to "+Str(joy_info\wxmax),0,2) 
             AddGadgetItem(0,-1,"Y-Axis:"+Str(joy_info\wymin)+" to "+Str(joy_info\wymax),0,2) 
             If joy_info\wcaps & #JOYCAPS_HASZ 
               AddGadgetItem(0,-1,"Z-Axis:"+Str(joy_info\wzmin)+" to "+Str(joy_info\wzmax),0,2) 
             EndIf 
             If joy_info\wcaps & #JOYCAPS_HASR 
               AddGadgetItem(0,-1,"R-Axis:"+Str(joy_info\wrmin)+" to "+Str(joy_info\wrmax),0,2) 
             EndIf 
             If joy_info\wcaps & #JOYCAPS_HASU 
               AddGadgetItem(0,-1,"U-Axis:"+Str(joy_info\wumin)+" to "+Str(joy_info\wumax),0,2) 
             EndIf 
             If joy_info\wcaps & #JOYCAPS_HASV 
               AddGadgetItem(0,-1,"V-Axis:"+Str(joy_info\wvmin)+" to "+Str(joy_info\wvmax),0,2) 
             EndIf 
           If joy_info\wcaps & #JOYCAPS_HASPOV 
             AddGadgetItem(0,-1,"POV (point-of-view)",0,1) 
             If joy_info\wcaps & #JOYCAPS_POV4DIR 
               AddGadgetItem(0,-1,"Support of discrete values (centered,forward,backward,left,right)",0,2) 
             EndIf 
             If joy_info\wcaps & #JOYCAPS_POVCTS 
               AddGadgetItem(0,-1,"Support of continuous degree bearings",0,2) 
             EndIf 
           EndIf 
           AddGadgetItem(0,-1,"Buttons",0,1) 
             AddGadgetItem(0,-1,"Supported buttons:"+Str(joy_info\wmaxbuttons),0,2) 
             AddGadgetItem(0,-1,"Number of buttons:"+Str(joy_info\wNumButtons),0,2) 
           AddGadgetItem(0,-1,"Additional Information",0,1) 
             AddGadgetItem(0,-1,"Polling Frequency:"+Str(joy_info\wperiodmin)+" to "+Str(joy_info\wperiodmax),0,2) 
         For k = StartNode To CountGadgetItems(0)-1 
           SetGadgetItemState(0, k, #PB_Tree_Expanded) 
         Next k 
       EndIf 
     Next i 
      
     SetGadgetState(1,0) 

      
     ;For i=0 To CountGadgetItems(0) 
     ;  SetGadgetItemState(0, i, #PB_Tree_Expanded) 
     ;Next 
      
      
      
     joy_status.joy_infoex 
     joy_status\size=SizeOf(JOY_INFOEX) 
     joy_status\flags=#JOY_RETURNALL 
     Repeat 
       Event = WindowEvent() 
       joy=GetGadgetState(1) 
       If joy >=0 
         ret=joyGetPosEx_(joy,@joy_status) 
         If ret=0 
           SetGadgetText(2,"X:"+Str(joy_status\xpos)) 
           SetGadgetText(3,"Y:"+Str(joy_status\ypos)) 
           SetGadgetText(4,"Z:"+Str(joy_status\zpos)) 
           SetGadgetText(5,"R:"+Str(joy_status\rpos)) 
           SetGadgetText(6,"U:"+Str(joy_status\upos)) 
           SetGadgetText(7,"V:"+Str(joy_status\vpos)) 
           a$=Hex(joy_status\pov): While Len(a$)<4: a$="0"+a$: Wend 
           SetGadgetText(8,"POV:$"+a$+":"+Str(joy_status\pov)) 
           a$=Bin(joy_status\buttons): While Len(a$)<32: a$="0"+a$: Wend 
           SetGadgetText(9,"Buttons (bin):"+a$+":"+Str(joy_status\buttons)) 
         Else 
           SetGadgetText(2,"ERROR!"):SetGadgetText(3,"ERROR!"):SetGadgetText(4,"ERROR!") 
           SetGadgetText(5,"ERROR!"):SetGadgetText(6,"ERROR!"):SetGadgetText(7,"ERROR!") 
           SetGadgetText(8,"ERROR!"):SetGadgetText(9,"ERROR!") 
         EndIf 
         Delay(10) 
       EndIf 
     Until Event = #PB_Event_CloseWindow 

  EndIf 
EndIf 

End

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -