1
0
mirror of https://github.com/whowechina/iidx_pico.git synced 2025-02-20 04:21:01 +01:00

Live view in tt theme setting

This commit is contained in:
whowechina 2024-12-19 10:42:52 +08:00
parent 2dcff302be
commit a7539dae9f
6 changed files with 137 additions and 79 deletions

Binary file not shown.

View File

@ -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();

View File

@ -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 };
}

View File

@ -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);

View File

@ -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()

View File

@ -1,19 +1,21 @@
/*
* Controller Setup
* WHowe <github.com/whowechina>
*/
#ifndef SETUP_H
#define SETUP_H
#include <stdint.h>
#include <stdbool.h>
#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 <github.com/whowechina>
*/
#ifndef SETUP_H
#define SETUP_H
#include <stdint.h>
#include <stdbool.h>
#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