From 20c6e46a711ebadff1d3a5439c4145aaea9c9759 Mon Sep 17 00:00:00 2001 From: icex2 Date: Sun, 11 Jun 2023 18:21:36 +0200 Subject: [PATCH] feat(ddriotest): Add driotest tool to test ddrio API implementations --- Module.mk | 3 + src/main/ddriotest/Module.mk | 8 + src/main/ddriotest/main.c | 303 +++++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+) create mode 100644 src/main/ddriotest/Module.mk create mode 100644 src/main/ddriotest/main.c diff --git a/Module.mk b/Module.mk index 173246d..73a24af 100644 --- a/Module.mk +++ b/Module.mk @@ -107,6 +107,7 @@ include src/main/ddrhook2/Module.mk include src/main/ddrio-p3io/Module.mk include src/main/ddrio-mm/Module.mk include src/main/ddrio-smx/Module.mk +include src/main/ddriotest/Module.mk include src/main/ddrio/Module.mk include src/main/dinput/Module.mk include src/main/eamio-icca/Module.mk @@ -213,6 +214,7 @@ $(zipdir)/: $(zipdir)/tools.zip: \ build/bin/indep-32/aciotest.exe \ + build/bin/indep-32/ddriotest.exe \ build/bin/indep-32/eamiotest.exe \ build/bin/indep-32/ezusb-iidx-fpga-flash.exe \ build/bin/indep-32/ezusb-iidx-sram-flash.exe \ @@ -234,6 +236,7 @@ $(zipdir)/tools.zip: \ $(zipdir)/tools-x64.zip: \ build/bin/indep-64/aciotest.exe \ + build/bin/indep-64/ddriotest.exe \ build/bin/indep-64/eamiotest.exe \ build/bin/indep-64/iidxiotest.exe \ build/bin/indep-64/iidx-bio2-exit-hook.dll \ diff --git a/src/main/ddriotest/Module.mk b/src/main/ddriotest/Module.mk new file mode 100644 index 0000000..569d973 --- /dev/null +++ b/src/main/ddriotest/Module.mk @@ -0,0 +1,8 @@ +exes += ddriotest \ + +libs_ddriotest := \ + ddrio \ + util \ + +src_ddriotest := \ + main.c \ diff --git a/src/main/ddriotest/main.c b/src/main/ddriotest/main.c new file mode 100644 index 0000000..e03bc0c --- /dev/null +++ b/src/main/ddriotest/main.c @@ -0,0 +1,303 @@ +#include +#include +#include +#include + +#include + +#include "bemanitools/ddrio.h" + +#include "util/log.h" +#include "util/thread.h" + +int main(int argc, char **argv) +{ + enum log_level log_level; + + log_level = LOG_LEVEL_FATAL; + + for (int i = 0; i < argc; i++) { + if (!strcmp(argv[i], "-v")) { + log_level = LOG_LEVEL_WARNING; + } else if (!strcmp(argv[i], "-vv")) { + log_level = LOG_LEVEL_INFO; + } else if (!strcmp(argv[i], "-vvv")) { + log_level = LOG_LEVEL_MISC; + } + } + + log_to_writer(log_writer_stderr, NULL); + log_set_level(log_level); + + ddr_io_set_loggers( + log_impl_misc, log_impl_info, log_impl_warning, log_impl_fatal); + + if (!ddr_io_init(crt_thread_create, crt_thread_join, crt_thread_destroy)) { + fprintf(stderr, "Initializing ddrio failed\n"); + return -1; + } + + fprintf( + stderr, + ">>> Initializing ddrio successful, press enter to continue <<<\n"); + + if (getchar() != '\n') { + return 0; + } + + // inputs + uint32_t pad = 0; + + // outputs + uint32_t extio_lights = 0; + uint32_t p3io_lights = 0; + + bool loop = true; + uint8_t cnt = 0; + + while (loop) { + ddr_io_set_lights_extio(extio_lights); + ddr_io_set_lights_p3io(p3io_lights); + + pad = ddr_io_read_pad(); + + system("cls"); + + printf("Counter: %d\n", cnt); + printf("Player 1 Player 2\n"); + printf("\n"); + printf("Pad\n"); + + printf( + "Up: %d Up: %d\n", + (pad & (1 << DDR_P1_UP)) > 0, + (pad & (1 << DDR_P2_UP)) > 0); + printf( + "Down: %d Down: %d\n", + (pad & (1 << DDR_P1_DOWN)) > 0, + (pad & (1 << DDR_P2_DOWN)) > 0); + printf( + "Left: %d Left: %d\n", + (pad & (1 << DDR_P1_LEFT)) > 0, + (pad & (1 << DDR_P2_LEFT)) > 0); + printf( + "Right: %d Right: %d\n", + (pad & (1 << DDR_P1_RIGHT)) > 0, + (pad & (1 << DDR_P2_RIGHT)) > 0); + printf("\n"); + printf("Menu\n"); + printf( + "Start: %d Start: %d\n", + (pad & (1 << DDR_P1_START)) > 0, + (pad & (1 << DDR_P2_START)) > 0); + printf( + "Up: %d Up: %d\n", + (pad & (1 << DDR_P1_MENU_UP)) > 0, + (pad & (1 << DDR_P2_MENU_UP)) > 0); + printf( + "Down: %d Down: %d\n", + (pad & (1 << DDR_P1_MENU_DOWN)) > 0, + (pad & (1 << DDR_P2_MENU_DOWN)) > 0); + printf( + "Left: %d Left: %d\n", + (pad & (1 << DDR_P1_MENU_LEFT)) > 0, + (pad & (1 << DDR_P2_MENU_LEFT)) > 0); + printf( + "Right: %d Right: %d\n", + (pad & (1 << DDR_P1_MENU_RIGHT)) > 0, + (pad & (1 << DDR_P2_MENU_RIGHT)) > 0); + printf("\n"); + printf("Operator\n"); + printf( + "Test: %d Service: %d Coin: %d\n", + (pad & (1 << DDR_TEST)) > 0, + (pad & (1 << DDR_SERVICE)) > 0, + (pad & (1 << DDR_COIN)) > 0); + + if ((pad & (1 << DDR_P1_UP)) > 0) { + extio_lights |= (1 << LIGHT_P1_UP); + } else { + extio_lights &= ~(1 << LIGHT_P1_UP); + } + + if ((pad & (1 << DDR_P1_DOWN)) > 0) { + extio_lights |= (1 << LIGHT_P1_DOWN); + } else { + extio_lights &= ~(1 << LIGHT_P1_DOWN); + } + + if ((pad & (1 << DDR_P1_LEFT)) > 0) { + extio_lights |= (1 << LIGHT_P1_LEFT); + } else { + extio_lights &= ~(1 << LIGHT_P1_LEFT); + } + + if ((pad & (1 << DDR_P1_RIGHT)) > 0) { + extio_lights |= (1 << LIGHT_P1_RIGHT); + } else { + extio_lights &= ~(1 << LIGHT_P1_RIGHT); + } + + if ((pad & (1 << DDR_P2_UP)) > 0) { + extio_lights |= (1 << LIGHT_P2_UP); + } else { + extio_lights &= ~(1 << LIGHT_P2_UP); + } + + if ((pad & (1 << DDR_P2_DOWN)) > 0) { + extio_lights |= (1 << LIGHT_P2_DOWN); + } else { + extio_lights &= ~(1 << LIGHT_P2_DOWN); + } + + if ((pad & (1 << DDR_P2_LEFT)) > 0) { + extio_lights |= (1 << LIGHT_P2_LEFT); + } else { + extio_lights &= ~(1 << LIGHT_P2_LEFT); + } + + if ((pad & (1 << DDR_P2_RIGHT)) > 0) { + extio_lights |= (1 << LIGHT_P2_RIGHT); + } else { + extio_lights &= ~(1 << LIGHT_P2_RIGHT); + } + + if ((pad & (1 << DDR_P1_START)) > 0 || + (pad & (1 << DDR_P1_MENU_UP)) > 0 || + (pad & (1 << DDR_P1_MENU_DOWN)) > 0 || + (pad & (1 << DDR_P1_MENU_LEFT)) > 0 || + (pad & (1 << DDR_P1_MENU_RIGHT)) > 0) { + p3io_lights |= (1 << LIGHT_P1_MENU); + } else { + p3io_lights &= ~(1 << LIGHT_P1_MENU); + } + + if ((pad & (1 << DDR_P2_START)) > 0 || + (pad & (1 << DDR_P2_MENU_UP)) > 0 || + (pad & (1 << DDR_P2_MENU_DOWN)) > 0 || + (pad & (1 << DDR_P2_MENU_LEFT)) > 0 || + (pad & (1 << DDR_P2_MENU_RIGHT)) > 0) { + p3io_lights |= (1 << LIGHT_P2_MENU); + } else { + p3io_lights &= ~(1 << LIGHT_P2_MENU); + } + + /* avoid CPU banging */ + Sleep(1); + ++cnt; + + /* process menu */ + if ((GetAsyncKeyState(VK_ESCAPE) & 0x8000) != 0) { + system("cls"); + Sleep(5); + printf( + "Menu options:\n" + " 0: Exit menu and continue loop\n" + " 1: Exit\n" + " 2: Set neon state\n" + " 3: Top lamp state\n" + " 4: Set all lights on\n" + " 5: Set all lights off\n" + "Waiting for input: "); + + char c = getchar(); + + switch (c) { + case '1': { + loop = false; + break; + } + + case '2': { + int state; + int n; + + printf("Enter neon state (0/1): "); + + n = scanf("%d", &state); + + if (n > 0) { + extio_lights |= (1 << LIGHT_NEONS); + } else { + extio_lights &= ~(1 << LIGHT_NEONS); + } + + break; + } + + case '3': { + char buf[4]; + int n; + + printf("Enter top lamp state, chain of 0/1s: "); + + n = scanf("%8s", buf); + + if (n > 0) { + if (buf[0] == '1') { + p3io_lights |= (1 << LIGHT_P1_UPPER_LAMP); + } else { + p3io_lights &= ~(1 << LIGHT_P1_UPPER_LAMP); + } + + if (buf[1] == '1') { + p3io_lights |= (1 << LIGHT_P1_LOWER_LAMP); + } else { + p3io_lights &= ~(1 << LIGHT_P1_LOWER_LAMP); + } + + if (buf[2] == '1') { + p3io_lights |= (1 << LIGHT_P2_UPPER_LAMP); + } else { + p3io_lights &= ~(1 << LIGHT_P2_UPPER_LAMP); + } + + if (buf[3] == '1') { + p3io_lights |= (1 << LIGHT_P2_LOWER_LAMP); + } else { + p3io_lights &= ~(1 << LIGHT_P2_LOWER_LAMP); + } + } + + break; + } + + case '4': { + extio_lights |= (1 << LIGHT_NEONS); + + p3io_lights |= (1 << LIGHT_P1_MENU); + p3io_lights |= (1 << LIGHT_P2_MENU); + p3io_lights |= (1 << LIGHT_P1_UPPER_LAMP); + p3io_lights |= (1 << LIGHT_P1_LOWER_LAMP); + p3io_lights |= (1 << LIGHT_P2_UPPER_LAMP); + p3io_lights |= (1 << LIGHT_P2_LOWER_LAMP); + + break; + } + + case '5': { + extio_lights &= ~(1 << LIGHT_NEONS); + + p3io_lights &= ~(1 << LIGHT_P1_MENU); + p3io_lights &= ~(1 << LIGHT_P2_MENU); + p3io_lights &= ~(1 << LIGHT_P1_UPPER_LAMP); + p3io_lights &= ~(1 << LIGHT_P1_LOWER_LAMP); + p3io_lights &= ~(1 << LIGHT_P2_UPPER_LAMP); + p3io_lights &= ~(1 << LIGHT_P2_LOWER_LAMP); + + break; + } + + case '0': + default: + break; + } + } + } + + system("cls"); + + ddr_io_fini(); + + return 0; +} \ No newline at end of file