revert to r4531, but keep the changes from the following revisions: 4533,4550-4551,4556-4559

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4566 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Shawn Hoffman 2009-11-14 17:08:32 +00:00
parent 18305c7c49
commit 06aa62504c
66 changed files with 2170 additions and 1570 deletions

View File

@ -201,23 +201,3 @@ std::string CPUInfo::Summarize()
if (bLongMode) sum += ", 64-bit support"; if (bLongMode) sum += ", 64-bit support";
return sum; return sum;
} }
// Turn the cpu info into a string we can show(This version uses headings and line breaks)
std::string CPUInfo::Summarize_long()
{
std::string sum;
sum = StringFromFormat("CPU Brand: %s\n",cpu_string);
sum += StringFromFormat("Number of cores: %i \n ",num_cores);
sum+= "Supported instruction sets:\n";
if (bSSE) sum += " -SSE\n";
if (bSSE2) sum += " -SSE2\n";
if (bSSE3) sum += " -SSE3\n";
if (bSSSE3) sum += " -SSSE3\n";
if (bSSE4_1) sum += " -SSE4.1\n";
if (bSSE4_2) sum += " -SSE4.2\n";
if (bLongMode) sum += "64-bit supported";
return sum;
}

View File

@ -58,9 +58,6 @@ struct CPUInfo
// Turn the cpu info into a string we can show // Turn the cpu info into a string we can show
std::string Summarize(); std::string Summarize();
// Turn the cpu info into a string we can show(This version uses headings and line breaks)
std::string Summarize_long();
}; };
extern CPUInfo cpu_info; extern CPUInfo cpu_info;

View File

@ -251,14 +251,6 @@ void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool
#endif #endif
} }
void ConsoleListener::CustomLog(const char *Text)
{
#ifdef _WIN32
DWORD cCharsWritten;
WriteConsole(hConsole, Text, (DWORD)strlen(Text), &cCharsWritten, NULL);
#endif
}
void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text) void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text)
{ {
#if defined(_WIN32) #if defined(_WIN32)

View File

@ -83,7 +83,6 @@ public:
#ifdef _WIN32 #ifdef _WIN32
COORD GetCoordinates(int BytesRead, int BufferWidth); COORD GetCoordinates(int BytesRead, int BufferWidth);
#endif #endif
void CustomLog(const char *Text);
void Log(LogTypes::LOG_LEVELS, const char *Text); void Log(LogTypes::LOG_LEVELS, const char *Text);
void ClearScreen(bool Cursor = true); void ClearScreen(bool Cursor = true);

View File

@ -51,7 +51,7 @@ enum
ZCODE_END = 0x00, ZCODE_END = 0x00,
ZCODE_NORM = 0x02, ZCODE_NORM = 0x02,
ZCODE_ROW = 0x03, ZCODE_ROW = 0x03,
ZCODE_04 = 0x04, ZCODE_MEM_COPY = 0x04,
// Conditonal Codes // Conditonal Codes
CONDTIONAL_IF_EQUAL = 0x01, CONDTIONAL_IF_EQUAL = 0x01,
@ -227,17 +227,16 @@ void LogInfo(const char *format, ...)
void RunAllActive() void RunAllActive()
{ {
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats) if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats) {
{
for (std::vector<ARCode>::iterator i = activeCodes.begin(); i != activeCodes.end(); ++i) for (std::vector<ARCode>::iterator i = activeCodes.begin(); i != activeCodes.end(); ++i)
{ {
if (i->active) if (i->active)
{ {
i->active = RunCode(*i); if (!RunCode(*i))
i->active = false;
LogInfo("\n"); LogInfo("\n");
} }
} }
if (!b_RanOnce) if (!b_RanOnce)
b_RanOnce = true; b_RanOnce = true;
} }
@ -293,18 +292,16 @@ bool RunCode(const ARCode &arcode) {
LogInfo("Command: %08x", cmd); LogInfo("Command: %08x", cmd);
// Do Fill & Slide // Do Fill & Slide
if (doFillNSlide) if (doFillNSlide) {
{
doFillNSlide = false; doFillNSlide = false;
LogInfo("Doing Fill And Slide"); LogInfo("Doing Fill And Slide");
if (!ZeroCode_FillAndSlide(val_last, addr, data)) if (!ZeroCode_FillAndSlide(val_last, addr, data))
return false; return false;
continue; continue;
} }
// Memory Copy // Memory Copy
if (doMemoryCopy) if (doMemoryCopy) {
{
doMemoryCopy = false; doMemoryCopy = false;
LogInfo("Doing Memory Copy"); LogInfo("Doing Memory Copy");
if (!ZeroCode_MemoryCopy(val_last, addr, data)) if (!ZeroCode_MemoryCopy(val_last, addr, data))
@ -313,8 +310,7 @@ bool RunCode(const ARCode &arcode) {
} }
// ActionReplay program self modification codes // ActionReplay program self modification codes
if (addr >= 0x00002000 && addr < 0x00003000) if (addr >= 0x00002000 && addr < 0x00003000) {
{
LogInfo("This action replay simulator does not support codes that modify Action Replay itself."); LogInfo("This action replay simulator does not support codes that modify Action Replay itself.");
PanicAlert("This action replay simulator does not support codes that modify Action Replay itself."); PanicAlert("This action replay simulator does not support codes that modify Action Replay itself.");
return false; return false;
@ -343,7 +339,7 @@ bool RunCode(const ARCode &arcode) {
LogInfo("ZCode: Executes all codes in the same row, Set register 1BB4 to 1 (zcode not supported)"); LogInfo("ZCode: Executes all codes in the same row, Set register 1BB4 to 1 (zcode not supported)");
PanicAlert("Zero 3 code not supported"); PanicAlert("Zero 3 code not supported");
return false; return false;
case ZCODE_04: // Fill & Slide or Memory Copy case ZCODE_MEM_COPY: // Fill & Slide or Memory Copy
if (((addr >> 25) & 0x03) == 0x3) if (((addr >> 25) & 0x03) == 0x3)
{ {
LogInfo("ZCode: Memory Copy"); LogInfo("ZCode: Memory Copy");
@ -558,7 +554,7 @@ bool Subtype_WriteToPointer(u32 addr, u32 data)
bool Subtype_AddCode(u32 addr, u32 data) bool Subtype_AddCode(u32 addr, u32 data)
{ {
// Used to incrment a value in memory // Used to incrment a value in memory
u32 new_addr = (addr & 0x81FFFFFF); u32 new_addr = (addr & 0x01FFFFFF) | 0x80000000;
u8 size = (addr >> 25) & 0x03; u8 size = (addr >> 25) & 0x03;
LogInfo("Hardware Address: %08x", new_addr); LogInfo("Hardware Address: %08x", new_addr);
LogInfo("Size: %08x", size); LogInfo("Size: %08x", size);
@ -589,15 +585,12 @@ bool Subtype_AddCode(u32 addr, u32 data)
{ {
LogInfo("32-bit floating Add"); LogInfo("32-bit floating Add");
LogInfo("--------"); LogInfo("--------");
union conv {float x; u32 y;};
u32 read = Memory::Read_U32(new_addr); conv c1;
float fread = *((float*)&read); c1.y = Memory::Read_U32(new_addr);
fread += (float)data; c1.x += (float)data;
u32 newval = *((u32*)&fread); Memory::Write_U32((u32)c1.x, new_addr);
Memory::Write_U32(newval, new_addr); LogInfo("Wrote %08x to address %08x", (u32)c1.x, new_addr);
LogInfo("Old Value %08x", read);
LogInfo("Increment %08x", data);
LogInfo("New value %08x", newval);
LogInfo("--------"); LogInfo("--------");
break; break;
} }
@ -622,7 +615,7 @@ bool Subtype_MasterCodeAndWriteToCCXXXXXX(u32 addr, u32 data)
bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more testing bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more testing
{ {
u32 new_addr = (val_last & 0x81FFFFFF); u32 new_addr = (val_last & 0x01FFFFFF) | 0x80000000;
u8 size = (val_last >> 25) & 0x03; u8 size = (val_last >> 25) & 0x03;
s16 addr_incr = (s16)(data & 0xFFFF); s16 addr_incr = (s16)(data & 0xFFFF);
s8 val_incr = (s8)((data & 0xFF000000) >> 24); s8 val_incr = (s8)((data & 0xFF000000) >> 24);

View File

@ -235,7 +235,8 @@ void PatchEngineCallback(u64 userdata, int cyclesLate)
// Patch mem and run the Action Replay // Patch mem and run the Action Replay
PatchEngine::ApplyFramePatches(); PatchEngine::ApplyFramePatches();
PatchEngine::ApplyARPatches(); PatchEngine::ApplyARPatches();
CoreTiming::ScheduleEvent((CPU_CORE_CLOCK / 5000) - cyclesLate, et_PatchEngine);
CoreTiming::ScheduleEvent((GetTicksPerSecond() / 60) - cyclesLate, et_PatchEngine);
} }
void Init() void Init()

View File

@ -19,7 +19,6 @@
// Supports simple memory patches, and has a partial Action Replay implementation // Supports simple memory patches, and has a partial Action Replay implementation
// in ActionReplay.cpp/h. // in ActionReplay.cpp/h.
// TODO: Still even needed? Zelda WW now works with improved DSP code.
// Zelda item hang fixes: // Zelda item hang fixes:
// [Tue Aug 21 2007] [18:30:40] <Knuckles-> 0x802904b4 in US released // [Tue Aug 21 2007] [18:30:40] <Knuckles-> 0x802904b4 in US released
// [Tue Aug 21 2007] [18:30:53] <Knuckles-> 0x80294d54 in EUR Demo version // [Tue Aug 21 2007] [18:30:53] <Knuckles-> 0x80294d54 in EUR Demo version

View File

@ -76,11 +76,12 @@ CPluginManager::~CPluginManager()
for (int i = 0; i < MAXPADS; i++) for (int i = 0; i < MAXPADS; i++)
{ {
if (m_pad[i] && (OkayToInitPlugin(i) == -1) && !m_params->m_strPadPlugin[i].empty()) if (m_pad[i] && (OkayToInitPlugin(i) == -1))
{ {
INFO_LOG(CONSOLE, "Delete: %i\n", i); INFO_LOG(CONSOLE, "Delete: %i\n", i);
FreePad(i); delete m_pad[i];
} }
m_pad[i] = NULL;
} }
for (int i = 0; i < MAXWIIMOTES; i++) for (int i = 0; i < MAXWIIMOTES; i++)
@ -164,7 +165,7 @@ void CPluginManager::ShutdownPlugins()
if (m_pad[i]) if (m_pad[i])
{ {
m_pad[i]->Shutdown(); m_pad[i]->Shutdown();
//delete m_pad[i]; Causes crash on stop //delete m_pad[i];
} }
//m_pad[i] = NULL; //m_pad[i] = NULL;
} }
@ -301,7 +302,7 @@ void *CPluginManager::LoadPlugin(const char *_rFilename, int Number)
PanicAlert("Can't open %s, it has a missing function", _rFilename); PanicAlert("Can't open %s, it has a missing function", _rFilename);
return NULL; return NULL;
} }
// Call the DLL function SetGlobals // Call the DLL function SetGlobals
plugin->SetGlobals(m_PluginGlobals); plugin->SetGlobals(m_PluginGlobals);
return plugin; return plugin;

View File

@ -103,14 +103,11 @@ void dsp_write_aram_d3(u16 value)
case 0xA: // 16-bit writes case 0xA: // 16-bit writes
DSPHost_WriteHostMemory(value >> 8, Address); DSPHost_WriteHostMemory(value >> 8, Address);
DSPHost_WriteHostMemory(value & 0xFF, Address + 1); DSPHost_WriteHostMemory(value & 0xFF, Address + 1);
Address += 2;
break; break;
default: default:
ERROR_LOG(DSPLLE, "dsp_write_aram_d3: Unseen Format %i", gdsp_ifx_regs[DSP_FORMAT]); ERROR_LOG(DSPLLE, "dsp_write_aram_d3: Unseen Format %i", gdsp_ifx_regs[DSP_FORMAT]);
break; break;
} }
gdsp_ifx_regs[DSP_ACCAH] = Address >> 16;
gdsp_ifx_regs[DSP_ACCAL] = Address & 0xffff;
} }
u16 dsp_read_accelerator() u16 dsp_read_accelerator()
@ -156,10 +153,9 @@ u16 dsp_read_accelerator()
// Set address back to start address. // Set address back to start address.
Address = (gdsp_ifx_regs[DSP_ACSAH] << 16) | gdsp_ifx_regs[DSP_ACSAL]; Address = (gdsp_ifx_regs[DSP_ACSAH] << 16) | gdsp_ifx_regs[DSP_ACSAL];
// Do we really need both? (nakee: seems to cause problems with some // Do we really need both?
// AX games) DSPHost_InterruptRequest();
// DSPHost_InterruptRequest(); DSPCore_SetException(EXP_2);
// DSPCore_SetException(EXP_2);
DSPCore_SetException(EXP_ACCOV); DSPCore_SetException(EXP_ACCOV);
// Somehow, YN1 and YN2 must be initialized with their "loop" values, // Somehow, YN1 and YN2 must be initialized with their "loop" values,

View File

@ -161,7 +161,7 @@ void gdsp_ifx_write(u16 addr, u16 val)
break; break;
case 0xd3: // ZeldaUnk (accelerator WRITE) case 0xd3: // ZeldaUnk (accelerator WRITE)
// NOTICE_LOG(DSPLLE, "Write To ZeldaUnk pc=%04x (%04x)", g_dsp.pc, val); NOTICE_LOG(DSPLLE, "Write To ZeldaUnk pc=%04x (%04x)", g_dsp.pc, val);
dsp_write_aram_d3(val); dsp_write_aram_d3(val);
break; break;
@ -215,7 +215,7 @@ u16 gdsp_ifx_read(u16 addr)
return dsp_read_accelerator(); return dsp_read_accelerator();
case 0xd3: case 0xd3:
//NOTICE_LOG(DSPLLE, "Read from ZeldaUnk pc=%04x", g_dsp.pc); NOTICE_LOG(DSPLLE, "Read from ZeldaUnk pc=%04x", g_dsp.pc);
return dsp_read_aram_d3(); return dsp_read_aram_d3();
default: default:
@ -316,7 +316,7 @@ void gdsp_do_dma()
exit(0); exit(0);
} }
#if defined(_DEBUG) || defined(DEBUGFAST) #if defined(_DEBUG) || defined(DEBUGFAST)
DEBUG_LOG(DSPLLE, "DMA pc: %04x ctl: %04x addr: %08x da: %04x size: %04x", g_dsp.pc, ctl, addr, dsp_addr, len); NOTICE_LOG(DSPLLE, "DMA pc: %04x ctl: %04x addr: %08x da: %04x size: %04x", g_dsp.pc, ctl, addr, dsp_addr, len);
#endif #endif
switch (ctl & 0x3) switch (ctl & 0x3)
{ {

View File

@ -42,8 +42,6 @@ const DSPOPCTemplate opcodes[] =
{"DAR", 0x0004, 0xfffc, DSPInterpreter::dar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false}, {"DAR", 0x0004, 0xfffc, DSPInterpreter::dar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false},
{"IAR", 0x0008, 0xfffc, DSPInterpreter::iar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false}, {"IAR", 0x0008, 0xfffc, DSPInterpreter::iar, nop, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false},
{"ADDARN", 0x0010, 0xfff0, DSPInterpreter::addarn, nop, 1, 2, {{P_REG, 1, 0, 0, 0x0003}, {P_REG04, 1, 0, 2, 0x000c}}, false},
{"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {}, false}, {"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {}, false},
{"RETGE", 0x02d0, 0xffff, DSPInterpreter::ret, nop, 1, 0, {}, false}, {"RETGE", 0x02d0, 0xffff, DSPInterpreter::ret, nop, 1, 0, {}, false},
@ -126,9 +124,10 @@ const DSPOPCTemplate opcodes[] =
{"LSR", 0x1440, 0xfec0, DSPInterpreter::lsr, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false}, {"LSR", 0x1440, 0xfec0, DSPInterpreter::lsr, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
{"ASL", 0x1480, 0xfec0, DSPInterpreter::asl, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false}, {"ASL", 0x1480, 0xfec0, DSPInterpreter::asl, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
{"ASR", 0x14c0, 0xfec0, DSPInterpreter::asr, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false}, {"ASR", 0x14c0, 0xfec0, DSPInterpreter::asr, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}}, false},
{"LSRN", 0x02ca, 0xffff, DSPInterpreter::lsrn, nop, 1, 0, {}, false}, // discovered by ector! // discovered by ector!
{"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, nop, 1, 0, {}, false}, // discovered by ector! {"LSRN", 0x02ca, 0xffff, DSPInterpreter::lsrn, nop, 1, 0, {}, false},
{"ASRN", 0x02cb, 0xffff, DSPInterpreter::asrn, nop, 1, 0, {}, false},
{"LRI", 0x0080, 0xffe0, DSPInterpreter::lri, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}}, false}, {"LRI", 0x0080, 0xffe0, DSPInterpreter::lri, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"LR", 0x00c0, 0xffe0, DSPInterpreter::lr, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}}, false}, {"LR", 0x00c0, 0xffe0, DSPInterpreter::lr, nop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}}, false},
@ -138,20 +137,25 @@ const DSPOPCTemplate opcodes[] =
{"SI", 0x1600, 0xff00, DSPInterpreter::si, nop, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}}, false}, {"SI", 0x1600, 0xff00, DSPInterpreter::si, nop, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ADDIS", 0x0400, 0xfe00, DSPInterpreter::addis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false}, {"LRS", 0x2000, 0xf800, DSPInterpreter::lrs, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}}, false},
{"CMPIS", 0x0600, 0xfe00, DSPInterpreter::cmpis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false}, {"SRS", 0x2800, 0xf800, DSPInterpreter::srs, nop, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}}, false},
{"LRIS", 0x0800, 0xf800, DSPInterpreter::lris, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_IMM, 1, 0, 0, 0x00ff}}, false}, {"LRIS", 0x0800, 0xf800, DSPInterpreter::lris, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
{"ADDI", 0x0200, 0xfeff, DSPInterpreter::addi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // F|RES: missing S64 {"ADDIS", 0x0400, 0xfe00, DSPInterpreter::addis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
{"XORI", 0x0220, 0xfeff, DSPInterpreter::xori, nop, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, {"CMPIS", 0x0600, 0xfe00, DSPInterpreter::cmpis, nop, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}}, false},
{"ANDI", 0x0240, 0xfeff, DSPInterpreter::andi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, {"ANDI", 0x0240, 0xfeff, DSPInterpreter::andi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ORI", 0x0260, 0xfeff, DSPInterpreter::ori, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"CMPI", 0x0280, 0xfeff, DSPInterpreter::cmpi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ANDF", 0x02a0, 0xfeff, DSPInterpreter::andf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ANDCF", 0x02c0, 0xfeff, DSPInterpreter::andcf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, {"ANDCF", 0x02c0, 0xfeff, DSPInterpreter::andcf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"XORI", 0x0220, 0xfeff, DSPInterpreter::xori, nop, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ANDF", 0x02a0, 0xfeff, DSPInterpreter::andf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ORI", 0x0260, 0xfeff, DSPInterpreter::ori, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ORF", 0x02e0, 0xfeff, DSPInterpreter::orf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // Hermes: ??? (has it commented out) {"ORF", 0x02e0, 0xfeff, DSPInterpreter::orf, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // Hermes: ??? (has it commented out)
{"ADDI", 0x0200, 0xfeff, DSPInterpreter::addi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false}, // F|RES: missing S64
{"CMPI", 0x0280, 0xfeff, DSPInterpreter::cmpi, nop, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}}, false},
{"ILRR", 0x0210, 0xfefc, DSPInterpreter::ilrr, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false}, {"ILRR", 0x0210, 0xfefc, DSPInterpreter::ilrr, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false},
{"ILRRD", 0x0214, 0xfefc, DSPInterpreter::ilrrd, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false}, // Hermes doesn't list this {"ILRRD", 0x0214, 0xfefc, DSPInterpreter::ilrrd, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false}, // Hermes doesn't list this
{"ILRRI", 0x0218, 0xfefc, DSPInterpreter::ilrri, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false}, {"ILRRI", 0x0218, 0xfefc, DSPInterpreter::ilrri, nop, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false},
@ -174,10 +178,8 @@ const DSPOPCTemplate opcodes[] =
{"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, nop, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false}, {"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, nop, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false},
{"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, nop, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false}, {"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, nop, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false},
//2 {"ADDARN", 0x0010, 0xfff0, DSPInterpreter::addarn, nop, 1, 2, {{P_REG, 1, 0, 0, 0x0003}, {P_REG04, 1, 0, 2, 0x000c}}, false},
{"LRS", 0x2000, 0xf800, DSPInterpreter::lrs, nop, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}}, false},
{"SRS", 0x2800, 0xf800, DSPInterpreter::srs, nop, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}}, false},
// opcodes that can be extended // opcodes that can be extended
// extended opcodes, note size of opcode will be set to 0 // extended opcodes, note size of opcode will be set to 0

View File

@ -33,7 +33,7 @@ void clr(const UDSPInstruction& opc)
u8 reg = (opc.hex >> 11) & 0x1; u8 reg = (opc.hex >> 11) & 0x1;
dsp_set_long_acc(reg, 0); dsp_set_long_acc(reg, 0);
Update_SR_Register64(0); Update_SR_Register64((s64)0); // really?
zeroWriteBackLog(); zeroWriteBackLog();
} }

View File

@ -455,7 +455,7 @@ void maddx(const UDSPInstruction& opc)
u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0);
u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1);
s64 prod = dsp_multiply_add(val1, val2); s64 prod = dsp_multiply_add(val1, val2, true);
zeroWriteBackLog(); zeroWriteBackLog();
dsp_set_long_prod(prod); dsp_set_long_prod(prod);
@ -474,7 +474,7 @@ void msubx(const UDSPInstruction& opc)
u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); u16 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0);
u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); u16 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1);
s64 prod = dsp_multiply_sub(val1, val2); s64 prod = dsp_multiply_sub(val1, val2, true);
zeroWriteBackLog(); zeroWriteBackLog();
dsp_set_long_prod(prod); dsp_set_long_prod(prod);

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="9,00" Version="9.00"
Name="Dolphin" Name="Dolphin"
ProjectGUID="{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}" ProjectGUID="{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}"
RootNamespace="DolphinWX" RootNamespace="DolphinWX"
@ -91,7 +91,7 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/Dolphin.exe&quot;" OutputFile="../../../Binary/Win32/Dolphin.exe"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)" AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
@ -208,13 +208,13 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/Dolphin.exe&quot;" OutputFile="../../../Binary/x64/Dolphin.exe"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)" AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
IgnoreAllDefaultLibraries="false" IgnoreAllDefaultLibraries="false"
IgnoreDefaultLibraryNames="" IgnoreDefaultLibraryNames=""
GenerateDebugInformation="false" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
SubSystem="2" SubSystem="2"
BaseAddress="0x00400000" BaseAddress="0x00400000"
@ -321,7 +321,7 @@
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalOptions="/TLBID:1" AdditionalOptions="/TLBID:1"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/DolphinD.exe&quot;" OutputFile="../../../Binary/Win32/DolphinD.exe"
LinkIncremental="2" LinkIncremental="2"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)" AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
@ -432,7 +432,7 @@
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalOptions="/TLBID:1" AdditionalOptions="/TLBID:1"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib wxmsw28ud_adv.lib wxmsw28ud_aui.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/DolphinD.exe&quot;" OutputFile="../../../Binary/x64/DolphinD.exe"
LinkIncremental="2" LinkIncremental="2"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)" AdditionalLibraryDirectories="$(SolutionDir)\$(ConfigurationName)\$(PlatformName);..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)"
@ -546,7 +546,7 @@
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalOptions="/NODEFAULTLIB:msvcrt.lib&#x0D;&#x0A;/NODEFAULTLIB:libcmtd.lib" AdditionalOptions="/NODEFAULTLIB:msvcrt.lib&#x0D;&#x0A;/NODEFAULTLIB:libcmtd.lib"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/DolphinDF.exe&quot;" OutputFile="../../../Binary/Win32/DolphinDF.exe"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;" AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;"
@ -659,7 +659,7 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/DolphinDF.exe" OutputFile="../../../Binary/x64/DolphinDF.exe"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;" AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;"
@ -773,7 +773,7 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/Dolphin.exeIL&quot;" OutputFile="../../../Binary/Win32/DolphinIL.exe"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;" AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;"
@ -889,7 +889,7 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib" AdditionalDependencies="comctl32.lib rpcrt4.lib wxbase28u.lib wxmsw28u_core.lib wxmsw28u_adv.lib wxmsw28u_aui.lib Bochs_disasm.lib LZO.lib SFML_Network.lib zlib.lib"
OutputFile="&quot;$(SolutionDir)../Binary/$(PlatformName)/DolphinIL.exe&quot;" OutputFile="../../../Binary/x64/DolphinIL.exe"
LinkIncremental="1" LinkIncremental="1"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;" AdditionalLibraryDirectories="&quot;$(SolutionDir)\Release\$(PlatformName)&quot;;&quot;..\..\..\Externals\wxWidgets\lib\vc_lib\$(PlatformName)&quot;"

View File

@ -116,8 +116,8 @@ void CARCodeAddEdit::SaveCheatData(wxCommandEvent& WXUNUSED (event))
if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8) if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8)
{ {
u32 addr = strtoul(pieces[0].c_str(), NULL, 16); u32 addr = strtol(pieces[0].c_str(), NULL, 16);
u32 value = strtoul(pieces[1].c_str(), NULL, 16); u32 value = strtol(pieces[1].c_str(), NULL, 16);
// Decrypted code // Decrypted code
tempEntries.push_back(ActionReplay::AREntry(addr, value)); tempEntries.push_back(ActionReplay::AREntry(addr, value));
} }

View File

