From 7be9a1aef640f0976cc1890eac1d9675b3a37e33 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Fri, 8 May 2020 16:59:08 -0400 Subject: [PATCH] implement gamebridge in the game code --- src/pc/configfile.c | 2 + src/pc/configfile.h | 1 + src/pc/controller/controller_entry_point.c | 2 + src/pc/controller/controller_gamebridge.c | 69 ++++++++++++++++++++++ src/pc/controller/controller_gamebridge.h | 8 +++ 5 files changed, 82 insertions(+) create mode 100644 src/pc/controller/controller_gamebridge.c create mode 100644 src/pc/controller/controller_gamebridge.h diff --git a/src/pc/configfile.c b/src/pc/configfile.c index 10ff1e6..b8b1b4b 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -29,6 +29,7 @@ struct ConfigOption { /* *Config options and default values */ +bool configGameBridge = false; bool configFullscreen = false; // Keyboard mappings (scancode values) unsigned int configKeyA = 0x26; @@ -47,6 +48,7 @@ unsigned int configKeyStickRight = 0x20; static const struct ConfigOption options[] = { + {.name = "gamebridge", .type = CONFIG_TYPE_BOOL, .boolValue = &configGameBridge}, {.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configFullscreen}, {.name = "key_a", .type = CONFIG_TYPE_UINT, .uintValue = &configKeyA}, {.name = "key_b", .type = CONFIG_TYPE_UINT, .uintValue = &configKeyB}, diff --git a/src/pc/configfile.h b/src/pc/configfile.h index ae9070b..7e55613 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -1,6 +1,7 @@ #ifndef CONFIGFILE_H #define CONFIGFILE_H +extern bool configGameBridge; extern bool configFullscreen; extern unsigned int configKeyA; extern unsigned int configKeyB; diff --git a/src/pc/controller/controller_entry_point.c b/src/pc/controller/controller_entry_point.c index faf91f5..be8e773 100644 --- a/src/pc/controller/controller_entry_point.c +++ b/src/pc/controller/controller_entry_point.c @@ -5,11 +5,13 @@ #include "controller_keyboard.h" #include "controller_sdl.h" +#include "controller_gamebridge.h" static struct ControllerAPI *controller_implementations[] = { &controller_recorded_tas, &controller_sdl, &controller_keyboard, + &controller_gamebridge, }; s32 osContInit(OSMesgQueue *mq, u8 *controllerBits, OSContStatus *status) { diff --git a/src/pc/controller/controller_gamebridge.c b/src/pc/controller/controller_gamebridge.c new file mode 100644 index 0000000..222dfe4 --- /dev/null +++ b/src/pc/controller/controller_gamebridge.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "controller_api.h" +#include "../configfile.h" + +static FILE *vblank; +static FILE *input; + +#define vblank_fname "vblank" +#define input_fname "input" + +static void gamebridge_init(void) { + if (!configGameBridge) { + return; + } + + unlink(vblank_fname); + unlink(input_fname); + + int result; + + result = mkfifo(vblank_fname, S_IRUSR|S_IWUSR); + if (result < 0) { + perror("mkfifo "vblank_fname); + assert(result < 0); + } + + result = mkfifo(input_fname, S_IRUSR| S_IWUSR); + if (result < 0) { + perror("mkfifo "input_fname); + assert(result < 0); + } + + vblank = fopen(vblank_fname, "w"); + input = fopen(input_fname, "rb"); + assert(vblank); + assert(input); + + setvbuf(vblank, NULL, _IONBF, 0); + setvbuf(input, NULL, _IONBF, 0); +} + +static void gamebridge_read(OSContPad *pad) { + if (!configGameBridge) { + return; + } + + char* ok = "OK\n"; + fwrite(ok, 1, sizeof(ok), vblank); + uint8_t bytes[4] = {0}; + fread(bytes, 1, 4, input); + pad->button = (bytes[0] << 8) | bytes[1]; + pad->stick_x = bytes[2]; + pad->stick_y = bytes[3]; +} + +struct ControllerAPI controller_gamebridge = { + gamebridge_init, + gamebridge_read +}; diff --git a/src/pc/controller/controller_gamebridge.h b/src/pc/controller/controller_gamebridge.h new file mode 100644 index 0000000..cae2a4c --- /dev/null +++ b/src/pc/controller/controller_gamebridge.h @@ -0,0 +1,8 @@ +#ifndef CONTROLLER_GAMEBRIDGE_H +#define CONTROLLER_GAMEBRIDGE_H + +#include "controller_api.h" + +extern struct ControllerAPI controller_gamebridge; + +#endif