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 // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