@ -145,11 +145,11 @@ int abc = 0;
switch(wParam) switch(wParam)
{ {
// Stop // Stop
case WM_USER_STOP: case OPENGL_WM_USER_STOP:
main_frame->DoStop(); main_frame->DoStop();
return 0; return 0;
case WM_USER_CREATE: case OPENGL_WM_USER_CREATE:
// We don't have a local setting for bRenderToMain but we can detect it this way instead // We don't have a local setting for bRenderToMain but we can detect it this way instead
//PanicAlert("main call %i %i %i %i", lParam, (HWND)Core::GetWindowHandle(), MSWGetParent_((HWND)Core::GetWindowHandle()), (HWND)this->GetHWND()); //PanicAlert("main call %i %i %i %i", lParam, (HWND)Core::GetWindowHandle(), MSWGetParent_((HWND)Core::GetWindowHandle()), (HWND)this->GetHWND());
if (lParam == NULL) if (lParam == NULL)
@ -232,7 +232,6 @@ EVT_MENU(IDM_BROWSE, CFrame::OnBrowse)
EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard) EVT_MENU(IDM_MEMCARD, CFrame::OnMemcard)
EVT_MENU(IDM_CHEATS, CFrame::OnShow_CheatsWindow) EVT_MENU(IDM_CHEATS, CFrame::OnShow_CheatsWindow)
EVT_MENU(IDM_INFO, CFrame::OnShow_InfoWindow) EVT_MENU(IDM_INFO, CFrame::OnShow_InfoWindow)
EVT_MENU(IDM_RESTART, CFrame::OnRestart)
EVT_MENU(IDM_CHANGEDISC, CFrame::OnChangeDisc) EVT_MENU(IDM_CHANGEDISC, CFrame::OnChangeDisc)
EVT_MENU(IDM_LOAD_WII_MENU, CFrame::OnLoadWiiMenu) EVT_MENU(IDM_LOAD_WII_MENU, CFrame::OnLoadWiiMenu)
EVT_MENU(IDM_TOGGLE_FULLSCREEN, CFrame::OnToggleFullscreen) EVT_MENU(IDM_TOGGLE_FULLSCREEN, CFrame::OnToggleFullscreen)
@ -304,7 +303,7 @@ CFrame::CFrame(wxFrame* parent,
, m_ToolBar(NULL), m_ToolBarDebug(NULL), m_ToolBarAui(NULL) , m_ToolBar(NULL), m_ToolBarDebug(NULL), m_ToolBarAui(NULL)
, m_pStatusBar(NULL), m_GameListCtrl(NULL), m_Panel(NULL) , m_pStatusBar(NULL), m_GameListCtrl(NULL), m_Panel(NULL)
, UseDebugger(_UseDebugger), m_bEdit(false), m_bTabSplit(false), m_bNoDocking(false) , UseDebugger(_UseDebugger), m_bEdit(false), m_bTabSplit(false), m_bNoDocking(false)
, bRenderToMain(false), bFloatLogWindow(false), bFloatConsoleWindow(false) , bRenderToMain(true), bFloatLogWindow(false), bFloatConsoleWindow(false)
, HaveLeds(false), HaveSpeakers(false) , HaveLeds(false), HaveSpeakers(false)
, m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0) , m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0)
#if wxUSE_TIMER #if wxUSE_TIMER
@ -495,24 +494,6 @@ void CFrame::OnQuit(wxCommandEvent& WXUNUSED (event))
Close(true); Close(true);
} }
void CFrame::OnRestart(wxCommandEvent& WXUNUSED (event))
{
if (Core::GetState() != Core::CORE_UNINITIALIZED)
{
wxMessageBox(wxT("Please stop the current game before restarting."), wxT("Notice"), wxOK, this);
return;
}
// Get exe path and restart
#ifdef _WIN32
char Str[MAX_PATH + 1];
DWORD Size = sizeof(Str)/sizeof(char);
DWORD n = GetModuleFileNameA(NULL, Str, Size);
ShellExecuteA(NULL, "open", Str, g_pCodeWindow ? "" : "-d", NULL, SW_SHOW);
#endif
Close(true);
}
// -------- // --------
// Events // Events
@ -691,7 +672,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event)
#ifdef _WIN32 #ifdef _WIN32
if(event.GetKeyCode() == 'M', '3', '4', '5', '6', '7') // Send this to the video plugin WndProc if(event.GetKeyCode() == 'M', '3', '4', '5', '6', '7') // Send this to the video plugin WndProc
{ {
PostMessage((HWND)Core::GetWindowHandle(), WM_USER, WM_USER_KEYDOWN, event.GetKeyCode()); PostMessage((HWND)Core::GetWindowHandle(), WM_USER, OPENGL_WM_USER_KEYDOWN, event.GetKeyCode());
} }
#endif #endif

View File

@ -250,7 +250,6 @@ class CFrame : public wxFrame
#endif #endif
// Event functions // Event functions
void OnQuit(wxCommandEvent& event); void OnQuit(wxCommandEvent& event);
void OnRestart(wxCommandEvent& WXUNUSED (event));
void OnHelp(wxCommandEvent& event); void OnHelp(wxCommandEvent& event);
void OnToolBar(wxCommandEvent& event); void OnToolBar(wxCommandEvent& event);
void OnAuiToolBar(wxAuiToolBarEvent& event); void OnAuiToolBar(wxAuiToolBarEvent& event);

View File

@ -127,12 +127,6 @@ void CFrame::ToggleConsole(bool bShow, int i)
#ifdef _WIN32 #ifdef _WIN32
ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener(); ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener();
// For developers: Use this to get a regular separate console window
/*
if(!GetConsoleWindow()) Console->Open(); else ShowWindow(GetConsoleWindow(), SW_SHOW);
return;
*/
if (bShow) if (bShow)
{ {
//Console->Log(LogTypes::LNOTICE, StringFromFormat(" >>> Show\n").c_str()); //Console->Log(LogTypes::LNOTICE, StringFromFormat(" >>> Show\n").c_str());
@ -754,7 +748,7 @@ void CFrame::ResizeConsole()
wxBorder = 2; wxBorder = 2;
Border = 4; Border = 4;
LowerBorder = 6; LowerBorder = 6;
MenuBar = 26; // Including upper border MenuBar = 30; // Including upper border
ScrollBar = 19; ScrollBar = 19;
} }
else // XP else // XP

View File

@ -121,8 +121,6 @@ void CFrame::CreateMenu()
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
fileMenu->Append(IDM_BROWSE, _T("&Browse for ISOs...")); fileMenu->Append(IDM_BROWSE, _T("&Browse for ISOs..."));
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
fileMenu->Append(IDM_RESTART, g_pCodeWindow ? _T("Restart in regular mode") : _T("Restart in debugging mode"));
fileMenu->AppendSeparator();
fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt+F4")); fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt+F4"));
m_MenuBar->Append(fileMenu, _T("&File")); m_MenuBar->Append(fileMenu, _T("&File"));

View File

@ -57,8 +57,7 @@ void wxInfoWindow::Init_ChildControls()
Info.append(StringFromFormat( Info.append(StringFromFormat(
"\n\n_-Computer Information-_\n\n%s\n%s\n%s\n\n_-Dolphin Information-_\n\n%s\n\n%s\n\n", "\n\n%s\n%s\n%s\n\n%s\n\n",
Summarize_OS().c_str(),
Summarize_Drives().c_str(), Summarize_Drives().c_str(),
Summarize_CPU().c_str(), Summarize_CPU().c_str(),
Summarize_Plug().c_str(), Summarize_Plug().c_str(),

View File

@ -234,7 +234,7 @@ void CLogWindow::OnClear(wxCommandEvent& WXUNUSED (event))
for (int i = 0; i < msgQueueSize; i++) for (int i = 0; i < msgQueueSize; i++)
msgQueue.pop(); msgQueue.pop();
m_LogSection.Leave(); m_LogSection.Leave();
m_console->ClearScreen(); m_console->ClearScreen();
NOTICE_LOG(CONSOLE, "Console cleared"); NOTICE_LOG(CONSOLE, "Console cleared");
NotifyUpdate(); NotifyUpdate();
@ -517,12 +517,11 @@ void CLogWindow::UpdateLog()
m_LogTimer->Start(UPDATETIME); m_LogTimer->Start(UPDATETIME);
} }
// Receive log messages
void CLogWindow::Log(LogTypes::LOG_LEVELS level, const char *text) void CLogWindow::Log(LogTypes::LOG_LEVELS level, const char *text)
{ {
m_LogSection.Enter(); m_LogSection.Enter();
// Remove the first message if the queue is big if (msgQueue.size() >= 100)
//if (msgQueue.size() >= 200) msgQueue.pop(); msgQueue.pop();
msgQueue.push(std::pair<u8, wxString>((u8)level, wxString::FromAscii(text))); msgQueue.push(std::pair<u8, wxString>((u8)level, wxString::FromAscii(text)));
m_LogSection.Leave(); m_LogSection.Leave();
} }

View File

@ -18,8 +18,6 @@
#ifndef __SUMMARIZE_H__ #ifndef __SUMMARIZE_H__
#define __SUMMARIZE_H__ #define __SUMMARIZE_H__
#include <windows.h>
std::string Summarize_Plug() std::string Summarize_Plug()
{ {
return StringFromFormat( return StringFromFormat(
@ -106,7 +104,7 @@ std::string Summarize_CPU()
{ {
return StringFromFormat( return StringFromFormat(
"Processor Information: \n%s\n", "Processor Information: \n%s\n",
cpu_info.Summarize_long().c_str() cpu_info.Summarize().c_str()
); );
} }
@ -126,66 +124,4 @@ std::string Summarize_Drives()
return drive; return drive;
} }
#endif //__SUMMARIZE_H__
std::string Summarize_OS(void)
{
std::string operatingSystem;
#ifdef _WIN32
#include <windows.h>
OSVERSIONINFO osver;
osver.dwOSVersionInfoSize = sizeof(osver);
if (GetVersionEx(&osver))
{
switch(osver.dwMajorVersion)
{
case 6:
switch(osver.dwMinorVersion)
{
case 1:
if(osver.dwPlatformId == VER_NT_WORKSTATION)
operatingSystem = "Windows 7";
else
operatingSystem += "Windows Server 2008 R2";
break;
case 0:
if(osver.dwPlatformId == VER_NT_WORKSTATION)
operatingSystem = "Windows Vista";
else
operatingSystem = "Windows Server 2008";
break;
}
break;
case 5:
switch(osver.dwMinorVersion)
{
case 2:
if(GetSystemMetrics(SM_SERVERR2) != 0)
operatingSystem = "Windows Server 2003 R2";
else
operatingSystem = "Windows Server 2003";
break;
case 1:
operatingSystem = "Windows XP";
break;
case 0:
operatingSystem = "Windows 2000";
break;
}
break;
}
}
#else
#ifdef __linux__
#include "linux/version.h"
operatingSystem = UTS_RELEASE;
#endif
#endif
return StringFromFormat("Operating System: %s",operatingSystem);
}
#endif //__SUMMARIZE_H__

View File

@ -35,63 +35,46 @@
#define _SDL_MAIN_ // Avoid certain declarations in SDL.h #define _SDL_MAIN_ // Avoid certain declarations in SDL.h
#include "SDL.h" // Local #include "SDL.h" // Local
#include "XInput.h" #include "XInput.h"
#ifdef _WIN32
#include <windows.h>
#include <dinput.h>
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")
#endif
// Definitions
// -------------------
int g_LastPad = 0;
namespace InputCommon namespace InputCommon
{ {
// Definitions // Definitions
// ------------------- // -------------------
int g_LastPad = 0;
int NumDIDevices = 0;
// Reset and search for devices
// Search attached devices. Populate joyinfo for all attached physical devices.
// ----------------------- // -----------------------
bool SearchDevicesReset(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads) bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
{ {
// This is needed to update SDL_NumJoysticks
if (SDL_WasInit(0))
SDL_Quit();
return SearchDevices(_joyinfo, _NumPads);
}
// Initialize if not previously initialized
// -----------------------
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads)
{
// Init Joystick + Haptic (force feedback) subsystem on SDL 1.3
if (!SDL_WasInit(0)) if (!SDL_WasInit(0))
{ #if SDL_VERSION_ATLEAST(1, 3, 0)
#if SDL_VERSION_ATLEAST(1, 3, 0) && !defined(_WIN32)
NOTICE_LOG(PAD, "SDL_Init | HAPTIC");
if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0) if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0)
#else #else
//NOTICE_LOG(PAD, "SDL_Init");
if (SDL_Init(SDL_INIT_JOYSTICK) < 0) if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
#endif #endif
{ {
PanicAlert("Could not initialize SDL: %s", SDL_GetError()); PanicAlert("Could not initialize SDL: %s", SDL_GetError());
return false; return false;
} }
}
// Clear joyinfo
_joyinfo.clear();
// Get device status // Get device status
int numjoy = SDL_NumJoysticks(); int numjoy = SDL_NumJoysticks();
for (int i = 0; i < numjoy; i++ ) for (int i = 0; i < numjoy; i++ )
{ {
CONTROLLER_INFO Tmp; CONTROLLER_INFO Tmp;
Tmp.joy = SDL_JoystickOpen(i); Tmp.joy = SDL_JoystickOpen(i);
@ -103,160 +86,39 @@ bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &_NumPads)
Tmp.Name = SDL_JoystickName(i); Tmp.Name = SDL_JoystickName(i);
// Check if the device is okay // Check if the device is okay
if ( !( Tmp.NumAxes == 0 if ( Tmp.NumAxes == 0
&& Tmp.NumBalls == 0 && Tmp.NumBalls == 0
&& Tmp.NumButtons == 0 && Tmp.NumButtons == 0
&& Tmp.NumHats == 0) && Tmp.NumHats == 0
) )
{ {
_joyinfo.push_back(Tmp); Tmp.Good = false;
} }
else else
{ {
//if (SDL_JoystickOpened(i)) SDL_JoystickClose(Tmp.joy); _NumGoodPads++;
} Tmp.Good = true;
}
_joyinfo.push_back(Tmp);
// We have now read the values we need so we close the device
if (SDL_JoystickOpened(i)) SDL_JoystickClose(_joyinfo[i].joy);
} }
_NumPads = (int)_joyinfo.size(); _NumPads = (int)_joyinfo.size();
return true; return true;
} }
// Show the current pad status
// -----------------
std::string ShowStatus(int Slot, int Device, CONTROLLER_MAPPING PadMapping[], CONTROLLER_STATE PadState[],
std::vector<InputCommon::CONTROLLER_INFO> joyinfo)
{
CONTROLLER_MAPPING_NEW _PadMapping[4];
CONTROLLER_STATE_NEW _PadState[4];
for (int i = 0; i < 4; i++)
{
_PadMapping[i].ID = PadMapping[i].ID;
_PadMapping[i].Name = PadMapping[i].Name;
_PadState[i].joy = PadState[i].joy;
}
return DoShowStatus(Slot, Device, _PadMapping, _PadState, joyinfo);
}
std::string DoShowStatus(int Slot, int Device,
CONTROLLER_MAPPING_NEW PadMapping[], CONTROLLER_STATE_NEW PadState[],
std::vector<InputCommon::CONTROLLER_INFO> joyinfo)
{
// Save the physical device
int ID = PadMapping[Slot].ID;
// Make local shortcut
SDL_Joystick *joy = PadState[Slot].joy;
// Make shortcuts for all pads
SDL_Joystick *joy0 = PadState[0].joy;
SDL_Joystick *joy1 = PadState[1].joy;
SDL_Joystick *joy2 = PadState[2].joy;
SDL_Joystick *joy3 = PadState[3].joy;
// Temporary storage
std::string
StrAllHandles, StrAllName,
StrHandles, StrId, StrName,
StrAxes, StrHats, StrBut;
int value;
// All devices
int numjoy = SDL_NumJoysticks();
for (int i = 0; i < numjoy; i++ )
{
SDL_Joystick *AllJoy = SDL_JoystickOpen(i);
StrAllHandles += StringFromFormat(" %i:%06i", i, AllJoy);
StrAllName += StringFromFormat("Name %i: %s\n", i, SDL_JoystickName(i));
}
// Get handles
for(int i = 0; i < joyinfo.size(); i++)
{
StrHandles += StringFromFormat(" %i:%06i", i, joyinfo.at(i).joy);
StrId += StringFromFormat(" %i:%i", i, joyinfo.at(i).ID);
StrName += StringFromFormat("Name %i:%s\n", i, joyinfo.at(i).Name.c_str());
}
// Get status
int Axes = joyinfo[Device].NumAxes;
int Balls = joyinfo[Device].NumBalls;
int Hats = joyinfo[Device].NumHats;
int Buttons = joyinfo[Device].NumButtons;
// Update the internal values
SDL_JoystickUpdate();
// Go through all axes and read out their values
for(int i = 0; i < Axes; i++)
{
value = SDL_JoystickGetAxis(joy, i);
StrAxes += StringFromFormat(" %i:%06i", i, value);
}
for(int i = 0;i < Hats; i++)
{
value = SDL_JoystickGetHat(joy, i);
StrHats += StringFromFormat(" %i:%i", i, value);
}
for(int i = 0;i < Buttons; i++)
{
value = SDL_JoystickGetButton(joy, i);
StrBut += StringFromFormat(" %i:%i", i+1, value);
}
return StringFromFormat(
"All devices:\n"
"Handles: %s\n"
"%s"
"\nAll pads:\n"
"Handles: %s\n"
"ID: %s\n"
"%s"
"\nAll slots:\n"
"ID: %i %i %i %i\n"
"Name: '%s' '%s' '%s' '%s'\n"
//"Controllertype: %i %i %i %i\n"
//"SquareToCircle: %i %i %i %i\n\n"
#ifdef _WIN32
"Handles: %i %i %i %i\n"
//"XInput: %i %i %i\n"
#endif
"\nThis pad:\n"
"Handle: %06i\n"
"ID: %i\n"
//"Slot: %i\n"
"Axes: %s\n"
"Hats: %s\n"
"But: %s\n"
"Device: Ax: %i Balls:%i Hats:%i But:%i",
StrAllHandles.c_str(), StrAllName.c_str(),
StrHandles.c_str(), StrId.c_str(), StrName.c_str(),
PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID,
PadMapping[0].Name.c_str(), PadMapping[1].Name.c_str(), PadMapping[2].Name.c_str(), PadMapping[3].Name.c_str(),
//PadMapping[0].controllertype, PadMapping[1].controllertype, PadMapping[2].controllertype, PadMapping[3].controllertype,
//PadMapping[0].bSquareToCircle, PadMapping[1].bSquareToCircle, PadMapping[2].bSquareToCircle, PadMapping[3].bSquareToCircle,
#ifdef _WIN32
joy0, joy1, joy2, joy3,
//PadState[PadMapping[0].ID].joy, PadState[PadMapping[1].ID].joy, PadState[PadMapping[2].ID].joy, PadState[PadMapping[3].ID].joy,
//XInput::IsConnected(0), XInput::GetXI(0, InputCommon::XI_TRIGGER_L), XInput::GetXI(0, InputCommon::XI_TRIGGER_R),
joy,
#endif
//Slot,
ID,
StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(),
Axes, Balls, Hats, Buttons
);
}
// Supporting functions // Supporting functions
// ==================== // ----------------
// Read current joystick status // Read current joystick status
/* -------------------- /* ----------------
The value PadMapping[].buttons[] is the number of the assigned joypad button, The value PadMapping[].buttons[] is the number of the assigned joypad button,
PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */ PadState[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */
@ -278,15 +140,10 @@ void ReadButton(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int
Input: The virtual device 0, 1, 2 or 3 Input: The virtual device 0, 1, 2 or 3
Function: Updates the PadState struct with the current pad status. The input value "controller" is Function: Updates the PadState struct with the current pad status. The input value "controller" is
for a virtual controller 0 to 3. */ for a virtual controller 0 to 3. */
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping) void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int Controller, int NumButtons)
{ {
if (SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) return;
//NOTICE_LOG(PAD, "SDL_JoystickEventState: %s", (SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) ? "SDL_ENABLE" : "SDL_IGNORE");
// Update the gamepad status // Update the gamepad status
SDL_JoystickUpdate(); SDL_JoystickUpdate();
// Read info
int NumButtons = SDL_JoystickNumButtons(_PadState.joy);
// Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here. // Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here.
_PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]); _PadState.axis[CTL_MAIN_X] = SDL_JoystickGetAxis(_PadState.joy, _PadMapping.axis[CTL_MAIN_X]);
@ -349,13 +206,12 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
} }
#ifdef SHOW_PAD_STATUS #ifdef SHOW_PAD_STATUS
/*
// Show the status of all connected pads // Show the status of all connected pads
//ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
//if ((g_LastPad == 0 && _PadMapping.ID == 0) || Controller < g_LastPad) Console->ClearScreen(); //if ((g_LastPad == 0 && Controller == 0) || Controller < g_LastPad) Console->ClearScreen();
g_LastPad = Controller; g_LastPad = Controller;
NOTICE_LOG(CONSOLE, NOTICE_LOG(CONSOLE,
"Pad | Number:%i Handle:%i\n" "Pad | Number:%i Enabled:%i Handle:%i\n"
"Main Stick | X:%03i Y:%03i\n" "Main Stick | X:%03i Y:%03i\n"
"C Stick | X:%03i Y:%03i\n" "C Stick | X:%03i Y:%03i\n"
"Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n" "Trigger | Type:%s DigitalL:%i DigitalR:%i AnalogL:%03i AnalogR:%03i HalfPress:%i\n"
@ -363,7 +219,7 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
"D-Pad | Type:%s Hat:%i U:%i D:%i\n" "D-Pad | Type:%s Hat:%i U:%i D:%i\n"
"======================================================\n", "======================================================\n",
_PadMapping.ID, _PadState.joy, Controller, _PadMapping.enabled, _PadState.joy,
_PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y], _PadState.axis[InputCommon::CTL_MAIN_X], _PadState.axis[InputCommon::CTL_MAIN_Y],
_PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y], _PadState.axis[InputCommon::CTL_SUB_X], _PadState.axis[InputCommon::CTL_SUB_Y],
@ -379,7 +235,6 @@ void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping)
_PadState.dpad, _PadState.dpad,
_PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN] _PadState.dpad2[InputCommon::CTL_D_PAD_UP], _PadState.dpad2[InputCommon::CTL_D_PAD_DOWN]
); );
*/
#endif #endif
} }
@ -408,23 +263,18 @@ bool AvoidValues(int value, bool NoTriggerFilter)
// Detect a pressed button // Detect a pressed button
// --------------------- // ---------------------
void GetButton(SDL_Joystick *joy, int ControllerID, void GetButton(SDL_Joystick *joy, int ControllerID, int buttons, int axes, int hats,
int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop, int &KeyboardKey, int &value, int &type, int &pressed, bool &Succeed, bool &Stop,
bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter) bool LeftRight, bool Axis, bool XInput, bool Button, bool Hat, bool NoTriggerFilter)
{ {
// It needs the wxWidgets excape keycode // It needs the wxWidgets excape keycode
static const int WXK_ESCAPE = 27; static const int WXK_ESCAPE = 27;
// Save info
int buttons = SDL_JoystickNumButtons(joy);
int axes = SDL_JoystickNumAxes(joy);;
int hats = SDL_JoystickNumHats(joy);;
// Update the internal status // Update the internal status
SDL_JoystickUpdate(); SDL_JoystickUpdate();
// For the triggers we accept both a digital or an analog button // For the triggers we accept both a digital or an analog button
if (Axis) if(Axis)
{ {
for(int i = 0; i < axes; i++) for(int i = 0; i < axes; i++)
{ {
@ -439,7 +289,7 @@ void GetButton(SDL_Joystick *joy, int ControllerID,
} }
// Check for a hat // Check for a hat
if (Hat) if(Hat)
{ {
for(int i = 0; i < hats; i++) for(int i = 0; i < hats; i++)
{ {
@ -520,41 +370,5 @@ void GetButton(SDL_Joystick *joy, int ControllerID,
// **********************************************
// Search for DirectInput devices
// ----------------
#ifdef _WIN32
BOOL CALLBACK EnumDICallback(const DIDEVICEINSTANCE* pInst, VOID* pContext)
{
NumDIDevices++;
return true;
}
#endif
int SearchDIDevices()
{
#ifdef _WIN32
LPDIRECTINPUT8 g_pObject;
LPDIRECTINPUTDEVICE8 g_pDevice;
DIPROPDWORD dipdw;
HRESULT hr;
NumDIDevices = 0;
// Register with the DirectInput subsystem and get a pointer to a IDirectInput interface we can use.
if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&g_pObject, NULL)))
return 0;
// Look for a device
if (FAILED(hr = g_pObject->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumDICallback, NULL, DIEDFL_ATTACHEDONLY)))
return 0;
return NumDIDevices;
#else
return 0;
#endif
}
} // InputCommon } // InputCommon

View File

@ -53,7 +53,7 @@
#endif #endif
#include "Common.h" // Common #include "Common.h" // Common
#include "StringUtil.h"
namespace InputCommon namespace InputCommon
@ -62,7 +62,7 @@ namespace InputCommon
// Settings // Settings
// ---------- // ----------
// Show a status window with the detected devices etc // Show a status window with the detected axes, buttons and so on
//#define SHOW_PAD_STATUS //#define SHOW_PAD_STATUS
@ -82,7 +82,7 @@ struct CONTROLLER_STATE // GC PAD INFO/STATE
int dpad; // Automatic SDL D-Pad (8 directions + neutral) int dpad; // Automatic SDL D-Pad (8 directions + neutral)
int dpad2[4]; // D-pad using buttons int dpad2[4]; // D-pad using buttons
int axis[6]; // 2 x 2 Axes (Main & Sub) int axis[6]; // 2 x 2 Axes (Main & Sub)
int halfpress; // L and R triggers half pressed int halfpress; // Halfpress... you know, like not fully pressed ;)...
SDL_Joystick *joy; // SDL joystick device SDL_Joystick *joy; // SDL joystick device
}; };
@ -95,7 +95,6 @@ struct CONTROLLER_MAPPING // GC PAD MAPPING
int halfpress; // (See above) int halfpress; // (See above)
int deadzone; // Deadzone... what else? int deadzone; // Deadzone... what else?
int ID; // SDL joystick device ID int ID; // SDL joystick device ID
std::string Name; // SDL joystick device name
int controllertype; // Hat: Hat or custom buttons int controllertype; // Hat: Hat or custom buttons
int triggertype; // Triggers range int triggertype; // Triggers range
std::string SRadius, SDiagonal, SRadiusC, SDiagonalC; std::string SRadius, SDiagonal, SRadiusC, SDiagonalC;
@ -112,6 +111,7 @@ struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO
int NumHats; // Amount of Hats (POV) int NumHats; // Amount of Hats (POV)
std::string Name; // Joypad/stickname std::string Name; // Joypad/stickname
int ID; // SDL joystick device ID int ID; // SDL joystick device ID
bool Good; // Pad is good (it has at least one button or axis)
SDL_Joystick *joy; // SDL joystick device SDL_Joystick *joy; // SDL joystick device
}; };
enum enum
@ -220,7 +220,6 @@ struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING
int DeadZoneL; // Analog 1 Deadzone int DeadZoneL; // Analog 1 Deadzone
int DeadZoneR; // Analog 2 Deadzone int DeadZoneR; // Analog 2 Deadzone
int ID; // SDL joystick device ID int ID; // SDL joystick device ID
std::string Name; // SDL joystick device name
int controllertype; // D-Pad type: Hat or custom buttons int controllertype; // D-Pad type: Hat or custom buttons
int triggertype; // SDL or XInput trigger int triggertype; // SDL or XInput trigger
std::string SDiagonal; std::string SDiagonal;
@ -237,14 +236,9 @@ struct CONTROLLER_MAPPING_NEW // GC PAD MAPPING
// --------- // ---------
// General functions // General functions
bool SearchDevicesReset(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads); bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads, int &NumGoodPads);
bool SearchDevices(std::vector<CONTROLLER_INFO> &_joyinfo, int &NumPads); void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping, int controller, int NumButtons);
std::string ShowStatus(int Slot, int Device, CONTROLLER_MAPPING PadMapping[], CONTROLLER_STATE PadState[], void GetButton(SDL_Joystick*, int,int,int,int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool);
std::vector<InputCommon::CONTROLLER_INFO> joyinfo);
std::string DoShowStatus(int Slot, int Device, CONTROLLER_MAPPING_NEW PadMapping[], CONTROLLER_STATE_NEW PadState[],
std::vector<InputCommon::CONTROLLER_INFO> joyinfo);
void GetJoyState(CONTROLLER_STATE &_PadState, CONTROLLER_MAPPING _PadMapping);
void GetButton(SDL_Joystick*, int, int&,int&,int&,int&,bool&,bool&, bool,bool,bool,bool,bool,bool);
// Value conversion // Value conversion
float Deg2Rad(float Deg); float Deg2Rad(float Deg);
@ -262,9 +256,7 @@ std::string VKToString(int keycode);
extern int g_LastPad; extern int g_LastPad;
#endif #endif
// DirectInput
extern int NumDIDevices;
int SearchDIDevices();
} // InputCommon } // InputCommon

