1
0
mirror of https://github.com/djhackersdev/bemanitools.git synced 2024-11-14 10:17:38 +01:00

iidxhook9: Add turntable multiplier

This commit is contained in:
Will Xyen 2020-12-09 17:21:29 -08:00
parent d9cb953b67
commit 89c3ada28f
9 changed files with 92 additions and 22 deletions

View File

@ -16,6 +16,9 @@ io.disable_cams=false
# Disables the built in file hooks, requiring manual file creation # Disables the built in file hooks, requiring manual file creation
io.disable_file_hooks=false io.disable_file_hooks=false
# Turntable sensitivity multiplier (1.0 is default)
io.tt_multiplier=1.0
# Disables the camera emulation # Disables the camera emulation
cam.disable_emu=false cam.disable_emu=false

View File

@ -4,11 +4,13 @@
#include <windows.h> /* for _BitScanForward */ #include <windows.h> /* for _BitScanForward */
#include <math.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "acioemu/emu.h" #include "acioemu/emu.h"
#include "util/math.h"
#include "bemanitools/iidxio.h" #include "bemanitools/iidxio.h"
@ -27,6 +29,11 @@ static bool poll_delay;
static bool coin_latch; static bool coin_latch;
static uint8_t coin_count; static uint8_t coin_count;
static bool tt_multiplier_set;
static float tt_multiplier = 1.f;
static uint8_t tt_accum[2];
static int16_t tt_last[2];
int get_default_slider_valid(size_t idx) int get_default_slider_valid(size_t idx)
{ {
if (default_sliders[idx] >= 0 && default_sliders[idx] <= 15) { if (default_sliders[idx] >= 0 && default_sliders[idx] <= 15) {
@ -36,6 +43,12 @@ int get_default_slider_valid(size_t idx)
} }
} }
void bio2_emu_bi2a_set_tt_multiplier(float multiplier)
{
tt_multiplier_set = true;
tt_multiplier = multiplier;
}
void bio2_emu_bi2a_init( void bio2_emu_bi2a_init(
struct bio2emu_port *bio2_emu, bool disable_poll_limiter) struct bio2emu_port *bio2_emu, bool disable_poll_limiter)
{ {
@ -158,6 +171,15 @@ static void bio2_emu_bi2a_send_status(
ac_io_emu_response_push(emu, &resp, 0); ac_io_emu_response_push(emu, &resp, 0);
} }
static int16_t tt_mult_delta(size_t tt_no) {
int16_t current_tt = iidx_io_ep2_get_turntable(tt_no);
int16_t delta = get_wrapped_delta_s16(current_tt, tt_last[tt_no], 256);
tt_last[tt_no] = current_tt;
return round(delta * tt_multiplier);
}
static void static void
bio2_emu_bi2a_send_state(struct ac_io_emu *emu, const struct ac_io_message *req) bio2_emu_bi2a_send_state(struct ac_io_emu *emu, const struct ac_io_message *req)
{ {
@ -233,8 +255,16 @@ bio2_emu_bi2a_send_state(struct ac_io_emu *emu, const struct ac_io_message *req)
return bio2_emu_bi2a_send_status(emu, req, 0); return bio2_emu_bi2a_send_status(emu, req, 0);
} }
body->TURNTABLE1 = iidx_io_ep2_get_turntable(0); if (tt_multiplier_set) {
body->TURNTABLE2 = iidx_io_ep2_get_turntable(1); tt_accum[0] += tt_mult_delta(0);
tt_accum[1] += tt_mult_delta(1);
body->TURNTABLE1 = tt_accum[0];
body->TURNTABLE2 = tt_accum[1];
} else {
body->TURNTABLE1 = iidx_io_ep2_get_turntable(0);
body->TURNTABLE2 = iidx_io_ep2_get_turntable(1);
}
body->SLIDER1.s_val = get_default_slider_valid(0) ? body->SLIDER1.s_val = get_default_slider_valid(0) ?
default_sliders[0] : default_sliders[0] :

View File

@ -6,6 +6,7 @@
#include "bio2emu/emu.h" #include "bio2emu/emu.h"
void bio2_emu_bi2a_init(struct bio2emu_port *in, bool disable_poll_limiter); void bio2_emu_bi2a_init(struct bio2emu_port *in, bool disable_poll_limiter);
void bio2_emu_bi2a_set_tt_multiplier(float multiplier);
void bio2_emu_bi2a_dispatch_request( void bio2_emu_bi2a_dispatch_request(
struct bio2emu_port *bio2port, const struct ac_io_message *req); struct bio2emu_port *bio2port, const struct ac_io_message *req);

View File

@ -11,6 +11,7 @@
#define IIDXHOOK9_CONFIG_IO_LIGHTNING_MODE_KEY "io.lightning_mode" #define IIDXHOOK9_CONFIG_IO_LIGHTNING_MODE_KEY "io.lightning_mode"
#define IIDXHOOK9_CONFIG_IO_DISABLE_CAMS_KEY "io.disable_cams" #define IIDXHOOK9_CONFIG_IO_DISABLE_CAMS_KEY "io.disable_cams"
#define IIDXHOOK9_CONFIG_IO_DISABLE_FILE_HOOKS_KEY "io.disable_file_hooks" #define IIDXHOOK9_CONFIG_IO_DISABLE_FILE_HOOKS_KEY "io.disable_file_hooks"
#define IIDXHOOK9_CONFIG_IO_TT_MULTIPLIER_KEY "io.tt_multiplier"
#define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_CARD_READER_EMU_VALUE false #define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_CARD_READER_EMU_VALUE false
#define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_BIO2_EMU_VALUE false #define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_BIO2_EMU_VALUE false
@ -18,6 +19,7 @@
#define IIDXHOOK9_CONFIG_IO_DEFAULT_LIGHTNING_MODE_VALUE false #define IIDXHOOK9_CONFIG_IO_DEFAULT_LIGHTNING_MODE_VALUE false
#define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_CAMS_VALUE false #define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_CAMS_VALUE false
#define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_FILE_HOOKS_VALUE false #define IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_FILE_HOOKS_VALUE false
#define IIDXHOOK9_CONFIG_IO_DEFAULT_TT_MULTIPLIER_VALUE 1.0
void iidxhook9_config_io_init(struct cconfig *config) void iidxhook9_config_io_init(struct cconfig *config)
{ {
@ -57,6 +59,12 @@ void iidxhook9_config_io_init(struct cconfig *config)
IIDXHOOK9_CONFIG_IO_DISABLE_FILE_HOOKS_KEY, IIDXHOOK9_CONFIG_IO_DISABLE_FILE_HOOKS_KEY,
IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_FILE_HOOKS_VALUE, IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_FILE_HOOKS_VALUE,
"Disables the built in file hooks, requiring manual file creation"); "Disables the built in file hooks, requiring manual file creation");
cconfig_util_set_float(
config,
IIDXHOOK9_CONFIG_IO_TT_MULTIPLIER_KEY,
IIDXHOOK9_CONFIG_IO_DEFAULT_TT_MULTIPLIER_VALUE,
"Turntable sensitivity multiplier (1.0 is default)");
} }
void iidxhook9_config_io_get( void iidxhook9_config_io_get(
@ -133,4 +141,16 @@ void iidxhook9_config_io_get(
IIDXHOOK9_CONFIG_IO_DISABLE_FILE_HOOKS_KEY, IIDXHOOK9_CONFIG_IO_DISABLE_FILE_HOOKS_KEY,
IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_FILE_HOOKS_VALUE); IIDXHOOK9_CONFIG_IO_DEFAULT_DISABLE_FILE_HOOKS_VALUE);
} }
if (!cconfig_util_get_float(
config,
IIDXHOOK9_CONFIG_IO_TT_MULTIPLIER_KEY,
&config_io->tt_multiplier,
IIDXHOOK9_CONFIG_IO_DEFAULT_TT_MULTIPLIER_VALUE)) {
log_warning(
"Invalid value for key '%s' specified, fallback "
"to default '%f'",
IIDXHOOK9_CONFIG_IO_TT_MULTIPLIER_KEY,
IIDXHOOK9_CONFIG_IO_DEFAULT_TT_MULTIPLIER_VALUE);
}
} }

