diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp index 2f7b2e89f6..e5aca13a7d 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.cpp @@ -62,6 +62,7 @@ BEGIN_EVENT_TABLE(ConfigBox,wxDialog) EVT_BUTTON(IDB_BUTTON_Y, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTON_Z, ConfigBox::GetInputs) EVT_BUTTON(IDB_BUTTONSTART, ConfigBox::GetInputs) + EVT_BUTTON(ID_BUTTONCALIBRATE, ConfigBox::Calibrate) EVT_BUTTON(IDB_BUTTONHALFPRESS, ConfigBox::GetInputs) EVT_BUTTON(IDB_DPAD_UP, ConfigBox::GetInputs) EVT_BUTTON(IDB_DPAD_DOWN, ConfigBox::GetInputs) @@ -239,6 +240,7 @@ void ConfigBox::CreateGUIControls() // GUI center button m_JoyButtonStart[i] = new wxTextCtrl(m_Controller[i], ID_BUTTONSTART, wxT("0"), wxPoint(278, 403), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyButtonStart[i]->Enable(false); + m_bJoyButtonCalibrate[i] = new wxButton(m_Controller[i], ID_BUTTONCALIBRATE, wxT("Calibrate"), wxPoint(297, 440), wxSize(21, 14), 0, wxDefaultValidator, wxT("Calibrate")); m_JoyButtonHalfpress[i] = new wxTextCtrl(m_Controller[i], ID_BUTTONHALFPRESS, wxT("0"), wxPoint(167, 424), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyButtonHalfpress[i]->Enable(false); m_bJoyButtonStart[i] = new wxButton(m_Controller[i], IDB_BUTTONSTART, wxEmptyString, wxPoint(297, 385), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString); @@ -321,6 +323,34 @@ void ConfigBox::CancelClick(wxCommandEvent& event) } } +void ConfigBox::Calibrate(wxCommandEvent& event) +{ + int controller = notebookpage; + + + SDL_Joystick *joy = SDL_JoystickOpen(joysticks[controller].ID); + int axes = SDL_JoystickNumAxes(joy); + Sint16 value; + unsigned long Started = SDL_GetTicks(); + while(1) + { + for(int b = 0; b < axes; b++) + { + SDL_JoystickUpdate(); + value = SDL_JoystickGetAxis(joy, b); + if(value < joysticks[controller].sData[b].Min) + joysticks[controller].sData[b].Min = value; + if(value > joysticks[controller].sData[b].Max) + joysticks[controller].sData[b].Max = value; + } + if(SDL_GetTicks() - Started >= 5000) + break; + } + for(int a = 0; a < axes;a++) + printf("Axis %d has a Min of %d, and a Max of %d\n", a, joysticks[controller].sData[a].Min, joysticks[controller].sData[a].Max); + if(SDL_JoystickOpened(joysticks[controller].ID)) + SDL_JoystickClose(joy); +} // Set dialog items // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void ConfigBox::SetControllerAll(int controller) @@ -613,7 +643,8 @@ void ConfigBox::GetInputs(wxCommandEvent& event) sprintf(format, "[%d]", counter2); SetButtonText(ID, format); wxWindow::Update(); // win only? doesnt seem to work in linux... - + + SDL_JoystickUpdate(); while(waiting) { SDL_JoystickUpdate(); @@ -629,10 +660,12 @@ void ConfigBox::GetInputs(wxCommandEvent& event) } } for(int b = 0; b < axes; b++) - { + { value = SDL_JoystickGetAxis(joy, b); - if(value < -10000 || value > 10000) - { + 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 + { // 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 pressed = b; waiting = false; succeed = true; diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h index bb4fcd1f02..bfc0e3a176 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/GUI/ConfigBox.h @@ -96,6 +96,7 @@ class ConfigBox : public wxDialog wxButton *m_bJoyButtonY[4]; wxButton *m_bJoyButtonZ[4]; wxButton *m_bJoyButtonStart[4]; + wxButton *m_bJoyButtonCalibrate[4]; wxButton *m_bJoyButtonHalfpress[4]; wxTextCtrl *m_JoyAnalogMainX[4]; @@ -209,6 +210,7 @@ class ConfigBox : public wxDialog IDT_ANALOG_SUB_X, IDT_ANALOG_SUB_Y, IDT_WEBSITE, + ID_BUTTONCALIBRATE, ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values }; @@ -230,6 +232,7 @@ class ConfigBox : public wxDialog void NotebookPageChanged(wxNotebookEvent& event); + void Calibrate(wxCommandEvent& event); void GetInputs(wxCommandEvent& event); void GetHats(int ID); diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp index 4b7a3290fd..06f701f00f 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp @@ -599,14 +599,12 @@ int Search_Devices() 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 + printf("ID: %d\n", i); + printf("Name: %s\n", joyinfo[i].Name); + printf("Buttons: %d\n", joyinfo[i].NumButtons); + printf("Axises: %d\n", joyinfo[i].NumAxes); + printf("Hats: %d\n", joyinfo[i].NumHats); + printf("Balls: %d\n\n", joyinfo[i].NumBalls); // Close if opened if(SDL_JoystickOpened(i)) @@ -690,6 +688,14 @@ void SaveConfig() file.Set(SectionName, "joy_id", joysticks[i].ID); file.Set(SectionName, "controllertype", joysticks[i].controllertype); file.Set(SectionName, "eventnum", joysticks[i].eventnum); + for(int a = 0; a < MAX_AXISES; a++) + { + char Section[32]; + sprintf(Section, "SAxis%dMin", a); + file.Set(SectionName, Section, (int)joysticks[i].sData[a].Min); + sprintf(Section, "SAxis%dMax", a); + file.Set(SectionName, Section, (int)joysticks[i].sData[a].Max); + } } file.Save("nJoy.ini"); @@ -730,6 +736,18 @@ void LoadConfig() 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); + for(int a = 0; a < MAX_AXISES; a++) + { + char Section[32]; + int Min; + int Max; + sprintf(Section, "SAxis%dMin", a); + file.Get(SectionName, Section, &Min, 0); + sprintf(Section, "SAxis%dMax", a); + file.Get(SectionName, Section, &Max, 0); + joysticks[i].sData[a].Min = Min; + joysticks[i].sData[a].Max = Max; + } } } diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h index 1af4b10711..ed60b64d71 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.h @@ -94,9 +94,20 @@ ////////////////////////////////////////////////////////////////////////////////////////// // Structures // ŻŻŻŻŻŻŻŻŻŻ - +#define MAX_AXISES 12 // If more than 12 is needed. Up it +class sCalibration +{ + public: + sCalibration() + { + Min = 0; + Max = 0; + } + Sint16 Min; + 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[12]; // 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; // ... @@ -104,7 +115,8 @@ struct CONTROLLER_STATE{ // GC PAD INFO/STATE }; 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[12];// 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?