View File

@ -120,7 +120,7 @@ void PixelShaderManager::SetConstants()
break; break;
case 2: case 2:
// 24 bits // 24 bits
ftemp[0] = ffrac/65536.0f; ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = 0; ftemp[0] = ffrac/65536.0f; ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = ffrac/16777216.0f;
break; break;
} }
SetPSConstant4fv(C_ZBIAS, ftemp); SetPSConstant4fv(C_ZBIAS, ftemp);

View File

@ -60,25 +60,6 @@ int TexDecoder_GetTexelSizeInNibbles(int format)
case GX_TF_C8: return 2; case GX_TF_C8: return 2;
case GX_TF_C14X2: return 4; case GX_TF_C14X2: return 4;
case GX_TF_CMPR: return 1; case GX_TF_CMPR: return 1;
case GX_CTF_R4: return 1;
case GX_CTF_RA4: return 2;
case GX_CTF_RA8: return 4;
case GX_CTF_YUVA8: return 8;
case GX_CTF_A8: return 2;
case GX_CTF_R8: return 2;
case GX_CTF_G8: return 2;
case GX_CTF_B8: return 2;
case GX_CTF_RG8: return 4;
case GX_CTF_GB8: return 4;
case GX_TF_Z8: return 2;
case GX_TF_Z16: return 4;
case GX_TF_Z24X8: return 8;
case GX_CTF_Z4: return 1;
case GX_CTF_Z8M: return 2;
case GX_CTF_Z8L: return 2;
case GX_CTF_Z16L: return 4;
default: return 1; default: return 1;
} }
} }

View File

