From a7539dae9ff752f603a8613db7b392392bbf3d95 Mon Sep 17 00:00:00 2001 From: whowechina Date: Thu, 19 Dec 2024 10:42:52 +0800 Subject: [PATCH] Live view in tt theme setting --- Production/Firmware/iidx_pico.uf2 | Bin 112128 -> 111616 bytes firmware/src/main.c | 22 ++++-- firmware/src/rgb.c | 123 +++++++++++++++++++----------- firmware/src/rgb.h | 3 +- firmware/src/setup.c | 28 ++++--- firmware/src/setup.h | 40 +++++----- 6 files changed, 137 insertions(+), 79 deletions(-) diff --git a/Production/Firmware/iidx_pico.uf2 b/Production/Firmware/iidx_pico.uf2 index f0d67bf941a52f39ea07f23cecfad0c426682aef..331ba5936767a91f37f688bc1e8ec6026b5a20f4 100644 GIT binary patch delta 19023 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 no?|`&&h@UybgttVMK*@iJ|0rLkrEuo<@7{aP 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 diff --git a/firmware/src/main.c b/firmware/src/main.c index 5ac6221..6f0ecb2 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -103,13 +103,24 @@ static void core0_loop() uint16_t buttons = button_read(); uint16_t angle = turntable_raw() >> 4; - if (setup_run(buttons, angle)) { - rgb_force_display(setup_led_button, setup_led_tt); + setup_run(buttons, angle); + + bool ov_tt = setup_needs_tt_led(); + bool ov_btn = setup_needs_button_led(); + + if (ov_tt) { + rgb_override_tt(setup_led_tt); + } + if (ov_btn) { + rgb_override_button(setup_led_button); } else { - hid_report.buttons = buttons; rgb_set_button_light(buttons); + } + + if (!ov_tt && !ov_btn) { save_loop(); } + report_usb_hid(); cli_fps_count(0); @@ -124,10 +135,11 @@ void init() tusb_init(); button_init(); + turntable_init(); + + rgb_init(); tt_rainbow_init(); tt_blade_init(); - rgb_init(); - turntable_init(); boot_check(); stdio_init_all(); diff --git a/firmware/src/rgb.c b/firmware/src/rgb.c index 7cfe8ad..91dee54 100644 --- a/firmware/src/rgb.c +++ b/firmware/src/rgb.c @@ -25,9 +25,10 @@ static const uint8_t button_rgb_map[BUTTON_RGB_NUM] = BUTTON_RGB_MAP; -static void trap() {} -static tt_effect_t effects[10] = { {trap, trap, trap, 0} }; +static tt_effect_t effects[7] = { }; static size_t effect_num = 0; +#define EFFECT_MAX count_of(effects) + static unsigned current_effect = 0; #define _MAP_LED(x) _MAKE_MAPPER(x) @@ -93,17 +94,33 @@ uint32_t tt_led_angle = 0; static uint32_t button_led_buf[BUTTON_RGB_NUM] = {0}; -void set_effect(uint32_t index) +static void fn_nop() {}; +static void fn_tt_led_off() { - if (index < effect_num) { - current_effect = index; - effects[current_effect].init(effects[current_effect].context); - } else { - current_effect = effect_num; + memset(tt_led_buf, 0, sizeof(tt_led_buf)); +} + +static void effect_reset() +{ + for (int i = 0; i < EFFECT_MAX; i++) { + effects[i].init = fn_nop; + effects[i].set_angle = fn_nop; + effects[i].update = fn_tt_led_off; + effects[i].context = 0; } } -void drive_led() +static void set_effect(uint32_t index) +{ + if (index < EFFECT_MAX) { + if (current_effect != index) { + current_effect = index; + effects[current_effect].init(effects[current_effect].context); + } + } +} + +static void drive_led() { for (int i = 0; i < ARRAY_SIZE(button_led_buf); i++) { pio_sm_put_blocking(pio0, 0, button_led_buf[i] << 8); @@ -185,18 +202,6 @@ uint32_t tt_hsv(hsv_t hsv) #endif } -static void button_lights_update() -{ - for (int i = 0; i < BUTTON_RGB_NUM; i++) { - int led = button_rgb_map[i]; - if (hid_lights[i] > 0) { - button_led_buf[led] = button_hsv(iidx_cfg->key_on[i]); - } else { - button_led_buf[led] = button_hsv(iidx_cfg->key_off[i]); - } - } -} - void rgb_set_angle(uint32_t angle) { tt_led_angle = angle; @@ -231,9 +236,22 @@ void rgb_set_hid_light(uint8_t const *lights, uint8_t num) } } +#define OVERRIDE_EXPIRE 100000ULL +static uint64_t override_tt_expire_time = 0; +static uint64_t override_button_expire_time = 0; +uint32_t *override_tt_buf = NULL; +uint32_t *override_button_buf = NULL; + static void tt_lights_update() { - if (time_us_64() < hid_light_tt_expire) { + uint64_t now = time_us_64(); + + if (now < override_tt_expire_time) { + memcpy(tt_led_buf, override_tt_buf, TT_LED_NUM * sizeof(uint32_t)); + return; + } + + if (now < hid_light_tt_expire) { /* Higher priority for the HID lights */ uint32_t color = tt_rgb32(tt_hid[0], tt_hid[1], tt_hid[2], false); for (int i = 0; i < TT_LED_NUM; i++) { @@ -242,30 +260,42 @@ static void tt_lights_update() return; } + set_effect(iidx_cfg->tt_led.effect); /* Lower priority for the local effects */ effects[current_effect].update(effects[current_effect].context); } -#define FORCE_EXPIRE_DURATION 100000ULL -static uint64_t forced_expire_time = 0; -uint32_t *force_buttons = NULL; -uint32_t *force_tt = NULL; - -static void forced_update() +static void button_lights_update() { - for (int i = 0; i < BUTTON_RGB_NUM; i++) { - int led = button_rgb_map[i]; - button_led_buf[led] = force_buttons[i]; + uint64_t now = time_us_64(); + if (now < override_button_expire_time) { + for (int i = 0; i < BUTTON_RGB_NUM; i++) { + int led = button_rgb_map[i]; + button_led_buf[led] = override_button_buf[i]; + } + return; } - memcpy(tt_led_buf, force_tt, TT_LED_NUM * sizeof(uint32_t)); + for (int i = 0; i < BUTTON_RGB_NUM; i++) { + int led = button_rgb_map[i]; + if (hid_lights[i] > 0) { + button_led_buf[led] = button_hsv(iidx_cfg->key_on[i]); + } else { + button_led_buf[led] = button_hsv(iidx_cfg->key_off[i]); + } + } } -void rgb_force_display(uint32_t *buttons, uint32_t *tt) +void rgb_override_tt(uint32_t *tt) { - force_buttons = buttons; - force_tt = tt; - forced_expire_time = time_us_64() + FORCE_EXPIRE_DURATION; + override_tt_buf = tt; + override_tt_expire_time = time_us_64() + OVERRIDE_EXPIRE; +} + +void rgb_override_button(uint32_t *button) +{ + override_button_buf = button; + override_button_expire_time = time_us_64() + OVERRIDE_EXPIRE; } static void wipe_out_tt_led() @@ -304,7 +334,7 @@ void rgb_init() gpio_set_drive_strength(BUTTON_RGB_PIN, GPIO_DRIVE_STRENGTH_2MA); ws2812_program_init(pio0, 0, pio0_offset, BUTTON_RGB_PIN, 800000, false); - /* We don't start the tt LED program yet */ + effect_reset(); } static void follow_mode_change() @@ -332,19 +362,22 @@ void rgb_update() follow_mode_change(); - set_effect(iidx_cfg->tt_led.effect); - if (time_us_64() > forced_expire_time) { - tt_lights_update(); - button_lights_update(); - } else { - forced_update(); - } + tt_lights_update(); + button_lights_update(); + drive_led(); } +static void trap() +{ + return; +} + void rgb_reg_tt_effect(tt_effect_t effect) { + if (effect_num >= EFFECT_MAX) { + return; + } effects[effect_num] = effect; effect_num++; - effects[effect_num] = (tt_effect_t) { trap, trap, trap, 0 }; } diff --git a/firmware/src/rgb.h b/firmware/src/rgb.h index 9bb4abd..7cb9f48 100644 --- a/firmware/src/rgb.h +++ b/firmware/src/rgb.h @@ -25,7 +25,8 @@ void rgb_set_level(uint8_t level); void rgb_set_button_light(uint16_t buttons); void rgb_set_hid_light(uint8_t const *lights, uint8_t num); -void rgb_force_display(uint32_t *keyboard, uint32_t *tt); +void rgb_override_tt(uint32_t *tt); +void rgb_override_button(uint32_t *button); typedef struct { void (*init)(uint32_t context); diff --git a/firmware/src/setup.c b/firmware/src/setup.c index 21957fa..b6ca88b 100644 --- a/firmware/src/setup.c +++ b/firmware/src/setup.c @@ -530,14 +530,16 @@ static struct { mode_func rotate; mode_func loop; mode_func enter; + bool tt_led; + bool button_led; } mode_defs[] = { - [MODE_NONE] = { nop, none_rotate, none_loop, nop}, - [MODE_TURNTABLE] = { tt_key_change, tt_rotate, tt_loop, tt_enter}, - [MODE_LEVEL] = { level_key_change, level_rotate, level_loop, nop}, - [MODE_TT_THEME] = { tt_theme_key_change, nop, tt_theme_loop, nop}, - [MODE_KEY_THEME] = { key_theme_key_change, nop, key_theme_loop, nop}, - [MODE_KEY_OFF] = { key_change, key_rotate, key_loop, key_enter}, - [MODE_KEY_ON] = { key_change, key_rotate, key_loop, key_enter}, + [MODE_NONE] = { nop, none_rotate, none_loop, nop, false, false }, + [MODE_TURNTABLE] = { tt_key_change, tt_rotate, tt_loop, tt_enter, true, true }, + [MODE_LEVEL] = { level_key_change, level_rotate, level_loop, nop, true, true }, + [MODE_TT_THEME] = { tt_theme_key_change, nop, tt_theme_loop, nop, false, true }, + [MODE_KEY_THEME] = { key_theme_key_change, nop, key_theme_loop, nop, false, true }, + [MODE_KEY_OFF] = { key_change, key_rotate, key_loop, key_enter, true, true }, + [MODE_KEY_ON] = { key_change, key_rotate, key_loop, key_enter, true, true }, }; static void join_mode(setup_mode_t new_mode) @@ -562,7 +564,7 @@ static void quit_mode(bool apply) current_mode = MODE_NONE; } -bool setup_run(uint16_t keys, uint16_t angle) +void setup_run(uint16_t keys, uint16_t angle) { setup_tick_ms = time_us_64() / 1000; input.keys = keys; @@ -586,8 +588,16 @@ bool setup_run(uint16_t keys, uint16_t angle) input.last_keys = keys; input.last_angle = angle; +} - return current_mode != MODE_NONE; +bool setup_needs_tt_led() +{ + return mode_defs[current_mode].tt_led; +} + +bool setup_needs_button_led() +{ + return mode_defs[current_mode].button_led; } void setup_init() diff --git a/firmware/src/setup.h b/firmware/src/setup.h index cf00854..4b78317 100644 --- a/firmware/src/setup.h +++ b/firmware/src/setup.h @@ -1,19 +1,21 @@ -/* - * Controller Setup - * WHowe - */ - -#ifndef SETUP_H -#define SETUP_H - -#include -#include -#include "board_defs.h" - -void setup_init(); -bool setup_run(uint16_t key_flag, uint16_t tt_angle); - -extern uint32_t setup_led_tt[]; -extern uint32_t setup_led_button[BUTTON_RGB_NUM]; - -#endif +/* + * Controller Setup + * WHowe + */ + +#ifndef SETUP_H +#define SETUP_H + +#include +#include +#include "board_defs.h" + +void setup_init(); +void setup_run(uint16_t key_flag, uint16_t tt_angle); +bool setup_needs_tt_led(); +bool setup_needs_button_led(); + +extern uint32_t setup_led_tt[]; +extern uint32_t setup_led_button[BUTTON_RGB_NUM]; + +#endif