From cd0ba51b5a6fba37107df12e2aa41fb40bd8e511 Mon Sep 17 00:00:00 2001 From: bicarus <202771338+bicarus-dev@users.noreply.github.com> Date: Wed, 6 May 2026 23:29:52 -0700 Subject: [PATCH] sdk: introduce Spice SDK (#676) ## Link to GitHub Issue or related Pull Request, if one exists n/a ## Description of change Adds a flat-C, headers-only library for writing DLL plugins with spice. This is meant to be an alternative to writing applications over spice API which doesn't suit some scenarios like writing custom high-performance I/O modules. All you have to do is: 1. Create a 32-bit or 64-bit DLL with `spice_sdk_entry_point` as a DLLExport 1. Include `spicesdk.h`, and optionally `spicesdk_io.h` (see `extras\sdk\include`) 1. `spice_sdk_entry_point` will be called when hooks get initialized. Call `init` with valid parameters. 1. When `init` returns, `SPICE_SDK_V0` will be filled out with a series of function pointers; your DLL can now start calling into it. 1. Compile your DLL and add it as a DLL hook (`-k`) in spice when launching the game. See `v0_cpp.cpp` for an example. V0 implements the following functions: ``` log; get_game_info; get_avs_info; get_button; set_button; get_analog; set_analog; get_light; set_light; set_touch; clear_touch; insert_card; set_keypad; ``` V0 is focused on providing common utility functions needed in a lot of DLL hooks (get AVS info, log messages to file), and implementing I/O. In the future, we could have more interesting things like: * scanning and modifying memory * installing DLL hooks * having direct hooks into I/O emulation modules * getting full tape LEDs * having a callback into DX9 `Present` call * drawing an ImGui window More detailed documentation is coming soon in form of a wiki page. ## Testing See included sample DLL. --- src/spice2x/CMakeLists.txt | 37 +- src/spice2x/README.md | 10 + src/spice2x/build_all.sh | 24 +- src/spice2x/launcher/launcher.cpp | 7 + src/spice2x/launcher/shutdown.cpp | 3 + src/spice2x/sdk/include/spicesdk.h | 273 +++ src/spice2x/sdk/include/spicesdk_io.h | 1905 +++++++++++++++++ src/spice2x/sdk/sample/v0/cpp/v0_cpp.cpp | 57 + src/spice2x/sdk/sample/v0/cpp/v0_cpp.def | 4 + src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.c | 318 +++ .../sdk/sample/v0/flat_c/v0_flat_c.def | 4 + src/spice2x/sdk/sdk.cpp | 595 +++++ src/spice2x/sdk/sdk.h | 12 + 13 files changed, 3233 insertions(+), 16 deletions(-) create mode 100644 src/spice2x/sdk/include/spicesdk.h create mode 100644 src/spice2x/sdk/include/spicesdk_io.h create mode 100644 src/spice2x/sdk/sample/v0/cpp/v0_cpp.cpp create mode 100644 src/spice2x/sdk/sample/v0/cpp/v0_cpp.def create mode 100644 src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.c create mode 100644 src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.def create mode 100644 src/spice2x/sdk/sdk.cpp create mode 100644 src/spice2x/sdk/sdk.h diff --git a/src/spice2x/CMakeLists.txt b/src/spice2x/CMakeLists.txt index e50cea1..0836a18 100644 --- a/src/spice2x/CMakeLists.txt +++ b/src/spice2x/CMakeLists.txt @@ -607,6 +607,9 @@ set(SOURCE_FILES ${SOURCE_FILES} reader/structuredmessage.cpp reader/crypt.cpp + # sdk + sdk/sdk.cpp + # stubs stubs/stubs.cpp @@ -860,6 +863,36 @@ if(NOT MSVC) set_target_properties(spicetools_stubs_cpusbxpkm PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") endif() +# sdk_sample_v0_flat_c.dll (32 bit) +set(SOURCE_FILES sdk/sample/v0/flat_c/v0_flat_c.c) +add_library(spicetools_sdk_sample_v0_flat_c_32 SHARED ${SOURCE_FILES} ${RESOURCE_FILES} sdk/sample/v0/flat_c/v0_flat_c.def) +set_target_properties(spicetools_sdk_sample_v0_flat_c_32 PROPERTIES PREFIX "") +set_target_properties(spicetools_sdk_sample_v0_flat_c_32 PROPERTIES OUTPUT_NAME "sdk_sample_v0_flat_c") + +if(NOT MSVC) + set_target_properties(spicetools_sdk_sample_v0_flat_c_32 PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") +endif() + +# sdk_sample_v0_flat_c.dll (64 bit) +set(SOURCE_FILES sdk/sample/v0/flat_c/v0_flat_c.c) +add_library(spicetools_sdk_sample_v0_flat_c_64 SHARED ${SOURCE_FILES} ${RESOURCE_FILES} sdk/sample/v0/flat_c/v0_flat_c.def) +set_target_properties(spicetools_sdk_sample_v0_flat_c_64 PROPERTIES PREFIX "") +set_target_properties(spicetools_sdk_sample_v0_flat_c_64 PROPERTIES OUTPUT_NAME "sdk_sample_v0_flat_c") + +if(NOT MSVC) + set_target_properties(spicetools_sdk_sample_v0_flat_c_64 PROPERTIES COMPILE_FLAGS "-m64" LINK_FLAGS "-m64") +endif() + +# sdk_sample_v0_cpp.dll (64 bit) +set(SOURCE_FILES sdk/sample/v0/cpp/v0_cpp.cpp) +add_library(spicetools_sdk_sample_v0_cpp_64 SHARED ${SOURCE_FILES} ${RESOURCE_FILES} sdk/sample/v0/cpp/v0_cpp.def) +set_target_properties(spicetools_sdk_sample_v0_cpp_64 PROPERTIES PREFIX "") +set_target_properties(spicetools_sdk_sample_v0_cpp_64 PROPERTIES OUTPUT_NAME "sdk_sample_v0_cpp") + +if(NOT MSVC) + set_target_properties(spicetools_sdk_sample_v0_cpp_64 PROPERTIES COMPILE_FLAGS "-m64" LINK_FLAGS "-m64") +endif() + # output directories #################### @@ -869,14 +902,14 @@ set_target_properties(spicetools_cfg spicetools_cfg_linux RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/spicetools") # output 32bit -set_target_properties(spicetools_spice spicetools_spice_laa spicetools_spice_linux spicetools_stubs_kbt spicetools_stubs_kld spicetools_stubs_cpusbxpkm +set_target_properties(spicetools_spice spicetools_spice_laa spicetools_spice_linux spicetools_stubs_kbt spicetools_stubs_kld spicetools_stubs_cpusbxpkm spicetools_sdk_sample_v0_flat_c_32 PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/archive32" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/spicetools/32" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/spicetools/32") # output 64bit -set_target_properties(spicetools_spice64 spicetools_spice64_linux spicetools_stubs_kbt64 spicetools_stubs_kld64 spicetools_stubs_nvcuda spicetools_stubs_nvcuvid spicetools_stubs_nvEncodeAPI64 +set_target_properties(spicetools_spice64 spicetools_spice64_linux spicetools_stubs_kbt64 spicetools_stubs_kld64 spicetools_stubs_nvcuda spicetools_stubs_nvcuvid spicetools_stubs_nvEncodeAPI64 spicetools_sdk_sample_v0_flat_c_64 spicetools_sdk_sample_v0_cpp_64 PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/archive64" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/spicetools/64" diff --git a/src/spice2x/README.md b/src/spice2x/README.md index f224037..63bfbe6 100644 --- a/src/spice2x/README.md +++ b/src/spice2x/README.md @@ -283,6 +283,16 @@ Python is the only one that is fully spec compliant. Other libraries may be missing features and contain bugs; please feel free to contribute code to fill the gaps if you work on a project using these libraries. +## Spice SDK (for DLL hooks / plugins) + +As an alternative to Spice API, Spice SDK is available. + +This is a flat C, header-only library that can be included in your DLL. Once +initialized, you can call directly into helper routines provided by Spicetools +executable, making low-latency and high-throughput interactions possible. + +Check the documentation on the wiki for more details. + ## License Unless otherwise noted, all files are licensed under the GPLv3. See the LICENSE file for the full license text. diff --git a/src/spice2x/build_all.sh b/src/spice2x/build_all.sh index e8304cb..635036c 100755 --- a/src/spice2x/build_all.sh +++ b/src/spice2x/build_all.sh @@ -68,8 +68,8 @@ DIST_FOLDER="./dist" DIST_NAME="spice2x-$(date +%y)-$(date +%m)-$(date +%d).zip" DIST_NAME_EXTRAS="spice2x-$(date +%y)-$(date +%m)-$(date +%d)-full.zip" DIST_COMMENT=${DIST_NAME}$'\n'"$GIT_BRANCH - $GIT_HEAD"$'\nThank you for playing.' -TARGETS_32="spicetools_stubs_kbt spicetools_stubs_kld spicetools_cfg spicetools_cfg_linux spicetools_spice spicetools_spice_laa spicetools_spice_linux spicetools_stubs_cpusbxpkm" -TARGETS_64="spicetools_stubs_kbt64 spicetools_stubs_kld64 spicetools_stubs_nvEncodeAPI64 spicetools_stubs_nvcuvid spicetools_stubs_nvcuda spicetools_spice64 spicetools_spice64_linux" +TARGETS_32="spicetools_stubs_kbt spicetools_stubs_kld spicetools_cfg spicetools_cfg_linux spicetools_spice spicetools_spice_laa spicetools_spice_linux spicetools_stubs_cpusbxpkm spicetools_sdk_sample_v0_flat_c_32" +TARGETS_64="spicetools_stubs_kbt64 spicetools_stubs_kld64 spicetools_stubs_nvEncodeAPI64 spicetools_stubs_nvcuvid spicetools_stubs_nvcuda spicetools_spice64 spicetools_spice64_linux spicetools_sdk_sample_v0_flat_c_64 spicetools_sdk_sample_v0_cpp_64" TARGETS_XP32="spicetools_cfg spicetools_spice" TARGETS_XP64="spicetools_spice64" @@ -269,6 +269,8 @@ rm -rf ${OUTDIR_EXTRAS} mkdir -p ${OUTDIR_EXTRAS} mkdir -p ${OUTDIR_EXTRAS}/largeaddressaware mkdir -p ${OUTDIR_EXTRAS}/linux +mkdir -p ${OUTDIR_EXTRAS}/sdk/samples/32 +mkdir -p ${OUTDIR_EXTRAS}/sdk/samples/64 if ((BUILD_XP > 0)) then mkdir -p ${OUTDIR_EXTRAS}/winxp @@ -281,16 +283,8 @@ then cp ${BUILDDIR_32}/spicetools/spicecfg-pdb.pdb ${OUTDIR} 2>/dev/null cp ${BUILDDIR_32}/spicetools/32/spice-pdb.exe ${OUTDIR} 2>/dev/null cp ${BUILDDIR_32}/spicetools/32/spice-pdb.pdb ${OUTDIR} 2>/dev/null - #cp ${BUILDDIR_32}/spicetools/32/kbt.dll ${OUTDIR}/stubs/32 2>/dev/null - #cp ${BUILDDIR_32}/spicetools/32/kld.dll ${OUTDIR}/stubs/32 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/spice64-pdb.exe ${OUTDIR} 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/spice64-pdb.pdb ${OUTDIR} 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/kbt.dll ${OUTDIR}/stubs/64 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/kld.dll ${OUTDIR}/stubs/64 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/nvEncodeAPI64.dll ${OUTDIR}/stubs/64 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/nvcuda.dll ${OUTDIR}/stubs/64 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/nvcuvid.dll ${OUTDIR}/stubs/64 2>/dev/null - #cp ${BUILDDIR_32}/spicetools/32/cpusbxpkm.dll ${OUTDIR}/stubs/32 2>/dev/null else # release files cp ${BUILDDIR_32}/spicetools/spicecfg.exe ${OUTDIR} 2>/dev/null @@ -298,16 +292,15 @@ else cp ${BUILDDIR_32}/spicetools/32/spice.exe ${OUTDIR} 2>/dev/null cp ${BUILDDIR_32}/spicetools/32/spice_laa.exe ${OUTDIR_EXTRAS}/largeaddressaware/spice.exe 2>/dev/null cp ${BUILDDIR_32}/spicetools/32/spice_linux.exe ${OUTDIR_EXTRAS}/linux/spice.exe 2>/dev/null - #cp ${BUILDDIR_32}/spicetools/32/kbt.dll ${OUTDIR}/stubs/32 2>/dev/null - #cp ${BUILDDIR_32}/spicetools/32/kld.dll ${OUTDIR}/stubs/32 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/spice64.exe ${OUTDIR} 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/spice64_linux.exe ${OUTDIR_EXTRAS}/linux/spice64.exe 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/kbt.dll ${OUTDIR}/stubs/64 2>/dev/null - #cp ${BUILDDIR_64}/spicetools/64/kld.dll ${OUTDIR}/stubs/64 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/nvEncodeAPI64.dll ${OUTDIR}/stubs/64 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/nvcuda.dll ${OUTDIR}/stubs/64 2>/dev/null cp ${BUILDDIR_64}/spicetools/64/nvcuvid.dll ${OUTDIR}/stubs/64 2>/dev/null cp ${BUILDDIR_32}/spicetools/32/cpusbxpkm.dll ${OUTDIR}/stubs/32 2>/dev/null + cp ${BUILDDIR_32}/spicetools/32/sdk_sample_v0_flat_c.dll ${OUTDIR_EXTRAS}/sdk/samples/32/v0_flat_c.dll 2>/dev/null + cp ${BUILDDIR_64}/spicetools/64/sdk_sample_v0_flat_c.dll ${OUTDIR_EXTRAS}/sdk/samples/64/v0_flat_c.dll 2>/dev/null + cp ${BUILDDIR_64}/spicetools/64/sdk_sample_v0_cpp.dll ${OUTDIR_EXTRAS}/sdk/samples/64/v0_cpp.dll 2>/dev/null if ((BUILD_XP > 0)) then cp ${BUILDDIR_WINXP_32}/spicetools/spicecfg.exe ${OUTDIR_EXTRAS}/winxp 2>/dev/null @@ -326,6 +319,9 @@ then echo "WARNING: Couldn't get git to create the archive. Is this a git repository?" fi +# sdk headers +cp -r ./sdk/include ${OUTDIR_EXTRAS}/sdk + # copy resources rm -rf ${OUTDIR_EXTRAS}/api mkdir ${OUTDIR_EXTRAS}/api diff --git a/src/spice2x/launcher/launcher.cpp b/src/spice2x/launcher/launcher.cpp index 32b032b..c2c0061 100644 --- a/src/spice2x/launcher/launcher.cpp +++ b/src/spice2x/launcher/launcher.cpp @@ -98,6 +98,7 @@ #include "rawinput/rawinput.h" #include "rawinput/touch.h" #include "reader/reader.h" +#include "sdk/sdk.h" #include "stubs/stubs.h" #include "touch/touch.h" #include "util/cpuutils.h" @@ -2358,6 +2359,7 @@ int main_implementation(int argc, char *argv[]) { }); } else { bt5api_hook(module); + sdk::register_sdk_hooks(hook, module); } } @@ -2392,6 +2394,9 @@ int main_implementation(int argc, char *argv[]) { bt5api_init(); } + // init SDK + sdk::init_sdk_modules(); + // API if (api_enable || std::min(api_serial_port.size(), api_serial_baud.size()) > 0) { API_CONTROLLER = std::make_unique(api_port, api_pass, api_pretty); @@ -2499,6 +2504,8 @@ int main_implementation(int argc, char *argv[]) { bt5api_dispose(); } + sdk::fini_sdk_modules(); + // stop raw input RI_MGR.reset(); diff --git a/src/spice2x/launcher/shutdown.cpp b/src/spice2x/launcher/shutdown.cpp index 6e9c235..15a9ca6 100644 --- a/src/spice2x/launcher/shutdown.cpp +++ b/src/spice2x/launcher/shutdown.cpp @@ -14,6 +14,7 @@ #include "launcher.h" #include "logger.h" #include "nvapi/nvapi.h" +#include "sdk/sdk.h" namespace launcher { @@ -23,6 +24,8 @@ namespace launcher { // therefore, subsystems need to be guarded against multiple unload attempts log_info("launcher", "stopping subsystems"); + sdk::fini_sdk_modules(); + // reset monitor settings reset_monitor_on_exit(); diff --git a/src/spice2x/sdk/include/spicesdk.h b/src/spice2x/sdk/include/spicesdk.h new file mode 100644 index 0000000..2461ea3 --- /dev/null +++ b/src/spice2x/sdk/include/spicesdk.h @@ -0,0 +1,273 @@ +#pragma once +#ifndef SPICE_SDK_H +#define SPICE_SDK_H + +#include +#include + +#ifdef __cplusplus +#define SPICE_SDK_ENTRY_POINT extern "C" __declspec(dllexport) int __cdecl +#else +#define SPICE_SDK_ENTRY_POINT __declspec(dllexport) int __cdecl +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum SPICE_SDK_STATUS_CODE { + SPICE_SDK_STATUS_SUCCESS = 0, + + // 000: generic + SPICE_SDK_STATUS_GENERIC_ERROR = 1, + SPICE_SDK_STATUS_NOT_INITIALIZED = 2, + SPICE_SDK_STATUS_NOT_SUPPORTED = 3, + SPICE_SDK_STATUS_TOO_SMALL = 4, + SPICE_SDK_STATUS_TOO_LATE = 5, + + // 1000: invalid args + SPICE_SDK_STATUS_INVALID_ARGUMENT_1 = 1001, + SPICE_SDK_STATUS_INVALID_ARGUMENT_2 = 1002, + SPICE_SDK_STATUS_INVALID_ARGUMENT_3 = 1003, + SPICE_SDK_STATUS_INVALID_ARGUMENT_4 = 1004, + SPICE_SDK_STATUS_INVALID_ARGUMENT_5 = 1005, + +} SPICE_SDK_STATUS_CODE; + +typedef enum SPICE_SDK_LOG_LEVEL { + SPICE_SDK_LOG_LEVEL_MISC = 0, + SPICE_SDK_LOG_LEVEL_INFO = 1, + SPICE_SDK_LOG_LEVEL_WARNING = 2, + SPICE_SDK_LOG_LEVEL_FATAL = 3, +} SPICE_SDK_LOG_LEVEL; + +typedef struct SPICE_SDK_TOUCH_POINT { + uint32_t id; + int x; + int y; +} SPICE_SDK_TOUCH_POINT; + +typedef struct SPICE_SDK_GAME_INFO { + char name[64]; // null-terminated +} SPICE_SDK_GAME_INFO; + +typedef struct SPICE_SDK_AVS_INFO { + char model[4]; // "MDX", null-terminated + char dest; // J + char spec; // A + char rev; // A + char ext[11]; // "2025061002", null-terminated +} SPICE_SDK_AVS_INFO; + +// get_game_info (v0.1 and up) +// +// get info about the currently running game +// +// info: receives game info + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_get_game_info_func)( + SPICE_SDK_GAME_INFO *info +); + +// get_avs_info (v0.1 and up) +// +// get AVS info (model, dest, spec, rev, ext) +// +// info: receives AVS info + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_get_avs_info_func)( + SPICE_SDK_AVS_INFO *info +); + +// log (v0.1 and up) +// logs a message to the log +// writing a FATAL message will terminate spice, only use in catastrophic failure +// +// level: see log level enum +// module: short string that identifies the facility / module / submodule +// message: the message to log + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_log_func)( + SPICE_SDK_LOG_LEVEL level, + const char *module, + const char *message +); + +// get_button (v0.1 and up) +// gets the button state +// +// button_id: ID of the button; see spicesdk_io.h for named values +// pressed: (optional) is the button pressed? +// velocity: (optional) MIDI velocity of the button + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_get_button_func)( + uint32_t button_id, + bool *pressed, + float *velocity +); + +// set_button (v0.1 and up) +// sets or clears the button override +// +// make sure to hold the button long enough for the game's I/O engine to pick up +// usually, one or two frames +// +// button_id: ID of the button; see spicesdk_io.h for named values +// pressed: true to set the button override (permanently set the button to be ON until cleared), +// false to clear the override (allow user's controller to provide input again) +// velocity: MIDI velocity of the button; only valid when pressed is true +// can be between 0.0 and 1.0, inclusive + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_set_button_func)( + uint32_t button_id, + bool pressed, + float velocity +); + +// get_analog (v0.1 and up) +// gets the analog state +// +// button_id: ID of the button; see spicesdk_io.h for named values +// value: receives the state of the analog + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_get_analog_func)( + uint32_t analog_id, + float *value +); + +// set_analog (v0.1 and up) +// sets or clears the analog override +// +// analog_id: ID of the analog; see spicesdk_io.h for named values +// override_active: true to set override (gain exclusive control) +// false to clear it (allow user's controller provide input again) +// value: value of the analog; only valid when override_active is true +// can be between 0.0 and 1.0, inclusive + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_set_analog_func)( + uint32_t analog_id, + bool override_active, + float value +); + +// get_light (v0.1 and up) +// gets the last observed value of a light +// +// light_id: ID of the light; see spicesdk_io.h for named values +// value: output parameter for the light value; 0.0 to 1.0 + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_get_light_func)( + uint32_t light_id, + float *value +); + +// set_light (v0.1 and up) +// sets or clears the light override +// +// light_id: ID of the light; see spicesdk_io.h for named values +// light_value: output parameter for the light value; 0.0 to 1.0 + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_set_light_func)( + uint32_t light_id, + bool override_active, + float light_value +); + +// set_touch (v0.1 and up) +// adds or updates touch points +// +// points: array of touch points to add or update +// count: number of touch points in the array + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_set_touch_func)( + const SPICE_SDK_TOUCH_POINT *points, + uint32_t count +); + +// clear_touch (v0.1 and up) +// clears touch points (i.e., no longer being touched) +// +// ids: array of touch point IDs to clear + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_clear_touch_func)( + const uint32_t *ids, + uint32_t count +); + +// insert_card (v0.1 and up) +// simulates inserting an e-amuse card with the given ID +// +// unit: 0 for player 1, 1 for player 2 +// card_id: null-terminated string of the card ID + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_insert_card_func)( + uint8_t unit, + const char *card_id +); + +// set_keypad (v0.1 and up) +// sets keypad state +// +// make sure to hold the button long enough for the game to pick up +// 70ms is usually sufficient, except for DDR which needs 150ms +// +// unit: 0 for player 1, 1 for player 2 +// key: '0' to '9' for numbers, 'A' for 00, 'D' for decimal point, 0 or '\0' to release all keys + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_set_keypad_func)( + uint8_t unit, + char key +); + +typedef struct SPICE_SDK_V0 { + uint32_t size; + + spice_sdk_log_func *log; + + spice_sdk_get_game_info_func *get_game_info; + spice_sdk_get_avs_info_func *get_avs_info; + + spice_sdk_get_button_func *get_button; + spice_sdk_set_button_func *set_button; + + spice_sdk_get_analog_func *get_analog; + spice_sdk_set_analog_func *set_analog; + + spice_sdk_get_light_func *get_light; + spice_sdk_set_light_func *set_light; + + spice_sdk_set_touch_func *set_touch; + spice_sdk_clear_touch_func *clear_touch; + + spice_sdk_insert_card_func *insert_card; + spice_sdk_set_keypad_func *set_keypad; + +} SPICE_SDK_V0; + +typedef void (__cdecl spice_sdk_destroy_callback_func)( + void +); + +// init (v0.1 and up) +// +// version: supply 0 +// destroy_callback: supply a function pointer that will be called when spice +// is shutting down +// sdk_functions: supply a pointer to SPICE_SDK_V0; ensure size field is initialized +// to sizeof(SPICE_SDK_V0) before calling this function + +typedef SPICE_SDK_STATUS_CODE (__cdecl spice_sdk_init_func)( + uint32_t version, + spice_sdk_destroy_callback_func *destroy_callback, + void *sdk_functions +); + +typedef int (__cdecl spice_sdk_entry_point_func)( + spice_sdk_init_func *init +); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // SPICE_SDK_H diff --git a/src/spice2x/sdk/include/spicesdk_io.h b/src/spice2x/sdk/include/spicesdk_io.h new file mode 100644 index 0000000..5cba71a --- /dev/null +++ b/src/spice2x/sdk/include/spicesdk_io.h @@ -0,0 +1,1905 @@ +#pragma once +#ifndef SPICE_SDK_IO_H +#define SPICE_SDK_IO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Bishi Bashi Channel + +typedef enum SPICE_SDK_BBC_BUTTONS { + BBC_Button_Service, + BBC_Button_Test, + BBC_Button_P1_R, + BBC_Button_P1_G, + BBC_Button_P1_B, + BBC_Button_P1_DiskMinus, + BBC_Button_P1_DiskPlus, + BBC_Button_P1_DiskSlowdown, + BBC_Button_P2_R, + BBC_Button_P2_G, + BBC_Button_P2_B, + BBC_Button_P2_DiskMinus, + BBC_Button_P2_DiskPlus, + BBC_Button_P2_DiskSlowdown, + BBC_Button_P3_R, + BBC_Button_P3_G, + BBC_Button_P3_B, + BBC_Button_P3_DiskMinus, + BBC_Button_P3_DiskPlus, + BBC_Button_P3_DiskSlowdown, + BBC_Button_P4_R, + BBC_Button_P4_G, + BBC_Button_P4_B, + BBC_Button_P4_DiskMinus, + BBC_Button_P4_DiskPlus, + BBC_Button_P4_DiskSlowdown, +} SPICE_SDK_BBC_BUTTONS; + +typedef enum SPICE_SDK_BBC_ANALOGS { + BBC_Analog_P1_Disk, + BBC_Analog_P2_Disk, + BBC_Analog_P3_Disk, + BBC_Analog_P4_Disk, +} SPICE_SDK_BBC_ANALOGS; + +typedef enum SPICE_SDK_BBC_LIGHTS { + BBC_Light_P1_R, + BBC_Light_P1_B, + BBC_Light_P1_DISC_R, + BBC_Light_P1_DISC_G, + BBC_Light_P1_DISC_B, + BBC_Light_P2_R, + BBC_Light_P2_B, + BBC_Light_P2_DISC_R, + BBC_Light_P2_DISC_G, + BBC_Light_P2_DISC_B, + BBC_Light_P3_R, + BBC_Light_P3_B, + BBC_Light_P3_DISC_R, + BBC_Light_P3_DISC_G, + BBC_Light_P3_DISC_B, + BBC_Light_P4_R, + BBC_Light_P4_B, + BBC_Light_P4_DISC_R, + BBC_Light_P4_DISC_G, + BBC_Light_P4_DISC_B, + BBC_Light_IC_CARD_R, + BBC_Light_IC_CARD_G, + BBC_Light_IC_CARD_B, + BBC_Light_UNDER_LED1_R, + BBC_Light_UNDER_LED1_G, + BBC_Light_UNDER_LED1_B, + BBC_Light_UNDER_LED2_R, + BBC_Light_UNDER_LED2_G, + BBC_Light_UNDER_LED2_B, + BBC_Light_UNDER_LED3_R, + BBC_Light_UNDER_LED3_G, + BBC_Light_UNDER_LED3_B, +} SPICE_SDK_BBC_LIGHTS; + +// HELLO! Pop'n Music + +typedef enum SPICE_SDK_HELLO_POPN_BUTTONS { + HPM_Button_Service, + HPM_Button_Test, + HPM_Button_CoinMech, + HPM_Button_P1_Start, + HPM_Button_P1_1, + HPM_Button_P1_2, + HPM_Button_P1_3, + HPM_Button_P1_4, + HPM_Button_P2_Start, + HPM_Button_P2_1, + HPM_Button_P2_2, + HPM_Button_P2_3, + HPM_Button_P2_4, +} SPICE_SDK_HELLO_POPN_BUTTONS; + +typedef enum SPICE_SDK_HELLO_POPN_LIGHTS { + HPM_Light_SPEAKER_RED, + HPM_Light_SPEAKER_ORANGE, + HPM_Light_SPEAKER_BLUE, + HPM_Light_P1_START, + HPM_Light_P1_RED_P2_GREEN, + HPM_Light_P1_BLUE, + HPM_Light_P1_YELLOW, + HPM_Light_P1_GREEN, + HPM_Light_P2_START, + HPM_Light_P2_RED, + HPM_Light_P2_BLUE, + HPM_Light_P2_YELLOW, +} SPICE_SDK_HELLO_POPN_LIGHTS; + +// Beatstream + +typedef enum SPICE_SDK_BEATSTREAM_BUTTONS { + BS_Button_Service, + BS_Button_Test, + BS_Button_CoinMech, +} SPICE_SDK_BEATSTREAM_BUTTONS; + +typedef enum SPICE_SDK_BEATSTREAM_LIGHTS { + BS_Light_BottomR, + BS_Light_BottomG, + BS_Light_BottomB, + BS_Light_LeftR, + BS_Light_LeftG, + BS_Light_LeftB, + BS_Light_RightR, + BS_Light_RightG, + BS_Light_RightB, +} SPICE_SDK_BEATSTREAM_LIGHTS; + +// Dance Dance Revolution + +typedef enum SPICE_SDK_DDR_BUTTONS { + DDR_Button_SERVICE, + DDR_Button_TEST, + DDR_Button_COIN_MECH, + DDR_Button_P1_START, + DDR_Button_P1_PANEL_UP, + DDR_Button_P1_PANEL_DOWN, + DDR_Button_P1_PANEL_LEFT, + DDR_Button_P1_PANEL_RIGHT, + DDR_Button_P1_MENU_UP, + DDR_Button_P1_MENU_DOWN, + DDR_Button_P1_MENU_LEFT, + DDR_Button_P1_MENU_RIGHT, + DDR_Button_P2_START, + DDR_Button_P2_PANEL_UP, + DDR_Button_P2_PANEL_DOWN, + DDR_Button_P2_PANEL_LEFT, + DDR_Button_P2_PANEL_RIGHT, + DDR_Button_P2_MENU_UP, + DDR_Button_P2_MENU_DOWN, + DDR_Button_P2_MENU_LEFT, + DDR_Button_P2_MENU_RIGHT, +} SPICE_SDK_DDR_BUTTONS; + +typedef enum SPICE_SDK_DDR_ANALOGS { + DDR_Analog_P1_LEFT_RIGHT, + DDR_Analog_P1_UP_DOWN, + DDR_Analog_P2_LEFT_RIGHT, + DDR_Analog_P2_UP_DOWN +} SPICE_SDK_DDR_ANALOGS; + +typedef enum SPICE_SDK_DDR_LIGHTS { + DDR_Light_P1_FOOT_LEFT, + DDR_Light_P1_FOOT_UP, + DDR_Light_P1_FOOT_RIGHT, + DDR_Light_P1_FOOT_DOWN, + + DDR_Light_P2_FOOT_LEFT, + DDR_Light_P2_FOOT_UP, + DDR_Light_P2_FOOT_RIGHT, + DDR_Light_P2_FOOT_DOWN, + + DDR_Light_SPOT_RED, + DDR_Light_SPOT_BLUE, + DDR_Light_TOP_SPOT_RED, + DDR_Light_TOP_SPOT_BLUE, + + DDR_Light_P1_HALOGEN_UPPER, + DDR_Light_P1_HALOGEN_LOWER, + DDR_Light_P2_HALOGEN_UPPER, + DDR_Light_P2_HALOGEN_LOWER, + + DDR_Light_P1_BUTTON, + DDR_Light_P2_BUTTON, + DDR_Light_NEON, + + DDR_Light_HD_P1_START, + DDR_Light_HD_P1_LEFT_RIGHT, + DDR_Light_HD_P1_UP_DOWN, + + DDR_Light_HD_P2_START, + DDR_Light_HD_P2_LEFT_RIGHT, + DDR_Light_HD_P2_UP_DOWN, + + DDR_Light_HD_P1_SPEAKER_F_R, + DDR_Light_HD_P1_SPEAKER_F_G, + DDR_Light_HD_P1_SPEAKER_F_B, + DDR_Light_HD_P1_SPEAKER_W_R, + DDR_Light_HD_P1_SPEAKER_W_G, + DDR_Light_HD_P1_SPEAKER_W_B, + + DDR_Light_HD_P2_SPEAKER_F_R, + DDR_Light_HD_P2_SPEAKER_F_G, + DDR_Light_HD_P2_SPEAKER_F_B, + DDR_Light_HD_P2_SPEAKER_W_R, + DDR_Light_HD_P2_SPEAKER_W_G, + DDR_Light_HD_P2_SPEAKER_W_B, + + DDR_Light_WHITE_SPEAKER_TOP_R, + DDR_Light_WHITE_SPEAKER_TOP_G, + DDR_Light_WHITE_SPEAKER_TOP_B, + DDR_Light_WHITE_SPEAKER_BOTTOM_R, + DDR_Light_WHITE_SPEAKER_BOTTOM_G, + DDR_Light_WHITE_SPEAKER_BOTTOM_B, + DDR_Light_WHITE_WOOFER_R, + DDR_Light_WHITE_WOOFER_G, + DDR_Light_WHITE_WOOFER_B, + + DDR_Light_GOLD_P1_MENU_START, + DDR_Light_GOLD_P1_MENU_UP, + DDR_Light_GOLD_P1_MENU_DOWN, + DDR_Light_GOLD_P1_MENU_LEFT, + DDR_Light_GOLD_P1_MENU_RIGHT, + + DDR_Light_GOLD_P2_MENU_START, + DDR_Light_GOLD_P2_MENU_UP, + DDR_Light_GOLD_P2_MENU_DOWN, + DDR_Light_GOLD_P2_MENU_LEFT, + DDR_Light_GOLD_P2_MENU_RIGHT, + + DDR_Light_GOLD_TITLE_PANEL_LEFT, + DDR_Light_GOLD_TITLE_PANEL_CENTER, + DDR_Light_GOLD_TITLE_PANEL_RIGHT, + + DDR_Light_GOLD_P1_WOOFER_CORNER, + DDR_Light_GOLD_P2_WOOFER_CORNER, + + DDR_Light_GOLD_P1_CARD_UNIT_R, + DDR_Light_GOLD_P1_CARD_UNIT_G, + DDR_Light_GOLD_P1_CARD_UNIT_B, + + DDR_Light_GOLD_P2_CARD_UNIT_R, + DDR_Light_GOLD_P2_CARD_UNIT_G, + DDR_Light_GOLD_P2_CARD_UNIT_B, + + DDR_Light_GOLD_TOP_PANEL_AVG_R, + DDR_Light_GOLD_TOP_PANEL_AVG_G, + DDR_Light_GOLD_TOP_PANEL_AVG_B, + + DDR_Light_GOLD_MONITOR_SIDE_LEFT_AVG_R, + DDR_Light_GOLD_MONITOR_SIDE_LEFT_AVG_G, + DDR_Light_GOLD_MONITOR_SIDE_LEFT_AVG_B, + + DDR_Light_GOLD_MONITOR_SIDE_RIGHT_AVG_R, + DDR_Light_GOLD_MONITOR_SIDE_RIGHT_AVG_G, + DDR_Light_GOLD_MONITOR_SIDE_RIGHT_AVG_B, + + DDR_Light_GOLD_P1_FOOT_UP_AVG_R, + DDR_Light_GOLD_P1_FOOT_UP_AVG_G, + DDR_Light_GOLD_P1_FOOT_UP_AVG_B, + + DDR_Light_GOLD_P1_FOOT_DOWN_AVG_R, + DDR_Light_GOLD_P1_FOOT_DOWN_AVG_G, + DDR_Light_GOLD_P1_FOOT_DOWN_AVG_B, + + DDR_Light_GOLD_P1_FOOT_LEFT_AVG_R, + DDR_Light_GOLD_P1_FOOT_LEFT_AVG_G, + DDR_Light_GOLD_P1_FOOT_LEFT_AVG_B, + + DDR_Light_GOLD_P1_FOOT_RIGHT_AVG_R, + DDR_Light_GOLD_P1_FOOT_RIGHT_AVG_G, + DDR_Light_GOLD_P1_FOOT_RIGHT_AVG_B, + + DDR_Light_GOLD_P2_FOOT_UP_AVG_R, + DDR_Light_GOLD_P2_FOOT_UP_AVG_G, + DDR_Light_GOLD_P2_FOOT_UP_AVG_B, + + DDR_Light_GOLD_P2_FOOT_DOWN_AVG_R, + DDR_Light_GOLD_P2_FOOT_DOWN_AVG_G, + DDR_Light_GOLD_P2_FOOT_DOWN_AVG_B, + + DDR_Light_GOLD_P2_FOOT_LEFT_AVG_R, + DDR_Light_GOLD_P2_FOOT_LEFT_AVG_G, + DDR_Light_GOLD_P2_FOOT_LEFT_AVG_B, + + DDR_Light_GOLD_P2_FOOT_RIGHT_AVG_R, + DDR_Light_GOLD_P2_FOOT_RIGHT_AVG_G, + DDR_Light_GOLD_P2_FOOT_RIGHT_AVG_B, + + DDR_Light_GOLD_P1_STAGE_UP_LEFT, + DDR_Light_GOLD_P1_STAGE_UP_RIGHT, + DDR_Light_GOLD_P1_STAGE_DOWN_LEFT, + DDR_Light_GOLD_P1_STAGE_DOWN_RIGHT, + + DDR_Light_GOLD_P2_STAGE_UP_LEFT, + DDR_Light_GOLD_P2_STAGE_UP_RIGHT, + DDR_Light_GOLD_P2_STAGE_DOWN_LEFT, + DDR_Light_GOLD_P2_STAGE_DOWN_RIGHT, +} SPICE_SDK_DDR_LIGHTS; + +// Dance Evolution + +typedef enum SPICE_SDK_DANEVO_BUTTONS { + DANEVO_Button_Service, + DANEVO_Button_Test, + DANEVO_Button_P1Start, + DANEVO_Button_P1Left, + DANEVO_Button_P1Right, + DANEVO_Button_P2Start, + DANEVO_Button_P2Left, + DANEVO_Button_P2Right +} SPICE_SDK_DANEVO_BUTTONS; + +typedef enum SPICE_SDK_DANEVO_LIGHTS { + DANEVO_Light_TitleR, + DANEVO_Light_TitleG, + DANEVO_Light_TitleB, + DANEVO_Light_SideUpperLeftR, + DANEVO_Light_SideUpperLeftG, + DANEVO_Light_SideUpperLeftB, + DANEVO_Light_SideUpperRightR, + DANEVO_Light_SideUpperRightG, + DANEVO_Light_SideUpperRightB, + DANEVO_Light_P1Start, + DANEVO_Light_P1LRButton, + DANEVO_Light_P2Start, + DANEVO_Light_P2LRButton, + DANEVO_Light_SideLowerLeft1R, + DANEVO_Light_SideLowerLeft1G, + DANEVO_Light_SideLowerLeft1B, + DANEVO_Light_SideLowerLeft2R, + DANEVO_Light_SideLowerLeft2G, + DANEVO_Light_SideLowerLeft2B, + DANEVO_Light_SideLowerLeft3R, + DANEVO_Light_SideLowerLeft3G, + DANEVO_Light_SideLowerLeft3B, + DANEVO_Light_SideLowerRight1R, + DANEVO_Light_SideLowerRight1G, + DANEVO_Light_SideLowerRight1B, + DANEVO_Light_SideLowerRight2R, + DANEVO_Light_SideLowerRight2G, + DANEVO_Light_SideLowerRight2B, + DANEVO_Light_SideLowerRight3R, + DANEVO_Light_SideLowerRight3G, + DANEVO_Light_SideLowerRight3B, +} SPICE_SDK_DANEVO_LIGHTS; + +// GitaDora + +typedef enum SPICE_SDK_GITADORA_BUTTONS { + GITADORA_Button_Service, + GITADORA_Button_Test, + GITADORA_Button_Coin, + GITADORA_Button_Headphone, + GITADORA_Button_GuitarP1Start, + GITADORA_Button_GuitarP1Up, + GITADORA_Button_GuitarP1Down, + GITADORA_Button_GuitarP1Left, + GITADORA_Button_GuitarP1Right, + GITADORA_Button_GuitarP1Help, + GITADORA_Button_GuitarP1Effect1, + GITADORA_Button_GuitarP1Effect2, + GITADORA_Button_GuitarP1Effect3, + GITADORA_Button_GuitarP1EffectPedal, + GITADORA_Button_GuitarP1ButtonExtra1, + GITADORA_Button_GuitarP1ButtonExtra2, + GITADORA_Button_GuitarP1PickUp, + GITADORA_Button_GuitarP1PickDown, + GITADORA_Button_GuitarP1R, + GITADORA_Button_GuitarP1G, + GITADORA_Button_GuitarP1B, + GITADORA_Button_GuitarP1Y, + GITADORA_Button_GuitarP1P, + GITADORA_Button_GuitarP1KnobUp, + GITADORA_Button_GuitarP1KnobDown, + GITADORA_Button_GuitarP1WailUp, + GITADORA_Button_GuitarP1WailDown, + GITADORA_Button_GuitarP2Start, + GITADORA_Button_GuitarP2Up, + GITADORA_Button_GuitarP2Down, + GITADORA_Button_GuitarP2Left, + GITADORA_Button_GuitarP2Right, + GITADORA_Button_GuitarP2Help, + GITADORA_Button_GuitarP2Effect1, + GITADORA_Button_GuitarP2Effect2, + GITADORA_Button_GuitarP2Effect3, + GITADORA_Button_GuitarP2EffectPedal, + GITADORA_Button_GuitarP2ButtonExtra1, + GITADORA_Button_GuitarP2ButtonExtra2, + GITADORA_Button_GuitarP2PickUp, + GITADORA_Button_GuitarP2PickDown, + GITADORA_Button_GuitarP2R, + GITADORA_Button_GuitarP2G, + GITADORA_Button_GuitarP2B, + GITADORA_Button_GuitarP2Y, + GITADORA_Button_GuitarP2P, + GITADORA_Button_GuitarP2KnobUp, + GITADORA_Button_GuitarP2KnobDown, + GITADORA_Button_GuitarP2WailUp, + GITADORA_Button_GuitarP2WailDown, + GITADORA_Button_DrumStart, + GITADORA_Button_DrumUp, + GITADORA_Button_DrumDown, + GITADORA_Button_DrumLeft, + GITADORA_Button_DrumRight, + GITADORA_Button_DrumHelp, + GITADORA_Button_DrumButtonExtra1, + GITADORA_Button_DrumButtonExtra2, + GITADORA_Button_DrumLeftCymbal, + GITADORA_Button_DrumHiHat, + GITADORA_Button_DrumLeftPedal, + GITADORA_Button_DrumSnare, + GITADORA_Button_DrumHiTom, + GITADORA_Button_DrumBassPedal, + GITADORA_Button_DrumLowTom, + GITADORA_Button_DrumFloorTom, + GITADORA_Button_DrumRightCymbal, + GITADORA_Button_DrumHiHatClosed, + GITADORA_Button_DrumHiHatHalfOpen +} SPICE_SDK_GITADORA_BUTTONS; + +typedef enum SPICE_SDK_GITADORA_ANALOGS { + GITADORA_Analog_GuitarP1WailX, + GITADORA_Analog_GuitarP1WailY, + GITADORA_Analog_GuitarP1WailZ, + GITADORA_Analog_GuitarP1Knob, + GITADORA_Analog_GuitarP2WailX, + GITADORA_Analog_GuitarP2WailY, + GITADORA_Analog_GuitarP2WailZ, + GITADORA_Analog_GuitarP2Knob +} SPICE_SDK_GITADORA_ANALOGS; + +typedef enum SPICE_SDK_GITADORA_LIGHTS { + GITADORA_LIGHT_GuitarP1Motor, + GITADORA_LIGHT_GuitarP2Motor, + + // P1 + GITADORA_LIGHT_P1MenuStart, + // DX only + GITADORA_LIGHT_P1MenuUpDown, + GITADORA_LIGHT_P1MenuLeftRight, + GITADORA_LIGHT_P1MenuHelp, + + // P2 + GITADORA_LIGHT_P2MenuStart, + // DX only + GITADORA_LIGHT_P2MenuUpDown, + GITADORA_LIGHT_P2MenuLeftRight, + GITADORA_LIGHT_P2MenuHelp, + + // drums + GITADORA_LIGHT_DrumLeftCymbal, + GITADORA_LIGHT_DrumHiHat, + GITADORA_LIGHT_DrumSnare, + GITADORA_LIGHT_DrumHighTom, + GITADORA_LIGHT_DrumLowTom, + GITADORA_LIGHT_DrumFloorTom, + GITADORA_LIGHT_DrumRightCymbal, + + // drum woofer + GITADORA_LIGHT_DrumWooferR, + GITADORA_LIGHT_DrumWooferG, + GITADORA_LIGHT_DrumWooferB, + + // drum stage, DX only + GITADORA_LIGHT_DrumStageR, + GITADORA_LIGHT_DrumStageG, + GITADORA_LIGHT_DrumStageB, + + // main spotlights, DX only + GITADORA_LIGHT_SpotFrontLeft, + GITADORA_LIGHT_SpotFrontRight, + GITADORA_LIGHT_SpotCenterLeft, + GITADORA_LIGHT_SpotCenterRight, + + // drum rear spotlights, DX only + GITADORA_LIGHT_DrumSpotRearLeft, + GITADORA_LIGHT_DrumSpotRearRight, + + // guitar center lower RGB, DX only + GITADORA_LIGHT_GuitarLowerLeftR, + GITADORA_LIGHT_GuitarLowerLeftG, + GITADORA_LIGHT_GuitarLowerLeftB, + GITADORA_LIGHT_GuitarLowerRightR, + GITADORA_LIGHT_GuitarLowerRightG, + GITADORA_LIGHT_GuitarLowerRightB, + + // guitar left speaker, DX only + GITADORA_LIGHT_GuitarLeftSpeakerUpperR, + GITADORA_LIGHT_GuitarLeftSpeakerUpperG, + GITADORA_LIGHT_GuitarLeftSpeakerUpperB, + GITADORA_LIGHT_GuitarLeftSpeakerMidUpLeftR, + GITADORA_LIGHT_GuitarLeftSpeakerMidUpLeftG, + GITADORA_LIGHT_GuitarLeftSpeakerMidUpLeftB, + GITADORA_LIGHT_GuitarLeftSpeakerMidUpRightR, + GITADORA_LIGHT_GuitarLeftSpeakerMidUpRightG, + GITADORA_LIGHT_GuitarLeftSpeakerMidUpRightB, + GITADORA_LIGHT_GuitarLeftSpeakerMidLowLeftR, + GITADORA_LIGHT_GuitarLeftSpeakerMidLowLeftG, + GITADORA_LIGHT_GuitarLeftSpeakerMidLowLeftB, + GITADORA_LIGHT_GuitarLeftSpeakerMidLowRightR, + GITADORA_LIGHT_GuitarLeftSpeakerMidLowRightG, + GITADORA_LIGHT_GuitarLeftSpeakerMidLowRightB, + GITADORA_LIGHT_GuitarLeftSpeakerLowerR, + GITADORA_LIGHT_GuitarLeftSpeakerLowerG, + GITADORA_LIGHT_GuitarLeftSpeakerLowerB, + + // guitar right speaker, DX only + GITADORA_LIGHT_GuitarRightSpeakerUpperR, + GITADORA_LIGHT_GuitarRightSpeakerUpperG, + GITADORA_LIGHT_GuitarRightSpeakerUpperB, + GITADORA_LIGHT_GuitarRightSpeakerMidUpLeftR, + GITADORA_LIGHT_GuitarRightSpeakerMidUpLeftG, + GITADORA_LIGHT_GuitarRightSpeakerMidUpLeftB, + GITADORA_LIGHT_GuitarRightSpeakerMidUpRightR, + GITADORA_LIGHT_GuitarRightSpeakerMidUpRightG, + GITADORA_LIGHT_GuitarRightSpeakerMidUpRightB, + GITADORA_LIGHT_GuitarRightSpeakerMidLowLeftR, + GITADORA_LIGHT_GuitarRightSpeakerMidLowLeftG, + GITADORA_LIGHT_GuitarRightSpeakerMidLowLeftB, + GITADORA_LIGHT_GuitarRightSpeakerMidLowRightR, + GITADORA_LIGHT_GuitarRightSpeakerMidLowRightG, + GITADORA_LIGHT_GuitarRightSpeakerMidLowRightB, + GITADORA_LIGHT_GuitarRightSpeakerLowerR, + GITADORA_LIGHT_GuitarRightSpeakerLowerG, + GITADORA_LIGHT_GuitarRightSpeakerLowerB, + + // arena model (common for both guitar and drum) + GITADORA_LIGHT_ArenaTitleAvgR, + GITADORA_LIGHT_ArenaTitleAvgG, + GITADORA_LIGHT_ArenaTitleAvgB, + GITADORA_LIGHT_ArenaWooferR, + GITADORA_LIGHT_ArenaWooferG, + GITADORA_LIGHT_ArenaWooferB, + GITADORA_LIGHT_ArenaCardR, + GITADORA_LIGHT_ArenaCardG, + GITADORA_LIGHT_ArenaCardB, +} SPICE_SDK_GITADORA_LIGHTS; + +typedef enum SPICE_SDK_IIDX_BUTTONS { + IIDX_Button_Service, + IIDX_Button_Test, + IIDX_Button_CoinMech, + IIDX_Button_P1_1, + IIDX_Button_P1_2, + IIDX_Button_P1_3, + IIDX_Button_P1_4, + IIDX_Button_P1_5, + IIDX_Button_P1_6, + IIDX_Button_P1_7, + IIDX_Button_P1_TTPlus, + IIDX_Button_P1_TTMinus, + IIDX_Button_P1_TTPlusMinus, + IIDX_Button_P1_TTPlusMinusAlt, + IIDX_Button_P1_Start, + IIDX_Button_P2_1, + IIDX_Button_P2_2, + IIDX_Button_P2_3, + IIDX_Button_P2_4, + IIDX_Button_P2_5, + IIDX_Button_P2_6, + IIDX_Button_P2_7, + IIDX_Button_P2_TTPlus, + IIDX_Button_P2_TTMinus, + IIDX_Button_P2_TTPlusMinus, + IIDX_Button_P2_TTPlusMinusAlt, + IIDX_Button_P2_Start, + IIDX_Button_Effect, + IIDX_Button_VEFX, + IIDX_Button_P1_Headphone, + IIDX_Button_P2_Headphone, +} SPICE_SDK_IIDX_BUTTONS; + +typedef enum SPICE_SDK_IIDX_ANALOGS { + IIDX_Analog_TT_P1, + IIDX_Analog_TT_P2, + IIDX_Analog_VEFX, + IIDX_Analog_LowEQ, + IIDX_Analog_HiEQ, + IIDX_Analog_Filter, + IIDX_Analog_PlayVolume +} SPICE_SDK_IIDX_ANALOGS; + +typedef enum SPICE_SDK_IIDX_LIGHTS { + IIDX_Light_P1_1, + IIDX_Light_P1_2, + IIDX_Light_P1_3, + IIDX_Light_P1_4, + IIDX_Light_P1_5, + IIDX_Light_P1_6, + IIDX_Light_P1_7, + IIDX_Light_P2_1, + IIDX_Light_P2_2, + IIDX_Light_P2_3, + IIDX_Light_P2_4, + IIDX_Light_P2_5, + IIDX_Light_P2_6, + IIDX_Light_P2_7, + IIDX_Light_P1_Start, + IIDX_Light_P2_Start, + IIDX_Light_VEFX, + IIDX_Light_Effect, + IIDX_Light_SpotLight1, + IIDX_Light_SpotLight2, + IIDX_Light_SpotLight3, + IIDX_Light_SpotLight4, + IIDX_Light_SpotLight5, + IIDX_Light_SpotLight6, + IIDX_Light_SpotLight7, + IIDX_Light_SpotLight8, + IIDX_Light_NeonLamp, + IIDX_Light_WooferR, + IIDX_Light_WooferG, + IIDX_Light_WooferB, + IIDX_Light_ICCR_P1_R, + IIDX_Light_ICCR_P1_G, + IIDX_Light_ICCR_P1_B, + IIDX_Light_ICCR_P2_R, + IIDX_Light_ICCR_P2_G, + IIDX_Light_ICCR_P2_B, + IIDX_Light_TT_P1_R, + IIDX_Light_TT_P1_G, + IIDX_Light_TT_P1_B, + IIDX_Light_TT_P2_R, + IIDX_Light_TT_P2_G, + IIDX_Light_TT_P2_B, + IIDX_Light_TT_P1_Resistance, + IIDX_Light_TT_P2_Resistance, + IIDX_Light_StageLeftAvgR, + IIDX_Light_StageLeftAvgG, + IIDX_Light_StageLeftAvgB, + IIDX_Light_StageRightAvgR, + IIDX_Light_StageRightAvgG, + IIDX_Light_StageRightAvgB, + IIDX_Light_CabinetLeftAvgR, + IIDX_Light_CabinetLeftAvgG, + IIDX_Light_CabinetLeftAvgB, + IIDX_Light_CabinetRightAvgR, + IIDX_Light_CabinetRightAvgG, + IIDX_Light_CabinetRightAvgB, + IIDX_Light_ControlPanelUnderAvgR, + IIDX_Light_ControlPanelUnderAvgG, + IIDX_Light_ControlPanelUnderAvgB, + IIDX_Light_CeilingLeftAvgR, + IIDX_Light_CeilingLeftAvgG, + IIDX_Light_CeilingLeftAvgB, + IIDX_Light_TitleLeftAvgR, + IIDX_Light_TitleLeftAvgG, + IIDX_Light_TitleLeftAvgB, + IIDX_Light_TitleRightAvgR, + IIDX_Light_TitleRightAvgG, + IIDX_Light_TitleRightAvgB, + IIDX_Light_CeilingRightAvgR, + IIDX_Light_CeilingRightAvgG, + IIDX_Light_CeilingRightAvgB, + IIDX_Light_TouchPanelLeftAvgR, + IIDX_Light_TouchPanelLeftAvgG, + IIDX_Light_TouchPanelLeftAvgB, + IIDX_Light_TouchPanelRightAvgR, + IIDX_Light_TouchPanelRightAvgG, + IIDX_Light_TouchPanelRightAvgB, + IIDX_Light_SidePanelLeftInnerAvgR, + IIDX_Light_SidePanelLeftInnerAvgG, + IIDX_Light_SidePanelLeftInnerAvgB, + IIDX_Light_SidePanelLeftOuterAvgR, + IIDX_Light_SidePanelLeftOuterAvgG, + IIDX_Light_SidePanelLeftOuterAvgB, + IIDX_Light_SidePanelLeftAvgR, + IIDX_Light_SidePanelLeftAvgG, + IIDX_Light_SidePanelLeftAvgB, + IIDX_Light_SidePanelRightOuterAvgR, + IIDX_Light_SidePanelRightOuterAvgG, + IIDX_Light_SidePanelRightOuterAvgB, + IIDX_Light_SidePanelRightInnerAvgR, + IIDX_Light_SidePanelRightInnerAvgG, + IIDX_Light_SidePanelRightInnerAvgB, + IIDX_Light_SidePanelRightAvgR, + IIDX_Light_SidePanelRightAvgG, + IIDX_Light_SidePanelRightAvgB, +} SPICE_SDK_IIDX_LIGHTS; + +typedef enum SPICE_SDK_JUBEAT_BUTTONS { + JB_Button_Service, + JB_Button_Test, + JB_Button_CoinMech, + JB_Button_Button1, + JB_Button_Button2, + JB_Button_Button3, + JB_Button_Button4, + JB_Button_Button5, + JB_Button_Button6, + JB_Button_Button7, + JB_Button_Button8, + JB_Button_Button9, + JB_Button_Button10, + JB_Button_Button11, + JB_Button_Button12, + JB_Button_Button13, + JB_Button_Button14, + JB_Button_Button15, + JB_Button_Button16, +} SPICE_SDK_JUBEAT_BUTTONS; + +typedef enum SPICE_SDK_JUBEAT_LIGHTS { + JB_Light_PANEL_FRONT_R, + JB_Light_PANEL_FRONT_G, + JB_Light_PANEL_FRONT_B, + JB_Light_PANEL_TITLE_R, + JB_Light_PANEL_TITLE_G, + JB_Light_PANEL_TITLE_B, + JB_Light_PANEL_TOP_R, + JB_Light_PANEL_TOP_G, + JB_Light_PANEL_TOP_B, + JB_Light_PANEL_LEFT_R, + JB_Light_PANEL_LEFT_G, + JB_Light_PANEL_LEFT_B, + JB_Light_PANEL_RIGHT_R, + JB_Light_PANEL_RIGHT_G, + JB_Light_PANEL_RIGHT_B, + JB_Light_PANEL_WOOFER_R, + JB_Light_PANEL_WOOFER_G, + JB_Light_PANEL_WOOFER_B, +} SPICE_SDK_JUBEAT_LIGHTS; + + +// Metal Gear + +typedef enum SPICE_SDK_METAL_GEAR_BUTTONS { + MGA_Button_Service, + MGA_Button_Test, + MGA_Button_CoinMech, + MGA_Button_Start, + MGA_Button_Top, + MGA_Button_FrontTop, + MGA_Button_FrontBottom, + MGA_Button_SideLeft, + MGA_Button_SideRight, + MGA_Button_SideLever, + MGA_Button_TriggerButton, + MGA_Button_SwitchButton, + MGA_Button_JoyForwards, + MGA_Button_JoyBackwards, + MGA_Button_JoyLeft, + MGA_Button_JoyRight, +} SPICE_SDK_METAL_GEAR_BUTTONS; + +typedef enum SPICE_SDK_METAL_GEAR_ANALOGS { + MGA_Analog_JoyX, + MGA_Analog_JoyY, +} SPICE_SDK_METAL_GEAR_ANALOGS; + +typedef enum SPICE_SDK_METAL_GEAR_LIGHTS { + MGA_Light_Start, + MGA_Light_LeftR, + MGA_Light_LeftG, + MGA_Light_LeftB, + MGA_Light_RightR, + MGA_Light_RightG, + MGA_Light_RightB, + MGA_Light_GunR, + MGA_Light_GunG, + MGA_Light_GunB, + MGA_Light_GunVibration, +} SPICE_SDK_METAL_GEAR_LIGHTS; + +// Museca + +typedef enum SPICE_SDK_MUSECA_BUTTONS { + MUSECA_Button_Service, + MUSECA_Button_Test, + MUSECA_Button_Start, + MUSECA_Button_Disk1Minus, + MUSECA_Button_Disk1Plus, + MUSECA_Button_Disk1Press, + MUSECA_Button_Disk2Minus, + MUSECA_Button_Disk2Plus, + MUSECA_Button_Disk2Press, + MUSECA_Button_Disk3Minus, + MUSECA_Button_Disk3Plus, + MUSECA_Button_Disk3Press, + MUSECA_Button_Disk4Minus, + MUSECA_Button_Disk4Plus, + MUSECA_Button_Disk4Press, + MUSECA_Button_Disk5Minus, + MUSECA_Button_Disk5Plus, + MUSECA_Button_Disk5Press, + MUSECA_Button_FootPedal, + MUSECA_Button_AnalogSlowdown, +} SPICE_SDK_MUSECA_BUTTONS; + +typedef enum SPICE_SDK_MUSECA_ANALOGS { + MUSECA_Analog_Disk1, + MUSECA_Analog_Disk2, + MUSECA_Analog_Disk3, + MUSECA_Analog_Disk4, + MUSECA_Analog_Disk5, +} SPICE_SDK_MUSECA_ANALOGS; + +typedef enum SPICE_SDK_MUSECA_LIGHTS { + MUSECA_Light_Start, + MUSECA_Light_Keypad, + MUSECA_Light_TitleR, + MUSECA_Light_TitleG, + MUSECA_Light_TitleB, + MUSECA_Light_SideR, + MUSECA_Light_SideG, + MUSECA_Light_SideB, + MUSECA_Light_Spinner1R, + MUSECA_Light_Spinner1G, + MUSECA_Light_Spinner1B, + MUSECA_Light_Spinner2R, + MUSECA_Light_Spinner2G, + MUSECA_Light_Spinner2B, + MUSECA_Light_Spinner3R, + MUSECA_Light_Spinner3G, + MUSECA_Light_Spinner3B, + MUSECA_Light_Spinner4R, + MUSECA_Light_Spinner4G, + MUSECA_Light_Spinner4B, + MUSECA_Light_Spinner5R, + MUSECA_Light_Spinner5G, + MUSECA_Light_Spinner5B, + MUSECA_Light_UnderLED1R, + MUSECA_Light_UnderLED1G, + MUSECA_Light_UnderLED1B, + MUSECA_Light_UnderLED2R, + MUSECA_Light_UnderLED2G, + MUSECA_Light_UnderLED2B, + MUSECA_Light_UnderLED3R, + MUSECA_Light_UnderLED3G, + MUSECA_Light_UnderLED3B, +} SPICE_SDK_MUSECA_LIGHTS; + +// Nostalgia + +typedef enum SPICE_SDK_NOSTALGIA_BUTTONS { + NOST_Button_Service, + NOST_Button_Test, + NOST_Button_CoinMech, + NOST_Button_Key1, + NOST_Button_Key2, + NOST_Button_Key3, + NOST_Button_Key4, + NOST_Button_Key5, + NOST_Button_Key6, + NOST_Button_Key7, + NOST_Button_Key8, + NOST_Button_Key9, + NOST_Button_Key10, + NOST_Button_Key11, + NOST_Button_Key12, + NOST_Button_Key13, + NOST_Button_Key14, + NOST_Button_Key15, + NOST_Button_Key16, + NOST_Button_Key17, + NOST_Button_Key18, + NOST_Button_Key19, + NOST_Button_Key20, + NOST_Button_Key21, + NOST_Button_Key22, + NOST_Button_Key23, + NOST_Button_Key24, + NOST_Button_Key25, + NOST_Button_Key26, + NOST_Button_Key27, + NOST_Button_Key28, + NOST_Button_Key1Soft, + NOST_Button_Key2Soft, + NOST_Button_Key3Soft, + NOST_Button_Key4Soft, + NOST_Button_Key5Soft, + NOST_Button_Key6Soft, + NOST_Button_Key7Soft, + NOST_Button_Key8Soft, + NOST_Button_Key9Soft, + NOST_Button_Key10Soft, + NOST_Button_Key11Soft, + NOST_Button_Key12Soft, + NOST_Button_Key13Soft, + NOST_Button_Key14Soft, + NOST_Button_Key15Soft, + NOST_Button_Key16Soft, + NOST_Button_Key17Soft, + NOST_Button_Key18Soft, + NOST_Button_Key19Soft, + NOST_Button_Key20Soft, + NOST_Button_Key21Soft, + NOST_Button_Key22Soft, + NOST_Button_Key23Soft, + NOST_Button_Key24Soft, + NOST_Button_Key25Soft, + NOST_Button_Key26Soft, + NOST_Button_Key27Soft, + NOST_Button_Key28Soft, + NOST_Button_Key1Medium, + NOST_Button_Key2Medium, + NOST_Button_Key3Medium, + NOST_Button_Key4Medium, + NOST_Button_Key5Medium, + NOST_Button_Key6Medium, + NOST_Button_Key7Medium, + NOST_Button_Key8Medium, + NOST_Button_Key9Medium, + NOST_Button_Key10Medium, + NOST_Button_Key11Medium, + NOST_Button_Key12Medium, + NOST_Button_Key13Medium, + NOST_Button_Key14Medium, + NOST_Button_Key15Medium, + NOST_Button_Key16Medium, + NOST_Button_Key17Medium, + NOST_Button_Key18Medium, + NOST_Button_Key19Medium, + NOST_Button_Key20Medium, + NOST_Button_Key21Medium, + NOST_Button_Key22Medium, + NOST_Button_Key23Medium, + NOST_Button_Key24Medium, + NOST_Button_Key25Medium, + NOST_Button_Key26Medium, + NOST_Button_Key27Medium, + NOST_Button_Key28Medium, + NOST_Button_Key1Hard, + NOST_Button_Key2Hard, + NOST_Button_Key3Hard, + NOST_Button_Key4Hard, + NOST_Button_Key5Hard, + NOST_Button_Key6Hard, + NOST_Button_Key7Hard, + NOST_Button_Key8Hard, + NOST_Button_Key9Hard, + NOST_Button_Key10Hard, + NOST_Button_Key11Hard, + NOST_Button_Key12Hard, + NOST_Button_Key13Hard, + NOST_Button_Key14Hard, + NOST_Button_Key15Hard, + NOST_Button_Key16Hard, + NOST_Button_Key17Hard, + NOST_Button_Key18Hard, + NOST_Button_Key19Hard, + NOST_Button_Key20Hard, + NOST_Button_Key21Hard, + NOST_Button_Key22Hard, + NOST_Button_Key23Hard, + NOST_Button_Key24Hard, + NOST_Button_Key25Hard, + NOST_Button_Key26Hard, + NOST_Button_Key27Hard, + NOST_Button_Key28Hard, + NOST_Button_PokeNextPage, + NOST_Button_PokePrevPage, + NOST_Button_PokeConfirm, + NOST_Button_PokeBack, + NOST_Button_PokeSong1, + NOST_Button_PokeSong2, + NOST_Button_PokeSong3, + NOST_Button_PokeSong4, + NOST_Button_PokeSong5, + NOST_Button_PokeSong6, + NOST_Button_PokeDifficulty1, + NOST_Button_PokeDifficulty2, + NOST_Button_PokeDifficulty3, + NOST_Button_PokeDifficulty4, +} SPICE_SDK_NOSTALGIA_BUTTONS; + +typedef enum SPICE_SDK_NOSTALGIA_ANALOGS { + NOST_Analog_Key1, + NOST_Analog_Key2, + NOST_Analog_Key3, + NOST_Analog_Key4, + NOST_Analog_Key5, + NOST_Analog_Key6, + NOST_Analog_Key7, + NOST_Analog_Key8, + NOST_Analog_Key9, + NOST_Analog_Key10, + NOST_Analog_Key11, + NOST_Analog_Key12, + NOST_Analog_Key13, + NOST_Analog_Key14, + NOST_Analog_Key15, + NOST_Analog_Key16, + NOST_Analog_Key17, + NOST_Analog_Key18, + NOST_Analog_Key19, + NOST_Analog_Key20, + NOST_Analog_Key21, + NOST_Analog_Key22, + NOST_Analog_Key23, + NOST_Analog_Key24, + NOST_Analog_Key25, + NOST_Analog_Key26, + NOST_Analog_Key27, + NOST_Analog_Key28, +} SPICE_SDK_NOSTALGIA_ANALOGS; + +typedef enum SPICE_SDK_NOSTALGIA_LIGHTS { + NOST_Light_TitleR, + NOST_Light_TitleG, + NOST_Light_TitleB, + NOST_Light_BottomR, + NOST_Light_BottomG, + NOST_Light_BottomB, + NOST_Light_Key1R, + NOST_Light_Key1G, + NOST_Light_Key1B, + NOST_Light_Key2R, + NOST_Light_Key2G, + NOST_Light_Key2B, + NOST_Light_Key3R, + NOST_Light_Key3G, + NOST_Light_Key3B, + NOST_Light_Key4R, + NOST_Light_Key4G, + NOST_Light_Key4B, + NOST_Light_Key5R, + NOST_Light_Key5G, + NOST_Light_Key5B, + NOST_Light_Key6R, + NOST_Light_Key6G, + NOST_Light_Key6B, + NOST_Light_Key7R, + NOST_Light_Key7G, + NOST_Light_Key7B, + NOST_Light_Key8R, + NOST_Light_Key8G, + NOST_Light_Key8B, + NOST_Light_Key9R, + NOST_Light_Key9G, + NOST_Light_Key9B, + NOST_Light_Key10R, + NOST_Light_Key10G, + NOST_Light_Key10B, + NOST_Light_Key11R, + NOST_Light_Key11G, + NOST_Light_Key11B, + NOST_Light_Key12R, + NOST_Light_Key12G, + NOST_Light_Key12B, + NOST_Light_Key13R, + NOST_Light_Key13G, + NOST_Light_Key13B, + NOST_Light_Key14R, + NOST_Light_Key14G, + NOST_Light_Key14B, + NOST_Light_Key15R, + NOST_Light_Key15G, + NOST_Light_Key15B, + NOST_Light_Key16R, + NOST_Light_Key16G, + NOST_Light_Key16B, + NOST_Light_Key17R, + NOST_Light_Key17G, + NOST_Light_Key17B, + NOST_Light_Key18R, + NOST_Light_Key18G, + NOST_Light_Key18B, + NOST_Light_Key19R, + NOST_Light_Key19G, + NOST_Light_Key19B, + NOST_Light_Key20R, + NOST_Light_Key20G, + NOST_Light_Key20B, + NOST_Light_Key21R, + NOST_Light_Key21G, + NOST_Light_Key21B, + NOST_Light_Key22R, + NOST_Light_Key22G, + NOST_Light_Key22B, + NOST_Light_Key23R, + NOST_Light_Key23G, + NOST_Light_Key23B, + NOST_Light_Key24R, + NOST_Light_Key24G, + NOST_Light_Key24B, + NOST_Light_Key25R, + NOST_Light_Key25G, + NOST_Light_Key25B, + NOST_Light_Key26R, + NOST_Light_Key26G, + NOST_Light_Key26B, + NOST_Light_Key27R, + NOST_Light_Key27G, + NOST_Light_Key27B, + NOST_Light_Key28R, + NOST_Light_Key28G, + NOST_Light_Key28B, +} SPICE_SDK_NOSTALGIA_LIGHTS; + +// Pop'n Music + +typedef enum SPICE_SDK_POPN_BUTTONS { + POPN_Button_Service, + POPN_Button_Test, + POPN_Button_CoinMech, + POPN_Button_Headphone, + POPN_Button_Button1, + POPN_Button_Button2, + POPN_Button_Button3, + POPN_Button_Button4, + POPN_Button_Button5, + POPN_Button_Button6, + POPN_Button_Button7, + POPN_Button_Button8, + POPN_Button_Button9, + POPN_Button_RedPop, + POPN_Button_BluePop, +} SPICE_SDK_POPN_BUTTONS; + +typedef enum SPICE_SDK_POPN_LIGHTS { + POPN_Light_Button1, + POPN_Light_Button2, + POPN_Light_Button3, + POPN_Light_Button4, + POPN_Light_Button5, + POPN_Light_Button6, + POPN_Light_Button7, + POPN_Light_Button8, + POPN_Light_Button9, + POPN_Light_HiLamp1, + POPN_Light_HiLamp2, + POPN_Light_HiLamp3, + POPN_Light_HiLamp4, + POPN_Light_HiLamp5, + POPN_Light_LeftLamp1, + POPN_Light_LeftLamp2, + POPN_Light_RightLamp1, + POPN_Light_RightLamp2, + POPN_Light_TopLED1, + POPN_Light_TopLED2, + POPN_Light_TopLED3, + POPN_Light_TopLED4, + POPN_Light_TopLED5, + POPN_Light_TopLED6, + POPN_Light_TopLED7, + POPN_Light_TopLED8, + POPN_Light_TopLED9, + POPN_Light_TopLED10, + POPN_Light_TopLED11, + POPN_Light_TopLED12, + POPN_Light_TopLED13, + POPN_Light_TopLED14, + POPN_Light_TopLED15, + POPN_Light_TopLED16, + POPN_Light_TopLED17, + POPN_Light_TopLED18, + POPN_Light_TopLED19, + POPN_Light_TopLED20, + POPN_Light_TopLED21, + POPN_Light_TopLED22, + POPN_Light_TopLED23, + POPN_Light_TopLED24, + POPN_Light_TopLED25, + POPN_Light_TopLED26, + POPN_Light_TopLED27, + POPN_Light_TopLED28, + POPN_Light_TopLED29, + POPN_Light_TopLED30, + POPN_Light_TopLED31, + POPN_Light_TopLED32, + POPN_Light_TopLED_R, + POPN_Light_TopLED_G, + POPN_Light_TopLED_B, + POPN_Light_WooferLED_R, + POPN_Light_WooferLED_G, + POPN_Light_WooferLED_B, + POPN_Light_PikaButton1_R, + POPN_Light_PikaButton1_G, + POPN_Light_PikaButton1_B, + POPN_Light_PikaButton2_R, + POPN_Light_PikaButton2_G, + POPN_Light_PikaButton2_B, + POPN_Light_PikaButton3_R, + POPN_Light_PikaButton3_G, + POPN_Light_PikaButton3_B, + POPN_Light_PikaButton4_R, + POPN_Light_PikaButton4_G, + POPN_Light_PikaButton4_B, + POPN_Light_PikaButton5_R, + POPN_Light_PikaButton5_G, + POPN_Light_PikaButton5_B, + POPN_Light_PikaButton6_R, + POPN_Light_PikaButton6_G, + POPN_Light_PikaButton6_B, + POPN_Light_PikaButton7_R, + POPN_Light_PikaButton7_G, + POPN_Light_PikaButton7_B, + POPN_Light_PikaButton8_R, + POPN_Light_PikaButton8_G, + POPN_Light_PikaButton8_B, + POPN_Light_PikaButton9_R, + POPN_Light_PikaButton9_G, + POPN_Light_PikaButton9_B, + POPN_Light_RedPopKun_R, + POPN_Light_RedPopKun_G, + POPN_Light_RedPopKun_B, + POPN_Light_BluePopKun_R, + POPN_Light_BluePopKun_G, + POPN_Light_BluePopKun_B, + POPN_Light_IC_Card_R, + POPN_Light_IC_Card_G, + POPN_Light_IC_Card_B, + POPN_Light_Speaker_R, + POPN_Light_Speaker_G, + POPN_Light_Speaker_B, + POPN_Light_Monitor_R, + POPN_Light_Monitor_G, + POPN_Light_Monitor_B, + POPN_Light_ControlPanel_R, + POPN_Light_ControlPanel_G, + POPN_Light_ControlPanel_B, + POPN_Light_Cabinet_R, + POPN_Light_Cabinet_G, + POPN_Light_Cabinet_B, +} SPICE_SDK_POPN_LIGHTS; + +// Quiz Magic Academy + +typedef enum SPICE_SDK_QMA_BUTTONS { + QMA_Button_Service, + QMA_Button_Test, + QMA_Button_Select, + QMA_Button_CoinMech, + QMA_Button_Select1, + QMA_Button_Select2, + QMA_Button_Left, + QMA_Button_Right, + QMA_Button_OK, + QMA_Button_TouchKey1, + QMA_Button_TouchKey2, + QMA_Button_TouchKey3, + QMA_Button_TouchKey4, + QMA_Button_TouchKey5, + QMA_Button_TouchKey6, + QMA_Button_TouchKey7, + QMA_Button_TouchKey8, + QMA_Button_TouchKey9, + QMA_Button_TouchKey0, + QMA_Button_TouchKeyDash, + QMA_Button_TouchKeyQ, + QMA_Button_TouchKeyW, + QMA_Button_TouchKeyE, + QMA_Button_TouchKeyR, + QMA_Button_TouchKeyT, + QMA_Button_TouchKeyY, + QMA_Button_TouchKeyU, + QMA_Button_TouchKeyI, + QMA_Button_TouchKeyO, + QMA_Button_TouchKeyP, + QMA_Button_TouchKeyA, + QMA_Button_TouchKeyS, + QMA_Button_TouchKeyD, + QMA_Button_TouchKeyF, + QMA_Button_TouchKeyG, + QMA_Button_TouchKeyH, + QMA_Button_TouchKeyJ, + QMA_Button_TouchKeyK, + QMA_Button_TouchKeyL, + QMA_Button_TouchKeyZ, + QMA_Button_TouchKeyX, + QMA_Button_TouchKeyC, + QMA_Button_TouchKeyV, + QMA_Button_TouchKeyB, + QMA_Button_TouchKeyN, + QMA_Button_TouchKeyM, + QMA_Button_TouchKeyBackspace, + QMA_Button_TouchKeyEnter, +} SPICE_SDK_QMA_BUTTONS; + +typedef enum SPICE_SDK_QMA_LIGHTS { + QMA_Light_LampRed, + QMA_Light_LampGreen, + QMA_Light_LampBlue, + QMA_Light_ButtonLeft, + QMA_Light_ButtonRight, + QMA_Light_ButtonOK, +} SPICE_SDK_QMA_LIGHTS; + +// Reflec Beat + +typedef enum SPICE_SDK_RB_BUTTONS { + RB_Button_Service, + RB_Button_Test, +} SPICE_SDK_RB_BUTTONS; + +typedef enum SPICE_SDK_RB_LIGHTS { + RB_Light_PoleR, + RB_Light_PoleG, + RB_Light_PoleB, + RB_Light_EscutcheonR, + RB_Light_EscutcheonG, + RB_Light_EscutcheonB, + RB_Light_WooferR, + RB_Light_WooferG, + RB_Light_WooferB, + RB_Light_TitleR, + RB_Light_TitleG, + RB_Light_TitleB, + RB_Light_TitleUpR, + RB_Light_TitleUpG, + RB_Light_TitleUpB, +} SPICE_SDK_RB_LIGHTS; + +// Tenkaichi Shogikai + +typedef enum SPICE_SDK_SHOGIKAI_BUTTONS { + SHOGIKAI_Button_Service, + SHOGIKAI_Button_Test, + SHOGIKAI_Button_CoinMech, + SHOGIKAI_Button_Select, +} SPICE_SDK_SHOGIKAI_BUTTONS; + +typedef enum SPICE_SDK_SHOGIKAI_LIGHTS { + SHOGIKAI_Light_Left, + SHOGIKAI_Light_Right, +} SPICE_SDK_SHOGIKAI_LIGHTS; + +// Road Fighters 3D + +typedef enum SPICE_SDK_RF3D_BUTTONS { + RF3D_Button_Service, + RF3D_Button_Test, + RF3D_Button_CoinMech, + RF3D_Button_View, + RF3D_Button_Toggle2D3D, + RF3D_Button_LeverUp, + RF3D_Button_LeverDown, + RF3D_Button_LeverLeft, + RF3D_Button_LeverRight, + RF3D_Button_WheelLeft, + RF3D_Button_WheelRight, + RF3D_Button_Accelerate, + RF3D_Button_Brake, + RF3D_Button_AutoLeverDown, + RF3D_Button_AutoLeverUp, +} SPICE_SDK_RF3D_BUTTONS; + +typedef enum SPICE_SDK_RF3D_ANALOGS { + RF3D_Analog_Wheel, + RF3D_Analog_Accelerate, + RF3D_Analog_Brake, +} SPICE_SDK_RF3D_ANALOGS; + +// Steel Chronicle + +typedef enum SPICE_SDK_STEEL_CHRONICLE_BUTTONS { + SC_Button_Service, + SC_Button_Test, + SC_Button_CoinMech, + SC_Button_L1, + SC_Button_L2, + SC_Button_LButton, + SC_Button_R1, + SC_Button_R2, + SC_Button_RButton, + SC_Button_JogLeft, + SC_Button_JogRight, +} SPICE_SDK_STEEL_CHRONICLE_BUTTONS; + +typedef enum SPICE_SDK_STEEL_CHRONICLE_ANALOGS { + SC_Analog_LEFT_X, + SC_Analog_LEFT_Y, + SC_Analog_RIGHT_X, + SC_Analog_RIGHT_Y, +} SPICE_SDK_STEEL_CHRONICLE_ANALOGS; + +typedef enum SPICE_SDK_STEEL_CHRONICLE_LIGHTS { + SC_Light_CenterRed, + SC_Light_CenterGreen, + SC_Light_CenterBlue, + SC_Light_SideRed, + SC_Light_SideGreen, + SC_Light_SideBlue, + SC_Light_ControllerRed, + SC_Light_ControllerBlue, +} SPICE_SDK_STEEL_CHRONICLE_LIGHTS; + +// Sound Voltex + +typedef enum SPICE_SDK_SDVX_BUTTONS { + SDVX_Button_Service, + SDVX_Button_Test, + SDVX_Button_CoinMech, + SDVX_Button_BT_A, + SDVX_Button_BT_B, + SDVX_Button_BT_C, + SDVX_Button_BT_D, + SDVX_Button_FX_L, + SDVX_Button_FX_R, + SDVX_Button_Start, + SDVX_Button_VOL_L_Left, + SDVX_Button_VOL_L_Right, + SDVX_Button_VOL_R_Left, + SDVX_Button_VOL_R_Right, + SDVX_Button_Headphone, +} SPICE_SDK_SDVX_BUTTONS; + +typedef enum SPICE_SDK_SDVX_ANALOGS { + SDVX_Analog_VOL_L, + SDVX_Analog_VOL_R, +} SPICE_SDK_SDVX_ANALOGS; + +typedef enum SPICE_SDK_SDVX_LIGHTS { + SDVX_Light_BT_A, + SDVX_Light_BT_B, + SDVX_Light_BT_C, + SDVX_Light_BT_D, + SDVX_Light_FX_L, + SDVX_Light_FX_R, + SDVX_Light_START, + SDVX_Light_WING_LEFT_UP_R, + SDVX_Light_WING_LEFT_UP_G, + SDVX_Light_WING_LEFT_UP_B, + SDVX_Light_WING_RIGHT_UP_R, + SDVX_Light_WING_RIGHT_UP_G, + SDVX_Light_WING_RIGHT_UP_B, + SDVX_Light_WING_LEFT_LOW_R, + SDVX_Light_WING_LEFT_LOW_G, + SDVX_Light_WING_LEFT_LOW_B, + SDVX_Light_WING_RIGHT_LOW_R, + SDVX_Light_WING_RIGHT_LOW_G, + SDVX_Light_WING_RIGHT_LOW_B, + SDVX_Light_WOOFER_R, + SDVX_Light_WOOFER_G, + SDVX_Light_WOOFER_B, + SDVX_Light_CONTROLLER_R, + SDVX_Light_CONTROLLER_G, + SDVX_Light_CONTROLLER_B, + SDVX_Light_GENERATOR_R, + SDVX_Light_GENERATOR_G, + SDVX_Light_GENERATOR_B, + SDVX_Light_POP, + SDVX_Light_TITLE_LEFT, + SDVX_Light_TITLE_RIGHT, + SDVX_Light_VOLUME_SOUND, + SDVX_Light_VOLUME_HEADPHONE, + SDVX_Light_VOLUME_EXTERNAL, + SDVX_Light_VOLUME_WOOFER, + SDVX_Light_ICCR_R, + SDVX_Light_ICCR_G, + SDVX_Light_ICCR_B, + SDVX_Light_TITLE_AVG_R, + SDVX_Light_TITLE_AVG_G, + SDVX_Light_TITLE_AVG_B, + SDVX_Light_UPPER_LEFT_SPEAKER_AVG_R, + SDVX_Light_UPPER_LEFT_SPEAKER_AVG_G, + SDVX_Light_UPPER_LEFT_SPEAKER_AVG_B, + SDVX_Light_UPPER_RIGHT_SPEAKER_AVG_R, + SDVX_Light_UPPER_RIGHT_SPEAKER_AVG_G, + SDVX_Light_UPPER_RIGHT_SPEAKER_AVG_B, + SDVX_Light_LEFT_WING_AVG_R, + SDVX_Light_LEFT_WING_AVG_G, + SDVX_Light_LEFT_WING_AVG_B, + SDVX_Light_RIGHT_WING_AVG_R, + SDVX_Light_RIGHT_WING_AVG_G, + SDVX_Light_RIGHT_WING_AVG_B, + SDVX_Light_LOWER_LEFT_SPEAKER_AVG_R, + SDVX_Light_LOWER_LEFT_SPEAKER_AVG_G, + SDVX_Light_LOWER_LEFT_SPEAKER_AVG_B, + SDVX_Light_LOWER_RIGHT_SPEAKER_AVG_R, + SDVX_Light_LOWER_RIGHT_SPEAKER_AVG_G, + SDVX_Light_LOWER_RIGHT_SPEAKER_AVG_B, + SDVX_Light_CONTROL_PANEL_AVG_R, + SDVX_Light_CONTROL_PANEL_AVG_G, + SDVX_Light_CONTROL_PANEL_AVG_B, + SDVX_Light_WOOFER_AVG_R, + SDVX_Light_WOOFER_AVG_G, + SDVX_Light_WOOFER_AVG_B, + SDVX_Light_V_UNIT_AVG_R, + SDVX_Light_V_UNIT_AVG_G, + SDVX_Light_V_UNIT_AVG_B, +} SPICE_SDK_SDVX_LIGHTS; + +// Mahjong Fight Club + +typedef enum SPICE_SDK_MFC_BUTTONS { + MFC_Button_Select, + MFC_Button_Service, + MFC_Button_Test, + MFC_Button_Coin, + MFC_Button_JoystickUp, + MFC_Button_JoystickDown, + MFC_Button_JoystickStart, +} SPICE_SDK_MFC_BUTTONS; + +// FutureTomTom + +typedef enum SPICE_SDK_FUTURETOMTOM_BUTTONS { + FTT_Button_Service, + FTT_Button_Test, + FTT_Button_Pad1, + FTT_Button_Pad2, + FTT_Button_Pad3, + FTT_Button_Pad4, +} SPICE_SDK_FUTURETOMTOM_BUTTONS; + +typedef enum SPICE_SDK_FUTURETOMTOM_ANALOGS { + FTT_Analog_Pad1, + FTT_Analog_Pad2, + FTT_Analog_Pad3, + FTT_Analog_Pad4, +} SPICE_SDK_FUTURETOMTOM_ANALOGS; + +typedef enum SPICE_SDK_FUTURETOMTOM_LIGHTS { + FTT_Light_Pad1_R, + FTT_Light_Pad1_G, + FTT_Light_Pad1_B, + FTT_Light_Pad2_R, + FTT_Light_Pad2_G, + FTT_Light_Pad2_B, + FTT_Light_Pad3_R, + FTT_Light_Pad3_G, + FTT_Light_Pad3_B, + FTT_Light_Pad4_R, + FTT_Light_Pad4_G, + FTT_Light_Pad4_B, +} SPICE_SDK_FUTURETOMTOM_LIGHTS; + +// LovePlus + +typedef enum SPICE_SDK_LOVEPLUS_BUTTONS { + LOVEPLUS_Button_Service, + LOVEPLUS_Button_Test, + LOVEPLUS_Button_Left, + LOVEPLUS_Button_Right, +} SPICE_SDK_LOVEPLUS_BUTTONS; + +typedef enum SPICE_SDK_LOVEPLUS_LIGHTS { + LOVEPLUS_Light_Red, + LOVEPLUS_Light_Green, + LOVEPLUS_Light_Blue, + LOVEPLUS_Light_Left, + LOVEPLUS_Light_Right, +} SPICE_SDK_LOVEPLUS_LIGHTS; + +// Scotto + +typedef enum SPICE_SDK_SCOTTO_BUTTONS { + SCOTTO_Button_Service, + SCOTTO_Button_Test, + SCOTTO_Button_CoinMech, + SCOTTO_Button_Start, + SCOTTO_Button_Up, + SCOTTO_Button_Down, + SCOTTO_Button_Cup1, + SCOTTO_Button_Cup2, + SCOTTO_Button_FirstPad, + SCOTTO_Button_PadA, + SCOTTO_Button_PadB, + SCOTTO_Button_PadC, + SCOTTO_Button_PadD, + SCOTTO_Button_PadE, + SCOTTO_Button_PadF, +} SPICE_SDK_SCOTTO_BUTTONS; + +typedef enum SPICE_SDK_SCOTTO_LIGHTS { + SCOTTO_Light_FIRST_PAD_R, + SCOTTO_Light_FIRST_PAD_G, + SCOTTO_Light_FIRST_PAD_B, + SCOTTO_Light_PAD_A_R, + SCOTTO_Light_PAD_A_G, + SCOTTO_Light_PAD_A_B, + SCOTTO_Light_PAD_B_R, + SCOTTO_Light_PAD_B_G, + SCOTTO_Light_PAD_B_B, + SCOTTO_Light_PAD_C_R, + SCOTTO_Light_PAD_C_G, + SCOTTO_Light_PAD_C_B, + SCOTTO_Light_PAD_D_R, + SCOTTO_Light_PAD_D_G, + SCOTTO_Light_PAD_D_B, + SCOTTO_Light_PAD_E_R, + SCOTTO_Light_PAD_E_G, + SCOTTO_Light_PAD_E_B, + SCOTTO_Light_PAD_F_R, + SCOTTO_Light_PAD_F_G, + SCOTTO_Light_PAD_F_B, + SCOTTO_Light_CUP_R, + SCOTTO_Light_CUP_G, + SCOTTO_Light_CUP_B, + SCOTTO_Light_BUTTON, +} SPICE_SDK_SCOTTO_LIGHTS; + +// DANCERUSH + +typedef enum SPICE_SDK_DANCERUSH_BUTTONS { + DRS_Button_Service, + DRS_Button_Test, + DRS_Button_CoinMech, + DRS_Button_P1_Start, + DRS_Button_P1_Up, + DRS_Button_P1_Down, + DRS_Button_P1_Left, + DRS_Button_P1_Right, + DRS_Button_P2_Start, + DRS_Button_P2_Up, + DRS_Button_P2_Down, + DRS_Button_P2_Left, + DRS_Button_P2_Right, +} SPICE_SDK_DANCERUSH_BUTTONS; + +typedef enum SPICE_SDK_DANCERUSH_LIGHTS { + DRS_Light_P1_START, + DRS_Light_P1_MENU_UP, + DRS_Light_P1_MENU_DOWN, + DRS_Light_P1_MENU_LEFT, + DRS_Light_P1_MENU_RIGHT, + DRS_Light_P2_START, + DRS_Light_P2_MENU_UP, + DRS_Light_P2_MENU_DOWN, + DRS_Light_P2_MENU_LEFT, + DRS_Light_P2_MENU_RIGHT, + DRS_Light_CARD_READER_R, + DRS_Light_CARD_READER_G, + DRS_Light_CARD_READER_B, + DRS_Light_TITLE_PANEL_R, + DRS_Light_TITLE_PANEL_G, + DRS_Light_TITLE_PANEL_B, +} SPICE_SDK_DANCERUSH_LIGHTS; + +// Otoca D'or + +typedef enum SPICE_SDK_OTOCA_BUTTONS { + OTOCA_Button_Service, + OTOCA_Button_Test, + OTOCA_Button_CoinMech, + OTOCA_Button_ButtonLeft, + OTOCA_Button_ButtonRight, + OTOCA_Button_LeverUp, + OTOCA_Button_LeverDown, + OTOCA_Button_LeverLeft, + OTOCA_Button_LeverRight, +} SPICE_SDK_OTOCA_BUTTONS; + +typedef enum SPICE_SDK_OTOCA_LIGHTS { + OTOCA_Light_LeftButton, + OTOCA_Light_RightButton, +} SPICE_SDK_OTOCA_LIGHTS; + +// Winning Eleven + +typedef enum SPICE_SDK_WINNING_ELEVEN_BUTTONS { + WE_Button_Service, + WE_Button_Test, + WE_Button_CoinMech, + WE_Button_Start, + WE_Button_Up, + WE_Button_Down, + WE_Button_Left, + WE_Button_Right, + WE_Button_ButtonA, + WE_Button_ButtonB, + WE_Button_ButtonC, + WE_Button_ButtonD, + WE_Button_ButtonE, + WE_Button_ButtonF, + WE_Button_PadStart, + WE_Button_PadSelect, + WE_Button_PadUp, + WE_Button_PadDown, + WE_Button_PadLeft, + WE_Button_PadRight, + WE_Button_PadTriangle, + WE_Button_PadCross, + WE_Button_PadSquare, + WE_Button_PadCircle, + WE_Button_PadL1, + WE_Button_PadL2, + WE_Button_PadL3, + WE_Button_PadR1, + WE_Button_PadR2, + WE_Button_PadR3, +} SPICE_SDK_WINNING_ELEVEN_BUTTONS; + +typedef enum SPICE_SDK_WINNING_ELEVEN_ANALOGS { + WE_Analog_PadStickLeftX, + WE_Analog_PadStickLeftY, + WE_Analog_PadStickRightX, + WE_Analog_PadStickRightY, +} SPICE_SDK_WINNING_ELEVEN_ANALOGS; + +typedef enum SPICE_SDK_WINNING_ELEVEN_LIGHTS { + WE_Light_LeftRed, + WE_Light_LeftGreen, + WE_Light_LeftBlue, + WE_Light_RightRed, + WE_Light_RightGreen, + WE_Light_RightBlue, +} SPICE_SDK_WINNING_ELEVEN_LIGHTS; + +// Silent Scope: Bone Eater + +typedef enum SPICE_SDK_SILENT_SCOPE_BUTTONS { + SILENTSCOPE_Button_SERVICE, + SILENTSCOPE_Button_TEST, + SILENTSCOPE_Button_COIN_MECH, + SILENTSCOPE_Button_START, + SILENTSCOPE_Button_UP, + SILENTSCOPE_Button_DOWN, + SILENTSCOPE_Button_LEFT, + SILENTSCOPE_Button_RIGHT, + SILENTSCOPE_Button_GUN_PRESSED, + SILENTSCOPE_Button_SCOPE_RIGHT, + SILENTSCOPE_Button_SCOPE_LEFT, +} SPICE_SDK_SILENT_SCOPE_BUTTONS; + +typedef enum SPICE_SDK_SILENT_SCOPE_ANALOGS { + SILENTSCOPE_Analog_GUN_X, + SILENTSCOPE_Analog_GUN_Y, +} SPICE_SDK_SILENT_SCOPE_ANALOGS; + +// Charge Machine + +typedef enum SPICE_SDK_CHARGE_MACHINE_BUTTONS { + PCM_Button_Service, + PCM_Button_Test, + PCM_Button_Insert1000YenBill, + PCM_Button_Insert2000YenBill, + PCM_Button_Insert5000YenBill, + PCM_Button_Insert10000YenBill, +} SPICE_SDK_CHARGE_MACHINE_BUTTONS; + +// Ongaku Paradise + +typedef enum SPICE_SDK_ONGAKU_PARADISE_BUTTONS { + ONPARA_Button_Service, + ONPARA_Button_Test, + ONPARA_Button_Start, + ONPARA_Button_Headphone, +} SPICE_SDK_ONGAKU_PARADISE_BUTTONS; + +// Busou Shinki: Armored Princess Battle Conductor + +typedef enum SPICE_SDK_BUSOU_SHINKI_BUTTONS { + BC_Button_Service, + BC_Button_Test, + BC_Button_Up, + BC_Button_Down, + BC_Button_Left, + BC_Button_Right, + BC_Button_JoystickButton, + BC_Button_Trigger1, + BC_Button_Trigger2, + BC_Button_Button1, + BC_Button_Button2, + BC_Button_Button3, + BC_Button_Button4, +} SPICE_SDK_BUSOU_SHINKI_BUTTONS; + +typedef enum SPICE_SDK_BUSOU_SHINKI_ANALOGS { + BC_Analog_StickX, + BC_Analog_StickY, +} SPICE_SDK_BUSOU_SHINKI_ANALOGS; + +// Chase Chase Jokers + +typedef enum SPICE_SDK_CCJ_BUTTONS { + CCJ_Button_Service, + CCJ_Button_Test, + CCJ_Button_CoinMech, + CCJ_Button_Joystick_Up, + CCJ_Button_Joystick_Down, + CCJ_Button_Joystick_Left, + CCJ_Button_Joystick_Right, + CCJ_Button_Button_Dash, + CCJ_Button_Button_Action, + CCJ_Button_Button_Jump, + CCJ_Button_Button_Slide, + CCJ_Button_Button_Special, + CCJ_Button_Headphones, + CCJ_Button_Trackball_Up, + CCJ_Button_Trackball_Down, + CCJ_Button_Trackball_Left, + CCJ_Button_Trackball_Right, +} SPICE_SDK_CCJ_BUTTONS; + +typedef enum SPICE_SDK_CCJ_ANALOGS { + CCJ_Analog_Joystick_X, + CCJ_Analog_Joystick_Y, + CCJ_Analog_Trackball_DX, + CCJ_Analog_Trackball_DY, +} SPICE_SDK_CCJ_ANALOGS; + +typedef enum SPICE_SDK_CCJ_LIGHTS { + CCJ_Light_TitlePanel_R, + CCJ_Light_TitlePanel_G, + CCJ_Light_TitlePanel_B, + CCJ_Light_SidePanel_R, + CCJ_Light_SidePanel_G, + CCJ_Light_SidePanel_B, + CCJ_Light_CardReader_R, + CCJ_Light_CardReader_G, + CCJ_Light_CardReader_B, + CCJ_Light_SpecialButton, +} SPICE_SDK_CCJ_LIGHTS; + +// QuizKnock STADIUM + +typedef enum SPICE_SDK_QUIZKNOCK_STADIUM_BUTTONS { + QKS_Button_Test, + QKS_Button_Service, + QKS_Button_Coin, + QKS_Button_QButton, + QKS_Button_QButton1, + QKS_Button_QButton2, + QKS_Button_QButton3, + QKS_Button_JackDetect, + QKS_Button_MicDetect, +} SPICE_SDK_QUIZKNOCK_STADIUM_BUTTONS; + +// Mahjong Fight Girl + +typedef enum SPICE_SDK_MAHJONG_FIGHT_GIRL_BUTTONS { + MFG_Button_Service, + MFG_Button_Test, + MFG_Button_CoinMech, +} SPICE_SDK_MAHJONG_FIGHT_GIRL_BUTTONS; + +// Polaris Chord + +typedef enum SPICE_SDK_POLARIS_CHORD_BUTTONS { + PC_Button_Service, + PC_Button_Test, + PC_Button_CoinMech, + PC_Button_Button1, + PC_Button_Button2, + PC_Button_Button3, + PC_Button_Button4, + PC_Button_Button5, + PC_Button_Button6, + PC_Button_Button7, + PC_Button_Button8, + PC_Button_Button9, + PC_Button_Button10, + PC_Button_Button11, + PC_Button_Button12, + PC_Button_FaderL_Left, + PC_Button_FaderL_Right, + PC_Button_FaderR_Left, + PC_Button_FaderR_Right, + PC_Button_Headphone, +} SPICE_SDK_POLARIS_CHORD_BUTTONS; + +typedef enum SPICE_SDK_POLARIS_CHORD_ANALOGS { + PC_Analog_FaderL, + PC_Analog_FaderR, +} SPICE_SDK_POLARIS_CHORD_ANALOGS; + +typedef enum SPICE_SDK_POLARIS_CHORD_LIGHTS { + PC_Light_IC_READER_R, + PC_Light_IC_READER_G, + PC_Light_IC_READER_B, + PC_Light_Button1_R, + PC_Light_Button1_G, + PC_Light_Button1_B, + PC_Light_Button2_R, + PC_Light_Button2_G, + PC_Light_Button2_B, + PC_Light_Button3_R, + PC_Light_Button3_G, + PC_Light_Button3_B, + PC_Light_Button4_R, + PC_Light_Button4_G, + PC_Light_Button4_B, + PC_Light_Button5_R, + PC_Light_Button5_G, + PC_Light_Button5_B, + PC_Light_Button6_R, + PC_Light_Button6_G, + PC_Light_Button6_B, + PC_Light_Button7_R, + PC_Light_Button7_G, + PC_Light_Button7_B, + PC_Light_Button8_R, + PC_Light_Button8_G, + PC_Light_Button8_B, + PC_Light_Button9_R, + PC_Light_Button9_G, + PC_Light_Button9_B, + PC_Light_Button10_R, + PC_Light_Button10_G, + PC_Light_Button10_B, + PC_Light_Button11_R, + PC_Light_Button11_G, + PC_Light_Button11_B, + PC_Light_Button12_R, + PC_Light_Button12_G, + PC_Light_Button12_B, +} SPICE_SDK_POLARIS_CHORD_LIGHTS; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // SPICE_SDK_IO_H diff --git a/src/spice2x/sdk/sample/v0/cpp/v0_cpp.cpp b/src/spice2x/sdk/sample/v0/cpp/v0_cpp.cpp new file mode 100644 index 0000000..1e6ce06 --- /dev/null +++ b/src/spice2x/sdk/sample/v0/cpp/v0_cpp.cpp @@ -0,0 +1,57 @@ +#include +#include + +#include "sdk/include/spicesdk.h" +#include "sdk/include/spicesdk_io.h" + +#define LOG_INFO(message) spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0_cpp", message) + +static SPICE_SDK_V0 spice = {}; +static spice_sdk_destroy_callback_func destroy_callback; +static std::jthread worker_thread; + +static void worker_thread_main(std::stop_token stop_token) { + while (!stop_token.stop_requested()) { + + static bool state = false; + bool new_state; + spice.get_button(IIDX_Button_P1_Start, &new_state, nullptr); + if (!state && new_state) { + LOG_INFO("user pressed P1 Start button!"); + } + state = new_state; + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} + +SPICE_SDK_ENTRY_POINT +spice_sdk_entry_point( + spice_sdk_init_func *init +) +{ + SPICE_SDK_STATUS_CODE status; + + spice.size = sizeof(spice); + status = init(0, destroy_callback, &spice); + if (status != SPICE_SDK_STATUS_SUCCESS) { + return 0; + } + + LOG_INFO("plugin loaded"); + worker_thread = std::jthread(worker_thread_main); + return 1; +} + +void +__cdecl +destroy_callback( + void +) +{ + LOG_INFO("plugin unloading"); + if (worker_thread.joinable()) { + worker_thread.request_stop(); + worker_thread.join(); + } +} diff --git a/src/spice2x/sdk/sample/v0/cpp/v0_cpp.def b/src/spice2x/sdk/sample/v0/cpp/v0_cpp.def new file mode 100644 index 0000000..37d2332 --- /dev/null +++ b/src/spice2x/sdk/sample/v0/cpp/v0_cpp.def @@ -0,0 +1,4 @@ +LIBRARY sdk_sample_v0_cpp + +EXPORTS + spice_sdk_entry_point \ No newline at end of file diff --git a/src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.c b/src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.c new file mode 100644 index 0000000..8e4a8ae --- /dev/null +++ b/src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.c @@ -0,0 +1,318 @@ +#include +#include +#include +#include + +#include "sdk/include/spicesdk.h" +#include "sdk/include/spicesdk_io.h" + +static SPICE_SDK_V0 spice; + +static spice_sdk_destroy_callback_func destroy_callback; + +static void test_logging(); +static void test_game_info(); +static void test_avs_info(); + +static void get_buttons(); +static void set_buttons(); +static void clear_buttons(); + +static void get_analogs(); +static void set_analogs(); +static void clear_analogs(); + +static void get_lights(); +static void set_lights(); +static void clear_lights(); + +static void set_touch(); +static void clear_touch(); +static void insert_card(); +static void set_keypad(); +static void clear_keypad(); + +static HANDLE worker_stop_event; +static HANDLE worker_handle; +static unsigned __stdcall worker_thread(void *arg); + +// this sample assumes that the game is IIDX, but it doesn't check for it. + +SPICE_SDK_ENTRY_POINT +spice_sdk_entry_point( + spice_sdk_init_func *init +) +{ + SPICE_SDK_STATUS_CODE status; + + memset(&spice, 0, sizeof(spice)); + spice.size = sizeof(spice); + status = init(0, destroy_callback, &spice); + if (status != SPICE_SDK_STATUS_SUCCESS) { + return 0; + } + + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "plugin loaded"); + test_logging(); + test_game_info(); + test_avs_info(); + + worker_stop_event = CreateEventA(NULL, TRUE, FALSE, NULL); + if (!worker_stop_event) { + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", "failed to create worker stop event"); + return 0; + } + + worker_handle = (HANDLE)_beginthreadex( + NULL, // security + 0, // stack size + worker_thread, // function + NULL, // argument + 0, // flags + NULL // thread id + ); + if (!worker_handle) { + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", "failed to create worker thread"); + CloseHandle(worker_stop_event); + worker_stop_event = NULL; + return 0; + } + + return 1; +} + +void +__cdecl +destroy_callback( + void +) +{ + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "plugin unloaded"); + if (worker_stop_event) { + SetEvent(worker_stop_event); + } + if (worker_handle) { + WaitForSingleObject(worker_handle, INFINITE); + CloseHandle(worker_handle); + worker_handle = NULL; + } + if (worker_stop_event) { + CloseHandle(worker_stop_event); + worker_stop_event = NULL; + } +} + +static unsigned __stdcall worker_thread(void *arg) { + int phase = 0; + while (WaitForSingleObject(worker_stop_event, 0) == WAIT_TIMEOUT) { + phase += 1; + switch (phase) { + case 1: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "get buttons..."); + get_buttons(); + break; + case 2: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "set buttons..."); + set_buttons(); + break; + case 3: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "clear buttons..."); + clear_buttons(); + break; + case 4: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "get analogs..."); + get_analogs(); + break; + case 5: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "set analogs..."); + set_analogs(); + break; + case 6: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "clear analogs..."); + clear_analogs(); + break; + case 7: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "get lights..."); + get_lights(); + break; + case 8: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "set lights..."); + set_lights(); + break; + case 9: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "clear lights..."); + clear_lights(); + break; + case 10: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "set touch..."); + set_touch(); + break; + case 11: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "clear touch..."); + clear_touch(); + break; + case 12: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "insert card..."); + insert_card(); + break; + case 13: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "set keypad..."); + set_keypad(); + break; + case 14: + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "clear keypad..."); + clear_keypad(); + break; + default: + phase = 0; + break; + } + if (phase != 0) { + WaitForSingleObject(worker_stop_event, 3000); + } + } + return 0; +} + +static void test_logging() { + spice.log(SPICE_SDK_LOG_LEVEL_MISC, "sample_v0", "this is a misc message"); + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", "this is an info message"); + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", "this is a warning message"); +} + +static void test_game_info() { + SPICE_SDK_GAME_INFO info; + SPICE_SDK_STATUS_CODE status; + + status = spice.get_game_info(&info); + if (status != SPICE_SDK_STATUS_SUCCESS) { + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", "get_game_info failed"); + return; + } + char log_message[128]; + snprintf(log_message, sizeof(log_message), "game info - name: %s", info.name); + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", log_message); +} + +static void test_avs_info() { + SPICE_SDK_AVS_INFO info; + SPICE_SDK_STATUS_CODE status; + + status = spice.get_avs_info(&info); + if (status != SPICE_SDK_STATUS_SUCCESS) { + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", "get_avs_info failed"); + return; + } + + char log_message[128]; + snprintf( + log_message, + sizeof(log_message), + "avs - model: %s, dest: %c, spec: %c, rev: %c, ext: %s", + info.model, info.dest, info.spec, info.rev, info.ext); + + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", log_message); +} + +static void get_buttons() { + bool pressed; + float velocity; + spice.get_button(IIDX_Button_P1_Headphone, &pressed, &velocity); + + char log_message[128]; + snprintf( + log_message, + sizeof(log_message), + "button P1_Headphone pressed: %s, velocity: %.2f", + pressed ? "ON" : "off", velocity); + + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", log_message); +} + +static void set_buttons() { + spice.set_button(IIDX_Button_P1_1, true, 0.3f); + spice.set_button(IIDX_Button_P1_3, true, 0.5f); + spice.set_button(IIDX_Button_P1_5, true, 0.7f); +} + +static void clear_buttons() { + spice.set_button(IIDX_Button_P1_1, false, 0.f); + spice.set_button(IIDX_Button_P1_3, false, 0.f); + spice.set_button(IIDX_Button_P1_5, false, 0.f); +} + +static void get_analogs() { + float value; + spice.get_analog(IIDX_Analog_TT_P1, &value); + + char log_message[128]; + snprintf( + log_message, + sizeof(log_message), + "analog TT_P1: %.2f", + value); + + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", log_message); +} + +static void set_analogs() { + spice.set_analog(IIDX_Analog_TT_P1, true, 0.25f); + spice.set_analog(IIDX_Analog_TT_P2, true, 0.75f); +} + +static void clear_analogs() { + spice.set_analog(IIDX_Analog_TT_P1, false, 0.f); + spice.set_analog(IIDX_Analog_TT_P2, false, 0.f); +} + +static void get_lights() { + float value; + SPICE_SDK_STATUS_CODE status; + + status = spice.get_light(IIDX_Light_TT_P1_Resistance, &value); + if (status == SPICE_SDK_STATUS_SUCCESS) { + char log_message[64]; + snprintf(log_message, sizeof(log_message), "P1 TT resistance value: %.2f", value); + spice.log(SPICE_SDK_LOG_LEVEL_INFO, "sample_v0", log_message); + } else { + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", "get_light failed"); + } +} + +static void set_lights() { + spice.set_light(IIDX_Light_P1_Start, true, 1.f); +} + +static void clear_lights() { + spice.set_light(IIDX_Light_P1_Start, false, 0.f); +} + +static void set_touch() { + SPICE_SDK_TOUCH_POINT points[2] = { + { .id = 1, .x = 100, .y = 200 }, + { .id = 2, .x = 300, .y = 400 }, + }; + spice.set_touch(points, 2); +} + +static void clear_touch() { + uint32_t ids[2] = { 1, 2 }; + spice.clear_touch(ids, 2); +} + +static void insert_card() { + spice.insert_card(0, "E004010000001234"); +} + +static void set_keypad() { + SPICE_SDK_STATUS_CODE ret = spice.set_keypad(0, '3'); + if (ret != SPICE_SDK_STATUS_SUCCESS) { + char log_message[64]; + snprintf(log_message, sizeof(log_message), "set_keypad failed: %d", ret); + spice.log(SPICE_SDK_LOG_LEVEL_WARNING, "sample_v0", log_message); + } +} + +static void clear_keypad() { + spice.set_keypad(0, 0); +} diff --git a/src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.def b/src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.def new file mode 100644 index 0000000..958a806 --- /dev/null +++ b/src/spice2x/sdk/sample/v0/flat_c/v0_flat_c.def @@ -0,0 +1,4 @@ +LIBRARY sdk_sample_v0_flat_c + +EXPORTS + spice_sdk_entry_point \ No newline at end of file diff --git a/src/spice2x/sdk/sdk.cpp b/src/spice2x/sdk/sdk.cpp new file mode 100644 index 0000000..bedc511 --- /dev/null +++ b/src/spice2x/sdk/sdk.cpp @@ -0,0 +1,595 @@ +#include +#include +#include + +#include "sdk.h" +#include "avs/game.h" +#include "games/io.h" +#include "launcher/launcher.h" +#include "misc/eamuse.h" +#include "sdk/include/spicesdk.h" +#include "touch/touch.h" +#include "util/logging.h" +#include "util/utils.h" + +namespace sdk { + +static spice_sdk_init_func sdk_init; +static spice_sdk_log_func sdk_log; +static spice_sdk_get_avs_info_func sdk_get_avs_info; +static spice_sdk_get_game_info_func sdk_get_game_info; +static spice_sdk_get_button_func sdk_get_button; +static spice_sdk_set_button_func sdk_set_button; +static spice_sdk_get_analog_func sdk_get_analog; +static spice_sdk_set_analog_func sdk_set_analog; +static spice_sdk_get_light_func sdk_get_light; +static spice_sdk_set_light_func sdk_set_light; +static spice_sdk_set_touch_func sdk_set_touch; +static spice_sdk_clear_touch_func sdk_clear_touch; +static spice_sdk_insert_card_func sdk_insert_card; +static spice_sdk_set_keypad_func sdk_set_keypad; + +struct SdkModule { + std::string dll; + HINSTANCE module; +}; + +// DLLs +static int sdk_modules_count = 0; +static std::vector sdk_modules_list; +static std::shared_mutex sdk_global_mutex; + +// internal +static bool sdk_initialized = false; +static bool sdk_shutting_down = false; +static std::vector