@ -95,7 +95,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_nJoy_SDL", "Plugins\
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA} {C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED} {11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68} = {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection EndProjectSection
EndProject EndProject
@ -115,7 +114,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_Wiimote", "Plugins\P
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA} {C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
{11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED} {11F55366-12EC-4C44-A8CB-1D4E315D61ED} = {11F55366-12EC-4C44-A8CB-1D4E315D61ED}
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68} = {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}
{0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
{1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE} = {1C8436C9-DBAF-42BE-83BC-CF3EC9175ABE}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
@ -201,8 +199,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoSoftware", "Plu
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "..\Externals\SDL\VisualC\SDL\SDL_VS2008.vcproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
@ -700,22 +696,6 @@ Global
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = Release|Win32 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|Win32.Build.0 = Release|Win32
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.ActiveCfg = Release|x64 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.ActiveCfg = Release|x64
{66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = Release|x64 {66A4E7BD-E2E8-4373-9B75-8750EB5AE683}.Release|x64.Build.0 = Release|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.ActiveCfg = Debug|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.Build.0 = Debug|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.ActiveCfg = Debug|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.Build.0 = Debug|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|Win32.ActiveCfg = Debug|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|Win32.Build.0 = Debug|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|x64.ActiveCfg = Debug|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.DebugFast|x64.Build.0 = Debug|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|Win32.ActiveCfg = Release|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|Win32.Build.0 = Release|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|x64.ActiveCfg = Release|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_JITIL|x64.Build.0 = Release|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|x64
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -23,10 +23,10 @@
enum PLUGIN_COMM enum PLUGIN_COMM
{ {
// Begin at 10 in case there is already messages with wParam = 0, 1, 2 and so on // Begin at 10 in case there is already messages with wParam = 0, 1, 2 and so on
WM_USER_STOP = 10, OPENGL_WM_USER_STOP = 10,
WM_USER_CREATE, OPENGL_WM_USER_CREATE,
WM_USER_KEYDOWN, OPENGL_WM_USER_KEYDOWN,
WM_USER_VIDEO_STOP, OPENGL_VIDEO_STOP,
TOGGLE_FULLSCREEN, TOGGLE_FULLSCREEN,
VIDEO_DESTROY, // The video debugging window was destroyed VIDEO_DESTROY, // The video debugging window was destroyed
AUDIO_DESTROY, // The audio debugging window was destroyed AUDIO_DESTROY, // The audio debugging window was destroyed

View File

@ -48,6 +48,7 @@ CUCode_AXWii::CUCode_AXWii(CMailHandler& _rMailHandler, u32 l_CRC)
{ {
// we got loaded // we got loaded
m_rMailHandler.PushMail(0xDCD10000); m_rMailHandler.PushMail(0xDCD10000);
m_rMailHandler.PushMail(0x80000000); // handshake ??? only (crc == 0xe2136399) needs it ...
templbuffer = new int[1024 * 1024]; templbuffer = new int[1024 * 1024];
temprbuffer = new int[1024 * 1024]; temprbuffer = new int[1024 * 1024];
@ -69,12 +70,9 @@ void CUCode_AXWii::HandleMail(u32 _uMail)
{ {
// a new List // a new List
} }
else if (_uMail == 0xCDD10000) // Action 0 - restart else if ((_uMail & 0xFFFF0000) == 0xCDD10000)
{
m_rMailHandler.PushMail(0xDCD10001);
}
else if ((_uMail & 0xFFFF0000) == 0xCDD10000) // Action 1/2/3
{ {
//NOTICE_LOG(DSPHLE, "action mail %08X", _uMail);
} }
else else
{ {
@ -373,13 +371,11 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
case 0x000b: case 0x000b:
uAddress += 2; // one 0x8000 in rabbids uAddress += 2; // one 0x8000 in rabbids
uAddress += 4 * 2; // then two RAM addressses uAddress += 4 * 2; // then two RAM addressses
m_rMailHandler.PushMail(0xDCD10004);
break; break;
case 0x000c: case 0x000c:
uAddress += 2; // one 0x8000 in rabbids uAddress += 2; // one 0x8000 in rabbids
uAddress += 4 * 2; // then two RAM addressses uAddress += 4 * 2; // then two RAM addressses
m_rMailHandler.PushMail(0xDCD10004);
break; break;
case 0x000d: case 0x000d:
@ -389,7 +385,7 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
case 0x000e: case 0x000e:
// This is the end. // This is the end.
bExecuteList = false; bExecuteList = false;
m_rMailHandler.PushMail(0xDCD10002); SaveLog("%08x : AXLIST end, wii stylee.", uAddress);
break; break;
default: default:
@ -432,6 +428,7 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
SaveLog("====================================================================="); SaveLog("=====================================================================");
SaveLog("End"); SaveLog("End");
m_rMailHandler.PushMail(0xDCD10002);
return true; return true;
} }

View File

@ -319,13 +319,7 @@ void DSP_WriteMailboxLow(bool _CPUMailbox, u16 _uLowMail)
void DSP_Update(int cycles) void DSP_Update(int cycles)
{ {
// This gets called VERY OFTEN. The soundstream update might be expensive so only do it 200 times per second or something. // This gets called VERY OFTEN. The soundstream update might be expensive so only do it 200 times per second or something.
int cycles_between_ss_update; const int cycles_between_ss_update = 80000000 / 200;
if (g_dspInitialize.bWii)
cycles_between_ss_update = 121500000 / 200;
else
cycles_between_ss_update = 81000000 / 200;
static int cycle_count = 0; static int cycle_count = 0;
cycle_count += cycles; cycle_count += cycles;
if (cycle_count > cycles_between_ss_update) if (cycle_count > cycles_between_ss_update)

View File

@ -398,18 +398,18 @@ void drawShadedTexQuad(IDirect3DTexture9 *texture,
{ {
SaveRenderStates(); SaveRenderStates();
//float span = ((rSource->right-rSource->left - 1.0f) * (rDest->right - rDest->left))/(SourceWidth*((rDest->right - rDest->left)-1.0f)); float span = ((rSource->right-rSource->left - 1.0f) * (rDest->right - rDest->left))/(SourceWidth*((rDest->right - rDest->left)-1.0f));
float u1=((float)rSource->left+1.0f)/(float) SourceWidth;//*/((0.5f+rSource->left)/(float) SourceWidth)-(span*0.5f/(float)(rDest->right - rDest->left)); float u1=((0.5f+rSource->left)/(float) SourceWidth)-(span*0.5f/(float)(rDest->right - rDest->left));
float u2=((float)rSource->right-1.0f)/(float) SourceWidth;;//*/u1+span; float u2=u1+span;
//span = ((rSource->bottom-rSource->top - 1.0f) * (rDest->bottom - rDest->top))/(SourceHeight*((rDest->bottom - rDest->top)-1.0f)); span = ((rSource->bottom-rSource->top - 1.0f) * (rDest->bottom - rDest->top))/(SourceHeight*((rDest->bottom - rDest->top)-1.0f));
float v1=((float)rSource->top+1.0f)/(float) SourceHeight;//*/((0.5f+rSource->top)/(float) SourceHeight)-(span*0.5f/(float)(rDest->bottom - rDest->top)); float v1=((0.5f+rSource->top)/(float) SourceHeight)-(span*0.5f/(float)(rDest->bottom - rDest->top));
float v2=((float)rSource->bottom-1.0f)/(float) SourceHeight;//*/v1+span; float v2=v1+span;
struct Q2DVertex { float x,y,z,rhw,u,v; } coords[4] = { struct Q2DVertex { float x,y,z,rhw,u,v; } coords[4] = {
{(float)rDest->left-0.5f, (float)rDest->top-0.5f, 0.0f, 1.0f, u1, v1}, {(float)rDest->left-1.0f, (float)rDest->top-1.0f, 0.0f, 1.0f, u1, v1},
{(float)rDest->right-0.5f, (float)rDest->top-0.5f, 0.0f,1.0f, u2, v1}, {(float)rDest->right, (float)rDest->top-1.0f, 0.0f,1.0f, u2, v1},
{(float)rDest->right-0.5f, (float)rDest->bottom-0.5f, 0.0f,1.0f, u2, v2}, {(float)rDest->right, (float)rDest->bottom, 0.0f,1.0f, u2, v2},
{(float)rDest->left-0.5f, (float)rDest->bottom-0.5f, 0.0f,1.0f, u1, v2} {(float)rDest->left-1.0f, (float)rDest->bottom, 0.0f,1.0f, u1, v2}
}; };
dev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1); dev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
dev->SetVertexShader(Vshader); dev->SetVertexShader(Vshader);

View File

@ -359,9 +359,6 @@ static void DX9DebuggerUpdateScreen()
D3D::dev->Present(NULL, NULL, NULL, NULL); D3D::dev->Present(NULL, NULL, NULL, NULL);
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface()); D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
if(D3D::GetCaps().NumSimultaneousRTs > 1)
D3D::dev->SetRenderTarget(1,FBManager::GetEFBDepthEncodedSurface());
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface()); D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
D3D::dev->BeginScene(); D3D::dev->BeginScene();
} }

View File

@ -10,7 +10,6 @@
namespace EmuWindow namespace EmuWindow
{ {
HWND m_hWnd = NULL; HWND m_hWnd = NULL;
HWND m_hMain = NULL;
HWND m_hParent = NULL; HWND m_hParent = NULL;
HINSTANCE m_hInstance = NULL; HINSTANCE m_hInstance = NULL;
WNDCLASSEX wndClass; WNDCLASSEX wndClass;
@ -37,9 +36,6 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{ {
switch( iMsg ) switch( iMsg )
{ {
case WM_CREATE:
PostMessage( m_hMain, WM_USER, WM_USER_CREATE, g_Config.RenderToMainframe );
break;
case WM_PAINT: case WM_PAINT:
{ {
HDC hdc; HDC hdc;
@ -58,18 +54,9 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
break; break;
case WM_KEYDOWN: case WM_KEYDOWN:
switch (LOWORD(wParam))
{
case VK_ESCAPE:
SendMessage(m_hWnd, WM_CLOSE, 0, 0);
break;
}
g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0);
break;
case WM_SYSKEYDOWN:
switch( LOWORD( wParam )) switch( LOWORD( wParam ))
{ {
case VK_RETURN: // Pressing Esc switch FullScreen/Windowed case VK_ESCAPE: // Pressing Esc switch FullScreen/Windowed
if (g_ActiveConfig.bFullscreen) if (g_ActiveConfig.bFullscreen)
{ {
DestroyWindow(hWnd); DestroyWindow(hWnd);
@ -131,7 +118,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
}*/ }*/
break; break;
} }
//g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0); g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0);
break; break;
/* Post thes mouse events to the main window, it's nessesary because in difference to the /* Post thes mouse events to the main window, it's nessesary because in difference to the
@ -145,7 +132,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
case WM_CLOSE: case WM_CLOSE:
//Fifo_ExitLoopNonBlocking(); //Fifo_ExitLoopNonBlocking();
//Shutdown(); //Shutdown();
PostMessage( m_hMain, WM_USER, WM_USER_STOP, 0 ); PostMessage( m_hParent, WM_USER, OPENGL_WM_USER_STOP, 0 );
// Simple hack to easily exit without stopping. Hope to fix the stopping errors soon. // Simple hack to easily exit without stopping. Hope to fix the stopping errors soon.
//ExitProcess(0); //ExitProcess(0);
return 0; return 0;
@ -200,7 +187,7 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
if (g_Config.RenderToMainframe) if (g_Config.RenderToMainframe)
{ {
m_hParent = m_hMain = parent; m_hParent = parent;
m_hWnd = CreateWindowEx(0, m_szClassName, title, WS_CHILD, m_hWnd = CreateWindowEx(0, m_szClassName, title, WS_CHILD,
0, 0, width, height, 0, 0, width, height,
@ -211,8 +198,6 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
} }
else else
{ {
m_hMain = parent;
DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW; DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW;
RECT rc = {0, 0, width, height}; RECT rc = {0, 0, width, height};
@ -228,7 +213,7 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
m_hWnd = CreateWindowEx(0, m_szClassName, title, style, m_hWnd = CreateWindowEx(0, m_szClassName, title, style,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
NULL, NULL, hInstance, NULL); NULL, NULL, hInstance, NULL );
} }
return m_hWnd; return m_hWnd;

View File

@ -75,31 +75,6 @@ void TextureCache::Invalidate(bool shutdown)
textures.clear(); textures.clear();
} }
void TextureCache::InvalidateRange(u32 start_address, u32 size)
{
TexCache::iterator iter = textures.begin();
while (iter != textures.end())
{
if (iter->second.IntersectsMemoryRange(start_address, size))
{
iter->second.Destroy(false);
ERASE_THROUGH_ITERATOR(textures, iter);
}
else {
++iter;
}
}
}
bool TextureCache::TCacheEntry::IntersectsMemoryRange(u32 range_address, u32 range_size)
{
if (addr + size_in_bytes < range_address)
return false;
if (addr >= range_address + range_size)
return false;
return true;
}
void TextureCache::Shutdown() void TextureCache::Shutdown()
{ {
Invalidate(true); Invalidate(true);
@ -208,7 +183,6 @@ TextureCache::TCacheEntry *TextureCache::Load(int stage, u32 address, int width,
D3DFORMAT d3d_fmt; D3DFORMAT d3d_fmt;
switch (pcfmt) { switch (pcfmt) {
case PC_TEX_FMT_BGRA32: case PC_TEX_FMT_BGRA32:
case PC_TEX_FMT_RGBA32:
d3d_fmt = D3DFMT_A8R8G8B8; d3d_fmt = D3DFMT_A8R8G8B8;
break; break;
case PC_TEX_FMT_RGB565: case PC_TEX_FMT_RGB565:
@ -230,7 +204,7 @@ TextureCache::TCacheEntry *TextureCache::Load(int stage, u32 address, int width,
d3d_fmt = D3DFMT_DXT1; d3d_fmt = D3DFMT_DXT1;
break; break;
} }
//Make an entry in the table //Make an entry in the table
TCacheEntry& entry = textures[texID]; TCacheEntry& entry = textures[texID];
@ -336,7 +310,25 @@ void TextureCache::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, boo
tex = entry.texture; tex = entry.texture;
} }
have_texture: have_texture:
/*TargetRectangle targetSource = Renderer::ConvertEFBRectangle(source_rect);
RECT source_rc;
source_rc.left = targetSource.left;
source_rc.top = targetSource.top;
source_rc.right = targetSource.right;
source_rc.bottom = targetSource.bottom;
RECT dest_rc;
dest_rc.left = 0;
dest_rc.top = 0;
dest_rc.right = tex_w;
dest_rc.bottom = tex_h;
LPDIRECT3DSURFACE9 srcSurface, destSurface;
tex->GetSurfaceLevel(0, &destSurface);
srcSurface = FBManager::GetEFBColorRTSurface();
D3D::dev->StretchRect(srcSurface, &source_rc, destSurface, &dest_rc, D3DTEXF_LINEAR);
destSurface->Release();
return;*/
float colmat[16]= {0.0f}; float colmat[16]= {0.0f};
float fConstAdd[4] = {0.0f}; float fConstAdd[4] = {0.0f};
@ -454,8 +446,7 @@ have_texture:
hr = tex->GetSurfaceLevel(0,&Rendersurf); hr = tex->GetSurfaceLevel(0,&Rendersurf);
CHECK(hr); CHECK(hr);
D3D::dev->SetDepthStencilSurface(NULL); D3D::dev->SetDepthStencilSurface(NULL);
if(D3D::GetCaps().NumSimultaneousRTs > 1) D3D::dev->SetRenderTarget(1, NULL);
D3D::dev->SetRenderTarget(1, NULL);
D3D::dev->SetRenderTarget(0, Rendersurf); D3D::dev->SetRenderTarget(0, Rendersurf);
D3DVIEWPORT9 vp; D3DVIEWPORT9 vp;
@ -477,18 +468,17 @@ have_texture:
PixelShaderManager::SetColorMatrix(colmat, fConstAdd); // set transformation PixelShaderManager::SetColorMatrix(colmat, fConstAdd); // set transformation
TargetRectangle targetSource = Renderer::ConvertEFBRectangle(source_rect); //TargetRectangle targetSource = Renderer::ConvertEFBRectangle(source_rect);
RECT sourcerect; RECT sourcerect;
sourcerect.bottom = targetSource.bottom; sourcerect.bottom = source_rect.bottom;
sourcerect.left = targetSource.left; sourcerect.left = source_rect.left;
sourcerect.right = targetSource.right; sourcerect.right = source_rect.right;
sourcerect.top = targetSource.top; sourcerect.top = source_rect.top;
D3D::drawShadedTexQuad(read_texture,&sourcerect, Renderer::GetTargetWidth() , Renderer::GetTargetHeight(),&destrect,(FBManager::GetEFBDepthRTSurfaceFormat() == D3DFMT_R32F && bFromZBuffer)? PixelShaderCache::GetDepthMatrixProgram(): PixelShaderCache::GetColorMatrixProgram(),VertexShaderCache::GetSimpleVertexSahder()); D3D::drawShadedTexQuad(read_texture,&sourcerect, EFB_WIDTH , EFB_HEIGHT,&destrect,(FBManager::GetEFBDepthRTSurfaceFormat() == D3DFMT_R32F && bFromZBuffer)? PixelShaderCache::GetDepthMatrixProgram(): PixelShaderCache::GetColorMatrixProgram(),NULL);
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface()); D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
if(D3D::GetCaps().NumSimultaneousRTs > 1) D3D::dev->SetRenderTarget(1, FBManager::GetEFBDepthEncodedSurface());
D3D::dev->SetRenderTarget(1, FBManager::GetEFBDepthEncodedSurface());
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface()); D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
VertexShaderManager::SetViewportChanged(); VertexShaderManager::SetViewportChanged();
Renderer::RestoreAPIState(); Renderer::RestoreAPIState();

View File

@ -53,7 +53,6 @@ public:
oldpixel = 0; oldpixel = 0;
} }
void Destroy(bool shutdown); void Destroy(bool shutdown);
bool IntersectsMemoryRange(u32 range_address, u32 range_size);
}; };
private: private:
@ -68,7 +67,6 @@ public:
static void Cleanup(); static void Cleanup();
static void Shutdown(); static void Shutdown();
static void Invalidate(bool shutdown); static void Invalidate(bool shutdown);
static void InvalidateRange(u32 start_address, u32 size);
static TCacheEntry *Load(int stage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt); static TCacheEntry *Load(int stage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt);
static void CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle &source_rect); static void CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, int bScaleByHalf, const EFBRectangle &source_rect);
}; };

File diff suppressed because it is too large Load Diff

View File

@ -192,10 +192,10 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
#elif defined(_WIN32) #elif defined(_WIN32)
// Create rendering window in Windows // Create rendering window in Windows
// Create a separate window // Create a separate window
/*if (!g_Config.RenderToMainframe || g_VideoInitialize.pWindowHandle == NULL) if (!g_Config.RenderToMainframe || g_VideoInitialize.pWindowHandle == NULL)
g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, _T("Please wait...")); g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, _T("Please wait..."));
// Create a child window // Create a child window
else*/ else
g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait...")); g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create((HWND)g_VideoInitialize.pWindowHandle, g_hInstance, _T("Please wait..."));
// Show the window // Show the window

View File

@ -146,8 +146,7 @@ namespace EmuWindow
{ {
HWND m_hWnd = NULL; // The new window that is created here HWND m_hWnd = NULL; // The new window that is created here
HWND m_hParent = NULL; HWND m_hParent = NULL; // The main CPanel
HWND m_hMain = NULL; // The main CPanel
HINSTANCE m_hInstance = NULL; HINSTANCE m_hInstance = NULL;
WNDCLASSEX wndClass; WNDCLASSEX wndClass;
@ -244,10 +243,16 @@ void OnKeyDown(WPARAM wParam)
switch (LOWORD( wParam )) switch (LOWORD( wParam ))
{ {
case VK_ESCAPE: case VK_ESCAPE:
if (!g_Config.RenderToMainframe) if (g_Config.bFullscreen && !g_Config.RenderToMainframe)
{ {
// Pressing Esc stops the emulation // Pressing Esc switch to Windowed in Fullscreen mode
SendMessage( m_hWnd, WM_CLOSE, 0, 0 ); ToggleFullscreen(m_hWnd);
return;
}
else if (!g_Config.RenderToMainframe)
{
// And stops the emulation when already in Windowed mode
PostMessage(m_hParent, WM_USER, OPENGL_WM_USER_STOP, 0);
} }
break; break;
case '3': // OSD keys case '3': // OSD keys
@ -270,7 +275,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
switch (iMsg) switch (iMsg)
{ {
case WM_CREATE: case WM_CREATE:
PostMessage(m_hMain, WM_USER, WM_USER_CREATE, g_Config.RenderToMainframe); PostMessage((HWND)g_VideoInitialize.pWindowHandle, WM_USER, OPENGL_WM_USER_CREATE, (int)m_hParent);
break; break;
case WM_PAINT: case WM_PAINT:
@ -320,7 +325,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
it's nessesary for both the child window and separate rendering window because it's nessesary for both the child window and separate rendering window because
moves over the rendering window do not reach the main program then. */ moves over the rendering window do not reach the main program then. */
if (GetParentWnd() == NULL) { // Separate rendering window if (GetParentWnd() == NULL) { // Separate rendering window
PostMessage(m_hMain, iMsg, wParam, -1); PostMessage(m_hParent, iMsg, wParam, -1);
SetCursor(hCursor); SetCursor(hCursor);
} }
else else
@ -331,14 +336,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
only let it pass through Dolphin > Frame.cpp to determine if it should be on or off only let it pass through Dolphin > Frame.cpp to determine if it should be on or off
and coordinate it with the other settings if nessesary */ and coordinate it with the other settings if nessesary */
case WM_USER: case WM_USER:
if (wParam == WM_USER_STOP) if (wParam == OPENGL_WM_USER_STOP)
{ {
if (lParam) if (lParam)
SetCursor(hCursor); SetCursor(hCursor);
else else
SetCursor(hCursorBlank); SetCursor(hCursorBlank);
} }
if (wParam == WM_USER_KEYDOWN) if (wParam == OPENGL_WM_USER_KEYDOWN)
OnKeyDown(lParam); OnKeyDown(lParam);
if (wParam == TOGGLE_FULLSCREEN) if (wParam == TOGGLE_FULLSCREEN)
ToggleFullscreen(m_hWnd); ToggleFullscreen(m_hWnd);
@ -349,7 +354,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
if (m_hParent == NULL) if (m_hParent == NULL)
{ {
// Simple hack to easily exit without stopping. Hope to fix the stopping errors soon. // Simple hack to easily exit without stopping. Hope to fix the stopping errors soon.
PostMessage(m_hMain, WM_USER, WM_USER_STOP, 0); ExitProcess(0);
return 0; return 0;
} }
@ -400,16 +405,16 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
CreateCursors(m_hInstance); CreateCursors(m_hInstance);
// Create child window // Create child window
if (g_Config.RenderToMainframe) if (parent)
{ {
m_hParent = m_hMain = parent; m_hParent = parent;
m_hWnd = CreateWindowEx(0, m_szClassName, title, WS_CHILD, m_hWnd = CreateWindow(m_szClassName, title,
WS_CHILD,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
parent, NULL, hInstance, NULL); parent, NULL, hInstance, NULL);
if( !g_Config.bFullscreen ) ShowWindow(m_hWnd, SW_SHOWMAXIMIZED);
SetWindowPos( GetParent(m_hParent), NULL, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER );
} }
// Create new separate window // Create new separate window
@ -419,7 +424,6 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
// render to main, stop, then render to separate window, as the GUI will still // render to main, stop, then render to separate window, as the GUI will still
// think we're rendering to main because m_hParent will still contain the old HWND... // think we're rendering to main because m_hParent will still contain the old HWND...
m_hParent = NULL; m_hParent = NULL;
m_hMain = parent;
DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW; DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW;
@ -434,9 +438,13 @@ HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const T
rc.top = (1024 - h)/2; rc.top = (1024 - h)/2;
rc.bottom = rc.top + h; rc.bottom = rc.top + h;
m_hWnd = CreateWindowEx(0, m_szClassName, title, style, m_hWnd = CreateWindow(m_szClassName, title,
style,
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
NULL, NULL, hInstance, NULL); parent, NULL, hInstance, NULL );
g_winstyle = GetWindowLong( m_hWnd, GWL_STYLE );
g_winstyle &= ~WS_MAXIMIZE & ~WS_MINIMIZE; // remove minimize/maximize style
} }
return m_hWnd; return m_hWnd;
@ -531,9 +539,7 @@ void Show()
HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title)
{ {
int width=640, height=480; return OpenWindow(hParent, hInstance, 640, 480, title);
sscanf( g_Config.bFullscreen ? g_Config.cFSResolution : g_Config.cInternalRes, "%dx%d", &width, &height );
return OpenWindow(hParent, hInstance, width, height, title);
} }
void Close() void Close()
@ -548,8 +554,7 @@ void Close()
void SetSize(int width, int height) void SetSize(int width, int height)
{ {
RECT rc = {0, 0, width, height}; RECT rc = {0, 0, width, height};
DWORD dwStyle = GetWindowLong(m_hWnd, GWL_STYLE); AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false);
AdjustWindowRect(&rc, dwStyle, false);
int w = rc.right - rc.left; int w = rc.right - rc.left;
int h = rc.bottom - rc.top; int h = rc.bottom - rc.top;

View File

@ -129,7 +129,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
switch( iMsg ) switch( iMsg )
{ {
case WM_CREATE: case WM_CREATE:
PostMessage(m_hMain, WM_USER, WM_USER_CREATE, (int)m_hParent); PostMessage(m_hMain, WM_USER, OPENGL_WM_USER_CREATE, (int)m_hParent);
break; break;
case WM_PAINT: case WM_PAINT:
@ -164,7 +164,7 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
else if (!g_Config.renderToMainframe) else if (!g_Config.renderToMainframe)
{ {
// And stops the emulation when already in Windowed mode // And stops the emulation when already in Windowed mode
PostMessage(m_hMain, WM_USER, WM_USER_STOP, 0); PostMessage(m_hMain, WM_USER, OPENGL_WM_USER_STOP, 0);
} }
break; break;
} }

View File

@ -67,10 +67,10 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib" AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib"
OutputFile="..\..\..\Binary\Win32/Plugins\Plugin_WiimoteD.dll" OutputFile="..\..\..\Binary\Win32/Plugins\Plugin_WiimoteD.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName)&quot;;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32" AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -154,7 +154,7 @@
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib" AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib rpcrt4.lib wxbase28ud.lib wxmsw28ud_core.lib"
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteD.dll" OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteD.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)&quot;;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64" AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -238,7 +238,7 @@
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_Wiimote.dll" OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_Wiimote.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName);..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32" AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -323,7 +323,7 @@
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_Wiimote.dll" OutputFile="..\..\..\Binary\x64\Plugins\Plugin_Wiimote.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)&quot;;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64" AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -405,7 +405,7 @@
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_WiimoteDF.dll" OutputFile="..\..\..\Binary\Win32\Plugins\Plugin_WiimoteDF.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\VisualC\SDL\Debug;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32" AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\WiiUse\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -487,7 +487,7 @@
AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib xinput.lib comctl32.lib winmm.lib wiiuse.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteDF.dll" OutputFile="..\..\..\Binary\x64\Plugins\Plugin_WiimoteDF.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\Debug&quot;;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64" AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\WiiUse\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"

View File

@ -24,7 +24,6 @@
#include "Config.h" #include "Config.h"
#include "EmuDefinitions.h" // for PadMapping #include "EmuDefinitions.h" // for PadMapping
#include "EmuMain.h"
#include "main.h" #include "main.h"
// Configuration file control names // Configuration file control names
@ -243,13 +242,10 @@ Config::Config()
{ {
// Set all default values to zero // Set all default values to zero
memset(this, 0, sizeof(Config)); memset(this, 0, sizeof(Config));
Loaded = false;
} }
void Config::Load(bool ChangePad) void Config::Load(bool ChangePad)
{ {
Loaded = true;
std::string temp; std::string temp;
IniFile iniFile; IniFile iniFile;
iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini"); iniFile.Load(FULL_CONFIG_DIR "Wiimote.ini");
@ -277,7 +273,6 @@ void Config::Load(bool ChangePad)
sprintf(SectionName, "Wiimote%i", i + 1); sprintf(SectionName, "Wiimote%i", i + 1);
iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false); iniFile.Get(SectionName, "NoTriggerFilter", &bNoTriggerFilter, false);
iniFile.Get(SectionName, "TriggerType", &Trigger.Type, Trigger.TRIGGER_OFF); iniFile.Get(SectionName, "TriggerType", &Trigger.Type, Trigger.TRIGGER_OFF);
iniFile.Get(SectionName, "TriggerUpright", &Trigger.Upright, false);
iniFile.Get(SectionName, "TriggerRollRange", &Trigger.Range.Roll, 50); iniFile.Get(SectionName, "TriggerRollRange", &Trigger.Range.Roll, 50);
iniFile.Get(SectionName, "TriggerPitchRange", &Trigger.Range.Pitch, false); iniFile.Get(SectionName, "TriggerPitchRange", &Trigger.Range.Pitch, false);
@ -300,49 +295,38 @@ void Config::Load(bool ChangePad)
iniFile.Get(SectionName, gh3ControlNames[x], &WiiMoteEmu::PadMapping[i].GH3c.keyForControls[x], GH3DefaultControls[x]); iniFile.Get(SectionName, gh3ControlNames[x], &WiiMoteEmu::PadMapping[i].GH3c.keyForControls[x], GH3DefaultControls[x]);
// Don't update this when we are loading settings from the ConfigBox // Don't update this when we are loading settings from the ConfigBox
if (!ChangePad) if(!ChangePad)
{ {
// This pad Id could possibly be higher than the number of pads that are connected, // This pad Id could possibly be higher than the number of pads that are connected,
// but we check later, when needed, that that is not the case // but we check later, when needed, that that is not the case
iniFile.Get(SectionName, "DeviceID", &WiiMoteEmu::PadMapping[i].ID, 0); iniFile.Get(SectionName, "DeviceID", &WiiMoteEmu::PadMapping[i].ID, 0);
iniFile.Get(SectionName, "DeviceName", &WiiMoteEmu::PadMapping[i].Name, 0);
iniFile.Get(SectionName, "Enabled", &WiiMoteEmu::PadMapping[i].enabled, true); iniFile.Get(SectionName, "Enabled", &WiiMoteEmu::PadMapping[i].enabled, true);
} }
// Joypad specific settings // Joypad specific settings
// Current joypad device ID: PadMapping[i].ID // Current joypad device ID: PadMapping[i].ID
// Current joypad name: PadMapping[i].Name // Current joypad name: joyinfo[PadMapping[i].ID].Name
// Prevent a crash from illegal access to joyinfo that will only have values for
// the current amount of connected PadMapping
if((u32)WiiMoteEmu::PadMapping[i].ID >= WiiMoteEmu::joyinfo.size()) continue;
// Create a section name // Create a section name
std::string JoySectionName = WiiMoteEmu::PadMapping[i].Name; std::string joySectionName = WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name;
// Don't load settings for a non-connected device
if (!WiiMoteEmu::IsConnected(JoySectionName))
{
ERROR_LOG(PAD, "Slot %i: The device '%s' is not connected, will not load settings", i, JoySectionName.c_str());
continue;
}
// Don't load a blank ID
if (JoySectionName == "")
{
ERROR_LOG(PAD, "Slot %i has no device name, will not load settings", i);
continue;
}
iniFile.Get(JoySectionName.c_str(), "left_x", &WiiMoteEmu::PadMapping[i].Axis.Lx, 0); iniFile.Get(joySectionName.c_str(), "left_x", &WiiMoteEmu::PadMapping[i].Axis.Lx, 0);
iniFile.Get(JoySectionName.c_str(), "left_y", &WiiMoteEmu::PadMapping[i].Axis.Ly, 1); iniFile.Get(joySectionName.c_str(), "left_y", &WiiMoteEmu::PadMapping[i].Axis.Ly, 1);
iniFile.Get(JoySectionName.c_str(), "right_x", &WiiMoteEmu::PadMapping[i].Axis.Rx, 2); iniFile.Get(joySectionName.c_str(), "right_x", &WiiMoteEmu::PadMapping[i].Axis.Rx, 2);
iniFile.Get(JoySectionName.c_str(), "right_y", &WiiMoteEmu::PadMapping[i].Axis.Ry, 3); iniFile.Get(joySectionName.c_str(), "right_y", &WiiMoteEmu::PadMapping[i].Axis.Ry, 3);
iniFile.Get(JoySectionName.c_str(), "l_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tl, 1004); iniFile.Get(joySectionName.c_str(), "l_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tl, 1004);
iniFile.Get(JoySectionName.c_str(), "r_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tr, 1005); iniFile.Get(joySectionName.c_str(), "r_trigger", &WiiMoteEmu::PadMapping[i].Axis.Tr, 1005);
iniFile.Get(JoySectionName.c_str(), "DeadZoneL", &WiiMoteEmu::PadMapping[i].DeadZoneL, 0); iniFile.Get(joySectionName.c_str(), "DeadZoneL", &WiiMoteEmu::PadMapping[i].DeadZoneL, 0);
iniFile.Get(JoySectionName.c_str(), "DeadZoneR", &WiiMoteEmu::PadMapping[i].DeadZoneR, 0); iniFile.Get(joySectionName.c_str(), "DeadZoneR", &WiiMoteEmu::PadMapping[i].DeadZoneR, 0);
iniFile.Get(JoySectionName.c_str(), "TriggerType", &WiiMoteEmu::PadMapping[i].triggertype, 0); iniFile.Get(joySectionName.c_str(), "TriggerType", &WiiMoteEmu::PadMapping[i].triggertype, 0);
iniFile.Get(JoySectionName.c_str(), "Diagonal", &WiiMoteEmu::PadMapping[i].SDiagonal, "100%"); iniFile.Get(joySectionName.c_str(), "Diagonal", &WiiMoteEmu::PadMapping[i].SDiagonal, "100%");
iniFile.Get(JoySectionName.c_str(), "Circle2Square", &WiiMoteEmu::PadMapping[i].bCircle2Square, false); iniFile.Get(joySectionName.c_str(), "Circle2Square", &WiiMoteEmu::PadMapping[i].bCircle2Square, false);
iniFile.Get(JoySectionName.c_str(), "RollInvert", &WiiMoteEmu::PadMapping[i].bRollInvert, false); iniFile.Get(joySectionName.c_str(), "RollInvert", &WiiMoteEmu::PadMapping[i].bRollInvert, false);
iniFile.Get(JoySectionName.c_str(), "PitchInvert", &WiiMoteEmu::PadMapping[i].bPitchInvert, false); iniFile.Get(joySectionName.c_str(), "PitchInvert", &WiiMoteEmu::PadMapping[i].bPitchInvert, false);
NOTICE_LOG(WIIMOTE, "Slot %i: Load settings for ID %i '%s'", i, WiiMoteEmu::PadMapping[i].ID, JoySectionName.c_str());
} }
// Load the IR cursor settings if it's avaliable for the GameId, if not load the default settings // Load the IR cursor settings if it's avaliable for the GameId, if not load the default settings
iniFile.Load(FULL_CONFIG_DIR "IR Pointer.ini"); iniFile.Load(FULL_CONFIG_DIR "IR Pointer.ini");
@ -391,7 +375,6 @@ void Config::Save(int Slot)
iniFile.Set(SectionName, "Enabled", WiiMoteEmu::PadMapping[i].enabled); iniFile.Set(SectionName, "Enabled", WiiMoteEmu::PadMapping[i].enabled);
iniFile.Set(SectionName, "NoTriggerFilter", bNoTriggerFilter); iniFile.Set(SectionName, "NoTriggerFilter", bNoTriggerFilter);
iniFile.Set(SectionName, "TriggerType", Trigger.Type); iniFile.Set(SectionName, "TriggerType", Trigger.Type);
iniFile.Set(SectionName, "TriggerUpright", Trigger.Upright);
iniFile.Set(SectionName, "TriggerRollRange", Trigger.Range.Roll); iniFile.Set(SectionName, "TriggerRollRange", Trigger.Range.Roll);
iniFile.Set(SectionName, "TriggerPitchRange", Trigger.Range.Pitch); iniFile.Set(SectionName, "TriggerPitchRange", Trigger.Range.Pitch);
@ -417,23 +400,18 @@ void Config::Save(int Slot)
// Save the physical device ID number // Save the physical device ID number
iniFile.Set(SectionName, "DeviceID", WiiMoteEmu::PadMapping[i].ID); iniFile.Set(SectionName, "DeviceID", WiiMoteEmu::PadMapping[i].ID);
iniFile.Set(SectionName, "DeviceName", WiiMoteEmu::PadMapping[i].Name);
// Joypad specific settings // Joypad specific settings
// Current joypad device ID: PadMapping[i].ID // Current joypad device ID: PadMapping[i].ID
// Current joypad name: IDToName(PadMapping[i].ID]) // Current joypad name: joyinfo[PadMapping[i].ID].Name
// Save joypad specific settings. Check for "PadMapping[i].ID < SDL_NumJoysticks()" to
// avoid reading a joyinfo that does't exist
if((u32)WiiMoteEmu::PadMapping[i].ID >= WiiMoteEmu::joyinfo.size()) continue;
// Create a new section name after the joypad name // Create a new section name after the joypad name
std::string joySectionName = WiiMoteEmu::IDToName(WiiMoteEmu::PadMapping[i].ID); std::string joySectionName = WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name;
// Don't save a blank name
if (SectionName == "")
{
ERROR_LOG(WIIMOTE, "ID %i has no name, will not load", WiiMoteEmu::PadMapping[i].ID);
continue;
}
NOTICE_LOG(WIIMOTE, "Save settings for ID %i '%s' from PadMapping[%i]", WiiMoteEmu::PadMapping[i].ID, joySectionName.c_str(), i);
iniFile.Set(joySectionName.c_str(), "left_x", WiiMoteEmu::PadMapping[i].Axis.Lx); iniFile.Set(joySectionName.c_str(), "left_x", WiiMoteEmu::PadMapping[i].Axis.Lx);
iniFile.Set(joySectionName.c_str(), "left_y", WiiMoteEmu::PadMapping[i].Axis.Ly); iniFile.Set(joySectionName.c_str(), "left_y", WiiMoteEmu::PadMapping[i].Axis.Ly);
iniFile.Set(joySectionName.c_str(), "right_x", WiiMoteEmu::PadMapping[i].Axis.Rx); iniFile.Set(joySectionName.c_str(), "right_x", WiiMoteEmu::PadMapping[i].Axis.Rx);

View File

@ -41,7 +41,6 @@ struct Config
Config(); Config();
void Load(bool ChangePad = false); void Load(bool ChangePad = false);
void Save(int Slot = -1); void Save(int Slot = -1);
bool Loaded;
struct PadRange struct PadRange
{ {
@ -60,7 +59,6 @@ struct Config
TRIGGER TRIGGER
}; };
int Type; int Type;
bool Upright;
PadRange Range; PadRange Range;
}; };
struct PadNunchuck struct PadNunchuck

View File

@ -34,7 +34,6 @@ BEGIN_EVENT_TABLE(WiimoteBasicConfigDialog,wxDialog)
EVT_CHECKBOX(ID_CONNECT_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_CONNECT_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged)
EVT_CHECKBOX(ID_USE_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_USE_REAL, WiimoteBasicConfigDialog::GeneralSettingsChanged)
EVT_CHECKBOX(ID_SIDEWAYSDPAD, WiimoteBasicConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_SIDEWAYSDPAD, WiimoteBasicConfigDialog::GeneralSettingsChanged)
EVT_CHECKBOX(ID_UPRIGHTWIIMOTE, WiimoteBasicConfigDialog::GeneralSettingsChanged)
EVT_CHECKBOX(ID_MOTIONPLUSCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged) EVT_CHECKBOX(ID_MOTIONPLUSCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged)
EVT_CHOICE(ID_EXTCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged) EVT_CHOICE(ID_EXTCONNECTED, WiimoteBasicConfigDialog::GeneralSettingsChanged)
// IR cursor // IR cursor
@ -208,9 +207,9 @@ void WiimoteBasicConfigDialog::CreateGUIControls()
// Emulated Wiimote // Emulated Wiimote
m_SidewaysDPad[i] = new wxCheckBox(m_Controller[i], ID_SIDEWAYSDPAD, wxT("Sideways D-Pad")); m_SidewaysDPad[i] = new wxCheckBox(m_Controller[i], ID_SIDEWAYSDPAD, wxT("Sideways D-Pad"));
m_SidewaysDPad[i]->SetValue(g_Config.bSidewaysDPad); m_SidewaysDPad[i]->SetValue(g_Config.bSidewaysDPad);
m_UprightWiimote[i] = new wxCheckBox(m_Controller[i], ID_UPRIGHTWIIMOTE, wxT("Upright Wiimote"));
m_UprightWiimote[i]->SetValue(g_Config.Trigger.Upright); m_SizeEmu[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Emulated Wiimote"));
m_UprightWiimote[i]->SetToolTip(wxT("Treat the upright position as neutral for roll and pitch")); m_SizeEmu[i]->Add(m_SidewaysDPad[i], 0, wxEXPAND | wxALL, 5);
//IR Pointer //IR Pointer
m_TextScreenWidth[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Width: 000")); m_TextScreenWidth[i] = new wxStaticText(m_Controller[i], wxID_ANY, wxT("Width: 000"));
@ -252,12 +251,6 @@ void WiimoteBasicConfigDialog::CreateGUIControls()
m_CheckAR169[i]->Enable(false); m_CheckAR169[i]->Enable(false);
m_Crop[i]->Enable(false); m_Crop[i]->Enable(false);
// Sizers
m_SizeEmu[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Emulated Wiimote"));
m_SizeEmu[i]->Add(m_SidewaysDPad[i], 0, wxEXPAND | wxALL, 5);
m_SizeEmu[i]->Add(m_UprightWiimote[i], 0, wxEXPAND | (wxLEFT | wxDOWN | wxRIGHT), 5);
m_SizerIRPointerScreen[i] = new wxBoxSizer(wxHORIZONTAL); m_SizerIRPointerScreen[i] = new wxBoxSizer(wxHORIZONTAL);
m_SizerIRPointerScreen[i]->Add(m_TextAR[i], 0, wxEXPAND | (wxTOP), 0); m_SizerIRPointerScreen[i]->Add(m_TextAR[i], 0, wxEXPAND | (wxTOP), 0);
m_SizerIRPointerScreen[i]->Add(m_CheckAR43[i], 0, wxEXPAND | (wxLEFT), 5); m_SizerIRPointerScreen[i]->Add(m_CheckAR43[i], 0, wxEXPAND | (wxLEFT), 5);
@ -398,9 +391,6 @@ void WiimoteBasicConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
case ID_SIDEWAYSDPAD: case ID_SIDEWAYSDPAD:
g_Config.bSidewaysDPad = m_SidewaysDPad[Page]->IsChecked(); g_Config.bSidewaysDPad = m_SidewaysDPad[Page]->IsChecked();
break;
case ID_UPRIGHTWIIMOTE:
g_Config.Trigger.Upright = m_UprightWiimote[Page]->IsChecked();
break; break;
case ID_MOTIONPLUSCONNECTED: case ID_MOTIONPLUSCONNECTED:

View File

@ -79,7 +79,6 @@ class WiimoteBasicConfigDialog : public wxDialog
// Emulated Wiimote settings // Emulated Wiimote settings
wxCheckBox *m_SidewaysDPad[4], wxCheckBox *m_SidewaysDPad[4],
*m_UprightWiimote[4],
*m_WiimoteOnline[4], *m_WiimoteOnline[4],
*m_WiiMotionPlusConnected[4], *m_WiiMotionPlusConnected[4],
*m_CheckAR43[4], *m_CheckAR43[4],
@ -127,7 +126,6 @@ class WiimoteBasicConfigDialog : public wxDialog
// Emulated Wiimote // Emulated Wiimote
ID_SIDEWAYSDPAD, ID_SIDEWAYSDPAD,
ID_UPRIGHTWIIMOTE,
ID_MOTIONPLUSCONNECTED, ID_MOTIONPLUSCONNECTED,
ID_EXTCONNECTED, ID_EXTCONNECTED,
IDC_WIMOTE_ON, IDC_WIMOTE_ON,

View File

@ -30,15 +30,36 @@
is only used the first time the pads are checked. */ is only used the first time the pads are checked. */
void WiimotePadConfigDialog::DoChangeJoystick() void WiimotePadConfigDialog::DoChangeJoystick()
{ {
WARN_LOG(WIIMOTE, "---- DoChangeJoystick ----"); // Close the current pad, unless it's used by another slot
//if (PadMapping[notebookpage].enabled) PadClose(notebookpage);
// Before changing the pad we save potential changes to the current pad // Before changing the pad we save potential changes to the current pad
DoSave(true); DoSave(true);
// Load the settings for the new Id // Load the settings for the new Id
g_Config.Load(true); g_Config.Load(true);
// Update the GUI UpdateGUI(Page); // Update the GUI
UpdateGUI(Page);
// Open the new pad
if (WiiMoteEmu::PadMapping[Page].enabled) PadOpen(Page);
}
void WiimotePadConfigDialog::PadOpen(int Open) // Open for slot 1, 2, 3 or 4
{
// Check that we got a good pad
if (!WiiMoteEmu::joyinfo.at(WiiMoteEmu::PadMapping[Open].ID).Good)
{
DEBUG_LOG(WIIMOTE, "A bad pad was selected");
WiiMoteEmu::PadState[Open].joy = NULL;
return;
}
DEBUG_LOG(WIIMOTE, "Update the Slot %i handle to Id %i", Page, WiiMoteEmu::PadMapping[Open].ID);
WiiMoteEmu::PadState[Open].joy = SDL_JoystickOpen(WiiMoteEmu::PadMapping[Open].ID);
}
void WiimotePadConfigDialog::PadClose(int _Close) // Close for slot 1, 2, 3 or 4
{
if (SDL_JoystickOpened(WiiMoteEmu::PadMapping[_Close].ID)) SDL_JoystickClose(WiiMoteEmu::PadState[_Close].joy);
WiiMoteEmu::PadState[_Close].joy = NULL;
} }
void WiimotePadConfigDialog::DoChangeDeadZone(bool Left) void WiimotePadConfigDialog::DoChangeDeadZone(bool Left)
@ -69,29 +90,30 @@ void WiimotePadConfigDialog::DoChangeDeadZone(bool Left)
// Set the button text for all four Wiimotes // Set the button text for all four Wiimotes
void WiimotePadConfigDialog::SetButtonTextAll(int id, char text[128]) void WiimotePadConfigDialog::SetButtonTextAll(int id, char text[128])
{ {
for (int i = 0; i < MAX_WIIMOTES; i++) for (int i = 0; i < 1; i++)
{ {
if (WiiMoteEmu::IDToName(WiiMoteEmu::PadMapping[i].ID) == WiiMoteEmu::IDToName(WiiMoteEmu::PadMapping[Page].ID)) // Safety check to avoid crash
{ if ((int)WiiMoteEmu::joyinfo.size() > WiiMoteEmu::PadMapping[i].ID)
SetButtonText(id, text, i); if (WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name == WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[Page].ID].Name)
DEBUG_LOG(PAD, "Updated button text for slot %i", i); SetButtonText(id, text, i);
}
}; };
} }
void WiimotePadConfigDialog::SaveButtonMappingAll(int Slot) void WiimotePadConfigDialog::SaveButtonMappingAll(int Slot)
{ {
for (int i = 0; i < MAX_WIIMOTES; i++) for (int i = 0; i < 4; i++)
{ {
if (WiiMoteEmu::PadMapping[i].Name.length() > 0 && WiiMoteEmu::PadMapping[i].Name == WiiMoteEmu::PadMapping[Slot].Name) // This can occur when no gamepad is detected
SaveButtonMapping(i, false, Slot); if ((int)WiiMoteEmu::joyinfo.size() > WiiMoteEmu::PadMapping[i].ID && WiiMoteEmu::PadMapping[i].ID >= 0)
if (WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[i].ID].Name == WiiMoteEmu::joyinfo[WiiMoteEmu::PadMapping[Slot].ID].Name)
SaveButtonMapping(i, false, Slot);
} }
} }
// Set dialog items from saved values // Set dialog items from saved values
void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller) void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller)
{ {
NOTICE_LOG(WIIMOTE, "Load ButtonMapping | controller:%i", controller);
// Temporary storage // Temporary storage
wxString tmp; wxString tmp;
@ -182,19 +204,12 @@ void WiimotePadConfigDialog::UpdateGUIButtonMapping(int controller)
void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot) void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId, int FromSlot)
{ {
// Log
NOTICE_LOG(WIIMOTE, "SaveButtonMapping | controller:%i FromSlot:%i", controller, FromSlot);
// Temporary storage // Temporary storage
wxString tmp; wxString tmp;
long value; long value;
// Save from or to the same or different slots // Save from or to the same or different slots
if (FromSlot == -1) FromSlot = controller; if (FromSlot == -1) FromSlot = controller;
// TEMPORARY
// There is only one slot at the moment
if (FromSlot > MAX_WIIMOTES-1) FromSlot = MAX_WIIMOTES-1;
// Replace "" with "-1" in the GUI controls // Replace "" with "-1" in the GUI controls
ToBlank(false); ToBlank(false);
@ -203,11 +218,7 @@ void WiimotePadConfigDialog::SaveButtonMapping(int controller, bool DontChangeId
-1 that's a bug that should be fixed. Because the m_Joyname[] combo box should always show <No Gamepad Detected>, or a gamepad name, not a -1 that's a bug that should be fixed. Because the m_Joyname[] combo box should always show <No Gamepad Detected>, or a gamepad name, not a
a blank selection. */ a blank selection. */
if (!DontChangeId) if (!DontChangeId)
{ WiiMoteEmu::PadMapping[controller].ID = m_Joyname[FromSlot]->GetSelection();
if (m_Joyname[FromSlot]->GetSelection() >= WiiMoteEmu::joyinfo.size()) PanicAlert("Bug in SaveButtonMapping");
WiiMoteEmu::PadMapping[controller].ID = WiiMoteEmu::joyinfo.at(m_Joyname[FromSlot]->GetSelection()).ID;
WiiMoteEmu::PadMapping[controller].Name = m_Joyname[FromSlot]->GetValue().mb_str();
}
// Set enabled or disable status // Set enabled or disable status
if (FromSlot == controller) if (FromSlot == controller)
WiiMoteEmu::PadMapping[controller].enabled = true; //m_Joyattach[FromSlot]->GetValue(); // Only enable one WiiMoteEmu::PadMapping[controller].enabled = true; //m_Joyattach[FromSlot]->GetValue(); // Only enable one
@ -361,11 +372,6 @@ void WiimotePadConfigDialog::GetButtons(wxCommandEvent& event)
void WiimotePadConfigDialog::DoGetButtons(int _GetId) void WiimotePadConfigDialog::DoGetButtons(int _GetId)
{ {
DEBUG_LOG(WIIMOTE, "DoGetButtons");
bool _LiveUpdates = LiveUpdates;
LiveUpdates = false;
// Collect the starting values // Collect the starting values
// Get the current controller // Get the current controller
@ -393,7 +399,7 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
// Values used in this function // Values used in this function
char format[128]; char format[128];
int Seconds = 4; // Seconds to wait for int Seconds = 4; // Seconds to wait for
int TimesPerSecond = 60; // How often to run the check int TimesPerSecond = 40; // How often to run the check
// Values returned from InputCommon::GetButton() // Values returned from InputCommon::GetButton()
int value; // Axis value int value; // Axis value
@ -432,7 +438,7 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) ); m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) );
#endif #endif
DEBUG_LOG(WIIMOTE, "Timer Started for Pad:%i _GetId:%i" DEBUG_LOG(WIIMOTE, "Timer Started for Pad:%i _GetId:%i"
" Allowed input is Axis:%i LeftRight:%i XInput:%i Button:%i Hat:%i\n", "Allowed input is Axis:%i LeftRight:%i XInput:%i Button:%i Hat:%i\n",
WiiMoteEmu::PadMapping[Controller].ID, _GetId, WiiMoteEmu::PadMapping[Controller].ID, _GetId,
Axis, LeftRight, XInput, Button, Hat); Axis, LeftRight, XInput, Button, Hat);
} }
@ -443,7 +449,7 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
else else
{ {
InputCommon::GetButton( InputCommon::GetButton(
WiiMoteEmu::PadState[Page].joy, PadID, WiiMoteEmu::joyinfo[PadID].joy, PadID, WiiMoteEmu::joyinfo[PadID].NumButtons, WiiMoteEmu::joyinfo[PadID].NumAxes, WiiMoteEmu::joyinfo[PadID].NumHats,
g_Pressed, value, type, pressed, Succeed, Stop, g_Pressed, value, type, pressed, Succeed, Stop,
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter); LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
} }
@ -476,7 +482,7 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
} }
// If we got a button // If we got a button
if (Succeed) if(Succeed)
{ {
Stop = true; Stop = true;
// Write the number of the pressed button to the text box // Write the number of the pressed button to the text box
@ -485,11 +491,10 @@ void WiimotePadConfigDialog::DoGetButtons(int _GetId)
} }
// Stop the timer // Stop the timer
if (Stop) if(Stop)
{ {
m_ButtonMappingTimer->Stop(); m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0; GetButtonWaitingTimer = 0;
LiveUpdates = _LiveUpdates;
/* Update the button mapping for all slots that use this device. (It /* Update the button mapping for all slots that use this device. (It
doesn't make sense to have several slots controlled by the same doesn't make sense to have several slots controlled by the same
@ -540,12 +545,12 @@ void WiimotePadConfigDialog::Convert2Box(int &x)
// Update the input status boxes // Update the input status boxes
void WiimotePadConfigDialog::PadGetStatus() void WiimotePadConfigDialog::PadGetStatus()
{ {
//DEBUG_LOG(WIIMOTE, "PadGetStatus"); //DEBUG_LOG(WIIMOTE, "SDL_WasInit: %i", SDL_WasInit(0));
/* Return if it's not detected. The ID should never be less than zero here, /* Return if it's not detected. The ID should never be less than zero here,
it can only be that because of a manual ini file change, but we make it can only be that because of a manual ini file change, but we make
that check anway. */ that check anway. */
if (WiiMoteEmu::PadMapping[Page].ID < 0 || WiiMoteEmu::PadMapping[Page].ID >= SDL_NumJoysticks()) if(WiiMoteEmu::PadMapping[Page].ID < 0 || WiiMoteEmu::PadMapping[Page].ID >= SDL_NumJoysticks())
{ {
m_TStatusLeftIn[Page]->SetLabel(wxT("Not connected")); m_TStatusLeftIn[Page]->SetLabel(wxT("Not connected"));
m_TStatusLeftOut[Page]->SetLabel(wxT("Not connected")); m_TStatusLeftOut[Page]->SetLabel(wxT("Not connected"));
@ -569,13 +574,15 @@ void WiimotePadConfigDialog::PadGetStatus()
} }
// Get physical device status // Get physical device status
int ID = WiiMoteEmu::PadMapping[Page].ID; int PhysicalDevice = WiiMoteEmu::PadMapping[Page].ID;
int TriggerType = WiiMoteEmu::PadMapping[Page].triggertype; int TriggerType = WiiMoteEmu::PadMapping[Page].triggertype;
// Check that Dolphin is in focus, otherwise don't update the pad status // Check that Dolphin is in focus, otherwise don't update the pad status
//if (IsFocus()) //if (IsFocus())
WiiMoteEmu::GetJoyState(WiiMoteEmu::PadState[Page], WiiMoteEmu::PadMapping[Page], Page); WiiMoteEmu::GetJoyState(WiiMoteEmu::PadState[Page], WiiMoteEmu::PadMapping[Page], Page, WiiMoteEmu::joyinfo.at(WiiMoteEmu::PadMapping[Page].ID).NumButtons);
// Analog stick // Analog stick
// Set Deadzones perhaps out of function // Set Deadzones perhaps out of function
//int deadzone = (int)(((float)(128.00/100.00)) * (float)(PadMapping[_numPAD].deadzone+1)); //int deadzone = (int)(((float)(128.00/100.00)) * (float)(PadMapping[_numPAD].deadzone+1));
@ -688,45 +695,16 @@ void WiimotePadConfigDialog::PadGetStatus()
wxT("%03i"), TriggerRight)); wxT("%03i"), TriggerRight));
} }
// Slow timer, once a second
void WiimotePadConfigDialog::Update(wxTimerEvent& WXUNUSED(event))
{
if (!LiveUpdates) return;
// Don't run this the first time
int OldNumDIDevices;
if (WiiMoteEmu::NumDIDevices == -1)
OldNumDIDevices = InputCommon::SearchDIDevices();
else
// Search for connected devices and update dialog
OldNumDIDevices = WiiMoteEmu::NumDIDevices;
WiiMoteEmu::NumDIDevices = InputCommon::SearchDIDevices();
// Update if a pad has been connected/disconnected. Todo: Add a better check that also takes into consideration the pad id
// and other things to ensure nothing has changed
//DEBUG_LOG(WIIMOTE, "Found %i devices", WiiMoteEmu::NumDIDevices);
//DEBUG_LOG(WIIMOTE, "Update: %i %i", OldNumPads, WiiMoteEmu::NumPads);
if (OldNumDIDevices != WiiMoteEmu::NumDIDevices)
{
WiiMoteEmu::LocalSearchDevicesReset(WiiMoteEmu::joyinfo, WiiMoteEmu::NumPads);
WiimotePadConfigDialog::UpdateDeviceList();
}
}
// Populate the advanced tab // Populate the advanced tab
void WiimotePadConfigDialog::UpdatePad(wxTimerEvent& WXUNUSED(event)) void WiimotePadConfigDialog::UpdatePad(wxTimerEvent& WXUNUSED(event))
{ {
if (!WiiMoteEmu::IsPolling()) return;
//DEBUG_LOG(WIIMOTE, "UpdatePad");
// Show the current status // Show the current status
/*
#ifdef SHOW_PAD_STATUS #ifdef SHOW_PAD_STATUS
m_pStatusBar->SetLabel(wxString::FromAscii(InputCommon::DoShowStatus( m_pStatusBar->SetLabel(wxString::Format(
Page, m_Joyname[Page]->GetSelection(), "%s", ShowStatus(notebookpage).c_str()
WiiMoteEmu::PadMapping, WiiMoteEmu::PadState, WiiMoteEmu::joyinfo ));
).c_str())); #endif*/
#endif
//LogMsg("Abc%s\n", ShowStatus(notebookpage).c_str()); //LogMsg("Abc%s\n", ShowStatus(notebookpage).c_str());

View File

@ -98,7 +98,6 @@ BEGIN_EVENT_TABLE(WiimotePadConfigDialog,wxDialog)
EVT_BUTTON(IDB_TRIGGER_L, WiimotePadConfigDialog::GetButtons) EVT_BUTTON(IDB_TRIGGER_L, WiimotePadConfigDialog::GetButtons)
EVT_BUTTON(IDB_TRIGGER_R, WiimotePadConfigDialog::GetButtons) EVT_BUTTON(IDB_TRIGGER_R, WiimotePadConfigDialog::GetButtons)
EVT_TIMER(IDTM_BUTTON, WiimotePadConfigDialog::OnButtonTimer) EVT_TIMER(IDTM_BUTTON, WiimotePadConfigDialog::OnButtonTimer)
EVT_TIMER(IDTM_UPDATE, WiimotePadConfigDialog::Update)
EVT_TIMER(IDTM_UPDATE_PAD, WiimotePadConfigDialog::UpdatePad) EVT_TIMER(IDTM_UPDATE_PAD, WiimotePadConfigDialog::UpdatePad)
END_EVENT_TABLE() END_EVENT_TABLE()
@ -108,18 +107,14 @@ WiimotePadConfigDialog::WiimotePadConfigDialog(wxWindow *parent, wxWindowID id,
{ {
#if wxUSE_TIMER #if wxUSE_TIMER
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON); m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
m_Update = new wxTimer(this, IDTM_UPDATE); m_UpdatePad = new wxTimer(this, IDTM_UPDATE_PAD);
m_UpdatePad = new wxTimer(this, IDTM_UPDATE_PAD);
// Reset values // Reset values
GetButtonWaitingID = 0; GetButtonWaitingID = 0;
GetButtonWaitingTimer = 0; GetButtonWaitingTimer = 0;
// Start the slow timer // Start the permanent timer
int TimesPerSecond = 2; const int TimesPerSecond = 30;
m_Update->Start( floor((double)(1000 / TimesPerSecond)) );
// Start the fast timer
TimesPerSecond = 30;
m_UpdatePad->Start( floor((double)(1000 / TimesPerSecond)) ); m_UpdatePad->Start( floor((double)(1000 / TimesPerSecond)) );
#endif #endif
@ -133,9 +128,6 @@ WiimotePadConfigDialog::WiimotePadConfigDialog(wxWindow *parent, wxWindowID id,
// Set control values // Set control values
UpdateGUI(); UpdateGUI();
// Update device list
UpdateDeviceList();
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // Keyboard wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // Keyboard
wxKeyEventHandler(WiimotePadConfigDialog::OnKeyDown), wxKeyEventHandler(WiimotePadConfigDialog::OnKeyDown),
@ -212,13 +204,9 @@ void WiimotePadConfigDialog::OnClose(wxCloseEvent& event)
{ {
g_FrameOpen = false; g_FrameOpen = false;
SaveButtonMappingAll(Page); SaveButtonMappingAll(Page);
// Stop timers if(m_UpdatePad)
if(m_Update) m_Update->Stop(); m_UpdatePad->Stop();
if(m_UpdatePad) m_UpdatePad->Stop();
if(m_ButtonMappingTimer) m_ButtonMappingTimer->Stop();
INFO_LOG(WIIMOTE, "All timers stopped");
g_Config.Save(); g_Config.Save();
event.Skip(); event.Skip();
} }
@ -240,20 +228,18 @@ void WiimotePadConfigDialog::CloseClick(wxCommandEvent& event)
void WiimotePadConfigDialog::DoSave(bool ChangePad, int Slot) void WiimotePadConfigDialog::DoSave(bool ChangePad, int Slot)
{ {
WARN_LOG(WIIMOTE, "DoSave - %i slot %i", ChangePad, Slot);
// Replace "" with "-1" before we are saving // Replace "" with "-1" before we are saving
ToBlank(false); ToBlank(false);
if(ChangePad) if(ChangePad)
{ {
// Since we are selecting the pad to save to by the Id we can't update it when we change the pad // Since we are selecting the pad to save to by the Id we can't update it when we change the pad
for(int i = 0; i < MAX_WIIMOTES; i++) for(int i = 0; i < 4; i++)
SaveButtonMapping(i, true); SaveButtonMapping(i, true);
// Save the settings for the current pad // Save the settings for the current pad
g_Config.Save(Slot); g_Config.Save(Slot);
// Now we can update the ID // Now we can update the ID
UpdateID(); WiiMoteEmu::PadMapping[Page].ID = m_Joyname[Page]->GetSelection();
} }
else else
{ {
@ -265,14 +251,8 @@ void WiimotePadConfigDialog::DoSave(bool ChangePad, int Slot)
// Then change it back to "" // Then change it back to ""
ToBlank(); ToBlank();
}
void WiimotePadConfigDialog::UpdateID() DEBUG_LOG(WIIMOTE, "WiiMoteEmu::PadMapping[%i].ID = %i", Page, m_Joyname[Page]->GetSelection());
{
INFO_LOG(WIIMOTE, "PadMapping[%i].ID = %i from %i",
Page, WiiMoteEmu::joyinfo.at(m_Joyname[Page]->GetSelection()).ID, WiiMoteEmu::PadMapping[Page].ID);
WiiMoteEmu::PadMapping[Page].ID = WiiMoteEmu::joyinfo.at(m_Joyname[Page]->GetSelection()).ID;
WiiMoteEmu::PadMapping[Page].Name = m_Joyname[Page]->GetValue().mb_str();
WiiMoteEmu::PadState[Page].joy = WiiMoteEmu::joyinfo.at(m_Joyname[Page]->GetSelection()).joy;
} }
// Bitmap box and dot // Bitmap box and dot
@ -345,40 +325,24 @@ wxBitmap WiimotePadConfigDialog::CreateBitmapClear()
return bitmap; return bitmap;
} }
void WiimotePadConfigDialog::UpdateDeviceList()
{
if (!ControlsCreated) return;
DEBUG_LOG(WIIMOTE, "UpdateDeviceList");
for (int i = 0; i < MAX_WIIMOTES; i++)
{
// Save current selection
//std::string CurrentSel = m_Joyname[i]->GetValue().mb_str();
m_Joyname[i]->Clear();
// Search for devices and add them to the device list
if (WiiMoteEmu::joyinfo.size() > 0)
{
for (int j = 0; j < WiiMoteEmu::joyinfo.size(); j++)
m_Joyname[i]->Append(wxString::FromAscii(WiiMoteEmu::joyinfo.at(j).Name.c_str()));
// Set selection
for (int j = 0; j < WiiMoteEmu::joyinfo.size(); j++)
if (WiiMoteEmu::joyinfo.at(j).Name == WiiMoteEmu::PadMapping[i].Name) m_Joyname[i]->SetSelection(j);
if (m_Joyname[i]->GetSelection() == -1) m_Joyname[i]->SetSelection(0);
// Load settings
DoChangeJoystick();
}
else
{
m_Joyname[i]->Append(wxString::FromAscii("<No Gamepad Detected>"));
m_Joyname[i]->SetSelection(0);
}
}
}
void WiimotePadConfigDialog::CreatePadGUIControls() void WiimotePadConfigDialog::CreatePadGUIControls()
{ {
// Search for devices and add them to the device list
wxArrayString StrJoyname; // The string array
if (WiiMoteEmu::NumGoodPads > 0)
{
for (int x = 0; x < (int)WiiMoteEmu::joyinfo.size(); x++)
StrJoyname.Add(wxString::FromAscii(WiiMoteEmu::joyinfo[x].Name.c_str()));
}
else
{
StrJoyname.Add(wxString::FromAscii("<No Gamepad Detected>"));
}
// The tilt list // The tilt list
wxArrayString StrTilt; wxArrayString StrTilt;
StrTilt.Add(wxString::FromAscii("<Off>")); StrTilt.Add(wxString::FromAscii("<Off>"));
@ -408,17 +372,13 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
wxArrayString StrCcTriggers; wxArrayString StrCcTriggers;
StrCcTriggers.Add(wxString::FromAscii("Keyboard")); StrCcTriggers.Add(wxString::FromAscii("Keyboard"));
StrCcTriggers.Add(wxString::FromAscii("Triggers")); StrCcTriggers.Add(wxString::FromAscii("Triggers"));
#ifdef SHOW_PAD_STATUS
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxSize(-1, 600));
m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(250, 250), wxDefaultSize);
#else
m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize); m_Notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
#endif
for (int i = 0; i < MAX_WIIMOTES; i++) for (int i = 0; i < MAX_WIIMOTES; i++)
{ {
m_Controller[i] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE1 + i, wxDefaultPosition, wxDefaultSize); m_Controller[i] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE1 + i, wxDefaultPosition, wxDefaultSize);
m_Notebook->AddPage(m_Controller[i], wxString::Format(wxT("Wiimote %d"), i+1)); m_Notebook->AddPage(m_Controller[i], wxString::Format(wxT("Wiimote %d"), i+1));
// A small type font // A small type font
@ -427,8 +387,9 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
// Configuration controls sizes // Configuration controls sizes
static const int TxtW = 50, TxtH = 19, BtW = 75, BtH = 20; static const int TxtW = 50, TxtH = 19, BtW = 75, BtH = 20;
// Controller // Controller
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(200, -1), 0, NULL, wxCB_READONLY); m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, StrJoyname[0], wxDefaultPosition, wxSize(200, -1), StrJoyname, wxCB_READONLY);
// Circle to square // Circle to square
m_CheckC2S[i] = new wxCheckBox(m_Controller[i], IDC_LEFT_C2S, wxT("Circle To Square")); m_CheckC2S[i] = new wxCheckBox(m_Controller[i], IDC_LEFT_C2S, wxT("Circle To Square"));
@ -985,6 +946,7 @@ void WiimotePadConfigDialog::CreatePadGUIControls()
} }
m_Apply = new wxButton(this, ID_APPLY, wxT("Apply")); m_Apply = new wxButton(this, ID_APPLY, wxT("Apply"));
m_Close = new wxButton(this, ID_CLOSE, wxT("Close")); m_Close = new wxButton(this, ID_CLOSE, wxT("Close"));
m_Close->SetToolTip(wxT("Apply and Close")); m_Close->SetToolTip(wxT("Apply and Close"));
@ -1075,16 +1037,14 @@ void WiimotePadConfigDialog::GeneralSettingsChanged(wxCommandEvent& event)
void WiimotePadConfigDialog::UpdateGUI(int Slot) void WiimotePadConfigDialog::UpdateGUI(int Slot)
{ {
DEBUG_LOG(WIIMOTE, "UpdateGUI");
UpdateGUIButtonMapping(Page); UpdateGUIButtonMapping(Page);
DoChangeDeadZone(true); DoChangeDeadZone(false); DoChangeDeadZone(true); DoChangeDeadZone(false);
// Linux has no FindItem() // Linux has no FindItem()
// Disable all pad items if no pads are detected // Disable all pad items if no pads are detected
if (ControlsCreated) if(ControlsCreated)
{ {
bool PadEnabled = WiiMoteEmu::NumPads != 0; bool PadEnabled = WiiMoteEmu::NumGoodPads != 0;
#ifdef _WIN32 #ifdef _WIN32
for(int i = IDB_ANALOG_LEFT_X; i <= IDB_TRIGGER_R; i++) m_Notebook->FindItem(i)->Enable(PadEnabled); for(int i = IDB_ANALOG_LEFT_X; i <= IDB_TRIGGER_R; i++) m_Notebook->FindItem(i)->Enable(PadEnabled);
m_Notebook->FindItem(IDC_JOYNAME)->Enable(PadEnabled); m_Notebook->FindItem(IDC_JOYNAME)->Enable(PadEnabled);

View File

@ -59,12 +59,9 @@ class WiimotePadConfigDialog : public wxDialog
void Convert2Box(int &x); void Convert2Box(int &x);
void ConvertToString(); void ConvertToString();
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); } void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
void Update(wxTimerEvent& WXUNUSED(event));
void UpdatePad(wxTimerEvent& WXUNUSED(event)); void UpdatePad(wxTimerEvent& WXUNUSED(event));
void UpdateDeviceList();
wxTimer *m_Update, wxTimer *m_UpdatePad,
*m_UpdatePad,
*m_ButtonMappingTimer; *m_ButtonMappingTimer;
wxStaticBitmap *m_bmpDotLeftIn[4], wxStaticBitmap *m_bmpDotLeftIn[4],
@ -77,7 +74,6 @@ class WiimotePadConfigDialog : public wxDialog
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
bool ControlsCreated; bool ControlsCreated;
bool LiveUpdates;
int Page, BoxW, BoxH, g_Pressed; int Page, BoxW, BoxH, g_Pressed;
wxNotebook *m_Notebook; wxNotebook *m_Notebook;
@ -146,9 +142,7 @@ class WiimotePadConfigDialog : public wxDialog
*m_Button_GH3[GH3_CONTROLS][4], *m_Button_GH3[GH3_CONTROLS][4],
*m_bGH3_Analog[4]; *m_bGH3_Analog[4];
wxStaticText wxStaticText *m_TextScreenWidth[4], *m_TextScreenHeight[4], *m_TextScreenLeft[4], *m_TextScreenTop[4], *m_TextAR[4],
*m_pStatusBar,
*m_TextScreenWidth[4], *m_TextScreenHeight[4], *m_TextScreenLeft[4], *m_TextScreenTop[4], *m_TextAR[4],
*m_tAnalogX[8], *m_tAnalogY[8], *m_TiltTextRoll[4], *m_TiltTextPitch[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_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_TriggerStatusL[4], *m_TriggerStatusR[4], *m_TriggerStatusLx[4], *m_TriggerStatusRx[4],
@ -184,12 +178,10 @@ class WiimotePadConfigDialog : public wxDialog
{ {
ID_CLOSE = 1000, ID_CLOSE = 1000,
ID_APPLY, ID_APPLY,
IDTM_EXIT, // Timer IDTM_EXIT,
IDTM_BUTTON, IDTM_BUTTON,
IDTM_UPDATE, IDTM_UPDATE_PAD, // Timer
IDTM_UPDATE_PAD,
IDT_DEBUGGING,
ID_NOTEBOOK, ID_NOTEBOOK,
ID_CONTROLLERPAGE1, ID_CONTROLLERPAGE1,
ID_CONTROLLERPAGE2, ID_CONTROLLERPAGE2,
@ -265,9 +257,8 @@ class WiimotePadConfigDialog : public wxDialog
void SaveKeyboardMapping(int Controller, int Id, int Key); void SaveKeyboardMapping(int Controller, int Id, int Key);
void ToBlank(bool ToBlank = true); void ToBlank(bool ToBlank = true);
void PadGetStatus(); void PadGetStatus();
void UpdateID();
void DoSave(bool ChangePad = false, int Slot = -1); void DoSave(bool ChangePad = false, int Slot = -1);
void DoChangeJoystick(); void DoChangeDeadZone(bool Left); void DoChangeJoystick(); void PadOpen(int Open); void PadClose(int Close); void DoChangeDeadZone(bool Left);
void OnButtonClick(wxCommandEvent& event); void OnButtonClick(wxCommandEvent& event);
// Configure buttons // Configure buttons

View File

@ -57,14 +57,7 @@ wiimote_key g_ExtKey; // The extension encryption key
bool g_Encryption; // Encryption on or off bool g_Encryption; // Encryption on or off
// Gamepad input // Gamepad input
int NumPads = 0, NumDIDevices = -1; // Number of pads int NumPads = 0, NumGoodPads = 0; // Number of goods pads
bool SDLPolling = true;
#ifdef _WIN32
bool LiveUpdates = false;
#else
bool LiveUpdates = false;
#endif
std::vector<InputCommon::CONTROLLER_INFO> joyinfo; std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
InputCommon::CONTROLLER_STATE_NEW PadState[4]; InputCommon::CONTROLLER_STATE_NEW PadState[4];
InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4]; InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];

View File

@ -182,9 +182,7 @@ static const u8 partially_id[] =
}; };
// Gamepad input // Gamepad input
extern int NumPads, NumDIDevices; // Number of pads extern int NumPads, NumGoodPads; // Number of goods pads
extern bool SDLPolling; // Turn off polling
extern bool LiveUpdates;
extern std::vector<InputCommon::CONTROLLER_INFO> joyinfo; extern std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
extern InputCommon::CONTROLLER_STATE_NEW PadState[4]; extern InputCommon::CONTROLLER_STATE_NEW PadState[4];
extern InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4]; extern InputCommon::CONTROLLER_MAPPING_NEW PadMapping[4];

