1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxJoystick class 
   4 // Author:      Ported to Linux by Guilhem Lavaux 
   8 // Copyright:   (c) Guilhem Lavaux 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "joystick.h" 
  20 #include "wx/joystick.h" 
  22 #include <linux/joystick.h> 
  23 #include <sys/types.h> 
  26 #include <sys/ioctl.h> 
  31 #include "wx/window.h" 
  33 #define JOYSTICK_AXE_MAX 32767 
  34 #define JOYSTICK_AXE_MIN -32767 
  36 IMPLEMENT_DYNAMIC_CLASS(wxJoystick
, wxObject
) 
  38 wxJoystick::wxJoystick(int joystick
) 
  41   // Assume it's the same device name on all Linux systems ... 
  42   dev_name
.Printf("/dev/js%d", (joystick 
== wxJOYSTICK1
) ? 0 : 1); 
  44   m_joystick 
= open(dev_name
, O_RDWR
); 
  45   m_lastposition 
= wxPoint(-1, -1); 
  46   for (int i
=0;i
<15;i
++) 
  52 //////////////////////////////////////////////////////////////////////////// 
  54 //////////////////////////////////////////////////////////////////////////// 
  55 void *wxJoystick::Entry(void) 
  57   struct js_event j_evt
; 
  58   wxJoystickEvent jwx_event
; 
  60   struct timeval time_out 
