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:
parent
d9cb953b67
commit
89c3ada28f
3
dist/iidx/iidxhook-27.conf
vendored
3
dist/iidx/iidxhook-27.conf
vendored
@ -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
|
||||||
|
|
||||||
|
@ -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] :
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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
22
src/main/util/math.c
Normal 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
9
src/main/util/math.h
Normal 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
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user