Some Wiimote Cleanup, re/moved some globals to where they belong.

A few things could be solved differently/in a better way, but that would involve some classes and stuff (plus work)

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5097 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
j4ck.fr0st 2010-02-21 18:53:11 +00:00
parent b6a3df2fcf
commit f7f11211a1
11 changed files with 56 additions and 826 deletions

View file

@ -52,15 +52,6 @@ bool g_EmulatorRunning = false;
u32 g_ISOId = 0;
bool g_SearchDeviceDone = false;
bool g_RealWiiMotePresent = false;
bool g_RealWiiMoteInitialized = false;
bool g_RealWiiMoteAllocated = false;
bool g_EmulatedWiiMoteInitialized = false;
// Settings
accel_cal g_wm;
nu_cal g_nu;
cc_cal g_ClassicContCalibration;
gh3_cal g_GH3Calibration;
// Debugging
bool g_DebugAccelerometer = false;
@ -212,7 +203,7 @@ void Initialize(void *init)
g_ISOId = g_WiimoteInitialize.ISOId;
// Load the settings
g_Config.Load();
if(m_BasicConfigFrame) m_BasicConfigFrame->UpdateGUI();
m_BasicConfigFrame->UpdateGUI();
}
#endif
#if defined(HAVE_X11) && HAVE_X11
@ -235,13 +226,10 @@ void Initialize(void *init)
false. This function call will be done instantly whether there is a real
Wiimote connected or not. It takes no time for Wiiuse to check for
connected Wiimotes. */
#if HAVE_WIIUSE
//if (g_Config.bConnectRealWiimote) WiiMoteReal::Initialize();
if(!g_RealWiiMoteInitialized)
WiiMoteReal::Initialize();
if(!g_RealWiiMoteAllocated)
WiiMoteReal::Allocate();
#endif
#if HAVE_WIIUSE
WiiMoteReal::Initialize();
WiiMoteReal::Allocate();
#endif
}
// If a game is not running this is called by the Configuration window when it's closed
@ -254,7 +242,7 @@ void Shutdown(void)
g_ISOId = 0;
#if HAVE_WIIUSE
if (g_RealWiiMoteInitialized) WiiMoteReal::Shutdown();
WiiMoteReal::Shutdown();
#endif
WiiMoteEmu::Shutdown();
}
@ -466,545 +454,3 @@ int GetUpdateRate()
return 0;
#endif
}
/*
// Turn off all extensions
void DisableExtensions()
{
g_Config.iExtensionConnected = EXT_NONE;
}
void ReadDebugging(bool Emu, const void* _pData, int Size)
{
//
//const u8* data = (const u8*)_pData;
//u8* data = (u8*)_pData;
// Copy the data to a new location that we know are the right size
u8 data[32];
memset(data, 0, sizeof(data));
memcpy(data, _pData, Size);
int size;
bool DataReport = false;
std::string Name, TmpData;
switch(data[1])
{
case WM_STATUS_REPORT: // 0x20
size = sizeof(wm_status_report);
Name = "WM_STATUS_REPORT";
{
wm_status_report* pStatus = (wm_status_report*)(data + 2);
DEBUG_LOG(WIIMOTE, ""
"Extension Controller: %i "
//"Speaker enabled: %i "
//"IR camera enabled: %i "
//"LED 1: %i "
//"LED 2: %i "
//"LED 3: %i "
//"LED 4: %i "
"Battery low: %i",
pStatus->extension,
//pStatus->speaker,
//pStatus->ir,
//(pStatus->leds >> 0),
//(pStatus->leds >> 1),
//(pStatus->leds >> 2),
//(pStatus->leds >> 3),
pStatus->battery_low
);
// Update the global (for both the real and emulated) extension settings from whatever
// the real Wiimote use. We will enable the extension from the 0x21 report.
if(!Emu && !pStatus->extension)
{
DisableExtensions();
#if defined(HAVE_WX) && HAVE_WX
if (m_BasicConfigFrame) m_BasicConfigFrame->UpdateGUI();
#endif
}
}
break;
case WM_READ_DATA_REPLY: // 0x21
size = sizeof(wm_read_data_reply);
Name = "REPLY";
// data[4]: Size and error
// data[5, 6]: The registry offset
// Show the extension ID
if ((data[4] == 0x10 || data[4] == 0x20 || data[4] == 0x50) && data[5] == 0x00 && (data[6] == 0xfa || data[6] == 0xfe))
{
if(data[4] == 0x10)
TmpData.append(StringFromFormat("Game got the encrypted extension ID: %02x%02x", data[7], data[8]));
else if(data[4] == 0x50)
TmpData.append(StringFromFormat("Game got the encrypted extension ID: %02x%02x%02x%02x%02x%02x", data[7], data[8], data[9], data[10], data[11], data[12]));
// We have already sent the data report so we can safely decrypt it now
if(WiiMoteEmu::g_Encryption)
{
if(data[4] == 0x10)
wiimote_decrypt(&WiiMoteEmu::g_ExtKey, &data[0x07], 0x06, (data[4] >> 0x04) + 1);
if(data[4] == 0x50)
wiimote_decrypt(&WiiMoteEmu::g_ExtKey, &data[0x07], 0x02, (data[4] >> 0x04) + 1);
}
// Update the global extension settings. Enable the emulated extension from reading
// what the real Wiimote has connected. To keep the emulated and real Wiimote in sync.
if(data[4] == 0x10)
{
if (!Emu) DisableExtensions();
if (!Emu && data[7] == 0x00 && data[8] == 0x00)
g_Config.iExtensionConnected = EXT_NUNCHUCK;
if (!Emu && data[7] == 0x01 && data[8] == 0x01)
g_Config.iExtensionConnected = EXT_CLASSIC_CONTROLLER;
g_Config.Save();
WiiMoteEmu::UpdateEeprom();
#if defined(HAVE_WX) && HAVE_WX
if (m_BasicConfigFrame) m_BasicConfigFrame->UpdateGUI();
#endif
DEBUG_LOG(WIIMOTE, "%s", TmpData.c_str());
DEBUG_LOG(WIIMOTE, "Game got the decrypted extension ID: %02x%02x", data[7], data[8]);
}
else if(data[4] == 0x50)
{
if (!Emu) DisableExtensions();
if (!Emu && data[11] == 0x00 && data[12] == 0x00)
g_Config.iExtensionConnected = EXT_NUNCHUCK;
if (!Emu && data[11] == 0x01 && data[12] == 0x01)
g_Config.iExtensionConnected = EXT_CLASSIC_CONTROLLER;
g_Config.Save();
WiiMoteEmu::UpdateEeprom();
#if defined(HAVE_WX) && HAVE_WX
if (m_BasicConfigFrame) m_BasicConfigFrame->UpdateGUI();
#endif
DEBUG_LOG(WIIMOTE, "%s", TmpData.c_str());
DEBUG_LOG(WIIMOTE, "Game got the decrypted extension ID: %02x%02x%02x%02x%02x%02x", data[7], data[8], data[9], data[10], data[11], data[12]);
}
}
// Show the Wiimote neutral values
// The only difference between the Nunchuck and Wiimote that we go
// after is calibration here is the offset in memory. If needed we can
// check the preceding 0x17 request to.
if(data[4] == 0xf0 && data[5] == 0x00 && data[6] == 0x10)
{
if(data[6] == 0x10)
{
DEBUG_LOG(WIIMOTE, "Game got the Wiimote calibration:");
DEBUG_LOG(WIIMOTE, "Cal_zero.x: %i", data[7 + 6]);
DEBUG_LOG(WIIMOTE, "Cal_zero.y: %i", data[7 + 7]);
DEBUG_LOG(WIIMOTE, "Cal_zero.z: %i", data[7 + 8]);
DEBUG_LOG(WIIMOTE, "Cal_g.x: %i", data[7 + 10]);
DEBUG_LOG(WIIMOTE, "Cal_g.y: %i", data[7 + 11]);
DEBUG_LOG(WIIMOTE, "Cal_g.z: %i", data[7 +12]);
}
}
// Show the Nunchuck neutral values
if(data[4] == 0xf0 && data[5] == 0x00 && (data[6] == 0x20 || data[6] == 0x30))
{
// Save the encrypted data
TmpData = StringFromFormat("Read[%s] (enc): %s", (Emu ? "Emu" : "Real"), ArrayToString(data, size + 2, 0, 30).c_str());
// We have already sent the data report so we can safely decrypt it now
if(WiiMoteEmu::g_Encryption)
wiimote_decrypt(&WiiMoteEmu::g_ExtKey, &data[0x07], 0x00, (data[4] >> 0x04) + 1);
if (g_Config.iExtensionConnected == EXT_NUNCHUCK)
{
DEBUG_LOG(WIIMOTE, "Game got the Nunchuck calibration:");
DEBUG_LOG(WIIMOTE, "Cal_zero.x: %i", data[7 + 0]);
DEBUG_LOG(WIIMOTE, "Cal_zero.y: %i", data[7 + 1]);
DEBUG_LOG(WIIMOTE, "Cal_zero.z: %i", data[7 + 2]);
DEBUG_LOG(WIIMOTE, "Cal_g.x: %i", data[7 + 4]);
DEBUG_LOG(WIIMOTE, "Cal_g.y: %i", data[7 + 5]);
DEBUG_LOG(WIIMOTE, "Cal_g.z: %i", data[7 + 6]);
DEBUG_LOG(WIIMOTE, "Js.Max.x: %i", data[7 + 8]);
DEBUG_LOG(WIIMOTE, "Js.Min.x: %i", data[7 + 9]);
DEBUG_LOG(WIIMOTE, "Js.Center.x: %i", data[7 + 10]);
DEBUG_LOG(WIIMOTE, "Js.Max.y: %i", data[7 + 11]);
DEBUG_LOG(WIIMOTE, "Js.Min.y: %i", data[7 + 12]);
DEBUG_LOG(WIIMOTE, "JS.Center.y: %i", data[7 + 13]);
}
else // g_Config.bClassicControllerConnected
{
DEBUG_LOG(WIIMOTE, "Game got the Classic Controller calibration:");
DEBUG_LOG(WIIMOTE, "Lx.Max: %i", data[7 + 0]);
DEBUG_LOG(WIIMOTE, "Lx.Min: %i", data[7 + 1]);
DEBUG_LOG(WIIMOTE, "Lx.Center: %i", data[7 + 2]);
DEBUG_LOG(WIIMOTE, "Ly.Max: %i", data[7 + 3]);
DEBUG_LOG(WIIMOTE, "Ly.Min: %i", data[7 + 4]);
DEBUG_LOG(WIIMOTE, "Ly.Center: %i", data[7 + 5]);
DEBUG_LOG(WIIMOTE, "Rx.Max.x: %i", data[7 + 6]);
DEBUG_LOG(WIIMOTE, "Rx.Min.x: %i", data[7 + 7]);
DEBUG_LOG(WIIMOTE, "Rx.Center.x: %i", data[7 + 8]);
DEBUG_LOG(WIIMOTE, "Ry.Max.y: %i", data[7 + 9]);
DEBUG_LOG(WIIMOTE, "Ry.Min: %i", data[7 + 10]);
DEBUG_LOG(WIIMOTE, "Ry.Center: %i", data[7 + 11]);
DEBUG_LOG(WIIMOTE, "Lt.Neutral: %i", data[7 + 12]);
DEBUG_LOG(WIIMOTE, "Rt.Neutral %i", data[7 + 13]);
}
// Save the values if they come from the real Wiimote
if (!Emu)
{
// Save the values from the Nunchuck
if(data[7 + 0] != 0xff)
{
memcpy(WiiMoteEmu::g_RegExt + 0x20, &data[7], 0x10);
memcpy(WiiMoteEmu::g_RegExt + 0x30, &data[7], 0x10);
}
// Save the default values that should work with Wireless Nunchucks
else
{
WiiMoteEmu::UpdateExtRegisterBlocks();
}
WiiMoteEmu::UpdateEeprom();
}
// We got a third party nunchuck
else if(data[7 + 0] == 0xff)
{
memcpy(WiiMoteEmu::g_RegExt + 0x20, WiiMoteEmu::wireless_nunchuck_calibration, sizeof(WiiMoteEmu::wireless_nunchuck_calibration));
memcpy(WiiMoteEmu::g_RegExt + 0x30, WiiMoteEmu::wireless_nunchuck_calibration, sizeof(WiiMoteEmu::wireless_nunchuck_calibration));
}
// Show the encrypted data
DEBUG_LOG(WIIMOTE, "%s", TmpData.c_str());
}
break;
case WM_ACK_DATA: // 0x22
size = sizeof(wm_acknowledge) - 1;
Name = "REPLY";
break;
case WM_REPORT_CORE: // 0x30-0x37
size = sizeof(wm_report_core);
DataReport = true;
break;
case WM_REPORT_CORE_ACCEL:
size = sizeof(wm_report_core_accel);
DataReport = true;
break;
case WM_REPORT_CORE_EXT8:
size = sizeof(wm_report_core_accel_ir12);
DataReport = true;
break;
case WM_REPORT_CORE_ACCEL_IR12:
size = sizeof(wm_report_core_accel_ir12);
DataReport = true;
break;
case WM_REPORT_CORE_EXT19:
size = sizeof(wm_report_core_accel_ext16);
DataReport = true;
break;
case WM_REPORT_CORE_ACCEL_EXT16:
size = sizeof(wm_report_core_accel_ext16);
DataReport = true;
break;
case WM_REPORT_CORE_IR10_EXT9:
size = sizeof(wm_report_core_accel_ir10_ext6);
DataReport = true;
break;
case WM_REPORT_CORE_ACCEL_IR10_EXT6:
size = sizeof(wm_report_core_accel_ir10_ext6);
DataReport = true;
break;
default:
//PanicAlert("%s ReadDebugging: Unknown channel 0x%02x", (Emu ? "Emu" : "Real"), data[1]);
DEBUG_LOG(WIIMOTE, "%s ReadDebugging: Unknown channel 0x%02x", (Emu ? "Emu" : "Real"), data[1]);
return;
}
if (!DataReport && g_DebugComm)
{
std::string tmpData = ArrayToString(data, size + 2, 0, 30);
//LOGV(WIIMOTE, 3, " Data: %s", Temp.c_str());
DEBUG_LOG(WIIMOTE, "Read[%s] %s: %s", (Emu ? "Emu" : "Real"), Name.c_str(), tmpData.c_str()); // No timestamp
//DEBUG_LOG(WIIMOTE, " (%s): %s", Tm(true).c_str(), Temp.c_str()); // Timestamp
}
if (DataReport && g_DebugData)
{
// Decrypt extension data
if(WiiMoteEmu::g_ReportingMode == 0x37)
wiimote_decrypt(&WiiMoteEmu::g_ExtKey, &data[17], 0x00, 0x06);
if(WiiMoteEmu::g_ReportingMode == 0x35)
wiimote_decrypt(&WiiMoteEmu::g_ExtKey, &data[7], 0x00, 0x06);
// Produce string
//std::string TmpData = ArrayToString(data, size + 2, 0, 30);
//LOGV(WIIMOTE, 3, " Data: %s", Temp.c_str());
std::string TmpCore = "", TmpAccel = "", TmpIR = "", TmpExt = "", CCData = "";
TmpCore = StringFromFormat(
"%02x %02x %02x %02x",
data[0], data[1], data[2], data[3]); // Header and core buttons
TmpAccel = StringFromFormat(
"%03i %03i %03i",
data[4], data[5], data[6]); // Wiimote accelerometer
if (data[1] == 0x33) // WM_REPORT_CORE_ACCEL_IR12
{
TmpIR = StringFromFormat(
"%02x %02x %02x %02x %02x %02x"
" %02x %02x %02x %02x %02x %02x",
data[7], data[8], data[9], data[10], data[11], data[12],
data[13], data[14], data[15], data[16], data[17], data[18]);
}
if (data[1] == 0x35) // WM_REPORT_CORE_ACCEL_EXT16
{
TmpExt = StringFromFormat(
"%02x %02x %02x %02x %02x %02x",
data[7], data[8], // Nunchuck stick
data[9], data[10], data[11], // Nunchuck Accelerometer
data[12]); // Nunchuck buttons
CCData = WiiMoteEmu::CCData2Values(&data[7]);
}
if (data[1] == 0x37) // WM_REPORT_CORE_ACCEL_IR10_EXT6
{
TmpIR = StringFromFormat(
"%02x %02x %02x %02x %02x"
" %02x %02x %02x %02x %02x",
data[7], data[8], data[9], data[10], data[11],
data[12], data[13], data[14], data[15], data[16]);
TmpExt = StringFromFormat(
"%02x %02x %02x %02x %02x %02x",
data[17], data[18], // Nunchuck stick
data[19], data[20], data[21], // Nunchuck Accelerometer
data[22]); // Nunchuck buttons
CCData = WiiMoteEmu::CCData2Values(&data[17]);
}
// ---------------------------------------------
// Calculate the Wiimote roll and pitch in degrees
// -----------
int Roll, Pitch, RollAdj, PitchAdj;
WiiMoteEmu::PitchAccelerometerToDegree(data[4], data[5], data[6], Roll, Pitch, RollAdj, PitchAdj);
std::string RollPitch = StringFromFormat("%s %s %s %s",
(Roll >= 0) ? StringFromFormat(" %03i", Roll).c_str() : StringFromFormat("%04i", Roll).c_str(),
(Pitch >= 0) ? StringFromFormat(" %03i", Pitch).c_str() : StringFromFormat("%04i", Pitch).c_str(),
(RollAdj == Roll) ? " " : StringFromFormat("%04i*", RollAdj).c_str(),
(PitchAdj == Pitch) ? " " : StringFromFormat("%04i*", PitchAdj).c_str());
// -------------------------
// ---------------------------------------------
// Test the angles to x, y, z values formula by calculating the values back and forth
// -----------
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
Console->ClearScreen();
// Show a test of our calculations
WiiMoteEmu::TiltTest(data[4], data[5], data[6]);
u8 x, y, z;
//WiiMoteEmu::Tilt(x, y, z);
//WiiMoteEmu::TiltTest(x, y, z);
// -------------------------
// ---------------------------------------------
// Show the number of g forces on the axes
// -----------
float Gx = WiiMoteEmu::AccelerometerToG((float)data[4], (float)g_wm.cal_zero.x, (float)g_wm.cal_g.x);
float Gy = WiiMoteEmu::AccelerometerToG((float)data[5], (float)g_wm.cal_zero.y, (float)g_wm.cal_g.y);
float Gz = WiiMoteEmu::AccelerometerToG((float)data[6], (float)g_wm.cal_zero.z, (float)g_wm.cal_g.z);
std::string GForce = StringFromFormat("%s %s %s",
((int)Gx >= 0) ? StringFromFormat(" %i", (int)Gx).c_str() : StringFromFormat("%i", (int)Gx).c_str(),
((int)Gy >= 0) ? StringFromFormat(" %i", (int)Gy).c_str() : StringFromFormat("%i", (int)Gy).c_str(),
((int)Gz >= 0) ? StringFromFormat(" %i", (int)Gz).c_str() : StringFromFormat("%i", (int)Gz).c_str());
// -------------------------
// ---------------------------------------------
// Calculate the IR data
// -----------
if (data[1] == WM_REPORT_CORE_ACCEL_IR10_EXT6) WiiMoteEmu::IRData2DotsBasic(&data[7]); else WiiMoteEmu::IRData2Dots(&data[7]);
std::string IRData;
// Create a shortcut
struct WiiMoteEmu::SDot* Dot = WiiMoteEmu::g_Wiimote_kbd.IR.Dot;
for (int i = 0; i < 4; ++i)
{
if(Dot[i].Visible)
IRData += StringFromFormat("[%i] X:%04i Y:%04i Size:%i ", Dot[i].Order, Dot[i].Rx, Dot[i].Ry, Dot[i].Size);
else
IRData += StringFromFormat("[%i]", Dot[i].Order);
}
// Dot distance
IRData += StringFromFormat(" | Distance:%i", WiiMoteEmu::g_Wiimote_kbd.IR.Distance);
// -------------------------
// Classic Controller data
DEBUG_LOG(WIIMOTE, "Read[%s]: %s | %s | %s | %s | %s", (Emu ? "Emu" : "Real"),
TmpCore.c_str(), TmpAccel.c_str(), TmpIR.c_str(), TmpExt.c_str(), CCData.c_str());
// Formatted data only
//DEBUG_LOG(WIIMOTE, "Read[%s]: 0x%02x | %s | %s | %s", (Emu ? "Emu" : "Real"), data[1], RollPitch.c_str(), GForce.c_str(), IRData.c_str());
// IR data
//DEBUG_LOG(WIIMOTE, "Read[%s]: %s | %s", (Emu ? "Emu" : "Real"), TmpData.c_str(), IRData.c_str());
// Accelerometer data
//DEBUG_LOG(WIIMOTE, "Read[%s]: %s | %s | %s | %s | %s | %s | %s", (Emu ? "Emu" : "Real"),
// TmpCore.c_str(), TmpAccel.c_str(), TmpIR.c_str(), TmpExt.c_str(), RollPitch.c_str(), GForce.c_str(), CCData.c_str());
// Timestamp
//DEBUG_LOG(WIIMOTE, " (%s): %s", Tm(true).c_str(), Temp.c_str());
}
if(g_DebugAccelerometer)
{
// Accelerometer only
// Console::ClearScreen();
DEBUG_LOG(WIIMOTE, "Accel x, y, z: %03u %03u %03u", data[4], data[5], data[6]);
}
}
void InterruptDebugging(bool Emu, const void* _pData)
{
const u8* data = (const u8*)_pData;
std::string Name;
int size;
u16 SampleValue;
bool SoundData = false;
if (g_DebugComm) Name += StringFromFormat("Write[%s] ", (Emu ? "Emu" : "Real"));
switch(data[1])
{
case 0x10:
size = 4; // I don't know the size
if (g_DebugComm) Name.append("0x10");
break;
case WM_LEDS: // 0x11
size = sizeof(wm_leds);
if (g_DebugComm) Name.append("WM_LEDS");
break;
case WM_REPORT_MODE: // 0x12
size = sizeof(wm_report_mode);
if (g_DebugComm) Name.append("WM_REPORT_MODE");
break;
case WM_REQUEST_STATUS: // 0x15
size = sizeof(wm_request_status);
if (g_DebugComm) Name.append("WM_REQUEST_STATUS");
break;
case WM_WRITE_DATA: // 0x16
if (g_DebugComm) Name.append("WM_WRITE_DATA");
size = sizeof(wm_write_data);
// data[2]: The address space 0, 1 or 2
// data[3]: The registry type
// data[5]: The registry offset
// data[6]: The number of bytes
switch(data[2] >> 0x01)
{
case WM_SPACE_EEPROM:
if (g_DebugComm) Name.append(" REG_EEPROM"); break;
case WM_SPACE_REGS1:
case WM_SPACE_REGS2:
switch(data[3])
{
case 0xa2:
// data[8]: FF, 0x00 or 0x40
// data[9, 10]: RR RR, 0xd007 or 0x401f
// data[11]: VV, 0x00 to 0xff or 0x00 to 0x40
if (g_DebugComm)
{
Name.append(" REG_SPEAKER");
if(data[6] == 7)
{
DEBUG_LOG(WIIMOTE, "Sound configuration:");
if(data[8] == 0x00)
{
memcpy(&SampleValue, &data[9], 2);
DEBUG_LOG(WIIMOTE, " Data format: 4-bit ADPCM (%i Hz)", 6000000 / SampleValue);
DEBUG_LOG(WIIMOTE, " Volume: %02i%%", (data[11] / 0x40) * 100);
}
else if (data[8] == 0x40)
{
memcpy(&SampleValue, &data[9], 2);
DEBUG_LOG(WIIMOTE, " Data format: 8-bit PCM (%i Hz)", 12000000 / SampleValue);
DEBUG_LOG(WIIMOTE, " Volume: %02i%%", (data[11] / 0xff) * 100);
}
}
}
break;
case 0xa4:
if (g_DebugComm) Name.append(" REG_EXT");
// Update the encryption mode
if (data[3] == 0xa4 && data[5] == 0xf0)
{
if (data[7] == 0xaa)
WiiMoteEmu::g_Encryption = true;
else if (data[7] == 0x55)
WiiMoteEmu::g_Encryption = false;
DEBUG_LOG(WIIMOTE, "Extension enryption turned %s", WiiMoteEmu::g_Encryption ? "On" : "Off");
}
break;
case 0xb0:
if (g_DebugComm) Name.append(" REG_IR"); break;
}
break;
}
break;
case WM_READ_DATA: // 0x17
size = sizeof(wm_read_data);
// data[2]: The address space 0, 1 or 2
// data[3]: The registry type
// data[5]: The registry offset
// data[7]: The number of bytes, 6 and 7 together
if (g_DebugComm) Name.append("WM_READ_DATA");
switch(data[2] >> 0x01)
{
case WM_SPACE_EEPROM:
if (g_DebugComm) Name.append(" REG_EEPROM"); break;
case WM_SPACE_REGS1:
case WM_SPACE_REGS2:
switch(data[3])
{
case 0xa2:
if (g_DebugComm) Name.append(" REG_SPEAKER"); break;
case 0xa4:
if (g_DebugComm) Name.append(" REG_EXT"); break;
case 0xb0:
if (g_DebugComm) Name.append(" REG_IR"); break;
}
break;
}
break;
case WM_IR_PIXEL_CLOCK: // 0x13
case WM_IR_LOGIC: // 0x1a
if (g_DebugComm) Name.append("WM_IR");
size = 1;
break;
case WM_SPEAKER_ENABLE: // 0x14
case WM_SPEAKER_MUTE: // 0x19
if (g_DebugComm) Name.append("WM_SPEAKER");
size = 1;
if(data[1] == 0x14) {
DEBUG_LOG(WIIMOTE, "Speaker %s", (data[2] & 4) ? "On" : "Off");
} else if(data[1] == 0x19) {
DEBUG_LOG(WIIMOTE, "Speaker %s", (data[2] & 4) ? "Muted" : "Unmuted");
}
break;
case WM_WRITE_SPEAKER_DATA: // 0x18
if (g_DebugComm) Name.append("WM_SPEAKER_DATA");
size = 21;
break;
default:
size = 15;
DEBUG_LOG(WIIMOTE, "%s InterruptDebugging: Unknown channel 0x%02x", (Emu ? "Emu" : "Real"), data[1]);
break;
}
if (g_DebugComm && !SoundData)
{
std::string Temp = ArrayToString(data, size + 2, 0, 30);
//LOGV(WIIMOTE, 3, " Data: %s", Temp.c_str());
DEBUG_LOG(WIIMOTE, "%s: %s", Name.c_str(), Temp.c_str());
//DEBUG_LOG(WIIMOTE, " (%s): %s", Tm(true).c_str(), Temp.c_str());
}
if (g_DebugSoundData && SoundData)
{
std::string Temp = ArrayToString(data, size + 2, 0, 30);
//LOGV(WIIMOTE, 3, " Data: %s", Temp.c_str());
DEBUG_LOG(WIIMOTE, "%s: %s", Name.c_str(), Temp.c_str());
//DEBUG_LOG(WIIMOTE, " (%s): %s", Tm(true).c_str(), Temp.c_str());
}
}
*/