From 6303401f54f21f64c310b45e5aea1496e27dd156 Mon Sep 17 00:00:00 2001 From: Fabrice CARUSO Date: Fri, 6 Jan 2023 20:37:56 +0100 Subject: [PATCH 1/2] WinMM first & second joysticks are not always 0 & 1 --- source/FourPlay.cpp | 10 +- source/Joystick.cpp | 217 +++++++++++++++++++++++++------------------- source/SNESMAX.cpp | 14 +-- 3 files changed, 139 insertions(+), 102 deletions(-) diff --git a/source/FourPlay.cpp b/source/FourPlay.cpp index 7d220d16..de80cb94 100644 --- a/source/FourPlay.cpp +++ b/source/FourPlay.cpp @@ -52,6 +52,9 @@ #include "Memory.h" #include "YamlHelper.h" +extern int JOYSTICK_1; // declared in joystick.cpp +extern int JOYSTICK_2; + BYTE __stdcall FourPlayCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, ULONG nExecutedCycles) { BYTE nOutput = MemReadFloatingBus(nExecutedCycles); @@ -67,15 +70,13 @@ BYTE __stdcall FourPlayCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, UINT yAxis = 0; JOYINFOEX infoEx; - MMRESULT result = 0; infoEx.dwSize = sizeof(infoEx); infoEx.dwFlags = JOY_RETURNPOV | JOY_RETURNBUTTONS; switch (addr & 0xF) { case 0: // Joystick 1 - result = joyGetPosEx(JOYSTICKID1, &infoEx); - if (result == JOYERR_NOERROR) + if (JOYSTICK_1 >= 0 && joyGetPosEx(JOYSTICK_1, &infoEx) == JOYERR_NOERROR) { xAxis = (infoEx.dwXpos >> 8) & 0xFF; yAxis = (infoEx.dwYpos >> 8) & 0xFF; @@ -89,8 +90,7 @@ BYTE __stdcall FourPlayCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, nOutput = up | (down << 1) | (left << 2) | (right << 3) | (alwaysHigh << 5) | (trigger2 << 6) | (trigger1 << 7); break; case 1: // Joystick 2 - result = joyGetPosEx(JOYSTICKID2, &infoEx); - if (result == JOYERR_NOERROR) + if (JOYSTICK_2 >= 0 && joyGetPosEx(JOYSTICK_2, &infoEx) == JOYERR_NOERROR) { xAxis = (infoEx.dwXpos >> 8) & 0xFF; yAxis = (infoEx.dwYpos >> 8) & 0xFF; diff --git a/source/Joystick.cpp b/source/Joystick.cpp index a5239236..85a15f1f 100644 --- a/source/Joystick.cpp +++ b/source/Joystick.cpp @@ -51,6 +51,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA enum {DEVICE_NONE=0, DEVICE_JOYSTICK, DEVICE_KEYBOARD, DEVICE_MOUSE, DEVICE_JOYSTICK_THUMBSTICK2}; +int JOYSTICK_1 = -1; +int JOYSTICK_2 = -1; + // Indexed by joytype[n] static const DWORD joyinfo[6] = { DEVICE_NONE, DEVICE_JOYSTICK, @@ -123,13 +126,16 @@ void JoySetHookAltKeys(bool hook) //=========================================================================== void CheckJoystick0() { + if (JOYSTICK_1 < 0) + return; + static DWORD lastcheck = 0; DWORD currtime = GetTickCount(); if ((currtime-lastcheck >= 10) || joybutton[0] || joybutton[1]) { lastcheck = currtime; JOYINFO info; - if (joyGetPos(JOYSTICKID1,&info) == JOYERR_NOERROR) + if (joyGetPos(JOYSTICK_1,&info) == JOYERR_NOERROR) { joybutton[0] = ((info.wButtons & JOY_BUTTON1) != 0); if (joyinfo[joytype[1]] == DEVICE_NONE) // Only consider 2nd button if NOT emulating a 2nd Apple joystick @@ -160,7 +166,7 @@ void CheckJoystick1() JOYINFOEX infoEx; infoEx.dwSize = sizeof(infoEx); infoEx.dwFlags = JOY_RETURNBUTTONS | JOY_RETURNZ | JOY_RETURNR; - result = joyGetPosEx(JOYSTICKID1, &infoEx); + result = joyGetPosEx(JOYSTICK_1, &infoEx); if (result == JOYERR_NOERROR) { info.wButtons = (infoEx.dwButtons & JOY_BUTTON2) ? JOY_BUTTON1 : 0; @@ -169,7 +175,7 @@ void CheckJoystick1() } } else - result = joyGetPos(JOYSTICKID2, &info); + result = joyGetPos(JOYSTICK_2, &info); if (result == JOYERR_NOERROR) { joybutton[2] = ((info.wButtons & JOY_BUTTON1) != 0); @@ -193,99 +199,128 @@ void CheckJoystick1() //=========================================================================== void JoyInitialize() { - // Emulated joystick #0 can only use JOYSTICKID1 (if no joystick, then use keyboard) - // Emulated joystick #1 can only use JOYSTICKID2 (if no joystick, then disable) + // + // Detect First and Second connected JOYSTICK in WinMM apis. JOYSTICKID1 is 0 and is not always anymore the first connected joystick + // - // - // Init for emulated joystick #0: - // + JOYSTICK_1 = -1; + JOYSTICK_2 = -1; - if (joyinfo[joytype[0]] == DEVICE_JOYSTICK) - { - JOYCAPS caps; - if (joyGetDevCaps(JOYSTICKID1,&caps,sizeof(JOYCAPS)) == JOYERR_NOERROR) + bool firstFound = false; + + UINT joys = joyGetNumDevs(); + for (int i = 0; i < joys; i++) { - joyshrx[0] = 0; - joyshry[0] = 0; - joysubx[0] = (int)caps.wXmin; - joysuby[0] = (int)caps.wYmin; - UINT xrange = caps.wXmax-caps.wXmin; - UINT yrange = caps.wYmax-caps.wYmin; - while (xrange > 256) - { - xrange >>= 1; - ++joyshrx[0]; - } - while (yrange > 256) - { - yrange >>= 1; - ++joyshry[0]; - } - } - else - { - joytype[0] = J0C_KEYBD_NUMPAD; + JOYCAPS caps; + int ret = joyGetDevCaps(i, &caps, sizeof(JOYCAPS)); + if (ret != JOYERR_NOERROR) + continue; + + JOYINFO info; + ret = joyGetPos(i, &info); + if (ret != JOYERR_NOERROR) + continue; + + if (firstFound) + { + JOYSTICK_2 = i; + break; + } + + JOYSTICK_1 = i; + firstFound = true; } - } - // - // Init for emulated joystick #1: - // + // + // Init for emulated joystick #0: + // - if (joyinfo[joytype[1]] == DEVICE_JOYSTICK) - { - JOYCAPS caps; - if (joyGetDevCaps(JOYSTICKID2,&caps,sizeof(JOYCAPS)) == JOYERR_NOERROR) + if (joyinfo[joytype[0]] == DEVICE_JOYSTICK) { - joyshrx[1] = 0; - joyshry[1] = 0; - joysubx[1] = (int)caps.wXmin; - joysuby[1] = (int)caps.wYmin; - UINT xrange = caps.wXmax-caps.wXmin; - UINT yrange = caps.wYmax-caps.wYmin; - while (xrange > 256) - { - xrange >>= 1; - ++joyshrx[1]; - } - while (yrange > 256) - { - yrange >>= 1; - ++joyshry[1]; - } - } - else - { - joytype[1] = J1C_DISABLED; + JOYCAPS caps; + if (JOYSTICK_1 >= 0 && joyGetDevCaps(JOYSTICK_1, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) + { + joyshrx[0] = 0; + joyshry[0] = 0; + joysubx[0] = (int)caps.wXmin; + joysuby[0] = (int)caps.wYmin; + UINT xrange = caps.wXmax - caps.wXmin; + UINT yrange = caps.wYmax - caps.wYmin; + while (xrange > 256) + { + xrange >>= 1; + ++joyshrx[0]; + } + while (yrange > 256) + { + yrange >>= 1; + ++joyshry[0]; + } + } + else + { + joytype[0] = J0C_KEYBD_NUMPAD; + } + } + + // + // Init for emulated joystick #1: + // + + if (JOYSTICK_2 >= 0 && joyinfo[joytype[1]] == DEVICE_JOYSTICK) + { + JOYCAPS caps; + if (joyGetDevCaps(JOYSTICK_2, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) + { + joyshrx[1] = 0; + joyshry[1] = 0; + joysubx[1] = (int)caps.wXmin; + joysuby[1] = (int)caps.wYmin; + UINT xrange = caps.wXmax - caps.wXmin; + UINT yrange = caps.wYmax - caps.wYmin; + while (xrange > 256) + { + xrange >>= 1; + ++joyshrx[1]; + } + while (yrange > 256) + { + yrange >>= 1; + ++joyshry[1]; + } + } + else + { + joytype[1] = J1C_DISABLED; + } + } + else if (JOYSTICK_1 >= 0 && joyinfo[joytype[1]] == DEVICE_JOYSTICK_THUMBSTICK2) + { + JOYCAPS caps; + if (joyGetDevCaps(JOYSTICK_1, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) + { + joyshrx[1] = 0; + joyshry[1] = 0; + joysubx[1] = (int)caps.wZmin; + joysuby[1] = (int)caps.wRmin; + UINT xrange = caps.wZmax - caps.wZmin; + UINT yrange = caps.wRmax - caps.wRmin; + while (xrange > 256) + { + xrange >>= 1; + ++joyshrx[1]; + } + while (yrange > 256) + { + yrange >>= 1; + ++joyshry[1]; + } + } + else + { + joytype[1] = J1C_DISABLED; + } } - } - else if (joyinfo[joytype[1]] == DEVICE_JOYSTICK_THUMBSTICK2) - { - JOYCAPS caps; - if (joyGetDevCaps(JOYSTICKID1, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) - { - joyshrx[1] = 0; - joyshry[1] = 0; - joysubx[1] = (int)caps.wZmin; - joysuby[1] = (int)caps.wRmin; - UINT xrange = caps.wZmax - caps.wZmin; - UINT yrange = caps.wRmax - caps.wRmin; - while (xrange > 256) - { - xrange >>= 1; - ++joyshrx[1]; - } - while (yrange > 256) - { - yrange >>= 1; - ++joyshry[1]; - } - } - else - { - joytype[1] = J1C_DISABLED; - } - } } //=========================================================================== @@ -710,9 +745,9 @@ BOOL JoySetEmulationType(HWND window, DWORD newtype, int nJoystickNumber, const if (joyinfo[newtype] == DEVICE_JOYSTICK || joyinfo[newtype] == DEVICE_JOYSTICK_THUMBSTICK2) { JOYCAPS caps; - unsigned int nJoy2ID = joyinfo[newtype] == DEVICE_JOYSTICK_THUMBSTICK2 ? JOYSTICKID1 : JOYSTICKID2; - unsigned int nJoyID = nJoystickNumber == JN_JOYSTICK0 ? JOYSTICKID1 : nJoy2ID; - if (joyGetDevCaps(nJoyID, &caps, sizeof(JOYCAPS)) != JOYERR_NOERROR) + unsigned int nJoy2ID = joyinfo[newtype] == DEVICE_JOYSTICK_THUMBSTICK2 ? JOYSTICK_1 : JOYSTICK_2; + unsigned int nJoyID = nJoystickNumber == JN_JOYSTICK0 ? JOYSTICK_1 : nJoy2ID; + if (nJoyID < 0 || joyGetDevCaps(nJoyID, &caps, sizeof(JOYCAPS)) != JOYERR_NOERROR) { MessageBox(window, TEXT("The emulator is unable to read your PC joystick. ") diff --git a/source/SNESMAX.cpp b/source/SNESMAX.cpp index 8940d5e5..83460b83 100644 --- a/source/SNESMAX.cpp +++ b/source/SNESMAX.cpp @@ -57,6 +57,9 @@ #include "Memory.h" #include "YamlHelper.h" +extern int JOYSTICK_1; // declared in joystick.cpp +extern int JOYSTICK_2; + // Default to Sony DS4 / DualSense: // b11,..,b0: St,Sl / -,-,R,L,X,A,B,Y // @@ -102,8 +105,7 @@ BYTE __stdcall SNESMAXCard::IOWrite(WORD pc, WORD addr, BYTE bWrite, BYTE value, UINT xAxis = 0; UINT yAxis = 0; - JOYINFOEX infoEx; - MMRESULT result = 0; + JOYINFOEX infoEx; infoEx.dwSize = sizeof(infoEx); infoEx.dwFlags = JOY_RETURNPOV | JOY_RETURNBUTTONS; @@ -117,14 +119,14 @@ BYTE __stdcall SNESMAXCard::IOWrite(WORD pc, WORD addr, BYTE bWrite, BYTE value, controller1Buttons = 0; controller2Buttons = 0; - result = joyGetPosEx(JOYSTICKID1, &infoEx); - if (result == JOYERR_NOERROR) + if (JOYSTICK_1 >= 0 && joyGetPosEx(JOYSTICK_1, &infoEx) == JOYERR_NOERROR) controller1Buttons = pCard->GetControllerButtons(JOYSTICKID1, infoEx, pCard->m_altControllerType[0]); + controller1Buttons = ~controller1Buttons; - result = joyGetPosEx(JOYSTICKID2, &infoEx); - if (result == JOYERR_NOERROR) + if (JOYSTICK_2 >= 0 && joyGetPosEx(JOYSTICK_2, &infoEx) == JOYERR_NOERROR) controller2Buttons = pCard->GetControllerButtons(JOYSTICKID2, infoEx, pCard->m_altControllerType[1]); + controller2Buttons = ~controller2Buttons; break; From 009f77ddc04839b88f0c930626c787d0ead89e4a Mon Sep 17 00:00:00 2001 From: tomcw Date: Fri, 5 May 2023 21:36:38 +0100 Subject: [PATCH 2/2] Add getter-functions for GetJoystick1() and GetJoystick2() --- source/FourPlay.cpp | 8 +++----- source/Joystick.cpp | 49 ++++++++++++++++++++++++++++----------------- source/Joystick.h | 2 ++ source/SNESMAX.cpp | 8 +++----- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/source/FourPlay.cpp b/source/FourPlay.cpp index de80cb94..e537cd33 100644 --- a/source/FourPlay.cpp +++ b/source/FourPlay.cpp @@ -49,12 +49,10 @@ #include "StdAfx.h" #include "FourPlay.h" +#include "Joystick.h" #include "Memory.h" #include "YamlHelper.h" -extern int JOYSTICK_1; // declared in joystick.cpp -extern int JOYSTICK_2; - BYTE __stdcall FourPlayCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, ULONG nExecutedCycles) { BYTE nOutput = MemReadFloatingBus(nExecutedCycles); @@ -76,7 +74,7 @@ BYTE __stdcall FourPlayCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, switch (addr & 0xF) { case 0: // Joystick 1 - if (JOYSTICK_1 >= 0 && joyGetPosEx(JOYSTICK_1, &infoEx) == JOYERR_NOERROR) + if (GetJoystick1() >= 0 && joyGetPosEx(GetJoystick1(), &infoEx) == JOYERR_NOERROR) { xAxis = (infoEx.dwXpos >> 8) & 0xFF; yAxis = (infoEx.dwYpos >> 8) & 0xFF; @@ -90,7 +88,7 @@ BYTE __stdcall FourPlayCard::IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, nOutput = up | (down << 1) | (left << 2) | (right << 3) | (alwaysHigh << 5) | (trigger2 << 6) | (trigger1 << 7); break; case 1: // Joystick 2 - if (JOYSTICK_2 >= 0 && joyGetPosEx(JOYSTICK_2, &infoEx) == JOYERR_NOERROR) + if (GetJoystick2() >= 0 && joyGetPosEx(GetJoystick2(), &infoEx) == JOYERR_NOERROR) { xAxis = (infoEx.dwXpos >> 8) & 0xFF; yAxis = (infoEx.dwYpos >> 8) & 0xFF; diff --git a/source/Joystick.cpp b/source/Joystick.cpp index ef179782..87f2091d 100644 --- a/source/Joystick.cpp +++ b/source/Joystick.cpp @@ -48,9 +48,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA enum {DEVICE_NONE=0, DEVICE_JOYSTICK, DEVICE_KEYBOARD, DEVICE_MOUSE, DEVICE_JOYSTICK_THUMBSTICK2}; -int JOYSTICK_1 = -1; -int JOYSTICK_2 = -1; - // Indexed by joytype[n] static const DWORD joyinfo[6] = { DEVICE_NONE, DEVICE_JOYSTICK, @@ -113,6 +110,9 @@ static UINT g_uJoyportReadMode = JOYPORT_LEFTRIGHT; static bool g_bHookAltKeys = true; +static int JOYSTICK_1 = -1; +static int JOYSTICK_2 = -1; + //=========================================================================== void JoySetHookAltKeys(bool hook) @@ -120,8 +120,18 @@ void JoySetHookAltKeys(bool hook) g_bHookAltKeys = hook; } +int GetJoystick1(void) +{ + return JOYSTICK_1; +} + +int GetJoystick2(void) +{ + return JOYSTICK_2; +} + //=========================================================================== -void CheckJoystick0() +static void CheckJoystick0() { if (JOYSTICK_1 < 0) return; @@ -148,7 +158,7 @@ void CheckJoystick0() } } -void CheckJoystick1() +static void CheckJoystick1() { static DWORD lastcheck = 0; DWORD currtime = GetTickCount(); @@ -156,7 +166,7 @@ void CheckJoystick1() { lastcheck = currtime; JOYINFO info; - MMRESULT result = 0; + MMRESULT result = JOYERR_NOERROR; if (joyinfo[joytype[1]] == DEVICE_JOYSTICK_THUMBSTICK2) { // Use results of joystick 1 thumbstick 2 and button 2 for joystick 1 and button 1 @@ -171,9 +181,12 @@ void CheckJoystick1() info.wYpos = infoEx.dwRpos; } } - else - result = joyGetPos(JOYSTICK_2, &info); - if (result == JOYERR_NOERROR) + else + { + result = joyGetPos(JOYSTICK_2, &info); // NB. joyGetPos(-1, &info) returns JOYERR_PARMS (bad parameters) + } + + if (result == JOYERR_NOERROR) { joybutton[2] = ((info.wButtons & JOY_BUTTON1) != 0); if(joyinfo[joytype[1]] != DEVICE_NONE) @@ -197,7 +210,7 @@ void CheckJoystick1() void JoyInitialize() { // - // Detect First and Second connected JOYSTICK in WinMM apis. JOYSTICKID1 is 0 and is not always anymore the first connected joystick + // Detect First and Second connected JOYSTICK in WinMM API. JOYSTICKID1 == 0 but is not always the first connected joystick. // JOYSTICK_1 = -1; @@ -205,8 +218,8 @@ void JoyInitialize() bool firstFound = false; - UINT joys = joyGetNumDevs(); - for (int i = 0; i < joys; i++) + const UINT numDevs = joyGetNumDevs(); + for (UINT i = 0; i < numDevs; i++) { JOYCAPS caps; int ret = joyGetDevCaps(i, &caps, sizeof(JOYCAPS)); @@ -264,10 +277,10 @@ void JoyInitialize() // Init for emulated joystick #1: // - if (JOYSTICK_2 >= 0 && joyinfo[joytype[1]] == DEVICE_JOYSTICK) + if (joyinfo[joytype[1]] == DEVICE_JOYSTICK) { JOYCAPS caps; - if (joyGetDevCaps(JOYSTICK_2, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) + if (JOYSTICK_2 >= 0 && joyGetDevCaps(JOYSTICK_2, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) { joyshrx[1] = 0; joyshry[1] = 0; @@ -291,10 +304,10 @@ void JoyInitialize() joytype[1] = J1C_DISABLED; } } - else if (JOYSTICK_1 >= 0 && joyinfo[joytype[1]] == DEVICE_JOYSTICK_THUMBSTICK2) + else if (joyinfo[joytype[1]] == DEVICE_JOYSTICK_THUMBSTICK2) { JOYCAPS caps; - if (joyGetDevCaps(JOYSTICK_1, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) + if (JOYSTICK_1 >= 0 && joyGetDevCaps(JOYSTICK_1, &caps, sizeof(JOYCAPS)) == JOYERR_NOERROR) { joyshrx[1] = 0; joyshry[1] = 0; @@ -742,8 +755,8 @@ BOOL JoySetEmulationType(HWND window, DWORD newtype, int nJoystickNumber, const if (joyinfo[newtype] == DEVICE_JOYSTICK || joyinfo[newtype] == DEVICE_JOYSTICK_THUMBSTICK2) { JOYCAPS caps; - unsigned int nJoy2ID = joyinfo[newtype] == DEVICE_JOYSTICK_THUMBSTICK2 ? JOYSTICK_1 : JOYSTICK_2; - unsigned int nJoyID = nJoystickNumber == JN_JOYSTICK0 ? JOYSTICK_1 : nJoy2ID; + int nJoy2ID = joyinfo[newtype] == DEVICE_JOYSTICK_THUMBSTICK2 ? JOYSTICK_1 : JOYSTICK_2; + int nJoyID = nJoystickNumber == JN_JOYSTICK0 ? JOYSTICK_1 : nJoy2ID; if (nJoyID < 0 || joyGetDevCaps(nJoyID, &caps, sizeof(JOYCAPS)) != JOYERR_NOERROR) { MessageBox(window, diff --git a/source/Joystick.h b/source/Joystick.h index 1a8ded42..18285825 100644 --- a/source/Joystick.h +++ b/source/Joystick.h @@ -26,6 +26,8 @@ short JoyGetTrim(bool bAxisX); void JoyportControl(const UINT uControl); void JoySetHookAltKeys(bool hook); void JoySetButtonVirtualKey(UINT button, UINT virtKey); +int GetJoystick1(void); +int GetJoystick2(void); void JoySaveSnapshot(class YamlSaveHelper& yamlSaveHelper); void JoyLoadSnapshot(class YamlLoadHelper& yamlLoadHelper, UINT version); diff --git a/source/SNESMAX.cpp b/source/SNESMAX.cpp index 83460b83..e7a6db06 100644 --- a/source/SNESMAX.cpp +++ b/source/SNESMAX.cpp @@ -53,13 +53,11 @@ */ #include "StdAfx.h" +#include "Joystick.h" #include "SNESMAX.h" #include "Memory.h" #include "YamlHelper.h" -extern int JOYSTICK_1; // declared in joystick.cpp -extern int JOYSTICK_2; - // Default to Sony DS4 / DualSense: // b11,..,b0: St,Sl / -,-,R,L,X,A,B,Y // @@ -119,12 +117,12 @@ BYTE __stdcall SNESMAXCard::IOWrite(WORD pc, WORD addr, BYTE bWrite, BYTE value, controller1Buttons = 0; controller2Buttons = 0; - if (JOYSTICK_1 >= 0 && joyGetPosEx(JOYSTICK_1, &infoEx) == JOYERR_NOERROR) + if (GetJoystick1() >= 0 && joyGetPosEx(GetJoystick1(), &infoEx) == JOYERR_NOERROR) controller1Buttons = pCard->GetControllerButtons(JOYSTICKID1, infoEx, pCard->m_altControllerType[0]); controller1Buttons = ~controller1Buttons; - if (JOYSTICK_2 >= 0 && joyGetPosEx(JOYSTICK_2, &infoEx) == JOYERR_NOERROR) + if (GetJoystick2() >= 0 && joyGetPosEx(GetJoystick2(), &infoEx) == JOYERR_NOERROR) controller2Buttons = pCard->GetControllerButtons(JOYSTICKID2, infoEx, pCard->m_altControllerType[1]); controller2Buttons = ~controller2Buttons;