View File

@ -22,7 +22,6 @@
#include "../../../Core/InputCommon/Src/XInput.h" #include "../../../Core/InputCommon/Src/XInput.h"
#include "Common.h" // Common #include "Common.h" // Common
#include "LogManager.h"
#include "MathUtil.h" #include "MathUtil.h"
#include "StringUtil.h" // for ArrayToString() #include "StringUtil.h" // for ArrayToString()
#include "IniFile.h" #include "IniFile.h"
@ -60,8 +59,7 @@ void TiltTest(u8 x, u8 y, u8 z)
std::string To = StringFromFormat("%s\nTo: X:%i Y:%i Z:%i Roll:%s Pitch:%s", From.c_str(), x, y, z, std::string To = StringFromFormat("%s\nTo: X:%i Y:%i Z:%i Roll:%s Pitch:%s", From.c_str(), x, y, z,
(_Roll >= 0) ? StringFromFormat(" %03i", (int)_Roll).c_str() : StringFromFormat("%04i", (int)_Roll).c_str(), (_Roll >= 0) ? StringFromFormat(" %03i", (int)_Roll).c_str() : StringFromFormat("%04i", (int)_Roll).c_str(),
(_Pitch >= 0) ? StringFromFormat(" %03i", (int)_Pitch).c_str() : StringFromFormat("%04i", (int)_Pitch).c_str()); (_Pitch >= 0) ? StringFromFormat(" %03i", (int)_Pitch).c_str() : StringFromFormat("%04i", (int)_Pitch).c_str());
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); DEBUG_LOG(WIIMOTE, "%s", To.c_str());
Console->CustomLog(StringFromFormat("\n%s", To.c_str()).c_str());
} }
@ -102,29 +100,14 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
// In these cases we can use the simple and accurate formula // In these cases we can use the simple and accurate formula
if(g_Config.Trigger.Range.Pitch == 0) if(g_Config.Trigger.Range.Pitch == 0)
{ {
if (!g_Config.Trigger.Upright) x = sin(_Roll);
{ z = cos(_Roll);
x = sin(_Roll);
z = cos(_Roll);
}
else
{
z = sin(_Roll);
y = -cos(_Roll);
}
} }
else if (g_Config.Trigger.Range.Roll == 0) else if (g_Config.Trigger.Range.Roll == 0)
{ {
if (!g_Config.Trigger.Upright)
{ y = sin(_Pitch);
y = sin(_Pitch); z = cos(_Pitch);
z = cos(_Pitch);
}
else
{
x = -sin(_Pitch);
y = -cos(_Pitch);
}
} }
else else
{ {
@ -135,28 +118,16 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
and Pitch. But if we select a Z from the smallest of the absolute and Pitch. But if we select a Z from the smallest of the absolute
value of cos(Roll) and cos (Pitch) we get the right values. */ value of cos(Roll) and cos (Pitch) we get the right values. */
// --------- // ---------
if (!g_Config.Trigger.Upright) if (abs(cos(_Roll)) < abs(cos(_Pitch))) z = cos(_Roll); else z = cos(_Pitch);
{ /* I got these from reversing the calculation in
if (abs(cos(_Roll)) < abs(cos(_Pitch))) z = cos(_Roll); else z = cos(_Pitch); PitchAccelerometerToDegree() in a math program I don't know if we
/* I got these from reversing the calculation in can derive these from some kind of matrix or something */
PitchAccelerometerToDegree() in a math program. */ float x_num = 2 * tanf(0.5f * _Roll) * z;
float x_num = 2 * tanf(0.5f * _Roll) * z; float x_den = pow2f(tanf(0.5f * _Roll)) - 1;
float x_den = pow2f(tanf(0.5f * _Roll)) - 1; x = - (x_num / x_den);
x = - (x_num / x_den); float y_num = 2 * tanf(0.5f * _Pitch) * z;
float y_num = 2 * tanf(0.5f * _Pitch) * z; float y_den = pow2f(tanf(0.5f * _Pitch)) - 1;
float y_den = pow2f(tanf(0.5f * _Pitch)) - 1; y = - (y_num / y_den);
y = - (y_num / y_den);
}
else
{
if (abs(-cos(_Roll)) < abs(-cos(_Pitch))) y = -cos(_Roll); else y = -cos(_Pitch);
float z_num = 2 * tanf(0.5f * _Roll) * y;
float z_den = pow2f(tanf(0.5f * _Roll)) - 1;
z = (z_num / z_den);
float x_num = 2 * tanf(0.5f * _Pitch) * y;
float x_den = pow2f(tanf(0.5f * _Pitch)) - 1;
x = - (x_num / x_den);
}
} }
// Multiply with the neutral of z and its g // Multiply with the neutral of z and its g
@ -174,18 +145,9 @@ void PitchDegreeToAccelerometer(float _Roll, float _Pitch, u8 &_x, u8 &_y, u8 &_
if (ix < 0) ix = 0; if (ix > 255) ix = 255; if (ix < 0) ix = 0; if (ix > 255) ix = 255;
if (iy < 0) iy = 0; if (iy > 255) iy = 255; if (iy < 0) iy = 0; if (iy > 255) iy = 255;
if (iz < 0) iz = 0; if (iz > 255) iz = 255; if (iz < 0) iz = 0; if (iz > 255) iz = 255;
if (!g_Config.Trigger.Upright) if(g_Config.Trigger.Range.Roll != 0) _x = ix;
{ if(g_Config.Trigger.Range.Pitch != 0) _y = iy;
if(g_Config.Trigger.Range.Roll != 0) _x = ix; _z = iz;
if(g_Config.Trigger.Range.Pitch != 0) _y = iy;
_z = iz;
}
else
{
if(g_Config.Trigger.Range.Roll != 0) _z = iz;
if(g_Config.Trigger.Range.Pitch != 0) _x = ix;
_y = iy;
}
} }
// Accelerometer to roll and pitch angles // Accelerometer to roll and pitch angles
@ -205,34 +167,17 @@ void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, in
float y = AccelerometerToG((float)_y, (float)g_wm.cal_zero.y, (float)g_wm.cal_g.y); float y = AccelerometerToG((float)_y, (float)g_wm.cal_zero.y, (float)g_wm.cal_g.y);
float z = AccelerometerToG((float)_z, (float)g_wm.cal_zero.z, (float)g_wm.cal_g.z); float z = AccelerometerToG((float)_z, (float)g_wm.cal_zero.z, (float)g_wm.cal_g.z);
if (!g_Config.Trigger.Upright) // If it is over 1g then it is probably accelerating and may not reliable
//if (abs(accel->x - ac->cal_zero.x) <= ac->cal_g.x)
{ {
// If it is over 1g then it is probably accelerating and may not reliable // Calculate the degree
//if (abs(accel->x - ac->cal_zero.x) <= ac->cal_g.x) Roll = InputCommon::Rad2Deg(atan2(x, z));
{
// Calculate the degree
Roll = InputCommon::Rad2Deg(atan2(x, z));
}
//if (abs(_y - g_wm.cal_zero.y) <= g_wm.cal_g.y)
{
// Calculate the degree
Pitch = InputCommon::Rad2Deg(atan2(y, z));
}
} }
else
{
//if (abs(accel->z - ac->cal_zero.z) <= ac->cal_g.x)
{
// Calculate the degree
Roll = InputCommon::Rad2Deg(atan2(z, -y));
}
//if (abs(_x - g_wm.cal_zero.x) <= g_wm.cal_g.x) //if (abs(_y - g_wm.cal_zero.y) <= g_wm.cal_g.y)
{ {
// Calculate the degree // Calculate the degree
Pitch = InputCommon::Rad2Deg(atan2(-x, -y)); Pitch = InputCommon::Rad2Deg(atan2(y, z));
}
} }
_Roll = (int)Roll; _Roll = (int)Roll;
@ -242,16 +187,9 @@ void PitchAccelerometerToDegree(u8 _x, u8 _y, u8 _z, int &_Roll, int &_Pitch, in
if (x < -1.0) x = -1.0; else if (x > 1.0) x = 1.0; if (x < -1.0) x = -1.0; else if (x > 1.0) x = 1.0;
if (y < -1.0) y = -1.0; else if (y > 1.0) y = 1.0; if (y < -1.0) y = -1.0; else if (y > 1.0) y = 1.0;
if (z < -1.0) z = -1.0; else if (z > 1.0) z = 1.0; if (z < -1.0) z = -1.0; else if (z > 1.0) z = 1.0;
if (!g_Config.Trigger.Upright) Roll = InputCommon::Rad2Deg(atan2(x, z));
{ Pitch = InputCommon::Rad2Deg(atan2(y, z));
Roll = InputCommon::Rad2Deg(atan2(x, z));
Pitch = InputCommon::Rad2Deg(atan2(y, z));
}
else
{
Roll = InputCommon::Rad2Deg(atan2(z, -y));
Pitch = InputCommon::Rad2Deg(atan2(-x, -y));
}
_RollAdj = (int)Roll; _RollAdj = (int)Roll;
_PitchAdj = (int)Pitch; _PitchAdj = (int)Pitch;
} }