= {0, 0}; 
  67       FD_SET(m_joystick
, &read_fds
); 
  68       select(m_joystick
+1, &read_fds
, NULL
, NULL
, &time_out
); 
  69       if (FD_ISSET(m_joystick
, &read_fds
)) 
  70         read(m_joystick
, &j_evt
, sizeof(j_evt
)); 
  74       read(m_joystick
, &j_evt
, sizeof(j_evt
)); 
  77     if ((j_evt
.type 
& JS_EVENT_AXIS
) == JS_EVENT_AXIS
) { 
  78       switch (j_evt
.number
) { 
  80         m_lastposition
.x 
= j_evt
.value
; 
  81         jwx_event
.SetEventType(wxEVT_JOY_MOVE
); 
  84         m_lastposition
.y 
= j_evt
.value
; 
  85         jwx_event
.SetEventType(wxEVT_JOY_MOVE
); 
  88         m_axe
[3] = j_evt
.value
; 
  89         jwx_event
.SetEventType(wxEVT_JOY_ZMOVE
); 
  92         m_axe
[j_evt
.number
] = j_evt
.value
; 
  93         jwx_event
.SetEventType(wxEVT_JOY_MOVE
); 
  96       jwx_event
.SetPosition(m_lastposition
); 
  97       jwx_event
.SetZPosition(m_axe
[3]); 
  99     if ((j_evt
.type 
& JS_EVENT_BUTTON
) == JS_EVENT_BUTTON
) { 
 100       register int mask 
= 1 << j_evt
.number
; 
 101       char button 
= m_buttons 
& mask
; 
 105         jwx_event
.SetEventType(wxEVT_JOY_BUTTON_UP
); 
 107         jwx_event
.SetEventType(wxEVT_JOY_BUTTON_DOWN
); 
 111       jwx_event
.SetButtonState(m_buttons
); 
 112       jwx_event
.SetButtonChange(j_evt
.number
); 
 116     m_catchwin
->ProcessEvent(jwx_event
); 
 118     usleep(m_polling
*1000); 
 121 //////////////////////////////////////////////////////////////////////////// 
 123 //////////////////////////////////////////////////////////////////////////// 
 125 wxPoint 
wxJoystick::GetPosition(void) const 
 127   return m_lastposition
; 
 130 int wxJoystick::GetZPosition(void) const 
 135 int wxJoystick::GetButtonState(void) const 
 140 int wxJoystick::GetPOVPosition(void) const 
 145 int wxJoystick::GetPOVCTSPosition(void) const 
 150 int wxJoystick::GetRudderPosition(void) const 
 155 int wxJoystick::GetUPosition(void) const 
 160 int wxJoystick::GetVPosition(void) const 
 165 int wxJoystick::GetMovementThreshold(void) const 
 170 void wxJoystick::SetMovementThreshold(int threshold
) 
 174 //////////////////////////////////////////////////////////////////////////// 
 176 //////////////////////////////////////////////////////////////////////////// 
 178 bool wxJoystick::IsOk(void) const 
 180   return (m_joystick 
!= -1); 
 183 int wxJoystick::GetNumberJoysticks(void) const 
 189     dev_name
.Printf("/dev/js%d", j
); 
 190     fd 
= open(dev_name
, O_RDONLY
); 
 198 int wxJoystick::GetManufacturerId(void) const 
 203 int wxJoystick::GetProductId(void) const 
 208 wxString 
wxJoystick::GetProductName(void) const 
 213 int wxJoystick::GetXMin(void) const 
 215   return JOYSTICK_AXE_MAX
; 
 218 int wxJoystick::GetYMin(void) const 
 220   return JOYSTICK_AXE_MAX
; 
 223 int wxJoystick::GetZMin(void) const 
 225   return JOYSTICK_AXE_MAX
; 
 228 int wxJoystick::GetXMax(void) const 
 230   return JOYSTICK_AXE_MAX
; 
 233 int wxJoystick::GetYMax(void) const 
 235   return JOYSTICK_AXE_MAX
; 
 238 int wxJoystick::GetZMax(void) const 
 240   return JOYSTICK_AXE_MAX
; 
 243 int wxJoystick::GetNumberButtons(void) const 
 247   ioctl(m_joystick
, JSIOCGBUTTONS
, &nb
); 
 252 int wxJoystick::GetNumberAxes(void) const 
 256   ioctl(m_joystick
, JSIOCGAXES
, &nb
); 
 261 int wxJoystick::GetMaxButtons(void) const 
 263   return 15; // internal 
 266 int wxJoystick::GetMaxAxes(void) const 
 268   return 15; // internal 
 271 int wxJoystick::GetPollingMin(void) const 
 276 int wxJoystick::GetPollingMax(void) const 
 281 int wxJoystick::GetRudderMin(void) const 
 283   return JOYSTICK_AXE_MIN
; 
 286 int wxJoystick::GetRudderMax(void) const 
 288   return JOYSTICK_AXE_MAX
; 
 291 int wxJoystick::GetUMin(void) const 
 293   return JOYSTICK_AXE_MIN
; 
 296 int wxJoystick::GetUMax(void) const 
 298   return JOYSTICK_AXE_MAX
; 
 301 int wxJoystick::GetVMin(void) const 
 303   return JOYSTICK_AXE_MIN
; 
 306 int wxJoystick::GetVMax(void) const 
 308   return JOYSTICK_AXE_MAX
; 
 311 bool wxJoystick::HasRudder(void) const 
 313   return GetNumberAxes() >= 4; 
 316 bool wxJoystick::HasZ(void) const 
 318   return GetNumberAxes() >= 3; 
 321 bool wxJoystick::HasU(void) const 
 323   return GetNumberAxes() >= 5; 
 326 bool wxJoystick::HasV(void) const 
 328   return GetNumberAxes() >= 6; 
 331 bool wxJoystick::HasPOV(void) const 
 336 bool wxJoystick::HasPOV4Dir(void) const 
 341 bool wxJoystick::HasPOVCTS(void) const 
 346 //////////////////////////////////////////////////////////////////////////// 
 348 //////////////////////////////////////////////////////////////////////////// 
 350 bool wxJoystick::SetCapture(wxWindow
* win
, int pollingFreq 
= 0) 
 353   m_polling 
= pollingFreq
; 
 357 bool wxJoystick::ReleaseCapture(void) 
 363 #endif  // wxUSE_JOYSTICK