From 2363498f73c99b5b18978580144cc2457f80f97b Mon Sep 17 00:00:00 2001 From: icex2 Date: Fri, 18 Dec 2020 19:38:12 +0100 Subject: [PATCH] vigem-iidxio: Support multiple different light sequence modes Add new one suggested and implemented by Grim to flash the neons when spinning the turntables --- src/main/vigem-iidxio/cab-light-sequencer.c | 87 +++++++++++++++------ src/main/vigem-iidxio/cab-light-sequencer.h | 16 +++- src/main/vigem-iidxio/config.c | 24 +++--- src/main/vigem-iidxio/config.h | 2 +- src/main/vigem-iidxio/main.c | 13 +-- 5 files changed, 100 insertions(+), 42 deletions(-) diff --git a/src/main/vigem-iidxio/cab-light-sequencer.c b/src/main/vigem-iidxio/cab-light-sequencer.c index 2a41518..6e049c4 100644 --- a/src/main/vigem-iidxio/cab-light-sequencer.c +++ b/src/main/vigem-iidxio/cab-light-sequencer.c @@ -3,36 +3,22 @@ #include #include +#include "vigem-iidxio/cab-light-sequencer.h" + #include "util/log.h" #include "util/time.h" static const uint32_t _SEQ_CYCLE_TIME_MS = 2000; -static bool _enabled; +static enum vigem_iidxio_cab_light_sequencer_mode _light_seq_mode; +static bool _first_update; static uint64_t _time_counter; -void vigem_iidxio_cab_light_sequencer_init() +static uint8_t _tt_prev[2]; + +void _update_neons_seq_flash(bool* out_neon) { - _time_counter = time_get_counter(); - _enabled = true; - - if (_enabled) { - log_info("Initialized"); - } -} - -void vigem_iidxio_cab_light_sequencer_update(bool* out_neon, uint8_t* out_spots) -{ - log_assert(out_neon); - log_assert(out_spots); - - if (!_enabled) { - *out_neon = false; - *out_spots = 0; - return; - } - uint64_t counter_now = time_get_counter(); uint32_t cycle_time_elapsed_ms = time_get_elapsed_ms(counter_now - _time_counter); @@ -45,4 +31,61 @@ void vigem_iidxio_cab_light_sequencer_update(bool* out_neon, uint8_t* out_spots) if (cycle_time_elapsed_ms >= _SEQ_CYCLE_TIME_MS) { _time_counter = counter_now; } -} \ No newline at end of file +} + +void _update_neons_flash_tt_input(uint8_t tt_p1, uint8_t tt_p2, bool* out_neon) +{ + if (_first_update) { + _tt_prev[0] = tt_p1; + _tt_prev[1] = tt_p2; + return; + } + + if (_tt_prev[0] != tt_p1 || _tt_prev[1] != tt_p2) { + *out_neon = true; + } else { + *out_neon = false; + } +} + +void vigem_iidxio_cab_light_sequencer_init( + enum vigem_iidxio_cab_light_sequencer_mode light_seq_mode) +{ + _time_counter = time_get_counter(); + _light_seq_mode = light_seq_mode; + + _first_update = true; + + if (_light_seq_mode != LIGHT_SEQ_MODE_OFF) { + log_info("Initialized"); + } +} + +void vigem_iidxio_cab_light_sequencer_update( + uint16_t keys, + uint8_t tt_p1, + uint8_t tt_p2, + bool* out_neon, + uint8_t* out_spots) +{ + log_assert(out_neon); + log_assert(out_spots); + + switch (_light_seq_mode) { + case LIGHT_SEQ_MODE_NEONS_FLASH: + _update_neons_seq_flash(out_neon); + + case LIGHT_SEQ_MODE_NEONS_FLASH_TT_INPUT: + _update_neons_flash_tt_input(tt_p1, tt_p2, out_neon); + break; + + case LIGHT_SEQ_MODE_OFF: + // fallthrough + default: + *out_neon = false; + *out_spots = 0; + break; + } + + _first_update = false; +} diff --git a/src/main/vigem-iidxio/cab-light-sequencer.h b/src/main/vigem-iidxio/cab-light-sequencer.h index 514a4c5..66b3060 100644 --- a/src/main/vigem-iidxio/cab-light-sequencer.h +++ b/src/main/vigem-iidxio/cab-light-sequencer.h @@ -4,8 +4,20 @@ #include #include -void vigem_iidxio_cab_light_sequencer_init(); +enum vigem_iidxio_cab_light_sequencer_mode { + LIGHT_SEQ_MODE_OFF = 0, + LIGHT_SEQ_MODE_NEONS_FLASH = 1, + LIGHT_SEQ_MODE_NEONS_FLASH_TT_INPUT = 2, +}; -void vigem_iidxio_cab_light_sequencer_update(bool* out_neon, uint8_t* out_spots); +void vigem_iidxio_cab_light_sequencer_init( + enum vigem_iidxio_cab_light_sequencer_mode light_seq_mode); + +void vigem_iidxio_cab_light_sequencer_update( + uint16_t keys, + uint8_t tt_p1, + uint8_t tt_p2, + bool* out_neon, + uint8_t* out_spots); #endif \ No newline at end of file diff --git a/src/main/vigem-iidxio/config.c b/src/main/vigem-iidxio/config.c index 359f75a..1c8ff5c 100644 --- a/src/main/vigem-iidxio/config.c +++ b/src/main/vigem-iidxio/config.c @@ -7,13 +7,13 @@ #define VIGEM_IIDXIO_CONFIG_ENABLE_KEYLIGHT_KEY "vigem.iidxio.enable_keylight" #define VIGEM_IIDXIO_CONFIG_RELATIVE_ANALOG_KEY "vigem.iidxio.use_relative_analog" -#define VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_SEQ_KEY "vigem.iidxio.enable_cab_light_seq" +#define VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_MODE_KEY "vigem.iidxio.cab_light_mode" #define VIGEM_IIDXIO_CONFIG_TEXT_16SEG_KEY "vigem.iidxio.text_16seg" #define VIGEM_IIDXIO_CONFIG_TEXT_SCROLL_CYCLE_TIME_MS_KEY "vigem.iidxio.text_scroll_cycle_time_ms" #define VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_KEYLIGHT_VALUE true #define VIGEM_IIDXIO_CONFIG_DEFAULT_RELATIVE_ANALOG_VALUE false -#define VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_SEQ_VALUE false +#define VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_MODE_VALUE 0 #define VIGEM_IIDXIO_CONFIG_DEFAULT_TEXT_16SEG_VALUE "" #define VIGEM_IIDXIO_CONFIG_DEFAULT_TEXT_SCROLL_CYCLE_TIME_MS_VALUE 500 @@ -31,11 +31,11 @@ static void _vigem_iidxio_config_init(struct cconfig *config) VIGEM_IIDXIO_CONFIG_DEFAULT_RELATIVE_ANALOG_VALUE, "Use relative mode analog mapping"); - cconfig_util_set_bool( + cconfig_util_set_int( config, - VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_SEQ_KEY, - VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_SEQ_VALUE, - "Enable built in cabinet light sequence"); + VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_MODE_KEY, + VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_MODE_VALUE, + "Different cabinet light modes: 0 = off, 1 = neons sequence, 2 = neons flash on TT spin"); cconfig_util_set_str( config, @@ -77,16 +77,16 @@ static void _vigem_iidxio_config_get( VIGEM_IIDXIO_CONFIG_DEFAULT_RELATIVE_ANALOG_VALUE); } - if (!cconfig_util_get_bool( + if (!cconfig_util_get_int( config, - VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_SEQ_KEY, - &vigem_config->enable_cab_light_seq, - VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_SEQ_VALUE)) { + VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_MODE_KEY, + &vigem_config->cab_light_mode, + VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_MODE_VALUE)) { log_warning( "Invalid value for key '%s' specified, fallback " "to default '%d'", - VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_SEQ_KEY, - VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_SEQ_VALUE); + VIGEM_IIDXIO_CONFIG_ENABLE_CAB_LIGHT_MODE_KEY, + VIGEM_IIDXIO_CONFIG_DEFAULT_ENABLE_CAB_LIGHT_MODE_VALUE); } if (!cconfig_util_get_str( diff --git a/src/main/vigem-iidxio/config.h b/src/main/vigem-iidxio/config.h index cdcbcca..4803fae 100644 --- a/src/main/vigem-iidxio/config.h +++ b/src/main/vigem-iidxio/config.h @@ -8,7 +8,7 @@ struct vigem_iidxio_config { bool enable_keylight; bool relative_analog; - bool enable_cab_light_seq; + int32_t cab_light_mode; char text_16seg[1024 + 1]; int32_t text_scroll_cycle_time_ms; }; diff --git a/src/main/vigem-iidxio/main.c b/src/main/vigem-iidxio/main.c index 7617ba6..5a9e1fb 100644 --- a/src/main/vigem-iidxio/main.c +++ b/src/main/vigem-iidxio/main.c @@ -145,9 +145,7 @@ int main(int argc, char **argv) iidx_io_ep1_set_top_lamps(0); iidx_io_ep1_set_top_neons(false); - if (config.enable_cab_light_seq) { - vigem_iidxio_cab_light_sequencer_init(); - } + vigem_iidxio_cab_light_sequencer_init(config.cab_light_mode); if (config.text_16seg[0] != '\0') { vigem_iidxio_cab_16seg_sequencer_init(config.text_16seg, config.text_scroll_cycle_time_ms); @@ -254,14 +252,19 @@ int main(int argc, char **argv) iidx_io_ep1_set_panel_lights(panel); } - if (config.enable_cab_light_seq) { + if (config.cab_light_mode != LIGHT_SEQ_MODE_OFF) { bool neon; uint8_t spots; neon = false; spots = 0; - vigem_iidxio_cab_light_sequencer_update(&neon, &spots); + vigem_iidxio_cab_light_sequencer_update( + keys, + turntable[0], + turntable[1], + &neon, + &spots); iidx_io_ep1_set_top_neons(neon); iidx_io_ep1_set_top_lamps(spots);