From 2cbef47d0e84a86a653d49b49190d05149749b9c Mon Sep 17 00:00:00 2001 From: Sonicadvance1 Date: Wed, 10 Dec 2008 03:49:17 +0000 Subject: [PATCH] Holy Crap Batman! nJoy Testing changes. Anyway, this makes axises actually work for buttons. It needs cleaned up still. Buttons dont work as axises yet, will work on that later. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1477 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp | 27 +-- .../Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp | 157 +++++++++++++++--- Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h | 19 +-- 3 files changed, 152 insertions(+), 51 deletions(-) diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp index b96dda8866..0b6b859fc3 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp @@ -392,10 +392,10 @@ void ConfigBox::SetControllerAll(int controller) } else { - tmp << joysticks[controller].dpad2[CTL_D_PAD_UP]; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].dpad2[CTL_D_PAD_DOWN]; m_JoyDpadDown[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].dpad2[CTL_D_PAD_LEFT]; m_JoyDpadLeft[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].dpad2[CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear(); + m_JoyDpadUp[controller]->SetValue(wxString::FromAscii(joysticks[controller].buttons[CTL_D_PAD_UP].c_str())); + m_JoyDpadDown[controller]->SetValue(wxString::FromAscii(joysticks[controller].buttons[CTL_D_PAD_DOWN].c_str())); + m_JoyDpadLeft[controller]->SetValue(wxString::FromAscii(joysticks[controller].buttons[CTL_D_PAD_LEFT].c_str())); + m_JoyDpadRight[controller]->SetValue(wxString::FromAscii(joysticks[controller].buttons[CTL_D_PAD_RIGHT].c_str())); } } @@ -426,10 +426,10 @@ void ConfigBox::GetControllerAll(int controller) } else { - m_JoyDpadUp[controller]->GetValue().ToLong(&lvalue); joysticks[controller].dpad2[CTL_D_PAD_UP] = lvalue; tmp.clear(); - m_JoyDpadDown[controller]->GetValue().ToLong(&lvalue); joysticks[controller].dpad2[CTL_D_PAD_DOWN] = lvalue; tmp.clear(); - m_JoyDpadLeft[controller]->GetValue().ToLong(&lvalue); joysticks[controller].dpad2[CTL_D_PAD_LEFT] = lvalue; tmp.clear(); - m_JoyDpadRight[controller]->GetValue().ToLong(&lvalue); joysticks[controller].dpad2[CTL_D_PAD_RIGHT] = lvalue; tmp.clear(); + joysticks[controller].buttons[CTL_D_PAD_UP] = std::string(m_JoyDpadUp[controller]->GetValue().mb_str()); + joysticks[controller].buttons[CTL_D_PAD_DOWN] = std::string(m_JoyDpadDown[controller]->GetValue().mb_str()); + joysticks[controller].buttons[CTL_D_PAD_LEFT] = std::string(m_JoyDpadLeft[controller]->GetValue().mb_str()); + joysticks[controller].buttons[CTL_D_PAD_RIGHT] = std::string(m_JoyDpadRight[controller]->GetValue().mb_str()); } joysticks[controller].buttons[CTL_MAIN_X] = std::string(m_JoyAnalogMainX[controller]->GetValue().mb_str()); tmp.clear(); @@ -662,10 +662,15 @@ void ConfigBox::GetInputs(wxCommandEvent& event) for(int b = 0; b < axes; b++) { value = SDL_JoystickGetAxis(joy, b); - if(value <= (joysticks[controller].sData[b].Min - (joysticks[controller].sData[b].Min * joysticks[controller].deadzone / 100)) || value >= (joysticks[controller].sData[b].Max - (joysticks[controller].sData[b].Max * joysticks[controller].deadzone / 100))) // Add and subtract a small value + if(joysticks[controller].sData[b].Min == 0) + if(value == 0) + continue; // Do nothing + if( + (value <= (joysticks[controller].sData[b].Min - joysticks[controller].sData[b].Min * joysticks[controller].deadzone/100.0f) ) || + (value >= (joysticks[controller].sData[b].Max - joysticks[controller].sData[b].Max * joysticks[controller].deadzone/100.0f) )) // Add and subtract a small value { // It allows for some small jitter - printf("value %d, Min %d Max %d Removal %d\n", value, joysticks[controller].sData[b].Min,joysticks[controller].sData[b].Max, (joysticks[controller].sData[b].Min * joysticks[controller].deadzone / 100)); - value = value <= (joysticks[controller].sData[b].Min - joysticks[controller].sData[b].Min * joysticks[controller].deadzone) ? -1 : 1; // Makes it know if the value is negative or positive + printf("value %d, Min %d Max %d Removal %f %f\n", value, joysticks[controller].sData[b].Min,joysticks[controller].sData[b].Max, joysticks[controller].sData[b].Min * joysticks[controller].deadzone/100.0f, joysticks[controller].sData[b].Max * joysticks[controller].deadzone/100.0f); + value = value < 0 ? -1 : 1; // Makes it know if the value is negative or positive pressed = b; waiting = false; succeed = true; diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp index 488f2c8cd9..cb414908c3 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp @@ -278,10 +278,29 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) // Adjust range // The value returned by SDL_JoystickGetAxis is a signed integer (-32768 to 32768) // The value used for the gamecube controller is an unsigned char (0 to 255) - int main_stick_x = (joystate[_numPAD].buttons[CTL_MAIN_X]>>8); - int main_stick_y = -(joystate[_numPAD].buttons[CTL_MAIN_Y]>>8); - int sub_stick_x = (joystate[_numPAD].buttons[CTL_SUB_X]>>8); - int sub_stick_y = -(joystate[_numPAD].buttons[CTL_SUB_Y]>>8); + int main_stick_x, main_stick_y, sub_stick_x, sub_stick_y; + if(joysticks[_numPAD].buttons[CTL_MAIN_X].c_str()[0] == 'A') // Axis + { + main_stick_x = (joystate[_numPAD].buttons[CTL_MAIN_X]>>8); + main_stick_y = -(joystate[_numPAD].buttons[CTL_MAIN_Y]>>8); + sub_stick_x = (joystate[_numPAD].buttons[CTL_SUB_X]>>8); + sub_stick_y = -(joystate[_numPAD].buttons[CTL_SUB_Y]>>8); + } + else if(joysticks[_numPAD].buttons[CTL_MAIN_X].c_str()[0] == 'B') // Button + { + PanicAlert("Buttons as Joysticks don't work yet!"); + } + else if(joysticks[_numPAD].buttons[CTL_MAIN_X].c_str()[0] == 'H') // Hat + { + PanicAlert("Hats as Joysticks don't work yet!\n"); + } + else if(joysticks[_numPAD].buttons[CTL_MAIN_X].c_str()[0] == 'N') // None + {} + else // Wtf? + { + //Do a panicAlert here? + } + // Quick fix if(main_stick_x > 127) @@ -311,9 +330,104 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) int triggervalue = 255; if (joystate[_numPAD].halfpress) triggervalue = 100; - + int ButtonArray[] = {PAD_TRIGGER_L, PAD_TRIGGER_R, PAD_BUTTON_A, PAD_BUTTON_B, PAD_BUTTON_X, PAD_BUTTON_Y, PAD_TRIGGER_Z, PAD_BUTTON_START, PAD_BUTTON_UP, PAD_BUTTON_DOWN, PAD_BUTTON_LEFT, PAD_BUTTON_RIGHT}; + for(int a = 0;a <= CTL_D_PAD_RIGHT;a++) + { + switch(joysticks[_numPAD].buttons[a].c_str()[0]) + { + case 'A': + { + // JoyNum refers to which Joystick the button is assigned to + // a is the actual button we are working with + // _numPad is the controller we are working with + int JoyNum = atoi(joysticks[_numPAD].buttons[a].c_str() + 2); + if(joysticks[_numPAD].sData[JoyNum].Min == 0) + if(joystate[_numPAD].buttons[a] == 0) + continue; // Do nothing + // We use Deadzone % to detect if we have pressed the button. + bool Pressed = false; + if(a == CTL_L_SHOULDER || a == CTL_R_SHOULDER || a == CTL_A_BUTTON || a == CTL_B_BUTTON) + Pressed = true; + else + { + if(joysticks[_numPAD].buttons[a].c_str()[1] == '-') + { + if(joystate[_numPAD].buttons[a] <= (joysticks[_numPAD].sData[JoyNum].Min - joysticks[_numPAD].sData[JoyNum].Min * joysticks[_numPAD].deadzone/100.0f)) + { + Pressed = true; + } + } + if(joysticks[_numPAD].buttons[a].c_str()[1] == '+') + { + if(joystate[_numPAD].buttons[a] >= (joysticks[_numPAD].sData[JoyNum].Max - joysticks[_numPAD].sData[JoyNum].Max * joysticks[_numPAD].deadzone/100.0f)) + { + Pressed = true; + } + } + } + if(Pressed == true) + { + int TriggerValue = 0; + + if(joysticks[_numPAD].buttons[a].c_str()[1] == '+') + { + if(joystate[_numPAD].buttons[a] >= 0) + TriggerValue = (255.0f / joysticks[_numPAD].sData[JoyNum].Max) * joystate[_numPAD].buttons[a]; + } + if(joysticks[_numPAD].buttons[a].c_str()[1] == '-') + { + if(joystate[_numPAD].buttons[a] <= 0) + TriggerValue = abs((255.0f / joysticks[_numPAD].sData[JoyNum].Min) * joystate[_numPAD].buttons[a]); + } + if(a == CTL_L_SHOULDER) + { + if(TriggerValue == 255) + _pPADStatus->button |= ButtonArray[a]; + _pPADStatus->triggerLeft = TriggerValue; + } + else if(a == CTL_R_SHOULDER) + { + if(TriggerValue == 255) + _pPADStatus->button |= ButtonArray[a]; + _pPADStatus->triggerRight = TriggerValue; + } + // TODO: Should we do the same for A and B as the L and R trigger? + else if(a == CTL_A_BUTTON) + { + _pPADStatus->button |= ButtonArray[a]; + _pPADStatus->analogA = TriggerValue; + } + else if(a == CTL_B_BUTTON) + { + _pPADStatus->button |= ButtonArray[a]; + _pPADStatus->analogB = TriggerValue; + } + else + _pPADStatus->button |= ButtonArray[a]; + } + } + break; + case 'B': + if(joystate[_numPAD].buttons[a]) + { + _pPADStatus->button |= ButtonArray[a]; + if(a == CTL_L_SHOULDER) + _pPADStatus->triggerLeft = 255; //TODO: Do half press with these + else if(a == CTL_R_SHOULDER) + _pPADStatus->triggerRight = 255; //TODO: Half Press with these + else if(a == CTL_A_BUTTON) + _pPADStatus->analogA = 255; + else if(a == CTL_B_BUTTON) + _pPADStatus->analogB = 255; + } + case 'H': + //PanicAlert("Hats are currently not implemented!"); + default: + break; + } + } // Set buttons - if (joystate[_numPAD].buttons[CTL_L_SHOULDER]) + /*if (joystate[_numPAD].buttons[CTL_L_SHOULDER]) { _pPADStatus->button|=PAD_TRIGGER_L; _pPADStatus->triggerLeft = triggervalue; @@ -337,9 +451,10 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) if (joystate[_numPAD].buttons[CTL_X_BUTTON]) _pPADStatus->button|=PAD_BUTTON_X; if (joystate[_numPAD].buttons[CTL_Y_BUTTON]) _pPADStatus->button|=PAD_BUTTON_Y; if (joystate[_numPAD].buttons[CTL_Z_TRIGGER]) _pPADStatus->button|=PAD_TRIGGER_Z; - if (joystate[_numPAD].buttons[CTL_START]) _pPADStatus->button|=PAD_BUTTON_START; + if (joystate[_numPAD].buttons[CTL_START]) _pPADStatus->button|=PAD_BUTTON_START;*/ // Set D-pad + // TODO: Currently disabled! D:> if(joysticks[_numPAD].controllertype == CTL_TYPE_JOYSTICK) { if(joystate[_numPAD].dpad == SDL_HAT_LEFTUP || joystate[_numPAD].dpad == SDL_HAT_UP || joystate[_numPAD].dpad == SDL_HAT_RIGHTUP ) _pPADStatus->button|=PAD_BUTTON_UP; @@ -349,14 +464,6 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) } else { - if(joystate[_numPAD].dpad2[CTL_D_PAD_UP]) - _pPADStatus->button|=PAD_BUTTON_UP; - if(joystate[_numPAD].dpad2[CTL_D_PAD_DOWN]) - _pPADStatus->button|=PAD_BUTTON_DOWN; - if(joystate[_numPAD].dpad2[CTL_D_PAD_LEFT]) - _pPADStatus->button|=PAD_BUTTON_LEFT; - if(joystate[_numPAD].dpad2[CTL_D_PAD_RIGHT]) - _pPADStatus->button|=PAD_BUTTON_RIGHT; } _pPADStatus->err = PAD_ERR_NONE; @@ -546,10 +653,6 @@ void GetJoyState(int controller) joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad); else { - joystate[controller].dpad2[CTL_D_PAD_UP] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_UP]); - joystate[controller].dpad2[CTL_D_PAD_DOWN] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_DOWN]); - joystate[controller].dpad2[CTL_D_PAD_LEFT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_LEFT]); - joystate[controller].dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_RIGHT]); } } @@ -674,10 +777,10 @@ void SaveConfig() file.Set(SectionName, "z_trigger", joysticks[i].buttons[CTL_Z_TRIGGER]); file.Set(SectionName, "start_button", joysticks[i].buttons[CTL_START]); file.Set(SectionName, "dpad", joysticks[i].dpad); - file.Set(SectionName, "dpad_up", joysticks[i].dpad2[CTL_D_PAD_UP]); - file.Set(SectionName, "dpad_down", joysticks[i].dpad2[CTL_D_PAD_DOWN]); - file.Set(SectionName, "dpad_left", joysticks[i].dpad2[CTL_D_PAD_LEFT]); - file.Set(SectionName, "dpad_right", joysticks[i].dpad2[CTL_D_PAD_RIGHT]); + file.Set(SectionName, "dpad_up", joysticks[i].buttons[CTL_D_PAD_UP]); + file.Set(SectionName, "dpad_down", joysticks[i].buttons[CTL_D_PAD_DOWN]); + file.Set(SectionName, "dpad_left", joysticks[i].buttons[CTL_D_PAD_LEFT]); + file.Set(SectionName, "dpad_right", joysticks[i].buttons[CTL_D_PAD_RIGHT]); file.Set(SectionName, "main_x", joysticks[i].buttons[CTL_MAIN_X]); file.Set(SectionName, "main_y", joysticks[i].buttons[CTL_MAIN_Y]); file.Set(SectionName, "sub_x", joysticks[i].buttons[CTL_SUB_X]); @@ -722,10 +825,10 @@ void LoadConfig() file.Get(SectionName, "z_trigger", &joysticks[i].buttons[CTL_Z_TRIGGER], "B7"); file.Get(SectionName, "start_button", &joysticks[i].buttons[CTL_START], "B9"); file.Get(SectionName, "dpad", &joysticks[i].dpad, 0); - file.Get(SectionName, "dpad_up", &joysticks[i].dpad2[CTL_D_PAD_UP], 0); - file.Get(SectionName, "dpad_down", &joysticks[i].dpad2[CTL_D_PAD_DOWN], 0); - file.Get(SectionName, "dpad_left", &joysticks[i].dpad2[CTL_D_PAD_LEFT], 0); - file.Get(SectionName, "dpad_right", &joysticks[i].dpad2[CTL_D_PAD_RIGHT], 0); + file.Get(SectionName, "dpad_up", &joysticks[i].buttons[CTL_D_PAD_UP], 0); + file.Get(SectionName, "dpad_down", &joysticks[i].buttons[CTL_D_PAD_DOWN], 0); + file.Get(SectionName, "dpad_left", &joysticks[i].buttons[CTL_D_PAD_LEFT], 0); + file.Get(SectionName, "dpad_right", &joysticks[i].buttons[CTL_D_PAD_RIGHT], 0); file.Get(SectionName, "main_x", &joysticks[i].buttons[CTL_MAIN_X], "A0"); file.Get(SectionName, "main_y", &joysticks[i].buttons[CTL_MAIN_Y], "A1"); file.Get(SectionName, "sub_x", &joysticks[i].buttons[CTL_SUB_X], "A2"); diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h index 9f91cf47e5..b361766193 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h @@ -107,18 +107,16 @@ class sCalibration Sint16 Max; }; // Simple Calibration Data struct CONTROLLER_STATE{ // GC PAD INFO/STATE - int buttons[12]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons + int buttons[16]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons int dpad; // 1 HAT (8 directions + neutral) - int dpad2[4]; // d-pad using buttons int halfpress; // ... SDL_Joystick *joy; // SDL joystick device }; struct CONTROLLER_MAPPING{ // GC PAD MAPPING - std::string buttons[12];// Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons + std::string buttons[16];// Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons sCalibration sData[MAX_AXISES]; // Calibration Data int dpad; // 1 HAT (8 directions + neutral) - int dpad2[4]; // d-pad using buttons int enabled; // Pad attached? int deadzone; // Deadzone... what else? int halfpress; // Halfpress... you know, like not fully pressed ;)... @@ -147,6 +145,10 @@ enum CTL_Y_BUTTON, CTL_Z_TRIGGER, CTL_START, + CTL_D_PAD_UP, + CTL_D_PAD_DOWN, + CTL_D_PAD_LEFT, + CTL_D_PAD_RIGHT, CTL_MAIN_X, CTL_MAIN_Y, CTL_SUB_X, @@ -161,15 +163,6 @@ enum CTL_TYPE_JOYSTICK_XBOX360, CTL_TYPE_KEYBOARD }; - -enum -{ - CTL_D_PAD_UP = 0, - CTL_D_PAD_DOWN, - CTL_D_PAD_LEFT, - CTL_D_PAD_RIGHT -}; - ////////////////////////////////////////////////////////////////////////////////////////// // Custom Functions // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