From 932740f491cf1afede31578a6077f6ab5c2994f8 Mon Sep 17 00:00:00 2001 From: Vegz78 <49032025+Vegz78@users.noreply.github.com> Date: Mon, 18 Jan 2021 07:14:14 +0100 Subject: [PATCH] Bugfixes and improvements Bugfixes and improvements: - Fixed occasional mismatch bug where uinput-mapper chose any free /dev/input/eventX number, whereas launCharc always chose highest +1. - Possible to map only 1 or 2 controllers(no keyboard needed), detects and exits if no usable control devices are connected. - Faster and smoother(no blinking cursor) game launch. - Tidied up code some, added some error handling. - Meaningful status and error messages printed to console on start and in background, not cleared on exit to help diagnosis. - Exits uinput-mapper on more errors and exit conditions. - Kill pulseaudio on game start(blank screen and not detected controller on some older devices(RPi3) and distributions(Raspbian stretch)). - More extensive testing: - Works best on newer devices(RPi4) with fake/firmware fkms driver and newer Raspbian and RetroPie distros. - Works ok on older devices(RPi3) or with legacy graphics driver or on older Raspbian and RetroPie distros. - Very low framerate on full kms. - Some instability where game sometimes suddenly exits, increases with older devices and distros. Not sure why yet and if some input key combinations(e.g. CTRL+D) from the mappings are to blame, as well. --- McAirpos/launCharc/launCharc | Bin 21904 -> 23840 bytes McAirpos/launCharc/launCharc.c | 226 ++++++++++++++++++++++----------- 2 files changed, 151 insertions(+), 75 deletions(-) diff --git a/McAirpos/launCharc/launCharc b/McAirpos/launCharc/launCharc index 55149a8847bbf919d169ea195030337ed6019bdd..1f3033e29fa6087b999a4b6ac9d613fc74832e29 100755 GIT binary patch literal 23840 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 | grep -e BTN_SOUTH -e BTN_PINKIE", i); + char* event = getSystemOutput(padCommand); + if (strcmp(event, "")) { + if (numberOfPads == 0) { + printf("\nGamepad search hits:\n"); + } + printf("%s, Output:%s", padCommand, getSystemOutput(padCommand)); + char iString[20]; + sprintf(iString, "%d", i); + strcat(strcat(strcat(eventPaths, "/dev/input/event"), iString), " "); + strcat(strcat(strcat(eventPaths, "/dev/input/event"), iString), " "); + memset (padEvent[numberOfPads], 0, sizeof(padEvent[numberOfPads])); + strcat(strcat(padEvent[numberOfPads], "/dev/input/event"), iString); + numberOfPads++; + } + } + } + + // Determine if keyboard is connected + char keybCommand[] = "cat /proc/bus/input/devices | grep -B 7 EV=12001 | tr ' ' '\\n' | grep event"; + char* keybEvent = getSystemOutput(keybCommand); + if (strcmp(keybEvent, "")) { + printf("\nKeyboard search hit:\n"); + printf("%s, Output:%s", keybCommand, getSystemOutput(keybCommand)); + } + + + // Automatically set up uinput-mapper with keyboard, 1 or 2 gamepads + // printf("\n%s\n", eventPaths); + char stringNumberOfPads[20]; + char uiMapCommand[400]; + memset (uiMapCommand, 0, sizeof(uiMapCommand)); + char uinputMapperOrKeyboard[20]; + memset (uinputMapperOrKeyboard, 0, sizeof(uinputMapperOrKeyboard)); + char defaultEvent[67]; + memset (defaultEvent, 0, sizeof(defaultEvent)); + strcat(defaultEvent, "SCAN_CODES=/dev/input/"); + printf("\n"); + if ((numberOfPads == 0) && !strcmp(keybEvent, "")) { + printf("\nFound no gamepads or keyboards to configure...\n"); + printf("\nPlease try the \"nomap\" option and configure /sd/arcade.cfg manually. If stuck, please read or open a related issue at https://github.com/Vegz78/McAirpos.\n"); + sleep(1); + exit(1); + } + else if (numberOfPads == 2) { + printf("\nFound %d gamepads to configure on:\n%s, and\n%s\n\n", numberOfPads, padEvent[0], padEvent[1]); + sprintf(stringNumberOfPads, "%d.py)&",numberOfPads); + } + else if ((numberOfPads == 1) && strcmp(keybEvent, "")) { + printf("\nFound %d gamepad to configure on:\n%s\n", numberOfPads, padEvent[0]); + printf("\nFound 1 keyboard to configure on:\n/dev/input/%s\n\n", keybEvent); + strcat(strcat(eventPaths, "/dev/input/"), keybEvent); + eventPaths[strlen(eventPaths)-1] = 0; + strcat(eventPaths, " "); + sprintf(stringNumberOfPads, "%d.py)&",numberOfPads); + } + else if (strcmp(keybEvent, "")) { + printf("\nFound 1 keyboard to configure on:\n/dev/input/%s\n\n", keybEvent); + strcat(defaultEvent, keybEvent); + defaultEvent[strlen(defaultEvent)-1] = 0; + strcat(uinputMapperOrKeyboard, "keyboard"); + } + else if (numberOfPads == 1) { + printf("\nFound %d gamepad to configure on:\n%s\n\n", numberOfPads, padEvent[0]); + sprintf(stringNumberOfPads, "%d.py)&",numberOfPads); + } + else { + printf("\nSomething went wrong, exiting...\n"); + printf("If stuck, please read or open a related issue at https://github.com/Vegz78/McAirpos.\n"); + sleep(1); + exit(1); + } + + + // Launching uinput-mapper + if (numberOfPads > 0) { + strcat(strcat(strcat(strcat(uiMapCommand, "(/home/pi/McAirpos/McAirpos/uinput-mapper/input-read -C -D "), eventPaths), "| sudo /home/pi/McAirpos/McAirpos/uinput-mapper/input-create -C -S /home/pi/McAirpos/McAirpos/uinput-mapper/configs/arcade"), stringNumberOfPads); + if (system(uiMapCommand) == 0) { + printf("\nStarting UInput-Mapper with command:\n%s\n", uiMapCommand); + int whileCount = 0; + while (!strcmp("", getSystemOutput("cat /proc/bus/input/devices | grep -A 8 \"UInputMapper: MakeCode_Arcade\" | tr ' ' '\n' | grep event"))) { + if (whileCount > 500) { + printf("\nTimed out trying to set up UInput-Mapper...\n"); + printf("If stuck, please read or open a related issue at https://github.com/Vegz78/McAirpos.\n"); + exit(1); + } + whileCount++; + } + char* uinputEvent = getSystemOutput("cat /proc/bus/input/devices | grep -A 8 \"UInputMapper: MakeCode_Arcade\" | tr ' ' '\n' | grep event"); + strcat(defaultEvent, uinputEvent); + defaultEvent[strlen(defaultEvent)-1] = 0; + strcat(uinputMapperOrKeyboard, "UInputMapper"); + } else { + printf("\nUInput-Mapper failed to start...\n"); + printf("If stuck, please read or open a related issue at https://github.com/Vegz78/McAirpos.\n"); + exit(1); + } + // Alternative way to launch uinput-mapper + /*if (!fork()) { + setpgid(0, 0); + system(uiMapCommand); + }else {}*/ + } + + + // Set default default event for MakeCode Arcade elf game file + char sedCommand[100]; + snprintf(sedCommand, 100, "sed -i \"1s&.*&\"%s\"&\" /sd/arcade.cfg", defaultEvent); + if (system(sedCommand) == 0) { + printf("\n\nSetting up %s in MakeCode Arcade game's /sd/arcade.cfg with:\n%s\n\n", uinputMapperOrKeyboard, defaultEvent); + } else { + printf("\n\nPlease check path or write permissions for /sd/arcade.cfg and try again.\n\n"); + goto cleanup; + } + } + system("stty -ixon"); //Disable pause in terminal with key combo CTRL+S // Fork game execution on launch, so that it is executed // the same way it's done in-game on reset and finish + char* path = "/dev/tty"; + int fd = open(path, O_RDWR, 0); if (!fork()) { - sleep(1); - system(game); - //execl(game, game, NULL); - }else { - sleep(2); // Wait for fork/game to launch and get pid - //Switch console to graphics mode to avoid disturbing text output in borders - char* path = "/dev/tty"; - int fd = open(path, O_RDWR, 0); if (fd < 0) { perror("unable to open tty"); return 1; } - system("clear"); if (ioctl(fd, KDSETMODE, KD_GRAPHICS) < 0) { perror("warn: ioctl KDSETMODE failed"); } close(fd); - system("clear"); + system("sudo killall pulseaudio"); + if (system(game) == 36608) { + printf("\n\n%s was exited by the user\n\n\n", game); + } else { + printf("\n\nPlease check path to and executable permissions for game_file.elf and try again.\n\n\n"); + } + //Alternative way to launch game + //execl(game, game, NULL); + }else { + sleep(1); // Wait for fork/game to launch and get pid // Get running game's process name char* processID = getSystemOutput("head -1 /tmp/pxt-pid"); @@ -185,7 +259,7 @@ int main(int argc, char** argv) { // Busy waiting to continue and cleanup when game is exited // Why does this not work without the printf?!? besure: - while (0 == system(processCheckCmd)) { + while (0 == system(processCheckCmd)) { printf("%s\n", getSystemOutput(processCheckCmd)); sleep(2); } @@ -194,11 +268,13 @@ int main(int argc, char** argv) { sleep(1); if (0 == system(processCheckCmd)) {goto besure;} + // Kill any remaining/orphaned game processes before exit char killAllCmd[100]; - snprintf(killAllCmd, 100, "killall %s", processName); + snprintf(killAllCmd, 100, "killall %s 2>&1", processName); system(killAllCmd); - system("sudo killall input-create&&sudo killall input-read"); +cleanup: + system("sudo killall input-create 2>&1 & sudo killall input-read 2>&1"); // The following code is borrowed from https://github.com/hobbitalistair/termfix: @@ -213,7 +289,7 @@ int main(int argc, char** argv) { // This one fails without sudo, but doesn't seem needed for // MakeCode Arcade games(comment out or leave as and option?). if (ioctl(fd, VT_UNLOCKSWITCH, 1) < 0) { - perror("warn: ioctl VT_UNLOCKSWITCH failed"); + //perror("warn: ioctl VT_UNLOCKSWITCH failed"); } if (ioctl(fd, KDSETMODE, KD_TEXT) < 0) { @@ -225,7 +301,7 @@ int main(int argc, char** argv) { } system("stty ixon"); - system("clear"); + //system("clear"); } return 0;