From 15cff48f5ac5a20029a082ec3c54ae98558942b6 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Sat, 27 Dec 2008 11:32:03 +0000 Subject: [PATCH] nJoy: First implementation of an analog stick radius adjustment. Converting a square radius to a circle radius. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1698 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj | 12 +- Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp | 189 ++-- Source/Plugins/Plugin_nJoy_SDL/Src/Config.h | 39 + .../Src/GUI/ConfigAdvanced.cpp | 147 +-- .../Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp | 869 +++++++----------- .../Plugin_nJoy_SDL/Src/GUI/ConfigBox.h | 79 +- Source/Plugins/Plugin_nJoy_SDL/Src/Rumble.cpp | 2 +- Source/Plugins/Plugin_nJoy_SDL/Src/SConscript | 1 + Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp | 455 +++++---- Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h | 20 +- 10 files changed, 971 insertions(+), 842 deletions(-) create mode 100644 Source/Plugins/Plugin_nJoy_SDL/Src/Config.h diff --git a/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj b/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj index 9659dd6bf5..9465280776 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj +++ b/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj @@ -207,7 +207,7 @@ RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="3" - WarnAsError="true" + WarnAsError="false" DebugInformationFormat="3" /> + + @@ -541,6 +545,10 @@ RelativePath=".\Src\GUI\ConfigBox.h" > + + &Duplicates) +{ + // Count the number of duplicate names + int NumDuplicates = 0; + for(int i = 0; i < Duplicates.size(); i++) + if(_Name == Duplicates.at(i)) NumDuplicates++; + + Duplicates.push_back(_Name); // Add the name + + // Return an amended name if we found a duplicate + if(NumDuplicates > 0) + return StringFromFormat("%s (%i)", _Name.c_str(), NumDuplicates); + else + return _Name; +} + + // Save settings to file // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void SaveConfig() +void Config::Save() { IniFile file; file.Load("nJoy.ini"); + std::vector Duplicates; + + file.Set("General", "SaveByID", g_Config.bSaveByID); + file.Set("General", "ShowAdvanced", g_Config.bShowAdvanced); for (int i = 0; i < 4; i++) { - char SectionName[32]; - sprintf(SectionName, "PAD%i", i+1); + std::string SectionName = StringFromFormat("PAD%i", i+1); + file.Set(SectionName.c_str(), "joy_id", joysticks[i].ID); + file.Set(SectionName.c_str(), "enabled", joysticks[i].enabled); + + ////////////////////////////////////// + // Save joypad specific settings + // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + // Current joypad device ID: joysticks[i].ID + // Current joypad name: joyinfo[joysticks[i].ID].Name + if(g_Config.bSaveByID) + { + /* Save joypad specific settings. Check for "joysticks[i].ID < SDL_NumJoysticks()" to + avoid reading a joyinfo that does't exist */ + if(joysticks[i].ID >= SDL_NumJoysticks()) continue; + + //PanicAlert("%i", m_frame->m_Joyname[0]->GetSelection()); + //if(i == 0) PanicAlert("%i", joysticks[i].buttons[CTL_START]); + //PanicAlert("%s", joyinfo[joysticks[i].ID].Name); - file.Set(SectionName, "l_shoulder", joysticks[i].buttons[CTL_L_SHOULDER]); - file.Set(SectionName, "r_shoulder", joysticks[i].buttons[CTL_R_SHOULDER]); - file.Set(SectionName, "a_button", joysticks[i].buttons[CTL_A_BUTTON]); - file.Set(SectionName, "b_button", joysticks[i].buttons[CTL_B_BUTTON]); - file.Set(SectionName, "x_button", joysticks[i].buttons[CTL_X_BUTTON]); - file.Set(SectionName, "y_button", joysticks[i].buttons[CTL_Y_BUTTON]); - 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, "main_x", joysticks[i].axis[CTL_MAIN_X]); - file.Set(SectionName, "main_y", joysticks[i].axis[CTL_MAIN_Y]); - file.Set(SectionName, "sub_x", joysticks[i].axis[CTL_SUB_X]); - file.Set(SectionName, "sub_y", joysticks[i].axis[CTL_SUB_Y]); - file.Set(SectionName, "enabled", joysticks[i].enabled); - file.Set(SectionName, "deadzone", joysticks[i].deadzone); - file.Set(SectionName, "halfpress", joysticks[i].halfpress); - file.Set(SectionName, "joy_id", joysticks[i].ID); - file.Set(SectionName, "controllertype", joysticks[i].controllertype); - file.Set(SectionName, "eventnum", joysticks[i].eventnum); + // Create a section name + SectionName = CheckForDuplicateNames(joyinfo[joysticks[i].ID].Name, Duplicates); + } + + file.Set(SectionName.c_str(), "l_shoulder", joysticks[i].buttons[CTL_L_SHOULDER]); + file.Set(SectionName.c_str(), "r_shoulder", joysticks[i].buttons[CTL_R_SHOULDER]); + file.Set(SectionName.c_str(), "a_button", joysticks[i].buttons[CTL_A_BUTTON]); + file.Set(SectionName.c_str(), "b_button", joysticks[i].buttons[CTL_B_BUTTON]); + file.Set(SectionName.c_str(), "x_button", joysticks[i].buttons[CTL_X_BUTTON]); + file.Set(SectionName.c_str(), "y_button", joysticks[i].buttons[CTL_Y_BUTTON]); + file.Set(SectionName.c_str(), "z_trigger", joysticks[i].buttons[CTL_Z_TRIGGER]); + file.Set(SectionName.c_str(), "start_button", joysticks[i].buttons[CTL_START]); + file.Set(SectionName.c_str(), "dpad", joysticks[i].dpad); + file.Set(SectionName.c_str(), "dpad_up", joysticks[i].dpad2[CTL_D_PAD_UP]); + file.Set(SectionName.c_str(), "dpad_down", joysticks[i].dpad2[CTL_D_PAD_DOWN]); + file.Set(SectionName.c_str(), "dpad_left", joysticks[i].dpad2[CTL_D_PAD_LEFT]); + file.Set(SectionName.c_str(), "dpad_right", joysticks[i].dpad2[CTL_D_PAD_RIGHT]); + file.Set(SectionName.c_str(), "main_x", joysticks[i].axis[CTL_MAIN_X]); + file.Set(SectionName.c_str(), "main_y", joysticks[i].axis[CTL_MAIN_Y]); + file.Set(SectionName.c_str(), "sub_x", joysticks[i].axis[CTL_SUB_X]); + file.Set(SectionName.c_str(), "sub_y", joysticks[i].axis[CTL_SUB_Y]); + + file.Set(SectionName.c_str(), "deadzone", joysticks[i].deadzone); + file.Set(SectionName.c_str(), "halfpress", joysticks[i].halfpress); + + file.Set(SectionName.c_str(), "controllertype", joysticks[i].controllertype); + file.Set(SectionName.c_str(), "eventnum", joysticks[i].eventnum); + + file.Set(SectionName.c_str(), "Diagonal", g_Config.SDiagonal); + file.Set(SectionName.c_str(), "SquareToCircle", g_Config.bSquareToCircle); } file.Save("nJoy.ini"); @@ -118,39 +173,69 @@ void SaveConfig() // Load settings from file // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void LoadConfig() +void Config::Load(bool Config) { IniFile file; file.Load("nJoy.ini"); + std::vector Duplicates; + + file.Get("General", "SaveByID", &g_Config.bSaveByID, false); + file.Get("General", "ShowAdvanced", &g_Config.bShowAdvanced, false); + for (int i = 0; i < 4; i++) { - char SectionName[32]; - sprintf(SectionName, "PAD%i", i+1); + std::string SectionName = StringFromFormat("PAD%i", i+1); - file.Get(SectionName, "l_shoulder", &joysticks[i].buttons[CTL_L_SHOULDER], 4); - file.Get(SectionName, "r_shoulder", &joysticks[i].buttons[CTL_R_SHOULDER], 5); - file.Get(SectionName, "a_button", &joysticks[i].buttons[CTL_A_BUTTON], 0); - file.Get(SectionName, "b_button", &joysticks[i].buttons[CTL_B_BUTTON], 1); - file.Get(SectionName, "x_button", &joysticks[i].buttons[CTL_X_BUTTON], 3); - file.Get(SectionName, "y_button", &joysticks[i].buttons[CTL_Y_BUTTON], 2); - file.Get(SectionName, "z_trigger", &joysticks[i].buttons[CTL_Z_TRIGGER], 7); - file.Get(SectionName, "start_button", &joysticks[i].buttons[CTL_START], 9); - 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, "main_x", &joysticks[i].axis[CTL_MAIN_X], 0); - file.Get(SectionName, "main_y", &joysticks[i].axis[CTL_MAIN_Y], 1); - file.Get(SectionName, "sub_x", &joysticks[i].axis[CTL_SUB_X], 2); - file.Get(SectionName, "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3); - file.Get(SectionName, "enabled", &joysticks[i].enabled, 1); - file.Get(SectionName, "deadzone", &joysticks[i].deadzone, 9); - file.Get(SectionName, "halfpress", &joysticks[i].halfpress, 6); - file.Get(SectionName, "joy_id", &joysticks[i].ID, 0); - file.Get(SectionName, "controllertype", &joysticks[i].controllertype, 0); - file.Get(SectionName, "eventnum", &joysticks[i].eventnum, 0); + // Don't update this when we are loading settings from the ConfigBox + if(!Config) + { + file.Get(SectionName.c_str(), "joy_id", &joysticks[i].ID, 0); + file.Get(SectionName.c_str(), "enabled", &joysticks[i].enabled, 1); + } + + ////////////////////////////////////// + // Load joypad specific settings + // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + // Current joypad device ID: joysticks[i].ID + // Current joypad name: joyinfo[joysticks[i].ID].Name + if(g_Config.bSaveByID) + { + /* Prevent a crash from illegal access to joyinfo that will only have values for + the current amount of connected joysticks */ + if(joysticks[i].ID >= SDL_NumJoysticks()) continue; + + //PanicAlert("%i %i",joysticks[i].ID, SDL_NumJoysticks()); + //PanicAlert("%s", joyinfo[joysticks[i].ID].Name); + + // Create a section name + SectionName = CheckForDuplicateNames(joyinfo[joysticks[i].ID].Name, Duplicates); + } + + file.Get(SectionName.c_str(), "l_shoulder", &joysticks[i].buttons[CTL_L_SHOULDER], 4); + file.Get(SectionName.c_str(), "r_shoulder", &joysticks[i].buttons[CTL_R_SHOULDER], 5); + file.Get(SectionName.c_str(), "a_button", &joysticks[i].buttons[CTL_A_BUTTON], 0); + file.Get(SectionName.c_str(), "b_button", &joysticks[i].buttons[CTL_B_BUTTON], 1); + file.Get(SectionName.c_str(), "x_button", &joysticks[i].buttons[CTL_X_BUTTON], 3); + file.Get(SectionName.c_str(), "y_button", &joysticks[i].buttons[CTL_Y_BUTTON], 2); + file.Get(SectionName.c_str(), "z_trigger", &joysticks[i].buttons[CTL_Z_TRIGGER], 7); + file.Get(SectionName.c_str(), "start_button", &joysticks[i].buttons[CTL_START], 9); + file.Get(SectionName.c_str(), "dpad", &joysticks[i].dpad, 0); + file.Get(SectionName.c_str(), "dpad_up", &joysticks[i].dpad2[CTL_D_PAD_UP], 0); + file.Get(SectionName.c_str(), "dpad_down", &joysticks[i].dpad2[CTL_D_PAD_DOWN], 0); + file.Get(SectionName.c_str(), "dpad_left", &joysticks[i].dpad2[CTL_D_PAD_LEFT], 0); + file.Get(SectionName.c_str(), "dpad_right", &joysticks[i].dpad2[CTL_D_PAD_RIGHT], 0); + file.Get(SectionName.c_str(), "main_x", &joysticks[i].axis[CTL_MAIN_X], 0); + file.Get(SectionName.c_str(), "main_y", &joysticks[i].axis[CTL_MAIN_Y], 1); + file.Get(SectionName.c_str(), "sub_x", &joysticks[i].axis[CTL_SUB_X], 2); + file.Get(SectionName.c_str(), "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3); + file.Get(SectionName.c_str(), "deadzone", &joysticks[i].deadzone, 9); + file.Get(SectionName.c_str(), "halfpress", &joysticks[i].halfpress, 6); + file.Get(SectionName.c_str(), "controllertype", &joysticks[i].controllertype, 0); + file.Get(SectionName.c_str(), "eventnum", &joysticks[i].eventnum, 0); + + file.Get(SectionName.c_str(), "Diagonal", &g_Config.SDiagonal, "100%"); + file.Get(SectionName.c_str(), "SquareToCircle", &g_Config.bSquareToCircle, false); } } diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h new file mode 100644 index 0000000000..09232a1571 --- /dev/null +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h @@ -0,0 +1,39 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _CONFIG_H +#define _CONFIG_H + +struct Config +{ + Config(); + void Load(bool Config = false); + void Save(); + std::string CheckForDuplicateNames(std::string _Name, std::vector &Duplicates); + + // General + bool bShowAdvanced; // Only allow one of these + bool bSaveByID; + + // Joystick + std::string SDiagonal; + bool bSquareToCircle; +}; + +extern Config g_Config; + +#endif // _CONFIG_H diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp index 15536dbfa7..78eb1389c7 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp @@ -41,71 +41,96 @@ extern CONTROLLER_INFO *joyinfo; extern bool emulator_running; //////////////////////// -int main_stick_x = 0; +/* If we don't use this hack m_MainSizer->GetMinSize().GetWidth() will not change + when we enable and disable bShowAdvanced */ +bool StrangeHack = true; // Set PAD status // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void ConfigBox::PadGetStatus() { - // - int _numPAD = 0; - - if (!joysticks[_numPAD].enabled) + // Return if it's not enabled + if (!joysticks[notebookpage].enabled) + { + m_TStatusIn[notebookpage]->SetLabel(wxT("Not enabled")); return; - - // Clear pad status - //memset(_pPADStatus, 0, sizeof(SPADStatus)); - + } // Get pad status - GetJoyState(_numPAD); - - // Reset! - /* - int base = 0x80; - _pPADStatus->stickY = base; - _pPADStatus->stickX = base; - _pPADStatus->substickX = base; - _pPADStatus->substickY = base; - _pPADStatus->button |= PAD_USE_ORIGIN; - */ + GetJoyState(notebookpage); - // Set analog controllers // Set Deadzones perhaps out of function //int deadzone = (int)(((float)(128.00/100.00)) * (float)(joysticks[_numPAD].deadzone+1)); //int deadzone2 = (int)(((float)(-128.00/100.00)) * (float)(joysticks[_numPAD].deadzone+1)); - // 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].axis[CTL_MAIN_X] >> 8); - int main_stick_y = -(joystate[_numPAD].axis[CTL_MAIN_Y] >> 8); - //int sub_stick_x = (joystate[_numPAD].axis[CTL_SUB_X] >> 8); - //int sub_stick_y = -(joystate[_numPAD].axis[CTL_SUB_Y] >> 8); + // Get original values + int main_x = joystate[notebookpage].axis[CTL_MAIN_X]; + int main_y = joystate[notebookpage].axis[CTL_MAIN_Y]; + //int sub_x = (joystate[_numPAD].axis[CTL_SUB_X]; + //int sub_y = -(joystate[_numPAD].axis[CTL_SUB_Y]; - - if (joystate[_numPAD].buttons[CTL_A_BUTTON]) + // Get adjusted values + int main_x_after = main_x, main_y_after = main_y; + if(g_Config.bSquareToCircle) { - PanicAlert(""); - //_pPADStatus->button |= PAD_BUTTON_A; - //_pPADStatus->analogA = 255; // Perhaps support pressure? - for(int i=0; i<4 ;i++) - { - m_bmpDot[i]->SetPosition(wxPoint(main_stick_x += 3, main_stick_y)); - } + std::vector main_xy = Pad_Square_to_Circle(main_x, main_y); + main_x_after = main_xy.at(0); + main_y_after = main_xy.at(1); } - for(int i=0; i<4 ;i++) - { - //m_bmpDot[i]->SetPosition(wxPoint(main_stick_x / 4, main_stick_y / 4)); - } + // + float f_x = main_x / 32767.0; + float f_y = main_y / 32767.0; + float f_x_aft = main_x_after / 32767.0; + float f_y_aft = main_y_after / 32767.0; + + /* + m_pStatusBar->SetLabel(wxString::Format( + "ID:%i | %i %i = %1.2f %1.2f | %i %i = %1.2f %1.2f", + ID, + main_x, main_y, + f_x, f_y, + main_x_after, main_y_after, + f_x_aft, f_y_aft + ));*/ + + m_TStatusIn[notebookpage]->SetLabel(wxString::Format( + wxT("x:%1.2f y:%1.2f"), + f_x, f_y + )); + + m_TStatusOut[notebookpage]->SetLabel(wxString::Format( + wxT("x:%1.2f y:%1.2f"), + f_x_aft, f_y_aft + )); + + // Adjust the values for the plot + int BoxW_ = BoxW - 2; int BoxH_ = BoxH - 2; // Border adjustment + + main_x = (BoxW_ / 2) + (main_x * BoxW_ / (32767 * 2)); + main_y = (BoxH_ / 2) + (main_y * BoxH_ / (32767 * 2)); + + int main_x_out = (BoxW_ / 2) + (main_x_after * BoxW_ / (32767 * 2)); + int main_y_out = (BoxH_ / 2) + (main_y_after * BoxH_ / (32767 * 2)); + + // Adjust the dot + m_bmpDot[notebookpage]->SetPosition(wxPoint(main_x, main_y)); + m_bmpDotOut[notebookpage]->SetPosition(wxPoint(main_x_out, main_y_out)); + } // Populate the advanced tab // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void ConfigBox::Update() { - //PadGetStatus(); + if(StrangeHack) PadGetStatus(); + if(!g_Config.bShowAdvanced) StrangeHack = false; else StrangeHack = true; + + /* + m_pStatusBar->SetLabel(wxString::Format( + "ID: %i %i %i", + m_Joyname[0]->GetSelection(), (int)StrangeHack, (int)g_Config.bShowAdvanced + ));*/ } @@ -113,33 +138,43 @@ void ConfigBox::Update() // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void ConfigBox::CreateAdvancedControls(int i) { - m_pInStatus[i] = new wxPanel(m_Notebook, ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize); + m_pInStatus[i] = new wxPanel(m_Controller[i], ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize); m_bmpSquare[i] = new wxStaticBitmap(m_pInStatus[i], ID_STATUSBMP1 + i, CreateBitmap(), //wxPoint(4, 15), wxSize(70,70)); //wxPoint(4, 20), wxDefaultSize); wxDefaultPosition, wxDefaultSize); m_bmpDot[i] = new wxStaticBitmap(m_pInStatus[i], ID_STATUSDOTBMP1 + i, CreateBitmapDot(), - wxPoint(40, 40), wxDefaultSize); + wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize); + + m_pOutStatus[i] = new wxPanel(m_Controller[i], ID_INSTATUS1 + i, wxDefaultPosition, wxDefaultSize); + m_bmpSquareOut[i] = new wxStaticBitmap(m_pOutStatus[i], ID_STATUSBMP1 + i, CreateBitmap(), + //wxPoint(4, 15), wxSize(70,70)); + //wxPoint(4, 20), wxDefaultSize); + wxDefaultPosition, wxDefaultSize); + + m_bmpDotOut[i] = new wxStaticBitmap(m_pOutStatus[i], ID_STATUSDOTBMP1 + i, CreateBitmapDot(), + wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize); } wxBitmap ConfigBox::CreateBitmap() // Create box { - int w = 70, h = 70; - wxBitmap bitmap(w, h); + BoxW = 70, BoxH = 70; + wxBitmap bitmap(BoxW, BoxH); wxMemoryDC dc; dc.SelectObject(bitmap); // Set outline and fill colors - wxBrush LightBlueBrush(_T("#0383f0")); - wxPen LightBluePen(_T("#80c5fd")); - wxPen LightGrayPen(_T("#909090")); - dc.SetPen(LightGrayPen); + //wxBrush LightBlueBrush(_T("#0383f0")); + //wxPen LightBluePen(_T("#80c5fd")); + //wxPen LightGrayPen(_T("#909090")); + wxPen LightBluePen(_T("#7f9db9")); // Windows XP color + dc.SetPen(LightBluePen); dc.SetBrush(*wxWHITE_BRUSH); dc.Clear(); - dc.DrawRectangle(0, 0, w, h); + dc.DrawRectangle(0, 0, BoxW, BoxH); dc.SelectObject(wxNullBitmap); return bitmap; } @@ -152,11 +187,11 @@ wxBitmap ConfigBox::CreateBitmapDot() // Create dot dc.SelectObject(bitmap); // Set outline and fill colors - wxBrush LightBlueBrush(_T("#0383f0")); - wxPen LightBluePen(_T("#80c5fd")); - wxPen LightGrayPen(_T("#909090")); - dc.SetPen(LightGrayPen); - dc.SetBrush(*wxWHITE_BRUSH); + //wxBrush RedBrush(_T("#0383f0")); + //wxPen RedPen(_T("#80c5fd")); + //wxPen LightGrayPen(_T("#909090")); + dc.SetPen(*wxRED_PEN); + dc.SetBrush(*wxRED_BRUSH); dc.Clear(); dc.DrawRectangle(0, 0, w, h); diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp index 87b41d5b1f..e8950ac21c 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp @@ -33,7 +33,9 @@ ////////////////////////////////////////////////////////////////////////////////////////// // Include // ŻŻŻŻŻŻŻŻŻ -#include "ConfigBox.h" +#include "math.h" // System + +#include "ConfigBox.h" // Local #include "../nJoy.h" #include "Images/controller.xpm" @@ -61,8 +63,14 @@ BEGIN_EVENT_TABLE(ConfigBox,wxDialog) EVT_BUTTON(ID_CANCEL, ConfigBox::CancelClick) EVT_COMBOBOX(IDC_JOYNAME, ConfigBox::ChangeJoystick) EVT_COMBOBOX(IDC_CONTROLTYPE, ConfigBox::ChangeControllertype) + EVT_CHECKBOX(IDC_JOYATTACH, ConfigBox::EnableDisable) EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, ConfigBox::NotebookPageChanged) + EVT_CHECKBOX(IDC_SAVEBYID, ConfigBox::ChangeSettings) // Settings + EVT_CHECKBOX(IDC_SHOWADVANCED, ConfigBox::ChangeSettings) + EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, ConfigBox::ChangeSettings) + EVT_CHECKBOX(IDCB_MAINSTICK_S_TO_C, ConfigBox::ChangeSettings) + EVT_BUTTON(IDB_SHOULDER_L, ConfigBox::GetButtons) EVT_BUTTON(IDB_SHOULDER_R, ConfigBox::GetButtons) EVT_BUTTON(IDB_BUTTON_A, ConfigBox::GetButtons) @@ -94,33 +102,199 @@ ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title, , m_timer(this) #endif { + notebookpage = 0; CreateGUIControls(); #if wxUSE_TIMER - m_timer.Start(1000); + m_timer.Start( floor((double)(1000 / 30)) ); #endif + + } ConfigBox::~ConfigBox() { // empty -} +} + +// Close window +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::OnClose(wxCloseEvent& /*event*/) +{ + EndModal(0); + if(!emulator_running) PAD_Shutdown(); // Close pads, unless we are running a game +} + +// Call about dialog +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::AboutClick(wxCommandEvent& event) +{ + #ifdef _WIN32 + wxWindow win; + win.SetHWND((WXHWND)this->GetHWND()); + win.Enable(false); + + AboutBox frame(&win); + frame.ShowModal(); + + win.Enable(true); + win.SetHWND(0); + #else + AboutBox frame(NULL); + frame.ShowModal(); + #endif +} + +// Click OK +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::OKClick(wxCommandEvent& event) +{ + if (event.GetId() == ID_OK) + { + for(int i=0; i<4 ;i++) GetControllerAll(i); // Update joysticks array + g_Config.Save(); // Save settings + g_Config.Load(); // Reload settings + Close(); // Call OnClose() + } +} + +// Click Cancel +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::CancelClick(wxCommandEvent& event) +{ + if (event.GetId() == ID_CANCEL) + { + g_Config.Load(); // Reload settings + Close(); // Call OnClose() + } +} ////////////////////////////////// +// Change settings +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::ChangeSettings( wxCommandEvent& event ) +{ + switch(event.GetId()) + { + case IDC_SAVEBYID: + g_Config.bSaveByID = m_CBSaveByID[notebookpage]->IsChecked(); + break; + + case IDC_SHOWADVANCED: + g_Config.bShowAdvanced = m_CBShowAdvanced[notebookpage]->IsChecked(); + for(int i = 0; i < 4; i++) + { + m_CBShowAdvanced[i]->SetValue(g_Config.bShowAdvanced); + m_sMainRight[i]->Show(g_Config.bShowAdvanced); + } + SizeWindow(); + break; + + case IDCB_MAINSTICK_DIAGONAL: + g_Config.SDiagonal = m_CoBDiagonal[notebookpage]->GetLabel().mb_str(); + + case IDCB_MAINSTICK_S_TO_C: + g_Config.bSquareToCircle = m_CBS_to_C[notebookpage]->IsChecked(); + } +} + + +// Enable or disable joystick and update the GUI +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::EnableDisable(wxCommandEvent& event) +{ + // Update the enable / disable status + DoEnableDisable(notebookpage); + +} +void ConfigBox::DoEnableDisable(int _notebookpage) +{ +#ifdef _WIN32 // There is no FindItem in linux so this doesn't work + // Update the enable / disable status + joysticks[_notebookpage].enabled = m_Joyattach[_notebookpage]->GetValue(); + + // Enable or disable all buttons + for(int i = IDB_SHOULDER_L; i < (IDB_SHOULDER_L + 13 + 4); i++) + { + m_Controller[_notebookpage]->FindItem(i)->Enable(joysticks[_notebookpage].enabled); + } + + // Enable or disable settings controls + m_Controller[_notebookpage]->FindItem(IDC_DEADZONE)->Enable(joysticks[_notebookpage].enabled); + m_Controller[_notebookpage]->FindItem(IDC_CONTROLTYPE)->Enable(joysticks[_notebookpage].enabled); + + // General settings + m_CBSaveByID[_notebookpage]->SetValue(g_Config.bSaveByID); + m_CBShowAdvanced[_notebookpage]->SetValue(g_Config.bShowAdvanced); + + // Advanced settings + m_CoBDiagonal[notebookpage]->SetValue(wxString::FromAscii(g_Config.SDiagonal.c_str())); + m_CBS_to_C[notebookpage]->SetValue(g_Config.bSquareToCircle); + + m_Controller[_notebookpage]->Refresh(); // Repaint the background +#endif +} + + +// Notebook page changed +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::NotebookPageChanged(wxNotebookEvent& event) +{ + notebookpage = event.GetSelection(); +} + + +// Change Joystick. Load saved settings. +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void ConfigBox::ChangeJoystick(wxCommandEvent& event) +{ + // Save potential changes + if(g_Config.bSaveByID) + { + int Tmp = joysticks[notebookpage].ID; // Don't update the ID + GetControllerAll(notebookpage); + joysticks[notebookpage].ID = Tmp; + g_Config.Save(); + } + + //PanicAlert("%i", m_Joyname[notebookpage]->GetSelection()); + + // Update the ID for the virtual device to a new physical device + joysticks[notebookpage].ID = m_Joyname[notebookpage]->GetSelection(); + + //PanicAlert("%i %i", joysticks[notebookpage].ID, notebookpage); + + // Load device settings + if(g_Config.bSaveByID) + { + g_Config.Load(true); // Then load the current + SetControllerAll(notebookpage); + } + + // Remap the controller to + if (joysticks[notebookpage].enabled) + { + if (SDL_JoystickOpened(notebookpage)) SDL_JoystickClose(joystate[notebookpage].joy); + joystate[notebookpage].joy = SDL_JoystickOpen(joysticks[notebookpage].ID); + } + +} + + // Populate the config window // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void ConfigBox::OnPaint( wxPaintEvent &event ) { event.Skip(); - for(int i=0; i<4 ;i++) - { - wxPaintDC dcWin(m_pKeys[i]); - PrepareDC( dcWin ); + wxPaintDC dcWin(m_pKeys[notebookpage]); + PrepareDC( dcWin ); + if(joysticks[notebookpage].enabled) dcWin.DrawBitmap( WxStaticBitmap1_BITMAP, 94, 0, true ); - } + else + dcWin.DrawBitmap( WxStaticBitmap1_BITMAPGray, 94, 0, true ); } // Populate the config window @@ -136,9 +310,6 @@ void ConfigBox::CreateGUIControls() SetIcon(wxNullIcon); //WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM); - - - //WxStaticBitmap1_BITMAP = new WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM); #ifndef _WIN32 @@ -164,14 +335,21 @@ void ConfigBox::CreateGUIControls() m_Notebook->AddPage(m_Controller[2], wxT("Controller 3")); m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize); m_Notebook->AddPage(m_Controller[3], wxT("Controller 4")); - - // Add controls - wxArrayString arrayStringFor_Joyname; - wxArrayString arrayStringFor_Controltype; - wxArrayString arrayStringFor_Deadzone; - // Search for devices and add the to the device list - if(Search_Devices()) + + // Define bitmap for EVT_PAINT + WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM); + + // Gray version + wxImage WxImageGray = WxStaticBitmap1_BITMAP.ConvertToImage(); + WxImageGray = WxImageGray.ConvertToGreyscale(); + WxStaticBitmap1_BITMAPGray = wxBitmap(WxImageGray); + + // -------------------------------------------------------------------- + // Search for devices and add them to the device list + // ----------------------------- + wxArrayString arrayStringFor_Joyname; // The string array + if(SDL_NumJoysticks() > 0) { for(int x = 0; x < SDL_NumJoysticks(); x++) { @@ -183,21 +361,27 @@ void ConfigBox::CreateGUIControls() arrayStringFor_Joyname.Add(wxString::FromAscii("No Joystick detected!")); } + // -------------------------------------------------------------------- + // Populate the controller type list + // ----------------------------- + wxArrayString arrayStringFor_Controltype; arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_JOYSTICK])); arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_JOYSTICK_NO_HAT])); // arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_JOYSTICK_XBOX360])); // arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_KEYBOARD])); + + // -------------------------------------------------------------------- + // Populate the deadzone list + // ----------------------------- char buffer [8]; + wxArrayString arrayStringFor_Deadzone; for(int x = 1; x <= 100; x++) { sprintf (buffer, "%d %%", x); arrayStringFor_Deadzone.Add(wxString::FromAscii(buffer)); } - - // Define bitmap for EVT_PAINT - WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM); - + // Populate all four pages for(int i=0; i<4 ;i++) @@ -319,12 +503,13 @@ void ConfigBox::CreateGUIControls() // ----------------------------- // Groups #ifdef _WIN32 - m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(476, 21), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname")); - m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxDefaultPosition, wxSize(109, 25), 0, wxDefaultValidator, wxT("Controller attached")); + m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, arrayStringFor_Joyname[0], wxDefaultPosition, wxSize(476, 21), arrayStringFor_Joyname, wxCB_READONLY); + m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxDefaultPosition, wxSize(109, 25)); #else - m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(450, 25), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname")); + m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, arrayStringFor_Joyname[0], wxDefaultPosition, wxSize(450, 25), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname")); m_Joyattach[i] = new wxCheckBox(m_Controller[i], IDC_JOYATTACH, wxT("Controller attached"), wxDefaultPosition, wxSize(140, 25), 0, wxDefaultValidator, wxT("Controller attached")); #endif + m_Joyattach[i]->SetToolTip(wxString::Format(wxT("Decide if Controller %i shall be detected by the game."), i + 1)); m_gJoyname[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Controller:")); m_gJoyname[i]->Add(m_Joyname[i], 0, (wxLEFT | wxRIGHT), 5); @@ -333,7 +518,7 @@ void ConfigBox::CreateGUIControls() // -------------------------------------------------------------------- // Populate settings sizer // ----------------------------- - + // Extra settings members m_gGBExtrasettings[i] = new wxGridBagSizer(0, 0); m_JoyButtonHalfpress[i] = new wxTextCtrl(m_Controller[i], ID_BUTTONHALFPRESS, wxT("0"), wxDefaultPosition, wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); @@ -360,38 +545,113 @@ void ConfigBox::CreateGUIControls() // Populate controller typ m_gControllertype[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Controller type")); - #ifdef _WIN32 - m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, wxEmptyString, wxDefaultPosition, wxSize(131, 21), arrayStringFor_Controltype, 0, wxDefaultValidator, wxT("m_Controltype")); - #else - m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, wxEmptyString, wxDefaultPosition, wxSize(150, 25), arrayStringFor_Controltype, 0, wxDefaultValidator, wxT("m_Controltype")); - #endif + m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, arrayStringFor_Controltype[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_Controltype, wxCB_READONLY); m_gControllertype[i]->Add(m_Controltype[i], 0, wxEXPAND | wxALL, 3); - // Populate input status - /* - m_gStatusIn[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("In")); - CreateAdvancedControls(i); - m_gStatusIn[i]->Add(m_pInStatus[i], 0, wxALL, 0); - */ - + // Populate general settings + m_gGenSettings[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Settings") ); + m_CBSaveByID[i] = new wxCheckBox(m_Controller[i], IDC_SAVEBYID, wxT("Save by ID"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + m_CBShowAdvanced[i] = new wxCheckBox(m_Controller[i], IDC_SHOWADVANCED, wxT("Show advanced settings"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + m_gGenSettings[i]->Add(m_CBSaveByID[i], 0, wxEXPAND | wxALL, 3); + m_gGenSettings[i]->Add(m_CBShowAdvanced[i], 0, wxEXPAND | wxALL, 3); + m_CBSaveByID[i]->SetToolTip(wxString::Format(wxT( + "Map these settings to the selected controller device instead of to the" + "\nselected controller number (%i). This may be a more convenient way" + "\nto save your settings if you have multiple controllers.") + , i+1 + )); + // Populate settings m_sSettings[i] = new wxBoxSizer ( wxHORIZONTAL ); m_sSettings[i]->Add(m_gExtrasettings[i], 0, wxEXPAND | wxALL, 0); m_sSettings[i]->Add(m_gControllertype[i], 0, wxEXPAND | wxLEFT, 5); - //m_sSettings[i]->Add(m_gStatusIn[i], 0, wxLEFT, 5); + m_sSettings[i]->Add(m_gGenSettings[i], 0, wxEXPAND | wxLEFT, 5); + + + ////////////////////////////////////// + // Populate advanced settings + // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + + // Populate input status + /**/ + // Input status text + m_TStatusIn[i] = new wxStaticText(m_Controller[i], IDT_STATUS_IN, wxT("In")); + m_TStatusOut[i] = new wxStaticText(m_Controller[i], IDT_STATUS_OUT, wxT("Out")); + + m_gStatusIn[i] = new wxStaticBoxSizer( wxHORIZONTAL, m_Controller[i], wxT("Main-stick (In) (Out)")); + CreateAdvancedControls(i); + m_GBAdvancedMainStick[i] = new wxGridBagSizer(0, 0); + + m_GBAdvancedMainStick[i]->Add(m_pInStatus[i], wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 0); + m_GBAdvancedMainStick[i]->Add(m_pOutStatus[i], wxGBPosition(0, 1), wxGBSpan(1, 1), wxLEFT, 5); + m_GBAdvancedMainStick[i]->Add(m_TStatusIn[i], wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL, 0); + m_GBAdvancedMainStick[i]->Add(m_TStatusOut[i], wxGBPosition(1, 1), wxGBSpan(1, 1), wxLEFT, 5); + + m_gStatusIn[i]->Add(m_GBAdvancedMainStick[i], 0, wxLEFT, 5); + + // Populate input status settings + + // The label + m_STDiagonal[i] = new wxStaticText(m_Controller[i], IDT_MAINSTICK_DIAGONAL, wxT("Diagonal")); + m_STDiagonal[i]->SetToolTip(wxT( + "To produce a smooth circle in the 'Out' window you have to manually set" + "\nyour diagonal values here from the 'In' window." + )); + + // The drop down menu + m_gStatusInSettings[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Main-stick settings")); + m_gStatusInSettingsH[i] = new wxBoxSizer(wxHORIZONTAL); + wxArrayString asStatusInSet; + asStatusInSet.Add(wxT("100%")); + asStatusInSet.Add(wxT("95%")); + asStatusInSet.Add(wxT("90%")); + asStatusInSet.Add(wxT("85%")); + m_CoBDiagonal[i] = new wxComboBox(m_Controller[i], IDCB_MAINSTICK_DIAGONAL, asStatusInSet[0], wxDefaultPosition, wxDefaultSize, asStatusInSet, wxCB_READONLY); + + // The checkbox + m_CBS_to_C[i] = new wxCheckBox(m_Controller[i], IDCB_MAINSTICK_S_TO_C, wxT("Square-to-circle")); + + m_gStatusInSettings[i]->Add(m_CBS_to_C[i], 0, (wxALL), 4); + m_gStatusInSettings[i]->Add(m_gStatusInSettingsH[i], 0, (wxLEFT | wxRIGHT | wxBOTTOM), 4); + + m_gStatusInSettingsH[i]->Add(m_STDiagonal[i], 0, wxTOP, 3); + m_gStatusInSettingsH[i]->Add(m_CoBDiagonal[i], 0, wxLEFT, 3); + + + + + ////////////////////////////////////// + // Populate sizers + // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + + // -------------------------------------------------------------------- + // Populate main left sizer + // ----------------------------- + m_sMainLeft[i] = new wxBoxSizer(wxVERTICAL); + m_sMainLeft[i]->Add(m_gJoyname[i], 0, wxEXPAND | (wxALL), 5); + m_sMainLeft[i]->Add(m_sKeys[i], 1, wxEXPAND | (wxLEFT | wxRIGHT), 5); + m_sMainLeft[i]->Add(m_sSettings[i], 0, wxEXPAND | (wxALL), 5); + + // -------------------------------------------------------------------- + // Populate main right sizer + // ----------------------------- + m_sMainRight[i] = new wxBoxSizer(wxVERTICAL); + m_sMainRight[i]->Add(m_gStatusIn[i], 0, wxEXPAND | (wxLEFT), 2); + m_sMainRight[i]->Add(m_gStatusInSettings[i], 0, wxEXPAND | (wxLEFT | wxTOP), 2); // -------------------------------------------------------------------- // Populate main sizer // ----------------------------- - m_sMain[i] = new wxBoxSizer(wxVERTICAL); - m_sMain[i]->Add(m_gJoyname[i], 0, wxEXPAND | (wxALL), 5); - m_sMain[i]->Add(m_sKeys[i], 1, wxEXPAND | (wxLEFT | wxRIGHT), 5); - m_sMain[i]->Add(m_sSettings[i], 0, wxEXPAND | (wxALL), 5); + m_sMain[i] = new wxBoxSizer(wxHORIZONTAL); + m_sMain[i]->Add(m_sMainLeft[i], 0, wxEXPAND | (wxALL), 0); + m_sMain[i]->Add(m_sMainRight[i], 0, wxEXPAND | (wxRIGHT | wxTOP), 5); m_Controller[i]->SetSizer(m_sMain[i]); // Set the main sizer + // Show or hide it. We have to do this after we add it to its sizer + m_sMainRight[i]->Show(g_Config.bShowAdvanced); - // Disable when running + // Don't allow these changes when running if(emulator_running) { m_Joyname[i]->Enable(false); @@ -399,8 +659,11 @@ void ConfigBox::CreateGUIControls() m_Controltype[i]->Enable(false); } - // Set dialog items + // Set dialog items from saved values SetControllerAll(i); + + // Update GUI + DoEnableDisable(i); } // end of loop @@ -417,516 +680,26 @@ void ConfigBox::CreateGUIControls() // -------------------------------------------------------------------- // Populate master sizer. // ----------------------------- - wxBoxSizer * m_MainSizer = new wxBoxSizer(wxVERTICAL); + m_MainSizer = new wxBoxSizer(wxVERTICAL); m_MainSizer->Add(m_Notebook, 0, wxEXPAND | wxALL, 5); m_MainSizer->Add(m_sButtons, 1, wxEXPAND | ( wxLEFT | wxRIGHT | wxBOTTOM), 5); this->SetSizer(m_MainSizer); + // -------------------------------------------------------------------- + // Debugging + // ----------------------------- + //m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(100, 510), wxDefaultSize); + //m_pStatusBar2 = new wxStaticText(this, IDT_DEBUGGING2, wxT("Debugging2"), wxPoint(100, 530), wxDefaultSize); + //m_pStatusBar->SetLabel(wxString::Format("Debugging text")); + + // -------------------------------------------------------------------- // Set window size - SetClientSize(m_MainSizer->GetMinSize().GetWidth(), m_MainSizer->GetMinSize().GetHeight()); + // ----------------------------- + SizeWindow(); Center(); } - -// Close window -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::OnClose(wxCloseEvent& /*event*/) +void ConfigBox::SizeWindow() { - EndModal(0); -} - - -// Call about dialog -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::AboutClick(wxCommandEvent& event) -{ - #ifdef _WIN32 - wxWindow win; - win.SetHWND((WXHWND)this->GetHWND()); - win.Enable(false); - - AboutBox frame(&win); - frame.ShowModal(); - - win.Enable(true); - win.SetHWND(0); - #else - AboutBox frame(NULL); - frame.ShowModal(); - #endif -} - - -void ConfigBox::OKClick(wxCommandEvent& event) -{ - if (event.GetId() == ID_OK) - { - for(int i=0; i<4 ;i++) - GetControllerAll(i); - SaveConfig(); // save settings - LoadConfig(); // reload settings - Close(); - } -} - -void ConfigBox::CancelClick(wxCommandEvent& event) -{ - if (event.GetId() == ID_CANCEL) - { - LoadConfig(); // reload settings - Close(); - } -} - -// Set dialog items -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::SetControllerAll(int controller) -{ - // http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString - wxString tmp; - - m_Joyname[controller]->SetSelection(joysticks[controller].ID); - - tmp << joysticks[controller].buttons[CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].buttons[CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear(); - - tmp << joysticks[controller].buttons[CTL_A_BUTTON]; m_JoyButtonA[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].buttons[CTL_B_BUTTON]; m_JoyButtonB[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].buttons[CTL_X_BUTTON]; m_JoyButtonX[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].buttons[CTL_Y_BUTTON]; m_JoyButtonY[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].buttons[CTL_Z_TRIGGER]; m_JoyButtonZ[controller]->SetValue(tmp); tmp.clear(); - - tmp << joysticks[controller].buttons[CTL_START]; m_JoyButtonStart[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].halfpress; m_JoyButtonHalfpress[controller]->SetValue(tmp); tmp.clear(); - - tmp << joysticks[controller].axis[CTL_MAIN_X]; m_JoyAnalogMainX[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].axis[CTL_MAIN_Y]; m_JoyAnalogMainY[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].axis[CTL_SUB_X]; m_JoyAnalogSubX[controller]->SetValue(tmp); tmp.clear(); - tmp << joysticks[controller].axis[CTL_SUB_Y]; m_JoyAnalogSubY[controller]->SetValue(tmp); tmp.clear(); - - if(joysticks[controller].enabled) - m_Joyattach[controller]->SetValue(TRUE); - else - m_Joyattach[controller]->SetValue(FALSE); - - m_Controltype[controller]->SetSelection(joysticks[controller].controllertype); - m_Deadzone[controller]->SetSelection(joysticks[controller].deadzone); - - UpdateVisibleItems(controller); - - if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK) - { - tmp << joysticks[controller].dpad; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear(); - } - 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(); - } -} - -// Get dialog items. Collect button identification. -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::GetControllerAll(int controller) -{ - wxString tmp; - long value; - - joysticks[controller].ID = m_Joyname[controller]->GetSelection(); - - m_JoyShoulderL[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_L_SHOULDER] = value; tmp.clear(); - m_JoyShoulderR[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_R_SHOULDER] = value; tmp.clear(); - - m_JoyButtonA[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_A_BUTTON] = value; tmp.clear(); - m_JoyButtonB[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_B_BUTTON] = value; tmp.clear(); - m_JoyButtonX[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_X_BUTTON] = value; tmp.clear(); - m_JoyButtonY[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_Y_BUTTON] = value; tmp.clear(); - m_JoyButtonZ[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_Z_TRIGGER] = value; tmp.clear(); - m_JoyButtonStart[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_START] = value; tmp.clear(); - - m_JoyButtonHalfpress[controller]->GetValue().ToLong(&value); joysticks[controller].halfpress = value; tmp.clear(); - - if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK) - { - m_JoyDpadUp[controller]->GetValue().ToLong(&value); joysticks[controller].dpad = value; tmp.clear(); - } - else - { - m_JoyDpadUp[controller]->GetValue().ToLong(&value); joysticks[controller].dpad2[CTL_D_PAD_UP] = value; tmp.clear(); - m_JoyDpadDown[controller]->GetValue().ToLong(&value); joysticks[controller].dpad2[CTL_D_PAD_DOWN] = value; tmp.clear(); - m_JoyDpadLeft[controller]->GetValue().ToLong(&value); joysticks[controller].dpad2[CTL_D_PAD_LEFT] = value; tmp.clear(); - m_JoyDpadRight[controller]->GetValue().ToLong(&value); joysticks[controller].dpad2[CTL_D_PAD_RIGHT] = value; tmp.clear(); - } - - m_JoyAnalogMainX[controller]->GetValue().ToLong(&value); joysticks[controller].axis[CTL_MAIN_X] = value; tmp.clear(); - m_JoyAnalogMainY[controller]->GetValue().ToLong(&value); joysticks[controller].axis[CTL_MAIN_Y] = value; tmp.clear(); - m_JoyAnalogSubX[controller]->GetValue().ToLong(&value); joysticks[controller].axis[CTL_SUB_X] = value; tmp.clear(); - m_JoyAnalogSubY[controller]->GetValue().ToLong(&value); joysticks[controller].axis[CTL_SUB_Y] = value; tmp.clear(); - - joysticks[controller].enabled = m_Joyattach[controller]->GetValue(); - - joysticks[controller].controllertype = m_Controltype[controller]->GetSelection(); - joysticks[controller].deadzone = m_Deadzone[controller]->GetSelection(); -} - - -void ConfigBox::UpdateVisibleItems(int controller) -{ - if(joysticks[controller].controllertype) - { - m_JoyDpadDown[controller]->Show(TRUE); - m_JoyDpadLeft[controller]->Show(TRUE); - m_JoyDpadRight[controller]->Show(TRUE); - - m_bJoyDpadDown[controller]->Show(TRUE); - m_bJoyDpadLeft[controller]->Show(TRUE); - m_bJoyDpadRight[controller]->Show(TRUE); - - m_textDpadUp[controller]->Show(TRUE); - m_textDpadDown[controller]->Show(TRUE); - m_textDpadLeft[controller]->Show(TRUE); - m_textDpadRight[controller]->Show(TRUE); - } - else - { - m_JoyDpadDown[controller]->Show(FALSE); - m_JoyDpadLeft[controller]->Show(FALSE); - m_JoyDpadRight[controller]->Show(FALSE); - - m_bJoyDpadDown[controller]->Show(FALSE); - m_bJoyDpadLeft[controller]->Show(FALSE); - m_bJoyDpadRight[controller]->Show(FALSE); - - m_textDpadUp[controller]->Show(FALSE); - m_textDpadDown[controller]->Show(FALSE); - m_textDpadLeft[controller]->Show(FALSE); - m_textDpadRight[controller]->Show(FALSE); - } -} - -void ConfigBox::ChangeJoystick(wxCommandEvent& event) -{ - joysticks[0].ID = m_Joyname[0]->GetSelection(); - joysticks[1].ID = m_Joyname[1]->GetSelection(); - joysticks[2].ID = m_Joyname[2]->GetSelection(); - joysticks[3].ID = m_Joyname[3]->GetSelection(); -} - -void ConfigBox::ChangeControllertype(wxCommandEvent& event) -{ - joysticks[0].controllertype = m_Controltype[0]->GetSelection(); - joysticks[1].controllertype = m_Controltype[1]->GetSelection(); - joysticks[2].controllertype = m_Controltype[2]->GetSelection(); - joysticks[3].controllertype = m_Controltype[3]->GetSelection(); - - for(int i=0; i<4 ;i++) UpdateVisibleItems(i); -} - -void ConfigBox::NotebookPageChanged(wxNotebookEvent& event) -{ - notebookpage = event.GetSelection(); -} - -void ConfigBox::SetButtonText(int id, char text[128]) -{ - int controller = notebookpage; - - switch(id) - { - case IDB_SHOULDER_L: - { - m_JoyShoulderL[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_SHOULDER_R: - { - m_JoyShoulderR[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTON_A: - { - m_JoyButtonA[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTON_B: - { - m_JoyButtonB[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTON_X: - { - m_JoyButtonX[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTON_Y: - { - m_JoyButtonY[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTON_Z: - { - m_JoyButtonZ[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTONSTART: - { - m_JoyButtonStart[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_BUTTONHALFPRESS: - { - m_JoyButtonHalfpress[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_DPAD_UP: - { - m_JoyDpadUp[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_DPAD_DOWN: - { - m_JoyDpadDown[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_DPAD_LEFT: - { - m_JoyDpadLeft[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_DPAD_RIGHT: - { - m_JoyDpadRight[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_ANALOG_MAIN_X: - { - m_JoyAnalogMainX[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_ANALOG_MAIN_Y: - { - m_JoyAnalogMainY[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_ANALOG_SUB_X: - { - m_JoyAnalogSubX[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - case IDB_ANALOG_SUB_Y: - { - m_JoyAnalogSubY[controller]->SetValue(wxString::FromAscii(text)); - } - break; - - default: - break; - } -} - - -// Wait for button press -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::GetButtons(wxCommandEvent& event) -{ - int ID = event.GetId(); - int controller = notebookpage; - - // DPAD type check! - if(ID == IDB_DPAD_UP) - if(joysticks[controller].controllertype == 0) - { - GetHats(ID); - return; - } - - SDL_Joystick *joy = SDL_JoystickOpen(joysticks[controller].ID); - - char format[128]; - int buttons = SDL_JoystickNumButtons(joy); - bool waiting = true; - bool succeed = false; - int pressed = 0; - - int counter1 = 0; - int counter2 = 10; - - sprintf(format, "[%d]", counter2); - SetButtonText(ID, format); - wxWindow::Update(); // win only? doesnt seem to work in linux... - - while(waiting) - { - SDL_JoystickUpdate(); - for(int b = 0; b < buttons; b++) - { - if(SDL_JoystickGetButton(joy, b)) - { - pressed = b; - waiting = false; - succeed = true; - break; - } - } - - counter1++; - if(counter1==100) - { - counter1=0; - counter2--; - - sprintf(format, "[%d]", counter2); - SetButtonText(ID, format); - wxWindow::Update(); // win only? doesnt seem to work in linux... - - if(counter2<0) - waiting = false; - } - SLEEP(10); - } - - sprintf(format, "%d", succeed ? pressed : -1); - SetButtonText(ID, format); - - if(SDL_JoystickOpened(joysticks[controller].ID)) - SDL_JoystickClose(joy); -} - -// Wait for D-Pad -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::GetHats(int ID) -{ - int controller = notebookpage; - - SDL_Joystick *joy; - joy=SDL_JoystickOpen(joysticks[controller].ID); - - char format[128]; - int hats = SDL_JoystickNumHats(joy); - bool waiting = true; - bool succeed = false; - int pressed = 0; - - int counter1 = 0; - int counter2 = 10; - - sprintf(format, "[%d]", counter2); - SetButtonText(ID, format); - wxWindow::Update(); // win only? doesnt seem to work in linux... - - while(waiting) - { - SDL_JoystickUpdate(); - for(int b = 0; b < hats; b++) - { - if(SDL_JoystickGetHat(joy, b)) - { - pressed = b; - waiting = false; - succeed = true; - break; - } - } - - counter1++; - if(counter1==100) - { - counter1=0; - counter2--; - - sprintf(format, "[%d]", counter2); - SetButtonText(ID, format); - wxWindow::Update(); // win only? doesnt seem to work in linux... - - if(counter2<0) - waiting = false; - } - SLEEP(10); - } - - sprintf(format, "%d", succeed ? pressed : -1); - SetButtonText(ID, format); - - if(SDL_JoystickOpened(joysticks[controller].ID)) - SDL_JoystickClose(joy); -} - -// Wait for Analog -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void ConfigBox::GetAxis(wxCommandEvent& event) -{ - int ID = event.GetId(); - int controller = notebookpage; - - SDL_Joystick *joy; - joy=SDL_JoystickOpen(joysticks[controller].ID); - - char format[128]; - int axes = SDL_JoystickNumAxes(joy); - bool waiting = true; - bool succeed = false; - int pressed = 0; - Sint16 value; - - int counter1 = 0; - int counter2 = 10; - - sprintf(format, "[%d]", counter2); - SetButtonText(ID, format); - wxWindow::Update(); // win only? doesnt seem to work in linux... - - while(waiting) - { - SDL_JoystickUpdate(); - for(int b = 0; b < axes; b++) - { - value = SDL_JoystickGetAxis(joy, b); - if(value < -10000 || value > 10000) - { - pressed = b; - waiting = false; - succeed = true; - break; - } - } - - counter1++; - if(counter1==100) - { - counter1=0; - counter2--; - - sprintf(format, "[%d]", counter2); - SetButtonText(ID, format); - wxWindow::Update(); // win only? doesnt seem to work in linux... - - if(counter2<0) - waiting = false; - } - SLEEP(10); - } - - sprintf(format, "%d", succeed ? pressed : -1); - SetButtonText(ID, format); - - if(SDL_JoystickOpened(joysticks[controller].ID)) - SDL_JoystickClose(joy); + SetClientSize(m_MainSizer->GetMinSize().GetWidth(), m_MainSizer->GetMinSize().GetHeight()); } diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h index ba6b94a8ab..1aaf0910e3 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h @@ -65,19 +65,31 @@ class ConfigBox : public wxDialog void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); } wxTimer m_timer; #endif + + // Debugging + wxStaticText* m_pStatusBar, * m_pStatusBar2; + + // Status window + int BoxW, BoxH; private: wxButton *m_About; wxButton *m_OK; wxButton *m_Cancel; - wxPanel *m_Controller[4]; + wxPanel *m_Controller[4]; // Main containers wxNotebook *m_Notebook; + wxBoxSizer * m_MainSizer; - wxPanel * m_pKeys[4], * m_pInStatus[4]; - wxBitmap WxStaticBitmap1_BITMAP; + wxPanel * m_pKeys[4], * m_pInStatus[4], * m_pOutStatus[4]; + wxBitmap WxStaticBitmap1_BITMAP, WxStaticBitmap1_BITMAPGray; wxStaticBoxSizer * m_sKeys[4]; - wxBoxSizer * m_sMain[4], * m_sSettings[4]; + wxBoxSizer *m_sMain[4], *m_sMainLeft[4], *m_sMainRight[4]; + + + ///////////////////////////// + // Settings + // ŻŻŻŻŻŻŻŻŻ wxComboBox *m_Joyname[4]; wxComboBox *m_Controltype[4]; @@ -86,9 +98,24 @@ class ConfigBox : public wxDialog wxCheckBox *m_Joyattach[4]; wxStaticBoxSizer *m_gJoyname[4]; - wxStaticBoxSizer *m_gExtrasettings[4]; wxGridBagSizer * m_gGBExtrasettings[4]; // Settings + wxBoxSizer* m_sSettings[4]; // Settings + + wxStaticBoxSizer *m_gExtrasettings[4]; wxGridBagSizer * m_gGBExtrasettings[4]; // Extra settings wxStaticBoxSizer *m_gControllertype[4]; - wxStaticBoxSizer *m_gStatusIn[4]; + + wxStaticBoxSizer *m_gGenSettings[4]; // General settings + wxCheckBox *m_CBSaveByID[4], *m_CBShowAdvanced[4]; + + wxStaticBoxSizer *m_gStatusIn[4], *m_gStatusInSettings[4]; // Advanced settings + wxBoxSizer *m_gStatusInSettingsH[4]; + wxGridBagSizer * m_GBAdvancedMainStick[4]; + wxStaticText *m_TStatusIn[4], *m_TStatusOut[4]; + wxComboBox *m_CoBDiagonal[4]; wxCheckBox *m_CBS_to_C[4]; wxStaticText *m_STDiagonal[4]; + + + ///////////////////////////// + // Keys + // ŻŻŻŻŻŻŻŻŻ wxTextCtrl *m_JoyShoulderL[4]; wxTextCtrl *m_JoyShoulderR[4]; @@ -145,7 +172,8 @@ class ConfigBox : public wxDialog wxStaticText *m_textWebsite[4]; wxTextCtrl *m_PlaceholderBMP[4]; - wxStaticBitmap *m_controllerimage[4], *m_bmpSquare[4], *m_bmpDot[4]; + wxStaticBitmap *m_controllerimage[4], + *m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4]; int notebookpage; private: @@ -159,23 +187,32 @@ class ConfigBox : public wxDialog ID_CONTROLLERPAGE2, ID_CONTROLLERPAGE3, ID_CONTROLLERPAGE4, - - ID_INSTATUS1, ID_INSTATUS2, ID_INSTATUS3, ID_INSTATUS4, // Advanced status + ID_CONTROLLERPICTURE, // Background picture ID_KEYSPANEL1, ID_KEYSPANEL2, ID_KEYSPANEL3, ID_KEYSPANEL4, - IDC_JOYNAME, - IDC_CONTROLTYPE, - IDC_DEADZONE, + IDG_JOYSTICK, IDC_JOYNAME, IDC_JOYATTACH, // Controller attached - IDC_JOYATTACH, - IDG_JOYSTICK, - IDG_EXTRASETTINGS, - IDG_CONTROLLERTYPE, - ID_CONTROLLERPICTURE, + IDG_EXTRASETTINGS, IDC_DEADZONE, // Extra settings + + IDG_CONTROLLERTYPE, IDC_CONTROLTYPE, // Controller type + + IDC_SAVEBYID, IDC_SHOWADVANCED, // Settings + + ID_INSTATUS1, ID_INSTATUS2, ID_INSTATUS3, ID_INSTATUS4, // Advanced status ID_STATUSBMP1, ID_STATUSBMP2, ID_STATUSBMP3, ID_STATUSBMP4, ID_STATUSDOTBMP1, ID_STATUSDOTBMP2, ID_STATUSDOTBMP3, ID_STATUSDOTBMP4, + IDT_STATUS_IN, IDT_STATUS_OUT, + // Advaced settings + IDCB_MAINSTICK_DIAGONAL, IDCB_MAINSTICK_S_TO_C, IDT_MAINSTICK_DIAGONAL, + + + // -------------------------------------------------------------------- + // Keys objects + // ----------------------------- + + // Text controls ID_SHOULDER_L = 2000, ID_SHOULDER_R, @@ -197,6 +234,7 @@ class ConfigBox : public wxDialog ID_DPAD_LEFT, ID_DPAD_RIGHT, + // Buttons controls IDB_SHOULDER_L = 3000, IDB_SHOULDER_R, @@ -218,6 +256,7 @@ class ConfigBox : public wxDialog IDB_DPAD_LEFT, IDB_DPAD_RIGHT, + // Text controls IDT_ANALOG_MAIN_X = 4000, IDT_ANALOG_MAIN_Y, IDT_DPAD_UP, @@ -229,6 +268,7 @@ class ConfigBox : public wxDialog IDT_ANALOG_SUB_X, IDT_ANALOG_SUB_Y, IDT_WEBSITE, + IDT_DEBUGGING, IDT_DEBUGGING2, ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values }; @@ -240,9 +280,14 @@ class ConfigBox : public wxDialog void ChangeJoystick(wxCommandEvent& event); void ChangeControllertype(wxCommandEvent& event); + void EnableDisable(wxCommandEvent& event); void DoEnableDisable(int _notebookpage); + + void ChangeSettings(wxCommandEvent& event); // Settings + void ComboChange(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void CreateGUIControls(); void CreateAdvancedControls(int i); + void SizeWindow(); wxBitmap CreateBitmap(); wxBitmap CreateBitmapDot(); void PadGetStatus(); void Update(); diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/Rumble.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/Rumble.cpp index cf99262d55..a3e593b767 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/Rumble.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/Rumble.cpp @@ -143,7 +143,7 @@ void PAD_Rumble(u8 _numPAD, unsigned int _uType, unsigned int _uStrength) // Use PAD rumble // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void PAD_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus) +void Pad_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus) { #ifdef _WIN32 #ifdef USE_RUMBLE_DINPUT_HACK diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/SConscript b/Source/Plugins/Plugin_nJoy_SDL/Src/SConscript index 7d611cc268..8e9806d0d3 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/SConscript +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/SConscript @@ -19,6 +19,7 @@ if padenv['HAVE_WX']: files += [ 'GUI/AboutBox.cpp', 'GUI/ConfigAdvanced.cpp', + 'GUI/ConfigJoypad.cpp', 'GUI/ConfigBox.cpp', ] diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp index 651b15463e..b8b471c7d9 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////////////////// // Project description -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ // Name: nJoy // Description: A Dolphin Compatible Input Plugin // @@ -30,18 +30,42 @@ ////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +// Variables guide +/* ŻŻŻŻŻŻŻŻŻ + + The arrays joysticks[] and joystate[] are numbered 0 to 3 for the four different virtual + controllers. Joysticks[].ID will have the number of the inputs device mapped to that controller, + this value can be between 0 and the total number of connected physical devices. The mapping + is done by PAD_Initialize(), if we want to change that we have to run PAD_Shutdown() and then + run PAD_Initialize() again. + + The joyinfo[] array is for a certain physical device. It's therefore used as + joyinfo[joysticks[controller].ID]. + +////////////////////////*/ + + + +////////////////////////////////////////////////////////////////////////////////////////// // Include -// +// ŻŻŻŻŻŻŻŻŻ #include "nJoy.h" +// Declare config window so that we can write debugging info to it from functions in this file +#if defined(HAVE_WX) && HAVE_WX + ConfigBox* m_frame; +#endif +///////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////// // Variables -// +// ŻŻŻŻŻŻŻŻŻ // Rumble in windows -#define _CONTROLLER_STATE_H // avoid certain declarations in nJoy.h +#define _CONTROLLER_STATE_H // Avoid certain declarations in nJoy.h FILE *pFile; HINSTANCE nJoy_hInst = NULL; CONTROLLER_INFO *joyinfo = 0; @@ -64,7 +88,7 @@ void __Logv(int log, int v, const char *format, ...) {} ////////////////////////////////////////////////////////////////////////////////////////// // wxWidgets -// +// ŻŻŻŻŻŻŻŻŻ #if defined(HAVE_WX) && HAVE_WX class wxDLLApp : public wxApp { @@ -81,7 +105,7 @@ void __Logv(int log, int v, const char *format, ...) {} ////////////////////////////////////////////////////////////////////////////////////////// // DllMain -// +// ŻŻŻŻŻŻŻ #ifdef _WIN32 BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle DWORD dwReason, // reason called @@ -117,10 +141,10 @@ BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle ////////////////////////////////////////////////////////////////////////////////////////// // Input Plugin Functions (from spec's) -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ // Get properties of plugin -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void GetDllInfo(PLUGIN_INFO* _PluginInfo) { _PluginInfo->Version = 0x0100; @@ -138,7 +162,7 @@ void GetDllInfo(PLUGIN_INFO* _PluginInfo) } // Call config dialog -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void DllConfig(HWND _hParent) { #ifdef _WIN32 @@ -148,13 +172,26 @@ void DllConfig(HWND _hParent) return; } - LoadConfig(); // load settings + // Start the pads so we can use them in the configuration and advanced controls + if(!emulator_running) + { + SPADInitialize _PADInitialize; + _PADInitialize.hWnd = NULL; + _PADInitialize.pLog = NULL; + PAD_Initialize(_PADInitialize); + emulator_running = FALSE; // Set it back to false + } - wxWindow win; - win.SetHWND(_hParent); - ConfigBox frame(&win); - frame.ShowModal(); - win.SetHWND(0); + g_Config.Load(); // Load settings + + // We don't need a parent for this wxDialog + //wxWindow win; + //win.SetHWND(_hParent); + //ConfigBox frame(&win); + //win.SetHWND(0); + + m_frame = new ConfigBox(NULL); + m_frame->ShowModal(); #else if (SDL_Init(SDL_INIT_JOYSTICK ) < 0) @@ -163,7 +200,7 @@ void DllConfig(HWND _hParent) return; } - LoadConfig(); // load settings + g_Config.Load(); // load settings #if defined(HAVE_WX) && HAVE_WX ConfigBox frame(NULL); @@ -176,8 +213,9 @@ void DllConfig(HWND _hParent) void DllDebugger(HWND _hParent, bool Show) { } + // Init PAD (start emulation) -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void PAD_Initialize(SPADInitialize _PADInitialize) { emulator_running = TRUE; @@ -185,7 +223,7 @@ void PAD_Initialize(SPADInitialize _PADInitialize) DEBUG_INIT(); #endif - if (SDL_Init(SDL_INIT_JOYSTICK ) < 0) + if (SDL_Init(SDL_INIT_JOYSTICK) < 0) { #ifdef _WIN32 MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR); @@ -199,8 +237,8 @@ void PAD_Initialize(SPADInitialize _PADInitialize) m_hWnd = (HWND)_PADInitialize.hWnd; #endif - LoadConfig(); // Load joystick mapping - Search_Devices(); + Search_Devices(); // Populate joyinfo for all attached devices + g_Config.Load(); // Load joystick mapping, joysticks[].ID etc if (joysticks[0].enabled) joystate[0].joy = SDL_JoystickOpen(joysticks[0].ID); if (joysticks[1].enabled) @@ -211,8 +249,74 @@ void PAD_Initialize(SPADInitialize _PADInitialize) joystate[3].joy = SDL_JoystickOpen(joysticks[3].ID); } + +// Search attached devices. Populate joyinfo for all attached physical devices. +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +int Search_Devices() +{ + // load config + #ifdef _DEBUG + DEBUG_INIT(); + #endif + + int numjoy = SDL_NumJoysticks(); + + if (joyinfo) + { + delete [] joyinfo; + joyinfo = new CONTROLLER_INFO [numjoy]; + } + else + { + joyinfo = new CONTROLLER_INFO [numjoy]; + } + + // Warn the user if no joysticks are detected + if (numjoy == 0) + { + #ifdef _WIN32 + //MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING); + #else + printf("No Joystick detected!\n"); + #endif + return 0; + } + + #ifdef _DEBUG + fprintf(pFile, "Scanning for devices\n"); + fprintf(pFile, "ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ\n"); + #endif + + for(int i = 0; i < numjoy; i++ ) + { + // Open the device to be able to read the values + joyinfo[i].joy = SDL_JoystickOpen(i); + joyinfo[i].ID = i; + joyinfo[i].NumAxes = SDL_JoystickNumAxes(joyinfo[i].joy); + joyinfo[i].NumButtons = SDL_JoystickNumButtons(joyinfo[i].joy); + joyinfo[i].NumBalls = SDL_JoystickNumBalls(joyinfo[i].joy); + joyinfo[i].NumHats = SDL_JoystickNumHats(joyinfo[i].joy); + joyinfo[i].Name = SDL_JoystickName(i); + + #ifdef _DEBUG + fprintf(pFile, "ID: %d\n", i); + fprintf(pFile, "Name: %s\n", joyinfo[i].Name); + fprintf(pFile, "Buttons: %d\n", joyinfo[i].NumButtons); + fprintf(pFile, "Axes: %d\n", joyinfo[i].NumAxes); + fprintf(pFile, "Hats: %d\n", joyinfo[i].NumHats); + fprintf(pFile, "Balls: %d\n\n", joyinfo[i].NumBalls); + #endif + + // We have now read the values we need so we close the device + if (SDL_JoystickOpened(i)) SDL_JoystickClose(joyinfo[i].joy); + } + + return numjoy; +} + + // Shutdown PAD (stop emulation) -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void PAD_Shutdown() { if (joysticks[0].enabled) @@ -244,8 +348,8 @@ void PAD_Shutdown() } -// Set PAD status -// +// Set PAD status. This is called from SerialInterface_Devices.cpp +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) { if (!joysticks[_numPAD].enabled) @@ -257,57 +361,53 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) // Get pad status GetJoyState(_numPAD); - // Reset! - int base = 0x80; - _pPADStatus->stickY = base; - _pPADStatus->stickX = base; - _pPADStatus->substickX = base; - _pPADStatus->substickY = base; + + /////////////////////////////////////////////////// + // Set analog controllers + // ----------- + + // Read values + int i_main_stick_x = joystate[_numPAD].axis[CTL_MAIN_X]; + int i_main_stick_y = -joystate[_numPAD].axis[CTL_MAIN_Y]; + int i_sub_stick_x = joystate[_numPAD].axis[CTL_SUB_X]; + int i_sub_stick_y = -joystate[_numPAD].axis[CTL_SUB_Y]; + + // Check if we should make adjustments + if(g_Config.bSquareToCircle) + { + std::vector main_xy = Pad_Square_to_Circle(i_main_stick_x, i_main_stick_y); + i_main_stick_x = main_xy.at(0); + i_main_stick_y = main_xy.at(1); + } + + // Convert button values from 0xffff to 0xff + u8 main_stick_x = Pad_Convert(i_main_stick_x); + u8 main_stick_y = Pad_Convert(i_main_stick_y); + u8 sub_stick_x = Pad_Convert(i_sub_stick_x); + u8 sub_stick_y = Pad_Convert(i_sub_stick_y); + + // Set Deadzones perhaps out of function + int deadzone = (int)(((float)(128.00/100.00)) * (float)(joysticks[_numPAD].deadzone + 1)); + int deadzone2 = (int)(((float)(-128.00/100.00)) * (float)(joysticks[_numPAD].deadzone + 1)); + + // Send values to Dolpin if they are outside the deadzone + if ((main_stick_x < deadzone2) || (main_stick_x > deadzone)) _pPADStatus->stickX = main_stick_x; + if ((main_stick_y < deadzone2) || (main_stick_y > deadzone)) _pPADStatus->stickY = main_stick_y; + if ((sub_stick_x < deadzone2) || (sub_stick_x > deadzone)) _pPADStatus->substickX = sub_stick_x; + if ((sub_stick_y < deadzone2) || (sub_stick_y > deadzone)) _pPADStatus->substickY = sub_stick_y; + + + /////////////////////////////////////////////////// + // Set buttons + // ----------- + + // The L and R trigger values + int triggervalue = 255; + if (joystate[_numPAD].halfpress) triggervalue = 100; + + // Neutral button value, no button pressed _pPADStatus->button |= PAD_USE_ORIGIN; - // Set analog controllers - // Set Deadzones perhaps out of function - int deadzone = (int)(((float)(128.00/100.00)) * (float)(joysticks[_numPAD].deadzone+1)); - int deadzone2 = (int)(((float)(-128.00/100.00)) * (float)(joysticks[_numPAD].deadzone+1)); - - // 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].axis[CTL_MAIN_X] >> 8); - int main_stick_y = -(joystate[_numPAD].axis[CTL_MAIN_Y] >> 8); - int sub_stick_x = (joystate[_numPAD].axis[CTL_SUB_X] >> 8); - int sub_stick_y = -(joystate[_numPAD].axis[CTL_SUB_Y] >> 8); - - // Quick fix - if (main_stick_x > 127) - main_stick_x = 127; - if (main_stick_y > 127) - main_stick_y = 127; - if (sub_stick_x > 127) - sub_stick_x = 127; - if (sub_stick_y > 127) - sub_stick_y = 127; - - if (main_stick_x < -128) - main_stick_x = -128; - if (main_stick_y < -128) - main_stick_y = -128; - if (sub_stick_x < -128) - sub_stick_x = -128; - if (sub_stick_y < -128) - sub_stick_y = -128; - - // Send values to Dolpin - if ((main_stick_x < deadzone2) || (main_stick_x > deadzone)) _pPADStatus->stickX += main_stick_x; - if ((main_stick_y < deadzone2) || (main_stick_y > deadzone)) _pPADStatus->stickY += main_stick_y; - if ((sub_stick_x < deadzone2) || (sub_stick_x > deadzone)) _pPADStatus->substickX += sub_stick_x; - if ((sub_stick_y < deadzone2) || (sub_stick_y > deadzone)) _pPADStatus->substickY += sub_stick_y; - - int triggervalue = 255; - if (joystate[_numPAD].halfpress) - triggervalue = 100; - - // Set buttons if (joystate[_numPAD].buttons[CTL_L_SHOULDER]) { _pPADStatus->button|=PAD_TRIGGER_L; @@ -345,41 +445,143 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) else { if (joystate[_numPAD].dpad2[CTL_D_PAD_UP]) - _pPADStatus->button|=PAD_BUTTON_UP; + _pPADStatus->button |= PAD_BUTTON_UP; if (joystate[_numPAD].dpad2[CTL_D_PAD_DOWN]) - _pPADStatus->button|=PAD_BUTTON_DOWN; + _pPADStatus->button |= PAD_BUTTON_DOWN; if (joystate[_numPAD].dpad2[CTL_D_PAD_LEFT]) - _pPADStatus->button|=PAD_BUTTON_LEFT; + _pPADStatus->button |= PAD_BUTTON_LEFT; if (joystate[_numPAD].dpad2[CTL_D_PAD_RIGHT]) - _pPADStatus->button|=PAD_BUTTON_RIGHT; + _pPADStatus->button |= PAD_BUTTON_RIGHT; } // _pPADStatus->err = PAD_ERR_NONE; // Use rumble - PAD_Use_Rumble(_numPAD, _pPADStatus); + Pad_Use_Rumble(_numPAD, _pPADStatus); } +////////////////////////////////////////////////////////////////////////////////////////// +// Convert stick values, for example from circle to square analog stick radius +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + +/* Convert stick values. + + The value returned by SDL_JoystickGetAxis is a signed integer s16 + (-32768 to 32767). The value used for the gamecube controller is an unsigned + char u8 (0 to 255) with neutral at 0x80 (128), so that it's equivalent to a signed + -128 to 127. */ +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +u8 Pad_Convert(int _val) +{ + /* If the limits on joystate[].axis[] actually is a u16 then we don't need this + but if it's not actually limited to that we need to apply these limits */ + if(_val > 32767) _val = 32767; // upper limit + if(_val < -32768) _val = -32768; // lower limit + + // Convert (-32768 to 32767) to (-128 to 127) + _val = _val >> 8; + + // Convert (-128 to 127) to (0 to 255) + u8 val = 0x80 + _val; + + return val; +} + + +/* Convert the stick raidus from a circular to a square. I don't know what input values + the actual GC controller produce for the GC, it may be a square, a circle or something + in between. But one thing that is certain is that PC pads differ in their output (as + shown in the list below), so it may be beneficiary to convert whatever radius they + produce to the radius the GC games expect. This is the first implementation of this + that convert a square radius to a circual radius. Use the advanced settings to enable + and calibrate it. + + Observed diagonals: + Perfect circle: 71% = sin(45) + Logitech Dual Action: 100% + Dual Shock 2 (Original) with Super Dual Box Pro: 90% + XBox 360 Wireless: 85% + GameCube Controller (Third Party) with EMS TrioLinker Plus II: 60% +*/ +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +float SquareDistance(float deg) +{ + // See if we have to adjust the angle + deg = abs(deg); + if( (deg > 45 && deg < 135) ) deg = deg - 90; + + float rad = deg * M_PI / 180; + + float val = abs(cos(rad)); + float dist = 1 / val; // Calculate distance from center + + //m_frame->m_pStatusBar2->SetLabel(wxString::Format("Deg:%f Val:%f Dist:%f", deg, val, dist)); + + return dist; +} +std::vector Pad_Square_to_Circle(int _x, int _y) +{ + /* Do we need this? */ + if(_x > 32767) _x = 32767; if(_y > 32767) _y = 32767; // upper limit + if(_x < -32768) _x = -32768; if(_y > 32767) _y = 32767; // lower limit + + /////////////////////////////////////////////////// + // Convert to circle + // ----------- + int Tmp = atoi (g_Config.SDiagonal.substr(0, g_Config.SDiagonal.length() - 1).c_str()); + float Diagonal = Tmp / 100.0; + + // First make a perfect square in case we don't have one already + float OrigDist = sqrt( pow((float)_y, 2) + pow((float)_x, 2) ); // Get current distance + float rad = atan2((float)_y, (float)_x); // Get current angle + float deg = rad * 180 / M_PI; + + // A diagonal of 85% means a distance of 1.20 + float corner_circle_dist = ( Diagonal / sin(45 * M_PI / 180) ); + float SquareDist = SquareDistance(deg); + float adj_ratio1; // The original-to-square distance adjustment + float adj_ratio2 = SquareDist; // The circle-to-square distance adjustment + float final_ratio; // The final adjustment to the current distance + float result_dist; // The resulting distance + + // Calculate the corner-to-square adjustment ratio + if(corner_circle_dist < SquareDist) adj_ratio1 = SquareDist / corner_circle_dist; + else adj_ratio1 = 1; + + // Calculate the resulting distance + result_dist = OrigDist * adj_ratio1 / adj_ratio2; + + float x = result_dist * cos(rad); // calculate x + float y = result_dist * sin(rad); // calculate y + + int int_x = (int)floor(x); + int int_y = (int)floor(y); + + // Debugging + //m_frame->m_pStatusBar2->SetLabel(wxString::Format("%f %f %i", corner_circle_dist, Diagonal, Tmp)); + + std::vector vec; + vec.push_back(int_x); + vec.push_back(int_y); + return vec; +} +////////////////////////////////////////////////////////////////////////////////////////// // Set PAD attached pads -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ unsigned int PAD_GetAttachedPads() { unsigned int connected = 0; - LoadConfig(); + g_Config.Load(); - if (joysticks[0].enabled) - connected |= 1; - if (joysticks[1].enabled) - connected |= 2; - if (joysticks[2].enabled) - connected |= 4; - if (joysticks[3].enabled) - connected |= 8; + if (joysticks[0].enabled) connected |= 1; + if (joysticks[1].enabled) connected |= 2; + if (joysticks[2].enabled) connected |= 4; + if (joysticks[3].enabled) connected |= 8; return connected; } @@ -387,11 +589,11 @@ unsigned int PAD_GetAttachedPads() ////////////////////////////////////////////////////////////////////////////////////////// -// Custom Functions -// +// Read current joystick status +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ // Read buttons status. Called from GetJoyState(). -// +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void ReadButton(int controller, int button) { int ctl_button = joysticks[controller].buttons[button]; @@ -401,8 +603,8 @@ void ReadButton(int controller, int button) } } -// Request joystick state -// +// Request joystick state. The input value "controller" is for a virtual controller 0 to 3. +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void GetJoyState(int controller) { SDL_JoystickUpdate(); @@ -420,8 +622,6 @@ void GetJoyState(int controller) ReadButton(controller, CTL_Y_BUTTON); ReadButton(controller, CTL_Z_TRIGGER); ReadButton(controller, CTL_START); - // Is there a purpose to this alert? - // PanicAlert("%i", CTL_A_BUTTON); // if (joysticks[controller].halfpress < joyinfo[controller].NumButtons) @@ -440,67 +640,4 @@ void GetJoyState(int controller) joystate[controller].dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_RIGHT]); } } - -// Search attached devices -// -int Search_Devices() -{ - // load config - #ifdef _DEBUG - DEBUG_INIT(); - #endif - - int numjoy = SDL_NumJoysticks(); - - if (joyinfo) - { - delete [] joyinfo; - joyinfo = new CONTROLLER_INFO [numjoy]; - } - else - { - joyinfo = new CONTROLLER_INFO [numjoy]; - } - - // Warn the user of no joysticks are detected - if (numjoy == 0) - { - #ifdef _WIN32 - MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING); - #else - printf("No Joystick detected!\n"); - #endif - return 0; - } - - #ifdef _DEBUG - fprintf(pFile, "Scanning for devices\n"); - fprintf(pFile, "\n"); - #endif - - for(int i = 0; i < numjoy; i++ ) - { - joyinfo[i].joy = SDL_JoystickOpen(i); - joyinfo[i].ID = i; - joyinfo[i].NumAxes = SDL_JoystickNumAxes(joyinfo[i].joy); - joyinfo[i].NumButtons = SDL_JoystickNumButtons(joyinfo[i].joy); - joyinfo[i].NumBalls = SDL_JoystickNumBalls(joyinfo[i].joy); - joyinfo[i].NumHats = SDL_JoystickNumHats(joyinfo[i].joy); - joyinfo[i].Name = SDL_JoystickName(i); - - #ifdef _DEBUG - fprintf(pFile, "ID: %d\n", i); - fprintf(pFile, "Name: %s\n", joyinfo[i].Name); - fprintf(pFile, "Buttons: %d\n", joyinfo[i].NumButtons); - fprintf(pFile, "Axes: %d\n", joyinfo[i].NumAxes); - fprintf(pFile, "Hats: %d\n", joyinfo[i].NumHats); - fprintf(pFile, "Balls: %d\n\n", joyinfo[i].NumBalls); - #endif - - // Close if opened - if (SDL_JoystickOpened(i)) - SDL_JoystickClose(joyinfo[i].joy); - } - - return numjoy; -} +////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h index c31c5966ef..973b38d722 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h @@ -32,18 +32,21 @@ // Set this if you want to use the rumble 'hack' for controller one //#define USE_RUMBLE_DINPUT_HACK -#include +#include // System #include #include #include -#include "Common.h" +#include "Common.h" // Common #include "pluginspecs_pad.h" #include "IniFile.h" +#include "Config.h" // Local + #if defined(HAVE_WX) && HAVE_WX -#include "GUI/AboutBox.h" -#include "GUI/ConfigBox.h" + #include "GUI/AboutBox.h" + #include "GUI/ConfigBox.h" + //extern ConfigBox* m_frame; #endif #ifdef _WIN32 @@ -167,6 +170,7 @@ enum // ŻŻŻŻŻŻŻŻŻ #ifndef _CONTROLLER_STATE_H extern FILE *pFile; + extern CONTROLLER_INFO *joyinfo; extern CONTROLLER_STATE joystate[4]; extern CONTROLLER_MAPPING joysticks[4]; extern HWND m_hWnd; // Handle to window @@ -182,7 +186,9 @@ int Search_Devices(); void DEBUG_INIT(); void DEBUG_QUIT(); -void PAD_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus); // Rumble +void Pad_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus); // Rumble +u8 Pad_Convert(int _val); // Value conversion +std::vector Pad_Square_to_Circle(int _x, int _y); // Value conversion -void SaveConfig(); -void LoadConfig(); +//void SaveConfig(); +//void LoadConfig();