diff --git a/Production/Firmware/iidx_pico.uf2 b/Production/Firmware/iidx_pico.uf2 index f0d67bf..331ba59 100644 Binary files a/Production/Firmware/iidx_pico.uf2 and b/Production/Firmware/iidx_pico.uf2 differ 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