View File

@ -12,6 +12,7 @@ struct iidxhook9_config_io {
bool lightning_mode; bool lightning_mode;
bool disable_cams; bool disable_cams;
bool disable_file_hooks; bool disable_file_hooks;
float tt_multiplier;
}; };
void iidxhook9_config_io_init(struct cconfig *config); void iidxhook9_config_io_init(struct cconfig *config);

View File

@ -10,6 +10,7 @@ src_util := \
iobuf.c \ iobuf.c \
list.c \ list.c \
log.c \ log.c \
math.c \
mem.c \ mem.c \
msg-thread.c \ msg-thread.c \
net.c \ net.c \

22
src/main/util/math.c Normal file
View File

@ -0,0 +1,22 @@
#include "util/math.h"
int16_t get_wrapped_delta_s16(int16_t val, int16_t last, int16_t bound) {
int16_t half_point = bound / 2;
int16_t delta = val - last;
if (delta > half_point) {
delta -= bound;
}
if (delta < -half_point) {
delta += bound;
}
// delta is now between (-half_point - half_point)
return delta;
}
int16_t sign_s16(int16_t x) {
return (x > 0) - (x < 0);
}

9
src/main/util/math.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef UTIL_MATH_H
#define UTIL_MATH_H
#include <stdint.h>
int16_t get_wrapped_delta_s16(int16_t val, int16_t last, int16_t bound);
int16_t sign_s16(int16_t x);
#endif

View File

@ -9,6 +9,7 @@
#include "bemanitools/sdvxio.h" #include "bemanitools/sdvxio.h"
#include "util/log.h" #include "util/log.h"
#include "util/math.h"
#include "util/thread.h" #include "util/thread.h"
#include "vigemstub/helper.h" #include "vigemstub/helper.h"
@ -22,25 +23,6 @@ int16_t convert_analog_to_s16(uint16_t val)
return (int64_t)(val * 64); return (int64_t)(val * 64);
} }
int16_t get_relative_delta(int16_t val, int16_t last)
{
// val is 10 bit
const int16_t half_point = 512; // 2^9
int16_t delta = val - last;
if (delta > half_point) {
delta -= 1024;
}
if (delta < -half_point) {
delta += 1024;
}
// delta is now between (-512 - 512)
return delta;
}
int16_t filter_floor(int32_t value, int16_t floor) { int16_t filter_floor(int32_t value, int16_t floor) {
if (abs(value) < floor) { if (abs(value) < floor) {
return 0; return 0;
@ -58,7 +40,8 @@ int16_t filter_floor(int32_t value, int16_t floor) {
int32_t convert_relative_analog( int32_t convert_relative_analog(
uint16_t val, uint16_t last, int32_t buffered_last, int16_t multiplier) uint16_t val, uint16_t last, int32_t buffered_last, int16_t multiplier)
{ {
int16_t delta = get_relative_delta(val, last); // val is 10 bit
int16_t delta = get_wrapped_delta_s16(val, last, 1024);
if (delta == 0) { if (delta == 0) {
// ease the stick back to 0 like a real stick would // ease the stick back to 0 like a real stick would