better rumble/update logic for smash adapter

This commit is contained in:
Jack Andersen 2015-04-23 19:50:08 -10:00
parent 4377109346
commit 79b9e0fd9b
3 changed files with 12 additions and 32 deletions

View File

@ -11,7 +11,6 @@ struct IDolphinSmashAdapterCallback
DOL_TYPE_NONE = 0, DOL_TYPE_NONE = 0,
DOL_TYPE_NORMAL = 0x10, DOL_TYPE_NORMAL = 0x10,
DOL_TYPE_WAVEBIRD = 0x20, DOL_TYPE_WAVEBIRD = 0x20,
DOL_TYPE_RUMBLE = 0xF0
}; };
enum EDolphinControllerButtons enum EDolphinControllerButtons
{ {

View File

@ -5,26 +5,6 @@
/* Reference: https://github.com/ToadKing/wii-u-gc-adapter/blob/master/wii-u-gc-adapter.c /* Reference: https://github.com/ToadKing/wii-u-gc-adapter/blob/master/wii-u-gc-adapter.c
*/ */
static const bool BUTTON_MASK[] =
{
true,
true,
true,
true,
false,
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true
};
CDolphinSmashAdapter::CDolphinSmashAdapter(CDeviceToken* token) CDolphinSmashAdapter::CDolphinSmashAdapter(CDeviceToken* token)
: CDeviceBase(token), : CDeviceBase(token),
m_callback(NULL), m_callback(NULL),
@ -57,15 +37,13 @@ parseType(unsigned char status)
} }
static inline IDolphinSmashAdapterCallback::EDolphinControllerType static inline IDolphinSmashAdapterCallback::EDolphinControllerType
parseState(IDolphinSmashAdapterCallback::SDolphinControllerState* stateOut, uint8_t* payload) parseState(IDolphinSmashAdapterCallback::SDolphinControllerState* stateOut, uint8_t* payload, bool& rumble)
{ {
memset(stateOut, 0, sizeof(IDolphinSmashAdapterCallback::SDolphinControllerState)); memset(stateOut, 0, sizeof(IDolphinSmashAdapterCallback::SDolphinControllerState));
unsigned char status = payload[0]; unsigned char status = payload[0];
IDolphinSmashAdapterCallback::EDolphinControllerType type = parseType(status); IDolphinSmashAdapterCallback::EDolphinControllerType type = parseType(status);
IDolphinSmashAdapterCallback::EDolphinControllerType extra = rumble = ((status & 0x04) != 0) ? true : false;
((status & 0x04) != 0) ? IDolphinSmashAdapterCallback::DOL_TYPE_RUMBLE :
IDolphinSmashAdapterCallback::DOL_TYPE_NONE;
stateOut->m_btns = (uint16_t)payload[1] << 8 | (uint16_t)payload[2]; stateOut->m_btns = (uint16_t)payload[1] << 8 | (uint16_t)payload[2];
@ -76,7 +54,7 @@ parseState(IDolphinSmashAdapterCallback::SDolphinControllerState* stateOut, uint
stateOut->m_analogTriggers[0] = payload[7]; stateOut->m_analogTriggers[0] = payload[7];
stateOut->m_analogTriggers[1] = payload[8]; stateOut->m_analogTriggers[1] = payload[8];
return static_cast<IDolphinSmashAdapterCallback::EDolphinControllerType>(type|extra); return type;
} }
void CDolphinSmashAdapter::transferCycle() void CDolphinSmashAdapter::transferCycle()
@ -101,11 +79,12 @@ void CDolphinSmashAdapter::transferCycle()
/* Parse controller states */ /* Parse controller states */
uint8_t* controller = &payload[1]; uint8_t* controller = &payload[1];
bool rumbleMask[4] = {false}; uint8_t rumbleMask = 0;
for (int i=0 ; i<4 ; i++, controller += 9) for (int i=0 ; i<4 ; i++, controller += 9)
{ {
IDolphinSmashAdapterCallback::SDolphinControllerState state; IDolphinSmashAdapterCallback::SDolphinControllerState state;
IDolphinSmashAdapterCallback::EDolphinControllerType type = parseState(&state, controller); bool rumble = false;
IDolphinSmashAdapterCallback::EDolphinControllerType type = parseState(&state, controller, rumble);
if (type && !(m_knownControllers & 1<<i)) if (type && !(m_knownControllers & 1<<i))
{ {
m_knownControllers |= 1<<i; m_knownControllers |= 1<<i;
@ -116,18 +95,19 @@ void CDolphinSmashAdapter::transferCycle()
m_knownControllers &= ~(1<<i); m_knownControllers &= ~(1<<i);
m_callback->controllerDisconnected(i, type); m_callback->controllerDisconnected(i, type);
} }
m_callback->controllerUpdate(i, type, state); if (m_knownControllers & 1<<i)
rumbleMask[i] = type & IDolphinSmashAdapterCallback::DOL_TYPE_RUMBLE; m_callback->controllerUpdate(i, type, state);
rumbleMask |= rumble ? 1<<i : 0;
} }
/* Send rumble message (if needed) */ /* Send rumble message (if needed) */
uint8_t rumbleReq = m_rumbleRequest; uint8_t rumbleReq = m_rumbleRequest & rumbleMask;
if (rumbleReq != m_rumbleState) if (rumbleReq != m_rumbleState)
{ {
uint8_t rumbleMessage[5] = {0x11}; uint8_t rumbleMessage[5] = {0x11};
for (int i=0 ; i<4 ; ++i) for (int i=0 ; i<4 ; ++i)
{ {
if (rumbleReq & 1<<i && rumbleMask[i]) if (rumbleReq & 1<<i)
rumbleMessage[i+1] = 1; rumbleMessage[i+1] = 1;
else else
rumbleMessage[i+1] = 0; rumbleMessage[i+1] = 0;

View File

@ -32,6 +32,7 @@ public:
{ {
smashAdapter = dynamic_cast<CDolphinSmashAdapter*>(tok.openAndGetDevice()); smashAdapter = dynamic_cast<CDolphinSmashAdapter*>(tok.openAndGetDevice());
smashAdapter->setCallback(&m_cb); smashAdapter->setCallback(&m_cb);
smashAdapter->startRumble(0);
} }
void deviceDisconnected(CDeviceToken&, CDeviceBase* device) void deviceDisconnected(CDeviceToken&, CDeviceBase* device)
{ {