From 4dfbc4e5f42e03a68cfadb5aa7376d1a7c6e3614 Mon Sep 17 00:00:00 2001 From: whowe Date: Tue, 8 Apr 2025 20:04:35 +0800 Subject: [PATCH] Live setup for light level and mode --- Production/Firmware/nos_pico.uf2 | Bin 105984 -> 104960 bytes firmware/src/CMakeLists.txt | 2 +- firmware/src/config.h | 6 + firmware/src/light.c | 20 ++- firmware/src/light.h | 2 + firmware/src/main.c | 6 +- firmware/src/setup.c | 247 +++++++++++++++++++++++++++++++ firmware/src/setup.h | 15 ++ 8 files changed, 295 insertions(+), 3 deletions(-) create mode 100644 firmware/src/setup.c create mode 100644 firmware/src/setup.h diff --git a/Production/Firmware/nos_pico.uf2 b/Production/Firmware/nos_pico.uf2 index c9c50b09c3ec95fb6f5cfcd8e263e1e530d55011..df8801897c7ecfb4fda9c52ebee2a11506da2153 100644 GIT binary patch literal 104960 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 LJ@_APK>L3H3F=4% literal 105984 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 diff --git a/firmware/src/CMakeLists.txt b/firmware/src/CMakeLists.txt index c5d8b6c..a29eb9a 100644 --- a/firmware/src/CMakeLists.txt +++ b/firmware/src/CMakeLists.txt @@ -1,7 +1,7 @@ function(make_firmware board board_def) pico_sdk_init() add_executable(${board} - main.c light.c hammer.c button.c savedata.c config.c commands.c cli.c + main.c light.c hammer.c button.c savedata.c setup.c config.c commands.c cli.c usb_descriptors.c) target_compile_definitions(${board} PUBLIC ${board_def}) pico_enable_stdio_usb(${board} 1) diff --git a/firmware/src/config.h b/firmware/src/config.h index cf27e63..0b9e118 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -29,6 +29,12 @@ typedef struct __attribute__((packed)) { bool midi : 1; uint8_t reserved[15]; } hid; + struct { + uint8_t b1; + uint8_t b2; + uint8_t b3; + uint8_t b4; + } buttons; } nos_cfg_t; typedef struct { diff --git a/firmware/src/light.c b/firmware/src/light.c index 85d8cf0..23af179 100644 --- a/firmware/src/light.c +++ b/firmware/src/light.c @@ -156,4 +156,22 @@ void light_set_logo(uint32_t color, bool hid) for (int i = 0; i < count_of(buf_logo); i++) { buf_logo[i] = apply_level(color, nos_cfg->light.level_logo); } -} \ No newline at end of file +} + + +void light_set_subkey(uint8_t index, bool upper, uint32_t color) +{ + if (index >= 28) { + return; + } + uint32_t new_color = apply_level(color, nos_cfg->light.level_key); + buf_key[index * 2 + (upper ? 0 : 1)] = new_color; +} + +void light_set_sublogo(uint8_t index, uint32_t color) +{ + if (index >= 6) { + return; + } + buf_logo[index] = apply_level(color, nos_cfg->light.level_logo); +} diff --git a/firmware/src/light.h b/firmware/src/light.h index 135d842..9531b57 100644 --- a/firmware/src/light.h +++ b/firmware/src/light.h @@ -21,5 +21,7 @@ uint32_t rgb32_from_hsv(uint8_t h, uint8_t s, uint8_t v); void light_set_key(uint8_t index, uint32_t color, bool hid); void light_set_logo(uint32_t color, bool hid); +void light_set_subkey(uint8_t index, bool up_down, uint32_t color); +void light_set_sublogo(uint8_t index, uint32_t color); #endif diff --git a/firmware/src/main.c b/firmware/src/main.c index 7803d63..3a95dac 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -25,6 +25,7 @@ #include "board_defs.h" #include "savedata.h" +#include "setup.h" #include "config.h" #include "cli.h" #include "commands.h" @@ -65,7 +66,9 @@ static void core1_loop() sleep_ms(500); while (1) { if (mutex_try_enter(&core1_io_lock, NULL)) { - run_lights(); + if (!setup_is_active()) { + run_lights(); + } light_update(); mutex_exit(&core1_io_lock); } @@ -146,6 +149,7 @@ static void core0_loop() proc_midi(); button_update(); hid_update(); + setup_update(); cli_fps_count(0); sleep_until(next_frame); diff --git a/firmware/src/setup.c b/firmware/src/setup.c new file mode 100644 index 0000000..0591219 --- /dev/null +++ b/firmware/src/setup.c @@ -0,0 +1,247 @@ +/* + * Live Setup + * WHowe + * + */ + +#include "setup.h" + +#include +#include + +#include "hardware/timer.h" + +#include "config.h" +#include "savedata.h" +#include "hammer.h" +#include "light.h" +#include "button.h" + +enum { + SETUP_NONE = 0, + SETUP_LEVEL_KEY, + SETUP_LEVEL_LOGO, + SETUP_LIGHT_MODE, + SETUP_BUTTON, + SETUP_HID, + SETUP_MAX, +}; + +#define MODE_COUNT (SETUP_MAX - 1) + +static nos_cfg_t cfg_bak; +static uint8_t level_key; +static uint8_t level_logo; + +static int setup_mode = SETUP_NONE; +static uint16_t last_pressed; +static uint16_t pressed; +static uint16_t just_pressed; +static bool temp_locked = false; + +static uint8_t fast_breath; +static uint8_t slow_breath; + +#define B1_PREV 1 +#define B2_NEXT 2 +#define B3_NO 4 +#define B4_YES 8 + +static void read_button() +{ + last_pressed = pressed; + pressed = button_read(); + just_pressed = pressed & ~last_pressed; +} + +static void run_mode_none() +{ + if (pressed == (B1_PREV | B2_NEXT | B3_NO | B4_YES)) { + cfg_bak.light = nos_cfg->light; + cfg_bak.hid = nos_cfg->hid; + level_key = nos_cfg->light.level_key; + level_logo = nos_cfg->light.level_logo; + nos_cfg->light.level_key = 240; + nos_cfg->light.level_logo = 240; + setup_mode = SETUP_LEVEL_KEY; + temp_locked = true; + } +} + +static void run_nav_lights() +{ + for (int i = 0; i < MODE_COUNT; i++) { + uint8_t h = (i * 255) / MODE_COUNT; + uint8_t s = 30; + uint8_t v = 16; + + if (setup_mode == i + 1) { + v = slow_breath; + s = 255; + } + + uint32_t color = rgb32_from_hsv(h, s, v); + light_set_sublogo(i, color); + } + + for (int i = MODE_COUNT; i < 6; i++) { + light_set_sublogo(i, 0); + } +} + +static void run_navigation() +{ + if (temp_locked && pressed) { + return; + } + temp_locked = false; + + if (just_pressed & B1_PREV) { + setup_mode = (setup_mode + MODE_COUNT - 2) % MODE_COUNT + 1; + } + if (just_pressed & B2_NEXT) { + setup_mode = setup_mode % MODE_COUNT + 1; + } + if (just_pressed & B3_NO) { + setup_mode = SETUP_NONE; + nos_cfg->light = cfg_bak.light; + nos_cfg->hid = cfg_bak.hid; + return; + } + if (just_pressed & B4_YES) { + setup_mode = SETUP_NONE; + nos_cfg->light.level_key = level_key; + nos_cfg->light.level_logo = level_logo; + savedata_save(true); + return; + } + + run_nav_lights(); +} + + +// Curve: y = k * x ^ 1.9 +static const uint8_t level_map[28] = { + 0, 2, 4, 7, 10, 14, 18, 24, 30, 36, 43, 51, 59, 68, 78, 88, + 99, 110, 122, 135, 148, 161, 175, 190, 206, 222, 238, 255 +}; + +static void run_level(bool key_or_logo) +{ + for (int i = 0; i < 28; i++) { + uint8_t step = level_map[i]; + if (hammer_pressed(i)) { + if (key_or_logo) { + level_key = step; + } else { + level_logo = step; + } + break; + } + } + + uint8_t level = key_or_logo ? level_key : level_logo; + + for (int i = 0; i < 28; i++) { + uint8_t step = level_map[i]; + uint32_t color = 0; + if (level >= step) { + color = rgb32_from_hsv(key_or_logo ? 0 : 51, 120, step); + } + light_set_subkey(i, false, color); + light_set_subkey(i, true, color); + } +} + +static void clear_key_lights() +{ + for (int i = 0; i < 28; i++) { + light_set_subkey(i, false, 0); + light_set_subkey(i, true, 0); + } +} + +static void run_light_mode() +{ + for (int i = 0; i < 4; i++) { + if (hammer_pressed(i * 2) || hammer_pressed(i * 2 + 1)) { + nos_cfg->light.type = i; + break; + } + } + + for (int i = 0; i < 4; i++) { + static const uint32_t colors[4] = { + 0x202020, 0x401010, 0x104010, 0x101040 + }; + light_set_subkey(i * 2, false, colors[i]); + light_set_subkey(i * 2 + 1, false, colors[i]); + + uint32_t color = 0; + if (i == nos_cfg->light.type) { + color = rgb32_from_hsv(102, 255, slow_breath); + } + light_set_subkey(i * 2, true, color); + light_set_subkey(i * 2 + 1, true, color); + } + + for (int i = 8; i < 28; i++) { + light_set_subkey(i, false, 0); + light_set_subkey(i, true, 0); + } +} + +static void run_button() +{ + clear_key_lights(); +} + +static void run_hid() +{ + clear_key_lights(); +} + +static void run_mode() +{ + if (setup_mode == SETUP_NONE) { + run_mode_none(); + } else if (setup_mode == SETUP_LEVEL_KEY) { + run_level(true); + } else if (setup_mode == SETUP_LEVEL_LOGO) { + run_level(false); + } else if (setup_mode == SETUP_LIGHT_MODE) { + run_light_mode(); + } else if (setup_mode == SETUP_BUTTON) { + run_button(); + } else if (setup_mode == SETUP_HID) { + run_hid(); + } +} + +static const uint8_t breath_level[] = { + 0, 0, 1, 2, 4, 6, 9, 12, 16, 21, 26, 33, 40, 47, 55, + 65, 74, 85, 96, 109, 122, 135, 150, 165, 182, + 182, 165, 150, 135, 122, 109, 96, 85, 74, 65, 55, 47, + 40, 33, 26, 21, 16, 12, 9, 6, 4, 2, 1, 0, 0 +}; + +static void update_masks() +{ + slow_breath = breath_level[(time_us_32() / 4777) % count_of(breath_level)]; + fast_breath = breath_level[(time_us_32() / 3777) % count_of(breath_level)]; +} + +void setup_update() +{ + read_button(); + run_mode(); + if (setup_mode != SETUP_NONE) { + run_navigation(); + } + update_masks(); +} + +bool setup_is_active() +{ + return setup_mode != SETUP_NONE; +} diff --git a/firmware/src/setup.h b/firmware/src/setup.h new file mode 100644 index 0000000..ee86c3d --- /dev/null +++ b/firmware/src/setup.h @@ -0,0 +1,15 @@ +/* + * Live Setup + * WHowe + */ + +#ifndef SETUP_H +#define SETUP_H + +#include +#include + +void setup_update(); +bool setup_is_active(); + +#endif