From 7746e6fc6ce2193e698681ae3c8085219112728d Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sat, 4 Apr 2020 20:36:51 +0300 Subject: [PATCH 001/171] Working on NXDK port of calculator2.c --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 6d31f15..f76a874 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -102,9 +102,9 @@ int main() } + debugPrint("Please tell me your desired calculation type. For help enter h.\n"); while (user_command != 'q') { - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); scanf(" %c", &user_command); for(int i = 0; i < ARRAY_SIZE(operations); i++) { From fd5bc770fa70b96d62f85855bf629fe504f1b2e9 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 00:45:01 +0300 Subject: [PATCH 002/171] Started working on a port of my calculator for the 2001 Xbox --- .gitignore | 1 + Maths Calculator (C)/XCalculator.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3f290b7..2c5576f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ Maths Calculator (C)/XCalculator.c.d Maths Calculator (C)/bin/default.xbe Maths Calculator (C)/main.exe Maths Calculator (C)/calculator.iso +Maths Calculator (C)/main.pdb diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index f76a874..c7499a2 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -97,14 +97,19 @@ int main() { if(SDL_IsGameController(i)) { - break; + controller = SDL_GameControllerOpen(i); + if(controller) + { + break; + } + } } - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); while (user_command != 'q') { + debugPrint("Please tell me your desired calculation type. For help enter h.\n"); scanf(" %c", &user_command); for(int i = 0; i < ARRAY_SIZE(operations); i++) { From 24cc5627a18fb85e01f4f0ffebe35a82edc70fd9 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 01:05:10 +0300 Subject: [PATCH 003/171] Started a port of my calculator in C for the 2001 Xbox using the NXDK/SDL libraries --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index c7499a2..312c7b2 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -87,7 +87,7 @@ static float help(float a, float b) int main() { - SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO); + SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO); //Initialize SDL for consoles char user_command = '\0'; float user_input = 1.0f; float result = 0.0f; From f14ab3c25612cafbe9bb948c1eca9ff7b80aa618 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 01:34:14 +0300 Subject: [PATCH 004/171] Added a mappings database and fixed XCalculator boot --- Maths Calculator (C)/XCalculator.c | 23 +- Maths Calculator (C)/gamecontrollerdb.txt | 778 ++++++++++++++++++++++ 2 files changed, 788 insertions(+), 13 deletions(-) create mode 100644 Maths Calculator (C)/gamecontrollerdb.txt diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 312c7b2..98ef883 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -87,12 +87,15 @@ static float help(float a, float b) int main() { + XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO); //Initialize SDL for consoles + SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); char user_command = '\0'; float user_input = 1.0f; float result = 0.0f; SDL_GameController *controller = NULL; + for (int i = 0; i < SDL_NumJoysticks; i++) { if(SDL_IsGameController(i)) @@ -107,25 +110,19 @@ int main() } + debugPrint("Please tell me your desired calculation type. For help enter h.\n"); + while (user_command != 'q') { - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); - scanf(" %c", &user_command); - for(int i = 0; i < ARRAY_SIZE(operations); i++) + + for (int i; icommand == user_command) + if(SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX)) { - if(o->use_default_input == true) - { - debugPrint("Please give me the number you want to use for the operation. "); - scanf(" %f", &user_input); - } - result = o->handler(result, user_input); - debugPrint("Result is %f. Please tell me your next calculation.\n", result); + } + } - } } \ No newline at end of file diff --git a/Maths Calculator (C)/gamecontrollerdb.txt b/Maths Calculator (C)/gamecontrollerdb.txt new file mode 100644 index 0000000..6290e23 --- /dev/null +++ b/Maths Calculator (C)/gamecontrollerdb.txt @@ -0,0 +1,778 @@ +# Game Controller DB for SDL in 2.0.10 format +# Source: https://github.com/gabomdq/SDL_GameControllerDB + +# Windows +03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, +03000000c82d00002038000000000000,8bitdo,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000011ab000000000000,8BitDo F30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00015900000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00065280000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000022000000090000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000203800000900000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003028000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000031000000000000,8BitDo Wireless Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000a00500003232000000000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +030000008f0e00001200000000000000,Acme GA-02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000fa190000f0ff000000000000,Acteck AGJ-3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00001413000000000000,Afterglow,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000001d57000000000000,Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000869800002400000000007801,Astro C40 TR,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000e557000000000000,Batarang,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, +030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000000055000000000000,Betop BFM Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006321000000000000,BETOP CONTROLLER,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series ,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, +03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000005e0400008e02000000000000,Controller (XBOX 360 For Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000a102000000000000,Controller (Xbox 360 Wireless Receiver for Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ff02000000000000,Controller (Xbox One For Windows) - Wired,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ea02000000000000,Controller (Xbox One For Windows) - Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows, +03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000007d0400000840000000000000,Destroyer Tiltpad,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows, +03000000791d00000103000000000000,Dual Box WII,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bd12000002e0000000000000,Dual USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +030000006f0e00003001000000000000,EA SPORTS PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000852100000201000000000000,FF-GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008500000000000000,Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008400000000000000,Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008800000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000260900002625000000000000,Gamecube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00000d31000000000000,GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000280400000140000000000000,GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000ac0500003d03000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500004d04000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00000102000000007801,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000009b2800003200000000000000,GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c283000000000000,Gioteck,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c383000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c483000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000007d0400000540000000000000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d81400000862000000000000,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002605000000000000,HJD-X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001600000000007803,HORI Real Arcade Pro EX-SE (Xbox 360),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006e00000000000000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006600000000000000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000ee00000000000000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000017000000000000,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, +030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00000f00000000000000,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00001000000000000000,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000830500006020000000000000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Windows, +03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +030000006f0e00002401000000000000,INJUSTICE FightStick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000ac0500002c02000000000000,IPEGA,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000204000000000000,Ipega PG-9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000304000000000000,Ipega PG-9087 - Bluetooth Gamepad,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +030000006e0500000a20000000000000,JC-DUX60 ELECOM MMO Gamepad,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows, +030000006e0500000520000000000000,JC-P301U,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000320000000000000,JC-U3613M (DInput),a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000720000000000000,JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, +030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000bd12000003c0000000000000,JY-P70UR,a:b1,b:b0,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b4,x:b3,y:b2,platform:Windows, +03000000242f00002d00000000000000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00008a00000000000000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, +030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000018c2000000000000,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000019c2000000000000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006652000000000000,Mad Catz C.T.R.L.R,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005032000000000000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005082000000000000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008433000000000000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008483000000000000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008134000000000000,Mad Catz FightStick TE2+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008184000000000000,Mad Catz FightStick TE2+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006252000000000000,Mad Catz Micro C.T.R.L.R,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008532000000000000,Madcatz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700003888000000000000,Madcatz Arcade Fightstick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700001888000000000000,MadCatz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700008081000000000000,MADCATZ SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002418000000000000,Mega Drive,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000380700006382000000000000,MLG GamePad PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Windows, +03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000bd12000015d0000000000000,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows, +03000000550900001472000000000000,NVIDIA Controller v01.04,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows, +030000004b120000014d000000000000,NYKO AIRFLO,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, +03000000782300000a10000000000000,Onlive Wireless Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows, +03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000362800000100000000000000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows, +03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002306000000000000,PS Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000e30500009605000000000000,PS to USB convert cable,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, +030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, +030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, +03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000003807000056a8000000000000,PS3 RF pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100000008200000000000000,PS360+ v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00000011000000000000,QanBa Arcade JoyStick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, +03000000300f00001611000000000000,QanBa Arcade JoyStick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +03000000222c00000020000000000000,QANBA DRONE ARCADE JOYSTICK,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001210000000000000,QanBa Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000341a00000104000000000000,QanBa Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, +03000000222c00000223000000000000,Qanba Obsidian Arcade Joystick PS3 Mode,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000023000000000000,Qanba Obsidian Arcade Joystick PS4 Mode,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000321500000204000000000000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000104000000000000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00001100000000000000,REAL ARCADE PRO.3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00007000000000000000,REAL ARCADE PRO.4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002200000000000000,REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005b00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005c00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000001100000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000020d000000000000,Revolution Pro Controller 2(1/2),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000003d0000000000000,run'n'drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b0,y:b1,platform:Windows, +03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,x:b0,y:b1,platform:Windows, +03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600002106000000000000,Saitek PS1000,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000020f6000000000000,Saitek PS2700,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +030000005e0400008e02000000007801,ShanWan PS3/PC Wired GamePad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000208000000000000,SL-6555-SBK,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000908000000000000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000800000000000000,SpeedLink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, +03000000790000001c18000000000000,STK-7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ff1100003133000000000000,SVEN X-PAD,a:b2,b:b3,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a4,start:b5,x:b0,y:b1,platform:Windows, +03000000d620000011a7000000000000,Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000007d0000000000000,T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ab1000000000000,T.16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows, +03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000023b3000000000000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, +030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000666600000488000000000000,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, +03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000006e0500001320000000000000,U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000300f00000701000000000000,USB 4-Axis 12-Button Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000341a00002308000000000000,USB gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000005509000000b4000000000000,USB gamepad,a:b10,b:b11,back:b5,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,guide:b14,leftshoulder:b8,leftstick:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b4,x:b12,y:b13,platform:Windows, +030000006b1400000203000000000000,USB gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000000a00000000000000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c183000000000000,USB gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ff1100004133000000000000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002305000000000000,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:+a3,righty:+a4,start:b4,x:b2,y:b3,platform:Windows, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000450c00002043000000000000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000ac0500005b05000000000000,Xiaoji Gamesir-G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000172700004431000000000000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000790000004f18000000000000,ZD-T Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, + +# Mac OS X +030000008f0e00000300000009010000,2In1 USB Joystick,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000022000000090000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000190000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000102800000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000031000001000000,8BitDo Wireless Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000009010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000ad1b000001f9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000102000000000000,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007d0400000540000001010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000000000,HORI Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000000000,HORI Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00004d00000000000000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006e00000000010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000000000,HORIPAD FPS PLUS 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000ee00000000010000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000830500006020000000010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, +03000000830500006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000242f00002d00000007010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006d04000018c2000000010000,Logitech RumblePad 2 USB,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005032000000010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005082000000010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, +0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, +03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +03000000d8140000cecf000000000000,MC Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000005e0400002700000001010000,Microsoft SideWinder Plug & Play Game Pad,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,leftx:a0,lefty:a1,righttrigger:b5,x:b2,y:b3,platform:Mac OS X, +03000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000632500007505000000020000,NEOGEO mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, +030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000011a7000000020000,Nintendo Switch Core (Plus) Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c050000da0c000000010000,Playstation Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000321500000204000000010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000104000000010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000010000000010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000790000001100000000000000,Retrolink Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a3,lefty:a4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000c6240000fefa000000000000,Rock Candy Gamepad for PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Mac OS X, +03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, +03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, +030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X, +030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, +03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000bd12000015d0000000010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000791d00000103000009010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, +050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, +030000005e0400008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000c6240000045d000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000d102000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000e302000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000003090000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000ea02000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000fd02000003090000,Xbox Wireless Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000120c0000100e000000010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, + +# Linux +05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000190000011010000,8Bitdo NES30 Pro 8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000061000000010000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +030000003512000012ab000010010000,8Bitdo SFC30 GamePad,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003028000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +030000005e0400008e02000020010000,8BitDo Wireless Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000031000011010000,8BitDo Wireless Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +03000000120c00000500000010010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000666600006706000000010000,boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, +03000000ffff0000ffff000000010000,Chinese-made Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, +03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000022f6000011010000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000b40400000a01000000010000,CYPRESS USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, +03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +030000004f04000004b3000010010000,Dual Power 2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00000800000010010000,Gasia Co. Ltd PS(R) Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000007d0400000540000000010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000280400000140000000010000,Gravis GamePad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000610000000010000,GreenAsia Electronics 4Axes 12Keys GamePad ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, +030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, +03000000c9110000f055000011010000,HJC Game GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00000d00000000010000,hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftx:b4,lefty:b5,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, +030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000c100000011010000,HORI CO. LTD. HORIPAD S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006a00000011010000,HORI CO. LTD. Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006b00000011010000,HORI CO. LTD. Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005f00000011010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005e00000011010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001600000000010000,Hori Real Arcade Pro.EX-SE (Xbox 360),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00006e00000011010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006600000011010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000ee00000011010000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006700000001010000,HORIPAD ONE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, +03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +050000006964726f69643a636f6e0000,idroid:con,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001503000010010000,impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000d80400008200000003000000,IMS PCU#0 Gamepad Interface,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, +03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux, +0500000049190000020400001b010000,Ipega PG-9069 - Bluetooth Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +03000000242f00002d00000011010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00008a00000011010000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000019200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400000ac2000010010000,Logitech Inc. WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux, +030000006d04000015c2000010010000,Logitech Logitech Extreme 3D,a:b0,b:b4,back:b6,guide:b8,leftshoulder:b9,leftstick:h0.8,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:h0.2,start:b7,x:b2,y:b5,platform:Linux, +030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, +05000000380700006652000025010000,Mad Catz C.T.R.L.R ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005032000011010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005082000011010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000380700008034000011010000,Mad Catz fightstick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008084000011010000,Mad Catz fightstick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008433000011010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008483000011010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller (SFIV),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +03000000790000004318000010010000,Mayflash GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0300000025090000e803000001010000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400008e02000004010000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000062230000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000050b000003090000,Microsoft X-Box One Elite 2 pad,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000e302000003020000,Microsoft X-Box One Elite pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000001010000,Microsoft X-Box One pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000dd02000003020000,Microsoft X-Box One pad (Firmware 2015),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +03000000c62400001a53000000010000,Mini PE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000250900006688000000010000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Linux, +060000007e0500000820000000000000,Nintendo Combined Joy-Cons (joycond),a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, +03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000005e0400000202000000010000,Old Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +03000000830500005020000010010000,Padix Co. Ltd. Rockfire PSX/USB Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, +03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000a802000023020000,PDP Wired Controller for Xbox One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000004c050000da0c000011010000,Playstation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000300f00001211000011010000,QanBa Arcade JoyStick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, +030000009b2800003200000001010000,raphnet technologies GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, +030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000204000011010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000104000011010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000010000011010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000790000001100000010010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, +0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, +03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, +03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, +03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000a306000020f6000011010000,Saitek PS2700 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, +03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,platform:Linux, +03000000f025000021c1000010010000,ShanWan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500007505000010010000,SHANWAN PS3/PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000010010000,ShanWan PS3/PC Wired GamePad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000632500002305000010010000,ShanWan USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00000908000010010000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ad1b000038f0000090040000,Street Fighter IV FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,x:b3,y:b5,back:b11,start:b1,leftstick:b10,rightstick:b0,leftshoulder:b6,rightshoulder:b8,leftx:a0,lefty:a1,lefttrigger:b7,righttrigger:b9,platform:Linux, +030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, +030000004f04000026b3000002040000,Thrustmaster Gamepad GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000025b000002020000,Thrustmaster GPX Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000007d0000000010000,Thrustmaster T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000012b3000010010000,Thrustmaster vibrating gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000791d00000103000010010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000000000000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000ea02000001030000,Xbox One Wireless Controller (Model 1708),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000450c00002043000010010000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ac0500005b05000010010000,Xiaoji Gamesir-G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, +03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, + +# Android +05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +64633436313965656664373634323364,Microsoft X-Box 360 pad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, +37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000003720000cf7f3f00,NVIDIA Controller v01.01,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000010720000ffff3f00,NVIDIA Controller v01.03,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000cc090000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +5477696e20555342204a6f7973746963,Twin USB Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, +050000005e040000e00200000ffe3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000fd020000ffff3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f00,Xbox Wireless Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +34356136633366613530316338376136,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, + +# iOS +05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df070000,DUALSHOCK 4 Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, +4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, From f3ad1e0d6458b9937617a2ae44b0cd247e9da769 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 02:29:17 +0300 Subject: [PATCH 005/171] XCalculator is starting to take form! --- .gitignore | 5 ++ Maths Calculator (C)/Makefile | 2 +- Maths Calculator (C)/XCalculator.c | 83 +++++++++++++++++++++++------- 3 files changed, 69 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 2c5576f..dca1d17 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,8 @@ Maths Calculator (C)/bin/default.xbe Maths Calculator (C)/main.exe Maths Calculator (C)/calculator.iso Maths Calculator (C)/main.pdb +Maths Calculator (C)/SDLTest.iso +Maths Calculator (C)/SDLtest.c.d +Maths Calculator (C)/SDLtest.c +Maths Calculator (C)/SDLtest.obj +Maths Calculator (C)/.vscode/settings.json diff --git a/Maths Calculator (C)/Makefile b/Maths Calculator (C)/Makefile index d1903b8..11e4e36 100644 --- a/Maths Calculator (C)/Makefile +++ b/Maths Calculator (C)/Makefile @@ -1,4 +1,4 @@ -XBE_TITLE=calculator +XBE_TITLE=XCalculator GEN_XISO = $(XBE_TITLE).iso SRCS = XCalculator.c NXDK_DIR = /home/kosmas/nxdk/ diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 98ef883..08be110 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -19,6 +19,7 @@ const float rads_per_degree = 0.01745329252; float rads; typedef struct { + const int accessnum; const char command; const char* description; bool use_default_input; @@ -52,21 +53,21 @@ static float power(float a, float b) {return pow(a, b);} static float reset(float a, float b) {a = 0.0f; return a;} static MathOperation operations[] = { - { .command='+', .description="Addition", .use_default_input=true, .handler=addition }, - { .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, - { .command='/', .description="Division", .use_default_input=true, .handler=division }, - { .command='-', .description="Subtraction", .use_default_input=true, .handler=subtraction }, - { .command='r', .description="Square root of result", .use_default_input=false, .handler=squareRoot}, - { .command='s', .description="Sin with angle in degrees", .use_default_input=true, .handler=sinD}, - { .command='S', .description="Sin with angle in radians", .use_default_input=true, .handler=sinR}, - { .command='c', .description="Cos with angle in degrees", .use_default_input=true, .handler=cosD}, - { .command='C', .description="Cos with angle in radians", .use_default_input=true, .handler=cosR}, - { .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, - { .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, - { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, - { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, - { .command='q', .description="Quit", .use_default_input=false, .handler=quit }, - { .command='h', .description="This help page", .use_default_input=false, .handler=help} + { .accessnum='0', .command='+', .description="Addition", .use_default_input=true, .handler=addition }, + { .accessnum='1', .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, + { .accessnum='2', .command='/', .description="Division", .use_default_input=true, .handler=division }, + { .accessnum='3', .command='-', .description="Subtraction", .use_default_input=true, .handler=subtraction }, + { .accessnum='4', .command='r', .description="Square root of result", .use_default_input=false, .handler=squareRoot}, + { .accessnum='5', .command='s', .description="Sin with angle in degrees", .use_default_input=true, .handler=sinD}, + { .accessnum='6', .command='S', .description="Sin with angle in radians", .use_default_input=true, .handler=sinR}, + { .accessnum='7', .command='c', .description="Cos with angle in degrees", .use_default_input=true, .handler=cosD}, + { .accessnum='8', .command='C', .description="Cos with angle in radians", .use_default_input=true, .handler=cosR}, + { .accessnum='9', .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, + { .accessnum='10', .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, + { .accessnum='11', .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, + { .accessnum='12', .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, + { .accessnum='13', .command='q', .description="Quit", .use_default_input=false, .handler=quit }, + { .accessnum='14', .command='h', .description="This help page", .use_default_input=false, .handler=help} }; static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} @@ -79,7 +80,8 @@ static float help(float a, float b) debugPrint("%c: %s\n", o->command, o->description); } - printf("Also note that you start with 0 on the result so your first operation will work with 0 and your number. "); + printf("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); + printf("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); return a; } @@ -90,9 +92,12 @@ int main() XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO); //Initialize SDL for consoles SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); - char user_command = '\0'; + int user_command = 0; float user_input = 1.0f; float result = 0.0f; + const int deadzone = -8000; + int xdir; + int ydir; SDL_GameController *controller = NULL; @@ -111,16 +116,54 @@ int main() } debugPrint("Please tell me your desired calculation type. For help enter h.\n"); - - while (user_command != 'q') + + while (user_command != 13) { for (int i; iaccessnum == user_command) + { + if(o->use_default_input == true) + { + debugPrint("Please give me the number you want to use for the operation. "); + } + result = o->handler(result, user_input); + debugPrint("Result is %f. Please tell me your next calculation.\n", result); + } + } } From 3e13fb07a86d8fda4786464bad821152b8ced3de Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 02:35:23 +0300 Subject: [PATCH 006/171] Improved switch readability --- Maths Calculator (C)/XCalculator.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 08be110..39d640e 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -159,9 +159,34 @@ int main() if(o->use_default_input == true) { debugPrint("Please give me the number you want to use for the operation. "); + switch (SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) < deadzone) + { + case true: + ydir = -1; + break; + + case false: + ydir = 1; + break; + default: + ydir = 0; + break; + } + + switch (ydir) + { + case -1: + i--; + break; + + case 1: + i++; + break; + + default: + break; + } } - result = o->handler(result, user_input); - debugPrint("Result is %f. Please tell me your next calculation.\n", result); } From 7330d93bbdb1122a44d288bd77da6662cfbb047b Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 02:41:26 +0300 Subject: [PATCH 007/171] XCalculator now has all the base code in. Will fix. --- .gitignore | 1 + Maths Calculator (C)/XCalculator.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index dca1d17..4839e47 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ Maths Calculator (C)/SDLtest.c.d Maths Calculator (C)/SDLtest.c Maths Calculator (C)/SDLtest.obj Maths Calculator (C)/.vscode/settings.json +Maths Calculator (C)/XCalculator.iso diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 39d640e..6427534 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -115,7 +115,7 @@ int main() } - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); + debugPrint("Please tell me your desired calculation type. For help enter h (access number 14).\n"); while (user_command != 13) { @@ -154,6 +154,8 @@ int main() user_command = i; + debugPrint(user_command); + if (o->accessnum == user_command) { if(o->use_default_input == true) @@ -176,19 +178,20 @@ int main() switch (ydir) { case -1: - i--; + user_input--; break; case 1: - i++; + user_input++; break; default: break; } } - } - + } result = o->handler(result,user_input); + debugPrint("Result is %f. Please tell me your next calculation.\n", result); + } } From ac5d44558d4378f77878032bd48f7c58627a231a Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 5 Apr 2020 22:16:39 +0300 Subject: [PATCH 008/171] fixed an error in the axis checks. Still doesn't work --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 6427534..4ba9229 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -161,7 +161,7 @@ int main() if(o->use_default_input == true) { debugPrint("Please give me the number you want to use for the operation. "); - switch (SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) < deadzone) + switch (SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) < deadzone) { case true: ydir = -1; From 715bc8d1f3e9b12f941c4018f0ac9e96d125ed34 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 07:42:47 +0300 Subject: [PATCH 009/171] Refactored some of XCalculator. Still doesn't do everything and doesn't work --- .gitignore | 2 + Maths Calculator (C)/XCalculator.c | 156 +++++++++++------------------ 2 files changed, 58 insertions(+), 100 deletions(-) diff --git a/.gitignore b/.gitignore index 4839e47..4f3b4c4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ Maths Calculator (C)/SDLtest.c Maths Calculator (C)/SDLtest.obj Maths Calculator (C)/.vscode/settings.json Maths Calculator (C)/XCalculator.iso +test +test.c diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 4ba9229..0d19672 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -19,7 +19,6 @@ const float rads_per_degree = 0.01745329252; float rads; typedef struct { - const int accessnum; const char command; const char* description; bool use_default_input; @@ -52,22 +51,31 @@ static float power(float a, float b) {return pow(a, b);} static float reset(float a, float b) {a = 0.0f; return a;} +static void Init() +{ + XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); + + SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); //Initialize SDL for consoles + + SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); +} + static MathOperation operations[] = { - { .accessnum='0', .command='+', .description="Addition", .use_default_input=true, .handler=addition }, - { .accessnum='1', .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, - { .accessnum='2', .command='/', .description="Division", .use_default_input=true, .handler=division }, - { .accessnum='3', .command='-', .description="Subtraction", .use_default_input=true, .handler=subtraction }, - { .accessnum='4', .command='r', .description="Square root of result", .use_default_input=false, .handler=squareRoot}, - { .accessnum='5', .command='s', .description="Sin with angle in degrees", .use_default_input=true, .handler=sinD}, - { .accessnum='6', .command='S', .description="Sin with angle in radians", .use_default_input=true, .handler=sinR}, - { .accessnum='7', .command='c', .description="Cos with angle in degrees", .use_default_input=true, .handler=cosD}, - { .accessnum='8', .command='C', .description="Cos with angle in radians", .use_default_input=true, .handler=cosR}, - { .accessnum='9', .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, - { .accessnum='10', .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, - { .accessnum='11', .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, - { .accessnum='12', .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, - { .accessnum='13', .command='q', .description="Quit", .use_default_input=false, .handler=quit }, - { .accessnum='14', .command='h', .description="This help page", .use_default_input=false, .handler=help} + { .command='+', .description="Addition", .use_default_input=true, .handler=addition }, + { .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, + { .command='/', .description="Division", .use_default_input=true, .handler=division }, + { .command='-', .description="Subtraction", .use_default_input=true, .handler=subtraction }, + { .command='r', .description="Square root of result", .use_default_input=false, .handler=squareRoot}, + { .command='s', .description="Sin with angle in degrees", .use_default_input=true, .handler=sinD}, + { .command='S', .description="Sin with angle in radians", .use_default_input=true, .handler=sinR}, + { .command='c', .description="Cos with angle in degrees", .use_default_input=true, .handler=cosD}, + { .command='C', .description="Cos with angle in radians", .use_default_input=true, .handler=cosR}, + { .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, + { .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, + { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, + { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, + { .command='q', .description="Quit", .use_default_input=false, .handler=quit }, + { .command='h', .description="This help page", .use_default_input=false, .handler=help} }; static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} @@ -89,111 +97,59 @@ static float help(float a, float b) int main() { - XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); - SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO); //Initialize SDL for consoles - SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); - int user_command = 0; + const int deadzone = -8000; + + Init(); + + char user_command = '\0'; float user_input = 1.0f; float result = 0.0f; - const int deadzone = -8000; - int xdir; - int ydir; SDL_GameController *controller = NULL; for (int i = 0; i < SDL_NumJoysticks; i++) + { + + if(SDL_IsGameController(i)) { - if(SDL_IsGameController(i)) + controller = SDL_GameControllerOpen(i); + + if(controller) { - controller = SDL_GameControllerOpen(i); - if(controller) - { - break; - } - + break; } - + } + } - debugPrint("Please tell me your desired calculation type. For help enter h (access number 14).\n"); + debugPrint("Please tell me your desired calculation type. For help enter h.\n"); + + while(user_command != 'q') + { + Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); - while (user_command != 13) - { - - for (int i; i deadzone) { - case -1: - i--; - break; - - case 1: i++; - break; - - default: - break; } - user_command = i; - - debugPrint(user_command); - - if (o->accessnum == user_command) + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { - if(o->use_default_input == true) - { - debugPrint("Please give me the number you want to use for the operation. "); - switch (SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) < deadzone) - { - case true: - ydir = -1; - break; - - case false: - ydir = 1; - break; - default: - ydir = 0; - break; - } - - switch (ydir) - { - case -1: - user_input--; - break; - - case 1: - user_input++; - break; - - default: - break; - } - } - } result = o->handler(result,user_input); - debugPrint("Result is %f. Please tell me your next calculation.\n", result); - - + user_command = i; + } + + MathOperation* o = &operations[i]; + debugPrint("Selected mode is: %c", o->command); } + } - + + } \ No newline at end of file From 875a44797a21b1978c0ed360167fe57c1ef0d38c Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 08:28:26 +0300 Subject: [PATCH 010/171] Refactor somewhat complete, doesn't work yet --- Maths Calculator (C)/XCalculator.c | 92 ++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 30 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 0d19672..7705c16 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -10,6 +10,8 @@ #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) + + static float help(float a, float b); static float quit(float a, float b); @@ -51,6 +53,16 @@ static float power(float a, float b) {return pow(a, b);} static float reset(float a, float b) {a = 0.0f; return a;} +char user_command = '\0'; + +const int deadzone = -8000; + +float user_input = 1.0f; + +float result = 0.0f; + +SDL_GameController *controller = NULL; + static void Init() { XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); @@ -75,7 +87,7 @@ static MathOperation operations[] = { { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, { .command='q', .description="Quit", .use_default_input=false, .handler=quit }, - { .command='h', .description="This help page", .use_default_input=false, .handler=help} + { .command='h', .description="Help page", .use_default_input=false, .handler=help} }; static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} @@ -93,19 +105,58 @@ static float help(float a, float b) return a; } +static char getCommand(void) +{ + Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + for (int i; i < ARRAY_SIZE(operations);) + { -int main() + if (Xamount > deadzone) + { + i++; + } + else if (Xamount < deadzone) + { + i--; + } + + MathOperation* o = &operations[i]; + + debugPrint("Selected mode is: %c (%c)", o->command, o->description); + + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + user_command = o->command; + return user_command; + } + } +} + +static float getInput(char a) { - const int deadzone = -8000; + Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY); - Init(); + if (Yamount > deadzone) + { + user_input+=0.001f; + } + else if (Yamount < deadzone) + { + user_input-=0.001f; + } - char user_command = '\0'; - float user_input = 1.0f; - float result = 0.0f; + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + return user_input; + } +} + +int main() +{ + + Init(); - SDL_GameController *controller = NULL; for (int i = 0; i < SDL_NumJoysticks; i++) { @@ -126,29 +177,10 @@ int main() while(user_command != 'q') { - Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); - - for (int i; i < ARRAY_SIZE(operations);) - { + getCommand(); + getInput(user_command); - if (Xamount < deadzone) - { - i--; - } - if (Xamount > deadzone) - { - i++; - } - - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { - user_command = i; - } - - MathOperation* o = &operations[i]; - debugPrint("Selected mode is: %c", o->command); - } - + } From 5449cdef9466446f9ffb6af0506268d6609d3367 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 08:51:28 +0300 Subject: [PATCH 011/171] Refactor complete, supposed to work --- Maths Calculator (C)/XCalculator.c | 46 ++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 7705c16..d71b652 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -133,23 +133,25 @@ static char getCommand(void) } } -static float getInput(char a) +static float getInput() { - Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY); + debugPrint("Please give me the number you want to use for the operation. "); - if (Yamount > deadzone) - { - user_input+=0.001f; - } - else if (Yamount < deadzone) - { - user_input-=0.001f; - } + Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY); - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { - return user_input; - } + if (Yamount > deadzone) + { + user_input+=0.001f; + } + else if (Yamount < deadzone) + { + user_input-=0.001f; + } + + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + return user_input; + } } int main() @@ -178,7 +180,21 @@ int main() while(user_command != 'q') { getCommand(); - getInput(user_command); + + for (int i; i < ARRAY_SIZE(operations); i++) + { + MathOperation* o = &operations[i]; + + if (user_command == o->command) + { + if(o->use_default_input == true) + { + getInput(); + } + result = o->handler(result, user_input); + debugPrint("Result is %f. Please tell me your next calculation.\n", result); + } + } } From 6afe4fdcc56e37936e4f22a52400127596b2d12b Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 08:56:25 +0300 Subject: [PATCH 012/171] XCalculator kinda works now --- Maths Calculator (C)/XCalculator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index d71b652..21e1e8e 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -124,6 +124,7 @@ static char getCommand(void) MathOperation* o = &operations[i]; debugPrint("Selected mode is: %c (%c)", o->command, o->description); + continue; if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { From 92ad04f29921406d7701060e434e62ed6f00df19 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 12:00:29 +0300 Subject: [PATCH 013/171] rafactor complete. Kind of works --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 21e1e8e..36732e9 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -186,7 +186,7 @@ int main() { MathOperation* o = &operations[i]; - if (user_command == o->command) + if (o->command == user_command) { if(o->use_default_input == true) { From c05c6ef000b7675881418e2dfce973e83dfb6a8d Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 14:53:29 +0300 Subject: [PATCH 014/171] Almost working, gotta fix infinite printing --- Maths Calculator (C)/XCalculator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 36732e9..749ed94 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -55,7 +55,7 @@ static float reset(float a, float b) {a = 0.0f; return a;} char user_command = '\0'; -const int deadzone = -8000; +const int deadzone = 8000; float user_input = 1.0f; @@ -116,7 +116,7 @@ static char getCommand(void) { i++; } - else if (Xamount < deadzone) + else if (Xamount < -deadzone) { i--; } From 258613a565e9fa5082b13ca1ab3a4b286afc3eb3 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 16:10:15 +0300 Subject: [PATCH 015/171] changes --- Maths Calculator (C)/XCalculator.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 749ed94..2b8fe00 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -55,7 +55,7 @@ static float reset(float a, float b) {a = 0.0f; return a;} char user_command = '\0'; -const int deadzone = 8000; +const int deadzone = 4000; float user_input = 1.0f; @@ -109,22 +109,21 @@ static char getCommand(void) { Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); - for (int i; i < ARRAY_SIZE(operations);) + for (int i = 0; i < ARRAY_SIZE(operations);) { + MathOperation* o = &operations[i]; if (Xamount > deadzone) { i++; + debugPrint("Selected mode is: %c (%c)", o->command, o->description); } else if (Xamount < -deadzone) { i--; + debugPrint("Selected mode is: %c (%c)", o->command, o->description); } - MathOperation* o = &operations[i]; - - debugPrint("Selected mode is: %c (%c)", o->command, o->description); - continue; if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { @@ -138,11 +137,11 @@ static float getInput() { debugPrint("Please give me the number you want to use for the operation. "); - Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY); + Sint16 Yamount = if (Yamount > deadzone) { - user_input+=0.001f; + user_input += ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000) / 60.0f; } else if (Yamount < deadzone) { From 229859827234e87a12ec0d3f65f941dbdeb6e289 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 16:31:06 +0300 Subject: [PATCH 016/171] Made some changes to test functions individually --- Maths Calculator (C)/XCalculator.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 2b8fe00..9875f33 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -67,6 +67,8 @@ static void Init() { XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); + SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); + SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); //Initialize SDL for consoles SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); @@ -137,17 +139,18 @@ static float getInput() { debugPrint("Please give me the number you want to use for the operation. "); - Sint16 Yamount = + Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); if (Yamount > deadzone) { - user_input += ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000) / 60.0f; + user_input += ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / 60.0f; } else if (Yamount < deadzone) { - user_input-=0.001f; + user_input -= ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / 60.0f; } + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { return user_input; @@ -175,6 +178,8 @@ int main() } } +while(true) { float v = getInput(); debugPrint("getInput * 1000: %d", (int)(v * 1000)); } + debugPrint("Please tell me your desired calculation type. For help enter h.\n"); while(user_command != 'q') From 202e24971b0492a4a3059fae4ebde7cb8111c837 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 16:50:21 +0300 Subject: [PATCH 017/171] changes --- Maths Calculator (C)/XCalculator.c | 32 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 9875f33..b0deb78 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -130,25 +130,37 @@ static char getCommand(void) if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { user_command = o->command; - return user_command; + break; } - } -} + } + return user_command; + +} static float getInput() { - debugPrint("Please give me the number you want to use for the operation. "); + while(true) + { + XVideoWaitForVBlank(); // Wait for next frame + SDL_GameControllerUpdate(); // Update gamepad values - Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + debugPrint("Your current input [*1000] is %d", (int)(user_input*1000.0f)); - if (Yamount > deadzone) - { - user_input += ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / 60.0f; + float Yamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000; // Get input in range -1 to +1 + if (fabsf(Yamount) > 0.2f) + { // Check 20% deadzone + user_input += Yamount / (float)REFRESH_DEFAULT; // Modify input } - else if (Yamount < deadzone) + + // Stop asking for input if the user presses A + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { - user_input -= ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / 60.0f; + break; } +} + +// Return the input +return user_input; if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) From 957731bc994c2f42281d57b31ef3bf412b0ca2a4 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 6 Apr 2020 17:16:04 +0300 Subject: [PATCH 018/171] changes --- Maths Calculator (C)/XCalculator.c | 45 +++++++++++++++++------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index b0deb78..e6afcd5 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -127,15 +127,7 @@ static char getCommand(void) } - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { - user_command = o->command; - break; - } - } - return user_command; - -} + static float getInput() { @@ -152,21 +144,36 @@ static float getInput() user_input += Yamount / (float)REFRESH_DEFAULT; // Modify input } - // Stop asking for input if the user presses A - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + + + // Stop asking for input if the user presses A + bool a_is_held = true; + bool isAPressed() { - break; - } + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + // A is pressed, but do we allow it? + if (a_is_held) + { + return false; // A is pressed now, but it was never released + } + else + { + a_is_held = true; // Remember that A was not released since this press + return true; // A is pressed right now, but it wasn't pressed before: allow + } + + else + { + a_is_held = false; // Remember that the user did not press A, so we can allow him to press it again + return false; + } + } } // Return the input return user_input; - - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { - return user_input; - } } int main() @@ -175,7 +182,7 @@ int main() Init(); - for (int i = 0; i < SDL_NumJoysticks; i++) + for (int i = 0; i < SDL_NumJoysticks(); i++) { if(SDL_IsGameController(i)) From e415e8770b5c6ce48a6b43fe09c2317c24d34698 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 16:35:23 +0300 Subject: [PATCH 019/171] Added a function for pressing A, still not tested --- Maths Calculator (C)/XCalculator.c | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index e6afcd5..be5a410 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -126,8 +126,35 @@ static char getCommand(void) debugPrint("Selected mode is: %c (%c)", o->command, o->description); } + } +} - +// Stop asking for input if the user presses A +bool a_is_held = true; + +bool isAPressed() +{ + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + // A is pressed, but do we allow it? + if (a_is_held) + { + return false; // A is pressed now, but it was never released + } + else + { + a_is_held = true; // Remember that A was not released since this press + return true; // A is pressed right now, but it wasn't pressed before: allow + } + + + } + else + { + a_is_held = false; // Remember that the user did not press A, so we can allow him to press it again + return false; + } +} static float getInput() { @@ -143,34 +170,7 @@ static float getInput() { // Check 20% deadzone user_input += Yamount / (float)REFRESH_DEFAULT; // Modify input } - - - - // Stop asking for input if the user presses A - bool a_is_held = true; - bool isAPressed() - { - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { - // A is pressed, but do we allow it? - if (a_is_held) - { - return false; // A is pressed now, but it was never released - } - else - { - a_is_held = true; // Remember that A was not released since this press - return true; // A is pressed right now, but it wasn't pressed before: allow - } - - else - { - a_is_held = false; // Remember that the user did not press A, so we can allow him to press it again - return false; - } - } } - // Return the input return user_input; From 18aeb32ab5c83c3bcec01a0a13df64ac07808445 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 16:57:54 +0300 Subject: [PATCH 020/171] XCalculator is one step closer to working --- Maths Calculator (C)/XCalculator.c | 68 ++++++++++++++++++------------ 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index be5a410..0412f12 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -107,32 +107,10 @@ static float help(float a, float b) return a; } -static char getCommand(void) -{ - Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); - - for (int i = 0; i < ARRAY_SIZE(operations);) - { - MathOperation* o = &operations[i]; - - if (Xamount > deadzone) - { - i++; - debugPrint("Selected mode is: %c (%c)", o->command, o->description); - } - else if (Xamount < -deadzone) - { - i--; - debugPrint("Selected mode is: %c (%c)", o->command, o->description); - } - - } -} - // Stop asking for input if the user presses A -bool a_is_held = true; +static bool a_is_held = true; -bool isAPressed() +static bool isAPressed() { if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { @@ -156,11 +134,42 @@ bool isAPressed() } } +static char getCommand(void) +{ + Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + + while (true) + { + for (int i = 0; i < ARRAY_SIZE(operations);) + { + MathOperation* o = &operations[i]; + + if (Xamount > deadzone) + { + i++; + debugPrint("Selected mode is: %c (%c)", o->command, o->description); + } + else if (Xamount < -deadzone) + { + i--; + debugPrint("Selected mode is: %c (%c)", o->command, o->description); + } + + } + if (isAPressed()) + { + break; + } + } + return user_command; +} + static float getInput() { while(true) { XVideoWaitForVBlank(); // Wait for next frame + debugClearScreen(); SDL_GameControllerUpdate(); // Update gamepad values debugPrint("Your current input [*1000] is %d", (int)(user_input*1000.0f)); @@ -170,11 +179,16 @@ static float getInput() { // Check 20% deadzone user_input += Yamount / (float)REFRESH_DEFAULT; // Modify input } + + if(isAPressed()) + { + break; + } + } + // Return the input + return user_input; } -// Return the input -return user_input; -} int main() { From 95a019ea25866cf9ec2108d1e5a37d4f29f66765 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 18:00:24 +0300 Subject: [PATCH 021/171] One step closer to working --- Maths Calculator (C)/XCalculator.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 0412f12..7bbb66e 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -136,6 +136,12 @@ static bool isAPressed() static char getCommand(void) { + XVideoWaitForVBlank(); + + debugClearScreen(); + + SDL_GameControllerUpdate(); + Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); while (true) @@ -211,8 +217,6 @@ int main() } } -while(true) { float v = getInput(); debugPrint("getInput * 1000: %d", (int)(v * 1000)); } - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); while(user_command != 'q') From c8731fdd8ef251f9f3a2bf1edcdb7754f32e19a2 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 18:28:01 +0300 Subject: [PATCH 022/171] fixing some stuff --- Maths Calculator (C)/XCalculator.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 7bbb66e..f1fdb4c 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -136,16 +136,16 @@ static bool isAPressed() static char getCommand(void) { - XVideoWaitForVBlank(); - - debugClearScreen(); - - SDL_GameControllerUpdate(); Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); while (true) { + XVideoWaitForVBlank(); + + debugClearScreen(); + + SDL_GameControllerUpdate(); for (int i = 0; i < ARRAY_SIZE(operations);) { MathOperation* o = &operations[i]; @@ -153,14 +153,13 @@ static char getCommand(void) if (Xamount > deadzone) { i++; - debugPrint("Selected mode is: %c (%c)", o->command, o->description); } else if (Xamount < -deadzone) { i--; - debugPrint("Selected mode is: %c (%c)", o->command, o->description); } - + debugPrint("Current selected mode is: %c %c", o->command, o->description); + } if (isAPressed()) { From 10d46b11d78e1c71c56a1bdc2d1a54d32b00c246 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 18:56:43 +0300 Subject: [PATCH 023/171] getCommand() prints the right amount of times now --- Maths Calculator (C)/XCalculator.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index f1fdb4c..c7824bb 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -137,7 +137,7 @@ static bool isAPressed() static char getCommand(void) { - Sint16 Xamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000; // Get input in range -1 to +1 while (true) { @@ -146,20 +146,22 @@ static char getCommand(void) debugClearScreen(); SDL_GameControllerUpdate(); + for (int i = 0; i < ARRAY_SIZE(operations);) { MathOperation* o = &operations[i]; - if (Xamount > deadzone) + if (fabsf(Xamount) > 0.2f) { i++; } - else if (Xamount < -deadzone) + else if (fabsf(Xamount) < 0.2f) { i--; + } - debugPrint("Current selected mode is: %c %c", o->command, o->description); - + debugPrint("Current selected mode is: %c %c", o->command, o->description); + } if (isAPressed()) { @@ -184,6 +186,10 @@ static float getInput() { // Check 20% deadzone user_input += Yamount / (float)REFRESH_DEFAULT; // Modify input } + else if (fabsf(Yamount) < 0.2f) + { // Check 20% deadzone + user_input -= Yamount / (float)REFRESH_DEFAULT; // Modify input + } if(isAPressed()) { From 65640d749368fa9f096e114e366cc59b6419f226 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 18:57:51 +0300 Subject: [PATCH 024/171] description prints properly now --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index c7824bb..04c4fbf 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -160,7 +160,7 @@ static char getCommand(void) i--; } - debugPrint("Current selected mode is: %c %c", o->command, o->description); + debugPrint("Current selected mode is: %c %s", o->command, o->description); } if (isAPressed()) From eaece9ee59055d6ba320d76c9b226b233522c49e Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 20:52:39 +0300 Subject: [PATCH 025/171] getInput() prints properly, input still doesn't work --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 04c4fbf..d54c8e5 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -160,7 +160,7 @@ static char getCommand(void) i--; } - debugPrint("Current selected mode is: %c %s", o->command, o->description); + debugPrint("Current selected mode is: %c (%s)", o->command, o->description); } if (isAPressed()) From c41a1c95e95a434d720a834f06cc989555dc482e Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 20:57:19 +0300 Subject: [PATCH 026/171] One step closer to working --- Maths Calculator (C)/XCalculator.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index d54c8e5..ab0c468 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -129,8 +129,8 @@ static bool isAPressed() } else { - a_is_held = false; // Remember that the user did not press A, so we can allow him to press it again - return false; + a_is_held = false; // Remember that the user did not press A, so we can allow him to press it again + return false; } } @@ -155,10 +155,9 @@ static char getCommand(void) { i++; } - else if (fabsf(Xamount) < 0.2f) + else if (fabsf(Xamount) < -0.2f) { i--; - } debugPrint("Current selected mode is: %c (%s)", o->command, o->description); From 26226760fc7d1ddd9bd1da5459997036f6c1e345 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 21:03:59 +0300 Subject: [PATCH 027/171] fixes --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index ab0c468..13d5de2 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -155,7 +155,7 @@ static char getCommand(void) { i++; } - else if (fabsf(Xamount) < -0.2f) + else if(fabsf(Xamount) < 0.2f) { i--; } From ec8f585590d543c7a73bae300127a545b0feda9a Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 21:10:50 +0300 Subject: [PATCH 028/171] stufff --- Maths Calculator (C)/XCalculator.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 13d5de2..4aa2451 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -137,7 +137,7 @@ static bool isAPressed() static char getCommand(void) { - Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000; // Get input in range -1 to +1 + Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 while (true) { @@ -153,11 +153,16 @@ static char getCommand(void) if (fabsf(Xamount) > 0.2f) { - i++; - } - else if(fabsf(Xamount) < 0.2f) - { - i--; + if(i < ARRAY_SIZE(operations)) + { + i++; + } + else + { + i = 0; + } + + } debugPrint("Current selected mode is: %c (%s)", o->command, o->description); From 9efa028859239596233868c0807783225ec9f496 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 21:12:36 +0300 Subject: [PATCH 029/171] stuff --- Maths Calculator (C)/XCalculator.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 4aa2451..dc18639 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -153,16 +153,11 @@ static char getCommand(void) if (fabsf(Xamount) > 0.2f) { - if(i < ARRAY_SIZE(operations)) - { - i++; - } - else - { - i = 0; - } - - + i++; + } + else if(fabsf(Xamount) < 0.2f) + { + i--; } debugPrint("Current selected mode is: %c (%s)", o->command, o->description); From 5fcae105f1d93259cf2a1c71f58bf66e3f0326d9 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 21:18:25 +0300 Subject: [PATCH 030/171] Kind of making progress with getCommand() --- Maths Calculator (C)/XCalculator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index dc18639..7a205c5 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -137,8 +137,6 @@ static bool isAPressed() static char getCommand(void) { - Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 - while (true) { XVideoWaitForVBlank(); @@ -147,6 +145,8 @@ static char getCommand(void) SDL_GameControllerUpdate(); + Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 + for (int i = 0; i < ARRAY_SIZE(operations);) { MathOperation* o = &operations[i]; From d97a67a3a32922c5749a8e5720772fabe9f80170 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 21:54:43 +0300 Subject: [PATCH 031/171] Trying a new fix --- Maths Calculator (C)/XCalculator.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 7a205c5..f7c745f 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -136,6 +136,18 @@ static bool isAPressed() static char getCommand(void) { + int accessnum; + + MathOperation* o = &operations[accessnum]; + + if (fabsf(Xamount) > 0.2f) + { + i++; + } + else if(fabsf(Xamount) < 0.2f) + { + i--; + } while (true) { @@ -146,22 +158,9 @@ static char getCommand(void) SDL_GameControllerUpdate(); Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 - - for (int i = 0; i < ARRAY_SIZE(operations);) - { - MathOperation* o = &operations[i]; - - if (fabsf(Xamount) > 0.2f) - { - i++; - } - else if(fabsf(Xamount) < 0.2f) - { - i--; - } + debugPrint("Current selected mode is: %c (%s)", o->command, o->description); - } if (isAPressed()) { break; From cce6b88dd385eb0b7f338488a4b7f0719e77f5be Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 21:56:38 +0300 Subject: [PATCH 032/171] trying a fix --- Maths Calculator (C)/XCalculator.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index f7c745f..36cd1a8 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -140,15 +140,6 @@ static char getCommand(void) MathOperation* o = &operations[accessnum]; - if (fabsf(Xamount) > 0.2f) - { - i++; - } - else if(fabsf(Xamount) < 0.2f) - { - i--; - } - while (true) { XVideoWaitForVBlank(); @@ -159,7 +150,16 @@ static char getCommand(void) Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 - debugPrint("Current selected mode is: %c (%s)", o->command, o->description); + if (fabsf(Xamount) > 0.2f) + { + accessnum++; + } + else if(fabsf(Xamount) < 0.2f) + { + accessnum--; + } + + debugPrint("Current selected mode is: %c (%s)", o->command, o->description); if (isAPressed()) { From 6dfa076e239aade2a653eea012df2ca2d6b160e8 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 22:04:03 +0300 Subject: [PATCH 033/171] almost fixed getCommand() --- Maths Calculator (C)/XCalculator.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 36cd1a8..6569381 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -136,7 +136,7 @@ static bool isAPressed() static char getCommand(void) { - int accessnum; + int accessnum = 0; MathOperation* o = &operations[accessnum]; @@ -148,18 +148,20 @@ static char getCommand(void) SDL_GameControllerUpdate(); + debugPrint("Please tell me your desired calculation type. For help enter h.\n"); + Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 if (fabsf(Xamount) > 0.2f) { accessnum++; } - else if(fabsf(Xamount) < 0.2f) + else if(fabsf(Xamount) < -0.2f) { accessnum--; } - debugPrint("Current selected mode is: %c (%s)", o->command, o->description); + debugPrint("Current selected mode is: %d", accessnum); if (isAPressed()) { @@ -220,8 +222,6 @@ int main() } } - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); - while(user_command != 'q') { getCommand(); From 50bb17ed403a0da043bc14853f7e051353070320 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 22:19:54 +0300 Subject: [PATCH 034/171] changes --- Maths Calculator (C)/XCalculator.c | 39 ++++++++++++++++++------------ 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 6569381..1fa5d57 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -134,6 +134,21 @@ static bool isAPressed() } } +static float getAxis(int sdl_axis) { + const float deadzone = 0.2f; + + // Get input in range -1 to +1 + float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x8000; + + // Reject if the stick is in deadzone + if (fabsf(amount) < deadzone) { + return 0.0f; + } + + // Re-normalize after deadzone + return (amount - deadzone) / (1.0f - deadzone); +} + static char getCommand(void) { int accessnum = 0; @@ -150,16 +165,16 @@ static char getCommand(void) debugPrint("Please tell me your desired calculation type. For help enter h.\n"); - Sint16 Xamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000; // Get input in range -1 to +1 + Sint16 Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); - if (fabsf(Xamount) > 0.2f) + if(getAxis < 0) + { + accessnum--; + } + else if(getAxis > 0 ) { accessnum++; } - else if(fabsf(Xamount) < -0.2f) - { - accessnum--; - } debugPrint("Current selected mode is: %d", accessnum); @@ -181,15 +196,9 @@ static float getInput() debugPrint("Your current input [*1000] is %d", (int)(user_input*1000.0f)); - float Yamount = (float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000; // Get input in range -1 to +1 - if (fabsf(Yamount) > 0.2f) - { // Check 20% deadzone - user_input += Yamount / (float)REFRESH_DEFAULT; // Modify input - } - else if (fabsf(Yamount) < 0.2f) - { // Check 20% deadzone - user_input -= Yamount / (float)REFRESH_DEFAULT; // Modify input - } + float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); + + if(isAPressed()) { From 7769ce375b3c15613f370095c75c514e563598ff Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 22:36:10 +0300 Subject: [PATCH 035/171] changes --- Maths Calculator (C)/XCalculator.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 1fa5d57..0136d72 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -134,14 +134,16 @@ static bool isAPressed() } } -static float getAxis(int sdl_axis) { +static float getAxis(int sdl_axis) +{ const float deadzone = 0.2f; // Get input in range -1 to +1 float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x8000; // Reject if the stick is in deadzone - if (fabsf(amount) < deadzone) { + if (fabsf(amount) < deadzone) + { return 0.0f; } @@ -165,16 +167,16 @@ static char getCommand(void) debugPrint("Please tell me your desired calculation type. For help enter h.\n"); - Sint16 Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); + float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); - if(getAxis < 0) + if(Xamount < 0.5f) { accessnum--; } - else if(getAxis > 0 ) - { + else if(Xamount > 0.5f ) + { accessnum++; - } + } debugPrint("Current selected mode is: %d", accessnum); From 048122bb64db38ce376e89460f89eb54433fcfcf Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 22:56:41 +0300 Subject: [PATCH 036/171] getCommand() now works --- Maths Calculator (C)/XCalculator.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 0136d72..801de03 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -155,8 +155,6 @@ static char getCommand(void) { int accessnum = 0; - MathOperation* o = &operations[accessnum]; - while (true) { XVideoWaitForVBlank(); @@ -169,16 +167,29 @@ static char getCommand(void) float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); - if(Xamount < 0.5f) + if(Xamount < -0.5f) { - accessnum--; - } + if(accessnum > 0) + { + accessnum--; + } + else + { + accessnum = 0; + } + } + else if(Xamount > 0.5f ) { - accessnum++; + if(accessnum < ARRAY_SIZE(operations)) + { + accessnum++; + } } - debugPrint("Current selected mode is: %d", accessnum); + MathOperation* o = &operations[accessnum]; + + debugPrint("Current selected mode is: %c (%s)", o->command, o->description); if (isAPressed()) { From 59779d89aa115f04e6615222c17fdfb1963e1025 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 23:13:06 +0300 Subject: [PATCH 037/171] made getCommand() return user_command --- Maths Calculator (C)/XCalculator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 801de03..3089f1c 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -193,9 +193,10 @@ static char getCommand(void) if (isAPressed()) { + user_command = o->command; break; } - } + } return user_command; } From cec9766fb116d07f98f5ad6f94cb38c93345e076 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 7 Apr 2020 23:13:51 +0300 Subject: [PATCH 038/171] changes --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 3089f1c..e7a0b69 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -249,7 +249,7 @@ int main() { getCommand(); - for (int i; i < ARRAY_SIZE(operations); i++) + for (int i = 0; i < ARRAY_SIZE(operations); i++) { MathOperation* o = &operations[i]; From a81e35338a03a6d8f374fd27326fe95ae42bfdf3 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 00:08:15 +0300 Subject: [PATCH 039/171] Most parts of the calculator work, have to fix user_input --- Maths Calculator (C)/XCalculator.c | 73 +++++++++++++++++++----------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index e7a0b69..5326e02 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -10,8 +10,6 @@ #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) - - static float help(float a, float b); static float quit(float a, float b); @@ -96,20 +94,32 @@ static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} static float help(float a, float b) { + + XVideoWaitForVBlank(); + + debugClearScreen(); + for(int i = 0; i < ARRAY_SIZE(operations); i++) - { + { MathOperation* o = &operations[i]; - debugPrint("%c: %s\n", o->command, o->description); - } - printf("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); - printf("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); + debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); + debugPrint("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); + } + return a; } // Stop asking for input if the user presses A static bool a_is_held = true; - + +static void printfloat(float value) +{ + int beforePeriod = (int)(value); + int afterPeriod = (value - beforePeriod) * 1000; + debugPrint("%d.%03d", beforePeriod, afterPeriod); +} + static bool isAPressed() { if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) @@ -202,28 +212,37 @@ static char getCommand(void) static float getInput() { - while(true) - { - XVideoWaitForVBlank(); // Wait for next frame - debugClearScreen(); - SDL_GameControllerUpdate(); // Update gamepad values + while (true) + { XVideoWaitForVBlank(); - debugPrint("Your current input [*1000] is %d", (int)(user_input*1000.0f)); + debugClearScreen(); - float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); + SDL_GameControllerUpdate(); - - - if(isAPressed()) - { - break; - } - } - // Return the input - return user_input; -} + debugPrint("Please give me the number you want to use for the operation. "); + + Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + + if (Yamount > deadzone) + { + user_input += ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000) / REFRESH_DEFAULT; + } + else if (Yamount < deadzone) + { + user_input -= ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / REFRESH_DEFAULT; + } + debugPrint("Your input is: "); + printfloat(user_input); + if(isAPressed()) + { + break; + } + } + return user_input; + +} int main() { @@ -260,7 +279,9 @@ int main() getInput(); } result = o->handler(result, user_input); - debugPrint("Result is %f. Please tell me your next calculation.\n", result); + debugPrint("Result is "); + printfloat(result); + debugPrint("Please tell me your next calculation.\n"); } } From 3b5dbde36f095662f5c21dd87b0b4b08a7d269c6 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 00:19:45 +0300 Subject: [PATCH 040/171] changes --- Maths Calculator (C)/XCalculator.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 5326e02..09b4c96 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -187,7 +187,7 @@ static char getCommand(void) { accessnum = 0; } - } + } else if(Xamount > 0.5f ) { @@ -221,15 +221,15 @@ static float getInput() debugPrint("Please give me the number you want to use for the operation. "); - Sint16 Yamount = SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - if (Yamount > deadzone) + if (Yamount > 0.5f) { - user_input += ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTX) / (float)0x8000) / REFRESH_DEFAULT; + user_input += ((float)getAxis(SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / REFRESH_DEFAULT; } - else if (Yamount < deadzone) + else if (Yamount < -0.5f) { - user_input -= ((float)SDL_GameControllerGetAxis(controller, SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / REFRESH_DEFAULT; + user_input -= ((float)getAxis(SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / REFRESH_DEFAULT; } debugPrint("Your input is: "); From 15153c6843ff6046afeb0c894c38266a137f9751 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 01:06:14 +0300 Subject: [PATCH 041/171] changes --- Maths Calculator (C)/XCalculator.c | 38 +++++++++++++++++------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 09b4c96..7e3c4d7 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -49,12 +49,10 @@ static float squareRoot(float a, float b) { return sqrt(a); } static float power(float a, float b) {return pow(a, b);} -static float reset(float a, float b) {a = 0.0f; return a;} +static float reset(float a, float b) {a = 0.0f; return a;} char user_command = '\0'; -const int deadzone = 4000; - float user_input = 1.0f; float result = 0.0f; @@ -115,8 +113,10 @@ static bool a_is_held = true; static void printfloat(float value) { + int beforePeriod = (int)(value); int afterPeriod = (value - beforePeriod) * 1000; + debugPrint("%d.%03d", beforePeriod, afterPeriod); } @@ -158,7 +158,7 @@ static float getAxis(int sdl_axis) } // Re-normalize after deadzone - return (amount - deadzone) / (1.0f - deadzone); + return amount; } static char getCommand(void) @@ -213,7 +213,8 @@ static char getCommand(void) static float getInput() { while (true) - { XVideoWaitForVBlank(); + { + XVideoWaitForVBlank(); debugClearScreen(); @@ -223,17 +224,13 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - if (Yamount > 0.5f) - { - user_input += ((float)getAxis(SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / REFRESH_DEFAULT; - } - else if (Yamount < -0.5f) - { - user_input -= ((float)getAxis(SDL_CONTROLLER_AXIS_LEFTY) / (float)0x8000) / REFRESH_DEFAULT; - } + user_input += Yamount / (float)REFRESH_DEFAULT; debugPrint("Your input is: "); printfloat(user_input); + debugPrint("\n"); + printfloat(-Yamount); + debugPrint("\n"); if(isAPressed()) { @@ -279,9 +276,18 @@ int main() getInput(); } result = o->handler(result, user_input); - debugPrint("Result is "); - printfloat(result); - debugPrint("Please tell me your next calculation.\n"); + while(true) + { + debugClearScreen(); + + debugPrint("Result is "); + printfloat(result); + debugPrint("Please tell me your next calculation. Press A to continue.\n"); + if(isAPressed()) + { + break; + } + } } } From 4d75082d3c4f747646704699e9d9a77aedc922ba Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 01:13:30 +0300 Subject: [PATCH 042/171] Honestly I don't know why I write these messages anymore --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 7e3c4d7..5f5212c 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -117,7 +117,7 @@ static void printfloat(float value) int beforePeriod = (int)(value); int afterPeriod = (value - beforePeriod) * 1000; - debugPrint("%d.%03d", beforePeriod, afterPeriod); + debugPrint("%d.%03d", beforePeriod, abs(afterPeriod)); } static bool isAPressed() From a1ee792a460d66ed375adf486053ccdcb0297e14 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 12:10:07 +0300 Subject: [PATCH 043/171] printfloat() now works properly --- Maths Calculator (C)/XCalculator.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 5f5212c..f063333 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -108,18 +108,28 @@ static float help(float a, float b) return a; } -// Stop asking for input if the user presses A -static bool a_is_held = true; - static void printfloat(float value) { int beforePeriod = (int)(value); int afterPeriod = (value - beforePeriod) * 1000; - debugPrint("%d.%03d", beforePeriod, abs(afterPeriod)); + if (value >= 0.0f) + { + debugPrint("%d.%03d", beforePeriod, afterPeriod); + } + else + { + debugPrint("-%d.%03d", beforePeriod, abs(afterPeriod)); + } + } +// Stop asking for input if the user presses A +static bool a_is_held = true; + + + static bool isAPressed() { if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) From dc67d010242717a2fb92f33b371e0ba9721771d4 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 12:40:19 +0300 Subject: [PATCH 044/171] Working on a getInput() fix --- Maths Calculator (C)/XCalculator.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index f063333..cd173f5 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -234,7 +234,15 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - user_input += Yamount / (float)REFRESH_DEFAULT; + if(-Yamount > 0.5f) + { + user_input -= -Yamount / (float)REFRESH_DEFAULT; + } + else if(-Yamount < -0.5f) + { + user_input += -Yamount / (float)REFRESH_DEFAULT; + } + debugPrint("Your input is: "); printfloat(user_input); From fa634b02060bfe72dae28ebef22cfee480ad8265 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 12:49:03 +0300 Subject: [PATCH 045/171] getInput() fix in progress --- Maths Calculator (C)/XCalculator.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index cd173f5..7ad7461 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -234,14 +234,7 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - if(-Yamount > 0.5f) - { - user_input -= -Yamount / (float)REFRESH_DEFAULT; - } - else if(-Yamount < -0.5f) - { - user_input += -Yamount / (float)REFRESH_DEFAULT; - } + user_input += -Yamount / (float)REFRESH_DEFAULT; //work around an SDL inversion bug by using -Yamount debugPrint("Your input is: "); From b941640fd0a546087157e7f0dc08204e5451dc4f Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 12:55:42 +0300 Subject: [PATCH 046/171] getInput() fix in progress --- Maths Calculator (C)/XCalculator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 7ad7461..389d7ab 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -159,7 +159,7 @@ static float getAxis(int sdl_axis) const float deadzone = 0.2f; // Get input in range -1 to +1 - float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x8000; + float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x7FFF; // Reject if the stick is in deadzone if (fabsf(amount) < deadzone) @@ -242,6 +242,7 @@ static float getInput() debugPrint("\n"); printfloat(-Yamount); debugPrint("\n"); + printfloat(Yamount); if(isAPressed()) { From 003d33f21f0c67f2ef72708fae91547aeed3d71a Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 13:13:23 +0300 Subject: [PATCH 047/171] made some changes to printfloat() --- Maths Calculator (C)/XCalculator.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 389d7ab..30cb65d 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -114,14 +114,11 @@ static void printfloat(float value) int beforePeriod = (int)(value); int afterPeriod = (value - beforePeriod) * 1000; - if (value >= 0.0f) + if (value <= 0.0f && beforePeriod == 0) { - debugPrint("%d.%03d", beforePeriod, afterPeriod); - } - else - { - debugPrint("-%d.%03d", beforePeriod, abs(afterPeriod)); + debugPrint("-"); } + debugPrint("%d.%03d", beforePeriod, abs(afterPeriod)); } @@ -241,9 +238,6 @@ static float getInput() printfloat(user_input); debugPrint("\n"); printfloat(-Yamount); - debugPrint("\n"); - printfloat(Yamount); - if(isAPressed()) { break; From 2fdf33445b09fe82a52176a17470a99eef1cdffa Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 17:09:54 +0300 Subject: [PATCH 048/171] WIP making isThingUsed() --- Maths Calculator (C)/XCalculator.c | 41 ++++++++++++++++-------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 30cb65d..89b73bd 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -114,49 +114,52 @@ static void printfloat(float value) int beforePeriod = (int)(value); int afterPeriod = (value - beforePeriod) * 1000; - if (value <= 0.0f && beforePeriod == 0) + if (value < 0.0f && beforePeriod == 0) { debugPrint("-"); + value = -value; } debugPrint("%d.%03d", beforePeriod, abs(afterPeriod)); } -// Stop asking for input if the user presses A -static bool a_is_held = true; +static bool x_is_pushed = true; +static bool a_is_held = true; -static bool isAPressed() +static bool isThingUsed(bool thingdone, float sdl_action) { - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + if (sdl_action) { - // A is pressed, but do we allow it? - if (a_is_held) + if (thingdone) { - return false; // A is pressed now, but it was never released + return false; } else { - a_is_held = true; // Remember that A was not released since this press - return true; // A is pressed right now, but it wasn't pressed before: allow - } - + thingdone = true; + return true; + } } else { - a_is_held = false; // Remember that the user did not press A, so we can allow him to press it again + x_is_pushed = false; return false; } } + + + + static float getAxis(int sdl_axis) { const float deadzone = 0.2f; // Get input in range -1 to +1 - float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x7FFF; + float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x8000; // Reject if the stick is in deadzone if (fabsf(amount) < deadzone) @@ -208,7 +211,7 @@ static char getCommand(void) debugPrint("Current selected mode is: %c (%s)", o->command, o->description); - if (isAPressed()) + if (isThingUsed(a_is_held, SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A))) { user_command = o->command; break; @@ -238,7 +241,7 @@ static float getInput() printfloat(user_input); debugPrint("\n"); printfloat(-Yamount); - if(isAPressed()) + if(isThingUsed(a_is_held, SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A))) { break; } @@ -284,20 +287,20 @@ int main() result = o->handler(result, user_input); while(true) { + XVideoWaitForVBlank(); + debugClearScreen(); debugPrint("Result is "); printfloat(result); debugPrint("Please tell me your next calculation. Press A to continue.\n"); - if(isAPressed()) + if(isThingUsed(a_is_held, SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A))) { break; } } } } - - } From c9924df10bf1b6fb482db91ef92f723dc2e17f18 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 17:21:34 +0300 Subject: [PATCH 049/171] change --- Maths Calculator (C)/XCalculator.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 89b73bd..458fedc 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -128,24 +128,24 @@ static bool x_is_pushed = true; static bool a_is_held = true; -static bool isThingUsed(bool thingdone, float sdl_action) +static bool isThingUsed(bool is_held, bool* was_held) { - if (sdl_action) + if (is_held) { - if (thingdone) + if (is_held) { return false; } else { - thingdone = true; + is_held = true; return true; } } else { - x_is_pushed = false; + is_held = false; return false; } } From cd6621d97885ebd0b5dcf168de0a56246aadfa53 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 17:27:03 +0300 Subject: [PATCH 050/171] just stop with these messages already --- Maths Calculator (C)/XCalculator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 458fedc..fa13cd9 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -132,20 +132,20 @@ static bool isThingUsed(bool is_held, bool* was_held) { if (is_held) { - if (is_held) + if (was_held) { return false; } else { - is_held = true; + was_held = true; return true; } } else { - is_held = false; + was_held = false; return false; } } From 40765f06b27e22351a1ffa006a3bf23106e7b325 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 17:27:29 +0300 Subject: [PATCH 051/171] changes --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index fa13cd9..5a32680 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -128,7 +128,7 @@ static bool x_is_pushed = true; static bool a_is_held = true; -static bool isThingUsed(bool is_held, bool* was_held) +static bool isNewlyPressed(bool is_held, bool* was_held) { if (is_held) { From de526e4228f44e0c6becee5d6f173f973c9b93c9 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 18:16:20 +0300 Subject: [PATCH 052/171] . --- Maths Calculator (C)/XCalculator.c | 52 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 5a32680..4c21253 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -126,26 +126,30 @@ static void printfloat(float value) static bool x_is_pushed = true; +static bool x_was_pushed = true; + static bool a_is_held = true; +static bool a_was_held = true; + static bool isNewlyPressed(bool is_held, bool* was_held) { if (is_held) { - if (was_held) + if (*was_held) { return false; } else { - was_held = true; + *was_held = true; return true; } } else { - was_held = false; + *was_held = false; return false; } } @@ -186,32 +190,36 @@ static char getCommand(void) debugPrint("Please tell me your desired calculation type. For help enter h.\n"); float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); - - if(Xamount < -0.5f) - { - if(accessnum > 0) - { - accessnum--; - } - else - { - accessnum = 0; - } - } - else if(Xamount > 0.5f ) + if(isNewlyPressed(x_is_pushed, &x_was_pushed)) { - if(accessnum < ARRAY_SIZE(operations)) + if(Xamount < -0.5f) { - accessnum++; - } + if(accessnum > 0) + { + accessnum--; + } + else + { + accessnum = 0; + } + } + + else if(Xamount > 0.5f ) + { + if(accessnum < ARRAY_SIZE(operations)) + { + accessnum++; + } + } } + MathOperation* o = &operations[accessnum]; debugPrint("Current selected mode is: %c (%s)", o->command, o->description); - if (isThingUsed(a_is_held, SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A))) + if (isNewlyPressed(a_is_held, &a_was_held)) { user_command = o->command; break; @@ -241,7 +249,7 @@ static float getInput() printfloat(user_input); debugPrint("\n"); printfloat(-Yamount); - if(isThingUsed(a_is_held, SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A))) + if(isNewlyPressed(a_is_held, &a_was_held)) { break; } @@ -294,7 +302,7 @@ int main() debugPrint("Result is "); printfloat(result); debugPrint("Please tell me your next calculation. Press A to continue.\n"); - if(isThingUsed(a_is_held, SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A))) + if(isNewlyPressed(a_is_held, &a_was_held)) { break; } From 8617e681f4ecc7d0a08f8cfa6d3684829e6681ce Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 18:52:01 +0300 Subject: [PATCH 053/171] F these messages --- Maths Calculator (C)/XCalculator.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 4c21253..9dfe279 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -126,11 +126,11 @@ static void printfloat(float value) static bool x_is_pushed = true; -static bool x_was_pushed = true; +static bool x_was_pushed = false; static bool a_is_held = true; -static bool a_was_held = true; +static bool a_was_held = false; static bool isNewlyPressed(bool is_held, bool* was_held) { @@ -191,6 +191,15 @@ static char getCommand(void) float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); + if(x_is_pushed) + { + x_was_pushed = true; + } + else + { + x_was_pushed = false; + } + if(isNewlyPressed(x_is_pushed, &x_was_pushed)) { if(Xamount < -0.5f) @@ -249,6 +258,15 @@ static float getInput() printfloat(user_input); debugPrint("\n"); printfloat(-Yamount); + if(a_is_held) + { + a_was_held = true; + } + else + { + a_was_held = false; + } + if(isNewlyPressed(a_is_held, &a_was_held)) { break; From e58db1554ce5a8e4501f9a15cdf420356c221c14 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 19:13:28 +0300 Subject: [PATCH 054/171] . --- Maths Calculator (C)/XCalculator.c | 66 +++++++++++++----------------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 9dfe279..5b0520a 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -124,14 +124,6 @@ static void printfloat(float value) } -static bool x_is_pushed = true; - -static bool x_was_pushed = false; - -static bool a_is_held = true; - -static bool a_was_held = false; - static bool isNewlyPressed(bool is_held, bool* was_held) { if (is_held) @@ -160,6 +152,11 @@ static bool isNewlyPressed(bool is_held, bool* was_held) static float getAxis(int sdl_axis) { + + static bool x_is_pushed = true; + + static bool x_was_pushed = false; + const float deadzone = 0.2f; // Get input in range -1 to +1 @@ -177,6 +174,10 @@ static float getAxis(int sdl_axis) static char getCommand(void) { + static bool a_is_held = true; + + static bool a_was_held = false; + int accessnum = 0; while (true) @@ -191,37 +192,17 @@ static char getCommand(void) float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); - if(x_is_pushed) - { - x_was_pushed = true; - } - else - { - x_was_pushed = false; - } - - if(isNewlyPressed(x_is_pushed, &x_was_pushed)) - { - if(Xamount < -0.5f) - { - if(accessnum > 0) - { - accessnum--; - } - else - { - accessnum = 0; - } - } + bool is_left_analog_left = Xamount < -0.5f; - else if(Xamount > 0.5f ) - { - if(accessnum < ARRAY_SIZE(operations)) - { - accessnum++; - } - } - } + bool is_left_analog_right = Xamount > 0.5f; + + bool was_left_analog_left = false; + + bool was_left_analog_right = false; + + if(isNewlyPressed(is_left_analog_left, &was_left_analog_left)) { accessnum--; } + + if(isNewlyPressed(is_left_analog_right, &was_left_analog_right)) { accessnum++; } MathOperation* o = &operations[accessnum]; @@ -234,11 +215,16 @@ static char getCommand(void) break; } } + return user_command; } static float getInput() { + static bool a_is_held = true; + + static bool a_was_held = false; + while (true) { XVideoWaitForVBlank(); @@ -278,6 +264,10 @@ static float getInput() int main() { + static bool a_is_held = true; + + static bool a_was_held = false; + Init(); From 401f7b6eefd9a4f4721173abdfa70cbf11b993f7 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 19:50:34 +0300 Subject: [PATCH 055/171] removed mappings fil --- Maths Calculator (C)/XCalculator.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 5b0520a..d5af98b 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -66,8 +66,6 @@ static void Init() SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); //Initialize SDL for consoles - - SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); } static MathOperation operations[] = { From 2be0d0ee2b5ebfe0f00d04d6665379ac458edcc7 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 8 Apr 2020 21:24:20 +0300 Subject: [PATCH 056/171] The user option can now never go out of bounds --- Maths Calculator (C)/XCalculator.c | 68 ++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index d5af98b..ae59f1d 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -124,6 +124,7 @@ static void printfloat(float value) static bool isNewlyPressed(bool is_held, bool* was_held) { + if (is_held) { if (*was_held) @@ -145,15 +146,12 @@ static bool isNewlyPressed(bool is_held, bool* was_held) } - - - static float getAxis(int sdl_axis) { static bool x_is_pushed = true; - static bool x_was_pushed = false; + static bool x_was_pushed = true; const float deadzone = 0.2f; @@ -174,7 +172,11 @@ static char getCommand(void) { static bool a_is_held = true; - static bool a_was_held = false; + static bool a_was_held = true; + + static bool x_is_pushed = true; + + static bool x_was_pushed = true; int accessnum = 0; @@ -198,15 +200,42 @@ static char getCommand(void) bool was_left_analog_right = false; - if(isNewlyPressed(is_left_analog_left, &was_left_analog_left)) { accessnum--; } + if(accessnum > 0) + { + if(isNewlyPressed(is_left_analog_left, &was_left_analog_left)) { accessnum--; } + } + else + { + accessnum = 0; + } + - if(isNewlyPressed(is_left_analog_right, &was_left_analog_right)) { accessnum++; } + if(accessnum < ARRAY_SIZE(operations) - 1) + { + if(isNewlyPressed(is_left_analog_right, &was_left_analog_right)) { accessnum++; } + } + else + { + accessnum = ARRAY_SIZE(operations) - 1; + } + + + MathOperation* o = &operations[accessnum]; debugPrint("Current selected mode is: %c (%s)", o->command, o->description); + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + a_is_held = true; + } + else + { + a_is_held = false; + } + if (isNewlyPressed(a_is_held, &a_was_held)) { user_command = o->command; @@ -221,7 +250,7 @@ static float getInput() { static bool a_is_held = true; - static bool a_was_held = false; + static bool a_was_held = true; while (true) { @@ -242,15 +271,16 @@ static float getInput() printfloat(user_input); debugPrint("\n"); printfloat(-Yamount); - if(a_is_held) + + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { - a_was_held = true; + a_is_held = true; } else { - a_was_held = false; + a_is_held = false; } - + if(isNewlyPressed(a_is_held, &a_was_held)) { break; @@ -264,7 +294,7 @@ int main() static bool a_is_held = true; - static bool a_was_held = false; + static bool a_was_held = true; Init(); @@ -307,7 +337,17 @@ int main() debugPrint("Result is "); printfloat(result); - debugPrint("Please tell me your next calculation. Press A to continue.\n"); + debugPrint(". Please tell me your next calculation. Press A to continue.\n"); + + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + a_is_held = true; + } + else + { + a_is_held = false; + } + if(isNewlyPressed(a_is_held, &a_was_held)) { break; From bba31e644214b9ae7666be618025e9af659b8a4e Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sat, 11 Apr 2020 19:10:48 +0300 Subject: [PATCH 057/171] tweaked some values in getInput() to work with the inverted Y axis in nxdk-sdl --- Maths Calculator (C)/Makefile | 2 +- Maths Calculator (C)/XCalculator.c | 82 +++++++++++------------------- 2 files changed, 32 insertions(+), 52 deletions(-) diff --git a/Maths Calculator (C)/Makefile b/Maths Calculator (C)/Makefile index 11e4e36..a15f012 100644 --- a/Maths Calculator (C)/Makefile +++ b/Maths Calculator (C)/Makefile @@ -1,6 +1,6 @@ XBE_TITLE=XCalculator GEN_XISO = $(XBE_TITLE).iso SRCS = XCalculator.c -NXDK_DIR = /home/kosmas/nxdk/ +NXDK_DIR = /home/kosmas/nxdk NXDK_SDL = y include $(NXDK_DIR)/Makefile \ No newline at end of file diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index ae59f1d..542bf9e 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -106,19 +106,21 @@ static float help(float a, float b) return a; } -static void printfloat(float value) -{ - - int beforePeriod = (int)(value); - int afterPeriod = (value - beforePeriod) * 1000; +// This function can only positive float values (negatives are not supported!) +void printpositivefloat(float value) { + unsigned int notround = (unsigned int)(value * 1000.0 + 0.5f); + unsigned int beforeperiod = notround / 1000; + unsigned int afterperiod = notround % 1000; // I'd just use endallroundingmadness % 1000 + debugPrint("%u.%03u", beforeperiod, afterperiod); +} - if (value < 0.0f && beforePeriod == 0) - { - debugPrint("-"); - value = -value; - } - debugPrint("%d.%03d", beforePeriod, abs(afterPeriod)); - +// This function can print positive and negative float values +void printfloat(float value) { + if (value < 0.0f) { + debugPrint("-"); // Draw sign + value = -value; // Make value positive + } + printpositivefloat(value); // Print positive value } @@ -149,10 +151,6 @@ static bool isNewlyPressed(bool is_held, bool* was_held) static float getAxis(int sdl_axis) { - static bool x_is_pushed = true; - - static bool x_was_pushed = true; - const float deadzone = 0.2f; // Get input in range -1 to +1 @@ -188,7 +186,9 @@ static char getCommand(void) SDL_GameControllerUpdate(); - debugPrint("Please tell me your desired calculation type. For help enter h.\n"); + debugPrint("Current result is: "); + printfloat(result); + debugPrint(". Please tell me your desired calculation type. For help enter h.\n"); float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); @@ -219,10 +219,6 @@ static char getCommand(void) accessnum = ARRAY_SIZE(operations) - 1; } - - - - MathOperation* o = &operations[accessnum]; debugPrint("Current selected mode is: %c (%s)", o->command, o->description); @@ -264,13 +260,23 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - user_input += -Yamount / (float)REFRESH_DEFAULT; //work around an SDL inversion bug by using -Yamount + if(Yamount < -0.5f) //use negative value for the controller going up because Y axis is inverted in nxdk-sdl + { + user_input += Yamount / (float)REFRESH_DEFAULT; + } + else if (Yamount > 0.5f) + { + user_input -= Yamount / (float)REFRESH_DEFAULT; + } + + + debugPrint("Your input is: "); printfloat(user_input); debugPrint("\n"); - printfloat(-Yamount); + printfloat(Yamount); if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { @@ -294,7 +300,7 @@ int main() static bool a_is_held = true; - static bool a_was_held = true; + static bool a_was_held = false; Init(); @@ -329,33 +335,7 @@ int main() getInput(); } result = o->handler(result, user_input); - while(true) - { - XVideoWaitForVBlank(); - - debugClearScreen(); - - debugPrint("Result is "); - printfloat(result); - debugPrint(". Please tell me your next calculation. Press A to continue.\n"); - - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { - a_is_held = true; - } - else - { - a_is_held = false; - } - - if(isNewlyPressed(a_is_held, &a_was_held)) - { - break; - } - } } } } - - -} \ No newline at end of file +} From d7b8445bbd7d33a6b059be67ce5ceed2ef9fba41 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sat, 11 Apr 2020 19:17:43 +0300 Subject: [PATCH 058/171] adjusted getInput() to work with inverted Y axis --- Maths Calculator (C)/XCalculator.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 542bf9e..9d79ea9 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -260,13 +260,13 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - if(Yamount < -0.5f) //use negative value for the controller going up because Y axis is inverted in nxdk-sdl + if(-Yamount > 0.5f) //use -Yamount for the controller going up because Y axis is inverted in nxdk-sdl { - user_input += Yamount / (float)REFRESH_DEFAULT; + user_input += -Yamount / (float)REFRESH_DEFAULT; } - else if (Yamount > 0.5f) + else if (-Yamount < -0.5f) { - user_input -= Yamount / (float)REFRESH_DEFAULT; + user_input -= -Yamount / (float)REFRESH_DEFAULT; } @@ -276,7 +276,7 @@ static float getInput() debugPrint("Your input is: "); printfloat(user_input); debugPrint("\n"); - printfloat(Yamount); + printfloat(-Yamount); if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { From 3142aa7e18dfe762cf0771e4f436c343a838f45b Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 12 Apr 2020 17:46:19 +0300 Subject: [PATCH 059/171] help() works properly now --- Maths Calculator (C)/XCalculator.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 9d79ea9..c595c78 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -91,17 +91,23 @@ static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} static float help(float a, float b) { - XVideoWaitForVBlank(); + while (true) + { + XVideoWaitForVBlank(); - debugClearScreen(); + debugClearScreen(); - for(int i = 0; i < ARRAY_SIZE(operations); i++) - { - MathOperation* o = &operations[i]; - debugPrint("%c: %s\n", o->command, o->description); + for(int i = 0; i < ARRAY_SIZE(operations); i++) + { + MathOperation* o = &operations[i]; + debugPrint("%c: %s\n", o->command, o->description); + } debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); - debugPrint("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); - } + debugPrint("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); + } + + + return a; } @@ -124,7 +130,7 @@ void printfloat(float value) { } -static bool isNewlyPressed(bool is_held, bool* was_held) +static bool isNewlyPressed(bool is_held, bool *was_held) { if (is_held) @@ -338,4 +344,4 @@ int main() } } } -} +} \ No newline at end of file From 7ed9dadf2f43a1b77435deb7569fe47f941972e2 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 13 Apr 2020 20:35:05 +0300 Subject: [PATCH 060/171] implemented remap() for correct getInput() work --- Maths Calculator (C)/XCalculator.c | 102 ++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 18 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index c595c78..61fc7c8 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -14,6 +14,8 @@ static float help(float a, float b); static float quit(float a, float b); +static bool isNewlyPressed(bool is_held, bool *was_held); + const float rads_per_degree = 0.01745329252; float rads; @@ -90,6 +92,10 @@ static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} static float help(float a, float b) { + static bool a_is_held = true; + + static bool a_was_held = true; + while (true) { @@ -103,12 +109,23 @@ static float help(float a, float b) debugPrint("%c: %s\n", o->command, o->description); } debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); - debugPrint("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); - } - + debugPrint("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + { + a_is_held = true; + } + else + { + a_is_held = false; + } + + if (isNewlyPressed(a_is_held, &a_was_held)) + { + break; + } + } - return a; } @@ -154,9 +171,14 @@ static bool isNewlyPressed(bool is_held, bool *was_held) } +float remap(float value, float from_min, float from_max, float to_min, float to_max){ + value = (value - from_min) / (from_max - from_min); + value = value * (to_max - to_min) + to_min; + return value; +} + static float getAxis(int sdl_axis) { - const float deadzone = 0.2f; // Get input in range -1 to +1 @@ -168,7 +190,12 @@ static float getAxis(int sdl_axis) return 0.0f; } - // Re-normalize after deadzone + if (amount > 0.0f) { + amount = remap(amount, +0.2f, +1.0f, 0.0f, +1.0f); // Remap from +[0.2, 1.0] to +[0.0, 1.0] + } + else { + amount = -remap(-amount, +0.2f, +1.0f, 0.0f, +1.0f); // Remap from -[0.2, 1.0] to -[0.0, 1.0] + } return amount; } @@ -254,6 +281,18 @@ static float getInput() static bool a_was_held = true; + static bool b_is_held = true; + + static bool b_was_held = true; + + static bool x_is_held = true; + + static bool x_was_held = true; + + static bool y_is_held = true; + + static bool y_was_held = true; + while (true) { XVideoWaitForVBlank(); @@ -266,24 +305,15 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - if(-Yamount > 0.5f) //use -Yamount for the controller going up because Y axis is inverted in nxdk-sdl - { - user_input += -Yamount / (float)REFRESH_DEFAULT; - } - else if (-Yamount < -0.5f) - { - user_input -= -Yamount / (float)REFRESH_DEFAULT; - } - - - - + user_input += -Yamount / (float)REFRESH_60HZ; debugPrint("Your input is: "); printfloat(user_input); debugPrint("\n"); printfloat(-Yamount); + + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { a_is_held = true; @@ -292,11 +322,47 @@ static float getInput() { a_is_held = false; } + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_B)) + { + b_is_held = true; + } + else + { + b_is_held = false; + } + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_X)) + { + x_is_held = true; + } + else + { + x_is_held = false; + } + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_Y)) + { + y_is_held = true; + } + else + { + y_is_held = false; + } if(isNewlyPressed(a_is_held, &a_was_held)) { break; } + else if(isNewlyPressed(b_is_held, &b_was_held)) + { + user_input += 10; + } + else if(isNewlyPressed(x_is_held, &x_was_held)) + { + user_input += 100; + } + else if(isNewlyPressed(y_is_held, &y_was_held)) + { + user_input += 1000; + } } return user_input; From 7009986c604fdef205b08b626e6649a781a10fda Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 13 Apr 2020 21:34:30 +0300 Subject: [PATCH 061/171] XCalculator now works --- Maths Calculator (C)/XCalculator.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 61fc7c8..ff8d785 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -63,7 +63,7 @@ SDL_GameController *controller = NULL; static void Init() { - XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); + XVideoSetMode(640, 480, 32, REFRESH_60HZ); SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); @@ -96,13 +96,14 @@ static float help(float a, float b) static bool a_was_held = true; - while (true) { XVideoWaitForVBlank(); debugClearScreen(); + SDL_GameControllerUpdate(); + for(int i = 0; i < ARRAY_SIZE(operations); i++) { MathOperation* o = &operations[i]; @@ -119,13 +120,13 @@ static float help(float a, float b) { a_is_held = false; } - + if (isNewlyPressed(a_is_held, &a_was_held)) { break; } } - + debugPrint("ẗest"); return a; } @@ -191,10 +192,10 @@ static float getAxis(int sdl_axis) } if (amount > 0.0f) { - amount = remap(amount, +0.2f, +1.0f, 0.0f, +1.0f); // Remap from +[0.2, 1.0] to +[0.0, 1.0] + amount = remap(amount, deadzone, +1.0f, 0.0f, +1.0f); // Remap from +[0.2, 1.0] to +[0.0, 1.0] } else { - amount = -remap(-amount, +0.2f, +1.0f, 0.0f, +1.0f); // Remap from -[0.2, 1.0] to -[0.0, 1.0] + amount = -remap(-amount, deadzone, +1.0f, 0.0f, +1.0f); // Remap from -[0.2, 1.0] to -[0.0, 1.0] } return amount; } From 9a6edd0b0f73ea734cb668b9f5993540ea99c603 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Tue, 14 Apr 2020 01:23:07 +0300 Subject: [PATCH 062/171] Fully documented XCalculator --- Maths Calculator (C)/XCalculator.c | 152 ++++++++++++++--------------- 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index ff8d785..36e3e82 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -10,22 +10,23 @@ #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) +// function prototypes static float help(float a, float b); static float quit(float a, float b); static bool isNewlyPressed(bool is_held, bool *was_held); -const float rads_per_degree = 0.01745329252; +const float rads_per_degree = 0.01745329252; // Rads per degree for the *D functions float rads; typedef struct { - const char command; - const char* description; - bool use_default_input; - float(*handler)(float a, float b); -}MathOperation; + const char command; // Command character + const char* description; // Command description + bool use_default_input; // Do we use the default input handler or not? + float(*handler)(float a, float b); // Pointer to the function that we will use for the operation +}MathOperation; // Create a struct for our Mathematical Operations static float addition(float a, float b) { return a + b; } @@ -35,7 +36,7 @@ static float division(float a, float b) { return a / b;} static float subtraction(float a, float b) { return a - b;} -static float cosD(float a, float b) {rads = a * rads_per_degree; return cos(rads);} +static float cosD(float a, float b) {rads = a * rads_per_degree; return cos(rads);} // math.h uses rads so we need to convert degrees to rads static float cosR(float a, float b) { return cos(a); } @@ -53,21 +54,19 @@ static float power(float a, float b) {return pow(a, b);} static float reset(float a, float b) {a = 0.0f; return a;} -char user_command = '\0'; +char user_command = '\0'; // Initialize a default character for the user's command (\0 is NULL) -float user_input = 1.0f; +float user_input = 1.0f; // Initialize a default user_input of 1.0 -float result = 0.0f; +float result = 0.0f; // Initialize a default result which is what we will be working on -SDL_GameController *controller = NULL; +SDL_GameController *controller = NULL; // We initialize a controller and give it a NULL value for now static void Init() { - XVideoSetMode(640, 480, 32, REFRESH_60HZ); + XVideoSetMode(640, 480, 32, REFRESH_60HZ); // Initialize the video for the console (640x480, 32bit color depth, 60Hz refresh rate) - SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); - - SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); //Initialize SDL for consoles + SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); // Initialize SDL } static MathOperation operations[] = { @@ -86,61 +85,61 @@ static MathOperation operations[] = { { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, { .command='q', .description="Quit", .use_default_input=false, .handler=quit }, { .command='h', .description="Help page", .use_default_input=false, .handler=help} -}; +}; // Create the array with the command characters, their descriptions, if they use the default input handler and what is their operation handler static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} static float help(float a, float b) { - static bool a_is_held = true; + static bool a_is_held = true; // Create a bool for checking if A is held in this frame - static bool a_was_held = true; + static bool a_was_held = true; // Create a bool for checking if A was held in the previous frame - while (true) + while (true) // Forever { - XVideoWaitForVBlank(); + XVideoWaitForVBlank(); // Wait for next refresh - debugClearScreen(); + debugClearScreen(); // Clear the screen - SDL_GameControllerUpdate(); + SDL_GameControllerUpdate(); // Update the controller - for(int i = 0; i < ARRAY_SIZE(operations); i++) + for(int i = 0; i < ARRAY_SIZE(operations); i++) // For the time that i (initialized with 0) is less than the Array size of operations { - MathOperation* o = &operations[i]; - debugPrint("%c: %s\n", o->command, o->description); + MathOperation* o = &operations[i]; // Pointer to the memory address of operations[] with index number i (changes in each iteration) called o. Expects pointing to MathOperation things only + debugPrint("%c: %s\n", o->command, o->description); // Print the command and description visible in the current array index } + // After the loop is over, print these messages that should be printed only once debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); - debugPrint("Press B to add 10 to the operation, X to add 100, and Y to add 1000"); + debugPrint("Press B to add 10 to the operation, X for 100, and Y for 1000"); - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) // If A is pressed { - a_is_held = true; + a_is_held = true; // A is held this frame, so set a_is_held to true } else { - a_is_held = false; + a_is_held = false; // A isn't held, set to false } - if (isNewlyPressed(a_is_held, &a_was_held)) + if (isNewlyPressed(a_is_held, &a_was_held)) // If A is newly pressed { - break; + break; // Exit the while(true) loop } } - debugPrint("ẗest"); - return a; + return a; //When exiting the loop return the variable a } // This function can only positive float values (negatives are not supported!) void printpositivefloat(float value) { - unsigned int notround = (unsigned int)(value * 1000.0 + 0.5f); - unsigned int beforeperiod = notround / 1000; - unsigned int afterperiod = notround % 1000; // I'd just use endallroundingmadness % 1000 - debugPrint("%u.%03u", beforeperiod, afterperiod); + unsigned int notround = (unsigned int)(value * 1000.0 + 0.5f); // Notround can only have positive values. It is our value by 1000 and then added 0.5 + unsigned int beforeperiod = notround / 1000; // Beforeperiod (.) is notround divided by 1000 (because we multiply by 1000 in notround) + unsigned int afterperiod = notround % 1000; // Afterperiod is the remainder of the division between notround and 1000 + debugPrint("%u.%03u", beforeperiod, afterperiod); // Print beforeperiod.afterperiod (afterperiod is maximum 3 digits) } // This function can print positive and negative float values void printfloat(float value) { - if (value < 0.0f) { + if (value < 0.0f) { // If value is negative debugPrint("-"); // Draw sign value = -value; // Make value positive } @@ -151,34 +150,34 @@ void printfloat(float value) { static bool isNewlyPressed(bool is_held, bool *was_held) { - if (is_held) + if (is_held) // If the button is held in this frame { - if (*was_held) + if (*was_held) // If it was held in the previous frame { - return false; + return false; // The button isn't newly pressed } - else + else // If it wasn't held in the previous frame { - *was_held = true; - return true; + *was_held = true; // Set was_held to true because the current frame will be the previous frame in the next frame + return true; // The button is newly pressed, so we return true } } - else + else // If it isn't held in the current frame { - *was_held = false; - return false; + *was_held = false; // Set was_held to false + return false; // The button isn't pressed at all, so we return false } } -float remap(float value, float from_min, float from_max, float to_min, float to_max){ +float remap(float value, float from_min, float from_max, float to_min, float to_max){ // Function to remap values to other values value = (value - from_min) / (from_max - from_min); value = value * (to_max - to_min) + to_min; return value; } -static float getAxis(int sdl_axis) +static float getAxis(int sdl_axis) // Function to get an axis from the controller { const float deadzone = 0.2f; @@ -210,9 +209,9 @@ static char getCommand(void) static bool x_was_pushed = true; - int accessnum = 0; + int accessnum = 0; // We use an access number to iterate through the operations[] table - while (true) + while (true) // Forever { XVideoWaitForVBlank(); @@ -221,41 +220,42 @@ static char getCommand(void) SDL_GameControllerUpdate(); debugPrint("Current result is: "); - printfloat(result); + printfloat(result); // Use printfloat() to print our current result debugPrint(". Please tell me your desired calculation type. For help enter h.\n"); - float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); + float Xamount = getAxis(SDL_CONTROLLER_AXIS_LEFTX); // Xamount is the amount returned by getAxis for the X axis of the left analog stick - bool is_left_analog_left = Xamount < -0.5f; + bool is_left_analog_left = Xamount < -0.5f; // Initialize a boolean to check if Xamount is lesser than -0.5. If so, the left analog is left - bool is_left_analog_right = Xamount > 0.5f; + bool is_left_analog_right = Xamount > 0.5f; // Initialize a boolean to check if Xamount is greater than 0.5. If so, the left analog is right bool was_left_analog_left = false; bool was_left_analog_right = false; - if(accessnum > 0) + // Code to prevent the access number from going out of bounds from operations[] + if(accessnum > 0) // If accessnum is bigger than 0 { - if(isNewlyPressed(is_left_analog_left, &was_left_analog_left)) { accessnum--; } + if(isNewlyPressed(is_left_analog_left, &was_left_analog_left)) { accessnum--; } // If the left analog is left reduce the accessnum } else { - accessnum = 0; + accessnum = 0; // If it is smaller than 0, set it to 0 } - + // ARRAY_SIZE(operations) returns all of the elements, but since it also counts index 0 we want accessnum to see if accessnum is lesser than the size - 1 if(accessnum < ARRAY_SIZE(operations) - 1) { - if(isNewlyPressed(is_left_analog_right, &was_left_analog_right)) { accessnum++; } + if(isNewlyPressed(is_left_analog_right, &was_left_analog_right)) { accessnum++; } // If the left analog is right increase the accessnum } else { - accessnum = ARRAY_SIZE(operations) - 1; + accessnum = ARRAY_SIZE(operations) - 1; // If accessnum is bigger than the size - 1 then set it to size - 1 } - MathOperation* o = &operations[accessnum]; + MathOperation* o = &operations[accessnum]; // Like in help() but with an accessnum instead of i - debugPrint("Current selected mode is: %c (%s)", o->command, o->description); + debugPrint("Current selected mode is: %c (%s)\n", o->command, o->description); // Print the current command and description if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { @@ -268,7 +268,7 @@ static char getCommand(void) if (isNewlyPressed(a_is_held, &a_was_held)) { - user_command = o->command; + user_command = o->command; // Set the user command to the current command in operations[] break; } } @@ -306,7 +306,7 @@ static float getInput() float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - user_input += -Yamount / (float)REFRESH_60HZ; + user_input += -Yamount / (float)REFRESH_60HZ; // user_input is equal to its current value + inverted Yamount (Workaround for inverted Y axis) debugPrint("Your input is: "); printfloat(user_input); @@ -375,19 +375,19 @@ int main() static bool a_was_held = false; - Init(); + Init(); // Initialize using the Init() function for video and SDL - for (int i = 0; i < SDL_NumJoysticks(); i++) + for (int i = 0; i < SDL_NumJoysticks(); i++) // For the time that i is smaller than the number of connected Joysticks { - if(SDL_IsGameController(i)) + if(SDL_IsGameController(i)) // If i (which we use to iterate through the connected controllers) as a port number is a Game Controller { - controller = SDL_GameControllerOpen(i); + controller = SDL_GameControllerOpen(i); // Open the controller - if(controller) + if(controller) // If we find that we opened a controller { - break; + break; // Exit the loop } } @@ -399,15 +399,15 @@ int main() for (int i = 0; i < ARRAY_SIZE(operations); i++) { - MathOperation* o = &operations[i]; + MathOperation* o = &operations[i]; // Iterate through operations[] using i from the for() loop - if (o->command == user_command) + if (o->command == user_command) // When the command number of the index of i in operations[] equals our user_command { - if(o->use_default_input == true) + if(o->use_default_input == true) // If it uses the default input handler { - getInput(); + getInput(); } - result = o->handler(result, user_input); + result = o->handler(result, user_input); // Calculate our result and store it } } } From a2ca87f7c72666dcea8c9db87bafa6cfcdd75d9d Mon Sep 17 00:00:00 2001 From: Kosmas12 Date: Tue, 14 Apr 2020 22:47:55 +0300 Subject: [PATCH 063/171] git config --global user.email johndoe@example.com --- Maths Calculator (C)/XCalculator.c | 169 +++++++++++------------------ 1 file changed, 64 insertions(+), 105 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 36e3e82..a180d6a 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -19,8 +19,6 @@ static bool isNewlyPressed(bool is_held, bool *was_held); const float rads_per_degree = 0.01745329252; // Rads per degree for the *D functions -float rads; - typedef struct { const char command; // Command character const char* description; // Command description @@ -32,27 +30,27 @@ static float addition(float a, float b) { return a + b; } static float multiplication(float a, float b) { return a * b; } -static float division(float a, float b) { return a / b;} +static float division(float a, float b) { return a / b; } -static float subtraction(float a, float b) { return a - b;} +static float subtraction(float a, float b) { return a - b; } -static float cosD(float a, float b) {rads = a * rads_per_degree; return cos(rads);} // math.h uses rads so we need to convert degrees to rads +static float cosD(float a, float b) { return cos(a * rads_per_degree); } // math.h uses rads so we need to convert degrees to rads static float cosR(float a, float b) { return cos(a); } -static float tanD(float a, float b) {rads = a * rads_per_degree; return tan(rads);} +static float tanD(float a, float b) { return tan(a * rads_per_degree); } static float tanR(float a, float b) { return tan(a); } -static float sinD(float a, float b) {rads = a * rads_per_degree; return sin(rads);} +static float sinD(float a, float b) { return sin(a * rads_per_degree); } static float sinR(float a, float b) { return sin(a); } static float squareRoot(float a, float b) { return sqrt(a); } -static float power(float a, float b) {return pow(a, b);} +static float power(float a, float b) {return pow(a, b); } -static float reset(float a, float b) {a = 0.0f; return a;} +static float reset(float a, float b) {a = 0.0f; return a; } char user_command = '\0'; // Initialize a default character for the user's command (\0 is NULL) @@ -62,8 +60,7 @@ float result = 0.0f; // Initialize a default result which is what we will be wor SDL_GameController *controller = NULL; // We initialize a controller and give it a NULL value for now -static void Init() -{ +static void Init() { XVideoSetMode(640, 480, 32, REFRESH_60HZ); // Initialize the video for the console (640x480, 32bit color depth, 60Hz refresh rate) SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); // Initialize SDL @@ -87,24 +84,21 @@ static MathOperation operations[] = { { .command='h', .description="Help page", .use_default_input=false, .handler=help} }; // Create the array with the command characters, their descriptions, if they use the default input handler and what is their operation handler -static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0);} +static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0); } -static float help(float a, float b) -{ +static float help(float a, float b) { static bool a_is_held = true; // Create a bool for checking if A is held in this frame static bool a_was_held = true; // Create a bool for checking if A was held in the previous frame - while (true) // Forever - { + while (true) { // Forever XVideoWaitForVBlank(); // Wait for next refresh debugClearScreen(); // Clear the screen SDL_GameControllerUpdate(); // Update the controller - for(int i = 0; i < ARRAY_SIZE(operations); i++) // For the time that i (initialized with 0) is less than the Array size of operations - { + for(int i = 0; i < ARRAY_SIZE(operations); i++) { // For the time that i (initialized with 0) is less than the Array size of operations MathOperation* o = &operations[i]; // Pointer to the memory address of operations[] with index number i (changes in each iteration) called o. Expects pointing to MathOperation things only debugPrint("%c: %s\n", o->command, o->description); // Print the command and description visible in the current array index } @@ -112,17 +106,15 @@ static float help(float a, float b) debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); debugPrint("Press B to add 10 to the operation, X for 100, and Y for 1000"); - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) // If A is pressed - { + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { // If A is pressed a_is_held = true; // A is held this frame, so set a_is_held to true + } + else { + a_is_held = false; } - else - { - a_is_held = false; // A isn't held, set to false - } + - if (isNewlyPressed(a_is_held, &a_was_held)) // If A is newly pressed - { + if (isNewlyPressed(a_is_held, &a_was_held)) { // If A is newly pressed break; // Exit the while(true) loop } } @@ -147,46 +139,40 @@ void printfloat(float value) { } -static bool isNewlyPressed(bool is_held, bool *was_held) -{ +static bool isNewlyPressed(bool is_held, bool *was_held) { - if (is_held) // If the button is held in this frame - { - if (*was_held) // If it was held in the previous frame - { + if (is_held) { // If the button is held in this frame + if (*was_held) { // If it was held in the previous frame return false; // The button isn't newly pressed } - else // If it wasn't held in the previous frame - { + else { // If it wasn't held in the previous frame *was_held = true; // Set was_held to true because the current frame will be the previous frame in the next frame return true; // The button is newly pressed, so we return true } - } - else // If it isn't held in the current frame - { + } + else { // If it isn't held in the current frame *was_held = false; // Set was_held to false return false; // The button isn't pressed at all, so we return false } } -float remap(float value, float from_min, float from_max, float to_min, float to_max){ // Function to remap values to other values +float remap(float value, float from_min, float from_max, float to_min, float to_max) { // Function to remap values to other values value = (value - from_min) / (from_max - from_min); value = value * (to_max - to_min) + to_min; return value; } -static float getAxis(int sdl_axis) // Function to get an axis from the controller -{ +static float getAxis(int sdl_axis) { // Function to get an axis from the controller + const float deadzone = 0.2f; // Get input in range -1 to +1 float amount = (float)SDL_GameControllerGetAxis(controller, sdl_axis) / (float)0x8000; // Reject if the stick is in deadzone - if (fabsf(amount) < deadzone) - { + if (fabsf(amount) < deadzone) { return 0.0f; } @@ -199,8 +185,7 @@ static float getAxis(int sdl_axis) // Function to get an axis from the controlle return amount; } -static char getCommand(void) -{ +static char getCommand(void) { static bool a_is_held = true; static bool a_was_held = true; @@ -211,8 +196,7 @@ static char getCommand(void) int accessnum = 0; // We use an access number to iterate through the operations[] table - while (true) // Forever - { + while (true) { // Forever XVideoWaitForVBlank(); debugClearScreen(); @@ -234,22 +218,18 @@ static char getCommand(void) bool was_left_analog_right = false; // Code to prevent the access number from going out of bounds from operations[] - if(accessnum > 0) // If accessnum is bigger than 0 - { + if(accessnum > 0) { // If accessnum is bigger than 0 if(isNewlyPressed(is_left_analog_left, &was_left_analog_left)) { accessnum--; } // If the left analog is left reduce the accessnum - } - else - { + } + else { accessnum = 0; // If it is smaller than 0, set it to 0 } // ARRAY_SIZE(operations) returns all of the elements, but since it also counts index 0 we want accessnum to see if accessnum is lesser than the size - 1 - if(accessnum < ARRAY_SIZE(operations) - 1) - { + if(accessnum < ARRAY_SIZE(operations) - 1) { if(isNewlyPressed(is_left_analog_right, &was_left_analog_right)) { accessnum++; } // If the left analog is right increase the accessnum } - else - { + else { accessnum = ARRAY_SIZE(operations) - 1; // If accessnum is bigger than the size - 1 then set it to size - 1 } @@ -257,17 +237,14 @@ static char getCommand(void) debugPrint("Current selected mode is: %c (%s)\n", o->command, o->description); // Print the current command and description - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { a_is_held = true; } - else - { + else { a_is_held = false; } - if (isNewlyPressed(a_is_held, &a_was_held)) - { + if (isNewlyPressed(a_is_held, &a_was_held)) { user_command = o->command; // Set the user command to the current command in operations[] break; } @@ -276,8 +253,7 @@ static char getCommand(void) return user_command; } -static float getInput() -{ +static float getInput() { static bool a_is_held = true; static bool a_was_held = true; @@ -294,8 +270,7 @@ static float getInput() static bool y_was_held = true; - while (true) - { + while (true) { XVideoWaitForVBlank(); debugClearScreen(); @@ -315,61 +290,48 @@ static float getInput() - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) - { + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { a_is_held = true; } - else - { + else { a_is_held = false; } - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_B)) - { + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_B)) { b_is_held = true; } - else - { + else { b_is_held = false; } - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_X)) - { + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_X)) { x_is_held = true; } - else - { + else { x_is_held = false; } - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_Y)) - { + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_Y)) { y_is_held = true; } - else - { + else { y_is_held = false; } - if(isNewlyPressed(a_is_held, &a_was_held)) - { + if(isNewlyPressed(a_is_held, &a_was_held)) { break; } - else if(isNewlyPressed(b_is_held, &b_was_held)) - { + else if(isNewlyPressed(b_is_held, &b_was_held)) { user_input += 10; } - else if(isNewlyPressed(x_is_held, &x_was_held)) - { + else if(isNewlyPressed(x_is_held, &x_was_held)) { user_input += 100; } - else if(isNewlyPressed(y_is_held, &y_was_held)) - { + else if(isNewlyPressed(y_is_held, &y_was_held)) { user_input += 1000; } } return user_input; } -int main() -{ +int main() { static bool a_is_held = true; @@ -378,36 +340,33 @@ int main() Init(); // Initialize using the Init() function for video and SDL - for (int i = 0; i < SDL_NumJoysticks(); i++) // For the time that i is smaller than the number of connected Joysticks - { + for (int i = 0; i < SDL_NumJoysticks(); i++) { // For the time that i is smaller than the number of connected Joysticks - if(SDL_IsGameController(i)) // If i (which we use to iterate through the connected controllers) as a port number is a Game Controller - { + if(SDL_IsGameController(i)) { // If i (which we use to iterate through the connected controllers) as a port number is a Game Controller controller = SDL_GameControllerOpen(i); // Open the controller - if(controller) // If we find that we opened a controller - { + if(controller) { // If we find that we opened a controller break; // Exit the loop } } } - while(user_command != 'q') - { + while(user_command != 'q') { getCommand(); - for (int i = 0; i < ARRAY_SIZE(operations); i++) - { + for (int i = 0; i < ARRAY_SIZE(operations); i++) { + MathOperation* o = &operations[i]; // Iterate through operations[] using i from the for() loop - if (o->command == user_command) // When the command number of the index of i in operations[] equals our user_command - { - if(o->use_default_input == true) // If it uses the default input handler - { + if (o->command == user_command) { // When the command number of the index of i in operations[] equals our user_command + + if(o->use_default_input == true) { // If it uses the default input handler + getInput(); } result = o->handler(result, user_input); // Calculate our result and store it + user_input = 1.0f; // Reset user_input after every operation } } } From b787d6af667922bbcafa63c7e7abffd4cd6c0150 Mon Sep 17 00:00:00 2001 From: Kosmas12 Date: Tue, 14 Apr 2020 22:48:43 +0300 Subject: [PATCH 064/171] resets user_input after operations and imrpoved readability --- Maths Calculator (C)/XCalculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index a180d6a..a1b66f0 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -366,7 +366,7 @@ int main() { getInput(); } result = o->handler(result, user_input); // Calculate our result and store it - user_input = 1.0f; // Reset user_input after every operation + user_input = 1.0f; // Resets user_input after every operation } } } From 7500a695720704392edd4cbba6315052dcbff544 Mon Sep 17 00:00:00 2001 From: Kosmas12 Date: Tue, 14 Apr 2020 23:44:57 +0300 Subject: [PATCH 065/171] Started working on a subcalculator for XCalculator --- Maths Calculator (C)/XCalculator.c | 51 +++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index a1b66f0..676cdcf 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -17,6 +17,12 @@ static float quit(float a, float b); static bool isNewlyPressed(bool is_held, bool *was_held); +static char getCommand(); + +static float getInput(); + +static float subcalc(float a, float b); + const float rads_per_degree = 0.01745329252; // Rads per degree for the *D functions typedef struct { @@ -50,7 +56,7 @@ static float squareRoot(float a, float b) { return sqrt(a); } static float power(float a, float b) {return pow(a, b); } -static float reset(float a, float b) {a = 0.0f; return a; } +static float reset(float a, float b) {a = 0.0f; return a; } char user_command = '\0'; // Initialize a default character for the user's command (\0 is NULL) @@ -79,8 +85,8 @@ static MathOperation operations[] = { { .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, { .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, + { .command='(', .description="Subcalculator", .use_default_input=false, .handler=subcalc}, { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, - { .command='q', .description="Quit", .use_default_input=false, .handler=quit }, { .command='h', .description="Help page", .use_default_input=false, .handler=help} }; // Create the array with the command characters, their descriptions, if they use the default input handler and what is their operation handler @@ -121,7 +127,7 @@ static float help(float a, float b) { return a; //When exiting the loop return the variable a } -// This function can only positive float values (negatives are not supported!) +// This function can only print positive float values (negatives are not supported!) void printpositivefloat(float value) { unsigned int notround = (unsigned int)(value * 1000.0 + 0.5f); // Notround can only have positive values. It is our value by 1000 and then added 0.5 unsigned int beforeperiod = notround / 1000; // Beforeperiod (.) is notround divided by 1000 (because we multiply by 1000 in notround) @@ -131,14 +137,37 @@ void printpositivefloat(float value) { // This function can print positive and negative float values void printfloat(float value) { - if (value < 0.0f) { // If value is negative - debugPrint("-"); // Draw sign - value = -value; // Make value positive - } - printpositivefloat(value); // Print positive value + if (value < 0.0f) { // If value is negative + debugPrint("-"); // Draw sign + value = -value; // Make value positive + } + printpositivefloat(value); // Print positive value } +static float subcalc(float a, float b) { + float totalres = 0.0f; + + while(user_command != 'q') { + + getCommand(); + + for (int i = 0; i < ARRAY_SIZE(operations); i++) { + + MathOperation* o = &operations[i]; // Iterate through operations[] using i from the for() loop + if (o->command == user_command) { // When the command number of the index of i in operations[] equals our user_command + + if(o->use_default_input == true) { // If it uses the default input handler + + getInput(); + } + totalres += o->handler(result, user_input); // Calculate our total result and store it + user_input = 1.0f; // Resets user_input after every operation + } + } + } + return totalres; +} static bool isNewlyPressed(bool is_held, bool *was_held) { if (is_held) { // If the button is held in this frame @@ -159,8 +188,7 @@ static bool isNewlyPressed(bool is_held, bool *was_held) { float remap(float value, float from_min, float from_max, float to_min, float to_max) { // Function to remap values to other values - value = (value - from_min) / (from_max - from_min); - value = value * (to_max - to_min) + to_min; + value = ((value - from_min) / (from_max - from_min)) * (to_max - to_min) + to_min; return value; } @@ -185,7 +213,7 @@ static float getAxis(int sdl_axis) { // Function to get an axis from the control return amount; } -static char getCommand(void) { +static char getCommand() { static bool a_is_held = true; static bool a_was_held = true; @@ -353,6 +381,7 @@ int main() { } while(user_command != 'q') { + getCommand(); for (int i = 0; i < ARRAY_SIZE(operations); i++) { From c3ded53b14f719fc0319435b21f4b199464e50dd Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 19 Apr 2020 22:58:06 +0300 Subject: [PATCH 066/171] Started work on minicalc() --- Maths Calculator (C)/XCalculator.c | 101 +++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 26 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 676cdcf..596b628 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -21,7 +21,7 @@ static char getCommand(); static float getInput(); -static float subcalc(float a, float b); +static void minicalc(float a, float b); const float rads_per_degree = 0.01745329252; // Rads per degree for the *D functions @@ -72,6 +72,36 @@ static void Init() { SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); // Initialize SDL } +static void checkForMinicalc() { + bool start_is_held = true; + bool start_was_held = true; + + while (true) + { + + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) + { + start_is_held = true; + } + else + { + start_is_held = false; + } + + if (isNewlyPressed(start_is_held, &start_was_held)) + { + minicalc(result, user_input); + break; + } + else + { + break; + } + + } +} + + static MathOperation operations[] = { { .command='+', .description="Addition", .use_default_input=true, .handler=addition }, { .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, @@ -85,7 +115,6 @@ static MathOperation operations[] = { { .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, { .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, - { .command='(', .description="Subcalculator", .use_default_input=false, .handler=subcalc}, { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, { .command='h', .description="Help page", .use_default_input=false, .handler=help} }; // Create the array with the command characters, their descriptions, if they use the default input handler and what is their operation handler @@ -144,30 +173,6 @@ void printfloat(float value) { printpositivefloat(value); // Print positive value } -static float subcalc(float a, float b) { - float totalres = 0.0f; - - while(user_command != 'q') { - - getCommand(); - - for (int i = 0; i < ARRAY_SIZE(operations); i++) { - - MathOperation* o = &operations[i]; // Iterate through operations[] using i from the for() loop - - if (o->command == user_command) { // When the command number of the index of i in operations[] equals our user_command - - if(o->use_default_input == true) { // If it uses the default input handler - - getInput(); - } - totalres += o->handler(result, user_input); // Calculate our total result and store it - user_input = 1.0f; // Resets user_input after every operation - } - } - } - return totalres; -} static bool isNewlyPressed(bool is_held, bool *was_held) { if (is_held) { // If the button is held in this frame @@ -281,6 +286,48 @@ static char getCommand() { return user_command; } + +static void minicalc(float a, float b) { + + bool start_is_held = true; + + bool start_was_held = true; + + while (true) + { + getCommand(); + + for (int i = 0; i < ARRAY_SIZE(operations); i++) { + + MathOperation* o = &operations[i]; // Iterate through operations[] using i from the for() loop + + if (o->command == user_command) { // When the command number of the index of i in operations[] equals our user_command + + if(o->use_default_input == true) { // If it uses the default input handler + + getInput(); + } + b = o->handler(a, b); // Calculate our result and store it + user_input += b; + } + } + + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) + { + start_is_held = true; + } + else + { + start_is_held = false; + } + + if(isNewlyPressed(start_is_held, &start_was_held)){ + + break; + } + } +} + static float getInput() { static bool a_is_held = true; @@ -305,6 +352,8 @@ static float getInput() { SDL_GameControllerUpdate(); + checkForMinicalc(); + debugPrint("Please give me the number you want to use for the operation. "); float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); From caa9de94f462749e3db6ebbb6399f2cd2d9f3768 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Sun, 19 Apr 2020 23:05:35 +0300 Subject: [PATCH 067/171] Improved control over the input number in getInput() --- Maths Calculator (C)/XCalculator.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 596b628..15f8d2d 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -74,6 +74,7 @@ static void Init() { static void checkForMinicalc() { bool start_is_held = true; + bool start_was_held = true; while (true) @@ -345,7 +346,8 @@ static float getInput() { static bool y_was_held = true; - while (true) { + while (true) { + XVideoWaitForVBlank(); debugClearScreen(); @@ -358,7 +360,7 @@ static float getInput() { float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); - user_input += -Yamount / (float)REFRESH_60HZ; // user_input is equal to its current value + inverted Yamount (Workaround for inverted Y axis) + user_input += -Yamount / (float) 144; // user_input is equal to its current value + inverted Yamount (Workaround for inverted Y axis) debugPrint("Your input is: "); printfloat(user_input); From 6ab619f740e284fdbc1a318499f1622878e237e3 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 20 Apr 2020 19:25:47 +0300 Subject: [PATCH 068/171] Creating 1 codebase for both PC and Xbox --- Maths Calculator (C)/XCalculator.c | 112 +++++++++++++++++++---------- 1 file changed, 74 insertions(+), 38 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 15f8d2d..afeb1bf 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -2,11 +2,13 @@ #include #include #include +#ifdef NXDK #include #include #include #include #include +#endif #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) @@ -14,8 +16,9 @@ static float help(float a, float b); static float quit(float a, float b); - +#ifdef NXDK static bool isNewlyPressed(bool is_held, bool *was_held); +#endif static char getCommand(); @@ -64,6 +67,7 @@ float user_input = 1.0f; // Initialize a default user_input of 1.0 float result = 0.0f; // Initialize a default result which is what we will be working on +#ifdef NXDK SDL_GameController *controller = NULL; // We initialize a controller and give it a NULL value for now static void Init() { @@ -71,37 +75,40 @@ static void Init() { SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); // Initialize SDL } +#endif static void checkForMinicalc() { +#ifdef NXDK bool start_is_held = true; bool start_was_held = true; +#endif +while (true) { + #ifdef NXDK + SDL_GameControllerUpdate(); - while (true) - { + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) { - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) - { - start_is_held = true; - } - else - { - start_is_held = false; - } + start_is_held = true; + } + else { - if (isNewlyPressed(start_is_held, &start_was_held)) - { - minicalc(result, user_input); - break; - } - else - { - break; - } - - } -} + start_is_held = false; + } + + if (isNewlyPressed(start_is_held, &start_was_held)) { + + minicalc(result, user_input); + } + } + #else + if (user_input == '(') + { + minicalc(result, user_input); + } + #endif +} static MathOperation operations[] = { { .command='+', .description="Addition", .use_default_input=true, .handler=addition }, @@ -115,14 +122,26 @@ static MathOperation operations[] = { { .command='C', .description="Cos with angle in radians", .use_default_input=true, .handler=cosR}, { .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, { .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, + #ifndef NXDK + { .command='(', .description="Mini calculator", .use_default_input=false, .handler=minicalc}, + #endif { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, { .command='h', .description="Help page", .use_default_input=false, .handler=help} }; // Create the array with the command characters, their descriptions, if they use the default input handler and what is their operation handler -static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0); } +static void quit() { + #ifdef NXDK + debugPrint("Exiting...\n"); + #else + printf("Exiting... \n"); + #endif + exit(0); +} static float help(float a, float b) { + + #ifdef NXDK static bool a_is_held = true; // Create a bool for checking if A is held in this frame static bool a_was_held = true; // Create a bool for checking if A was held in the previous frame @@ -137,6 +156,7 @@ static float help(float a, float b) { for(int i = 0; i < ARRAY_SIZE(operations); i++) { // For the time that i (initialized with 0) is less than the Array size of operations MathOperation* o = &operations[i]; // Pointer to the memory address of operations[] with index number i (changes in each iteration) called o. Expects pointing to MathOperation things only debugPrint("%c: %s\n", o->command, o->description); // Print the command and description visible in the current array index + printf("%c: %s\n", o->command, o->description); } // After the loop is over, print these messages that should be printed only once debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); @@ -153,10 +173,18 @@ static float help(float a, float b) { if (isNewlyPressed(a_is_held, &a_was_held)) { // If A is newly pressed break; // Exit the while(true) loop } + } + #else + for(int i = 0; i < ARRAY_SIZE(operations); i++) { // For the time that i (initialized with 0) is less than the Array size of operations + MathOperation* o = &operations[i]; // Pointer to the memory address of operations[] with index number i (changes in each iteration) called o. Expects pointing to MathOperation things only + printf("%c: %s\n", o->command, o->description); + } + #endif return a; //When exiting the loop return the variable a } +#ifdef NXDK // This function can only print positive float values (negatives are not supported!) void printpositivefloat(float value) { unsigned int notround = (unsigned int)(value * 1000.0 + 0.5f); // Notround can only have positive values. It is our value by 1000 and then added 0.5 @@ -218,8 +246,10 @@ static float getAxis(int sdl_axis) { // Function to get an axis from the control } return amount; } +#endif static char getCommand() { + #ifdef NXDK static bool a_is_held = true; static bool a_was_held = true; @@ -282,20 +312,25 @@ static char getCommand() { user_command = o->command; // Set the user command to the current command in operations[] break; } + } - + #else + scanf("%c", &user_command); + #endif return user_command; } static void minicalc(float a, float b) { + #ifdef NXDK bool start_is_held = true; bool start_was_held = true; + #endif - while (true) - { + while (true) { + getCommand(); for (int i = 0; i < ARRAY_SIZE(operations); i++) { @@ -312,24 +347,24 @@ static void minicalc(float a, float b) { user_input += b; } } - - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) - { + #ifdef NXDK + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) { start_is_held = true; } - else - { + else { start_is_held = false; } - if(isNewlyPressed(start_is_held, &start_was_held)){ + if(isNewlyPressed(start_is_held, &start_was_held)) { break; } + #endif } } static float getInput() { + #ifdef NXDK static bool a_is_held = true; static bool a_was_held = true; @@ -347,7 +382,6 @@ static float getInput() { static bool y_was_held = true; while (true) { - XVideoWaitForVBlank(); debugClearScreen(); @@ -365,9 +399,6 @@ static float getInput() { debugPrint("Your input is: "); printfloat(user_input); debugPrint("\n"); - printfloat(-Yamount); - - if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { a_is_held = true; @@ -407,11 +438,15 @@ static float getInput() { user_input += 1000; } } + #else + printf("Please give me the number you want to use for the operation. "); + scanf("%f", &user_input); + #endif return user_input; } int main() { - + #ifdef NXDK static bool a_is_held = true; static bool a_was_held = false; @@ -430,6 +465,7 @@ int main() { } } + #endif while(user_command != 'q') { From 7c4bc76077a0385a077a8c5bb130cec35e30e57c Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 20 Apr 2020 19:46:06 +0300 Subject: [PATCH 069/171] . --- Maths Calculator (C)/XCalculator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index afeb1bf..d76bff8 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -15,7 +15,7 @@ // function prototypes static float help(float a, float b); -static float quit(float a, float b); +static void quit(); #ifdef NXDK static bool isNewlyPressed(bool is_held, bool *was_held); #endif @@ -139,7 +139,7 @@ static void quit() { exit(0); } -static float help(float a, float b) { +static help(float a, float b) { #ifdef NXDK static bool a_is_held = true; // Create a bool for checking if A is held in this frame From a4ac0a8491bc472df4a84a7e5b08fed17f2aac8a Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 20 Apr 2020 20:48:36 +0300 Subject: [PATCH 070/171] Abandoned same codebase for all platforms --- Maths Calculator (C)/XCalculator.c | 116 ++++++++++------------------- 1 file changed, 40 insertions(+), 76 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index d76bff8..15f8d2d 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -2,23 +2,20 @@ #include #include #include -#ifdef NXDK #include #include #include #include #include -#endif #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) // function prototypes static float help(float a, float b); -static void quit(); -#ifdef NXDK +static float quit(float a, float b); + static bool isNewlyPressed(bool is_held, bool *was_held); -#endif static char getCommand(); @@ -67,7 +64,6 @@ float user_input = 1.0f; // Initialize a default user_input of 1.0 float result = 0.0f; // Initialize a default result which is what we will be working on -#ifdef NXDK SDL_GameController *controller = NULL; // We initialize a controller and give it a NULL value for now static void Init() { @@ -75,41 +71,38 @@ static void Init() { SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); // Initialize SDL } -#endif static void checkForMinicalc() { -#ifdef NXDK bool start_is_held = true; bool start_was_held = true; -#endif -while (true) { - #ifdef NXDK - SDL_GameControllerUpdate(); - - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) { - start_is_held = true; - } - else { - - start_is_held = false; - } - - if (isNewlyPressed(start_is_held, &start_was_held)) { + while (true) + { - minicalc(result, user_input); - } + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) + { + start_is_held = true; + } + else + { + start_is_held = false; + } - } - #else - if (user_input == '(') - { - minicalc(result, user_input); - } - #endif + if (isNewlyPressed(start_is_held, &start_was_held)) + { + minicalc(result, user_input); + break; + } + else + { + break; + } + + } } + static MathOperation operations[] = { { .command='+', .description="Addition", .use_default_input=true, .handler=addition }, { .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, @@ -122,26 +115,14 @@ static MathOperation operations[] = { { .command='C', .description="Cos with angle in radians", .use_default_input=true, .handler=cosR}, { .command='t', .description="Tan with angle in degrees", .use_default_input=true, .handler=tanD}, { .command='T', .description="Tan with angle in radians", .use_default_input=true, .handler=tanR}, - #ifndef NXDK - { .command='(', .description="Mini calculator", .use_default_input=false, .handler=minicalc}, - #endif { .command='p', .description="Raise to the power of", .use_default_input=true, .handler=power}, { .command='e', .description="Reset result", .use_default_input=false, .handler=reset}, { .command='h', .description="Help page", .use_default_input=false, .handler=help} }; // Create the array with the command characters, their descriptions, if they use the default input handler and what is their operation handler -static void quit() { - #ifdef NXDK - debugPrint("Exiting...\n"); - #else - printf("Exiting... \n"); - #endif - exit(0); -} +static float quit(float a, float b) { debugPrint("Exiting...\n"); exit(0); } -static help(float a, float b) { - - #ifdef NXDK +static float help(float a, float b) { static bool a_is_held = true; // Create a bool for checking if A is held in this frame static bool a_was_held = true; // Create a bool for checking if A was held in the previous frame @@ -156,7 +137,6 @@ static help(float a, float b) { for(int i = 0; i < ARRAY_SIZE(operations); i++) { // For the time that i (initialized with 0) is less than the Array size of operations MathOperation* o = &operations[i]; // Pointer to the memory address of operations[] with index number i (changes in each iteration) called o. Expects pointing to MathOperation things only debugPrint("%c: %s\n", o->command, o->description); // Print the command and description visible in the current array index - printf("%c: %s\n", o->command, o->description); } // After the loop is over, print these messages that should be printed only once debugPrint("Also note that you start with 0 on the result so your first operation will work with 0 and your number.\n"); @@ -173,18 +153,10 @@ static help(float a, float b) { if (isNewlyPressed(a_is_held, &a_was_held)) { // If A is newly pressed break; // Exit the while(true) loop } - } - #else - for(int i = 0; i < ARRAY_SIZE(operations); i++) { // For the time that i (initialized with 0) is less than the Array size of operations - MathOperation* o = &operations[i]; // Pointer to the memory address of operations[] with index number i (changes in each iteration) called o. Expects pointing to MathOperation things only - printf("%c: %s\n", o->command, o->description); - } - #endif return a; //When exiting the loop return the variable a } -#ifdef NXDK // This function can only print positive float values (negatives are not supported!) void printpositivefloat(float value) { unsigned int notround = (unsigned int)(value * 1000.0 + 0.5f); // Notround can only have positive values. It is our value by 1000 and then added 0.5 @@ -246,10 +218,8 @@ static float getAxis(int sdl_axis) { // Function to get an axis from the control } return amount; } -#endif static char getCommand() { - #ifdef NXDK static bool a_is_held = true; static bool a_was_held = true; @@ -312,25 +282,20 @@ static char getCommand() { user_command = o->command; // Set the user command to the current command in operations[] break; } - } - #else - scanf("%c", &user_command); - #endif + return user_command; } static void minicalc(float a, float b) { - #ifdef NXDK bool start_is_held = true; bool start_was_held = true; - #endif - while (true) { - + while (true) + { getCommand(); for (int i = 0; i < ARRAY_SIZE(operations); i++) { @@ -347,24 +312,24 @@ static void minicalc(float a, float b) { user_input += b; } } - #ifdef NXDK - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) { + + if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) + { start_is_held = true; } - else { + else + { start_is_held = false; } - if(isNewlyPressed(start_is_held, &start_was_held)) { + if(isNewlyPressed(start_is_held, &start_was_held)){ break; } - #endif } } static float getInput() { - #ifdef NXDK static bool a_is_held = true; static bool a_was_held = true; @@ -382,6 +347,7 @@ static float getInput() { static bool y_was_held = true; while (true) { + XVideoWaitForVBlank(); debugClearScreen(); @@ -399,6 +365,9 @@ static float getInput() { debugPrint("Your input is: "); printfloat(user_input); debugPrint("\n"); + printfloat(-Yamount); + + if(SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_A)) { a_is_held = true; @@ -438,15 +407,11 @@ static float getInput() { user_input += 1000; } } - #else - printf("Please give me the number you want to use for the operation. "); - scanf("%f", &user_input); - #endif return user_input; } int main() { - #ifdef NXDK + static bool a_is_held = true; static bool a_was_held = false; @@ -465,7 +430,6 @@ int main() { } } - #endif while(user_command != 'q') { From b52415e6f61f874b2ccb54e853bf66023fd05b1b Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 20 Apr 2020 22:29:59 +0300 Subject: [PATCH 071/171] abandoned minicalc() --- Maths Calculator (C)/XCalculator.c | 73 ------------------------------ 1 file changed, 73 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 15f8d2d..27ffc1b 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -72,37 +72,6 @@ static void Init() { SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); // Initialize SDL } -static void checkForMinicalc() { - bool start_is_held = true; - - bool start_was_held = true; - - while (true) - { - - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) - { - start_is_held = true; - } - else - { - start_is_held = false; - } - - if (isNewlyPressed(start_is_held, &start_was_held)) - { - minicalc(result, user_input); - break; - } - else - { - break; - } - - } -} - - static MathOperation operations[] = { { .command='+', .description="Addition", .use_default_input=true, .handler=addition }, { .command='*', .description="Multiplication", .use_default_input=true, .handler=multiplication }, @@ -287,48 +256,6 @@ static char getCommand() { return user_command; } - -static void minicalc(float a, float b) { - - bool start_is_held = true; - - bool start_was_held = true; - - while (true) - { - getCommand(); - - for (int i = 0; i < ARRAY_SIZE(operations); i++) { - - MathOperation* o = &operations[i]; // Iterate through operations[] using i from the for() loop - - if (o->command == user_command) { // When the command number of the index of i in operations[] equals our user_command - - if(o->use_default_input == true) { // If it uses the default input handler - - getInput(); - } - b = o->handler(a, b); // Calculate our result and store it - user_input += b; - } - } - - if (SDL_GameControllerGetButton(controller, SDL_CONTROLLER_BUTTON_START)) - { - start_is_held = true; - } - else - { - start_is_held = false; - } - - if(isNewlyPressed(start_is_held, &start_was_held)){ - - break; - } - } -} - static float getInput() { static bool a_is_held = true; From 55927f22ee6619638580a853d17ca01cea48c151 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Mon, 20 Apr 2020 22:31:47 +0300 Subject: [PATCH 072/171] fixed a small bug in getInput() --- Maths Calculator (C)/XCalculator.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Maths Calculator (C)/XCalculator.c b/Maths Calculator (C)/XCalculator.c index 27ffc1b..fb7c30a 100644 --- a/Maths Calculator (C)/XCalculator.c +++ b/Maths Calculator (C)/XCalculator.c @@ -281,8 +281,6 @@ static float getInput() { SDL_GameControllerUpdate(); - checkForMinicalc(); - debugPrint("Please give me the number you want to use for the operation. "); float Yamount = getAxis(SDL_CONTROLLER_AXIS_LEFTY); From 39f69a9ce8f6120c0c60e41f91314304f0a828a9 Mon Sep 17 00:00:00 2001 From: Kosmas Raptis Date: Wed, 22 Apr 2020 21:51:48 +0300 Subject: [PATCH 073/171] Started work on NXDK port for Mandelbrot set --- Mandelbrot Set (C)/README | 1 + Mandelbrot Set (C)/README.md | 31 +++++ Mandelbrot Set (C)/headers/myFractal.h | 138 ++++++++++++++++++++++ Mandelbrot Set (C)/headers/mySDL.h | 49 ++++++++ Mandelbrot Set (C)/headers/myStructures.h | 49 ++++++++ Mandelbrot Set (C)/makefile | 16 +++ Mandelbrot Set (C)/mandelbrot.c | 38 ++++++ Mandelbrot Set (C)/screenshot.png | Bin 0 -> 130508 bytes 8 files changed, 322 insertions(+) create mode 100644 Mandelbrot Set (C)/README create mode 100644 Mandelbrot Set (C)/README.md create mode 100644 Mandelbrot Set (C)/headers/myFractal.h create mode 100644 Mandelbrot Set (C)/headers/mySDL.h create mode 100644 Mandelbrot Set (C)/headers/myStructures.h create mode 100644 Mandelbrot Set (C)/makefile create mode 100644 Mandelbrot Set (C)/mandelbrot.c create mode 100644 Mandelbrot Set (C)/screenshot.png diff --git a/Mandelbrot Set (C)/README b/Mandelbrot Set (C)/README new file mode 100644 index 0000000..7501519 --- /dev/null +++ b/Mandelbrot Set (C)/README @@ -0,0 +1 @@ +Forked from https://github.com/Geospace/mandelbrot-c-sdl2/tree/master diff --git a/Mandelbrot Set (C)/README.md b/Mandelbrot Set (C)/README.md new file mode 100644 index 0000000..d313a06 --- /dev/null +++ b/Mandelbrot Set (C)/README.md @@ -0,0 +1,31 @@ +# mandelbrot-c-sdl2 + +Using the C language and the SDL2 library to draw the Mandelbrot set. + +## Features + +* Use the **arrow keys** to move +* Use the **+ key** to zoom in +* Use the **- key** to zoom out + +## Requirements + +* C standard library with (G)CC +* SDL2 library +* Possibly MinGW if running Windows + +## Compilation + +``` +$ make help +Just use make (without any argument) to compile. +Use make clean in order to delete mandelbrot. +If you have errors during compilation, you can contact me for help. +Windows users, you can use MinGW with this project. +``` + +Then run the program and enjoy ! :-) + +![screenshot](screenshot.png "This is beautiful...") + +Happy fractal ! diff --git a/Mandelbrot Set (C)/headers/myFractal.h b/Mandelbrot Set (C)/headers/myFractal.h new file mode 100644 index 0000000..29c66aa --- /dev/null +++ b/Mandelbrot Set (C)/headers/myFractal.h @@ -0,0 +1,138 @@ +// This file has no copyright. + +#ifndef HEADERS_MYFRACTAL_H_ +#define HEADERS_MYFRACTAL_H_ + +#include + +#include "myStructures.h" +#include "mySDL.h" + +Fractal *init_fractal() { + Fractal *fractal = malloc(sizeof(Fractal)); + + // Used to move camera + fractal->xMove = 0; + fractal->yMove = 0; + + // Used to change the zoom and precision + fractal->zoom = 0.3; + fractal->iMax = 60; + + return fractal; +} + +void draw_mandelbrot(Sdl *sdl, Fractal *fractal) { + int i; + + int xFrame = WINDOW_WIDTH; + int yFrame = WINDOW_HEIGHT; + + // Formula is Z(n+1) = Z(n)^2 + C + // https://en.wikipedia.org/wiki/Mandelbrot_set + Complex c; + Complex z; + + // Coordonate of each point + int x; + int y; + + // Calculate all the y for every x + for (x = 0; x < xFrame; x++) { + c.r = ((x - xFrame / 2) / (0.5 * xFrame * fractal->zoom)) - fractal->xMove; + + for (y = 0; y < yFrame; y++) { + c.i = ((y - yFrame / 2) / + (0.5 * yFrame * fractal->zoom)) - fractal->yMove; + + z.r = 0; + z.i = 0; + + i = 0; + + // Iterate in order to know if a certain point is in the set or not + do { + z.b = z.r; + z.r = z.r * z.r - z.i * z.i + c.r; + z.i = 2 * z.i * z.b + c.i; + i++; + } while (z.r * z.r + z.i * z.i < 4 && i < fractal->iMax); + // We don't use square root in order to reduce calculation time + + if (i >= fractal->iMax) { + // In the set + SDL_SetRenderDrawColor(sdl->renderer, 0, 0, 255, 255); + SDL_RenderDrawPoint(sdl->renderer, x, y); + } else { + // Not in the set + SDL_SetRenderDrawColor(sdl->renderer, 0, 0, i * (255 / fractal->iMax), + 255); + SDL_RenderDrawPoint(sdl->renderer, x, y); + } + + // Render using SDL_RenderDrawPoint() is slow and should + // be replaced by SDL_RenderDrawPoints() + } + } +} + +void print_verbose(Fractal *fractal) { + /* // Print some variables on console + + // We need to know the OS + // In order to run the right command + #ifdef __unix__ + system("clear"); + #elif defined(_WIN32) || defined(_WIN64) + system("cls"); + #endif + + printf(" ~ x position :\t%f\n", fractal->xMove); + printf(" ~ y position :\t%f\n", fractal->yMove); + printf(" ~ zoom :\t%f\n", fractal->zoom); + printf(" ~ iterations :\t%f\n", fractal->iMax); */ +} + +void is_user_moving(Sdl *sdl, Fractal *fractal) { + SDL_PollEvent(&sdl->event); + + // Delta time to sync everything + float delta = 0.30; + + // Movement speed + float moveStep = 0.5; + float zoomStep = 3.0; + + // Everything is adapted to current zoom + if (sdl->keys[SDL_SCANCODE_LEFT]) { + fractal->xMove = fractal->xMove + (moveStep / fractal->zoom * delta); + draw_cross(sdl); + print_verbose(fractal); + } else if (sdl->keys[SDL_SCANCODE_RIGHT]) { + fractal->xMove = fractal->xMove - (moveStep / fractal->zoom * delta); + draw_cross(sdl); + print_verbose(fractal); + } else if (sdl->keys[SDL_SCANCODE_UP]) { + fractal->yMove = fractal->yMove + (moveStep / fractal->zoom * delta); + draw_cross(sdl); + print_verbose(fractal); + } else if (sdl->keys[SDL_SCANCODE_DOWN]) { + fractal->yMove = fractal->yMove - (moveStep / fractal->zoom * delta); + draw_cross(sdl); + print_verbose(fractal); + } else if (sdl->keys[SDL_SCANCODE_KP_PLUS]) { + fractal->zoom = fractal->zoom + (moveStep * fractal->zoom * delta); + fractal->iMax = fractal->iMax + zoomStep * delta; + draw_cross(sdl); + print_verbose(fractal); + } else if (sdl->keys[SDL_SCANCODE_KP_MINUS] + // User is not allowed to zoom back past 0.3 + && (fractal->zoom - (moveStep * fractal->zoom * delta)) > 0.3) { + fractal->zoom = fractal->zoom - (moveStep * fractal->zoom * delta); + fractal->iMax = fractal->iMax - zoomStep * delta; + draw_cross(sdl); + print_verbose(fractal); + } +} + +#endif // HEADERS_MYFRACTAL_H_ diff --git a/Mandelbrot Set (C)/headers/mySDL.h b/Mandelbrot Set (C)/headers/mySDL.h new file mode 100644 index 0000000..740ac19 --- /dev/null +++ b/Mandelbrot Set (C)/headers/mySDL.h @@ -0,0 +1,49 @@ +// This file has no copyright. + +#ifndef HEADERS_MYSDL_H_ +#define HEADERS_MYSDL_H_ + +#include + +#include "myStructures.h" + +Sdl *init_sdl() { + Sdl *sdl = malloc(sizeof(Sdl)); + + sdl->window = SDL_CreateWindow( + WINDOW_TITLE, + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + WINDOW_HEIGHT, + WINDOW_WIDTH, + SDL_WINDOW_SHOWN); + + sdl->renderer = SDL_CreateRenderer(sdl->window, -1, SDL_RENDERER_SOFTWARE); + sdl->keys = SDL_GetKeyboardState(NULL); + + return sdl; +} + +int is_user_pressing_escape(Sdl *sdl) { + // Get the current pressed key + SDL_PollEvent(&sdl->event); + + // Define if user wants to leave or not + if (sdl->keys[SDL_SCANCODE_ESCAPE] || sdl->event.type == SDL_QUIT) + return 1; + else + return 0; +} + +void draw_cross(Sdl *sdl) { + // Draw a little cross when user zooms in/out or moves + int length = 15; + SDL_SetRenderDrawColor(sdl->renderer, 255, 255, 255, 255); + + SDL_RenderDrawLine(sdl->renderer, WINDOW_WIDTH / 2 - length / 2, + WINDOW_HEIGHT / 2, WINDOW_WIDTH / 2 + length / 2, WINDOW_HEIGHT / 2); + SDL_RenderDrawLine(sdl->renderer, WINDOW_WIDTH / 2, WINDOW_HEIGHT + / 2 - length / 2, WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2 + length / 2); +} + +#endif // HEADERS_MYSDL_H_ diff --git a/Mandelbrot Set (C)/headers/myStructures.h b/Mandelbrot Set (C)/headers/myStructures.h new file mode 100644 index 0000000..18d5683 --- /dev/null +++ b/Mandelbrot Set (C)/headers/myStructures.h @@ -0,0 +1,49 @@ +// This file has no copyright. + +#ifndef HEADERS_MYSTRUCTURES_H_ +#define HEADERS_MYSTRUCTURES_H_ + +#include + +// This has to be a square +#define WINDOW_HEIGHT 600 +#define WINDOW_WIDTH 600 + +#define WINDOW_TITLE "Mandelbrot Fractal, by Geographer" + +typedef struct Sdl { + SDL_Window *window; + SDL_Renderer *renderer; + SDL_Event event; + const Uint8 *keys; +} Sdl; + +typedef struct Complex { + // Real part, imaginary part and a backup + double r; + double i; + double b; +} Complex; + +typedef struct Fractal { + // See myFractal.h + double xMove; + double yMove; + double zoom; + float iMax; +} Fractal; + +void free_everything(Sdl *sdl, Fractal *fractal) { + SDL_DestroyRenderer(sdl->renderer); + SDL_DestroyWindow(sdl->window); + free(sdl); + + free(fractal); + + SDL_Quit(); + + // You may observe memory leaks using this program + // SDL2 leaks by itself +} + +#endif // HEADERS_MYSTRUCTURES_H_ diff --git a/Mandelbrot Set (C)/makefile b/Mandelbrot Set (C)/makefile new file mode 100644 index 0000000..e951308 --- /dev/null +++ b/Mandelbrot Set (C)/makefile @@ -0,0 +1,16 @@ +MAKEFLAGS += --silent +MAKEFLAGS += --ignore-errors + +all: + @echo "Let's make this !" + gcc -o mandelbrot mandelbrot.c -lSDL2 + @echo "If no errors appeared, just ./mandelbrot ! Enjoy mandelbrot ! ;-)" + +clean: + rm -f mandelbrot + +help: + @echo "Just use make (without any argument) to compile." + @echo "Use make clean in order to delete mandelbrot." + @echo "If you have errors during compilation, you can contact me for help." + @echo "Windows users, you can use MinGW with this project." \ No newline at end of file diff --git a/Mandelbrot Set (C)/mandelbrot.c b/Mandelbrot Set (C)/mandelbrot.c new file mode 100644 index 0000000..56c9271 --- /dev/null +++ b/Mandelbrot Set (C)/mandelbrot.c @@ -0,0 +1,38 @@ +#if defined (NXDK) +#include +#include +#include +#include +#include +#define printf(...) debugPrint(__VA_ARGS__) +#else +#include +#endif +#include "headers/mySDL.h" +#include "headers/myStructures.h" +#include "headers/myFractal.h" + +// Any other main prototype will bug MinGW's SDL2 +// Doesn't matter on *nix +int main(int argc, char **argv) { + XVideoSetMode(640, 480, 32, REFRESH_60HZ); + // Init the structures + Sdl *sdl = init_sdl(); + Fractal *fractal = init_fractal(); + + // Init console + print_verbose(fractal); + + // User can exit program using escape + while (is_user_pressing_escape(sdl) == 0) { + draw_mandelbrot(sdl, fractal); + is_user_moving(sdl, fractal); + + SDL_RenderPresent(sdl->renderer); + + SDL_Delay(10); + } + + free_everything(sdl, fractal); + return 0; +} diff --git a/Mandelbrot Set (C)/screenshot.png b/Mandelbrot Set (C)/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..31866faee4ccc124b80eb3e3aed2b7dea437ae75 GIT binary patch literal 130508 zcma&NWpEo!6E$jPro_z5%*-)^%nUKbY?+y3W@ffz=9m*ZX2zH)=9rnUp6`Bd-M@FL zR4S=FJ`<&A=`(0gC9vy`U1quoZT~R?s6AB7O2lDYiLV)};^V5+E@&)HErKpVr zY5qu7(U9MS9Bf0j*_=-atL z-c{K%aob|!yMEu|ScGnA>6tW(k&={zC5421_F@3iWUW7`&3+sHuJte&fSrt;jh&r* zv9WcSS~wB6ze&vRwEhyiCHSyDbi>}gPD$~9TahzQlyUI?T5G684b1;-U!*8>p#N{9 zrNjdN@0t{>Xn@53ZHh>PO#gcjO&od`)cld;?)*=yez`V)pZyMBcNbvDq}=>L4o zV(g2YA5ZM7COp`P@}KdLko4F;cU=Tle4M*CG$i@=|D{0`dkoB&76Vt_hB0zbm<4

0{%Q)Ak;D0Q*{-(-c6*?_09__z?N) zv1$FP=Py_JtKx^gfNg8VP*dFvby?%Oni`kkjR*HFOmge#&9`rVIDWU)<_es~rLF`% zBlF~zK9Knh@L%liqE3DN`qloAEHcs&aeRP#i8gRheL1V3!hKufHS3sB2=SnJ-u(GO zY`8a7wTzovi=hx=?>C`+x9j8`z(14|lV^vcHYVG@GripI zv+2>hqD6P6x`IX=rp0(6i^v;twdNGd2&fJEa6a~b!O#(VB7FMbCNH}>;BR^be`sT5 znVP*Wt?B!};742|4>Fl;?364!9wtDB*X^!qxff{%ML>|*v44NzI{RdEeb(ih8YGWB z&O9#ivCI4;AwMU_%-6SR7YCnN%h+XE6tm%@UxfUr+KZEu6Qln?g;?OZY9P|6DL5GF z_am%$%$sx288J`LKPH1of|+91(cdlgJz|~{5Vt|Fz{i?FKl~;hQCaAd>>TjoX9WCB z3$-42_^{IHlhNE>h(oPo+I7xH=JSv6;1j_LPge-@mK!#Gp*I>-&@H+6VBc5gltJCL$WpH7M9zmR#SrKj_KywwLr|Nc$u z^mwo#a{b8dAw;Sww!>@Wx)PzRs(M)(Rrr^@*NuByIe^^vV@+_UqZDP?PIFTq*xt}E zqO$eOmMHeb5*w?O=d!NR{a~DVHAAgdp25i6W0Itk>9rXkjwy00qs;j-OReU1O1gFU zN!%Z3Veqj2faTo#w>zwi34P<-XX!2FMz>?X?c!>HTyzRDVay6}#c9dIPU8DsCB#X; zi`*V*wXBh<3P0&>`uzSK*J=Phsh$mXjQVx}VrJXPD#e@ziYo3SBVAr)_q}ND-WR@) z{ynVKl5)~?sQ;0 z>h#u>9(dGv%P*<$r5bGOy;O^v7=(V9A3!uepX&edF8>%+zdqsou{u5XjZe?O;H$rX zoR_f=axTB)-}{T#Ud8aWiqiF%wl$v= z-3rL~n7cg5Z+|}jgiUmXgdu$ecVELuo$iC%-<`G2gO#%an+^8hQ|I1To5G;%hu#-1 zz6s^4Biw1X4V5jytiaiqhL)Czt6{Rybmt$@8-Dj!i_Ysq%k^FP_7!^K{*mFA> z9d5Flmvidcd+~pJcD@-Wf4VYSPSq|54le$Av7M_zG}IGPYgoJ(p57){>CG3S2VbK^ z;xouMwGoKIA9&+5G;EO9{AQIP;!j-fEv93W=ll9|>r;MT{@QtWqNv|PqxB67RK4io zLRi?v(_z6-kGMAymi*(zCbQL96*UID*-b?};=Fyku>Zr0_^yrEWkQ%;zTXn#y34q6 z_P*GC7WJPdpA6Pq8=vL$%*)YflkqjSt|Yky^E{7Vv)?vpu5@*DbUHplh97@pe*BSy z-*I&A4eong$n<$wV=rH1I#51)(Nj?#?840DFIy(yFhxN)xAHGi=ALViFke#e#|BBikYeYl>E+2QJ~xvmgTAAY>C7b0%!irwRW9~OB%nqR-qfAI!B zm|&1#RSu_n3Sa$cY|K#QGv8Vd)X`ZbX>)YgZG1VnZ|?5?_1}0zGe2e=4fXW(%`bZ2 zzU3H;x}4?aR?Z(c0KwGKhV9=<=8rkrKO}Yq^%+hq({;T3?k6~T1@)t~t;=;0UOPo> zUKovn#=X36Xb-RYrPW;4IpxW2hi^E$Tq8$ET}}Lb4kd9{rr-YxW1j1#er@;LJPWL? zY0=lW8@@l3O!gJFI;G3V)XiE8qL9PG45M@NK1!x^{9Bcs-dcb_hPdt#q`f95ZN z&9F0Z^?A+Xo@U5XgK&ydf_be}#7R%Zu-AnAuBTUB=N(82I=IzJw5eI#-FhnwN@YIF zK4v6B|8q44MqGp!cMgU?IsKnbTFat|hJx-Ucm8;UYVI~Zr>v4$+lJG{9*AvFp}IUT z%2&SCP$8drRxaoVLK3X&01x89r$5bJY^m!jT>G7$0`zhq6W<@S?6`kk^Lbv$e1ycO z+s>0sMZuaakHAd}ZpYKo#Wgp%x4gYxgwsR!+M9uiN%3rOrpe~-#(F`KWgx!efUsxx z*dIOSbQyvlkWlM1Kb}*{>b|=VwCL%7D$2T;Qc*Uo{2YQa|;88gG-Cf z&aT$BXliIc8u?fE(6U-0tAkk)kfNI{Rg$o*h5;zMF$qU$Q- z@D--%kL=+>{{&IL!~e|jAHpCeW*6lAUHN2^kWF9c`wV~oFMlul&}7$Pd1H#OvH;7S zr_Hw2;G6iKj8n(HFo{4ze+VqElam(eR5(3QRo8V=g4qmf>DHzNzC&=>#Pi?!WOXvTJ`r2c zJp4cLhJJeS7a&>SKReHh?7e-`u8y;*3vN!%sli9@<^Q}!MLEv>z>faX?y;3z%gA;EnQ{4KTC7-6L}K^<2nD!Y`u?n&Ja_N z%*vAy34d%j_oe+e@ZP|;vx&1poACpEjE%Nztr9}RPkCMlTOC)b3Bm^oVvn2coRIaH zr7zeYat_G6Y9#oNOgMM_`!&JUy;oa*_-uH-EB-P0$(DyG&-c2~=>4nL)WQPICsS_% z)82bSWi^%S-iK~p4Rhw0nob8EBLD4^@gMI87nc$B>&m6G+u?hO2PY%uLeYp()w1=DdP3Q__|-&JNUyU|JS3Qr>>x&;7`Z}qU)Z+0sc4l z7gu9bqL7|kULibHN&I0Canc^b0NP*f&b^Gr?)ZbE*iBzpSI;~roa>JQ)cvm zE70=-4o17L?hdUg>}Jn=VPH-o_nW78`=i8ZLZlA0O6t{AT({}BmTyw{%xn80WS=); zt}s?^E*c;EQ-&Zc+l;&mv>PpHp!@HsfR zHFW6xEpE$K*b?(KdMSYvs)oduVSKGrHp@>PgeUnQ>DSZpKKPNz6;N`$`@OQj#@4z7mL|FUP_Bkf`HgTp4@$BiwhRMOnK zd~$ae2g2n<9)69l`>%=q$Ic>+Yaq-r?Eh6UA}p-z&3@A)nZ|DK4Y4=_+|xaS{7#)= zx?UHS5ajB7V0`h# zXBF*b6DExI848}xySOGq1=4MuZb!$P4d#}b;vS4oKq`QW8Ht^<%5J#nvduzUd+6!K zb;|&g!hdRv6iYb-8oxLWdX8@zgKLCTQ>s(HYM`HtLqtz=Q37e6CP9JMg=tZM1NK{S zmK%`*;0ehdAQ8X;Wr2?Xx{C_D@X@4SfyxLr?vSiw3g;6hLF?L_?;M~lQ<k0}jZIaLm=*^@kSA?f;L&Q$7R+i~{^Z{$<~Z!w z>?kf(HH4jRkK;}FXD2^bF2i3FpJNs2O-)R zPTKHSo$fyCkiK9X>u(gd^&yn#kz$I#h(s{x^40RVeeHvlBMuovD5L(o2`h(mqAYS0 zB9H`bg)dZ>6lUKkgiw_N3NYf^;;Fx8U7?JdjpK0SC{Sx#eNz*zLl#M(27Jj9 znzez?icPo)`-7kzrrrmA_n#0CD6(%V4nM&%qrTjt6l3lCbfybW$rx;jkMtL0q-|Wd zu_~jX2|q`dS+WJvskX5Gp7BQ7;EA;WYW?muoDh@Qq9|pX<$wsli0f32=6z6s`2_Po z@ii0Q3M%a9b5l6qx;V&5_>IJJ{A)UsW8!$nea6yKmHfjx|jOfQy8yQS|(f9)JNwd7PFCgG^{&N@FFThiHIbJ=Mp# z=b4khzQr{{r`AnU?2g5DV)mh`1663fI{`uzMPI_{S&Hb6mhfur*r#_}#eRT5)rfBC zFowq=Q3gq52nl9kl9^o>nv z!}El|Q(N@_ZCGUR3=D>J$?Hoh?Kkxqnz+yy91|`W7?2eAm5oF{6Pi0+CeYwQ#=3e< zf^-DH`&njNH$v_i(N(7qh7Xti%a^9mm_{+I^P6Xxpa50w8|QtbuvuF(^)jZ!Li}i4 z*Mhy9wBiXq@>O>(-`dQkbCm**f4ifk;o8P1|F{lqBA))Mx?s`V3P}DysUqrW;Ut|g z7%>Rx#BwL}iQqFOjZ^_$Q&h*f_a6qsc8uZxX#j6&j4dzU7Onyj(J*?%$r)`T5!oa( z+EC`z*5;aQi{!SJLF8%WCh&`(AhfyL%7^hp!$m5eA7xIT;XgpFq3X-fcQSIAd?Qn= zW&uT8e62VEp1TCUBHY&0DRlRXZAH;m3&#!|I3vS#8Jav)`d6jY!7#q^nIgU zmcbfBGy1W_@@-(^$+NoyzU=vM!&^08?UCW9XB{~1?Pn=cMUQ?4N}EIigsi(LA=%OU zaV~_31A)3YuG>}55^J2Y87~C5IKCM10r;t^&M>|Duo(k6fa6!f?ApaI zfB2)1E@iP+fkG!zLM3A0eeCtNcLiT+i&#&=NEX6+b;t0=kzP;TQw8u61GB{CpG zJPGWvkgjbl`F3L>Ml64=L1<`2O2DS>Qxizy!2n2H7R+{PL7t{L3T)>$;Gv zZD*q2>%~g*=O1>5r?yv#cEk^+mP0cHGzQcF5tSWDqukF2ME>u=89D@AuOl4kMJ5DE zCeu|~h32EKh~AvfraWo#8;W`mbP*ic3c6dF2h3{JJ^Zvu^=sA>uR0q9g{(~7Gh8;zNY0NzXY4Nakj@6$c4eZnx zlF3q{)cTz`+yD^e$7c(N&ryWbDNfBB7$fI1gItBs_QNwc6X$-hSg{`H z2Jq4>w+CnvdTf1WqhKh*tuP6VK!7k2o3!Jr-zB6v-B z4#jm1V{z6SV=IL121S5603=zp9DJ=IiK+KBrIcs8hF@FIn-1L~FmOYP4bBZ92FW#c zaCcWnrO*g0|d>q+aVRDS$U{gx{so`stW!fT>r(rN@hivBJ))*C92ZT}eSVHw!O`KK&8jii8*y6Ob&>LHm#%rM2}oJMmlTXD;zaGwbCVZ+hd*Z7NOBRgutE< zj*oo(<9y+OE_>=e6K0!ZH;oaw*H0X*BJh#Td6Qj1Hl~Ji0y5d3bWlH|j8~R?Z?eal z5e}(`ik;NBUtTpv`2US9+)S(#LxglAAV zt}S2VtJsY3W}IJ;$u+JS)rqc0thd1?|1Z5PVQhfGLR%p{FmX>g$WmbOL}Z(1`>r2G zHDV^x330S#U*#mY#M<7w&_shLzU1pf_obx@P&)aV>1)#cEW$k%oRYXBh!zV-MGqaK z4WAaf7_by9pKXRiBDxR~&Em5~0lWKv&Ap8=Xfq_lOwWi3q}T1q7^gSz5tkj;C5XXc zj5SeM6yQQ_P!ak*$EWpap_~QiuLIEo@suLGJCdYqa`9Ow6jc@7`$rErTzaaoHgd!9 z^BZbIDPWfe0V=v>OW*}`cdsC`DUSr7O;3^JsAP98obIJD8` zK%tXBWvzE)UiBQpqPip8hT?KzOP#Kr*5ekS06~a&}^-X1ymWn}kHt>{svdL||X8Cm+B_~bz zia}U1V_M)7QC6DLTNLme;!Z6jEYnrH(VBDx)! zYTsyNFX~Xo(5$kf@X&K@@1;RQN%|#cQ)oXNp5UA{?;x35P*!pb&rH_VTV3uI)7h;#H7#vVa zWk9}@rZ&j;xOEhm2#zpdocGp+tDKm&4FV_4fmz1G<#g?Mn3E+j$f|wky)J_b0$ast z_WY?h$`p3wXmNg2+;vDk*fO+0ixedbkM8adngMDt?Z(ICz5C!H36Kbgi%=;b0-weh-HvVb)0C z%l!2uaTn9Eh%s}6f`Pss_)LC4>+g?V^94zR0-xw@K9X#r^q(HuV}w{(NuPM>bs&(3 z9T$q+P~)G9v=q2oQBu~5uq@QHDgjGbcp<&ceAA(a@j^Jpy`~8p+WX~4nLS+RFho(W zn#=emKw#gpCxt0U#}GW|FJF7+!R(BfE$TzMJBaag@>TtA`!E&2r&Pe3Hi$Dy)49fr zp~OpM-D)ornGhUIX%=1pdBB{8mu9*y@CcD;z?R!3Ym_?+4!-UEA?L%#(gnSfEC#2S zMyjVEZLBpW@M4D{bvan$Hxf3)Bbks(B|xBH@=FbBC)3axO#TEGcWw)nZW}y1MCQTM z-}L&{e>L#llm)UR>Z(zw7S&!xnWhasUoMX~<3qF;^`jM>8|~+ak(Dr86P0l7){72|{pn@~xOTPe^#sqtKW(qR_%Q3F&sdJ0HE=d+{*{Hb43 z_-3XlAzox-_c#g%=7h|aN*;MK>$0!3CdDK^&9iUH6U(s?InX<@CUH@Tgm#q?TNVZqV#=Sa*#J|fVG-A4+qOjh5S zhUBy|xuw45`AD|bo@(r`Ktp=R2@gsjz(J7~e1p}LaUy7zrhZsSg}9`Zc4jiVUF3Ad zq0JQSRq&#BCT`UT@ii0M3HGiQm4Z`HsL|aQkU=!;JK7~>-nEVg1*_X@v{yO=(_jaP zj#$So3#(s(R~()Y6hS9&0PwZ)GCA;;NS)g`NnKn;e8XhzE4HS!4cqDsLGVXh*H&qf zPOWTBx(y>m5eZLJB~MyB*8;c`yC!gqhhg|iXmIcg7yLdYNl#jzlOqkXPn}(aztY-Y z#Xbe$yTmiOz_Y-QZoXZ$!)dI^Fwmro-9GX`HKg`}f$OU;+@KM7IzQD$ZhI&?fzhz_ zv&+6oOP*@8_(9>+x+S-h;&k%}O_3K-b(iGTubTU#yT*oI?Q*)im~4UMkHd=JZv%UJ z$gBXA#q`8LcyLVS?A6WM0R49=rc6`vkQ~fXJCE$#~tYH5Q=#VK0}CKB(CEwCjCrT7P~WtIYK87u=>l1LFXFF<|DfN8I}_ zlPvL)Iume&m9+_uxA0?+>FFmOl-AO7 zTXZ0Oe31EW#EweyLf21MqQmMt9REu~2*vsz;_3bmWTX+fg8ehYQNM{tFX#}p}ORn7D`MhbSZ}roH+*gIvtWQztRHmL;3HvrVqpw0VY(3Q^ z;IpGGlJMy~yIT8;!O$BD9MylsR5Y&OZRBxauqwTs7}SASNJ6={FYPH+6JZNw0squfa zgnmZ`UpScDm}GxlYkgdY1Y=sr*Qc;w4Apw4jd`UWK`e7)Ym`t zOe@;+TQgXnFw~!D<>0>3T(zRzJ){WA^)*lU0qtKLL>Hv;u}*}{Iygk9IX2r)g&r|W zjjaFbFF%ved8mj~4au`214NW$Nta?7)JUx)ErAvfqe|^JH$~rXPRHC#mIG>!xI?rW zQ`8rrd%uO-uo4!Vz$~%bFFen0nncBe#(m^^L)@x`e6>WZQL#tX2?Qt!PbUS!h~- z;o4jZG+N&BY}@^I`;_IiesJVhqvX>xMxf3rMULMfrqQ;i_*=nGeR-E9Z-xDYa@++i&26ZiNx-0V9`GNnbk0RHwx-oEa%4b%X;*v{(=FWYUxEHV_D=>KhMX7OckR8 z>K&-ULHOy`C>=~f_ctSNFAP#cX(TTvRtB3(w*oP5hW~YBK8Oc4nThQiExJKxz|?8g z)S72$ASSHpgA)lOP6N)c8oG{rX^vY7ux@8ZkGdp~AwBVaX&T#qsVT2^SGo9%uH1>O zQPlsWqq6fA@g45creCS!kJZK!(n6ghjDEup%X{6%Axrhz6zmgPvp33eFOzy_p!Jj5 zO8XOmYt&lzn5;yQEmhblf*HFDr-fYTBL(VJaGG^yaUsv!4OoXqxc}3{N10i^og-=9 zg|-QK4ed5o`0IpBp|q=mNFb~L-E#nPNd<4op8p3+z|yUc*6@Su?!i`>8zd^>(xQMx zdgwTI+@PB5LGl@V%KI-Q)=5#;;o7_*A2AHn%vLXwz?jc; zSw!V`2IZ3nD;r{a13nd6Ny~nR5bEHYkTqG z@I`BobE}B8sGnrMqFhyG@Lfb4nQ-^)zI+OdHQ1BR+OM4l#y4up%}_G>7r6gsR?HM$ z^O2Geq#o_7A&v-L=s~h6y{Q-?R~u9IB_-$DqhAz*lAoU{2ETt13EM=@;u|p7i{h^% zg8bOR0{CePwm#`R*m=C-b6N~Z!9{TJU2u`!UA)ND2oa~yw4vdO^Xw`9JDOze3&EA- zhJ21tstnhdH){K_y%Alm6aHBdvAKaH9yu6EAJHq8W>Mkv&$N49N6bRpdl0Mu5v4+< z+{@RJkDLSZ{!iG5_tYUlVOn+fIb5sG5f?4aHxG%^N`XzUBTcKi5GOK_|6~D(NIf)= z+En$@NI81j5$DiuPo+Yo>)B?U+d