View File

@ -34,11 +34,6 @@
#include "Encryption.h" // for extension encryption #include "Encryption.h" // for extension encryption
#include "Config.h" // for g_Config #include "Config.h" // for g_Config
#if defined(HAVE_WX) && HAVE_WX
#include "ConfigPadDlg.h"
extern WiimotePadConfigDialog *m_PadConfigFrame;
#endif
extern SWiimoteInitialize g_WiimoteInitialize; extern SWiimoteInitialize g_WiimoteInitialize;
namespace WiiMoteEmu namespace WiiMoteEmu
@ -443,12 +438,10 @@ void Initialize()
/* Populate joyinfo for all attached devices and do g_Config.Load() if the /* Populate joyinfo for all attached devices and do g_Config.Load() if the
configuration window is not already open, if it's already open we configuration window is not already open, if it's already open we
continue with the settings we have */ continue with the settings we have */
#if defined(HAVE_WX) && HAVE_WX if(!g_FrameOpen)
if (!m_PadConfigFrame)
{ {
LocalSearchDevices(joyinfo, NumPads); Search_Devices(joyinfo, NumPads, NumGoodPads);
} }
#endif
// Copy extension id and calibration to its register, g_Config.Load() is needed before this // Copy extension id and calibration to its register, g_Config.Load() is needed before this
UpdateExtRegisterBlocks(); UpdateExtRegisterBlocks();
@ -493,6 +486,7 @@ void DoState(PointerWrap &p)
p.Do(g_Encryption); p.Do(g_Encryption);
p.Do(NumPads); p.Do(NumPads);
p.Do(NumGoodPads);
p.Do(joyinfo); p.Do(joyinfo);
p.DoArray(PadState, 4); p.DoArray(PadState, 4);
p.DoArray(PadMapping, 4); p.DoArray(PadMapping, 4);
@ -515,16 +509,20 @@ void Shutdown(void)
for (int i = 0; i < 1; i++) for (int i = 0; i < 1; i++)
{ {
if (PadMapping[i].enabled && joyinfo.size() > (u32)PadMapping[i].ID) if (PadMapping[i].enabled && joyinfo.size() > (u32)PadMapping[i].ID)
INFO_LOG(WIIMOTE, "ShutDown: %i", PadState[i].joy); if (joyinfo.at(PadMapping[i].ID).Good)
/* SDL_JoystickClose() crashes for some reason so I avoid this {
for now, SDL_Quit() should close the pads to I think */ INFO_LOG(WIIMOTE, "ShutDown: %i", PadState[i].joy);
//if(SDL_JoystickOpened(PadMapping[i].ID)) SDL_JoystickClose(PadState[i].joy); /* SDL_JoystickClose() crashes for some reason so I avoid this
//PadState[i].joy = NULL; for now, SDL_Quit() should close the pads to I think */
//if(SDL_JoystickOpened(PadMapping[i].ID)) SDL_JoystickClose(PadState[i].joy);
//PadState[i].joy = NULL;
}
} }
// Clear the physical device info // Clear the physical device info
joyinfo.clear(); joyinfo.clear();
NumPads = 0; NumPads = 0;
NumGoodPads = 0;
// Finally close SDL // Finally close SDL
if (SDL_WasInit(0)) SDL_Quit(); if (SDL_WasInit(0)) SDL_Quit();
@ -695,8 +693,21 @@ void ControlChannel(u16 _channelID, const void* _pData, u32 _Size)
of times per second. */ of times per second. */
void Update() void Update()
{ {
readKeyboard();
//LOG(WIIMOTE, "Wiimote_Update");
//INFO_LOG(WIIMOTE, "Emu Update: %i", g_ReportingMode); //INFO_LOG(WIIMOTE, "Emu Update: %i", g_ReportingMode);
// Check if the pad state should be updated
if ((g_Config.Trigger.Type == g_Config.Trigger.TRIGGER || g_Config.Trigger.Type == g_Config.Trigger.ANALOG1 || g_Config.Trigger.Type == g_Config.Trigger.ANALOG2
|| g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG1 || g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG2
|| g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG2
|| g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG2)
&& NumGoodPads > 0 && joyinfo.size() > (u32)PadMapping[0].ID)
{
const int Page = 0;
WiiMoteEmu::GetJoyState(PadState[Page], PadMapping[Page], Page, joyinfo[PadMapping[Page].ID].NumButtons);
}
switch(g_ReportingMode) switch(g_ReportingMode)
{ {
case 0: case 0:
@ -710,22 +721,9 @@ void Update()
// Potentially send a delayed acknowledgement to an InterruptChannel() Output // Potentially send a delayed acknowledgement to an InterruptChannel() Output
CheckAckDelay(); CheckAckDelay();
ReadKeyboard();
// Check if the pad state should be updated
if ((g_Config.Trigger.Type == g_Config.Trigger.TRIGGER || g_Config.Trigger.Type == g_Config.Trigger.ANALOG1 || g_Config.Trigger.Type == g_Config.Trigger.ANALOG2
|| g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG1 || g_Config.Nunchuck.Type == g_Config.Nunchuck.ANALOG2
|| g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.LType == g_Config.ClassicController.ANALOG2
|| g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG1 || g_Config.ClassicController.RType == g_Config.ClassicController.ANALOG2)
&& NumPads > 0 && joyinfo.size() > (u32)PadMapping[0].ID)
{
const int Page = 0;
WiiMoteEmu::GetJoyState(PadState[Page], PadMapping[Page], Page);
}
} }
void ReadKeyboard() void readKeyboard()
{ {
#if defined(HAVE_X11) && HAVE_X11 #if defined(HAVE_X11) && HAVE_X11
XEvent E; XEvent E;

View File

@ -41,7 +41,7 @@ void Shutdown(void);
void InterruptChannel(u16 _channelID, const void* _pData, u32 _Size); void InterruptChannel(u16 _channelID, const void* _pData, u32 _Size);
void ControlChannel(u16 _channelID, const void* _pData, u32 _Size) ; void ControlChannel(u16 _channelID, const void* _pData, u32 _Size) ;
void Update(); void Update();
void ReadKeyboard(); void readKeyboard();
// Recordings // Recordings
void LoadRecordedMovements(); void LoadRecordedMovements();
@ -52,14 +52,8 @@ void UpdateEeprom();
void UpdateExtRegisterBlocks(); void UpdateExtRegisterBlocks();
// Gamepad // Gamepad
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads); bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads);
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads); void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller, int NumButtons);
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
bool IsConnected(std::string Name);
bool IsPolling();
void EnablePolling(bool Enable);
std::string IDToName(int ID);
void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller);
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr); void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr);
// Accelerometer // Accelerometer

View File

@ -23,7 +23,6 @@
#include "../../../Core/InputCommon/Src/XInput.h" #include "../../../Core/InputCommon/Src/XInput.h"
#include "Common.h" // Common #include "Common.h" // Common
#include "LogManager.h"
#include "StringUtil.h" // for ArrayToString() #include "StringUtil.h" // for ArrayToString()
#include "IniFile.h" #include "IniFile.h"
#include "pluginspecs_wiimote.h" #include "pluginspecs_wiimote.h"
@ -36,125 +35,37 @@
#include "Encryption.h" // for extension encryption #include "Encryption.h" // for extension encryption
#include "Config.h" // for g_Config #include "Config.h" // for g_Config
#if defined(HAVE_WX) && HAVE_WX
#include "ConfigPadDlg.h"
extern WiimotePadConfigDialog *m_PadConfigFrame;
#endif
extern SWiimoteInitialize g_WiimoteInitialize; extern SWiimoteInitialize g_WiimoteInitialize;
namespace WiiMoteEmu namespace WiiMoteEmu
{ {
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
{
//DEBUG_LOG(PAD, "LocalSearchDevices");
bool bSuccess = InputCommon::SearchDevices(_joyinfo, _NumPads);
DoLocalSearchDevices(_joyinfo, _NumPads);
return bSuccess;
}
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
{
DEBUG_LOG(CONSOLE, "LocalSearchDevicesReset");
// Turn off device polling while resetting
EnablePolling(false);
bool bSuccess = InputCommon::SearchDevicesReset(_joyinfo, _NumPads);
DoLocalSearchDevices(_joyinfo, _NumPads);
EnablePolling(true);
return true;
}
// Fill joyinfo with the current connected devices // Fill joyinfo with the current connected devices
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads) bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
{ {
//DEBUG_LOG(WIIMOTE, "LocalSearchDevices"); bool WasGotten = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
// Warn the user if no gamepads are detected // Warn the user if no gamepads are detected
if (_NumPads == 0 && g_EmulatorRunning) if (_NumGoodPads == 0 && g_EmulatorRunning)
{ {
//PanicAlert("Wiimote: No Gamepad Detected"); //PanicAlert("nJoy: No Gamepad Detected");
//return false; //return false;
} }
// Load the first time // Load PadMapping[] etc
if (!g_Config.Loaded) g_Config.Load(); g_Config.Load();
// Update the PadState[].joy handle // Update the PadState[].joy handle
// If the saved ID matches, select this device for this slot for (int i = 0; i < 1; i++)
bool Match = false;
for (int i = 0; i < MAX_WIIMOTES; i++)
{
for (int j = 0; j < joyinfo.size(); j++)
{
if (joyinfo.at(j).Name == PadMapping[i].Name)
{
PadState[i].joy = joyinfo.at(j).joy;
Match = true;
//INFO_LOG(WIIMOTE, "Slot %i: '%s' %06i", i, joyinfo.at(j).Name.c_str(), PadState[i].joy);
}
}
if (!Match) PadState[i].joy = NULL;
}
return true;
}
// Is the device connected?
// ----------------
bool IsConnected(std::string Name)
{
for (int i = 0; i < joyinfo.size(); i++)
{ {
DEBUG_LOG(WIIMOTE, "Pad %i: IsConnected checking '%s' against '%s'", i, joyinfo.at(i).Name.c_str(), Name.c_str()); if (PadMapping[i].enabled && joyinfo.size() > (u32)PadMapping[i].ID)
if (joyinfo.at(i).Name == Name) if(joyinfo.at(PadMapping[i].ID).Good)
return true; PadState[i].joy = SDL_JoystickOpen(PadMapping[i].ID);
} }
}
// See description of the equivalent functions in nJoy.cpp...
// ----------------
bool IsPolling()
{
if (!SDLPolling || SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE)
return false;
else
return true;
}
void EnablePolling(bool Enable)
{
if (Enable)
{
SDLPolling = true;
SDL_JoystickEventState(SDL_IGNORE);
}
else
{
SDLPolling = false;
SDL_JoystickEventState(SDL_ENABLE);
}
}
return WasGotten;
// ID to Name
// ----------------
std::string IDToName(int ID)
{
for (int i = 0; i < joyinfo.size(); i++)
{
//DEBUG_LOG(WIIMOTE, "IDToName: ID %i id %i %s", ID, i, joyinfo.at(i).Name.c_str());
if (joyinfo.at(i).ID == ID)
return joyinfo.at(i).Name;
}
return "";
} }
// Return adjusted input values // Return adjusted input values
void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr) void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr)
{ {
@ -208,20 +119,11 @@ void PadStateAdjustments(int &Lx, int &Ly, int &Rx, int &Ry, int &Tl, int &Tr)
Function: Updates the PadState struct with the current pad status. The input Function: Updates the PadState struct with the current pad status. The input
value "controller" is for a virtual controller 0 to 3. */ value "controller" is for a virtual controller 0 to 3. */
void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller) void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONTROLLER_MAPPING_NEW _PadMapping, int controller, int NumButtons)
{ {
//DEBUG_LOG(WIIMOTE, "GetJoyState: Polling:%i NumPads:%i", SDLPolling, NumPads);
// Return if polling is off
if (!IsPolling()) return;
// Update joyinfo handles. This is in case the Wiimote plugin has restarted SDL after a pad was conencted/disconnected
// so that the handles are updated. We don't need to run this this often. Once a second would be enough.
if (LiveUpdates) LocalSearchDevices(joyinfo, NumPads);
// Return if we have no pads // Return if we have no pads
if (NumPads == 0) return; if (NumGoodPads == 0) return;
// Read info
int NumButtons = SDL_JoystickNumButtons(_PadState.joy);
// Update the gamepad status // Update the gamepad status
SDL_JoystickUpdate(); SDL_JoystickUpdate();
@ -250,13 +152,14 @@ void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONT
} }
#endif #endif
/* Debugging /* Debugging
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); // Console::ClearScreen();
Console->ClearScreen(); DEBUG_LOG(CONSOLE,
Console->CustomLog(StringFromFormat( "Controller and handle: %i %i\n"
"Controller: %i Handle: %i\n"
"Triggers: %i %i %i %i %i\n" "Triggers:%i %i %i %i %i\n"
"Analog: %06i %06i \n",
"Analog:%06i %06i \n",
controller, (int)_PadState.joy, controller, (int)_PadState.joy,
@ -265,8 +168,7 @@ void GetJoyState(InputCommon::CONTROLLER_STATE_NEW &_PadState, InputCommon::CONT
_PadState.Axis.Tl, _PadState.Axis.Tr, _PadState.Axis.Tl, _PadState.Axis.Tr,
_PadState.Axis.Lx, _PadState.Axis.Ly _PadState.Axis.Lx, _PadState.Axis.Ly
).c_str()); );*/
*/
} }

View File

@ -21,7 +21,6 @@
#include <string> #include <string>
#include "Common.h" // Common #include "Common.h" // Common
#include "LogManager.h"
#include "Timer.h" #include "Timer.h"
#include "pluginspecs_wiimote.h" #include "pluginspecs_wiimote.h"
#include "StringUtil.h" // For ArrayToString #include "StringUtil.h" // For ArrayToString
@ -441,7 +440,7 @@ void SingleShake(u8 &_y, u8 &_z, int i)
void TiltWiimoteGamepad(float &Roll, float &Pitch) void TiltWiimoteGamepad(float &Roll, float &Pitch)
{ {
// Return if we have no pads // Return if we have no pads
if (NumPads == 0) return; if (NumGoodPads == 0) return;
// This has to be changed if multiple Wiimotes are to be supported later // This has to be changed if multiple Wiimotes are to be supported later
const int Page = 0; const int Page = 0;

View File

@ -420,13 +420,11 @@ bool IsFocus()
HWND Parent = GetParent(RenderingWindow); HWND Parent = GetParent(RenderingWindow);
HWND TopLevel = GetParent(Parent); HWND TopLevel = GetParent(Parent);
// Allow updates when the config window is in focus to // Allow updates when the config window is in focus to
HWND Config = NULL, ConfigPad = NULL, ConfigRecording = NULL; HWND Config = NULL;
if (m_BasicConfigFrame) Config = (HWND)m_BasicConfigFrame->GetHWND(); if (m_BasicConfigFrame)
if (m_PadConfigFrame) ConfigPad = (HWND)m_PadConfigFrame->GetHWND(); Config = (HWND)m_BasicConfigFrame->GetHWND();
if (m_RecordingConfigFrame) ConfigRecording = (HWND)m_RecordingConfigFrame->GetHWND();
// Support both rendering to main window and not // Support both rendering to main window and not
if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config if (GetForegroundWindow() == TopLevel || GetForegroundWindow() == RenderingWindow || GetForegroundWindow() == Config)
|| GetForegroundWindow() == ConfigPad || GetForegroundWindow() == ConfigRecording)
return true; return true;
else else
return false; return false;
@ -759,14 +757,12 @@ void ReadDebugging(bool Emu, const void* _pData, int Size)
// --------------------------------------------- // ---------------------------------------------
// Test the angles to x, y, z values formula by calculating the values back and forth // Test the angles to x, y, z values formula by calculating the values back and forth
// ----------- // -----------
/**/ /* //Console::ClearScreen();
ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener();
Console->ClearScreen();
// Show a test of our calculations // Show a test of our calculations
WiiMoteEmu::TiltTest(data[4], data[5], data[6]); WiiMoteEmu::TiltTest(data[4], data[5], data[6]);
//u8 x, y, z; u8 x, y, z;
//WiiMoteEmu::Tilt(x, y, z); WiiMoteEmu::Tilt(x, y, z);
//WiiMoteEmu::TiltTest(x, y, z); WiiMoteEmu::TiltTest(x, y, z);*/
// ------------------------- // -------------------------
// --------------------------------------------- // ---------------------------------------------

View File

@ -35,7 +35,7 @@ int GetUpdateRate();
void InterruptDebugging(bool Emu, const void* _pData); void InterruptDebugging(bool Emu, const void* _pData);
void ReadDebugging(bool Emu, const void* _pData, int Size); void ReadDebugging(bool Emu, const void* _pData, int Size);
bool IsFocus(); bool IsFocus();
#define MAX_WIIMOTES 1
// Movement recording // Movement recording
#define RECORDING_ROWS 15 #define RECORDING_ROWS 15

View File

@ -26,6 +26,8 @@
namespace WiiMoteReal namespace WiiMoteReal
{ {
#define MAX_WIIMOTES 1
int Initialize(); int Initialize();
void DoState(PointerWrap &p); void DoState(PointerWrap &p);
void Shutdown(void); void Shutdown(void);

View File

@ -68,7 +68,7 @@
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib" AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)D.dll" OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)D.dll"
LinkIncremental="2" LinkIncremental="2"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName)&quot;;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32" AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -149,7 +149,7 @@
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib" AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28ud.lib wxmsw28ud_core.lib"
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)D.dll" OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)D.dll"
LinkIncremental="2" LinkIncremental="2"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)&quot;;..\..\..\Externals\wxWidgets\lib\vc_lib\x64" AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -228,7 +228,7 @@
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName).dll" OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName).dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(ConfigurationName)&quot;;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32" AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -309,7 +309,7 @@
AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib comctl32.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName).dll" OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName).dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\$(ConfigurationName)&quot;;..\..\..\Externals\wxWidgets\lib\vc_lib\x64" AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -390,7 +390,7 @@
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)DF.dll" OutputFile="..\..\..\Binary\Win32\Plugins\$(ProjectName)DF.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\Externals\SDL\VisualC\SDL\Debug;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32" AdditionalLibraryDirectories="..\..\..\Externals\SDL\win32;..\..\..\Externals\wxWidgets\lib\vc_lib\Win32"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"
@ -471,7 +471,7 @@
AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib" AdditionalDependencies="SDL.lib comctl32.lib rpcrt4.lib xinput.lib winmm.lib wxbase28u.lib wxmsw28u_core.lib"
OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)DF.dll" OutputFile="..\..\..\Binary\x64\Plugins\$(ProjectName)DF.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;..\..\..\Externals\SDL\VisualC\SDL\$(PlatformName)\Debug&quot;;..\..\..\Externals\wxWidgets\lib\vc_lib\x64" AdditionalLibraryDirectories="..\..\..\Externals\SDL\x64;..\..\..\Externals\wxWidgets\lib\vc_lib\x64"
GenerateManifest="false" GenerateManifest="false"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb" ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\$(TargetName).pdb"

