Final merge of Google Summer of Code 2008 work...
Force Feedback for SDL by Edgar Simo, mentored by Ryan C. Gordon --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403159
This commit is contained in:
parent
0aca811202
commit
4fd9c25fe6
29 changed files with 6642 additions and 165 deletions
|
@ -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 @@ HIDDisposeDevice(recDevice ** ppDevice)
|
|||
/* 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 @@ SDL_SYS_JoystickInit(void)
|
|||
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 @@ SDL_SYS_JoystickInit(void)
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue