nJoy: Fixed the analog trigger buttons

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1934 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
John Peterson
2009-01-19 17:47:00 +00:00
parent be1e403435
commit 8f40075f8f
13 changed files with 478 additions and 358 deletions

View File

@ -6,7 +6,7 @@
namespace Common { namespace Common {
typedef void (__cdecl* TPAD_GetStatus)(u8, SPADStatus*); typedef void (__cdecl* TPAD_GetStatus)(u8, SPADStatus*);
typedef void (__cdecl* TPAD_Input)(u8, u8); typedef void (__cdecl* TPAD_Input)(u16, u8);
typedef void (__cdecl* TPAD_Rumble)(u8, unsigned int, unsigned int); typedef void (__cdecl* TPAD_Rumble)(u8, unsigned int, unsigned int);
typedef unsigned int (__cdecl* TPAD_GetAttachedPads)(); typedef unsigned int (__cdecl* TPAD_GetAttachedPads)();

View File

@ -6,6 +6,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "Core\Core\Core.vcpr
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA} {C7E5D50A-2916-464B-86A7-E10B3CC88ADA} = {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}
{0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0}
{71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C} {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {71B16F46-0B00-4EDA-B253-D6D9D03A215C}
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF} = {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}
@ -37,6 +38,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_LLE", "Plugins\P
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DiscIO", "Core\DiscIO\DiscIO.vcproj", "{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DiscIO", "Core\DiscIO\DiscIO.vcproj", "{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF} = {95CCAABC-7062-47C4-B8C1-A064DD5F16FF}
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection EndProjectSection
EndProject EndProject
@ -63,7 +65,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DolphinWX", "Core\DolphinWX
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}
{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} = {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} = {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}
{F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684} {F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684}
{0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {0B72B5D6-5D72-4391-84A7-9CCA5392668A}
{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}
EndProjectSection EndProjectSection
EndProject EndProject
@ -133,29 +134,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{5C17
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Externals", "Externals", "{4F427D1B-8C90-4D9C-B23D-A51493A1C471}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Externals", "Externals", "{4F427D1B-8C90-4D9C-B23D-A51493A1C471}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Player", "..\Branches\MusicMod\Player\Player.vcproj", "{0B72B5D6-5D72-4391-84A7-9CCA5392668A}"
ProjectSection(ProjectDependencies) = postProject
{C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestPlayer", "..\Branches\MusicMod\TestPlayer\TestPlayer.vcproj", "{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}"
ProjectSection(ProjectDependencies) = postProject
{0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {0B72B5D6-5D72-4391-84A7-9CCA5392668A}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dolphin", "Dolphin", "{61C7F431-0623-4A8D-9C4B-EDE35696554A}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dolphin", "Dolphin", "{61C7F431-0623-4A8D-9C4B-EDE35696554A}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InputCommon", "Core\InputCommon\InputCommon.vcproj", "{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\Branches\MusicMod\Common\Common.vcproj", "{DE7C596C-CBC4-4278-8909-146D63990803}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\Branches\MusicMod\Common\Common.vcproj", "{DE7C596C-CBC4-4278-8909-146D63990803}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Main", "..\Branches\MusicMod\Main\Main.vcproj", "{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Main", "..\Branches\MusicMod\Main\Main.vcproj", "{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160} = {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}
{0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {0B72B5D6-5D72-4391-84A7-9CCA5392668A} {0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {0B72B5D6-5D72-4391-84A7-9CCA5392668A}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InputCommon", "Core\InputCommon\InputCommon.vcproj", "{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Player", "..\Branches\MusicMod\Player\Player.vcproj", "{0B72B5D6-5D72-4391-84A7-9CCA5392668A}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "..\Externals\SDL\SDL\SDL.vcproj", "{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestPlayer", "..\Branches\MusicMod\TestPlayer\TestPlayer.vcproj", "{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -357,48 +349,6 @@ Global
{521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32 {521498BE-6089-4780-8223-E67C22F4E068}.Release|Win32.Build.0 = Release|Win32
{521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.ActiveCfg = Release|x64 {521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.ActiveCfg = Release|x64
{521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.Build.0 = Release|x64 {521498BE-6089-4780-8223-E67C22F4E068}.Release|x64.Build.0 = Release|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|Win32.ActiveCfg = Debug|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|Win32.Build.0 = Debug|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|x64.ActiveCfg = Debug|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|x64.Build.0 = Debug|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|Win32.Build.0 = DebugFast|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|x64.ActiveCfg = Debug|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|x64.Build.0 = Debug|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|Win32.ActiveCfg = Release|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|Win32.Build.0 = Release|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|x64.ActiveCfg = Release|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|x64.Build.0 = Release|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|Win32.ActiveCfg = Debug|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|Win32.Build.0 = Debug|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|x64.ActiveCfg = Debug|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|x64.Build.0 = Debug|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|x64.ActiveCfg = Debug|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|x64.Build.0 = Debug|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|Win32.ActiveCfg = Release|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|x64.ActiveCfg = Release|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|x64.Build.0 = Release|x64
{DE7C596C-CBC4-4278-8909-146D63990803}.Debug|Win32.ActiveCfg = Debug|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Debug|Win32.Build.0 = Debug|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Debug|x64.ActiveCfg = Debug|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|Win32.Build.0 = DebugFast|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|x64.ActiveCfg = Debug|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|Win32.ActiveCfg = Release|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|Win32.Build.0 = Release|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|x64.ActiveCfg = Release|x64
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|x64.Build.0 = Release|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|Win32.ActiveCfg = Debug|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|Win32.Build.0 = Debug|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|x64.ActiveCfg = Debug|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|Win32.Build.0 = DebugFast|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|x64.ActiveCfg = Debug|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|Win32.ActiveCfg = Release|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|Win32.Build.0 = Release|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|x64.ActiveCfg = Release|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|x64.Build.0 = Release|x64
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Debug|Win32.ActiveCfg = Debug|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Debug|Win32.ActiveCfg = Debug|Win32
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Debug|Win32.Build.0 = Debug|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Debug|Win32.Build.0 = Debug|Win32
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Debug|x64.ActiveCfg = Debug|x64 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Debug|x64.ActiveCfg = Debug|x64
@ -411,15 +361,54 @@ Global
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|Win32.Build.0 = Release|Win32 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|Win32.Build.0 = Release|Win32
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|x64.ActiveCfg = Release|x64 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|x64.ActiveCfg = Release|x64
{C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|x64.Build.0 = Release|x64 {C7E5D50A-2916-464B-86A7-E10B3CC88ADA}.Release|x64.Build.0 = Release|x64
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.Debug|Win32.ActiveCfg = Debug|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|Win32.ActiveCfg = Debug|Win32
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.Debug|Win32.Build.0 = Debug|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|Win32.Build.0 = Debug|Win32
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.Debug|x64.ActiveCfg = Debug|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|x64.ActiveCfg = Debug|x64
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.DebugFast|Win32.ActiveCfg = Debug|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.Debug|x64.Build.0 = Debug|x64
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.DebugFast|Win32.Build.0 = Debug|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.DebugFast|x64.ActiveCfg = Debug|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|Win32.Build.0 = DebugFast|Win32
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.Release|Win32.ActiveCfg = Release|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|x64.ActiveCfg = DebugFast|x64
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.Release|Win32.Build.0 = Release|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.DebugFast|x64.Build.0 = DebugFast|x64
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA}.Release|x64.ActiveCfg = Release|Win32 {DE7C596C-CBC4-4278-8909-146D63990803}.Release|Win32.ActiveCfg = Release|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|Win32.Build.0 = Release|Win32
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|x64.ActiveCfg = Release|x64
{DE7C596C-CBC4-4278-8909-146D63990803}.Release|x64.Build.0 = Release|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|Win32.ActiveCfg = Debug|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|Win32.Build.0 = Debug|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|x64.ActiveCfg = Debug|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Debug|x64.Build.0 = Debug|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|Win32.Build.0 = DebugFast|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|x64.ActiveCfg = DebugFast|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.DebugFast|x64.Build.0 = DebugFast|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|Win32.ActiveCfg = Release|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|Win32.Build.0 = Release|Win32
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|x64.ActiveCfg = Release|x64
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF}.Release|x64.Build.0 = Release|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|Win32.ActiveCfg = Debug|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|Win32.Build.0 = Debug|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|x64.ActiveCfg = Debug|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Debug|x64.Build.0 = Debug|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|Win32.Build.0 = DebugFast|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|x64.ActiveCfg = DebugFast|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.DebugFast|x64.Build.0 = DebugFast|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|Win32.ActiveCfg = Release|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|Win32.Build.0 = Release|Win32
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|x64.ActiveCfg = Release|x64
{0B72B5D6-5D72-4391-84A7-9CCA5392668A}.Release|x64.Build.0 = Release|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|Win32.ActiveCfg = Debug|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|Win32.Build.0 = Debug|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|x64.ActiveCfg = Debug|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Debug|x64.Build.0 = Debug|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|Win32.ActiveCfg = DebugFast|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|Win32.Build.0 = DebugFast|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|x64.ActiveCfg = DebugFast|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.DebugFast|x64.Build.0 = DebugFast|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|Win32.ActiveCfg = Release|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|Win32.Build.0 = Release|Win32
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|x64.ActiveCfg = Release|x64
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -447,11 +436,10 @@ Global
{33546D62-7F34-4EA6-A88E-D538B36E16BF} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} {33546D62-7F34-4EA6-A88E-D538B36E16BF} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471}
{71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} {71B16F46-0B00-4EDA-B253-D6D9D03A215C} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471}
{29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471} {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471}
{B6C1A81F-99A5-42F5-8C31-E86A6AEF4DCA} = {4F427D1B-8C90-4D9C-B23D-A51493A1C471}
{0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {77CF6E34-3038-4B23-A2E7-90AD17801609}
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718} = {77CF6E34-3038-4B23-A2E7-90AD17801609}
{DE7C596C-CBC4-4278-8909-146D63990803} = {77CF6E34-3038-4B23-A2E7-90AD17801609} {DE7C596C-CBC4-4278-8909-146D63990803} = {77CF6E34-3038-4B23-A2E7-90AD17801609}
{95CCAABC-7062-47C4-B8C1-A064DD5F16FF} = {77CF6E34-3038-4B23-A2E7-90AD17801609} {95CCAABC-7062-47C4-B8C1-A064DD5F16FF} = {77CF6E34-3038-4B23-A2E7-90AD17801609}
{0B72B5D6-5D72-4391-84A7-9CCA5392668A} = {77CF6E34-3038-4B23-A2E7-90AD17801609}
{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718} = {77CF6E34-3038-4B23-A2E7-90AD17801609}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
AMDCaProjectFile = D:\Dev\Dolphin\trunk\Source\CodeAnalyst\Dolphin.caw AMDCaProjectFile = D:\Dev\Dolphin\trunk\Source\CodeAnalyst\Dolphin.caw

View File

@ -70,7 +70,7 @@ EXPORT void CALL PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus);
// input: The key and if it's pressed or released // input: The key and if it's pressed or released
// output: None // output: None
// //
EXPORT void CALL PAD_Input(u8 _Key, u8 _UpDown); EXPORT void CALL PAD_Input(u16 _Key, u8 _UpDown);
// __________________________________________________________________________________________________ // __________________________________________________________________________________________________
// Function: PAD_Rumble // Function: PAD_Rumble

View File

@ -590,7 +590,7 @@ void cocoa_Read(int _numPAD, SPADStatus* _pPADStatus)
#endif #endif
// Set buttons status from wxWidgets in the main application // Set buttons status from wxWidgets in the main application
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void PAD_Input(u8 _Key, u8 _UpDown) {} void PAD_Input(u16 _Key, u8 _UpDown) {}
void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus) void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)

View File

@ -506,10 +506,6 @@
RelativePath=".\Src\Config.cpp" RelativePath=".\Src\Config.cpp"
> >
</File> </File>
<File
RelativePath=".\Src\Config.h"
>
</File>
<File <File
RelativePath=".\Src\nJoy.cpp" RelativePath=".\Src\nJoy.cpp"
> >
@ -534,6 +530,10 @@
RelativePath=".\Src\GUI\AboutBox.h" RelativePath=".\Src\GUI\AboutBox.h"
> >
</File> </File>
<File
RelativePath=".\Src\Config.h"
>
</File>
<File <File
RelativePath=".\Src\GUI\ConfigAdvanced.cpp" RelativePath=".\Src\GUI\ConfigAdvanced.cpp"
> >

View File

@ -220,7 +220,7 @@ void Config::Save(bool CheckedForDuplicates)
file.Set(SectionName.c_str(), "deadzone", joysticks[i].deadzone); file.Set(SectionName.c_str(), "deadzone", joysticks[i].deadzone);
file.Set(SectionName.c_str(), "halfpress", joysticks[i].halfpress); file.Set(SectionName.c_str(), "halfpress", joysticks[i].halfpress);
//file.Set(SectionName.c_str(), "controllertype", joysticks[i].controllertype); file.Set(SectionName.c_str(), "controllertype", joysticks[i].controllertype);
file.Set(SectionName.c_str(), "eventnum", joysticks[i].eventnum); file.Set(SectionName.c_str(), "eventnum", joysticks[i].eventnum);
file.Set(SectionName.c_str(), "Diagonal", g_Config.SDiagonal); file.Set(SectionName.c_str(), "Diagonal", g_Config.SDiagonal);
@ -293,7 +293,7 @@ void Config::Load(bool config)
file.Get(SectionName.c_str(), "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3); file.Get(SectionName.c_str(), "sub_y", &joysticks[i].axis[CTL_SUB_Y], 3);
file.Get(SectionName.c_str(), "deadzone", &joysticks[i].deadzone, 9); file.Get(SectionName.c_str(), "deadzone", &joysticks[i].deadzone, 9);
file.Get(SectionName.c_str(), "halfpress", &joysticks[i].halfpress, 6); file.Get(SectionName.c_str(), "halfpress", &joysticks[i].halfpress, 6);
//file.Get(SectionName.c_str(), "controllertype", &joysticks[i].controllertype, 0); file.Get(SectionName.c_str(), "controllertype", &joysticks[i].controllertype, 0);
file.Get(SectionName.c_str(), "eventnum", &joysticks[i].eventnum, 0); file.Get(SectionName.c_str(), "eventnum", &joysticks[i].eventnum, 0);
file.Get(SectionName.c_str(), "Diagonal", &g_Config.SDiagonal, "100%"); file.Get(SectionName.c_str(), "Diagonal", &g_Config.SDiagonal, "100%");

View File

@ -130,28 +130,36 @@ void ConfigBox::PadGetStatus()
// Show the current pad status // Show the current pad status
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string ShowStatus() std::string ShowStatus(int Controller)
{ {
SDL_Joystick *joy = SDL_JoystickOpen(0); // Make local shortcut
int axes = SDL_JoystickNumAxes(joy); SDL_Joystick *joy = joystate[joysticks[Controller].ID].joy;
int hats = SDL_JoystickNumHats(joy);
int but = SDL_JoystickNumButtons(joy); // Temporary storage
std::string StrAxes, StrHats, StrBut; std::string StrAxes, StrHats, StrBut;
int value; int value;
// Go through all axes and read out their values // Get status
int Axes = joyinfo[joysticks[Controller].ID].NumAxes;
int Balls = joyinfo[joysticks[Controller].ID].NumBalls;
int Hats = joyinfo[joysticks[Controller].ID].NumHats;
int Buttons = joyinfo[joysticks[Controller].ID].NumButtons;
// Update the internal values
SDL_JoystickUpdate(); SDL_JoystickUpdate();
for(int i = 0; i < axes; i++)
// Go through all axes and read out their values
for(int i = 0; i < Axes; i++)
{ {
value = SDL_JoystickGetAxis(joy, i); value = SDL_JoystickGetAxis(joy, i);
StrAxes += StringFromFormat(" %i:%05i", i, value); StrAxes += StringFromFormat(" %i:%05i", i, value);
} }
for(int i = 0;i < hats; i++) for(int i = 0;i < Hats; i++)
{ {
value = SDL_JoystickGetHat(joy, i); value = SDL_JoystickGetHat(joy, i);
StrHats += StringFromFormat(" %i:%i", i, value); StrHats += StringFromFormat(" %i:%i", i, value);
} }
for(int i = 0;i < but; i++) for(int i = 0;i < Buttons; i++)
{ {
value = SDL_JoystickGetButton(joy, i); value = SDL_JoystickGetButton(joy, i);
StrBut += StringFromFormat(" %i:%i", i+1, value); StrBut += StringFromFormat(" %i:%i", i+1, value);
@ -159,9 +167,8 @@ std::string ShowStatus()
return StringFromFormat( return StringFromFormat(
"Axes: %s\nHats: %s\nBut: %s\nDevice: Ax: %i Balls:%i But:%i Hats:%i", "Axes: %s\nHats: %s\nBut: %s\nDevice: Ax: %i Balls:%i But:%i Hats:%i",
StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(), StrAxes.c_str(), StrHats.c_str(), StrBut.c_str(),
joyinfo[joysticks[0].ID].NumAxes, joyinfo[joysticks[0].ID].NumBalls, Axes, Balls, Hats, Buttons
joyinfo[joysticks[0].ID].NumButtons, joyinfo[joysticks[0].ID].NumHats
); );
} }
@ -173,10 +180,10 @@ void ConfigBox::Update()
if(!g_Config.bShowAdvanced) StrangeHack = false; else StrangeHack = true; if(!g_Config.bShowAdvanced) StrangeHack = false; else StrangeHack = true;
// Show the current status // Show the current status
/**/ /*
m_pStatusBar->SetLabel(wxString::Format( m_pStatusBar->SetLabel(wxString::Format(
"%s", ShowStatus().c_str() "%s", ShowStatus(notebookpage).c_str()
)); ));*/
} }

View File

@ -43,12 +43,10 @@ extern CONTROLLER_INFO *joyinfo;
//extern CONTROLLER_MAPPING joysticks[4]; //extern CONTROLLER_MAPPING joysticks[4];
extern bool emulator_running; extern bool emulator_running;
static const char* ControllerType[] = static const char* DPadType[] =
{ {
"Joystick (with hat)", "Hat",
"Joystick (no hat)", "Custom",
// "Joytstick (xbox360)", // Shoulder buttons -> axis
// "Keyboard" // Not supported yet, sorry F|RES ;( ...
}; };
//////////////////////// ////////////////////////
@ -91,16 +89,14 @@ BEGIN_EVENT_TABLE(ConfigBox,wxDialog)
EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetButtons) EVT_BUTTON(IDB_ANALOG_SUB_Y, ConfigBox::GetButtons)
#if wxUSE_TIMER #if wxUSE_TIMER
EVT_TIMER(wxID_ANY, ConfigBox::OnTimer) EVT_TIMER(IDTM_CONSTANT, ConfigBox::OnTimer)
EVT_TIMER(IDTM_BUTTON, ConfigBox::OnButtonTimer)
#endif #endif
END_EVENT_TABLE() END_EVENT_TABLE()
ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title, ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title,
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)
#if wxUSE_TIMER
, m_timer(this)
#endif
{ {
// Define values // Define values
notebookpage = 0; notebookpage = 0;
@ -110,21 +106,28 @@ ConfigBox::ConfigBox(wxWindow *parent, wxWindowID id, const wxString &title,
CreateGUIControls(); CreateGUIControls();
#if wxUSE_TIMER #if wxUSE_TIMER
m_ConstantTimer = new wxTimer(this, IDTM_CONSTANT);
m_ButtonMappingTimer = new wxTimer(this, IDTM_BUTTON);
// Reset values
GetButtonWaitingID = 0; GetButtonWaitingTimer = 0;
// Start the constant timer
int TimesPerSecond = 30; int TimesPerSecond = 30;
m_timer.Start( floor((double)(1000 / TimesPerSecond)) ); m_ConstantTimer->Start( floor((double)(1000 / TimesPerSecond)) );
#endif #endif
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // wxEVT_KEY_DOWN is blocked for enter, tab and the directional keys
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_UP,
wxKeyEventHandler(ConfigBox::OnKeyDown), wxKeyEventHandler(ConfigBox::OnKeyDown),
(wxObject*)0, this); (wxObject*)0, this);
} }
ConfigBox::~ConfigBox() ConfigBox::~ConfigBox()
{ {
// The statbar sample has this so I add this to // The statbar sample has this so I add this to
#if wxUSE_TIMER #if wxUSE_TIMER
if (m_timer.IsRunning()) m_timer.Stop(); if (m_ConstantTimer->IsRunning()) m_ConstantTimer->Stop();
#endif #endif
} }
@ -177,7 +180,7 @@ void ConfigBox::OKClick(wxCommandEvent& event)
if (Tmp == wxOK) return; else if (Tmp == wxNO) g_Config.bSaveByIDNotice = false; if (Tmp == wxOK) return; else if (Tmp == wxNO) g_Config.bSaveByIDNotice = false;
} }
for(int i=0; i<4 ;i++) GetControllerAll(i); // Update joysticks array for(int i=0; i<4 ;i++) SaveButtonMapping(i); // Update joysticks array
g_Config.Save(true); // Save settings g_Config.Save(true); // Save settings
g_Config.Load(); // Reload settings g_Config.Load(); // Reload settings
Close(); // Call OnClose() Close(); // Call OnClose()
@ -243,24 +246,29 @@ void ConfigBox::EnableDisable(wxCommandEvent& event)
// Update GUI // Update GUI
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Called from: SetControllerAll(), ChangeControllertype() // Called from: UpdateGUIKeys(), ChangeControllertype()
void ConfigBox::UpdateGUI(int _notebookpage) void ConfigBox::UpdateGUI(int _notebookpage)
{ {
// Update the enable / disable status // Update the enable / disable status
joysticks[_notebookpage].enabled = m_Joyattach[_notebookpage]->GetValue(); joysticks[_notebookpage].enabled = m_Joyattach[_notebookpage]->GetValue();
// Controller type settings // Controller type settings
bool HasHat = (joysticks[_notebookpage].controllertype == CTL_TYPE_JOYSTICK); bool Hat = (joysticks[_notebookpage].controllertype == CTL_DPAD_HAT);
m_JoyDpadDown[_notebookpage]->Show(HasHat); m_JoyDpadLeft[_notebookpage]->Show(!Hat);
m_JoyDpadLeft[_notebookpage]->Show(HasHat); m_JoyDpadRight[_notebookpage]->Show(!Hat);
m_JoyDpadRight[_notebookpage]->Show(HasHat); m_JoyDpadDown[_notebookpage]->Show(!Hat);
m_bJoyDpadDown[_notebookpage]->Show(HasHat);
m_bJoyDpadLeft[_notebookpage]->Show(HasHat); m_bJoyDpadLeft[_notebookpage]->Show(!Hat);
m_bJoyDpadRight[_notebookpage]->Show(HasHat); m_bJoyDpadRight[_notebookpage]->Show(!Hat);
m_textDpadUp[_notebookpage]->Show(HasHat); m_bJoyDpadDown[_notebookpage]->Show(!Hat);
m_textDpadDown[_notebookpage]->Show(HasHat);
m_textDpadLeft[_notebookpage]->Show(HasHat); m_textDpadDown[_notebookpage]->Show(!Hat);
m_textDpadRight[_notebookpage]->Show(HasHat); m_textDpadLeft[_notebookpage]->Show(!Hat);
m_textDpadRight[_notebookpage]->Show(!Hat);
m_textDpadUp[_notebookpage]->SetLabel(Hat ? wxT("Select hat") : wxT("Up"));
m_bJoyDpadUp[_notebookpage]->SetToolTip(Hat ?
wxT("Select a hat by pressing the hat in any direction") : wxT(""));
// General settings // General settings
m_CBSaveByID[_notebookpage]->SetValue(g_Config.bSaveByID.at(_notebookpage)); m_CBSaveByID[_notebookpage]->SetValue(g_Config.bSaveByID.at(_notebookpage));
@ -283,7 +291,6 @@ void ConfigBox::UpdateGUI(int _notebookpage)
m_Controller[_notebookpage]->FindItem(IDC_DEADZONE)->Enable(joysticks[_notebookpage].enabled); m_Controller[_notebookpage]->FindItem(IDC_DEADZONE)->Enable(joysticks[_notebookpage].enabled);
//m_Controller[_notebookpage]->FindItem(IDC_CONTROLTYPE)->Enable(joysticks[_notebookpage].enabled); //m_Controller[_notebookpage]->FindItem(IDC_CONTROLTYPE)->Enable(joysticks[_notebookpage].enabled);
#endif #endif
m_Controltype[_notebookpage]->SetSelection(HasHat ? 0 : 1);
// Repaint the background // Repaint the background
m_Controller[_notebookpage]->Refresh(); m_Controller[_notebookpage]->Refresh();
@ -306,7 +313,7 @@ void ConfigBox::ChangeJoystick(wxCommandEvent& event)
{ {
// Before chaning the pad we save potential changes (to support SaveByID) // Before chaning the pad we save potential changes (to support SaveByID)
int TmpID = joysticks[notebookpage].ID; // Don't update the ID int TmpID = joysticks[notebookpage].ID; // Don't update the ID
GetControllerAll(notebookpage); SaveButtonMapping(notebookpage);
joysticks[notebookpage].ID = TmpID; joysticks[notebookpage].ID = TmpID;
g_Config.Save(); g_Config.Save();
@ -317,20 +324,22 @@ void ConfigBox::ChangeJoystick(wxCommandEvent& event)
// Update the controller type // Update the controller type
if(joyinfo[joysticks[notebookpage].ID].NumHats > 0) if(joyinfo[joysticks[notebookpage].ID].NumHats > 0)
joysticks[notebookpage].controllertype = CTL_TYPE_JOYSTICK; joysticks[notebookpage].controllertype = CTL_DPAD_HAT;
//PanicAlert("%i %i", joysticks[notebookpage].ID, notebookpage); //PanicAlert("%i %i", joysticks[notebookpage].ID, notebookpage);
// Load device settings to support SaveByID // Load device settings to support SaveByID
g_Config.Load(true); // Then load the current g_Config.Load(true); // Then load the current
SetControllerAll(notebookpage); // Update joystick dialog items UpdateGUIKeys(notebookpage); // Update joystick dialog items
UpdateGUI(notebookpage); // Update other dialog items UpdateGUI(notebookpage); // Update other dialog items
// Remap the controller // Remap the controller
if (joysticks[notebookpage].enabled) if (joysticks[notebookpage].enabled)
{ {
return;
if (SDL_JoystickOpened(notebookpage)) SDL_JoystickClose(joystate[notebookpage].joy); if (SDL_JoystickOpened(notebookpage)) SDL_JoystickClose(joystate[notebookpage].joy);
joystate[notebookpage].joy = SDL_JoystickOpen(joysticks[notebookpage].ID); joystate[notebookpage].joy = SDL_JoystickOpen(joysticks[notebookpage].ID);
PanicAlert("");
} }
} }
@ -361,9 +370,6 @@ void ConfigBox::CreateGUIControls()
SetIcon(wxNullIcon); SetIcon(wxNullIcon);
//WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM);
//WxStaticBitmap1_BITMAP = new WxStaticBitmap1_BITMAP(ConfigBox_WxStaticBitmap1_XPM);
#ifndef _WIN32 #ifndef _WIN32
// Force a 8pt font so that it looks more or less "correct" regardless of the default font setting // Force a 8pt font so that it looks more or less "correct" regardless of the default font setting
wxFont f(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); wxFont f(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
@ -423,10 +429,8 @@ void ConfigBox::CreateGUIControls()
// Populate the controller type list // Populate the controller type list
// ----------------------------- // -----------------------------
wxArrayString arrayStringFor_Controltype; wxArrayString arrayStringFor_Controltype;
arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_JOYSTICK])); arrayStringFor_Controltype.Add(wxString::FromAscii(DPadType[CTL_DPAD_HAT]));
arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_JOYSTICK_NO_HAT])); arrayStringFor_Controltype.Add(wxString::FromAscii(DPadType[CTL_DPAD_CUSTOM]));
// arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_JOYSTICK_XBOX360]));
// arrayStringFor_Controltype.Add(wxString::FromAscii(ControllerType[CTL_TYPE_KEYBOARD]));
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@ -451,7 +455,7 @@ void ConfigBox::CreateGUIControls()
int t = -75; // Top int t = -75; // Top
int l = -4; // Left int l = -4; // Left
m_sKeys[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Keys")); m_sKeys[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Keys"));
m_pKeys[i] = new wxPanel(m_Controller[i], ID_KEYSPANEL1 + i, wxDefaultPosition, wxSize(600, 400)); m_pKeys[i] = new wxPanel(m_Controller[i], ID_KEYSPANEL1 + i, wxDefaultPosition, wxSize(600, 400), 0);
//m_sKeys[i] = new wxStaticBox (m_Controller[i], IDG_JOYSTICK, wxT("Keys"), wxDefaultPosition, wxSize(608, 500)); //m_sKeys[i] = new wxStaticBox (m_Controller[i], IDG_JOYSTICK, wxT("Keys"), wxDefaultPosition, wxSize(608, 500));
m_sKeys[i]->Add(m_pKeys[i], 0, (wxALL), 0); // margin = 0 m_sKeys[i]->Add(m_pKeys[i], 0, (wxALL), 0); // margin = 0
@ -487,7 +491,7 @@ void ConfigBox::CreateGUIControls()
m_bJoyShoulderR[i] = new wxButton(m_pKeys[i], IDB_SHOULDER_R, wxEmptyString, wxPoint(l + 526, t + 108), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString); m_bJoyShoulderR[i] = new wxButton(m_pKeys[i], IDB_SHOULDER_R, wxEmptyString, wxPoint(l + 526, t + 108), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
// Left analog // Left analog
int ALt = 170; int ALw = ALt + 14; int ALb = ALw + 2; // Set offset int ALt = 169; int ALw = ALt + 14; int ALb = ALw + 2; // Set offset
m_JoyAnalogMainX[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_MAIN_X, wxT("0"), wxPoint(l + 6, t + ALw), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyAnalogMainX[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_MAIN_X, wxT("0"), wxPoint(l + 6, t + ALw), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
m_JoyAnalogMainX[i]->Enable(false); m_JoyAnalogMainX[i]->Enable(false);
m_JoyAnalogMainY[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_MAIN_Y, wxT("0"), wxPoint(l + 6, t + ALw + 36), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyAnalogMainY[i] = new wxTextCtrl(m_pKeys[i], ID_ANALOG_MAIN_Y, wxT("0"), wxPoint(l + 6, t + ALw + 36), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
@ -496,9 +500,9 @@ void ConfigBox::CreateGUIControls()
m_bJoyAnalogMainY[i] = new wxButton(m_pKeys[i], IDB_ANALOG_MAIN_Y, wxEmptyString, wxPoint(l + 70, t + ALb + 36), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString); m_bJoyAnalogMainY[i] = new wxButton(m_pKeys[i], IDB_ANALOG_MAIN_Y, wxEmptyString, wxPoint(l + 70, t + ALb + 36), wxSize(21, 14), 0, wxDefaultValidator, wxEmptyString);
m_textMainX[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_MAIN_X, wxT("X-axis"), wxPoint(l + 6, t + ALt), wxDefaultSize, 0, wxT("X-axis")); m_textMainX[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_MAIN_X, wxT("X-axis"), wxPoint(l + 6, t + ALt), wxDefaultSize, 0, wxT("X-axis"));
m_textMainY[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_MAIN_Y, wxT("Y-axis"), wxPoint(l + 6, t + ALt + 36), wxDefaultSize, 0, wxT("Y-axis")); m_textMainY[i] = new wxStaticText(m_pKeys[i], IDT_ANALOG_MAIN_Y, wxT("Y-axis"), wxPoint(l + 6, t + ALt + 36), wxDefaultSize, 0, wxT("Y-axis"));
// D-Pad // D-Pad
int DPt = 255; int DPw = DPt + 14; int DPb = DPw + 2; // Set offset int DPt = 250; int DPw = DPt + 14; int DPb = DPw + 2; // Set offset
m_JoyDpadUp[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_UP, wxT("0"), wxPoint(l + 6, t + DPw), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyDpadUp[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_UP, wxT("0"), wxPoint(l + 6, t + DPw), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
m_JoyDpadDown[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_DOWN, wxT("0"), wxPoint(l + 6, t + DPw + 36*1), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyDpadDown[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_DOWN, wxT("0"), wxPoint(l + 6, t + DPw + 36*1), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
m_JoyDpadLeft[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_LEFT, wxT("0"), wxPoint(l + 6, t + DPw + 36*2), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyDpadLeft[i] = new wxTextCtrl(m_pKeys[i], ID_DPAD_LEFT, wxT("0"), wxPoint(l + 6, t + DPw + 36*2), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
@ -515,7 +519,7 @@ void ConfigBox::CreateGUIControls()
m_textDpadDown[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_DOWN, wxT("Down"), wxPoint(l + 6, t + DPt + 36*1), wxDefaultSize, 0, wxT("Down")); m_textDpadDown[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_DOWN, wxT("Down"), wxPoint(l + 6, t + DPt + 36*1), wxDefaultSize, 0, wxT("Down"));
m_textDpadLeft[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_LEFT, wxT("Left"), wxPoint(l + 6, t + DPt + 36*2), wxDefaultSize, 0, wxT("Left")); m_textDpadLeft[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_LEFT, wxT("Left"), wxPoint(l + 6, t + DPt + 36*2), wxDefaultSize, 0, wxT("Left"));
m_textDpadRight[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_RIGHT, wxT("Right"), wxPoint(l + 6, t + DPt + 36*3), wxDefaultSize, 0, wxT("Right")); m_textDpadRight[i] = new wxStaticText(m_pKeys[i], IDT_DPAD_RIGHT, wxT("Right"), wxPoint(l + 6, t + DPt + 36*3), wxDefaultSize, 0, wxT("Right"));
// Buttons // Buttons
m_JoyButtonA[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_A, wxT("0"), wxPoint(l + 552, t + 280), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0")); m_JoyButtonA[i] = new wxTextCtrl(m_pKeys[i], ID_BUTTON_A, wxT("0"), wxPoint(l + 552, t + 280), wxSize(59, 19), wxTE_READONLY | wxTE_CENTRE, wxDefaultValidator, wxT("0"));
m_JoyButtonA[i]->Enable(false); m_JoyButtonA[i]->Enable(false);
@ -604,19 +608,16 @@ void ConfigBox::CreateGUIControls()
m_gGBExtrasettings[i]->Add(m_bJoyButtonHalfpress[i], wxGBPosition(1, 2), wxGBSpan(1, 1), (wxLEFT | wxTOP), 2); m_gGBExtrasettings[i]->Add(m_bJoyButtonHalfpress[i], wxGBPosition(1, 2), wxGBSpan(1, 1), (wxLEFT | wxTOP), 2);
m_gExtrasettings[i]->Add(m_gGBExtrasettings[i], 0, wxEXPAND | wxALL, 3); m_gExtrasettings[i]->Add(m_gGBExtrasettings[i], 0, wxEXPAND | wxALL, 3);
// Why is there a setting for this? Is it to replaced the analog stick with the digital pad?
// Populate controller typ // Populate controller typ
m_gControllertype[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Controller type")); m_gControllertype[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("D-Pad"));
m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, arrayStringFor_Controltype[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_Controltype, wxCB_READONLY); m_Controltype[i] = new wxComboBox(m_Controller[i], IDC_CONTROLTYPE, arrayStringFor_Controltype[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_Controltype, wxCB_READONLY);
m_gControllertype[i]->Add(m_Controltype[i], 0, wxEXPAND | wxALL, 3); m_gControllertype[i]->Add(m_Controltype[i], 0, wxEXPAND | wxALL, 3);
m_Controltype[i]->Enable(false); m_Controltype[i]->SetToolTip(wxT("Use a 'hat' on your gamepad or configure a custom button for each direction."));
// Create objects for general settings // Create objects for general settings
m_gGenSettings[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Settings") ); m_gGenSettings[i] = new wxStaticBoxSizer( wxVERTICAL, m_Controller[i], wxT("Settings") );
m_CBSaveByID[i] = new wxCheckBox(m_Controller[i], IDC_SAVEBYID, wxT("Save by ID"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_CBSaveByID[i] = new wxCheckBox(m_Controller[i], IDC_SAVEBYID, wxT("Save by ID"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_CBSaveByIDNotice[i] = new wxCheckBox(m_Controller[i], IDC_SAVEBYIDNOTICE, wxT("Notice"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_CBSaveByIDNotice[i] = new wxCheckBox(m_Controller[i], IDC_SAVEBYIDNOTICE, wxT("Notify"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_CBShowAdvanced[i] = new wxCheckBox(m_Controller[i], IDC_SHOWADVANCED, wxT("Show advanced settings"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_CBShowAdvanced[i] = new wxCheckBox(m_Controller[i], IDC_SHOWADVANCED, wxT("Show advanced settings"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
// Populate general settings // Populate general settings
@ -735,7 +736,7 @@ void ConfigBox::CreateGUIControls()
} }
// Set dialog items from saved values // Set dialog items from saved values
SetControllerAll(i); UpdateGUIKeys(i);
// Update GUI // Update GUI
UpdateGUI(i); UpdateGUI(i);
@ -763,7 +764,7 @@ void ConfigBox::CreateGUIControls()
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// Debugging // Debugging
// ----------------------------- // -----------------------------
m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(100, 490), wxDefaultSize); //m_pStatusBar = new wxStaticText(this, IDT_DEBUGGING, wxT("Debugging"), wxPoint(100, 490), wxDefaultSize);
//m_pStatusBar2 = new wxStaticText(this, IDT_DEBUGGING2, wxT("Debugging2"), wxPoint(100, 530), wxDefaultSize); //m_pStatusBar2 = new wxStaticText(this, IDT_DEBUGGING2, wxT("Debugging2"), wxPoint(100, 530), wxDefaultSize);
//m_pStatusBar->SetLabel(wxString::Format("Debugging text")); //m_pStatusBar->SetLabel(wxString::Format("Debugging text"));

View File

@ -63,7 +63,8 @@ class ConfigBox : public wxDialog
#if wxUSE_TIMER #if wxUSE_TIMER
void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); } void OnTimer(wxTimerEvent& WXUNUSED(event)) { Update(); }
wxTimer m_timer; void OnButtonTimer(wxTimerEvent& WXUNUSED(event)) { DoGetButtons(GetButtonWaitingID); }
wxTimer *m_ConstantTimer, *m_ButtonMappingTimer;
#endif #endif
// Debugging // Debugging
@ -71,6 +72,9 @@ class ConfigBox : public wxDialog
// Status window // Status window
int BoxW, BoxH; int BoxW, BoxH;
// Configure buttons
int GetButtonWaitingID, GetButtonWaitingTimer;
private: private:
wxButton *m_About; wxButton *m_About;
@ -86,7 +90,6 @@ class ConfigBox : public wxDialog
wxStaticBoxSizer * m_sKeys[4]; wxStaticBoxSizer * m_sKeys[4];
wxBoxSizer *m_sMain[4], *m_sMainLeft[4], *m_sMainRight[4]; wxBoxSizer *m_sMain[4], *m_sMainLeft[4], *m_sMainRight[4];
///////////////////////////// /////////////////////////////
// Settings // Settings
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ -208,6 +211,9 @@ class ConfigBox : public wxDialog
// Advaced settings // Advaced settings
IDCB_MAINSTICK_DIAGONAL, IDCB_MAINSTICK_S_TO_C, IDT_MAINSTICK_DIAGONAL, IDCB_MAINSTICK_DIAGONAL, IDCB_MAINSTICK_S_TO_C, IDT_MAINSTICK_DIAGONAL,
// Timers
IDTM_CONSTANT, IDTM_BUTTON,
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// Keys objects // Keys objects
@ -292,12 +298,12 @@ class ConfigBox : public wxDialog
wxBitmap CreateBitmap(); wxBitmap CreateBitmapDot(); wxBitmap CreateBitmap(); wxBitmap CreateBitmapDot();
void PadGetStatus(); void Update(); void PadGetStatus(); void Update();
void SetControllerAll(int controller); void UpdateGUIKeys(int controller);
void GetControllerAll(int controller); void SaveButtonMapping(int controller);
void NotebookPageChanged(wxNotebookEvent& event); void NotebookPageChanged(wxNotebookEvent& event);
void GetButtons(wxCommandEvent& event); void GetButtons(wxCommandEvent& event); void DoGetButtons(int);
void GetHats(int ID); void GetHats(int ID);
void GetAxis(wxCommandEvent& event); void GetAxis(wxCommandEvent& event);

View File

@ -47,7 +47,7 @@ extern bool emulator_running;
// Set dialog items from saved values // Set dialog items from saved values
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ConfigBox::SetControllerAll(int controller) void ConfigBox::UpdateGUIKeys(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;
@ -82,7 +82,7 @@ void ConfigBox::SetControllerAll(int controller)
UpdateGUI(controller); UpdateGUI(controller);
if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK) if(joysticks[controller].controllertype == CTL_DPAD_HAT)
{ {
tmp << joysticks[controller].dpad; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear(); tmp << joysticks[controller].dpad; m_JoyDpadUp[controller]->SetValue(tmp); tmp.clear();
} }
@ -98,17 +98,20 @@ void ConfigBox::SetControllerAll(int controller)
/* Populate the joysticks array with the dialog items settings, for example /* Populate the joysticks array with the dialog items settings, for example
selected joystick, enabled or disabled status and so on */ selected joystick, enabled or disabled status and so on */
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ConfigBox::GetControllerAll(int controller) void ConfigBox::SaveButtonMapping(int controller)
{ {
// Temporary storage
wxString tmp; wxString tmp;
long value; long value;
// The controller ID
joysticks[controller].ID = m_Joyname[controller]->GetSelection(); joysticks[controller].ID = m_Joyname[controller]->GetSelection();
if(joyinfo[joysticks[controller].ID].NumHats > 0) joysticks[controller].controllertype = CTL_TYPE_JOYSTICK;
m_JoyShoulderL[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_L_SHOULDER] = value; tmp.clear(); // The shoulder buttons
m_JoyShoulderR[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_R_SHOULDER] = value; tmp.clear(); m_JoyShoulderL[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_L_SHOULDER] = value;
m_JoyShoulderR[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_R_SHOULDER] = value;
// The digital buttons
m_JoyButtonA[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_A_BUTTON] = value; tmp.clear(); m_JoyButtonA[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_A_BUTTON] = value; tmp.clear();
m_JoyButtonB[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_B_BUTTON] = value; tmp.clear(); m_JoyButtonB[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_B_BUTTON] = value; tmp.clear();
m_JoyButtonX[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_X_BUTTON] = value; tmp.clear(); m_JoyButtonX[controller]->GetValue().ToLong(&value); joysticks[controller].buttons[CTL_X_BUTTON] = value; tmp.clear();
@ -118,7 +121,8 @@ void ConfigBox::GetControllerAll(int controller)
m_JoyButtonHalfpress[controller]->GetValue().ToLong(&value); joysticks[controller].halfpress = value; tmp.clear(); m_JoyButtonHalfpress[controller]->GetValue().ToLong(&value); joysticks[controller].halfpress = value; tmp.clear();
if(joysticks[controller].controllertype == CTL_TYPE_JOYSTICK) // Digital pad type
if(joysticks[controller].controllertype == CTL_DPAD_HAT)
{ {
m_JoyDpadUp[controller]->GetValue().ToLong(&value); joysticks[controller].dpad = value; tmp.clear(); m_JoyDpadUp[controller]->GetValue().ToLong(&value); joysticks[controller].dpad = value; tmp.clear();
} }
@ -155,83 +159,52 @@ void ConfigBox::ChangeControllertype(wxCommandEvent& event)
} }
// Update the textbox for the buttons
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ConfigBox::SetButtonText(int id, char text[128]) void ConfigBox::SetButtonText(int id, char text[128])
{ {
int controller = notebookpage; int controller = notebookpage;
switch(id) switch(id)
{ {
case IDB_DPAD_RIGHT:
m_JoyDpadRight[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_DPAD_UP:
m_JoyDpadUp[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_DPAD_DOWN:
m_JoyDpadDown[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_DPAD_LEFT:
m_JoyDpadLeft[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_MAIN_X:
m_JoyAnalogMainX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_MAIN_Y:
m_JoyAnalogMainY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_SUB_X:
m_JoyAnalogSubX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_SUB_Y:
m_JoyAnalogSubY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_SHOULDER_L: case IDB_SHOULDER_L:
m_JoyShoulderL[controller]->SetValue(wxString::FromAscii(text)); break; m_JoyShoulderL[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_SHOULDER_R: case IDB_SHOULDER_R:
m_JoyShoulderR[controller]->SetValue(wxString::FromAscii(text)); break; m_JoyShoulderR[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_A: case IDB_BUTTON_A:
m_JoyButtonA[controller]->SetValue(wxString::FromAscii(text)); break; m_JoyButtonA[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_B: case IDB_BUTTON_B:
{ m_JoyButtonB[controller]->SetValue(wxString::FromAscii(text)); break;
m_JoyButtonB[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_BUTTON_X: case IDB_BUTTON_X:
{ m_JoyButtonX[controller]->SetValue(wxString::FromAscii(text)); break;
m_JoyButtonX[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_BUTTON_Y: case IDB_BUTTON_Y:
m_JoyButtonY[controller]->SetValue(wxString::FromAscii(text)); break; m_JoyButtonY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTON_Z: case IDB_BUTTON_Z:
m_JoyButtonZ[controller]->SetValue(wxString::FromAscii(text)); break; m_JoyButtonZ[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_BUTTONSTART: case IDB_BUTTONSTART:
{ m_JoyButtonStart[controller]->SetValue(wxString::FromAscii(text)); break;
m_JoyButtonStart[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_BUTTONHALFPRESS: case IDB_BUTTONHALFPRESS:
{ m_JoyButtonHalfpress[controller]->SetValue(wxString::FromAscii(text)); break;
m_JoyButtonHalfpress[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_DPAD_UP:
{
m_JoyDpadUp[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_DPAD_DOWN:
{
m_JoyDpadDown[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_DPAD_LEFT:
{
m_JoyDpadLeft[controller]->SetValue(wxString::FromAscii(text));
}
break;
case IDB_DPAD_RIGHT:
m_JoyDpadRight[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_MAIN_X:
m_JoyAnalogMainX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_MAIN_Y:
m_JoyAnalogMainY[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_SUB_X:
m_JoyAnalogSubX[controller]->SetValue(wxString::FromAscii(text)); break;
case IDB_ANALOG_SUB_Y:
m_JoyAnalogSubY[controller]->SetValue(wxString::FromAscii(text)); break;
default: default:
break; break;
@ -240,7 +213,7 @@ void ConfigBox::SetButtonText(int id, char text[128])
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Condifigure button mapping // Configure button mapping
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ -261,23 +234,37 @@ bool AvoidValues(int value)
// Wait for button press // Wait for button press
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/* Loop or timer: There are basically two ways to do this. With a while() or for() loop, or with a
timer. The downside with the while() or for() loop is that there is no way to stop it if the user
should select to configure another button while we are still in an old loop. What will happen then
is that we start another parallel loop (at least in Windows) that blocks the old loop. And our only
option to wait for the old loop to finish is with a new loop, and that will block the old loop for as
long as it's going on. Therefore a timer is easier to control. */
void ConfigBox::GetButtons(wxCommandEvent& event) void ConfigBox::GetButtons(wxCommandEvent& event)
{ {
DoGetButtons(event.GetId());
}
void ConfigBox::DoGetButtons(int GetId)
{
// =============================================
// Collect the starting values
// ----------------
// Get the current controller // Get the current controller
int controller = notebookpage; int Controller = notebookpage;
// Get the ID for the wxWidgets button that was pressed
int ID = event.GetId();
// Collect the accepted buttons for this slot // Collect the accepted buttons for this slot
bool Axis = (event.GetId() >= IDB_ANALOG_MAIN_X && event.GetId() <= IDB_SHOULDER_R); bool LeftRight = (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R);
bool Button = (event.GetId() >= IDB_BUTTON_A && event.GetId() <= IDB_BUTTONSTART) bool Axis = (GetId >= IDB_ANALOG_MAIN_X && GetId <= IDB_SHOULDER_R);
|| (event.GetId() == IDB_SHOULDER_L || event.GetId() == IDB_SHOULDER_R); bool Button = (GetId >= IDB_BUTTON_A && GetId <= IDB_BUTTONSTART)
bool Hat = (event.GetId() >= IDB_DPAD_UP && event.GetId() <= IDB_DPAD_RIGHT); || (GetId == IDB_SHOULDER_L || GetId == IDB_SHOULDER_R)
|| (GetId >= IDB_DPAD_UP && GetId <= IDB_DPAD_RIGHT && joysticks[Controller].controllertype == CTL_DPAD_CUSTOM);
bool Hat = (GetId >= IDB_DPAD_UP && GetId <= IDB_DPAD_RIGHT)
&& (joysticks[Controller].controllertype == CTL_DPAD_HAT);
/* Open a new joystick. Joysticks[controller].ID is the system ID of the physical joystick /* Open a new joystick. Joysticks[controller].GetId is the system GetId of the physical joystick
that is mapped to controller, for example 0, 1, 2, 3 for the first four joysticks */ that is mapped to controller, for example 0, 1, 2, 3 for the first four joysticks */
SDL_Joystick *joy = SDL_JoystickOpen(joysticks[controller].ID); SDL_Joystick *joy = SDL_JoystickOpen(joysticks[Controller].ID);
// Get the number of axes, hats and buttons // Get the number of axes, hats and buttons
int buttons = SDL_JoystickNumButtons(joy); int buttons = SDL_JoystickNumButtons(joy);
@ -287,18 +274,47 @@ void ConfigBox::GetButtons(wxCommandEvent& event)
// Declare values // Declare values
char format[128]; char format[128];
int value; // Axis value int value; // Axis value
bool waiting = true; int type; // Button type
bool succeed = false; bool Succeed = false;
bool Stop = false; // Stop the timer
int pressed = 0; int pressed = 0;
int counter1 = 0; // Waiting limits int Seconds = 4; // Seconds to wait for
int counter2 = 30; // Iterations to wait for int TimesPerSecond = 40; // How often to run the check
// =======================
// Update the text box //Console::Print("Before (%i) Id:%i %i IsRunning:%i\n",
sprintf(format, "[%d]", counter2); // GetButtonWaitingTimer, GetButtonWaitingID, GetId, m_ButtonMappingTimer->IsRunning());
SetButtonText(ID, format);
wxWindow::Update(); // Win only? doesnt seem to work in linux...
while(waiting) // If the Id has changed or the timer is not running we should start one
if( GetButtonWaitingID != GetId || !m_ButtonMappingTimer->IsRunning() )
{
if(m_ButtonMappingTimer->IsRunning())
{
m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0;
// Update the old textbox
SetButtonText(GetButtonWaitingID, "");
}
// Save the button Id
GetButtonWaitingID = GetId;
// Reset the key in case we happen to have an old one
g_Pressed = 0;
// Update the text box
sprintf(format, "[%d]", Seconds);
SetButtonText(GetId, format);
// Start the timer
#if wxUSE_TIMER
m_ButtonMappingTimer->Start( floor((double)(1000 / TimesPerSecond)) );
#endif
}
// If there is a timer but we should not create a new one
else
{ {
// Update the internal status // Update the internal status
SDL_JoystickUpdate(); SDL_JoystickUpdate();
@ -312,10 +328,9 @@ void ConfigBox::GetButtons(wxCommandEvent& event)
if(AvoidValues(value)) continue; // Avoid values if(AvoidValues(value)) continue; // Avoid values
pressed = i; pressed = i + (LeftRight ? 1000 : 0); // Identify the analog triggers
waiting = false; type = CTL_AXIS;
succeed = true; Succeed = true;
break; // Stop this loop
} }
} }
@ -324,13 +339,11 @@ void ConfigBox::GetButtons(wxCommandEvent& event)
{ {
for(int i = 0; i < hats; i++) for(int i = 0; i < hats; i++)
{ {
value = SDL_JoystickGetHat(joy, i); if(SDL_JoystickGetHat(joy, i))
if(value)
{ {
pressed = value; pressed = i;
waiting = false; type = CTL_HAT;
succeed = true; Succeed = true;
break;
} }
} }
} }
@ -342,25 +355,23 @@ void ConfigBox::GetButtons(wxCommandEvent& event)
{ {
if(SDL_JoystickGetButton(joy, i)) if(SDL_JoystickGetButton(joy, i))
{ {
pressed = i; pressed = i;
waiting = false; type = CTL_BUTTON;
succeed = true; Succeed = true;
break;
} }
} }
} }
// Check for keyboard action // Check for keyboard action
if (g_Pressed) if (g_Pressed && Button)
{ {
// Todo: Add a separate keyboard vector to remove this restriction // Todo: Add a separate keyboard vector to remove this restriction
if(g_Pressed >= buttons) if(g_Pressed >= buttons)
{ {
pressed = g_Pressed; pressed = g_Pressed;
waiting = false; type = CTL_BUTTON;
succeed = true; Succeed = true;
g_Pressed = 0; g_Pressed = 0;
break;
} }
else else
{ {
@ -370,48 +381,66 @@ void ConfigBox::GetButtons(wxCommandEvent& event)
, wxT("Notice"), wxICON_INFORMATION); , wxT("Notice"), wxICON_INFORMATION);
pressed = g_Pressed; pressed = g_Pressed;
waiting = false; Succeed = false;
succeed = false; g_Pressed = 0;
g_Pressed = 0;
break;
} }
} }
// Stop waiting for a button // Count each time
counter1++; GetButtonWaitingTimer++;
if(counter1 == 25)
// This is run every second
if(GetButtonWaitingTimer % TimesPerSecond == 0)
{ {
counter1 = 0; //Console::Print("Second\n\n");
counter2--;
// Current time
sprintf(format, "[%d]", counter2); int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond);
SetButtonText(ID, format);
wxWindow::Update(); // win only? doesnt seem to work in linux... // Update text
wxYieldIfNeeded(); // Let through the keyboard input event sprintf(format, "[%d]", TmpTime);
if(counter2 < 0) waiting = false; SetButtonText(GetId, format);
} }
// Sleep for 10 ms then poll for keys again // Time's up
SLEEP(10); if( (GetButtonWaitingTimer / TimesPerSecond) >= Seconds )
{
// Debugging Stop = true;
/*
m_pStatusBar->SetLabel(wxString::Format( // Leave a blank mapping
"ID: %i %i", SetButtonText(GetId, "");
counter1, NumKeys }
));
*/ // If we got a button
if(Succeed)
{
Stop = true;
// Write the number of the pressed button to the text box
sprintf(format, "%d", pressed);
SetButtonText(GetId, format);
}
} }
// Write the number of the pressed button to the text box // Stop the timer
sprintf(format, "%d", succeed ? pressed : -1); if(Stop)
SetButtonText(ID, format); {
m_ButtonMappingTimer->Stop();
GetButtonWaitingTimer = 0;
}
// We don't need thisgamepad handle any more // We don't need thisgamepad handle any more
if(SDL_JoystickOpened(joysticks[controller].ID)) SDL_JoystickClose(joy); if(SDL_JoystickOpened(joysticks[Controller].ID)) SDL_JoystickClose(joy);
// Update the button mapping
SaveButtonMapping(Controller);
// Debugging
//Console::Print("IsRunning: %i\n", m_ButtonMappingTimer->IsRunning());
} }
#if 0
// Wait for Analog // Wait for Analog
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ConfigBox::GetAxis(wxCommandEvent& event) void ConfigBox::GetAxis(wxCommandEvent& event)
@ -476,7 +505,7 @@ void ConfigBox::GetAxis(wxCommandEvent& event)
SDL_JoystickClose(joy); SDL_JoystickClose(joy);
// Update the axises for the advanced settings status // Update the axises for the advanced settings status
GetControllerAll(controller); SaveButtonMapping(controller);
} }
@ -530,5 +559,6 @@ void ConfigBox::GetHats(int ID)
if(SDL_JoystickOpened(joysticks[controller].ID)) if(SDL_JoystickOpened(joysticks[controller].ID))
SDL_JoystickClose(joy); SDL_JoystickClose(joy);
} }
#endif
/////////////////////////////////////////////////////////// Configure button mapping /////////////////////////////////////////////////////////// Configure button mapping

View File

@ -155,6 +155,7 @@ BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle
} }
#endif #endif
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Input Plugin Functions (from spec's) // Input Plugin Functions (from spec's)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ -193,7 +194,7 @@ void DllConfig(HWND _hParent)
_PADInitialize.hWnd = NULL; _PADInitialize.hWnd = NULL;
_PADInitialize.pLog = NULL; _PADInitialize.pLog = NULL;
Initialize((void*)&_PADInitialize); Initialize((void*)&_PADInitialize);
emulator_running = FALSE; // Set it back to false emulator_running = false; // Set it back to false
} }
g_Config.Load(); // Load settings g_Config.Load(); // Load settings
@ -230,8 +231,16 @@ void DllDebugger(HWND _hParent, bool Show) {
// Init PAD (start emulation) // Init PAD (start emulation)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/* Information: This function can not be run twice without a Shutdown in between. If
it's run twice the SDL_Init() will cause a crash. One solution to this is to keep a
global function that remembers the SDL_Init() and SDL_Quit() (emulator_running does
not do that since we can open and close this without any game running). But I would
suggest that avoiding to run this twice from the Core is better. */
void Initialize(void *init) void Initialize(void *init)
{ {
// Debugging
//Console::Open();
SPADInitialize _PADInitialize = *(SPADInitialize*)init; SPADInitialize _PADInitialize = *(SPADInitialize*)init;
emulator_running = true; emulator_running = true;
#ifdef _DEBUG #ifdef _DEBUG
@ -251,7 +260,7 @@ void Initialize(void *init)
} }
#ifdef _WIN32 #ifdef _WIN32
m_hWnd = (HWND)_PADInitialize.hWnd; m_hWnd = (HWND)_PADInitialize.hWnd;
#endif #endif
Search_Devices(); // Populate joyinfo for all attached devices Search_Devices(); // Populate joyinfo for all attached devices
@ -334,11 +343,11 @@ int Search_Devices()
// Shutdown PAD (stop emulation) // Shutdown PAD (stop emulation)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Called from: The Dolphin Core /* Information: This function can not be run twice without an Initialize in between. If
it's run twice the SDL_...() functions below will cause a crash.
Called from: The Dolphin Core, ConfigBox::OnClose() */
void Shutdown() void Shutdown()
{ {
//if(!emulator_running) return;
if (joysticks[0].enabled && SDL_JoystickOpened(joysticks[0].ID)) if (joysticks[0].enabled && SDL_JoystickOpened(joysticks[0].ID))
SDL_JoystickClose(joystate[0].joy); SDL_JoystickClose(joystate[0].joy);
if (joysticks[1].enabled && SDL_JoystickOpened(joysticks[1].ID)) if (joysticks[1].enabled && SDL_JoystickOpened(joysticks[1].ID))
@ -367,11 +376,10 @@ void Shutdown()
#endif #endif
} }
// Set buttons status from wxWidgets in the main application // Set buttons status from wxWidgets in the main application
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void PAD_Input(u8 _Key, u8 _UpDown) void PAD_Input(u16 _Key, u8 _UpDown)
{ {
// Check if the keys are interesting, and then update it // Check if the keys are interesting, and then update it
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
@ -381,13 +389,25 @@ void PAD_Input(u8 _Key, u8 _UpDown)
if (joysticks[i].buttons[j] == _Key) if (joysticks[i].buttons[j] == _Key)
{ joystate[i].buttons[j] = _UpDown; break; } { joystate[i].buttons[j] = _UpDown; break; }
} }
for(int j = CTL_D_PAD_UP; j <= CTL_D_PAD_RIGHT; j++)
{
if (joysticks[i].dpad2[j] == _Key)
{ joystate[i].dpad2[j] = _UpDown; break; }
}
} }
// Debugging
//Console::Print("%i", _Key);
} }
void DoState(unsigned char **ptr, int mode) {
}
// Set PAD status. // Save state
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DoState(unsigned char **ptr, int mode) {}
// Set PAD status
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Called from: SerialInterface_Devices.cpp // Called from: SerialInterface_Devices.cpp
// Function: Gives the current pad status to the Core // Function: Gives the current pad status to the Core
@ -399,20 +419,24 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
// Clear pad status // Clear pad status
memset(_pPADStatus, 0, sizeof(SPADStatus)); memset(_pPADStatus, 0, sizeof(SPADStatus));
// Get pad status // Update the pad status
GetJoyState(_numPAD); GetJoyState(_numPAD);
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Set analog controllers // The analog controls
// ----------- // -----------
// Read values // Read axis values
int i_main_stick_x = joystate[_numPAD].axis[CTL_MAIN_X]; int i_main_stick_x = joystate[_numPAD].axis[CTL_MAIN_X];
int i_main_stick_y = -joystate[_numPAD].axis[CTL_MAIN_Y]; int i_main_stick_y = -joystate[_numPAD].axis[CTL_MAIN_Y];
int i_sub_stick_x = joystate[_numPAD].axis[CTL_SUB_X]; int i_sub_stick_x = joystate[_numPAD].axis[CTL_SUB_X];
int i_sub_stick_y = -joystate[_numPAD].axis[CTL_SUB_Y]; int i_sub_stick_y = -joystate[_numPAD].axis[CTL_SUB_Y];
// This assumes the trigger is -0x8000 when unpressed
int SDLTriggerLeft = joystate[_numPAD].axis[CTL_L_SHOULDER];
int SDLTriggerRight = joystate[_numPAD].axis[CTL_R_SHOULDER];
// Check if we should make adjustments // Check if we should make adjustments
if(g_Config.bSquareToCircle.at(_numPAD)) if(g_Config.bSquareToCircle.at(_numPAD))
{ {
@ -421,13 +445,15 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
i_main_stick_y = main_xy.at(1); i_main_stick_y = main_xy.at(1);
} }
// Convert button values from 0xffff to 0xff // Convert axis values from 0xffff to 0xff
u8 main_stick_x = Pad_Convert(i_main_stick_x); u8 main_stick_x = Pad_Convert(i_main_stick_x);
u8 main_stick_y = Pad_Convert(i_main_stick_y); u8 main_stick_y = Pad_Convert(i_main_stick_y);
u8 sub_stick_x = Pad_Convert(i_sub_stick_x); u8 sub_stick_x = Pad_Convert(i_sub_stick_x);
u8 sub_stick_y = Pad_Convert(i_sub_stick_y); u8 sub_stick_y = Pad_Convert(i_sub_stick_y);
u8 TriggerLeft = Pad_Convert(SDLTriggerLeft);
u8 TriggerRight = Pad_Convert(SDLTriggerRight);
// Set Deadzones perhaps out of function // Set Deadzones (perhaps out of function?)
int deadzone = (int)(((float)(128.00/100.00)) * (float)(joysticks[_numPAD].deadzone + 1)); int deadzone = (int)(((float)(128.00/100.00)) * (float)(joysticks[_numPAD].deadzone + 1));
int deadzone2 = (int)(((float)(-128.00/100.00)) * (float)(joysticks[_numPAD].deadzone + 1)); int deadzone2 = (int)(((float)(-128.00/100.00)) * (float)(joysticks[_numPAD].deadzone + 1));
@ -439,27 +465,32 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Set buttons // The L and R triggers
// ----------- // -----------
// The L and R trigger values
int triggervalue = 255; int triggervalue = 255;
if (joystate[_numPAD].halfpress) triggervalue = 100; if (joystate[_numPAD].halfpress) triggervalue = 100;
_pPADStatus->button |= PAD_USE_ORIGIN; // Neutral value, no button pressed
// Neutral button value, no button pressed
_pPADStatus->button |= PAD_USE_ORIGIN;
if (joystate[_numPAD].buttons[CTL_L_SHOULDER]) if (joystate[_numPAD].buttons[CTL_L_SHOULDER])
{ {
_pPADStatus->button|=PAD_TRIGGER_L; _pPADStatus->button |= PAD_TRIGGER_L;
_pPADStatus->triggerLeft = triggervalue; _pPADStatus->triggerLeft = triggervalue;
} }
else if(joystate[_numPAD].axis[CTL_L_SHOULDER])
_pPADStatus->triggerLeft = triggervalue;
if (joystate[_numPAD].buttons[CTL_R_SHOULDER]) if (joystate[_numPAD].buttons[CTL_R_SHOULDER])
{ {
_pPADStatus->button|=PAD_TRIGGER_R; _pPADStatus->button |= PAD_TRIGGER_R;
_pPADStatus->triggerRight = triggervalue; _pPADStatus->triggerRight = TriggerLeft;
} }
else if(joystate[_numPAD].axis[CTL_R_SHOULDER])
_pPADStatus->triggerRight = TriggerRight;
///////////////////////////////////////////////////
// The digital buttons
// -----------
if (joystate[_numPAD].buttons[CTL_A_BUTTON]) if (joystate[_numPAD].buttons[CTL_A_BUTTON])
{ {
_pPADStatus->button |= PAD_BUTTON_A; _pPADStatus->button |= PAD_BUTTON_A;
@ -475,8 +506,11 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
if (joystate[_numPAD].buttons[CTL_Z_TRIGGER]) _pPADStatus->button|=PAD_TRIGGER_Z; if (joystate[_numPAD].buttons[CTL_Z_TRIGGER]) _pPADStatus->button|=PAD_TRIGGER_Z;
if (joystate[_numPAD].buttons[CTL_START]) _pPADStatus->button|=PAD_BUTTON_START; if (joystate[_numPAD].buttons[CTL_START]) _pPADStatus->button|=PAD_BUTTON_START;
// Set D-pad
if (joysticks[_numPAD].controllertype == CTL_TYPE_JOYSTICK) ///////////////////////////////////////////////////
// The D-pad
// -----------
if (joysticks[_numPAD].controllertype == CTL_DPAD_HAT)
{ {
if (joystate[_numPAD].dpad == SDL_HAT_LEFTUP || joystate[_numPAD].dpad == SDL_HAT_UP || joystate[_numPAD].dpad == SDL_HAT_RIGHTUP ) _pPADStatus->button|=PAD_BUTTON_UP; if (joystate[_numPAD].dpad == SDL_HAT_LEFTUP || joystate[_numPAD].dpad == SDL_HAT_UP || joystate[_numPAD].dpad == SDL_HAT_RIGHTUP ) _pPADStatus->button|=PAD_BUTTON_UP;
if (joystate[_numPAD].dpad == SDL_HAT_LEFTUP || joystate[_numPAD].dpad == SDL_HAT_LEFT || joystate[_numPAD].dpad == SDL_HAT_LEFTDOWN ) _pPADStatus->button|=PAD_BUTTON_LEFT; if (joystate[_numPAD].dpad == SDL_HAT_LEFTUP || joystate[_numPAD].dpad == SDL_HAT_LEFT || joystate[_numPAD].dpad == SDL_HAT_LEFTDOWN ) _pPADStatus->button|=PAD_BUTTON_LEFT;
@ -500,9 +534,36 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
// Use rumble // Use rumble
Pad_Use_Rumble(_numPAD, _pPADStatus); Pad_Use_Rumble(_numPAD, _pPADStatus);
/* Debugging
Console::ClearScreen();
Console::Print("TriggerLeft:%04x TriggerRight:%04x\nD-Pad type: %s L:%i R:%i U:%i D:%i",
TriggerLeft, TriggerRight,
(joysticks[_numPAD].controllertype ? "CTL_DPAD_CUSTOM" : "CTL_DPAD_HAT")
); */
} }
// Set PAD attached pads
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int PAD_GetAttachedPads()
{
unsigned int connected = 0;
g_Config.Load();
if (joysticks[0].enabled) connected |= 1;
if (joysticks[1].enabled) connected |= 2;
if (joysticks[2].enabled) connected |= 4;
if (joysticks[3].enabled) connected |= 8;
return connected;
}
///////////////////////////////////////////////// Spec functions
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Convert stick values, for example from circle to square analog stick radius // Convert stick values, for example from circle to square analog stick radius
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ -568,7 +629,7 @@ std::vector<int> Pad_Square_to_Circle(int _x, int _y)
if(_x > 32767) _x = 32767; if(_y > 32767) _y = 32767; // upper limit if(_x > 32767) _x = 32767; if(_y > 32767) _y = 32767; // upper limit
if(_x < -32768) _x = -32768; if(_y > 32767) _y = 32767; // lower limit if(_x < -32768) _x = -32768; if(_y > 32767) _y = 32767; // lower limit
/////////////////////////////////////////////////// // ====================================
// Convert to circle // Convert to circle
// ----------- // -----------
int Tmp = atoi (g_Config.SDiagonal.substr(0, g_Config.SDiagonal.length() - 1).c_str()); int Tmp = atoi (g_Config.SDiagonal.substr(0, g_Config.SDiagonal.length() - 1).c_str());
@ -611,30 +672,14 @@ std::vector<int> Pad_Square_to_Circle(int _x, int _y)
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Set PAD attached pads
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int PAD_GetAttachedPads()
{
unsigned int connected = 0;
g_Config.Load();
if (joysticks[0].enabled) connected |= 1;
if (joysticks[1].enabled) connected |= 2;
if (joysticks[2].enabled) connected |= 4;
if (joysticks[3].enabled) connected |= 8;
return connected;
}
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Read current joystick status // Supporting functions: Read current joystick status
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
The value joysticks[].buttons[] is the number of the assigned joypad button, The value joysticks[].buttons[] is the number of the assigned joypad button,
joystate[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */ joystate[].buttons[] is the status of the button, it becomes 0 (no pressed) or 1 (pressed) */
// Read buttons status. Called from GetJoyState(). // Read buttons status. Called from GetJoyState().
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ReadButton(int controller, int button) void ReadButton(int controller, int button)
@ -653,12 +698,25 @@ void ReadButton(int controller, int button)
for a virtual controller 0 to 3. */ for a virtual controller 0 to 3. */
void GetJoyState(int controller) void GetJoyState(int controller)
{ {
// Update the gamepad status
SDL_JoystickUpdate(); SDL_JoystickUpdate();
// Save the number of buttons
int Buttons = joyinfo[joysticks[controller].ID].NumButtons;
// Update axis states. It doesn't hurt much if we happen to ask for nonexisting axises here.
joystate[controller].axis[CTL_MAIN_X] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_MAIN_X]); joystate[controller].axis[CTL_MAIN_X] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_MAIN_X]);
joystate[controller].axis[CTL_MAIN_Y] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_MAIN_Y]); joystate[controller].axis[CTL_MAIN_Y] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_MAIN_Y]);
joystate[controller].axis[CTL_SUB_X] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_SUB_X]); joystate[controller].axis[CTL_SUB_X] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_SUB_X]);
joystate[controller].axis[CTL_SUB_Y] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_SUB_Y]); joystate[controller].axis[CTL_SUB_Y] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].axis[CTL_SUB_Y]);
joystate[controller].axis[CTL_L_SHOULDER] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].buttons[CTL_L_SHOULDER] - 1000);
joystate[controller].axis[CTL_R_SHOULDER] = SDL_JoystickGetAxis(joystate[controller].joy, joysticks[controller].buttons[CTL_R_SHOULDER] - 1000);
// Debugging
/*
Console::Print("Controller:%i %i\n",
joystate[controller].axis[CTL_L_SHOULDER], joystate[controller].axis[CTL_R_SHOULDER]
); */
ReadButton(controller, CTL_L_SHOULDER); ReadButton(controller, CTL_L_SHOULDER);
ReadButton(controller, CTL_R_SHOULDER); ReadButton(controller, CTL_R_SHOULDER);
@ -674,16 +732,22 @@ void GetJoyState(int controller)
joystate[controller].halfpress = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].halfpress); joystate[controller].halfpress = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].halfpress);
// Check if we have an analog or digital joypad // Check if we have an analog or digital joypad
if (joysticks[controller].controllertype == CTL_TYPE_JOYSTICK) if (joysticks[controller].controllertype == CTL_DPAD_HAT)
{ {
joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad); joystate[controller].dpad = SDL_JoystickGetHat(joystate[controller].joy, joysticks[controller].dpad);
} }
else else
{ {
joystate[controller].dpad2[CTL_D_PAD_UP] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_UP]); /* Only do this if the assigned button is in range (to allow for the current way of saving keyboard
joystate[controller].dpad2[CTL_D_PAD_DOWN] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_DOWN]); keys in the same array) */
joystate[controller].dpad2[CTL_D_PAD_LEFT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_LEFT]); if(joysticks[controller].dpad2[CTL_D_PAD_UP] <= Buttons)
joystate[controller].dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_RIGHT]); joystate[controller].dpad2[CTL_D_PAD_UP] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_UP]);
if(joysticks[controller].dpad2[CTL_D_PAD_DOWN] <= Buttons)
joystate[controller].dpad2[CTL_D_PAD_DOWN] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_DOWN]);
if(joysticks[controller].dpad2[CTL_D_PAD_LEFT] <= Buttons)
joystate[controller].dpad2[CTL_D_PAD_LEFT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_LEFT]);
if(joysticks[controller].dpad2[CTL_D_PAD_RIGHT] <= Buttons)
joystate[controller].dpad2[CTL_D_PAD_RIGHT] = SDL_JoystickGetButton(joystate[controller].joy, joysticks[controller].dpad2[CTL_D_PAD_RIGHT]);
} }
} }
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////

View File

@ -29,9 +29,18 @@
// //
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// Settings
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Set this if you want to use the rumble 'hack' for controller one // Set this if you want to use the rumble 'hack' for controller one
//#define USE_RUMBLE_DINPUT_HACK //#define USE_RUMBLE_DINPUT_HACK
//////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// Includes
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include <vector> // System #include <vector> // System
#include <cstdio> #include <cstdio>
#include <ctime> #include <ctime>
@ -67,21 +76,22 @@
#endif // _WIN32 #endif // _WIN32
#ifdef _WIN32 #ifdef _WIN32
#define SLEEP(x) Sleep(x) #define SLEEP(x) Sleep(x)
#else #else
#include <unistd.h> #include <unistd.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#define SLEEP(x) usleep(x*1000) #define SLEEP(x) usleep(x*1000)
#endif #endif
#ifdef __linux__ #ifdef __linux__
#include <linux/input.h> #include <linux/input.h>
#endif #endif
//////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Define // Define
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define INPUT_VERSION "0.3" #define INPUT_VERSION "0.3"
#define INPUT_STATE "PUBLIC RELEASE" #define INPUT_STATE "PUBLIC RELEASE"
@ -96,31 +106,37 @@
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CONTROLLER_STATE buttons (joystate) = 0 or 1 CONTROLLER_STATE buttons (joystate) = 0 or 1
CONTROLLER_MAPPING buttons (joystick) = 0 or 1, 2, 3, 4, a certain joypad button CONTROLLER_MAPPING buttons (joystick) = 0 or 1, 2, 3, 4, a certain joypad button
*/
struct CONTROLLER_STATE{ // GC PAD INFO/STATE Please remember: The axis limit is hardcoded here, if you allow more axises (for
example for analog A and B buttons) you must first incrase the size of the axis array
size here
*/
struct CONTROLLER_STATE // GC PAD INFO/STATE
{
int buttons[8]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons int buttons[8]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons
int dpad; // 1 HAT (8 directions + neutral) int dpad; // Automatic SDL D-Pad (8 directions + neutral)
int dpad2[4]; // d-pad using buttons int dpad2[4]; // D-pad using buttons
int axis[4]; // 2 x 2 Axes (Main & Sub) int axis[6]; // 2 x 2 Axes (Main & Sub)
int halfpress; // ... int halfpress; // Halfpress... you know, like not fully pressed ;)...
SDL_Joystick *joy; // SDL joystick device SDL_Joystick *joy; // SDL joystick device
}; };
struct CONTROLLER_MAPPING{ // GC PAD MAPPING struct CONTROLLER_MAPPING // GC PAD MAPPING
int buttons[8]; // Amount of buttons (A B X Y Z, L-Trigger R-Trigger Start) might need to change the triggers buttons {
int dpad; // 1 HAT (8 directions + neutral) int buttons[8]; // (See above)
int dpad2[4]; // d-pad using buttons int dpad; // (See above)
int axis[4]; // 2 x 2 Axes (Main & Sub) int dpad2[4]; // (See above)
int axis[6]; // (See above)
int halfpress; // (See above)
int enabled; // Pad attached? int enabled; // Pad attached?
int deadzone; // Deadzone... what else? int deadzone; // Deadzone... what else?
int halfpress; // Halfpress... you know, like not fully pressed ;)...
int ID; // SDL joystick device ID int ID; // SDL joystick device ID
int controllertype; // Joystick, Joystick with no hat or a keyboard (perhaps a mouse later) int controllertype; // Joystick, Joystick with no hat or a keyboard (perhaps a mouse later)
int eventnum; // Linux Event Number, Can't be found dynamically yet int eventnum; // Linux Event Number, Can't be found dynamically yet
}; };
struct CONTROLLER_INFO{ // CONNECTED WINDOWS DEVICES INFO struct CONTROLLER_INFO // CONNECTED WINDOWS DEVICES INFO
{
int NumAxes; // Amount of Axes int NumAxes; // Amount of Axes
int NumButtons; // Amount of Buttons int NumButtons; // Amount of Buttons
int NumBalls; // Amount of Balls int NumBalls; // Amount of Balls
@ -132,10 +148,11 @@ struct CONTROLLER_INFO{ // CONNECTED WINDOWS DEVICES INFO
enum enum
{ {
CTL_MAIN_X = 0, // CTL_L_SHOULDER and CTL_R_SHOULDER = 0 and 1
CTL_MAIN_X = 2,
CTL_MAIN_Y, CTL_MAIN_Y,
CTL_SUB_X, CTL_SUB_X,
CTL_SUB_Y, CTL_SUB_Y
}; };
enum enum
@ -152,10 +169,8 @@ enum
enum enum
{ {
CTL_TYPE_JOYSTICK = 0, CTL_DPAD_HAT = 0, // Automatically use the first hat that SDL finds
CTL_TYPE_JOYSTICK_NO_HAT, CTL_DPAD_CUSTOM // Custom directional pad settings
CTL_TYPE_JOYSTICK_XBOX360,
CTL_TYPE_KEYBOARD
}; };
enum enum
@ -166,6 +181,15 @@ enum
CTL_D_PAD_RIGHT CTL_D_PAD_RIGHT
}; };
// Button type for the configuration
enum
{
CTL_AXIS = 0,
CTL_HAT,
CTL_BUTTON,
CTL_KEY
};
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// Input vector. Todo: Save the configured keys here instead of in joystick // Input vector. Todo: Save the configured keys here instead of in joystick

View File

@ -273,7 +273,7 @@ void DoState(unsigned char **ptr, int mode) {
// Set buttons status from wxWidgets in the main application // Set buttons status from wxWidgets in the main application
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void PAD_Input(u8 _Key, u8 _UpDown) {} void PAD_Input(u16 _Key, u8 _UpDown) {}