multiple fixes to wxJoystick under Unix and new index-based API for accessing joystic...
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 16 Mar 2007 00:51:43 +0000 (00:51 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 16 Mar 2007 00:51:43 +0000 (00:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44843 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/joystick.tex
include/wx/mac/carbon/joystick.h
include/wx/mac/corefoundation/joystick.h
include/wx/msw/joystick.h
include/wx/palmos/joystick.h
include/wx/unix/joystick.h
src/mac/carbon/joystick.cpp
src/msw/joystick.cpp
src/palmos/joystick.cpp
src/unix/joystick.cpp

index 7e644bdaca608e95946d4336fbe198c975460cbf..5546f5cc0eebc9b17c188717309981f42ba36af2 100644 (file)
@@ -39,6 +39,7 @@ All:
 - Fixed crashes in helpview when opening a file.
 - Added wxMutex::LockTimeout() (Aleksandr Napylov)
 - Set locale to the default in all ports, not just wxGTK
+- Added wxJoystick::GetButtonState/Position() (Frank C Szczerba)
 - Added wxGridUpdateLocker helper class (Evgeniy Tarassov)
 - Support wxGRID_AUTOSIZE in wxGrid::SetRow/ColLabelSize() (Evgeniy Tarassov)
 
index 155b2f05fbff0ada13efab70ac6aabeabef1117e..1f934e699312d8b5fffabd56f1a746aae520d9f8 100644 (file)
@@ -39,6 +39,14 @@ significant bit, and so on.
 A bitlist of wxJOY\_BUTTONn identifiers, where n is 1, 2, 3 or 4 
 is available for historical reasons.
 
+\constfunc{bool}{GetButtonState}{\param{unsigned}{ id}}
+
+Returns the state of the specified joystick button.
+
+\wxheading{Parameters}
+
+\docparam{id}{The button id to report, from 0 to \helpref{GetNumberButtons()}{wxjoystickgetnumberbuttons} - 1}
+
 \membersection{wxJoystick::GetManufacturerId}\label{wxjoystickgetmanufacturerid}
 
 \constfunc{int}{GetManufacturerId}{\void}
@@ -100,6 +108,14 @@ Returns the product name for the joystick.
 
 Returns the x, y position of the joystick.
 
+\constfunc{int}{GetPosition}{\param{unsigned}{ axis}}
+
+Returns the position of the specified joystick axis.
+
+\wxheading{Parameters}
+
+\docparam{axis}{The joystick axis to report, from 0 to \helpref{GetNumberAxes()}{wxjoystickgetnumberaxes} - 1.}
+
 \membersection{wxJoystick::GetPOVPosition}\label{wxjoystickgetpovposition}
 
 \constfunc{int}{GetPOVPosition}{\void}
index dce79f8a374f7c5f7d2bb407b883a2920534851e..2aabceb8c3330e3c0c1727bec24b2e53f3df5c69 100644 (file)
@@ -28,6 +28,8 @@ class WXDLLEXPORT wxJoystick: public wxObject
   ////////////////////////////////////////////////////////////////////////////
 
   wxPoint GetPosition() const;
+  int GetPosition(unsigned axis) const;
+  bool GetButtonState(unsigned button) const;
   int GetZPosition() const;
   int GetButtonState() const;
   int GetPOVPosition() const;
index 13024b27313c3e07f1063596428cda646e7fc704..99f23c37f9f9c2d552cb46c09f6ff8ceac5f2b0b 100644 (file)
@@ -28,6 +28,8 @@ class WXDLLEXPORT wxJoystick: public wxObject
     ////////////////////////////////////////////////////////////////////////////
 
     wxPoint GetPosition() const;
+    int GetPosition(unsigned axis) const;
+    bool GetButtonState(unsigned button) const;
     int GetZPosition() const;
     int GetButtonState() const;
     int GetPOVPosition() const;
index db039ee2fff97ce9532b9b17a53089471bd6a563..7a655137a917c4d7348bbad69a16fdaf7a32dd99 100644 (file)
@@ -28,6 +28,8 @@ class WXDLLIMPEXP_ADV wxJoystick: public wxObject
   ////////////////////////////////////////////////////////////////////////////
 
   wxPoint GetPosition(void) const;
+  int GetPosition(unsigned axis) const;
+  bool GetButtonState(unsigned button) const;
   int GetZPosition(void) const;
   int GetButtonState(void) const;
   int GetPOVPosition(void) const;
index 57fcc7db236003e4b49333e5dce6bf3181658b67..d5f425761dbb9dff325a710cf0ef4954908e05c7 100644 (file)
@@ -28,6 +28,8 @@ class WXDLLIMPEXP_ADV wxJoystick: public wxObject
   ////////////////////////////////////////////////////////////////////////////
 
   wxPoint GetPosition(void) const;
+  int GetPosition(unsigned axis) const;
+  bool GetButtonState(unsigned button) const;
   int GetZPosition(void) const;
   int GetButtonState(void) const;
   int GetPOVPosition(void) const;
index 4ff41f134e890d5ac8c4e2bdc68d11f797f8baff..5145446311da3fdb001debb961607993c9bef7dc 100644 (file)
@@ -32,6 +32,8 @@ class WXDLLEXPORT wxJoystick: public wxObject
     ////////////////////////////////////////////////////////////////////////////
 
     wxPoint GetPosition() const;
+    int GetPosition(unsigned axis) const;
+    bool GetButtonState(unsigned button) const;
     int GetZPosition() const;
     int GetButtonState() const;
     int GetPOVPosition() const;
index c56cf2001ac456c465ae792df6327c7c10f3b046..3f1a5a9f5e7e64eb5e9b38a85281cf5b75e069ee 100644 (file)
@@ -28,6 +28,18 @@ wxPoint wxJoystick::GetPosition() const
     return wxPoint(0, 0);
 }
 
+int wxJoystick::GetPosition(unsigned axis) const
+{
+    // TODO
+    return 0;
+}
+
+bool wxJoystick::GetButtonState(unsigned id) const
+{
+    // TODO
+    return false;
+}
+
 int wxJoystick::GetZPosition() const
 {
     // TODO
index 78e023fd737eb9d6d350ce796dcfd7e38a52fea7..1b9f8b04cede331fa8819b936854cf4745c2daef 100644 (file)
@@ -86,6 +86,26 @@ wxPoint wxJoystick::GetPosition() const
         return wxPoint(0,0);
 }
 
+int wxJoystick::GetPosition(unsigned axis) const
+{
+    switch (axis) {
+    case 0:
+        return GetPosition().x;
+    case 1:
+        return GetPosition().y;
+    case 2:
+        return GetZPosition();
+    case 3:
+        return GetRudderPosition();
+    case 4:
+        return GetUPosition();
+    case 5:
+        return GetVPosition();
+    default:
+        return 0;
+    }
+}
+
 int wxJoystick::GetZPosition() const
 {
     JOYINFO joyInfo;
@@ -127,6 +147,14 @@ int wxJoystick::GetButtonState() const
         return 0;
 }
 
+bool wxJoystick::GetButtonState(unsigned id) const
+{
+    if (id > sizeof(int) * 8)
+        return false;
+
+    return (GetButtonState() & (1 << id)) != 0;
+}
+
 /**
     JLI 2002-08-20:
     Returns -1 to signify error.
index 01a44cd3e3c20f7dc97b6b3f49dc92911d71b625..528e6dc40852a2b364e487106a1a63e96a20cc81 100644 (file)
@@ -35,6 +35,18 @@ wxPoint wxJoystick::GetPosition() const
     return wxPoint(0, 0);
 }
 
+int wxJoystick::GetPosition(unsigned axis) const
+{
+    // TODO
+    return 0;
+}
+
+bool wxJoystick::GetButtonState(unsigned id) const
+{
+    // TODO
+    return false;
+}
+
 int wxJoystick::GetZPosition() const
 {
     return 0;
index 64afa78cb989e8286f7a8fec2b91cb99e1e378e9..f5ad7183461923001ea753618394d541b1e3f042 100644 (file)
@@ -44,7 +44,9 @@ enum {
     wxJS_AXIS_V,
 
     wxJS_AXIS_MAX = 32767,
-    wxJS_AXIS_MIN = -32767
+    wxJS_AXIS_MIN = -32767,
+    wxJS_MAX_AXES = 15,
+    wxJS_MAX_BUTTONS = sizeof(int) * 8
 };
 
 
@@ -62,13 +64,15 @@ public:
     void* Entry();
 
 private:
+    void      SendEvent(wxEventType type, long ts, int change = 0);
     int       m_device;
     int       m_joystick;
     wxPoint   m_lastposition;
-    int       m_axe[15];
+    int       m_axe[wxJS_MAX_AXES];
     int       m_buttons;
     wxWindow* m_catchwin;
     int       m_polling;
+    int       m_threshold;
 
     friend class wxJoystick;
 };
@@ -80,12 +84,24 @@ wxJoystickThread::wxJoystickThread(int device, int joystick)
       m_lastposition(wxDefaultPosition),
       m_buttons(0),
       m_catchwin(NULL),
-      m_polling(0)
+      m_polling(0),
+      m_threshold(0)
 {
-    for (int i=0; i<15; i++)
-        m_axe[i] = 0;
+    memset(m_axe, 0, sizeof(m_axe));
 }
 
+void wxJoystickThread::SendEvent(wxEventType type, long ts, int change)
+{
+    wxJoystickEvent jwx_event(type, m_buttons, m_joystick, change);
+
+    jwx_event.SetTimestamp(ts);
+    jwx_event.SetPosition(m_lastposition);
+    jwx_event.SetZPosition(m_axe[wxJS_AXIS_Z]);
+    jwx_event.SetEventObject(m_catchwin);
+
+    if (m_catchwin)
+        m_catchwin->AddPendingEvent(jwx_event);
+}
 
 void* wxJoystickThread::Entry()
 {
@@ -116,9 +132,10 @@ void* wxJoystickThread::Entry()
             //printf("time: %d\t value: %d\t type: %d\t number: %d\n",
             //       j_evt.time, j_evt.value, j_evt.type, j_evt.number);
 
-            wxJoystickEvent jwx_event;
-
-            if (j_evt.type & JS_EVENT_AXIS)
+            if ((j_evt.type & JS_EVENT_AXIS) && (j_evt.number < wxJS_MAX_AXES))
+            {
+                if (   (m_axe[j_evt.number] + m_threshold < j_evt.value)
+                    || (m_axe[j_evt.number] - m_threshold > j_evt.value) )
             {
                 m_axe[j_evt.number] = j_evt.value;
 
@@ -126,47 +143,36 @@ void* wxJoystickThread::Entry()
                 {
                     case wxJS_AXIS_X:
                         m_lastposition.x = j_evt.value;
-                        jwx_event.SetEventType(wxEVT_JOY_MOVE);
+                        SendEvent(wxEVT_JOY_MOVE, j_evt.time);
                         break;
                     case wxJS_AXIS_Y:
                         m_lastposition.y = j_evt.value;
-                        jwx_event.SetEventType(wxEVT_JOY_MOVE);
+                        SendEvent(wxEVT_JOY_MOVE, j_evt.time);
                         break;
                     case wxJS_AXIS_Z:
-                        jwx_event.SetEventType(wxEVT_JOY_ZMOVE);
+                        SendEvent(wxEVT_JOY_ZMOVE, j_evt.time);
                         break;
                     default:
-                        jwx_event.SetEventType(wxEVT_JOY_MOVE);
+                        SendEvent(wxEVT_JOY_MOVE, j_evt.time);
                         // TODO: There should be a way to indicate that the event
                         //       is for some other axes.
                         break;
                 }
             }
+            }
 
-            if (j_evt.type & JS_EVENT_BUTTON)
+            if ( (j_evt.type & JS_EVENT_BUTTON) && (j_evt.number < wxJS_MAX_BUTTONS) )
             {
                 if (j_evt.value)
                 {
                     m_buttons |= (1 << j_evt.number);
-                    jwx_event.SetEventType(wxEVT_JOY_BUTTON_DOWN);
+                    SendEvent(wxEVT_JOY_BUTTON_DOWN, j_evt.time, j_evt.number);
                 }
                 else
                 {
                     m_buttons &= ~(1 << j_evt.number);
-                    jwx_event.SetEventType(wxEVT_JOY_BUTTON_UP);
+                    SendEvent(wxEVT_JOY_BUTTON_UP, j_evt.time, j_evt.number);
                 }
-
-                jwx_event.SetButtonChange(j_evt.number);
-
-                jwx_event.SetTimestamp(j_evt.time);
-                jwx_event.SetJoystick(m_joystick);
-                jwx_event.SetButtonState(m_buttons);
-                jwx_event.SetPosition(m_lastposition);
-                jwx_event.SetZPosition(m_axe[3]);
-                jwx_event.SetEventObject(m_catchwin);
-
-                if (m_catchwin)
-                    m_catchwin->AddPendingEvent(jwx_event);
             }
         }
     }
@@ -225,6 +231,13 @@ wxPoint wxJoystick::GetPosition() const
     return pos;
 }
 
+int wxJoystick::GetPosition(unsigned axis) const
+{
+    if (m_thread && (axis < wxJS_MAX_AXES))
+        return m_thread->m_axe[axis];
+    return 0;
+}
+
 int wxJoystick::GetZPosition() const
 {
     if (m_thread)
@@ -239,6 +252,13 @@ int wxJoystick::GetButtonState() const
     return 0;
 }
 
+bool wxJoystick::GetButtonState(unsigned id) const
+{
+    if (m_thread && (id < wxJS_MAX_BUTTONS))
+        return (m_thread->m_buttons & (1 << id)) != 0;
+    return false;
+}
+
 int wxJoystick::GetPOVPosition() const
 {
     return -1;
@@ -272,11 +292,15 @@ int wxJoystick::GetVPosition() const
 
 int wxJoystick::GetMovementThreshold() const
 {
+    if (m_thread)
+        return m_thread->m_threshold;
     return 0;
 }
 
 void wxJoystick::SetMovementThreshold(int threshold)
 {
+    if (m_thread)
+        m_thread->m_threshold = threshold;
 }
 
 ////////////////////////////////////////////////////////////////////////////
@@ -370,6 +394,9 @@ int wxJoystick::GetNumberButtons() const
     if (m_device != -1)
         ioctl(m_device, JSIOCGBUTTONS, &nb);
 
+    if (nb > wxJS_MAX_BUTTONS)
+        nb = wxJS_MAX_BUTTONS;
+
     return nb;
 }
 
@@ -380,17 +407,20 @@ int wxJoystick::GetNumberAxes() const
     if (m_device != -1)
         ioctl(m_device, JSIOCGAXES, &nb);
 
+    if (nb > wxJS_MAX_AXES)
+        nb = wxJS_MAX_AXES;
+
     return nb;
 }
 
 int wxJoystick::GetMaxButtons() const
 {
-    return 15; // internal
+    return wxJS_MAX_BUTTONS; // internal
 }
 
 int wxJoystick::GetMaxAxes() const
 {
-    return 15; // internal
+    return wxJS_MAX_AXES; // internal
 }
 
 int wxJoystick::GetPollingMin() const