diff --git a/Source/Core/Common/Src/IniFile.cpp b/Source/Core/Common/Src/IniFile.cpp index 957af38925..63ef71146d 100644 --- a/Source/Core/Common/Src/IniFile.cpp +++ b/Source/Core/Common/Src/IniFile.cpp @@ -206,7 +206,7 @@ bool IniFile::DeleteKey(const char* sectionName, const char* key) return false; //shouldn't happen } - +// Return a list of all keys in a section bool IniFile::GetKeys(const char* sectionName, std::vector& keys) const { const Section* section = GetSection(sectionName); @@ -228,7 +228,7 @@ bool IniFile::GetKeys(const char* sectionName, std::vector& keys) c return true; } - +// Return a list of all lines in a section bool IniFile::GetLines(const char* sectionName, std::vector& lines) const { const Section* section = GetSection(sectionName); diff --git a/Source/Core/Common/Src/StringUtil.cpp b/Source/Core/Common/Src/StringUtil.cpp index 7dc468fc75..523ed3133d 100644 --- a/Source/Core/Common/Src/StringUtil.cpp +++ b/Source/Core/Common/Src/StringUtil.cpp @@ -66,6 +66,40 @@ bool AsciiToHex(const char* _szValue, u32& result) return (true); } + +////////////////////////////////////////////////////////////////////////////////////////// +// Convert AB to it's ascii table entry numbers 0x4142 +// ŻŻŻŻŻŻŻŻŻŻŻŻŻ +u32 Ascii2Hex(std::string _Text) +{ + // Reset the return value zero + u32 Result = 0; + + // Max 32-bit values are supported + int Length = _Text.length(); if (Length > 4) Length = 4; + + for (int i = 0; i < Length; i++) + { + // Add up the values, for example RSPE becomes, 0x52000000, then 0x52530000 and so on + Result += _Text.c_str()[i] << (Length - 1 - i)*8; + } + // Return the value + return Result; +} +// Convert it back again +std::string Hex2Ascii(u32 _Text) +{ + // Create temporary storate + char Result[4]; + // Go through the four characters + sprintf(Result, "%c%c%c%c", _Text >> 24, _Text >> 16, _Text >> 8, _Text); + // Return the string + std::string StrResult = Result; + return StrResult; +} +/////////////////////////// + + bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list args) { int writtenCount = vsnprintf(out, outsize, format, args); diff --git a/Source/Core/Common/Src/StringUtil.h b/Source/Core/Common/Src/StringUtil.h index 244f57c45f..2ecb1e793f 100644 --- a/Source/Core/Common/Src/StringUtil.h +++ b/Source/Core/Common/Src/StringUtil.h @@ -63,6 +63,8 @@ bool TryParseUInt(const std::string& str, u32* output); // TODO: kill this bool AsciiToHex(const char* _szValue, u32& result); +u32 Ascii2Hex(std::string _Text); +std::string Hex2Ascii(u32 _Text); void SplitString(const std::string& str, const std::string& delim, std::vector& output); int ChooseStringFrom(const char* str, const char* * items); diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index fa1d5dbc23..497b25fb96 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -29,6 +29,7 @@ #include "Timer.h" #include "Common.h" #include "ConsoleWindow.h" +#include "StringUtil.h" #include "Console.h" #include "Core.h" @@ -389,6 +390,8 @@ THREAD_RETURN EmuThread(void *pArg) { SWiimoteInitialize WiimoteInitialize; WiimoteInitialize.hWnd = g_pWindowHandle; + // Add the ISO Id + WiimoteInitialize.ISOId = Ascii2Hex(_CoreParameter.m_strUniqueID); WiimoteInitialize.pLog = Callback_WiimoteLog; WiimoteInitialize.pWiimoteInput = Callback_WiimoteInput; // Wait for Wiiuse to find the number of connected Wiimotes @@ -684,7 +687,7 @@ const char *Callback_ISOName(void) else return (const char *)""; } - + // __________________________________________________________________________________________________ // Called from ANY thread! void Callback_KeyPress(int key, bool shift, bool control) diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp index f8ec1a6f23..4805fcaf84 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp @@ -452,6 +452,7 @@ void CGameListCtrl::ScanForISOs() sprintf(tempstring,"Scanning %s", FileName.c_str()); msg = wxString::FromAscii(tempstring); + // Update with the progress (i) and the message (msg) bool Cont = dialog.Update(i, msg); if (!Cont) diff --git a/Source/MusicMod.sln b/Source/MusicMod.sln index e4c8463497..8960bc1b85 100644 --- a/Source/MusicMod.sln +++ b/Source/MusicMod.sln @@ -60,6 +60,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dolphin", "Core\DolphinWX\D {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160} = {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160} {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8} = {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8} {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {8D612734-FAA5-4B8A-804F-4DEA2367D495} = {8D612734-FAA5-4B8A-804F-4DEA2367D495} {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} {33546D62-7F34-4EA6-A88E-D538B36E16BF} = {33546D62-7F34-4EA6-A88E-D538B36E16BF} {3E03C179-8251-46E4-81F4-466F114BAC63} = {3E03C179-8251-46E4-81F4-466F114BAC63} @@ -371,6 +372,7 @@ Global {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release JITIL|x64.ActiveCfg = Release|x64 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release JITIL|x64.Build.0 = Release|x64 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.ActiveCfg = Release|Win32 + {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|Win32.Build.0 = Release|Win32 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|x64.ActiveCfg = Release|x64 {8D612734-FAA5-4B8A-804F-4DEA2367D495}.Release|x64.Build.0 = Release|x64 {ADF64291-57ED-4B7A-AB76-37B4A991504B}.Debug|Win32.ActiveCfg = Debug|Win32 diff --git a/Source/PluginSpecs/pluginspecs_wiimote.h b/Source/PluginSpecs/pluginspecs_wiimote.h index 12265a4b9b..785447059a 100644 --- a/Source/PluginSpecs/pluginspecs_wiimote.h +++ b/Source/PluginSpecs/pluginspecs_wiimote.h @@ -19,6 +19,7 @@ typedef void (*TWiimoteInput)(u16 _channelID, const void* _pData, u32 _Size); typedef struct { HWND hWnd; + u32 ISOId; TLogv pLog; TWiimoteInput pWiimoteInput; } SWiimoteInitialize; diff --git a/Source/Plugins/Plugin_Wiimote/Src/Config.cpp b/Source/Plugins/Plugin_Wiimote/Src/Config.cpp index 920a241006..07b51ff594 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/Config.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/Config.cpp @@ -16,11 +16,15 @@ // http://code.google.com/p/dolphin-emu/ +#include + #include "Common.h" #include "IniFile.h" +#include "StringUtil.h" #include "Config.h" #include "EmuDefinitions.h" // for PadMapping +#include "main.h" Config g_Config; @@ -38,7 +42,6 @@ void Config::Load(bool ChangePad) // General iniFile.Get("Settings", "SidewaysDPad", &bSidewaysDPad, false); - iniFile.Get("Settings", "WideScreen", &bWideScreen, false); iniFile.Get("Settings", "NunchuckConnected", &bNunchuckConnected, false); iniFile.Get("Settings", "ClassicControllerConnected", &bClassicControllerConnected, false); @@ -53,6 +56,14 @@ void Config::Load(bool ChangePad) iniFile.Get("Real", "AccNunNeutralY", &iAccNunNeutralY, 0); iniFile.Get("Real", "AccNunNeutralZ", &iAccNunNeutralZ, 0); + // Load the IR cursor settings if it's avaliable, if not load the default settings + std::string TmpSection; + if (g_ISOId) TmpSection = Hex2Ascii(g_ISOId); else TmpSection = "Emulated"; + iniFile.Get(TmpSection.c_str(), "IRLeft", &iIRLeft, LEFT); + iniFile.Get(TmpSection.c_str(), "IRTop", &iIRTop, TOP); + iniFile.Get(TmpSection.c_str(), "IRWidth", &iIRWidth, RIGHT - LEFT); + iniFile.Get(TmpSection.c_str(), "IRHeight", &iIRHeight, BOTTOM - TOP); + // Default controls #ifdef _WIN32 int WmA = 65, WmB = 66, @@ -160,7 +171,6 @@ void Config::Save(int Slot) IniFile iniFile; iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini"); iniFile.Set("Settings", "SidewaysDPad", bSidewaysDPad); - iniFile.Set("Settings", "WideScreen", bWideScreen); iniFile.Set("Settings", "NunchuckConnected", bNunchuckConnected); iniFile.Set("Settings", "ClassicControllerConnected", bClassicControllerConnected); @@ -174,6 +184,13 @@ void Config::Save(int Slot) iniFile.Set("Real", "AccNunNeutralY", iAccNunNeutralY); iniFile.Set("Real", "AccNunNeutralZ", iAccNunNeutralZ); + // Save the IR cursor settings if it's avaliable, if not save the default settings + std::string TmpSection; + if (g_ISOId) TmpSection = Hex2Ascii(g_ISOId); else TmpSection = "Emulated"; + iniFile.Set(TmpSection.c_str(), "IRLeft", iIRLeft); + iniFile.Set(TmpSection.c_str(), "IRTop", iIRTop); + iniFile.Set(TmpSection.c_str(), "IRWidth", iIRWidth); + iniFile.Set(TmpSection.c_str(), "IRHeight", iIRHeight); for (int i = 0; i < 1; i++) { diff --git a/Source/Plugins/Plugin_Wiimote/Src/Config.h b/Source/Plugins/Plugin_Wiimote/Src/Config.h index 9ade2bc729..17ee2d28d4 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/Config.h +++ b/Source/Plugins/Plugin_Wiimote/Src/Config.h @@ -62,6 +62,7 @@ struct Config // Real Wiimote bool bConnectRealWiimote, bUseRealWiimote, bUpdateRealWiimote; + int iIRLeft, iIRTop, iIRWidth, iIRHeight; int iAccNeutralX, iAccNeutralY, iAccNeutralZ; int iAccNunNeutralX, iAccNunNeutralY, iAccNunNeutralZ; diff --git a/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.cpp b/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.cpp index cb650d8130..3ed8be0053 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.cpp @@ -58,7 +58,6 @@ BEGIN_EVENT_TABLE(ConfigDialog,wxDialog) EVT_BUTTON(ID_ABOUTOGL, ConfigDialog::AboutClick) EVT_CHECKBOX(ID_SIDEWAYSDPAD, ConfigDialog::GeneralSettingsChanged) - EVT_CHECKBOX(ID_WIDESCREEN, ConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_NUNCHUCKCONNECTED, ConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_CLASSICCONTROLLERCONNECTED, ConfigDialog::GeneralSettingsChanged) @@ -122,6 +121,11 @@ BEGIN_EVENT_TABLE(ConfigDialog,wxDialog) EVT_BUTTON(IDB_WM_U, ConfigDialog::OnButtonClick) EVT_BUTTON(IDB_WM_D, ConfigDialog::OnButtonClick) EVT_BUTTON(IDB_WM_SHAKE, ConfigDialog::OnButtonClick) EVT_BUTTON(IDB_WM_PITCH_L, ConfigDialog::OnButtonClick) EVT_BUTTON(IDB_WM_PITCH_R, ConfigDialog::OnButtonClick) + // IR cursor + EVT_COMMAND_SCROLL(IDS_WIDTH, ConfigDialog::GeneralSettingsChanged) + EVT_COMMAND_SCROLL(IDS_HEIGHT, ConfigDialog::GeneralSettingsChanged) + EVT_COMMAND_SCROLL(IDS_LEFT, ConfigDialog::GeneralSettingsChanged) + EVT_COMMAND_SCROLL(IDS_TOP, ConfigDialog::GeneralSettingsChanged) // Nunchuck EVT_BUTTON(IDB_NC_Z, ConfigDialog::OnButtonClick) EVT_BUTTON(IDB_NC_C, ConfigDialog::OnButtonClick) @@ -521,11 +525,29 @@ void ConfigDialog::CreateGUIControls() wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); /////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + // This can take a few seconds so we show a progress bar for it + // ---------------- + wxProgressDialog dialog(_T("Opening Wii Remote Configuration"), + wxT("Loading controls..."), + 6, // range + this, // parent + wxPD_APP_MODAL | + // wxPD_AUTO_HIDE | -- try this as well + wxPD_ELAPSED_TIME | + wxPD_ESTIMATED_TIME | + wxPD_REMAINING_TIME | + wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + ); + // I'm not sure what parent this refers to + dialog.CenterOnParent(); + /////////////////////////////////////// /* Populate all four pages. Page 2, 3 and 4 are currently disabled since we can't use more than one Wiimote at the moment */ for (int i = 0; i < 4; i++) { + //////////////////////////////////////////////////// // General and basic Settings // ---------------- @@ -537,7 +559,6 @@ void ConfigDialog::CreateGUIControls() m_WiimoteOnline[i] = new wxCheckBox(m_Controller[i], IDC_WIMOTE_ON, wxT("Wiimote On"), wxDefaultPosition, wxSize(ChW, -1)); // Emulated Wiimote m_SidewaysDPad[i] = new wxCheckBox(m_Controller[i], ID_SIDEWAYSDPAD, wxT("Sideways D-Pad"), wxDefaultPosition, wxSize(ChW, -1)); - m_WideScreen[i] = new wxCheckBox(m_Controller[i], ID_WIDESCREEN, wxT("WideScreen Mode (for correct aiming)")); // Extension m_WiiMotionPlusConnected[i] = new wxCheckBox(m_Controller[i], wxID_ANY, wxT("Wii Motion Plus Connected"), wxDefaultPosition, wxSize(ChW, -1), 0, wxDefaultValidator); m_NunchuckConnected[i] = new wxCheckBox(m_Controller[i], ID_NUNCHUCKCONNECTED, wxT("Nunchuck Connected")); @@ -554,7 +575,6 @@ void ConfigDialog::CreateGUIControls() m_NunchuckConnected[0]->SetValue(g_Config.bNunchuckConnected); m_ClassicControllerConnected[0]->SetValue(g_Config.bClassicControllerConnected); m_SidewaysDPad[0]->SetValue(g_Config.bSidewaysDPad); - m_WideScreen[0]->SetValue(g_Config.bWideScreen); m_ConnectRealWiimote[0]->SetValue(g_Config.bConnectRealWiimote); m_UseRealWiimote[0]->SetValue(g_Config.bUseRealWiimote); @@ -564,7 +584,53 @@ void ConfigDialog::CreateGUIControls() m_GuitarHeroGuitarConnected[0]->Enable(false); m_GuitarHeroWorldTourDrumsConnected[0]->Enable(false); + // Tooltips + m_WiimoteOnline[i]->SetToolTip(wxString::Format(wxT("Decide if Wiimote %i shall be detected by the game"), i)); + m_ConnectRealWiimote[i]->SetToolTip(wxT("Connected to the real wiimote. This can not be changed during gameplay.")); + m_UseRealWiimote[i]->SetToolTip(wxT( + "Use the real Wiimote in the game. This can be changed during gameplay. This can not be selected" + " when a recording is to be done. No status in this window will be updated when this is checked.")); + + // ----------------------------------------------- + // Screen size + // --------------------- + // Controls + m_TextScreenWidth[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Width: 000")); + m_TextScreenHeight[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Height: 000")); + m_TextScreenLeft[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Left: 000")); + m_TextScreenTop[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Top: 000")); + + m_SliderWidth[i] = new wxSlider(m_Controller[i], IDS_WIDTH, 0, 100, 923, wxDefaultPosition, wxSize(75, -1)); + m_SliderHeight[i] = new wxSlider(m_Controller[i], IDS_HEIGHT, 0, 0, 727, wxDefaultPosition, wxSize(75, -1)); + m_SliderLeft[i] = new wxSlider(m_Controller[i], IDS_LEFT, 0, 100, 500, wxDefaultPosition, wxSize(75, -1)); + m_SliderTop[i] = new wxSlider(m_Controller[i], IDS_TOP, 0, 0, 500, wxDefaultPosition, wxSize(75, -1)); + //m_ScreenSize = new wxCheckBox(m_Controller[i], IDC_SCREEN_SIZE, wxT("Adjust screen size and position"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + // Sizers + m_SizerIRPointerWidth[i] = new wxBoxSizer(wxHORIZONTAL); + m_SizerIRPointerWidth[i]->Add(m_TextScreenLeft[i], 0, wxEXPAND | (wxTOP), 3); + m_SizerIRPointerWidth[i]->Add(m_SliderLeft[i], 0, wxEXPAND | (wxRIGHT), 0); + m_SizerIRPointerWidth[i]->Add(m_TextScreenWidth[i], 0, wxEXPAND | (wxTOP), 3); + m_SizerIRPointerWidth[i]->Add(m_SliderWidth[i], 0, wxEXPAND | (wxLEFT), 0); + + m_SizerIRPointerHeight[i] = new wxBoxSizer(wxHORIZONTAL); + m_SizerIRPointerHeight[i]->Add(m_TextScreenTop[i], 0, wxEXPAND | (wxTOP), 3); + m_SizerIRPointerHeight[i]->Add(m_SliderTop[i], 0, wxEXPAND | (wxRIGHT), 0); + m_SizerIRPointerHeight[i]->Add(m_TextScreenHeight[i], 0, wxEXPAND | (wxTOP), 3); + m_SizerIRPointerHeight[i]->Add(m_SliderHeight[i], 0, wxEXPAND | (wxLEFT), 0); + + m_SizerIRPointer[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("IR pointer")); + //m_SizerIRPointer[i]->Add(m_ScreenSize[i], 0, wxEXPAND | (wxALL), 5); + m_SizerIRPointer[i]->Add(m_SizerIRPointerWidth[i], 0, wxEXPAND | (wxLEFT | wxDOWN | wxRIGHT), 5); + m_SizerIRPointer[i]->Add(m_SizerIRPointerHeight[i], 0, wxEXPAND | (wxLEFT | wxDOWN | wxRIGHT), 5); + + // Tool tips + //m_ScreenSize[i]->SetToolTip(wxT("Use the adjusted screen size.")); + // ------------------------------- + + // -------------------------------------------------------------------- + // Row 1 Sizers: General settings + // ----------------------------- m_SizeBasic[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("General Settings")); m_SizeEmu[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Emulated Wiimote")); m_SizeExtensions[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Emulated Extension")); @@ -575,7 +641,6 @@ void ConfigDialog::CreateGUIControls() m_SizeEmuPadding[i] = new wxBoxSizer(wxVERTICAL); m_SizeEmu[i]->Add(m_SizeEmuPadding[i], 0, wxEXPAND | (wxALL), 5); m_SizeEmuPadding[i]->Add(m_SidewaysDPad[i], 0, wxEXPAND | (wxUP), 0); - m_SizeEmuPadding[i]->Add(m_WideScreen[i], 0, wxEXPAND | (wxUP), 2); m_SizeRealPadding[i] = new wxBoxSizer(wxVERTICAL); m_SizeReal[i]->Add(m_SizeRealPadding[i], 0, wxEXPAND | (wxALL), 5); m_SizeRealPadding[i]->Add(m_ConnectRealWiimote[i], 0, wxEXPAND | (wxUP), 0); @@ -594,20 +659,16 @@ void ConfigDialog::CreateGUIControls() m_SizeBasicGeneralRight[i] = new wxBoxSizer(wxVERTICAL); m_SizeBasicGeneralLeft[i]->Add(m_SizeBasic[i], 0, wxEXPAND | (wxUP), 0); - m_SizeBasicGeneralLeft[i]->Add(m_SizeReal[i], 0, wxEXPAND | (wxUP), 5); - m_SizeBasicGeneralLeft[i]->Add(m_SizeEmu[i], 0, wxEXPAND | (wxUP), 5); + m_SizeBasicGeneralLeft[i]->Add(m_SizeExtensions[i], 0, wxEXPAND | (wxUP), 5); - m_SizeBasicGeneralRight[i]->Add(m_SizeExtensions[i], 0, wxEXPAND | (wxUP), 0); + m_SizeBasicGeneralRight[i]->Add(m_SizeReal[i], 0, wxEXPAND | (wxUP), 0); + m_SizeBasicGeneralRight[i]->Add(m_SizeEmu[i], 0, wxEXPAND | (wxUP), 5); + m_SizeBasicGeneralRight[i]->Add(m_SizerIRPointer[i], 0, wxEXPAND | (wxUP), 5); m_SizeBasicGeneral[i]->Add(m_SizeBasicGeneralLeft[i], 0, wxEXPAND | (wxUP), 0); m_SizeBasicGeneral[i]->Add(m_SizeBasicGeneralRight[i], 0, wxEXPAND | (wxLEFT), 10); + // ------------------------ - // Tooltips - m_WiimoteOnline[i]->SetToolTip(wxString::Format(wxT("Decide if Wiimote %i shall be detected by the game"), i)); - m_ConnectRealWiimote[i]->SetToolTip(wxT("Connected to the real wiimote. This can not be changed during gameplay.")); - m_UseRealWiimote[i]->SetToolTip(wxT( - "Use the real Wiimote in the game. This can be changed during gameplay. This can not be selected" - " when a recording is to be done. No status in this window will be updated when this is checked.")); /////////////////////////// @@ -1128,6 +1189,9 @@ void ConfigDialog::CreateGUIControls() // Set the main sizer m_Controller[i]->SetSizer(m_sMain[i]); ///////////////////////////////// + + // Update with the progress (i) and the message (msg) + dialog.Update(i + 1, wxT("Loading notebook pages...")); } //////////////////////////////////////////// @@ -1136,6 +1200,9 @@ void ConfigDialog::CreateGUIControls() CreateGUIControlsRecording(); ///////////////////////////////// + // Update with the progress (i) and the message (msg) + dialog.Update(5, wxT("Loading notebook pages...")); + //dialog.Close(); //////////////////////////////////////////////////////////////////////////////// // Buttons @@ -1285,10 +1352,6 @@ void ConfigDialog::GeneralSettingsChanged(wxCommandEvent& event) case ID_SIDEWAYSDPAD: g_Config.bSidewaysDPad = m_SidewaysDPad[Page]->IsChecked(); break; - case ID_WIDESCREEN: - g_Config.bWideScreen = m_WideScreen[Page]->IsChecked(); - break; - ////////////////////////// // Extensions @@ -1418,6 +1481,49 @@ void ConfigDialog::GeneralSettingsChanged(wxCommandEvent& event) UpdateGUI(); } +// ======================================================= +// Apparently we need a scroll event version of this for the sliders +// ------------- +void ConfigDialog::GeneralSettingsChanged(wxScrollEvent& event) +{ + switch (event.GetId()) + { + // IR cursor position + case IDS_WIDTH: + g_Config.iIRWidth = m_SliderWidth[Page]->GetValue(); + break; + case IDS_HEIGHT: + g_Config.iIRHeight = m_SliderHeight[Page]->GetValue(); + break; + case IDS_LEFT: + g_Config.iIRLeft = m_SliderLeft[Page]->GetValue(); + break; + case IDS_TOP: + g_Config.iIRTop = m_SliderTop[Page]->GetValue(); + break; + } + + UpdateGUI(); +} + +// ======================================================= +// Update the IR pointer calibration sliders +// ------------- +void ConfigDialog::UpdateControls() +{ + // Update the slider position if a configuration has been loaded + m_SliderWidth[Page]->SetValue(g_Config.iIRWidth); + m_SliderHeight[Page]->SetValue(g_Config.iIRHeight); + m_SliderLeft[Page]->SetValue(g_Config.iIRLeft); + m_SliderTop[Page]->SetValue(g_Config.iIRTop); + + // Update the labels + m_TextScreenWidth[Page]->SetLabel(wxString::Format("Width: %i", g_Config.iIRWidth)); + m_TextScreenHeight[Page]->SetLabel(wxString::Format("Height: %i", g_Config.iIRHeight)); + m_TextScreenLeft[Page]->SetLabel(wxString::Format("Left: %i", g_Config.iIRLeft)); + m_TextScreenTop[Page]->SetLabel(wxString::Format("Top: %i", g_Config.iIRTop)); +} +// ============================== // ======================================================= @@ -1433,6 +1539,9 @@ void ConfigDialog::UpdateGUI(int Slot) // Update dead zone DoChangeDeadZone(true); DoChangeDeadZone(false); + // Update the Wiimote IR pointer calibration + UpdateControls(); + /* We only allow a change of extension if we are not currently using the real Wiimote, if it's in use the status will be updated from the data scanning functions in main.cpp */ bool AllowExtensionChange = !(g_RealWiiMotePresent && g_Config.bConnectRealWiimote && g_Config.bUseRealWiimote && g_EmulatorRunning); diff --git a/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.h b/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.h index e3874b74b3..98ca6812f2 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.h +++ b/Source/Plugins/Plugin_Wiimote/Src/ConfigDlg.h @@ -32,6 +32,7 @@ #include #include #include +#include class ConfigDialog : public wxDialog { @@ -44,7 +45,7 @@ class ConfigDialog : public wxDialog // General open, close and event functions void CloseClick(wxCommandEvent& event); - void UpdateGUI(int Slot = 0); void UpdateGUIButtonMapping(int controller); + void UpdateGUI(int Slot = 0); void UpdateGUIButtonMapping(int controller); void UpdateControls(); void OnKeyDown(wxKeyEvent& event); void LoadFile(); void SaveFile(); @@ -85,7 +86,8 @@ class ConfigDialog : public wxDialog wxBoxSizer *m_MainSizer, *m_sMain[4], *m_SizeParent[4], *m_sRecordingMain; // Emulated Wiimote key settings - wxBoxSizer *m_SizeBasicPadding[4], *m_SizeEmuPadding[4], *m_SizeRealPadding[4], *m_SizeExtensionsPadding[4], + wxBoxSizer *m_SizerIRPointerWidth[4], *m_SizerIRPointerHeight[4], + *m_SizeBasicPadding[4], *m_SizeEmuPadding[4], *m_SizeRealPadding[4], *m_SizeExtensionsPadding[4], *m_SizeBasicGeneral[4], *m_SizeBasicGeneralLeft[4], *m_SizeBasicGeneralRight[4], *m_HorizControllers[4], *m_gC2SDeadZone[4], *m_gCircle2Square[4], *m_gCircle2SquareVert[4], *m_gDeadZone[4], *m_gDeadZoneHoriz[4], *m_HorizControllerTiltParent[4], *m_HorizControllerTilt[4], *m_TiltHoriz[4], *m_SizeAnalogLeft[4], *m_SizeAnalogLeftHorizX[4], *m_SizeAnalogLeftHorizY[4], *m_SizeAnalogRight[4], *m_SizeAnalogRightHorizX[4], *m_SizeAnalogRightHorizY[4], @@ -97,7 +99,7 @@ class ConfigDialog : public wxDialog *m_HorizControllerMapping[4], *m_NunchuckStick[4]; wxGridBagSizer *m_SizeAnalogTriggerHorizConfig[4], *m_SizeAnalogTriggerStatusBox[4], *m_TiltGrid[4], *m_GridLeftStick[4], *m_GridRightStick[4]; - wxStaticBoxSizer *m_SizeBasic[4], *m_SizeEmu[4], *m_SizeReal[4], *m_SizeExtensions[4], *m_gTilt[4], *m_gJoyname[4]; + wxStaticBoxSizer *m_SizeBasic[4], *m_SizeEmu[4], *m_SizeReal[4], *m_SizeExtensions[4], *m_SizerIRPointer[4], *m_gTilt[4], *m_gJoyname[4]; wxTextCtrl *m_AnalogLeftX[4], *m_AnalogLeftY[4], *m_AnalogRightX[4], *m_AnalogRightY[4], *m_AnalogTriggerL[4], *m_AnalogTriggerR[4]; wxButton *m_bAnalogLeftX[4], *m_bAnalogLeftY[4], *m_bAnalogRightX[4], *m_bAnalogRightY[4], @@ -106,7 +108,8 @@ class ConfigDialog : public wxDialog *m_bNcShake[4], *m_bNcZ[4], *m_bNcC[4], *m_bNcL[4], *m_bNcR[4], *m_bNcU[4], *m_bNcD[4], // Wiimote *m_bWmShake[4], *m_bWmPitchL[4], *m_bWmPitchR[4], *m_bWmA[4], *m_bWmB[4], *m_bWm1[4], *m_bWm2[4], *m_bWmP[4], *m_bWmM[4], *m_bWmH[4], *m_bWmD[4], *m_bWmU[4], *m_bWmR[4], *m_bWmL[4]; - wxStaticText *m_tAnalogX[8], *m_tAnalogY[8], *m_TiltTextRoll[4], *m_TiltTextPitch[4], + wxStaticText *m_TextScreenWidth[4], *m_TextScreenHeight[4], *m_TextScreenLeft[4], *m_TextScreenTop[4], + *m_tAnalogX[8], *m_tAnalogY[8], *m_TiltTextRoll[4], *m_TiltTextPitch[4], *m_CheckC2SLabel[4], *m_ComboDeadZoneLabel[4], *m_TStatusLeftIn[4], *m_TStatusLeftOut[4], *m_TStatusRightIn[4], *m_TStatusRightOut[4], *m_TriggerStatusL[4], *m_TriggerStatusR[4], *m_TriggerStatusLx[4], *m_TriggerStatusRx[4], *m_tAnalogTriggerInput[4], *m_tAnalogTriggerL[4], *m_tAnalogTriggerR[4], @@ -117,9 +120,10 @@ class ConfigDialog : public wxDialog *m_NunchuckTextStick[5]; wxButton *ClickedButton; wxString OldLabel; + wxSlider *m_SliderWidth[4], *m_SliderHeight[4], *m_SliderLeft[4], *m_SliderTop[4]; // Emulated Wiimote settings - wxCheckBox *m_SidewaysDPad[4], *m_WiimoteOnline[4], *m_WideScreen[4]; + wxCheckBox *m_SidewaysDPad[4], *m_WiimoteOnline[4]; wxCheckBox *m_CheckC2S[4], *m_TiltInvertRoll[4], *m_TiltInvertPitch[4]; wxCheckBox *m_WiiMotionPlusConnected[4], *m_NunchuckConnected[4], *m_ClassicControllerConnected[4], *m_BalanceBoardConnected[4], *m_GuitarHeroGuitarConnected[4], *m_GuitarHeroWorldTourDrumsConnected[4]; wxComboBox *m_TiltComboInput[4], *m_TiltComboRangeRoll[4], *m_TiltComboRangePitch[4], *m_Joyname[4], *m_ComboDiagonal[4], *m_ComboDeadZoneLeft[4], *m_ComboDeadZoneRight[4], *m_TriggerType[4], @@ -168,8 +172,7 @@ class ConfigDialog : public wxDialog ID_NOTEBOOK, ID_CONTROLLERPAGE1, ID_CONTROLLERPAGE2, ID_CONTROLLERPAGE3, ID_CONTROLLERPAGE4, ID_PAGE_RECORDING, // Emulated Wiimote - ID_SIDEWAYSDPAD, - ID_WIDESCREEN, + ID_SIDEWAYSDPAD, ID_NUNCHUCKCONNECTED, ID_CLASSICCONTROLLERCONNECTED, IDC_WIMOTE_ON, @@ -183,6 +186,7 @@ class ConfigDialog : public wxDialog ID_TRIGGER_L, ID_TRIGGER_R, // Wiimote + IDS_WIDTH, IDS_HEIGHT, IDS_LEFT, IDS_TOP, IDB_WM_A, IDB_WM_B, IDB_WM_1, IDB_WM_2, IDB_WM_P, IDB_WM_M, IDB_WM_H, @@ -213,7 +217,7 @@ class ConfigDialog : public wxDialog void CreateGUIControls(); void CreateGUIControlsRecording(); void AboutClick(wxCommandEvent& event); - void GeneralSettingsChanged(wxCommandEvent& event); + void GeneralSettingsChanged(wxCommandEvent& event); void GeneralSettingsChanged(wxScrollEvent& event); void DoConnectReal(); // Real void DoUseReal(); diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h index 9a286a6f7c..1857cb2f1b 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h @@ -42,20 +42,18 @@ namespace WiiMoteEmu // Definitions and variable declarations //****************************************************************************** -/* Libogc bounding box, in smoothed IR coordinates: 232,284 792,704, however, it was - possible for me to get a better calibration with these values, if they are not - universal for all PCs we have to make a setting for it. */ +/* The Libogc bounding box in smoothed IR coordinates is 232,284 792,704. However, there is no + universal standard that works with all games. They all use their own calibration. Also, + there is no widescreen mode for the calibration, at least not in the games I tried, the + game decides for example that a horizontal value of 500 is 50% from the left of the screen, + and then that's the same regardless if we use the widescreen mode or not.*/ #define LEFT 266 -#define TOP 211 +#define TOP 215 #define RIGHT 752 -#define BOTTOM 728 -#define SENSOR_BAR_RADIUS 200 - -#define wLEFT 332 -#define wTOP 348 -#define wRIGHT 693 -#define wBOTTOM 625 -#define wSENSOR_BAR_RADIUS 200 +#define BOTTOM 705 +/* Since the width of the entire screen is 1024 a reasonable sensor bar width is perhaps 200, + given how small most sensor bars are compared to the total TV width */ +#define SENSOR_BAR_RADIUS 100 // Movement recording extern int g_RecordingPlaying[3]; @@ -176,6 +174,18 @@ extern std::vector joyinfo; extern InputCommon::CONTROLLER_STATE_NEW PadState[4]; extern InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4]; +// Wiimote status +struct SDot +{ + int Rx, Ry, X, Y; + bool Visible; + u8 Size; /**< size of the IR dot (0-15) */ +}; +struct SIR +{ + SDot Dot[4]; +}; + // Keyboard input struct KeyboardWiimote { @@ -190,6 +200,9 @@ struct KeyboardWiimote SHAKE, LAST_CONSTANT }; + + // Raw X and Y coordinate and processed X and Y coordinates + SIR IR; }; extern KeyboardWiimote g_Wm; struct KeyboardNunchuck diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp index e05dc5d6b3..2d5334898e 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDynamics.cpp @@ -202,4 +202,39 @@ void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, in _PitchAdj = (int)Pitch; } + +////////////////////////////////////////////////////////////////////////////////////////// +// Calculate dot positions from the extented 12 byte IR data +// ŻŻŻŻŻŻŻŻŻŻŻŻŻ +void IRData2Dots(u8 *Data) +{ + struct SDot* Dot = g_Wm.IR.Dot; + //SDot Dot[4]; + + + + for (int i = 0; i < 4; ++i) + { + //Console::Print("Rx: %i\n", Dot[i].Rx); + + Dot[i].Rx = 1023 - (Data[3*i] | ((Data[(3*i)+2] & 0x30) << 4)); + Dot[i].Ry = Data[(3*i)+1] | ((Data[(3*i)+2] & 0xc0) << 2); + + Dot[i].Size = Data[(3*i)+2] & 0x0f; + + /* if in range set to visible */ + if (Dot[i].Ry == 1023) + Dot[i].Visible = false; + else + Dot[i].Visible = true; + + // Write to the global IR variable + //g_Wm.IR.Dot[i] = Dot[i]; + + //Console::Print("Rx: %i\n", Dot[i].Rx); + } +} +//////////////////////////////// + + } // WiiMoteEmu \ No newline at end of file diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h index f21f51a9b6..83c162d969 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h @@ -53,6 +53,8 @@ void SetDefaultExtensionRegistry(); bool Search_Devices(std::vector &_joyinfo, int &_NumPads, int &_NumGoodPads); void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller, int NumButtons); void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr); + +// Accelerometer void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_z); void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, int&, int&); float AccelerometerToG(float Current, float Neutral, float G); @@ -60,6 +62,9 @@ void TiltTest(u8 x, u8 y, u8 z); void Tilt(u8 &_x, u8 &_y, u8 &_z); void AdjustAngles(float &Roll, float &Pitch); +// IR data +void IRData2Dots(u8 *Data); + }; // WiiMoteEmu diff --git a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp index c00c52802d..a99b074f19 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp @@ -719,6 +719,13 @@ void FillReportAcc(wm_accel& _acc) ///////////////////////// + + +/* + int Top = TOP, Left = LEFT, Right = RIGHT, + Bottom = BOTTOM, SensorBarRadius = SENSOR_BAR_RADIUS; +*/ + /////////////////////////////////////////////////////////////////// // The extended 12 byte (3 byte per object) reporting // --------------- @@ -739,25 +746,6 @@ void FillReportIR(wm_ir_extended& _ir0, wm_ir_extended& _ir1) } // --------------------- - - // -------------------------------------- - /* The calibration is controlled by these values, their absolute value and - the relative distance between between them control the calibration. WideScreen mode - has its own settings. */ - // ---------- - int Top, Left, Right, Bottom, SensorBarRadius; - if(g_Config.bWideScreen) - { - Top = wTOP; Left = wLEFT; Right = wRIGHT; - Bottom = wBOTTOM; SensorBarRadius = wSENSOR_BAR_RADIUS; - } - else - { - Top = TOP; Left = LEFT; Right = RIGHT; - Bottom = BOTTOM; SensorBarRadius = SENSOR_BAR_RADIUS; - } - // ------------------ - /* Fill with 0xff if empty. The real Wiimote seems to use 0xff when it doesn't see a certain point, at least from how WiiMoteReal::SendEvent() works. */ memset(&_ir0, 0xff, sizeof(wm_ir_extended)); @@ -770,66 +758,64 @@ void FillReportIR(wm_ir_extended& _ir0, wm_ir_extended& _ir1) if(MouseX > 1 || MouseX < 0 || MouseY > 1 || MouseY < 0) return; // -------------------------------------- - // Actual position calculation + // Position calculation // ---------- - int y0 = Top + (MouseY * (Bottom - Top)); - int y1 = Top + (MouseY * (Bottom - Top)); - - int x0 = Left + (MouseX * (Right - Left)) - SensorBarRadius; - int x1 = Left + (MouseX * (Right - Left)) + SensorBarRadius; - - x0 = 1023 - x0; - _ir0.x = x0 & 0xFF; - _ir0.y = y0 & 0xFF; - _ir0.size = 10; - _ir0.xHi = x0 >> 8; - _ir0.yHi = y0 >> 8; - - x1 = 1023 - x1; - _ir1.x = x1 & 0xFF; - _ir1.y = y1 & 0xFF; - _ir1.size = 10; - _ir1.xHi = x1 >> 8; - _ir1.yHi = y1 >> 8; + int y0 = g_Config.iIRTop + (MouseY * g_Config.iIRHeight); + int y1 = y0; + // The distance between the x positions are two sensor bar radii + int x0 = g_Config.iIRLeft + (MouseX * g_Config.iIRWidth) - SENSOR_BAR_RADIUS; + int x1 = g_Config.iIRLeft + (MouseX * g_Config.iIRWidth) + SENSOR_BAR_RADIUS; // ------------------ // ---------------------------- // Debugging for calibration // ---------- /* - if(GetAsyncKeyState(VK_NUMPAD1)) + if(!GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_RIGHT)) Right +=1; - else if(GetAsyncKeyState(VK_NUMPAD2)) + else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_RIGHT)) Right -=1; - if(GetAsyncKeyState(VK_NUMPAD4)) + if(!GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_LEFT)) Left +=1; - else if(GetAsyncKeyState(VK_NUMPAD5)) + else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_LEFT)) Left -=1; - if(GetAsyncKeyState(VK_NUMPAD7)) + if(!GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_UP)) Top += 1; - else if(GetAsyncKeyState(VK_NUMPAD8)) + else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_UP)) Top -= 1; - if(GetAsyncKeyState(VK_NUMPAD6)) + if(!GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_DOWN)) Bottom += 1; - else if(GetAsyncKeyState(VK_NUMPAD3)) + else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_DOWN)) Bottom -= 1; - if(GetAsyncKeyState(VK_INSERT)) + if(!GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_NUMPAD0)) SensorBarRadius += 1; - else if(GetAsyncKeyState(VK_DELETE)) + else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_NUMPAD0)) SensorBarRadius -= 1; - //ClearScreen(); + //Console::ClearScreen(); //if(consoleDisplay == 1) - Console::Print("x0:%03i x1:%03i y0:%03i y1:%03i irx0:%03i y0:%03i x1:%03i y1:%03i | T:%i L:%i R:%i B:%i S:%i\n", - x0, x1, y0, y1, _ir0.x, _ir0.y, _ir1.x, _ir1.y, Top, Left, Right, Bottom, SensorBarRadius - ); - Console::Print("\n"); - Console::Print("ir0.x:%02x xHi:%02x ir1.x:%02x xHi:%02x | ir0.y:%02x yHi:%02x ir1.y:%02x yHi:%02x | 1.s:%02x 2:%02x\n", - _ir0.x, _ir0.xHi, _ir1.x, _ir1.xHi, - _ir0.y, _ir0.yHi, _ir1.y, _ir1.yHi, - _ir0.size, _ir1.size + Console::Print("x0:%03i x1:%03i y0:%03i y1:%03i | T:%i L:%i R:%i B:%i S:%i\n", + x0, x1, y0, y1, Top, Left, Right, Bottom, SensorBarRadius );*/ // ------------------ + + + // -------------------------------------- + // Converted to IR data + // ---------- + // The width is 0 to 1023 + // The height is 0 to 767 + x0 = 1023 - x0; + _ir0.x = x0 & 0xff; _ir0.xHi = x0 >> 8; + _ir0.y = y0 & 0xff; _ir0.yHi = y0 >> 8; + // The size can be between 0 and 15 and is probably not important + _ir0.size = 10; + + x1 = 1023 - x1; + _ir1.x = x1 & 0xff; _ir1.xHi = x1 >> 8; + _ir1.y = y1 & 0xff; _ir1.yHi = y1 >> 8; + _ir1.size = 10; + // ------------------ } /////////////////////////////////////////////////////////////////// @@ -837,6 +823,7 @@ void FillReportIR(wm_ir_extended& _ir0, wm_ir_extended& _ir1) // --------------- void FillReportIRBasic(wm_ir_basic& _ir0, wm_ir_basic& _ir1) { + // ------------------------------------ // Recorded movements // -------------- @@ -853,23 +840,6 @@ void FillReportIRBasic(wm_ir_basic& _ir0, wm_ir_basic& _ir1) } // --------------------- - // -------------------------------------- - /* See calibration description above */ - // ---------- - int Top, Left, Right, Bottom, SensorBarRadius; - - if(g_Config.bWideScreen) - { - Top = wTOP; Left = wLEFT; Right = wRIGHT; - Bottom = wBOTTOM; SensorBarRadius = wSENSOR_BAR_RADIUS; - } - else - { - Top = TOP; Left = LEFT; Right = RIGHT; - Bottom = BOTTOM; SensorBarRadius = SENSOR_BAR_RADIUS; - } - // ------------------ - // Fill with 0xff if empty memset(&_ir0, 0xff, sizeof(wm_ir_basic)); memset(&_ir1, 0xff, sizeof(wm_ir_basic)); @@ -880,24 +850,21 @@ void FillReportIRBasic(wm_ir_basic& _ir0, wm_ir_basic& _ir1) // If we are outside the screen leave the values at 0xff if(MouseX > 1 || MouseX < 0 || MouseY > 1 || MouseY < 0) return; - int y1 = Top + (MouseY * (Bottom - Top)); - int y2 = Top + (MouseY * (Bottom - Top)); + int y1 = g_Config.iIRTop + (MouseY * g_Config.iIRHeight); + int y2 = g_Config.iIRTop + (MouseY * g_Config.iIRHeight); - int x1 = Left + (MouseX * (Right - Left)) - SensorBarRadius; - int x2 = Left + (MouseX * (Right - Left)) + SensorBarRadius; + int x1 = g_Config.iIRLeft + (MouseX * g_Config.iIRWidth) - SENSOR_BAR_RADIUS; + int x2 = g_Config.iIRLeft + (MouseX * g_Config.iIRWidth) + SENSOR_BAR_RADIUS; - /* As with the extented report we settle with emulating two out of four possible objects */ + /* As with the extented report we settle with emulating two out of four possible objects + the only difference is that we don't report any size of the tracked object here */ x1 = 1023 - x1; - _ir0.x1 = x1 & 0xff; - _ir0.y1 = y1 & 0xff; - _ir0.x1Hi = (x1 >> 8); // we are dealing with 2 bit values here - _ir0.y1Hi = (y1 >> 8); + _ir0.x1 = x1 & 0xff; _ir0.x1Hi = (x1 >> 8); // we are dealing with 2 bit values here + _ir0.y1 = y1 & 0xff; _ir0.y1Hi = (y1 >> 8); x2 = 1023 - x2; - _ir0.x2 = x2 & 0xff; - _ir0.y2 = y2 & 0xff; - _ir0.x2Hi = (x2 >> 8); - _ir0.y2Hi = (y2 >> 8); + _ir0.x2 = x2 & 0xff; _ir0.x2Hi = (x2 >> 8); + _ir0.y2 = y2 & 0xff; _ir0.y2Hi = (y2 >> 8); // I don't understand't the & 0x03, should we do that? //_ir1.x1Hi = (x1 >> 8) & 0x3; diff --git a/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp b/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp index a4c75a04e3..9eafc9e4ba 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp @@ -16,7 +16,9 @@ // http://code.google.com/p/dolphin-emu/ +////////////////////////////////////////////////////////////////////////////////////////// // Includes +// ŻŻŻŻŻŻŻŻŻŻŻŻŻ #include // System #include "wiiuse.h" // Externals diff --git a/Source/Plugins/Plugin_Wiimote/Src/main.cpp b/Source/Plugins/Plugin_Wiimote/Src/main.cpp index dd7a155171..93529073e1 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/main.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/main.cpp @@ -64,6 +64,7 @@ SWiimoteInitialize g_WiimoteInitialize; // General bool g_EmulatorRunning = false; +u32 g_ISOId = 0; bool g_FrameOpen = false; bool g_RealWiiMotePresent = false; bool g_RealWiiMoteInitialized = false; @@ -208,11 +209,26 @@ extern "C" void Initialize(void *init) g_EmulatorRunning = true; + // Update the GUI if the configuration window is already open #if defined(HAVE_WX) && HAVE_WX - if(g_FrameOpen) if(frame) frame->UpdateGUI(); + if(g_FrameOpen) + { + // Save the settings + g_Config.Save(); + // Save the ISO Id + g_ISOId = g_WiimoteInitialize.ISOId; + // Load the settings + g_Config.Load(); + if(frame) frame->UpdateGUI(); + } #endif + // Save the ISO Id, again if we had a window open + g_ISOId = g_WiimoteInitialize.ISOId; + DoInitialize(); + + Console::Print("ISOId: %08x %s\n", g_WiimoteInitialize.ISOId, Hex2Ascii(g_WiimoteInitialize.ISOId).c_str()); } // If a game is not running this is called by the Configuration window when it's closed @@ -221,6 +237,9 @@ extern "C" void Shutdown(void) // Not running g_EmulatorRunning = false; + // Reset the game ID in all cases + g_ISOId = 0; + // We will only shutdown when both a game and the frame is closed if (g_FrameOpen) { @@ -415,14 +434,14 @@ void OpenConsole(bool Open) } // Open the console window - Console::Open(130, 1000, "Wiimote"); // give room for 20 rows + Console::Open(140, 1000, "Wiimote"); // give room for 20 rows Console::Print("\n\nWiimote console opened\n"); // Move window #ifdef _WIN32 //MoveWindow(Console::GetHwnd(), 0,400, 100*8,10*14, true); // small window //MoveWindow(Console::GetHwnd(), 400,0, 100*8,70*14, true); // big window - MoveWindow(Console::GetHwnd(), 200,0, 130*8,70*14, true); // big wide window + MoveWindow(Console::GetHwnd(), 200,0, 140*8,70*14, true); // big wide window #endif } // --------------- @@ -678,7 +697,7 @@ void ReadDebugging(bool Emu, const void* _pData, int Size) "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x " "%03i %03i " "%03i %03i %03i " - "%02x ", + "%02x", data[0], data[1], data[2], data[3], // Header and core buttons data[4], data[5], data[6], // Wiimote accelerometer data[7], data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15], data[16], @@ -716,7 +735,19 @@ void ReadDebugging(bool Emu, const void* _pData, int Size) (Gy >= 0) ? StringFromFormat(" %i", (int)Gy).c_str() : StringFromFormat("%i", (int)Gy).c_str(), (Gz >= 0) ? StringFromFormat(" %i", (int)Gz).c_str() : StringFromFormat("%i", (int)Gz).c_str()); - Console::Print("Read[%s]: %s| %s | %s\n", (Emu ? "Emu" : "Real"), TmpData.c_str(), RollPitch.c_str(), GForce.c_str()); // No timestamp + // Show the IR data + WiiMoteEmu::IRData2Dots(&data[7]); + std::string IRData; + for (int i = 0; i < 4; ++i) + { + if(WiiMoteEmu::g_Wm.IR.Dot[i].Visible) + IRData += StringFromFormat("[%i] X:%04i Y:%04i ", i, WiiMoteEmu::g_Wm.IR.Dot[i].Rx, WiiMoteEmu::g_Wm.IR.Dot[i].Ry); + else + IRData += StringFromFormat("[%i]", i); + } + + //Console::Print("Read[%s]: %s | %s\n", (Emu ? "Emu" : "Real"), TmpData.c_str(), IRData.c_str()); // IR data + Console::Print("Read[%s]: %s| %s | %s\n", (Emu ? "Emu" : "Real"), TmpData.c_str(), RollPitch.c_str(), GForce.c_str()); // Accelerometer //Console::Print(" (%s): %s\n", Tm(true).c_str(), Temp.c_str()); // Timestamp } diff --git a/Source/Plugins/Plugin_Wiimote/Src/main.h b/Source/Plugins/Plugin_Wiimote/Src/main.h index b149a1a603..e68be05b1d 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/main.h +++ b/Source/Plugins/Plugin_Wiimote/Src/main.h @@ -68,6 +68,7 @@ struct SRecordingAll #ifndef EXCLUDEMAIN_H // General extern bool g_EmulatorRunning; + extern u32 g_ISOId; extern bool g_FrameOpen; extern bool g_RealWiiMotePresent; extern bool g_RealWiiMoteInitialized; diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h b/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h index 7162ae03d8..d34f65a9fa 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h +++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h @@ -154,7 +154,7 @@ struct wm_accel { u8 x, y, z; }; -// Filled with 0xFF if empty +// Four bytes for two objects. Filled with 0xFF if empty struct wm_ir_basic { u8 x1; @@ -167,6 +167,7 @@ struct wm_ir_basic u8 y2; }; +// Three bytes for one object struct wm_ir_extended { u8 x;