diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-10-24 03:15:42 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-10-24 03:15:42 +0000 |
| commit | 5408345d8b1cde19a19ddf324d3439ead6e80709 (patch) | |
| tree | fd7934308384396b4ad92b547e8804a696c480e8 /macosx/plugins/HIDInput/src/PlugPAD.c | |
| parent | f2f1033882e0643f05f3027f2c812f425f67a879 (diff) | |
| download | pcsxr-5408345d8b1cde19a19ddf324d3439ead6e80709.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@32699 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'macosx/plugins/HIDInput/src/PlugPAD.c')
| -rw-r--r-- | macosx/plugins/HIDInput/src/PlugPAD.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/macosx/plugins/HIDInput/src/PlugPAD.c b/macosx/plugins/HIDInput/src/PlugPAD.c new file mode 100644 index 00000000..c4f07eb2 --- /dev/null +++ b/macosx/plugins/HIDInput/src/PlugPAD.c @@ -0,0 +1,234 @@ + +#include <IOKit/hid/IOHIDUsageTables.h> +#include "HID_Utilities.h" +#include "PlugPAD.h" + + +///////////////////////////////////////////////////////// +typedef void* HWND; +#include "PSEmu_Plugin_Defs.h" + +const char *LibName = "HIDInput"; +const int version = 0; +const int revision = 1; +const int build = 0; + +const char *PSEgetLibName(void) { + return LibName; +} + +unsigned long PSEgetLibType(void) { + return PSE_LT_PAD; +} + +unsigned long PSEgetLibVersion(void) { + return version << 16 | revision << 8 | build; +} +///////////////////////////////////////////////////////// + + +// FIXME: dynamically allocate this +int gControllerType[MAX_NUM_PADS]; +int gNumKeys[MAX_NUM_PADS]; +keyEntry gKeys[MAX_NUM_PADS][MAX_NUM_KEYS]; +int gNumAxes[MAX_NUM_PADS]; +axisEntry gAxes[MAX_NUM_PADS][MAX_NUM_AXES]; + +static long sPadFlags = 0; + +long PADinit(long flags) { + sPadFlags |= flags; + + // kHIDPage_GenericDesktop,kHIDUsage_GD_GamePad + if (!HIDHaveDeviceList()) { + // List all HID devices + HIDBuildDeviceList(kHIDPage_GenericDesktop, 0); + + if (HIDCountDevices() == 0) { + // No devices found! + HIDReleaseDeviceList(); + return PSE_PAD_ERR_INIT; + } + + //HIDCloseReleaseInterface( + } + + LoadConfig(); + + return 0; +} + +long PADshutdown(void) { + sPadFlags = 0; + + //HIDReleaseAllDeviceQueues(); + HIDReleaseDeviceList(); + + return 0; +} + +long PADopen(unsigned long *Disp) { + //printf("start PADopen()\n"); + + /*HIDReleaseAllDeviceQueues(); + + if (sPadFlags & PSE_PAD_USE_PORT1) { + for (i=0; i<numKeys; i++) { + HIDQueueElement(); + } + } + if (sPadFlags & PSE_PAD_USE_PORT2) { + for (i=0; i<numKeys; i++) { + HIDQueueElement(); + } + }*/ + + return 0; +} + +long PADclose(void) { + //HIDReleaseAllDeviceQueues(); + + return 0; +} + +long PADconfigure(void) { + // make sure our previous configuration was loaded + if (sPadFlags == 0) { + fprintf(stderr, "PADconfigure() called before PADinit()\n"); + if (!HIDHaveDeviceList()) { + HIDBuildDeviceList(kHIDPage_GenericDesktop, 0); + } + } + + return DoConfiguration(); +} + +void PADabout(void) { + DoAbout(); +} + +long _readPortX(PadDataS *data, int port) +{ + unsigned short buttonState = 0xffff; + keyEntry *keys = gKeys[port]; + axisEntry *axes = gAxes[port]; + int i; + + //pRecDevice device; + //IOHIDEventStruct event; + + /*device = HIDGetFirstDevice(); + do { + while (HIDGetEvent(device, &event)) { + switch (event->type) { + case kIOHIDElementTypeInput_Button: + if (event->value) { + + } + break; + default: + break; + } + } + while (HIDGetNextDevice(device));*/ + + for (i=0; i<gNumKeys[port]; i++) { + long value = HIDGetElementValue(keys[i].device, keys[i].element); + + if (keys[i].element->usagePage == kHIDPage_GenericDesktop && + keys[i].element->usage >= kHIDUsage_GD_X && keys[i].element->usage <= kHIDUsage_GD_Rz) { + /* axis input device */ + value = HIDCalibrateValue(value, keys[i].element); + value = HIDScaleValue(value, keys[i].element); + if (keys[i].reverse) { + if (value < 64) + buttonState &= ~(1 << keys[i].button); + } else { + if (value > 191) + buttonState &= ~(1 << keys[i].button); + } + } else { + if (value) + buttonState &= ~(1 << keys[i].button); + } + } + + for (i=0; i<gNumAxes[port]; i++) { + long value = HIDGetElementValue(axes[i].device, axes[i].element); + + if (value != axes[i].lastValue) { + axes[i].lastValue = value; + + if (axes[i].element->usagePage == kHIDPage_GenericDesktop && + axes[i].element->usage >= kHIDUsage_GD_X && axes[i].element->usage <= kHIDUsage_GD_Rz) { + /* axis input device */ + value = HIDCalibrateValue(value, axes[i].element); + value = HIDScaleValue(value, axes[i].element); + if (!axes[i].positive) value = 255-value; + + if (value >= 127) { + if (axes[i].reverse) value = 255-value; + + switch (axes[i].axis) { + case 0: data->rightJoyX = value; break; + case 1: data->rightJoyY = value; break; + case 2: data->leftJoyX = value; break; + case 3: data->leftJoyY = value; break; + } + } + } + } + } + + data->controllerType = gControllerType[port]; + data->buttonStatus = buttonState; + return 0; +} + +long PADreadPort1(PadDataS *data) { + static unsigned char lastRightJoyX = 128; + static unsigned char lastRightJoyY = 128; + static unsigned char lastLeftJoyX = 128; + static unsigned char lastLeftJoyY = 128; + + data->rightJoyX = lastRightJoyX; + data->rightJoyY = lastRightJoyY; + data->leftJoyX = lastLeftJoyX; + data->leftJoyY = lastLeftJoyY; + + _readPortX(data, 0); + + lastRightJoyX = data->rightJoyX; + lastRightJoyY = data->rightJoyY; + lastLeftJoyX = data->leftJoyX; + lastLeftJoyY = data->leftJoyY; + + return 0; +} + +long PADreadPort2(PadDataS *data) { + static unsigned char lastRightJoyX = 128; + static unsigned char lastRightJoyY = 128; + static unsigned char lastLeftJoyX = 128; + static unsigned char lastLeftJoyY = 128; + + data->rightJoyX = lastRightJoyX; + data->rightJoyY = lastRightJoyY; + data->leftJoyX = lastLeftJoyX; + data->leftJoyY = lastLeftJoyY; + + _readPortX(data, 1); + + lastRightJoyX = data->rightJoyX; + lastRightJoyY = data->rightJoyY; + lastLeftJoyX = data->leftJoyX; + lastLeftJoyY = data->leftJoyY; + + return 0; +} + +long PADkeypressed() +{ + return 0; +} |
