From e9036455d61ddd3d103723edbd02ca77183b4f14 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Sun, 1 Feb 2009 14:58:44 +0000 Subject: [PATCH] Wiimote: Fixed the shared eeprom settings, now the first 42 bytes are shared in dual mode. I'm only copying the data from the Wiimote. I'm not changing anything on the Wiimote eeprom. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2056 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Plugins/Plugin_Wiimote/Src/Config.h | 1 - .../Plugin_Wiimote/Src/EmuDefinitions.cpp | 4 +- .../Plugin_Wiimote/Src/EmuDefinitions.h | 1 - Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp | 19 ++++-- Source/Plugins/Plugin_Wiimote/Src/EmuMain.h | 1 + .../Plugin_Wiimote/Src/ReadWiimote.cpp | 16 ++++- Source/Plugins/Plugin_Wiimote/Src/main.cpp | 25 +++----- .../Plugin_Wiimote/Src/wiimote_real.cpp | 62 +++++++++---------- .../Plugins/Plugin_Wiimote/Src/wiimote_real.h | 1 + 9 files changed, 68 insertions(+), 62 deletions(-) diff --git a/Source/Plugins/Plugin_Wiimote/Src/Config.h b/Source/Plugins/Plugin_Wiimote/Src/Config.h index e42677c7ef..2889f9e93e 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/Config.h +++ b/Source/Plugins/Plugin_Wiimote/Src/Config.h @@ -37,7 +37,6 @@ struct Config // Real Wiimote bool bConnectRealWiimote, bUseRealWiimote, bUpdateRealWiimote; - int iAccNeutralX, iAccNeutralY, iAccNeutralZ; }; extern Config g_Config; diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.cpp index dfc6d58737..524624edd9 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.cpp @@ -41,8 +41,8 @@ namespace WiiMoteEmu // Definitions and variable declarations //****************************************************************************** -u8 g_Leds = 0x1; // 4 bits -u8 g_Speaker = 0x1; // 1 = on +u8 g_Leds = 0x0; // 4 bits +u8 g_Speaker = 0x0; // 1 = on u8 g_SpeakerVoice = 0x0; // 1 = on u8 g_IR = 0x0; // 1 = on diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h index d634c270a6..99a7b06595 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuDefinitions.h @@ -75,7 +75,6 @@ extern u8 g_SpeakerVoice; extern u8 g_IR; extern u8 g_Eeprom[WIIMOTE_EEPROM_SIZE]; - extern u8 g_RegSpeaker[WIIMOTE_REG_SPEAKER_SIZE]; extern u8 g_RegExt[WIIMOTE_REG_EXT_SIZE]; extern u8 g_RegExtTmp[WIIMOTE_REG_EXT_SIZE]; diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp index 123c685965..350c9becde 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp @@ -176,7 +176,19 @@ void LoadRecordedMovements() } // ================ +// Update the accelerometer neutral values +void UpdateEeprom() +{ + g_accel.cal_zero.x = g_Eeprom[22]; + g_accel.cal_zero.y = g_Eeprom[23]; + g_accel.cal_zero.z = g_Eeprom[24]; + g_accel.cal_g.x = g_Eeprom[26] - g_Eeprom[22]; + g_accel.cal_g.y = g_Eeprom[27] - g_Eeprom[24]; + g_accel.cal_g.z = g_Eeprom[28] - g_Eeprom[24]; + Console::Print("UpdateEeprom: %i %i %i\n", + WiiMoteEmu::g_Eeprom[22], WiiMoteEmu::g_Eeprom[23], WiiMoteEmu::g_Eeprom[27]); +} // =================================================== @@ -192,12 +204,7 @@ void Initialize() memcpy(g_Eeprom + 0x16D0, EepromData_16D0, sizeof(EepromData_16D0)); // Write default accelerometer neutral values - g_accel.cal_zero.x = g_Eeprom[22]; - g_accel.cal_zero.y = g_Eeprom[23]; - g_accel.cal_zero.z = g_Eeprom[24]; - g_accel.cal_g.x = g_Eeprom[26]; - g_accel.cal_g.y = g_Eeprom[27]; - g_accel.cal_g.z = g_Eeprom[28]; + UpdateEeprom(); /* Extension data for homebrew applications that use the 0x00000000 key. This writes 0x0000 in encrypted form (0xfefe) to 0xfe in the extension register. */ diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h index c7d51b7e52..76e1ec6924 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.h @@ -28,6 +28,7 @@ u32 convert24bit(const u8* src); u16 convert16bit(const u8* src); void GetMousePos(float& x, float& y); +void UpdateEeprom(); void Initialize(); void DoState(void* ptr, int mode); void Shutdown(void); diff --git a/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp b/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp index ec915c0854..b9be2a06b8 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/ReadWiimote.cpp @@ -31,6 +31,7 @@ #include "wiimote_real.h" // Local #include "wiimote_hid.h" #include "EmuDefinitions.h" +#include "EmuMain.h" #include "main.h" #if defined(HAVE_WX) && HAVE_WX #include "ConfigDlg.h" @@ -184,7 +185,7 @@ void handle_event(struct wiimote_t* wm) void ReadWiimote() { handle_event(g_WiiMotesFromWiiUse[0]); - + std::string Temp; // Read formatted data if (wiiuse_poll(g_WiiMotesFromWiiUse, MAX_WIIMOTES)) { @@ -219,6 +220,17 @@ void ReadWiimote() * Take a look at wiimotes[i]->read_req * for the data. */ + if(g_WiiMotesFromWiiUse[0]->read_req->size == sizeof(WiiMoteEmu::EepromData_0) + && g_WiiMotesFromWiiUse[0]->read_req->addr == 0) + { + Temp = ArrayToString(g_WiiMotesFromWiiUse[0]->read_req->buf, sizeof(WiiMoteEmu::EepromData_0), 0, 30); + memcpy(WiiMoteEmu::g_Eeprom, g_WiiMotesFromWiiUse[0]->read_req->buf, sizeof(WiiMoteEmu::EepromData_0)); + WiiMoteEmu::UpdateEeprom(); + Console::Print("EEPROM: %s\n", Temp.c_str()); + Console::Print("Got neutral values: %i %i %i\n", + WiiMoteEmu::g_Eeprom[22],WiiMoteEmu::g_Eeprom[23], WiiMoteEmu::g_Eeprom[27]); + g_RunTemporary = false; + } break; case WIIUSE_NUNCHUK_INSERTED: @@ -230,7 +242,7 @@ void ReadWiimote() */ //wiiuse_set_nunchuk_orient_threshold((struct nunchuk_t*)&wiimotes[i]->exp.nunchuk, 90.0f); //wiiuse_set_nunchuk_accel_threshold((struct nunchuk_t*)&wiimotes[i]->exp.nunchuk, 100); - printf("Nunchuk inserted.\n"); + Console::Print("Nunchuk inserted.\n"); break; case WIIUSE_CLASSIC_CTRL_INSERTED: diff --git a/Source/Plugins/Plugin_Wiimote/Src/main.cpp b/Source/Plugins/Plugin_Wiimote/Src/main.cpp index 0c2787832a..50dd8d323c 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/main.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/main.cpp @@ -350,7 +350,7 @@ void ReadDebugging(bool Emu, const void* _pData) size = sizeof(wm_status_report); Name = "WM_STATUS_REPORT"; { - wm_status_report* pStatus = (wm_status_report*)(data + 2); + /*wm_status_report* pStatus = (wm_status_report*)(data + 2); Console::Print("" "Extension Controller: %i\n" "Speaker enabled: %i\n" @@ -368,26 +368,16 @@ void ReadDebugging(bool Emu, const void* _pData) (pStatus->leds >> 2), (pStatus->leds >> 3), pStatus->battery_low - ); + );*/ } break; case WM_READ_DATA_REPLY: // 0x21 size = sizeof(wm_read_data_reply); Name = "REPLY"; - // Pick up accelerometer neutral values + // Show the accelerometer neutral values, if (data[5] == 0x00 && data[6] == 0x10) - { - g_accel.cal_zero.x = data[13]; - g_accel.cal_zero.y = data[14]; - g_accel.cal_zero.z = data[15]; - - g_accel.cal_g.x = data[17] - data[13]; - g_accel.cal_g.y = data[18] - data[14]; - g_accel.cal_g.z = data[19] - data[15]; - - //Console::Print("Got neutral values: %i %i %i\n", - // g_accel.cal_zero.x, g_accel.cal_zero.y, g_accel.cal_zero.z + g_accel.cal_g.z); - } + Console::Print("\nGame got neutral values: %i %i %i\n\n", + data[13], data[14], data[19]); break; case WM_WRITE_DATA_REPLY: // 0x22 size = sizeof(wm_acknowledge) - 1; @@ -634,6 +624,9 @@ void DoInitialize() // Load config settings g_Config.Load(); + // Run this first so that WiiMoteReal::Initialize() overwrites g_Eeprom + WiiMoteEmu::Initialize(); + /* We will run WiiMoteReal::Initialize() even if we are not using a real wiimote, to check if there is a real wiimote connected. We will initiate wiiuse.dll, but we will return before creating a new thread for it if we find no real Wiimotes. @@ -643,8 +636,6 @@ void DoInitialize() #if HAVE_WIIUSE if (g_Config.bConnectRealWiimote) WiiMoteReal::Initialize(); #endif - - WiiMoteEmu::Initialize(); } diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp index 4ce422786b..cf631943ec 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp @@ -73,6 +73,7 @@ bool g_LocalThread = true; bool g_MotionSensing = false; u64 g_UpdateTime = 0; int g_UpdateCounter = 0; +bool g_RunTemporary = false; //****************************************************************************** // Probably this class should be in its own file @@ -173,9 +174,11 @@ void ReadData() memcpy(m_LastReport.m_PayLoad, pBuffer, MAX_PAYLOAD); m_LastReportValid = true; - // Check if the data reporting mode is okay - //if (g_EmulatorRunning && pBuffer[0] != WiiMoteEmu::g_ReportingMode) - // SetDataReportingMode(); + /* Check if the data reporting mode is okay. This should not cause any harm outside the dual mode + (being able to switch between the real and emulated wiimote) because WiiMoteEmu::g_ReportingMode + should always have the right reporting mode. */ + if (g_EmulatorRunning && pBuffer[0] != WiiMoteEmu::g_ReportingMode) + SetDataReportingMode(); } else { @@ -427,42 +430,21 @@ int Initialize() // Call Wiiuse.dll g_WiiMotesFromWiiUse = wiiuse_init(MAX_WIIMOTES); g_NumberOfWiiMotes = wiiuse_find(g_WiiMotesFromWiiUse, MAX_WIIMOTES, 5); + if (g_NumberOfWiiMotes > 0) g_RealWiiMotePresent = true; + Console::Print("Found No of Wiimotes: %i\n", g_NumberOfWiiMotes); // Remove the wiiuse_poll() threshold wiiuse_set_accel_threshold(g_WiiMotesFromWiiUse[0], 0); - // Update the global accelerometer neutral values - while(g_WiiMotesFromWiiUse[0]->accel_calib.cal_zero.x == 0) - {wiiuse_poll(g_WiiMotesFromWiiUse, MAX_WIIMOTES);} - g_accel.cal_zero.x = g_WiiMotesFromWiiUse[0]->accel_calib.cal_zero.x; - g_accel.cal_zero.y = g_WiiMotesFromWiiUse[0]->accel_calib.cal_zero.y; - g_accel.cal_zero.z = g_WiiMotesFromWiiUse[0]->accel_calib.cal_zero.z; - g_accel.cal_g.x = g_WiiMotesFromWiiUse[0]->accel_calib.cal_g.x; - g_accel.cal_g.y = g_WiiMotesFromWiiUse[0]->accel_calib.cal_g.y; - g_accel.cal_g.z = g_WiiMotesFromWiiUse[0]->accel_calib.cal_g.z; - Console::Print("Got neutral values: %i %i %i\n", - g_accel.cal_zero.x, g_accel.cal_zero.y, g_accel.cal_zero.z + g_accel.cal_g.z); + // Set the sensor bar position, this only affects the internal wiiuse api functions + wiiuse_set_ir_position(g_WiiMotesFromWiiUse[0], WIIUSE_IR_ABOVE); - // Update the global extension settings - g_Config.bNunchuckConnected = (g_WiiMotesFromWiiUse[0]->exp.type == EXP_NUNCHUK); - g_Config.bClassicControllerConnected = (g_WiiMotesFromWiiUse[0]->exp.type == EXP_CLASSIC); - - if (g_NumberOfWiiMotes > 0) g_RealWiiMotePresent = true; - Console::Print("Found No of Wiimotes: %i\n", g_NumberOfWiiMotes); + // I don't seem to need wiiuse_connect() + //int Connect = wiiuse_connect(g_WiiMotesFromWiiUse, MAX_WIIMOTES); + //Console::Print("Connected: %i\n", Connect); // If we are connecting from the config window without a game running we flash the lights - if (!g_EmulatorRunning) - { - // I don't seem to need wiiuse_connect() - //int Connect = wiiuse_connect(g_WiiMotesFromWiiUse, MAX_WIIMOTES); - //Console::Print("Connected: %i\n", Connect); - - FlashLights(true); - } - else - { - //wiiuse_disconnect(g_WiiMotesFromWiiUse); - } + if (!g_EmulatorRunning) FlashLights(true); // Create Wiimote classes for (int i = 0; i < g_NumberOfWiiMotes; i++) @@ -472,6 +454,20 @@ int Initialize() if (g_NumberOfWiiMotes > 0) g_pReadThread = new Common::Thread(ReadWiimote_ThreadFunc, NULL); + // If we are not using the emulated wiimote we can run the thread temporary until the data has beeen copied + if(g_Config.bUseRealWiimote) g_RunTemporary = true; + + /* Allocate memory and copy the Wiimote eeprom accelerometer neutral values to g_Eeprom. We can't + change the neutral values the wiimote will report, I think, unless we update its eeprom? In any + case it's probably better to let the current calibration be where it is and adjust the global + values after that. I don't feel comfortable with overwriting critical data on a lot of Wiimotes. */ + byte *data = (byte*)malloc(sizeof(byte) * sizeof(WiiMoteEmu::EepromData_0)); + wiiuse_read_data(g_WiiMotesFromWiiUse[0], data, 0, sizeof(WiiMoteEmu::EepromData_0)); + + // Update the global extension settings + g_Config.bNunchuckConnected = (g_WiiMotesFromWiiUse[0]->exp.type == EXP_NUNCHUK); + g_Config.bClassicControllerConnected = (g_WiiMotesFromWiiUse[0]->exp.type == EXP_CLASSIC); + // Initialized if (g_NumberOfWiiMotes > 0) { g_RealWiiMoteInitialized = true; g_Shutdown = false; } @@ -551,7 +547,7 @@ void Update() { while (!g_Shutdown) { - if(g_Config.bUseRealWiimote) + if(g_Config.bUseRealWiimote && !g_RunTemporary) for (int i = 0; i < g_NumberOfWiiMotes; i++) g_WiiMotes[i]->ReadData(); else ReadWiimote(); diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h index 130075a0b4..5d36fc25ee 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h +++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h @@ -50,6 +50,7 @@ void ReadWiimote(); extern bool g_MotionSensing; extern u64 g_UpdateTime; extern int g_UpdateCounter; + extern bool g_RunTemporary; #endif }; // WiiMoteReal