View File

@ -46,7 +46,6 @@ Config::Config()
{ {
// Clear the memory // Clear the memory
//memset(this, 0, sizeof(Config)); //memset(this, 0, sizeof(Config));
Loaded = false;
} }
@ -96,7 +95,7 @@ void DEBUG_QUIT()
void Config::Save(int Slot) void Config::Save(int Slot)
{ {
// If there are no good pads don't save // If there are no good pads don't save
if (NumPads == 0) return; if (NumGoodPads == 0) return;
// Load ini file // Load ini file
IniFile file; IniFile file;
@ -128,27 +127,22 @@ void Config::Save(int Slot)
// Save the physical device ID // Save the physical device ID
file.Set(SectionName.c_str(), "joy_id", PadMapping[i].ID); file.Set(SectionName.c_str(), "joy_id", PadMapping[i].ID);
file.Set(SectionName.c_str(), "joy_name", PadMapping[i].Name);
// =================== // ===================
// ================================================================== // ==================================================================
// Joypad or slot specific settings // Joypad or slot specific settings
// ----------------- // -----------------
// Current joypad device ID: PadMapping[i].ID // Current joypad device ID: PadMapping[i].ID
// Current joypad name: IDToName(PadMapping[i].ID]) // Current joypad name: joyinfo[PadMapping[i].ID].Name
if(g_Config.bSaveByID) if(g_Config.bSaveByID)
{ {
/* Save joypad specific settings. Check for "PadMapping[i].ID < SDL_NumJoysticks()" to
avoid reading a joyinfo that does't exist */
if((u32)PadMapping[i].ID >= joyinfo.size()) continue;
// Create a new section name after the joypad name // Create a new section name after the joypad name
SectionName = IDToName(PadMapping[i].ID); SectionName = joyinfo[PadMapping[i].ID].Name;
// Don't save a blank name
if (SectionName == "")
{
ERROR_LOG(PAD, "ID %i has no name, will not save", PadMapping[i].ID);
continue;
}
} }
NOTICE_LOG(PAD, "Save settings for ID %i '%s' from PadMapping[%i]", PadMapping[i].ID, SectionName.c_str(), i);
file.Set(SectionName.c_str(), "l_shoulder", PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER]); file.Set(SectionName.c_str(), "l_shoulder", PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER]);
file.Set(SectionName.c_str(), "r_shoulder", PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER]); file.Set(SectionName.c_str(), "r_shoulder", PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER]);
@ -186,6 +180,8 @@ void Config::Save(int Slot)
file.Set(SectionName.c_str(), "SquareToCircleC", PadMapping[i].bSquareToCircleC); file.Set(SectionName.c_str(), "SquareToCircleC", PadMapping[i].bSquareToCircleC);
} }
INFO_LOG(CONSOLE, "%i: Save: %i\n", 0, PadMapping[0].halfpress);
file.Save(FULL_CONFIG_DIR "nJoy.ini"); file.Save(FULL_CONFIG_DIR "nJoy.ini");
} }
@ -193,7 +189,8 @@ void Config::Save(int Slot)
// ----------------------- // -----------------------
void Config::Load(bool ChangePad, bool ChangeSaveByID) void Config::Load(bool ChangePad, bool ChangeSaveByID)
{ {
Loaded = true; // If there are no good pads don't load
if (NumGoodPads == 0) return;
// Load file // Load file
IniFile file; IniFile file;
@ -214,9 +211,6 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
} }
// ============= // =============
// If there are no good pads don't load anymore
if (NumPads == 0) return;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
std::string SectionName = StringFromFormat("PAD%i", i+1); std::string SectionName = StringFromFormat("PAD%i", i+1);
@ -225,32 +219,23 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
if (!ChangePad) if (!ChangePad)
{ {
file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0); file.Get(SectionName.c_str(), "joy_id", &PadMapping[i].ID, 0);
file.Get(SectionName.c_str(), "joy_name", &PadMapping[i].Name, "");
} }
// ================================================================== // ==================================================================
// Joypad or slot specific settings // Joypad or slot specific settings
// ----------------- // -----------------
// Current joypad device ID: PadMapping[i].ID // Current joypad device ID: PadMapping[i].ID
// Current joypad name: IDToName(PadMapping[i].ID) // Current joypad name: joyinfo[PadMapping[i].ID].Name
if (g_Config.bSaveByID) if(g_Config.bSaveByID)
{ {
// Prevent a crash from illegal access to joyinfo that will only have values for
// the current amount of connected pads
if((u32)PadMapping[i].ID >= joyinfo.size()) continue;
// Create a section name // Create a section name
SectionName = PadMapping[i].Name; SectionName = joyinfo[PadMapping[i].ID].Name;
// Don't load settings for a non-connected device
if (!IsConnected(SectionName))
{
ERROR_LOG(PAD, "Slot %i: The device '%s' is not connected, will not load settings", SectionName.c_str());
continue;
}
// Don't load a blank ID
if (SectionName == "")
{
ERROR_LOG(PAD, "Slot %i has no device name, will not load settings", i);
continue;
}
} }
file.Get(SectionName.c_str(), "l_shoulder", &PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER], 4); file.Get(SectionName.c_str(), "l_shoulder", &PadMapping[i].buttons[InputCommon::CTL_L_SHOULDER], 4);
file.Get(SectionName.c_str(), "r_shoulder", &PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER], 5); file.Get(SectionName.c_str(), "r_shoulder", &PadMapping[i].buttons[InputCommon::CTL_R_SHOULDER], 5);
file.Get(SectionName.c_str(), "a_button", &PadMapping[i].buttons[InputCommon::CTL_A_BUTTON], 0); file.Get(SectionName.c_str(), "a_button", &PadMapping[i].buttons[InputCommon::CTL_A_BUTTON], 0);
@ -284,11 +269,8 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
file.Get(SectionName.c_str(), "RadiusOnOffC", &Tmp, false); PadMapping[i].bRadiusOnOffC = Tmp; file.Get(SectionName.c_str(), "RadiusOnOffC", &Tmp, false); PadMapping[i].bRadiusOnOffC = Tmp;
file.Get(SectionName.c_str(), "DiagonalC", &PadMapping[i].SDiagonalC, "100%"); file.Get(SectionName.c_str(), "DiagonalC", &PadMapping[i].SDiagonalC, "100%");
file.Get(SectionName.c_str(), "SquareToCircleC", &Tmp, false); PadMapping[i].bSquareToCircleC = Tmp; file.Get(SectionName.c_str(), "SquareToCircleC", &Tmp, false); PadMapping[i].bSquareToCircleC = Tmp;
NOTICE_LOG(PAD, "Slot %i: Load settings for ID %i '%s'", i, PadMapping[i].ID, SectionName.c_str());
} }
//INFO_LOG(PAD, "%i: Load: %i\n", 0, PadMapping[0].halfpress); INFO_LOG(CONSOLE, "%i: Load: %i\n", 0, PadMapping[0].halfpress);
} }

View File

@ -23,10 +23,9 @@ struct Config
Config(); Config();
void Load(bool ChangePad = false, bool ChangeSaveByID = false); void Load(bool ChangePad = false, bool ChangeSaveByID = false);
void Save(int Slot = -1); void Save(int Slot = -1);
bool Loaded;
int CheckForDuplicateJoypads(bool OK); int CheckForDuplicateJoypads(bool OK);
// Settings // General
bool bShowAdvanced; // Only allow one of these bool bShowAdvanced; // Only allow one of these
bool bSaveByID; bool bSaveByID;
bool bCheckFocus; bool bCheckFocus;

View File

