diff src/joystick/darwin/SDL_sysjoystick.c @ 2713:0906692aa6a4

Final merge of Google Summer of Code 2008 work... Force Feedback for SDL by Edgar Simo, mentored by Ryan C. Gordon
author Sam Lantinga <slouken@libsdl.org>
date Mon, 25 Aug 2008 09:55:03 +0000
parents dbc6d1893869
children 204be4fc2726
line wrap: on
line diff
--- a/src/joystick/darwin/SDL_sysjoystick.c	Mon Aug 25 08:50:37 2008 +0000
+++ b/src/joystick/darwin/SDL_sysjoystick.c	Mon Aug 25 09:55:03 2008 +0000
@@ -48,59 +48,14 @@
 #include <CoreFoundation/CoreFoundation.h>
 #include <Carbon/Carbon.h>      /* for NewPtrClear, DisposePtr */
 
+/* For force feedback testing. */
+#include <ForceFeedback/ForceFeedback.h>
+#include <ForceFeedback/ForceFeedbackConstants.h>
+
 #include "SDL_joystick.h"
 #include "../SDL_sysjoystick.h"
 #include "../SDL_joystick_c.h"
-
-struct recElement
-{
-    IOHIDElementCookie cookie;  /* unique value which identifies element, will NOT change */
-    long min;                   /* reported min value possible */
-    long max;                   /* reported max value possible */
-#if 0
-    /* TODO: maybe should handle the following stuff somehow? */
-
-    long scaledMin;             /* reported scaled min value possible */
-    long scaledMax;             /* reported scaled max value possible */
-    long size;                  /* size in bits of data return from element */
-    Boolean relative;           /* are reports relative to last report (deltas) */
-    Boolean wrapping;           /* does element wrap around (one value higher than max is min) */
-    Boolean nonLinear;          /* are the values reported non-linear relative to element movement */
-    Boolean preferredState;     /* does element have a preferred state (such as a button) */
-    Boolean nullState;          /* does element have null state */
-#endif                          /* 0 */
-
-    /* runtime variables used for auto-calibration */
-    long minReport;             /* min returned value */
-    long maxReport;             /* max returned value */
-
-    struct recElement *pNext;   /* next element in list */
-};
-typedef struct recElement recElement;
-
-struct joystick_hwdata
-{
-    IOHIDDeviceInterface **interface;   /* interface to device, NULL = no interface */
-
-    char product[256];          /* name of product */
-    long usage;                 /* usage page from IOUSBHID Parser.h which defines general usage */
-    long usagePage;             /* usage within above page from IOUSBHID Parser.h which defines specific usage */
-
-    long axes;                  /* number of axis (calculated, not reported by device) */
-    long buttons;               /* number of buttons (calculated, not reported by device) */
-    long hats;                  /* number of hat switches (calculated, not reported by device) */
-    long elements;              /* number of total elements (shouldbe total of above) (calculated, not reported by device) */
-
-    recElement *firstAxis;
-    recElement *firstButton;
-    recElement *firstHat;
-
-    int removed;
-    int uncentered;
-
-    struct joystick_hwdata *pNext;      /* next device */
-};
-typedef struct joystick_hwdata recDevice;
+#include "SDL_sysjoystick_c.h"
 
 
 /* Linked list of all available devices */
@@ -594,6 +549,12 @@
         /* save next device prior to disposing of this device */
         pDeviceNext = (*ppDevice)->pNext;
 
+        /* free posible io_service_t */
+        if ((*ppDevice)->ffservice) {
+            IOObjectRelease((*ppDevice)->ffservice);
+            (*ppDevice)->ffservice = 0;
+        }
+
         /* free element lists */
         HIDDisposeElementList(&(*ppDevice)->firstAxis);
         HIDDisposeElementList(&(*ppDevice)->firstButton);
@@ -686,12 +647,6 @@
         if (!device)
             continue;
 
-        /* dump device object, it is no longer needed */
-        result = IOObjectRelease(ioHIDDeviceObject);
-/*		if (KERN_SUCCESS != result)
-			HIDReportErrorNum ("IOObjectRelease error with ioHIDDeviceObject.", result);
-*/
-
         /* Filter device list to non-keyboard/mouse stuff */
         if ((device->usagePage != kHIDPage_GenericDesktop) ||
             ((device->usage != kHIDUsage_GD_Joystick &&
@@ -704,6 +659,14 @@
             continue;
         }
 
+        /* We have to do some storage of the io_service_t for
+         * SDL_HapticOpenFromJoystick */
+        if (FFIsForceFeedback(ioHIDDeviceObject) == FF_OK) {
+            device->ffservice = ioHIDDeviceObject;
+        } else {
+            device->ffservice = 0;
+        }
+
         /* Add device to the end of the list */
         if (lastDevice)
             lastDevice->pNext = device;