diff --git a/shell.nix b/shell.nix index c611f0b..2198fbb 100644 --- a/shell.nix +++ b/shell.nix @@ -16,5 +16,6 @@ in pkgs.mkShell { glfw libGL clang_10 + gdb ]; } diff --git a/src/pc/controller/controller_entry_point.c b/src/pc/controller/controller_entry_point.c index faf91f5..a99b5e5 100644 --- a/src/pc/controller/controller_entry_point.c +++ b/src/pc/controller/controller_entry_point.c @@ -3,13 +3,14 @@ #include "controller_recorded_tas.h" #include "controller_keyboard.h" - #include "controller_sdl.h" +#include "controller_tas_recorder.h" static struct ControllerAPI *controller_implementations[] = { &controller_recorded_tas, - &controller_sdl, - &controller_keyboard, + /* &controller_sdl, */ + /* &controller_keyboard, */ + /* &controller_tas_recorder, */ }; s32 osContInit(OSMesgQueue *mq, u8 *controllerBits, OSContStatus *status) { diff --git a/src/pc/controller/controller_recorded_tas.c b/src/pc/controller/controller_recorded_tas.c index c55c533..83b982b 100644 --- a/src/pc/controller/controller_recorded_tas.c +++ b/src/pc/controller/controller_recorded_tas.c @@ -23,7 +23,10 @@ static void tas_read(OSContPad *pad) { if (fd != 0) { uint8_t bytes[4] = {0}; int result = read(fd, bytes, 4); - assert(result > 0); + if (result < 0) { + return; + } + pad->button = (bytes[0] << 8) | bytes[1]; pad->stick_x = bytes[2]; pad->stick_y = bytes[3]; diff --git a/src/pc/controller/controller_tas_recorder.c b/src/pc/controller/controller_tas_recorder.c new file mode 100644 index 0000000..d1c95a3 --- /dev/null +++ b/src/pc/controller/controller_tas_recorder.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include + +#include "controller_api.h" + +static FILE *fout; +static int counter; + +#define OFFSET 0x400 +#define fname "rec.m64" + +static void tas_recorder_close(void) { + fclose(fout); +} + +static void tas_recorder_init(void) { + if (fname == NULL) { + fout = NULL; + return; + } + + unlink(fname); + printf("[tas_recorder] writing output to %s\n", fname); + fout = fopen(fname, "wb"); + assert(fout != NULL); + uint8_t buf[OFFSET]; + memset(buf, 0, sizeof(buf)); + fwrite(buf, 1, sizeof(buf), fout); + atexit(tas_recorder_close); +} + +static void tas_recorder_read(OSContPad *pad) { + if (fout == NULL) { + return; + } + + uint8_t bytes[4] = {0}; + int button1 = pad->button; + int button2 = pad->button; + bytes[0] = button1 >> 8; + bytes[1] = button2 & 0x00FF; + bytes[2] = pad->stick_x; + bytes[3] = pad->stick_y; + fwrite(bytes, 1, 4, fout); +} + +struct ControllerAPI controller_tas_recorder = { + tas_recorder_init, + tas_recorder_read +}; diff --git a/src/pc/controller/controller_tas_recorder.h b/src/pc/controller/controller_tas_recorder.h new file mode 100644 index 0000000..8ceccf8 --- /dev/null +++ b/src/pc/controller/controller_tas_recorder.h @@ -0,0 +1,8 @@ +#ifndef CONTROLLER_TAS_RECORDER_H +#define CONTROLLER_TAS_RECORDER_H + +#include "controller_api.h" + +extern struct ControllerAPI controller_tas_recorder; + +#endif