@ -1,3 +1,4 @@
// Project description // Project description
// ------------------- // -------------------
// Name: nJoy // Name: nJoy
@ -31,15 +32,14 @@
// --------- // ---------
#include "ConfigBox.h" #include "ConfigBox.h"
#include "../nJoy.h" #include "../nJoy.h"
#include "LogManager.h"
#include "Images/controller.xpm" #include "Images/controller.xpm"
extern bool g_EmulatorRunning; extern bool g_EmulatorRunning;
// Set PAD status // Set PAD status
// -------------- // --------------
void PADConfigDialognJoy::PadShowStatus() void PADConfigDialognJoy::PadGetStatus()
{ {
// Return if it's not detected. The ID should never be less than zero here, it can only be that // Return if it's not detected. The ID should never be less than zero here, it can only be that
// because of a manual ini file change, but we make that check anway. // because of a manual ini file change, but we make that check anway.
if(PadMapping[notebookpage].ID < 0 || PadMapping[notebookpage].ID >= SDL_NumJoysticks()) if(PadMapping[notebookpage].ID < 0 || PadMapping[notebookpage].ID >= SDL_NumJoysticks())
@ -51,7 +51,7 @@ void PADConfigDialognJoy::PadShowStatus()
} }
// Get physical device status // Get physical device status
int ID = PadMapping[notebookpage].ID; int PhysicalDevice = PadMapping[notebookpage].ID;
int TriggerType = PadMapping[notebookpage].triggertype; int TriggerType = PadMapping[notebookpage].triggertype;
// Get original values // Get original values
@ -105,6 +105,7 @@ void PADConfigDialognJoy::PadShowStatus()
m_bmpDotOutC[notebookpage]->SetPosition(wxPoint(sub_x_out, sub_y_out)); m_bmpDotOutC[notebookpage]->SetPosition(wxPoint(sub_x_out, sub_y_out));
///////////////////// Analog stick ///////////////////// Analog stick
// Triggers // Triggers
// ----------------- // -----------------
@ -142,12 +143,84 @@ void PADConfigDialognJoy::PadShowStatus()
///////////////////// Triggers ///////////////////// Triggers
} }
// Update the advanced tab // Show the current pad status
// -----------------
std::string ShowStatus(int VirtualController)
{
// Save the physical device
int PhysicalDevice = PadMapping[VirtualController].ID;
// Make local shortcut
SDL_Joystick *joy = PadState[VirtualController].joy;
// Make shortcuts for all pads
SDL_Joystick *joy0 = PadState[0].joy;
SDL_Joystick *joy1 = PadState[1].joy;
SDL_Joystick *joy2 = PadState[2].joy;
SDL_Joystick *joy3 = PadState[3].joy;
// Temporary storage
std::string StrAxes, StrHats, StrBut;
int value;
// Get status
int Axes = joyinfo[PhysicalDevice].NumAxes;
int Balls = joyinfo[PhysicalDevice].NumBalls;
int Hats = joyinfo[PhysicalDevice].NumHats;
int Buttons = joyinfo[PhysicalDevice].NumButtons;
// Update the internal values
SDL_JoystickUpdate();
// Go through all axes and read out their values
for(int i = 0; i < Axes; i++)
{
value = SDL_JoystickGetAxis(joy, i);
StrAxes += StringFromFormat(" %i:%06i", i, value);
}
for(int i = 0;i < Hats; i++)
{
value = SDL_JoystickGetHat(joy, i);
StrHats += StringFromFormat(" %i:%i", i, value);
}
for(int i = 0;i < Buttons; i++)
{
value = SDL_JoystickGetButton(joy, i);
StrBut += StringFromFormat(" %i:%i", i+1, value);
}
return StringFromFormat(
"All pads:\n"
"ID: %i %i %i %i\n"
"Controllertype: %i %i %i %i\n"
"SquareToCircle: %i %i %i %i\n\n"
#ifdef _WIN32
"Handles: %i %i %i %i\n"
"XInput: %i %i %i\n"
#endif
"This pad:\n"
"Axes: %s\n"
"Hats: %s\n"
"But: %s\n"
"Device: Ax: %i Balls:%i Hats:%i But:%i",
PadMapping[0].ID, PadMapping[1].ID, PadMapping[2].ID, PadMapping[3].ID,
PadMapping[0].controllertype, PadMapping[1].controllertype, PadMapping[2].controllertype, PadMapping[3].controllertype,
PadMapping[0].bSquareToCircle, PadMapping[1].bSquareToCircle, PadMapping[2].bSquareToCircle, PadMapping[3].bSquareToCircle,
#ifdef _WIN32
joy0, joy1, joy2, joy3,
//PadState[PadMapping[0].ID].joy, PadState[PadMapping[1].ID].joy, PadState[PadMapping[2].ID].joy, PadState[PadMapping[3].ID].joy,
XInput::IsConnected(0), XInput::GetXI(0, InputCommon::XI_TRIGGER_L), XInput::GetXI(0, InputCommon::XI_TRIGGER_R),
#endif
StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(),
Axes, Balls, Hats, Buttons
);
}
// Populate the advanced tab
// ----------------- // -----------------
void PADConfigDialognJoy::Update() void PADConfigDialognJoy::Update()
{ {
if (!IsPolling()) return;
// Check that Dolphin is in focus, otherwise don't update the pad status // Check that Dolphin is in focus, otherwise don't update the pad status
/* If the emulator is running and unpaused GetJoyState() is run a little more often than needed, /* If the emulator is running and unpaused GetJoyState() is run a little more often than needed,
but I allow that since it can confuse the user if the input status in the configuration window but I allow that since it can confuse the user if the input status in the configuration window
@ -155,46 +228,17 @@ void PADConfigDialognJoy::Update()
if (g_Config.bCheckFocus || IsFocus()) // && !g_EmulatorRunning) if (g_Config.bCheckFocus || IsFocus()) // && !g_EmulatorRunning)
{ {
for (int i = 0; (u32)i < joyinfo.size(); i++) for (int i = 0; (u32)i < joyinfo.size(); i++)
InputCommon::GetJoyState(PadState[notebookpage], PadMapping[notebookpage]); InputCommon::GetJoyState(PadState[i], PadMapping[i], i, joyinfo[PadMapping[i].ID].NumButtons);
PadShowStatus();
} }
// Show the current status in a window in the wxPanel // Show the current status in a window in the wxPanel
#ifdef SHOW_PAD_STATUS #ifdef SHOW_PAD_STATUS
m_pStatusBar->SetLabel(wxString::FromAscii(InputCommon::ShowStatus( m_pStatusBar->SetLabel(wxString::Format(
notebookpage, m_Joyname[notebookpage]->GetSelection(), "%s", ShowStatus(notebookpage).c_str()
PadMapping, PadState, joyinfo ));
).c_str()));
#endif #endif
} }
// Search for devices
void PADConfigDialognJoy::UpdateSlow()
{
if (!LiveUpdates) return;
// Don't run this the first time
int OldNumDIDevices;
if (NumDIDevices == -1)
OldNumDIDevices = InputCommon::SearchDIDevices();
else
// Search for connected devices and update dialog
OldNumDIDevices = NumDIDevices;
NumDIDevices = InputCommon::SearchDIDevices();
// Update if a pad has been connected/disconnected. Todo: Add a better check that also takes into consideration the pad id
// and other things to better ensure that nothing has changed
//DEBUG_LOG(PAD, "Found %i devices", NumDIDevices);
//DEBUG_LOG(PAD, "UpdateSlow: %i %i", OldNumPads, NumPads);
if (OldNumDIDevices != NumDIDevices)
{
WARN_LOG(PAD, "\n---- %s ----", (NumDIDevices > OldNumDIDevices) ? "Pad connected" : "Pad disconnected");
LocalSearchDevicesReset(joyinfo, NumPads);
UpdateDeviceList();
// Enable controls again, if disabled
UpdateGUIAll();
}
}
// Populate the advanced tab // Populate the advanced tab
// ----------------- // -----------------
@ -324,5 +368,6 @@ wxBitmap PADConfigDialognJoy::CreateBitmapArea(int Max, int Diagonal)
Points[7].x = (int)(-Diagonal * Adj + iAdj); Points[7].y = (int)(Diagonal * Adj + iAdj); Points[7].x = (int)(-Diagonal * Adj + iAdj); Points[7].y = (int)(Diagonal * Adj + iAdj);
// Draw polygon // Draw polygon
dc.DrawPolygon(8, Points); dc.DrawPolygon(8, Points);
return bitmap; return bitmap;
} }

View File

@ -103,7 +103,6 @@ BEGIN_EVENT_TABLE(PADConfigDialognJoy,wxDialog)
EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy::GetButtons) EVT_BUTTON(IDB_ANALOG_SUB_Y, PADConfigDialognJoy::GetButtons)
#if wxUSE_TIMER #if wxUSE_TIMER
EVT_TIMER(IDTM_SLOW, PADConfigDialognJoy::OnSlowTimer)
EVT_TIMER(IDTM_CONSTANT, PADConfigDialognJoy::OnTimer) EVT_TIMER(IDTM_CONSTANT, PADConfigDialognJoy::OnTimer)
EVT_TIMER(IDTM_BUTTON, PADConfigDialognJoy::OnButtonTimer) EVT_TIMER(IDTM_BUTTON, PADConfigDialognJoy::OnButtonTimer)
#endif #endif
@ -113,34 +112,26 @@ PADConfigDialognJoy::PADConfigDialognJoy(wxWindow *parent, wxWindowID id, const
const wxPoint &position, const wxSize& size, long style) const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style) : wxDialog(parent, id, title, position, size, style)
{ {
// Initialize values // Define values
notebookpage = 0; notebookpage = 0;
g_Pressed = 0; g_Pressed = 0;
Debugging = false;
m_TCDebugging = NULL; m_TCDebugging = NULL;
ControlsCreated = false; ControlsCreated = false;
// Settings
Debugging = false;
// Create controls // Create controls
CreateGUIControls(); CreateGUIControls();
// Update GUI
UpdateGUIAll();
// Update device list
UpdateDeviceList();
#if wxUSE_TIMER #if wxUSE_TIMER
m_SlowTimer = new wxTimer(this, IDTM_SLOW);
m_ConstantTimer = new wxTimer(this, IDTM_CONSTANT); m_ConstantTimer = new wxTimer(this, IDTM_CONSTANT);
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON); m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
// Reset values // Reset values
GetButtonWaitingID = 0; GetButtonWaitingTimer = 0; GetButtonWaitingID = 0; GetButtonWaitingTimer = 0;
// Start timers // Start the constant timer
StartTimer(); int TimesPerSecond = 30;
m_ConstantTimer->Start( floor((double)(1000 / TimesPerSecond)) );
#endif #endif
// wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys // wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys
@ -157,24 +148,6 @@ PADConfigDialognJoy::~PADConfigDialognJoy()
#endif #endif
} }
void PADConfigDialognJoy::DoShow()
{
// Start timers
StartTimer();
// Show
ShowModal();
}
void PADConfigDialognJoy::StartTimer()
{
// Start the slow timer
double TimesPerSecond = 2;
m_SlowTimer->Start( floor((double)(1000.0 / TimesPerSecond)) );
// Start the constant timer
TimesPerSecond = 30;
m_ConstantTimer->Start( floor((double)(1000 / TimesPerSecond)) );
}
void PADConfigDialognJoy::OnKeyDown(wxKeyEvent& event) void PADConfigDialognJoy::OnKeyDown(wxKeyEvent& event)
{ {
g_Pressed = event.GetKeyCode(); g_Pressed = event.GetKeyCode();
@ -187,9 +160,7 @@ void PADConfigDialognJoy::OnClose(wxCloseEvent& event)
event.Skip(); event.Skip();
// Stop the timer // Stop the timer
m_SlowTimer->Stop();
m_ConstantTimer->Stop(); m_ConstantTimer->Stop();
m_ButtonMappingTimer->Stop();
// Close pads, unless we are running a game // Close pads, unless we are running a game
if (!g_EmulatorRunning) Shutdown(); if (!g_EmulatorRunning) Shutdown();
@ -285,7 +256,7 @@ void PADConfigDialognJoy::DoSave(bool ChangePad, int Slot)
g_Config.Save(Slot); g_Config.Save(Slot);
// Now we can update the ID // Now we can update the ID
UpdateID(); PadMapping[notebookpage].ID = m_Joyname[notebookpage]->GetSelection();
} }
else else
{ {
@ -297,21 +268,6 @@ void PADConfigDialognJoy::DoSave(bool ChangePad, int Slot)
// Then change it back to "" // Then change it back to ""
ToBlank(); ToBlank();
} }
void PADConfigDialognJoy::UpdateID()
{
INFO_LOG(PAD, "Slot %i: Changed PadMapping ID from %i to %i", notebookpage, PadMapping[notebookpage].ID, m_Joyname[notebookpage]->GetSelection());
PadMapping[notebookpage].ID = joyinfo.at(m_Joyname[notebookpage]->GetSelection()).ID;
PadMapping[notebookpage].Name = joyinfo.at(m_Joyname[notebookpage]->GetSelection()).Name;
// Update all handles
for(int i = 0; i < 4; i++)
{
if (PadMapping[i].Name == PadMapping[notebookpage].Name)
{
if (m_Joyname[i]->GetSelection() >= 0 && joyinfo.size() > m_Joyname[i]->GetSelection())
PadState[i].joy = joyinfo.at(m_Joyname[i]->GetSelection()).joy;
}
}
}
// On changing the SaveById option we update all pages // On changing the SaveById option we update all pages
void PADConfigDialognJoy::OnSaveById() void PADConfigDialognJoy::OnSaveById()
@ -334,52 +290,11 @@ void PADConfigDialognJoy::OnSaveById()
void PADConfigDialognJoy::DoChangeJoystick() void PADConfigDialognJoy::DoChangeJoystick()
{ {
// Before changing the pad we save potential changes to the current pad (to support SaveByID) // Before changing the pad we save potential changes to the current pad (to support SaveByID)
WARN_LOG(PAD, "\n--- DoChangeJoystick ----");
WARN_LOG(PAD, "DoSave");
DoSave(true); DoSave(true);
// Load the settings for the new ID // Load the settings for the new Id
WARN_LOG(PAD, "Load");
g_Config.Load(true); g_Config.Load(true);
// Update the GUI UpdateGUI(notebookpage); // Update the GUI
WARN_LOG(PAD, "UpdateGUI");
UpdateGUI(notebookpage);
WARN_LOG(PAD, "");
}
// Pads have been connected/disconnected
void PADConfigDialognJoy::UpdateDeviceList()
{
if (!ControlsCreated) return;
DEBUG_LOG(PAD, "UpdateDeviceList");
for (int i = 0; i < 4; i++)
{
// Save current selection
//std::string CurrentSel = m_Joyname[i]->GetValue().mb_str();
m_Joyname[i]->Clear();
// Search for devices and add them to the device list
if (joyinfo.size() > 0)
{
for (int j = 0; j < joyinfo.size(); j++)
m_Joyname[i]->Append(wxString::FromAscii(joyinfo.at(j).Name.c_str()));
// Set selection
//PanicAlert("%s", PadMapping[i].Name.c_str());
for (int j = 0; j < joyinfo.size(); j++)
{
if (joyinfo.at(j).Name == PadMapping[i].Name) m_Joyname[i]->SetSelection(j);
}
if (m_Joyname[i]->GetSelection() == -1) m_Joyname[i]->SetSelection(0);
// Load settings
DoChangeJoystick();
}
else
{
m_Joyname[i]->Append(wxString::FromAscii("<No Gamepad Detected>"));
m_Joyname[i]->SetSelection(0);
}
}
} }
// Notebook page changed // Notebook page changed
@ -388,7 +303,7 @@ void PADConfigDialognJoy::NotebookPageChanged(wxNotebookEvent& event)
// Save current settings now, don't wait for OK // Save current settings now, don't wait for OK
if (ControlsCreated && !g_Config.bSaveByID) DoSave(false, notebookpage); if (ControlsCreated && !g_Config.bSaveByID) DoSave(false, notebookpage);
// Update the global variable // Update the global variable
notebookpage = event.GetSelection(); notebookpage = event.GetSelection();
// Update GUI // Update GUI
@ -420,28 +335,28 @@ void PADConfigDialognJoy::ToBlank(bool ToBlank)
} }
// Change settings for all slots that have this pad selected // Change settings
// -----------------------
void PADConfigDialognJoy::SetButtonTextAll(int id, const char *text) void PADConfigDialognJoy::SetButtonTextAll(int id, const char *text)
{ {
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
if (IDToName(PadMapping[i].ID) == IDToName(PadMapping[notebookpage].ID)) // Safety check to avoid crash
{ if (joyinfo.size() > (u32)PadMapping[i].ID)
SetButtonText(id, text, i); if (joyinfo[PadMapping[i].ID].Name == joyinfo[PadMapping[notebookpage].ID].Name)
DEBUG_LOG(PAD, "Updated button text for slot %i", i); SetButtonText(id, text, i);
}
}; };
} }
void PADConfigDialognJoy::SaveButtonMappingAll(int Slot) void PADConfigDialognJoy::SaveButtonMappingAll(int Slot)
{ {
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
if (PadMapping[i].Name.length() > 0 && PadMapping[i].Name == PadMapping[Slot].Name) // This can occur when no gamepad is detected
SaveButtonMapping(i, false, Slot); if (joyinfo.size() > (u32)PadMapping[i].ID)
if (joyinfo[PadMapping[i].ID].Name == joyinfo[PadMapping[Slot].ID].Name)
SaveButtonMapping(i, false, Slot);
} }
} }
// -----------------------
void PADConfigDialognJoy::UpdateGUIAll(int Slot) void PADConfigDialognJoy::UpdateGUIAll(int Slot)
{ {
@ -453,8 +368,10 @@ void PADConfigDialognJoy::UpdateGUIAll(int Slot)
{ {
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
if (IDToName(PadMapping[i].ID) == IDToName(PadMapping[Slot].ID)) // Safety check to avoid crash
UpdateGUI(i); if (joyinfo.size() > (u32)PadMapping[i].ID)
if (joyinfo[PadMapping[i].ID].Name == joyinfo[PadMapping[Slot].ID].Name)
UpdateGUI(i);
} }
} }
} }
@ -521,10 +438,8 @@ void PADConfigDialognJoy::ChangeSettings( wxCommandEvent& event )
} }
// Update all slots that use this device // Update all slots that use this device
//if(g_Config.bSaveByID) if(g_Config.bSaveByID) SaveButtonMappingAll(notebookpage);
SaveButtonMappingAll(notebookpage); if(g_Config.bSaveByID) UpdateGUIAll(notebookpage);
//if(g_Config.bSaveByID)
UpdateGUIAll(notebookpage);
} }
@ -532,18 +447,12 @@ void PADConfigDialognJoy::ChangeSettings( wxCommandEvent& event )
// Called from: CreateGUIControls(), ChangeControllertype() // Called from: CreateGUIControls(), ChangeControllertype()
void PADConfigDialognJoy::UpdateGUI(int _notebookpage) void PADConfigDialognJoy::UpdateGUI(int _notebookpage)
{ {
DEBUG_LOG(PAD, "UpdateGUI for slot %i, %i pads connected", _notebookpage, NumPads);
// If there are no good pads disable the entire notebook // If there are no good pads disable the entire notebook
if (NumPads == 0) if (NumGoodPads == 0)
{ {
m_Notebook->Enable(false); m_Notebook->Enable(false);
return; return;
} }
else
{
m_Notebook->Enable(true);
}
// Update the GUI from PadMapping[] // Update the GUI from PadMapping[]
UpdateGUIButtonMapping(_notebookpage); UpdateGUIButtonMapping(_notebookpage);
@ -596,8 +505,6 @@ void PADConfigDialognJoy::UpdateGUI(int _notebookpage)
else m_CoBRadiusC[_notebookpage]->Enable(false); else m_CoBRadiusC[_notebookpage]->Enable(false);
if (PadMapping[_notebookpage].bSquareToCircleC) m_CoBDiagonalC[_notebookpage]->Enable(true); if (PadMapping[_notebookpage].bSquareToCircleC) m_CoBDiagonalC[_notebookpage]->Enable(true);
else m_CoBDiagonalC[_notebookpage]->Enable(false); else m_CoBDiagonalC[_notebookpage]->Enable(false);
DEBUG_LOG(PAD, "Main radius %s", PadMapping[_notebookpage].bRadiusOnOff ? "enabled" : "disabled");
} }
// Repaint the background // Repaint the background
@ -658,9 +565,24 @@ void PADConfigDialognJoy::CreateGUIControls()
m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize); m_Controller[3] = new wxPanel(m_Notebook, ID_CONTROLLERPAGE4, wxDefaultPosition, wxDefaultSize);
m_Notebook->AddPage(m_Controller[3], wxT("Controller 4")); m_Notebook->AddPage(m_Controller[3], wxT("Controller 4"));
// Define bitmap for EVT_PAINT // Define bitmap for EVT_PAINT
WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM); WxStaticBitmap1_BITMAP = wxBitmap(ConfigBox_WxStaticBitmap1_XPM);
// Search for devices and add them to the device list
wxArrayString arrayStringFor_Joyname; // The string array
if (NumGoodPads > 0)
{
for(int x = 0; (u32)x < joyinfo.size(); x++)
{
arrayStringFor_Joyname.Add(wxString::FromAscii(joyinfo[x].Name.c_str()));
}
}
else
{
arrayStringFor_Joyname.Add(wxString::FromAscii("<No Gamepad Detected>"));
}
// Populate the DPad type and Trigger type list // Populate the DPad type and Trigger type list
wxArrayString wxAS_DPadType; wxArrayString wxAS_DPadType;
wxAS_DPadType.Add(wxString::FromAscii(DPadType[InputCommon::CTL_DPAD_HAT])); wxAS_DPadType.Add(wxString::FromAscii(DPadType[InputCommon::CTL_DPAD_HAT]));
@ -799,9 +721,9 @@ void PADConfigDialognJoy::CreateGUIControls()
// Populate Controller sizer // Populate Controller sizer
// Groups // Groups
#ifdef _WIN32 #ifdef _WIN32
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(476, 21), 0, NULL, wxCB_READONLY); m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, arrayStringFor_Joyname[0], wxDefaultPosition, wxSize(476, 21), arrayStringFor_Joyname, wxCB_READONLY);
#else #else
m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, wxEmptyString, wxDefaultPosition, wxSize(450, 25), 0, NULL, wxCB_READONLY); m_Joyname[i] = new wxComboBox(m_Controller[i], IDC_JOYNAME, arrayStringFor_Joyname[0], wxDefaultPosition, wxSize(450, 25), arrayStringFor_Joyname, 0, wxDefaultValidator, wxT("m_Joyname"));
#endif #endif
m_gJoyname[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Controller")); m_gJoyname[i] = new wxStaticBoxSizer (wxHORIZONTAL, m_Controller[i], wxT("Controller"));
@ -1032,6 +954,9 @@ void PADConfigDialognJoy::CreateGUIControls()
// Show or hide it. We have to do this after we add it to its sizer // Show or hide it. We have to do this after we add it to its sizer
m_sMainRight[i]->Show(g_Config.bShowAdvanced); m_sMainRight[i]->Show(g_Config.bShowAdvanced);
// Update GUI
UpdateGUI(i);
} // end of loop } // end of loop
// Populate buttons sizer. // Populate buttons sizer.
@ -1050,7 +975,7 @@ void PADConfigDialognJoy::CreateGUIControls()
// Debugging // Debugging
#ifdef SHOW_PAD_STATUS #ifdef SHOW_PAD_STATUS
m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(135, 100), wxSize(200, -1)); m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(135, 100), wxDefaultSize);
#endif #endif
// Set window size // Set window size

View File

@ -62,17 +62,12 @@ class PADConfigDialognJoy : public wxDialog
long style = wxDEFAULT_DIALOG_STYLE); long style = wxDEFAULT_DIALOG_STYLE);
virtual ~PADConfigDialognJoy(); virtual ~PADConfigDialognJoy();
// Timers
#if wxUSE_TIMER #if wxUSE_TIMER
void OnSlowTimer(wxTimerEvent& WXUNUSED(event)) { UpdateSlow(); }
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); } void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }
void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); } void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
wxTimer *m_SlowTimer, *m_ConstantTimer, *m_ButtonMappingTimer; wxTimer *m_ConstantTimer, *m_ButtonMappingTimer;
#endif #endif
// Functions
void DoShow();
// Debugging // Debugging
wxStaticText* m_pStatusBar, * m_pStatusBar2; wxStaticText* m_pStatusBar, * m_pStatusBar2;
wxTextCtrl* m_TCDebugging; wxTextCtrl* m_TCDebugging;
@ -200,10 +195,7 @@ class PADConfigDialognJoy : public wxDialog
*m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4], *m_bmpAreaOut[4], *m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4], *m_bmpAreaOut[4],
*m_bmpSquareC[4], *m_bmpDotC[4], *m_bmpSquareOutC[4], *m_bmpDotOutC[4], *m_bmpAreaOutC[4]; *m_bmpSquareC[4], *m_bmpDotC[4], *m_bmpSquareOutC[4], *m_bmpDotOutC[4], *m_bmpAreaOutC[4];
// Settings int notebookpage; bool ControlsCreated;
int notebookpage;
bool ControlsCreated;
bool LiveUpdates;
private: private:
enum enum
@ -241,7 +233,7 @@ class PADConfigDialognJoy : public wxDialog
IDT_TRIGGERS, IDCB_CHECKFOCUS, IDCB_FILTER_SETTINGS, IDT_TRIGGERS, IDCB_CHECKFOCUS, IDCB_FILTER_SETTINGS,
// Timers // Timers
IDTM_SLOW, IDTM_CONSTANT, IDTM_BUTTON, IDTM_CONSTANT, IDTM_BUTTON,
// ============================================== // ==============================================
@ -324,8 +316,6 @@ class PADConfigDialognJoy : public wxDialog
void OKClick(wxCommandEvent& event); void OKClick(wxCommandEvent& event);
void CancelClick(wxCommandEvent& event); void CancelClick(wxCommandEvent& event);
void DoSave(bool ChangePad = false, int Slot = -1); void DoSave(bool ChangePad = false, int Slot = -1);
void UpdateID();
void StartTimer();
void DoChangeJoystick(); void DoChangeJoystick();
@ -333,22 +323,20 @@ class PADConfigDialognJoy : public wxDialog
void ChangeSettings(wxCommandEvent& event); void ChangeSettings(wxCommandEvent& event);
void ComboChange(wxCommandEvent& event); void ComboChange(wxCommandEvent& event);
void OnClose(wxCloseEvent& event); void OnClose(wxCloseEvent& event);
void UpdateDeviceList();
void CreateGUIControls(); void CreateGUIControls();
void CreateAdvancedControls(int i); void CreateAdvancedControls(int i);
wxBitmap CreateBitmap(); wxBitmap CreateBitmap();
wxBitmap CreateBitmapDot(); wxBitmap CreateBitmapDot();
wxBitmap CreateBitmapArea(int,int); wxBitmap CreateBitmapArea(int,int);
void PadShowStatus(); void PadGetStatus();
void UpdateSlow();
void Update(); void Update();
void UpdateGUIButtonMapping(int controller); void UpdateGUIButtonMapping(int controller);
void SaveButtonMapping(int controller, bool DontChangeId = false, int FromSlot = -1); void SaveButtonMapping(int controller, bool DontChangeId = false, int FromSlot = -1);
void SaveButtonMappingAll(int Slot); void SaveButtonMappingAll(int Slot);
void UpdateGUIAll(int Slot = -1); void UpdateGUIAll(int Slot);
void ToBlank(bool ToBlank = true); void ToBlank(bool ToBlank = true);
void OnSaveById(); void OnSaveById();

View File

@ -50,11 +50,8 @@ void PADConfigDialognJoy::UpdateGUIButtonMapping(int controller)
// http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString // http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
wxString tmp; wxString tmp;
// Assert
//if (!ControlsCreated[i]) return;
// Update selected gamepad // Update selected gamepad
m_Joyname[controller]->SetValue(wxString::FromAscii(PadMapping[controller].Name.c_str())); m_Joyname[controller]->SetSelection(PadMapping[controller].ID);
tmp << PadMapping[controller].buttons[InputCommon::CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear(); tmp << PadMapping[controller].buttons[InputCommon::CTL_L_SHOULDER]; m_JoyShoulderL[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].buttons[InputCommon::CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear(); tmp << PadMapping[controller].buttons[InputCommon::CTL_R_SHOULDER]; m_JoyShoulderR[controller]->SetValue(tmp); tmp.clear();
@ -102,8 +99,7 @@ void PADConfigDialognJoy::UpdateGUIButtonMapping(int controller)
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_LEFT]; m_JoyDpadLeft[controller]->SetValue(tmp); tmp.clear(); tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_LEFT]; m_JoyDpadLeft[controller]->SetValue(tmp); tmp.clear();
tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear(); tmp << PadMapping[controller].dpad2[InputCommon::CTL_D_PAD_RIGHT]; m_JoyDpadRight[controller]->SetValue(tmp); tmp.clear();
} }
NOTICE_LOG(PAD, "Loaded from PadMapping[%i] to slot %i", controller, controller);
} }
/* Populate the PadMapping array with the dialog items settings (for example /* Populate the PadMapping array with the dialog items settings (for example
@ -121,21 +117,7 @@ void PADConfigDialognJoy::SaveButtonMapping(int controller, bool DontChangeId, i
ToBlank(false); ToBlank(false);
// Set other settings // Set other settings
if(!DontChangeId) if(!DontChangeId) PadMapping[controller].ID = m_Joyname[FromSlot]->GetSelection();
{
if (joyinfo.size() > m_Joyname[FromSlot]->GetSelection())
{
INFO_LOG(PAD, "%i: Changed PadMapping ID from %i to %i", controller, PadMapping[controller].ID, joyinfo.at(m_Joyname[FromSlot]->GetSelection()).ID);
PadMapping[controller].ID = joyinfo.at(m_Joyname[FromSlot]->GetSelection()).ID;
}
//else
// Assert
PadMapping[controller].Name = m_Joyname[FromSlot]->GetValue().mb_str();
}
NOTICE_LOG(PAD, "Saved PadMapping[%i] from slot %i", controller, FromSlot);
// Settings
PadMapping[controller].controllertype = m_ControlType[FromSlot]->GetSelection(); PadMapping[controller].controllertype = m_ControlType[FromSlot]->GetSelection();
PadMapping[controller].triggertype = m_TriggerType[FromSlot]->GetSelection(); PadMapping[controller].triggertype = m_TriggerType[FromSlot]->GetSelection();
PadMapping[controller].deadzone = m_Deadzone[FromSlot]->GetSelection(); PadMapping[controller].deadzone = m_Deadzone[FromSlot]->GetSelection();
@ -282,13 +264,6 @@ void PADConfigDialognJoy::GetButtons(wxCommandEvent& event)
void PADConfigDialognJoy::DoGetButtons(int GetId) void PADConfigDialognJoy::DoGetButtons(int GetId)
{ {
//INFO_LOG(PAD, "DoGetButtons: %i", GetId);
if (!SDLPolling || SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE) return;
// Turn off live updates because the change the joy handles
LiveUpdates = false;
// ============================================= // =============================================
// Collect the starting values // Collect the starting values
// ---------------- // ----------------
@ -305,7 +280,7 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
int Axes = SDL_JoystickNumAxes(joy); int Axes = SDL_JoystickNumAxes(joy);
int Hats = SDL_JoystickNumHats(joy); int Hats = SDL_JoystickNumHats(joy);
//NOTICE_LOG(PAD, "PadID: %i Axes: %i Handle: %i\n", PadID, joyinfo[PadID].NumAxes, joyinfo[PadID].joy); INFO_LOG(CONSOLE, "PadID: %i Axes: %i\n", PadID, joyinfo[PadID].NumAxes, joyinfo[PadID].joy);
// Get the controller and trigger type // Get the controller and trigger type
int ControllerType = PadMapping[Controller].controllertype; int ControllerType = PadMapping[Controller].controllertype;
@ -368,8 +343,6 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
#if wxUSE_TIMER #if wxUSE_TIMER
m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) ); m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) );
#endif #endif
//INFO_LOG(PAD, "Timer started");
} }
// =============================================== // ===============================================
@ -380,7 +353,7 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
else else
{ {
InputCommon::GetButton( InputCommon::GetButton(
joy, PadID, joy, PadID, Buttons, Axes, Hats,
g_Pressed, value, type, pressed, Succeed, Stop, g_Pressed, value, type, pressed, Succeed, Stop,
LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter); LeftRight, Axis, XInput, Button, Hat, NoTriggerFilter);
} }
@ -395,7 +368,7 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
GetButtonWaitingTimer++; GetButtonWaitingTimer++;
// This is run every second // This is run every second
if (GetButtonWaitingTimer % TimesPerSecond == 0) if(GetButtonWaitingTimer % TimesPerSecond == 0)
{ {
// Current time // Current time
int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond); int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond);
@ -406,7 +379,7 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
} }
// Time's up // Time's up
if ( (GetButtonWaitingTimer / TimesPerSecond) >= Seconds ) if( (GetButtonWaitingTimer / TimesPerSecond) >= Seconds )
{ {
Stop = true; Stop = true;
// Leave a blank mapping // Leave a blank mapping
@ -414,10 +387,8 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
} }
// If we got a button // If we got a button
if (Succeed) if(Succeed)
{ {
//INFO_LOG(PAD, "Button mapping succeeded: %i", pressed);
Stop = true; Stop = true;
// Write the number of the pressed button to the text box // Write the number of the pressed button to the text box
sprintf(format, "%d", pressed); sprintf(format, "%d", pressed);
@ -425,12 +396,10 @@ void PADConfigDialognJoy::DoGetButtons(int GetId)
} }
// Stop the timer // Stop the timer
if (Stop) if(Stop)
{ {
m_ButtonMappingTimer->Stop(); m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0; GetButtonWaitingTimer = 0;
LiveUpdates = true;
//INFO_LOG(PAD, "Timer stopped");
/* Update the button mapping for all slots that use this device. (It doesn't make sense to have several slots /* Update the button mapping for all slots that use this device. (It doesn't make sense to have several slots
controlled by the same device, but several DirectInput instances of different but identical devices may possible controlled by the same device, but several DirectInput instances of different but identical devices may possible

View File

@ -48,13 +48,7 @@ std::vector<InputCommon::CONTROLLER_INFO> joyinfo;
InputCommon::CONTROLLER_STATE PadState[4]; InputCommon::CONTROLLER_STATE PadState[4];
InputCommon::CONTROLLER_MAPPING PadMapping[4]; InputCommon::CONTROLLER_MAPPING PadMapping[4];
bool g_EmulatorRunning = false; bool g_EmulatorRunning = false;
bool SDLPolling = true; int NumPads = 0, NumGoodPads = 0, LastPad = 0;
#ifdef _WIN32
bool LiveUpdates = false;
#else
bool LiveUpdates = false;
#endif
int NumPads = 0, NumDIDevices = -1, LastPad = 0;
#ifdef _WIN32 #ifdef _WIN32
HWND m_hWnd = NULL, m_hConsole = NULL; // Handle to window HWND m_hWnd = NULL, m_hConsole = NULL; // Handle to window
#endif #endif
@ -160,9 +154,11 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals)
// ------------------ // ------------------
void DllConfig(HWND _hParent) void DllConfig(HWND _hParent)
{ {
// Init Joystick + Haptic (force feedback) subsystem on SDL 1.3
// Populate joyinfo for all attached devices // Populate joyinfo for all attached devices
LocalSearchDevices(joyinfo, NumPads); Search_Devices(joyinfo, NumPads, NumGoodPads);
//g_Config.Load(); // load settings
g_Config.Load(); // load settings
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
if (!m_ConfigFrame) if (!m_ConfigFrame)
@ -172,9 +168,9 @@ void DllConfig(HWND _hParent)
// Only allow one open at a time // Only allow one open at a time
if (!m_ConfigFrame->IsShown()) if (!m_ConfigFrame->IsShown())
m_ConfigFrame->DoShow(); m_ConfigFrame->ShowModal();
else else
m_ConfigFrame->Hide(); m_ConfigFrame->Hide();
#endif #endif
} }
@ -198,7 +194,7 @@ void Initialize(void *init)
#endif #endif
// Populate joyinfo for all attached devices // Populate joyinfo for all attached devices
LocalSearchDevices(joyinfo, NumPads); Search_Devices(joyinfo, NumPads, NumGoodPads);
} }
// Shutdown PAD (stop emulation) // Shutdown PAD (stop emulation)
@ -225,16 +221,18 @@ void Shutdown()
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
if (joyinfo.size() > (u32)PadMapping[i].ID) if (joyinfo.size() > (u32)PadMapping[i].ID)
if(SDL_JoystickOpened(PadMapping[i].ID)) if (joyinfo.at(PadMapping[i].ID).Good)
{ if(SDL_JoystickOpened(PadMapping[i].ID))
SDL_JoystickClose(PadState[i].joy); {
PadState[i].joy = NULL; SDL_JoystickClose(PadState[i].joy);
} PadState[i].joy = NULL;
}
} }
// Clear the physical device info // Clear the physical device info
joyinfo.clear(); joyinfo.clear();
NumPads = 0; NumPads = 0;
NumGoodPads = 0;
// Finally close SDL // Finally close SDL
SDL_Quit(); SDL_Quit();
@ -285,12 +283,6 @@ void DoState(unsigned char **ptr, int mode)
// Function: Gives the current pad status to the Core // Function: Gives the current pad status to the Core
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
{ {
if (!IsPolling()) return;
// Update joyinfo handles. This is in case the Wiimote plugin has restarted SDL after a pad was conencted/disconnected
// so that the handles are updated.
if (LiveUpdates) LocalSearchDevices(joyinfo, NumPads);
// Check if the pad is avaliable, currently we don't disable pads just because they are // Check if the pad is avaliable, currently we don't disable pads just because they are
// disconnected // disconnected
if (!PadState[_numPAD].joy) return; if (!PadState[_numPAD].joy) return;
@ -300,7 +292,7 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
// Check that Dolphin is in focus, otherwise don't update the pad status // Check that Dolphin is in focus, otherwise don't update the pad status
if (g_Config.bCheckFocus || IsFocus()) if (g_Config.bCheckFocus || IsFocus())
GetJoyState(PadState[_numPAD], PadMapping[_numPAD]); GetJoyState(PadState[_numPAD], PadMapping[_numPAD], _numPAD, joyinfo[PadMapping[_numPAD].ID].NumButtons);
// Get type // Get type
int TriggerType = PadMapping[_numPAD].triggertype; int TriggerType = PadMapping[_numPAD].triggertype;
@ -447,127 +439,29 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
// Search for SDL devices // Search for SDL devices
// ---------------- // ----------------
bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads)
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
{ {
//DEBUG_LOG(PAD, "LocalSearchDevices"); bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads);
DoLocalSearchDevices(_joyinfo, _NumPads);
return Success;
}
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads) // Warn the user if no gamepads are detected
{ if (_NumGoodPads == 0 && g_EmulatorRunning)
//DEBUG_LOG(PAD, "LocalSearchDevicesUpdate: %i", IsPolling());
// Turn off device polling while resetting
EnablePolling(false);
bool Success = InputCommon::SearchDevicesReset(_joyinfo, _NumPads);
DoLocalSearchDevices(_joyinfo, _NumPads);
EnablePolling(true);
return Success;
}
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads)
{
// Don't warn the user if no gamepads are detected. If the pad doesn't respond he will open the configuration and fix it.
// Also, if he's using a Wii game he may not care that the gamepad is turned off.
if (_NumPads == 0 && g_EmulatorRunning)
{ {
//PanicAlert("nJoy: No Gamepad Detected"); PanicAlert("nJoy: No Gamepad Detected");
return false; return false;
} }
// Load the first time // Load PadMapping[] etc
if (!g_Config.Loaded) g_Config.Load(); g_Config.Load();
// Update the PadState[].joy handle // Update the PadState[].joy handle
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
for (int j = 0; j < joyinfo.size(); j++) if (joyinfo.size() > (u32)PadMapping[i].ID)
{ if(joyinfo.at(PadMapping[i].ID).Good)
if (joyinfo.at(j).Name == PadMapping[i].Name) PadState[i].joy = SDL_JoystickOpen(PadMapping[i].ID);
{
PadState[i].joy = joyinfo.at(j).joy;
//DEBUG_LOG(PAD, "Slot %i: %s", i, joyinfo.at(j).Name.c_str());
}
}
} }
return true; return Success;
}
// Is the device connected?
// ----------------
bool IsConnected(std::string Name)
{
for (int i = 0; i < joyinfo.size(); i++)
{
//DEBUG_LOG(PAD, "IDToName: ID %i id %i %s", ID, i, joyinfo.at(i).Name.c_str());
if (joyinfo.at(i).Name == Name)
return true;
}
}
// It could be possible to crash SDL.dll if SDL functions are called during SDL_Quit/SDL_Init. Therefore these functions.
// ----------------
bool IsPolling()
{
if (!SDLPolling || SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE)
return false;
else
return true;
}
void EnablePolling(bool Enable)
{
if (Enable)
{
SDLPolling = true;
SDL_JoystickEventState(SDL_IGNORE);
}
else
{
SDLPolling = false;
SDL_JoystickEventState(SDL_ENABLE);
}
}
// ID to Name
// ----------------
std::string IDToName(int ID)
{
for (int i = 0; i < joyinfo.size(); i++)
{
//DEBUG_LOG(PAD, "IDToName: ID %i id %i %s", ID, i, joyinfo.at(i).Name.c_str());
if (joyinfo.at(i).ID == ID)
return joyinfo.at(i).Name;
}
return "";
}
// ID to id - Get the gamepad id from a device ID (the ids will be all or some of the IDs)
// ----------------
int IDToid(int ID)
{
for (int i = 0; i < joyinfo.size(); i++)
{
if (joyinfo.at(i).ID == ID)
return i;
}
if (joyinfo.size() > 0)
{
ERROR_LOG(PAD, "IDToid error");
return 0;
}
else
{
PanicAlert("Error in IDToid. The plugin may crash.");
return -1;
}
} }

View File

@ -95,24 +95,13 @@
#ifdef _WIN32 #ifdef _WIN32
extern HWND m_hWnd, m_hConsole; // Handle to window extern HWND m_hWnd, m_hConsole; // Handle to window
#endif #endif
extern int NumPads, NumDIDevices, LastPad; // Number of pads extern int NumPads, NumGoodPads, LastPad; // Number of goods pads
extern bool SDLPolling;
extern bool LiveUpdates;
#endif #endif
// Custom Functions // Custom Functions
// ---------------- // ----------------
bool LocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads); bool Search_Devices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads, int &_NumGoodPads);
bool LocalSearchDevicesReset(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
bool DoLocalSearchDevices(std::vector<InputCommon::CONTROLLER_INFO> &_joyinfo, int &_NumPads);
int SearchDIDevices();
bool IsConnected(std::string Name);
bool IsPolling();
void EnablePolling(bool Enable);
std::string IDToName(int ID);
bool IsConnected(std::string Name);
int IDToid(int ID);
void DEBUG_INIT(); void DEBUG_INIT();
void DEBUG_QUIT(); void DEBUG_QUIT();
bool IsFocus(); bool IsFocus();