From fd8ac34ed5891ed8fa860b41d586f8fdc976a1aa Mon Sep 17 00:00:00 2001 From: Vegz78 <> Date: Fri, 15 Jan 2021 23:34:25 +0100 Subject: [PATCH] Expanded gamepad support --- McAirpos/launCharc/launCharc | Bin 21444 -> 21904 bytes McAirpos/launCharc/launCharc.c | 20 +- McAirpos/uinput-mapper/configs/arcade1.py | 227 +++++++++- McAirpos/uinput-mapper/configs/arcade2.py | 413 +++++++++++++++++- .../configs/{ => examples}/keymouse.py | 0 .../configs/examples/ps3_dpad1.py | 114 +++++ .../configs/examples/ps3_dpad2.py | 114 +++++ .../configs/{ => examples}/sidewinder-rel.py | 0 .../configs/{ => examples}/sidewinder.py | 0 .../configs/{ => examples}/techinc.py | 0 .../configs/{ => examples}/tg.py | 0 .../configs/{ => examples}/touchscreen.py | 0 12 files changed, 845 insertions(+), 43 deletions(-) rename McAirpos/uinput-mapper/configs/{ => examples}/keymouse.py (100%) create mode 100644 McAirpos/uinput-mapper/configs/examples/ps3_dpad1.py create mode 100644 McAirpos/uinput-mapper/configs/examples/ps3_dpad2.py rename McAirpos/uinput-mapper/configs/{ => examples}/sidewinder-rel.py (100%) rename McAirpos/uinput-mapper/configs/{ => examples}/sidewinder.py (100%) rename McAirpos/uinput-mapper/configs/{ => examples}/techinc.py (100%) rename McAirpos/uinput-mapper/configs/{ => examples}/tg.py (100%) rename McAirpos/uinput-mapper/configs/{ => examples}/touchscreen.py (100%) diff --git a/McAirpos/launCharc/launCharc b/McAirpos/launCharc/launCharc index 14b1fd3dcb62697ef036a65e18cb09da7c78591e..55149a8847bbf919d169ea195030337ed6019bdd 100755 GIT binary patch literal 21904 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 diff --git a/McAirpos/launCharc/launCharc.c b/McAirpos/launCharc/launCharc.c index 146f4e7..f4e26f2 100644 --- a/McAirpos/launCharc/launCharc.c +++ b/McAirpos/launCharc/launCharc.c @@ -74,14 +74,21 @@ int main(int argc, char** argv) { // Read game file argument to execute char* game = ""; + char* options = ""; if (argc == 2) { game = argv[1]; - } else if (argc > 2) { - printf("usage: launchArcade [/path/to/arcadegame.elf]\n"); + } else if (argc == 3) { + game = argv[2]; + options = argv[1]; + } else if ((argc > 3) || (argc < 2)) { + printf("usage: launchArcade [nomap] [/path/to/arcadegame.elf]\n"); return 1; } + if (!strcmp(options, "nomap")) { + printf("%s, %s\n", game, options); + } else { // Determine the number of connected gamepads printf("%s\n", game); char eventPaths[100]; @@ -90,8 +97,8 @@ int main(int argc, char** argv) { int numberOfEvents = 1 + atoi(getSystemOutput("ls /dev/input | sed 's/event//' | sort -n | tail -1")); for (int i = 0; i < numberOfEvents; i++) { if (numberOfPads < 2) { - char processCommand[100]; - snprintf(processCommand, 100, "/home/pi/McAirpos/McAirpos/uinput-mapper/input-read -vp /dev/input/event%d | grep DPAD", i); + char processCommand[120]; + snprintf(processCommand, 120, "/home/pi/McAirpos/McAirpos/uinput-mapper/input-read -vp /dev/input/event%d | grep -e BTN_SOUTH -e BTN_PINKIE", i); char* event = getSystemOutput(processCommand); if (strcmp(event, "")) { printf("%s, Output:%s\n", processCommand, getSystemOutput(processCommand)); @@ -99,6 +106,7 @@ int main(int argc, char** argv) { char iString[20]; sprintf(iString, "%d", i); strcat(strcat(strcat(eventPaths, "/dev/input/event"), iString), " "); + strcat(strcat(strcat(eventPaths, "/dev/input/event"), iString), " "); numberOfPads++; } } @@ -138,8 +146,10 @@ int main(int argc, char** argv) { } snprintf(sedCommand, 100, "sed -i \"1s&.*&\"%s\"&\" /sd/arcade.cfg", defaultEvent); system(sedCommand); + } system("stty -ixon"); + // Fork game execution on launch, so that it is executed // the same way it's done in-game on reset and finish if (!fork()) { @@ -214,7 +224,7 @@ int main(int argc, char** argv) { perror("warn: ioctl KBSKBMODE failed"); } - system("stty -ixon"); + system("stty ixon"); system("clear"); } diff --git a/McAirpos/uinput-mapper/configs/arcade1.py b/McAirpos/uinput-mapper/configs/arcade1.py index 8df1df3..872b552 100644 --- a/McAirpos/uinput-mapper/configs/arcade1.py +++ b/McAirpos/uinput-mapper/configs/arcade1.py @@ -2,30 +2,146 @@ """ -Configuration for a simple Microsoft SideWinter Game Pad Pro USB version 1.0 -... as ABS input pointer device +Configuration for many EV_ABS(axis) and EV_KEY(digital buttons) directional controllers +... as EV_KEY MakeCode Arcade keyboard device """ +# Global variables +autoconf = 1 #Determines min and max for EV_ABS events automatically if 1, min and max must be set manually below if 0 +deadzone = 0.25 #Deadzone in percentage before EV_ABS events react, used to dampen reactions to axis movements + +# Variables for EV_ABS controller no. 1 +invertUp = 0 #For inverting Y axis if 1, e.g. Nimbus SteelSeries controller +invertLeft = 0 #For inverting X axis if 1 +max = 1 #Seed value = 1 for autoconf, if manual find properties using ./input-read -v -p /dev/input/eventX +min = 0 #Seed value = 0 for autoconf +mid = (min + max)/2 + +# Directional functions for EV_ABS controller no. 1 +def digitizeUp(x): + global min, mid, max, deadzone + if x < min: + min = x + mid = (min + max)/2 + + if invertUp: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeDown(x): + global min, mid, max, deadzone + if x > max: + max = x + mid = (min + max)/2 + + if invertUp: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeLeft(x): + global min, mid, max, deadzone + if x < min: + min = x + mid = (min + max)/2 + + if invertLeft: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeRight(x): + global min, mid, max, deadzone + if x > max: + max = x + mid = (min + max)/2 + + if invertLeft: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +# Variables for EV_ABS HAT controllers +hmin = -1 +hmax = 1 +hmid = 0 + +# Directional functions for EV_ABS HAT controllers +def hat0Pos(x): + global hmin, hmid, hmax + + if x > hmid: + x = 1 + else: + x = 0 + + return int(x) + +def hat0Neg(x): + global hmin, hmid, hmax + + if x < hmid: + x = 1 + else: + x = 0 + + return int(x) + + +# Button mapping config config = { (0, EV_KEY): { - BTN_DPAD_LEFT: { - 'type' : (0, EV_KEY), - 'code' : KEY_A, - 'value': None - }, - BTN_DPAD_RIGHT: { + BTN_DPAD_UP: { 'type' : (0, EV_KEY), - 'code' : KEY_D, + 'code' : 17, 'value' : None }, - BTN_DPAD_UP: { + BTN_DPAD_DOWN: { 'type' : (0, EV_KEY), - 'code' : KEY_W, + 'code' : 31, 'value' : None }, - BTN_DPAD_DOWN: { + BTN_DPAD_LEFT: { 'type' : (0, EV_KEY), - 'code' : KEY_S, + 'code' : 30, + 'value' : None + }, + BTN_DPAD_RIGHT: { + 'type' : (0, EV_KEY), + 'code' : 32, 'value' : None }, BTN_SOUTH: { @@ -33,7 +149,7 @@ 'code' : 29, 'value' : None }, - BTN_X: { + BTN_B: { 'type' : (0, EV_KEY), 'code' : 42, 'value' : None @@ -52,9 +168,90 @@ 'type' : (0, EV_KEY), 'code' : 60, 'value' : None - } + }, }, + (0, EV_ABS): { + ABS_X: { + 'type' : (0, EV_KEY), + 'code' : 30, + 'value' : digitizeLeft + }, + ABS_Y: { + 'type' : (0, EV_KEY), + 'code' : 17, + 'value' : digitizeUp + }, + ABS_HAT0X: { + 'type' : (0, EV_KEY), + 'code' : 32, + 'value' : hat0Pos + }, + ABS_HAT0Y: { + 'type' : (0, EV_KEY), + 'code' : 31, + 'value' : hat0Pos + } + }, (1, EV_KEY): { + BTN_THUMB: { + 'type' : (0, EV_KEY), + 'code' : 29, + 'value' : None + }, + BTN_THUMB2: { + 'type' : (0, EV_KEY), + 'code' : 42, + 'value' : None + }, + BTN_BASE4: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : None + }, + BTN_BASE3: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + KEY_HOMEPAGE: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + }, + (1, EV_ABS): { + ABS_X: { + 'type' : (0, EV_KEY), + 'code' : 32, + 'value' : digitizeRight + }, + ABS_Y: { + 'type' : (0, EV_KEY), + 'code' : 31, + 'value' : digitizeDown + }, + ABS_Z: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : hat0Pos + }, + ABS_RZ: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : hat0Pos + }, + ABS_HAT0X: { + 'type' : (0, EV_KEY), + 'code' : 30, + 'value' : hat0Neg + }, + ABS_HAT0Y: { + 'type' : (0, EV_KEY), + 'code' : 17, + 'value' : hat0Neg + } + }, + (2, EV_KEY): { KEY_A: { 'type' : (0, EV_KEY), 'code' : 105, diff --git a/McAirpos/uinput-mapper/configs/arcade2.py b/McAirpos/uinput-mapper/configs/arcade2.py index d1a9a5a..aa433ef 100644 --- a/McAirpos/uinput-mapper/configs/arcade2.py +++ b/McAirpos/uinput-mapper/configs/arcade2.py @@ -2,30 +2,234 @@ """ -Configuration for a simple Microsoft SideWinter Game Pad Pro USB version 1.0 -... as ABS input pointer device +Configuration for many EV_ABS(axis) and EV_KEY(digital buttons) directional controllers +... as EV_KEY MakeCode Arcade keyboard device """ +# Global variables +autoconf = 1 #Determines min and max for EV_ABS events automatically if 1, min and max must be set manually below if 0 +deadzone = 0.25 #Deadzone in percentage before EV_ABS events react, used to dampen reactions to axis movements + + +# Variables for EV_ABS controller no. 1 +invertUp = 0 #For inverting Y axis if 1, e.g. Nimbus SteelSeries controller +invertLeft = 0 #For inverting X axis if 1 +max = 1 #Seed value = 1 for autoconf, if manual find properties using ./input-read -v -p /dev/input/eventX +min = 0 #Seed value = 0 for autoconf +mid = (min + max)/2 + +# Directional functions for EV_ABS controller no. 1 +def digitizeUp(x): + global min, mid, max, deadzone + if x < min: + min = x + mid = (min + max)/2 + + if invertUp: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeDown(x): + global min, mid, max, deadzone + if x > max: + max = x + mid = (min + max)/2 + + if invertUp: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeLeft(x): + global min, mid, max, deadzone + if x < min: + min = x + mid = (min + max)/2 + + if invertLeft: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeRight(x): + global min, mid, max, deadzone + if x > max: + max = x + mid = (min + max)/2 + + if invertLeft: + if x < (mid - (max - mid) * deadzone): + x = 1 + else: + x = 0 + else: + if x > (mid + (max - mid) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + + +# Variables for EV_ABS controller no. 2 +invertUp2 = 0 #For inverting Y axis if 1, e.g. Nimbus SteelSeries controller +invertLeft2 = 0 #For inverting X axis if 1 +max2 = 1 #Seed value = 1 for autoconf, if manual find properties using ./input-read -v -p /dev/input/eventX +min2 = 0 #Seed value = 0 for autoconf +mid2 = (min + max)/2 + +# Directional functions for EV_ABS controller no. 2 +def digitizeUp2(x): + global min2, mid2, max2, deadzone + if x < min2: + min2 = x + mid2 = (min2 + max2)/2 + + if invertUp2: + if x > (mid2 + (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + else: + if x < (mid2 - (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeDown2(x): + global min2, mid2, max2, deadzone + if x > max2: + max2 = x + mid2 = (min2 + max2)/2 + + if invertUp2: + if x < (mid2 - (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + else: + if x > (mid2 + (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeLeft2(x): + global min2, mid2, max2, deadzone + if x < min2: + min2 = x + mid2 = (min2 + max2)/2 + + if invertLeft2: + if x > (mid2 + (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + else: + if x < (mid2 - (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + +def digitizeRight2(x): + global min2, mid2, max2, deadzone + if x > max2: + max2 = x + mid2 = (min2 + max2)/2 + + if invertLeft2: + if x < (mid2 - (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + else: + if x > (mid2 + (max2 - mid2) * deadzone): + x = 1 + else: + x = 0 + + return int(x) + + +# Variables for EV_ABS HAT controllers +hmin = -1 +hmax = 1 +hmid = 0 + +# Directional functions for EV_ABS HAT controllers +def hat0Pos(x): + global hmin, hmid, hmax + + if x > hmid: + x = 1 + else: + x = 0 + + return int(x) + +def hat0Neg(x): + global hmin, hmid, hmax + + if x < hmid: + x = 1 + else: + x = 0 + + return int(x) + + +# Button mapping config config = { + # Controller no. 1 (0, EV_KEY): { - BTN_DPAD_LEFT: { - 'type' : (0, EV_KEY), - 'code' : KEY_A, - 'value': None - }, - BTN_DPAD_RIGHT: { + BTN_DPAD_UP: { 'type' : (0, EV_KEY), - 'code' : KEY_D, + 'code' : 17, 'value' : None }, - BTN_DPAD_UP: { + BTN_DPAD_DOWN: { 'type' : (0, EV_KEY), - 'code' : KEY_W, + 'code' : 31, 'value' : None }, - BTN_DPAD_DOWN: { + BTN_DPAD_LEFT: { 'type' : (0, EV_KEY), - 'code' : KEY_S, + 'code' : 30, + 'value' : None + }, + BTN_DPAD_RIGHT: { + 'type' : (0, EV_KEY), + 'code' : 32, 'value' : None }, BTN_SOUTH: { @@ -33,7 +237,7 @@ 'code' : 29, 'value' : None }, - BTN_X: { + BTN_B: { 'type' : (0, EV_KEY), 'code' : 42, 'value' : None @@ -52,19 +256,91 @@ 'type' : (0, EV_KEY), 'code' : 60, 'value' : None - } + }, }, + (0, EV_ABS): { + ABS_X: { + 'type' : (0, EV_KEY), + 'code' : 30, + 'value' : digitizeLeft + }, + ABS_Y: { + 'type' : (0, EV_KEY), + 'code' : 17, + 'value' : digitizeUp + }, + ABS_HAT0X: { + 'type' : (0, EV_KEY), + 'code' : 32, + 'value' : hat0Pos + }, + ABS_HAT0Y: { + 'type' : (0, EV_KEY), + 'code' : 31, + 'value' : hat0Pos + } + }, (1, EV_KEY): { - BTN_DPAD_LEFT: { - 'type' : (0, EV_KEY), - 'code' : 105, - 'value': None - }, - BTN_DPAD_RIGHT: { + BTN_THUMB: { 'type' : (0, EV_KEY), - 'code' : 106, + 'code' : 29, + 'value' : None + }, + BTN_THUMB2: { + 'type' : (0, EV_KEY), + 'code' : 42, + 'value' : None + }, + BTN_BASE4: { + 'type' : (0, EV_KEY), + 'code' : 1, 'value' : None }, + BTN_BASE3: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + KEY_HOMEPAGE: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + }, + (1, EV_ABS): { + ABS_X: { + 'type' : (0, EV_KEY), + 'code' : 32, + 'value' : digitizeRight + }, + ABS_Y: { + 'type' : (0, EV_KEY), + 'code' : 31, + 'value' : digitizeDown + }, + ABS_Z: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : hat0Pos + }, + ABS_RZ: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : hat0Pos + }, + ABS_HAT0X: { + 'type' : (0, EV_KEY), + 'code' : 30, + 'value' : hat0Neg + }, + ABS_HAT0Y: { + 'type' : (0, EV_KEY), + 'code' : 17, + 'value' : hat0Neg + } + }, + # Controller no. 2 + (2, EV_KEY): { BTN_DPAD_UP: { 'type' : (0, EV_KEY), 'code' : 103, @@ -75,12 +351,22 @@ 'code' : 108, 'value' : None }, + BTN_DPAD_LEFT: { + 'type' : (0, EV_KEY), + 'code' : 105, + 'value' : None + }, + BTN_DPAD_RIGHT: { + 'type' : (0, EV_KEY), + 'code' : 106, + 'value' : None + }, BTN_SOUTH: { 'type' : (0, EV_KEY), 'code' : 100, 'value' : None }, - BTN_X: { + BTN_B: { 'type' : (0, EV_KEY), 'code' : 57, 'value' : None @@ -99,6 +385,87 @@ 'type' : (0, EV_KEY), 'code' : 60, 'value' : None + }, + }, + (2, EV_ABS): { + ABS_X: { + 'type' : (0, EV_KEY), + 'code' : 105, + 'value' : digitizeLeft2 + }, + ABS_Y: { + 'type' : (0, EV_KEY), + 'code' : 103, + 'value' : digitizeUp2 + }, + ABS_HAT0X: { + 'type' : (0, EV_KEY), + 'code' : 106, + 'value' : hat0Pos + }, + ABS_HAT0Y: { + 'type' : (0, EV_KEY), + 'code' : 108, + 'value' : hat0Pos + } + }, + (3, EV_KEY): { + BTN_THUMB: { + 'type' : (0, EV_KEY), + 'code' : 100, + 'value' : None + }, + BTN_THUMB2: { + 'type' : (0, EV_KEY), + 'code' : 57, + 'value' : None + }, + BTN_BASE4: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : None + }, + BTN_BASE3: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + KEY_HOMEPAGE: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + }, + (3, EV_ABS): { + ABS_X: { + 'type' : (0, EV_KEY), + 'code' : 106, + 'value' : digitizeRight2 + }, + ABS_Y: { + 'type' : (0, EV_KEY), + 'code' : 108, + 'value' : digitizeDown2 + }, + ABS_Z: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : hat0Pos + }, + ABS_RZ: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : hat0Pos + }, + ABS_HAT0X: { + 'type' : (0, EV_KEY), + 'code' : 105, + 'value' : hat0Neg + }, + ABS_HAT0Y: { + 'type' : (0, EV_KEY), + 'code' : 103, + 'value' : hat0Neg } } } diff --git a/McAirpos/uinput-mapper/configs/keymouse.py b/McAirpos/uinput-mapper/configs/examples/keymouse.py similarity index 100% rename from McAirpos/uinput-mapper/configs/keymouse.py rename to McAirpos/uinput-mapper/configs/examples/keymouse.py diff --git a/McAirpos/uinput-mapper/configs/examples/ps3_dpad1.py b/McAirpos/uinput-mapper/configs/examples/ps3_dpad1.py new file mode 100644 index 0000000..8df1df3 --- /dev/null +++ b/McAirpos/uinput-mapper/configs/examples/ps3_dpad1.py @@ -0,0 +1,114 @@ +from uinputmapper.cinput import * + + +""" +Configuration for a simple Microsoft SideWinter Game Pad Pro USB version 1.0 +... as ABS input pointer device +""" + +config = { + (0, EV_KEY): { + BTN_DPAD_LEFT: { + 'type' : (0, EV_KEY), + 'code' : KEY_A, + 'value': None + }, + BTN_DPAD_RIGHT: { + 'type' : (0, EV_KEY), + 'code' : KEY_D, + 'value' : None + }, + BTN_DPAD_UP: { + 'type' : (0, EV_KEY), + 'code' : KEY_W, + 'value' : None + }, + BTN_DPAD_DOWN: { + 'type' : (0, EV_KEY), + 'code' : KEY_S, + 'value' : None + }, + BTN_SOUTH: { + 'type' : (0, EV_KEY), + 'code' : 29, + 'value' : None + }, + BTN_X: { + 'type' : (0, EV_KEY), + 'code' : 42, + 'value' : None + }, + BTN_START: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : None + }, + BTN_SELECT: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + BTN_MODE: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + }, + (1, EV_KEY): { + KEY_A: { + 'type' : (0, EV_KEY), + 'code' : 105, + 'value': None + }, + KEY_D: { + 'type' : (0, EV_KEY), + 'code' : 106, + 'value' : None + }, + KEY_W: { + 'type' : (0, EV_KEY), + 'code' : 103, + 'value' : None + }, + KEY_S: { + 'type' : (0, EV_KEY), + 'code' : 108, + 'value' : None + }, + KEY_LEFTCTRL: { + 'type' : (0, EV_KEY), + 'code' : 100, + 'value' : None + }, + KEY_LEFTSHIFT: { + 'type' : (0, EV_KEY), + 'code' : 57, + 'value' : None + }, + KEY_ESC: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : None + }, + KEY_F1: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + KEY_F2: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + } +} + +names = { + 0 : 'MakeCode_Arcade' + +} + +def config_merge(c, n): + c.clear() + c.update(config) + n.update(names) diff --git a/McAirpos/uinput-mapper/configs/examples/ps3_dpad2.py b/McAirpos/uinput-mapper/configs/examples/ps3_dpad2.py new file mode 100644 index 0000000..d1a9a5a --- /dev/null +++ b/McAirpos/uinput-mapper/configs/examples/ps3_dpad2.py @@ -0,0 +1,114 @@ +from uinputmapper.cinput import * + + +""" +Configuration for a simple Microsoft SideWinter Game Pad Pro USB version 1.0 +... as ABS input pointer device +""" + +config = { + (0, EV_KEY): { + BTN_DPAD_LEFT: { + 'type' : (0, EV_KEY), + 'code' : KEY_A, + 'value': None + }, + BTN_DPAD_RIGHT: { + 'type' : (0, EV_KEY), + 'code' : KEY_D, + 'value' : None + }, + BTN_DPAD_UP: { + 'type' : (0, EV_KEY), + 'code' : KEY_W, + 'value' : None + }, + BTN_DPAD_DOWN: { + 'type' : (0, EV_KEY), + 'code' : KEY_S, + 'value' : None + }, + BTN_SOUTH: { + 'type' : (0, EV_KEY), + 'code' : 29, + 'value' : None + }, + BTN_X: { + 'type' : (0, EV_KEY), + 'code' : 42, + 'value' : None + }, + BTN_START: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : None + }, + BTN_SELECT: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + BTN_MODE: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + }, + (1, EV_KEY): { + BTN_DPAD_LEFT: { + 'type' : (0, EV_KEY), + 'code' : 105, + 'value': None + }, + BTN_DPAD_RIGHT: { + 'type' : (0, EV_KEY), + 'code' : 106, + 'value' : None + }, + BTN_DPAD_UP: { + 'type' : (0, EV_KEY), + 'code' : 103, + 'value' : None + }, + BTN_DPAD_DOWN: { + 'type' : (0, EV_KEY), + 'code' : 108, + 'value' : None + }, + BTN_SOUTH: { + 'type' : (0, EV_KEY), + 'code' : 100, + 'value' : None + }, + BTN_X: { + 'type' : (0, EV_KEY), + 'code' : 57, + 'value' : None + }, + BTN_START: { + 'type' : (0, EV_KEY), + 'code' : 1, + 'value' : None + }, + BTN_SELECT: { + 'type' : (0, EV_KEY), + 'code' : 59, + 'value' : None + }, + BTN_MODE: { + 'type' : (0, EV_KEY), + 'code' : 60, + 'value' : None + } + } +} + +names = { + 0 : 'MakeCode_Arcade' + +} + +def config_merge(c, n): + c.clear() + c.update(config) + n.update(names) diff --git a/McAirpos/uinput-mapper/configs/sidewinder-rel.py b/McAirpos/uinput-mapper/configs/examples/sidewinder-rel.py similarity index 100% rename from McAirpos/uinput-mapper/configs/sidewinder-rel.py rename to McAirpos/uinput-mapper/configs/examples/sidewinder-rel.py diff --git a/McAirpos/uinput-mapper/configs/sidewinder.py b/McAirpos/uinput-mapper/configs/examples/sidewinder.py similarity index 100% rename from McAirpos/uinput-mapper/configs/sidewinder.py rename to McAirpos/uinput-mapper/configs/examples/sidewinder.py diff --git a/McAirpos/uinput-mapper/configs/techinc.py b/McAirpos/uinput-mapper/configs/examples/techinc.py similarity index 100% rename from McAirpos/uinput-mapper/configs/techinc.py rename to McAirpos/uinput-mapper/configs/examples/techinc.py diff --git a/McAirpos/uinput-mapper/configs/tg.py b/McAirpos/uinput-mapper/configs/examples/tg.py similarity index 100% rename from McAirpos/uinput-mapper/configs/tg.py rename to McAirpos/uinput-mapper/configs/examples/tg.py diff --git a/McAirpos/uinput-mapper/configs/touchscreen.py b/McAirpos/uinput-mapper/configs/examples/touchscreen.py similarity index 100% rename from McAirpos/uinput-mapper/configs/touchscreen.py rename to McAirpos/uinput-mapper/configs/examples/touchscreen.py