SDL Changes to support clean reads
CR: saml
parent
35322ed847
commit
2b441ec6c4
|
@ -105,10 +105,11 @@ FreeDevice(recDevice *removeDevice)
|
||||||
return pDeviceNext;
|
return pDeviceNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SInt32
|
static SDL_bool
|
||||||
GetHIDElementState(recDevice *pDevice, recElement *pElement)
|
GetHIDElementState(recDevice *pDevice, recElement *pElement, SInt32 *pValue)
|
||||||
{
|
{
|
||||||
SInt32 value = 0;
|
SInt32 value = 0;
|
||||||
|
int returnValue = SDL_FALSE;
|
||||||
|
|
||||||
if (pDevice && pElement) {
|
if (pDevice && pElement) {
|
||||||
IOHIDValueRef valueRef;
|
IOHIDValueRef valueRef;
|
||||||
|
@ -122,24 +123,33 @@ GetHIDElementState(recDevice *pDevice, recElement *pElement)
|
||||||
if (value > pElement->maxReport) {
|
if (value > pElement->maxReport) {
|
||||||
pElement->maxReport = value;
|
pElement->maxReport = value;
|
||||||
}
|
}
|
||||||
|
*pValue = value;
|
||||||
|
|
||||||
|
returnValue = SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
return value;
|
static SDL_bool
|
||||||
}
|
GetHIDScaledCalibratedState(recDevice * pDevice, recElement * pElement, SInt32 min, SInt32 max, SInt32 *pValue)
|
||||||
|
|
||||||
static SInt32
|
|
||||||
GetHIDScaledCalibratedState(recDevice * pDevice, recElement * pElement, SInt32 min, SInt32 max)
|
|
||||||
{
|
{
|
||||||
const float deviceScale = max - min;
|
const float deviceScale = max - min;
|
||||||
const float readScale = pElement->maxReport - pElement->minReport;
|
const float readScale = pElement->maxReport - pElement->minReport;
|
||||||
const SInt32 value = GetHIDElementState(pDevice, pElement);
|
int returnValue = SDL_FALSE;
|
||||||
|
if (GetHIDElementState(pDevice, pElement, pValue))
|
||||||
|
{
|
||||||
if (readScale == 0) {
|
if (readScale == 0) {
|
||||||
return value; /* no scaling at all */
|
returnValue = SDL_TRUE; /* no scaling at all */
|
||||||
}
|
}
|
||||||
return ((value - pElement->minReport) * deviceScale / readScale) + min;
|
else
|
||||||
|
{
|
||||||
|
*pValue = ((*pValue - pElement->minReport) * deviceScale / readScale) + min;
|
||||||
|
returnValue = SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
JoystickDeviceWasRemovedCallback(void *ctx, IOReturn result, void *sender)
|
JoystickDeviceWasRemovedCallback(void *ctx, IOReturn result, void *sender)
|
||||||
|
@ -698,9 +708,14 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
|
||||||
|
|
||||||
element = device->firstAxis;
|
element = device->firstAxis;
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
|
int goodRead = SDL_FALSE;
|
||||||
while (element) {
|
while (element) {
|
||||||
value = GetHIDScaledCalibratedState(device, element, -32768, 32767);
|
goodRead = GetHIDScaledCalibratedState(device, element, -32768, 32767, &value);
|
||||||
|
if (goodRead) {
|
||||||
SDL_PrivateJoystickAxis(joystick, i, value);
|
SDL_PrivateJoystickAxis(joystick, i, value);
|
||||||
|
}
|
||||||
|
|
||||||
element = element->pNext;
|
element = element->pNext;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -708,22 +723,28 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
|
||||||
element = device->firstButton;
|
element = device->firstButton;
|
||||||
i = 0;
|
i = 0;
|
||||||
while (element) {
|
while (element) {
|
||||||
value = GetHIDElementState(device, element);
|
goodRead = GetHIDElementState(device, element, &value);
|
||||||
|
if (goodRead) {
|
||||||
if (value > 1) { /* handle pressure-sensitive buttons */
|
if (value > 1) { /* handle pressure-sensitive buttons */
|
||||||
value = 1;
|
value = 1;
|
||||||
}
|
}
|
||||||
SDL_PrivateJoystickButton(joystick, i, value);
|
SDL_PrivateJoystickButton(joystick, i, value);
|
||||||
|
}
|
||||||
|
|
||||||
element = element->pNext;
|
element = element->pNext;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
element = device->firstHat;
|
element = device->firstHat;
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
while (element) {
|
while (element) {
|
||||||
Uint8 pos = 0;
|
Uint8 pos = 0;
|
||||||
|
|
||||||
range = (element->max - element->min + 1);
|
range = (element->max - element->min + 1);
|
||||||
value = GetHIDElementState(device, element) - element->min;
|
goodRead = GetHIDElementState(device, element, &value);
|
||||||
|
if (goodRead) {
|
||||||
|
value -= element->min;
|
||||||
if (range == 4) { /* 4 position hatswitch - scale up value */
|
if (range == 4) { /* 4 position hatswitch - scale up value */
|
||||||
value *= 2;
|
value *= 2;
|
||||||
} else if (range != 8) { /* Neither a 4 nor 8 positions - fall back to default position (centered) */
|
} else if (range != 8) { /* Neither a 4 nor 8 positions - fall back to default position (centered) */
|
||||||
|
@ -764,6 +785,7 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_PrivateJoystickHat(joystick, i, pos);
|
SDL_PrivateJoystickHat(joystick, i, pos);
|
||||||
|
}
|
||||||
|
|
||||||
element = element->pNext;
|
element = element->pNext;
|
||||||
++i;
|
++i;
|
||||||
|
|
Loading…
Reference in New Issue