diff --git a/firmware/retro_tech_fw/user/src/led.c b/firmware/retro_tech_fw/user/src/led.c index 67bc12c..f2631fc 100644 --- a/firmware/retro_tech_fw/user/src/led.c +++ b/firmware/retro_tech_fw/user/src/led.c @@ -13,7 +13,7 @@ static const uint8_t rgb_map[9] = {0x04, 0x14, 0x01, 0x11, 0x07, 0x0a, 0x1a, 0x0d, 0x1d}; -static const uint8_t cursor_map[3] = {0x17, 0x18, 0x19}; +static const uint8_t cursor_map[3] = {0x16, 0x17, 0x18}; static const uint8_t LED_CIE_PWM_256I_256O[] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, diff --git a/firmware/retro_tech_fw/user/src/led_rgbprog.c b/firmware/retro_tech_fw/user/src/led_rgbprog.c index b82aec5..5ad45e2 100644 --- a/firmware/retro_tech_fw/user/src/led_rgbprog.c +++ b/firmware/retro_tech_fw/user/src/led_rgbprog.c @@ -10,6 +10,7 @@ #include "hsv2rgb.h" #include "led.h" #include "rand.h" +#include "ui.h" // led programs @@ -358,18 +359,22 @@ void led_rgb_3_alternate(uint8_t preview, uint8_t tick) #define TYPING_CHAR_DELAY_MIN 12 // about 1/10 of a second #define TYPING_CHAR_DELAY_MAX 500 // just shy of 4 seconds -static const uint8_t idle_glow[3] = {12, 8, 8}; +// the idle thing looked like shit. +// it's also broken. +// instead of removing, just set to 0 for now, +// and maybe address it later. +static const uint8_t idle_glow[3] = {0, 0, 0}; // {12, 8, 8}; static const uint8_t typing[3][3] = { {255, 240, 240}, // white { 0, 240, 0}, // green {255, 96, 12}, // orange }; -static uint8_t typing_idx; -static uint16_t typing_char_delay; +static uint8_t typing_idx = 255; +static uint16_t typing_char_delay = 0; -static uint8_t typing_flash_state; -static uint8_t typing_flash_delay; +static uint8_t typing_flash_state = 0; +static uint8_t typing_flash_delay = 0; static uint8_t typing_fadeout; @@ -380,6 +385,7 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) uint8_t w; uint16_t s; uint8_t color; + uint8_t update = 0; // match cursor color (well, approximate, or go green) color = userconf.cursor_color; @@ -390,8 +396,10 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) typing_flash_state++; typing_flash_state &= 1; - typing_flash_delay = userconf.cursor_flash; + typing_flash_delay = cursor_flash_rates[userconf.cursor_flash]; + update = 1; } + typing_flash_delay--; // set rgb colors as appropriate @@ -417,12 +425,13 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) rgb[i][0] >>= w; if (rgb[i][0] < idle_glow[0]) rgb[i][0] = idle_glow[0]; rgb[i][1] >>= w; if (rgb[i][1] < idle_glow[1]) rgb[i][1] = idle_glow[1]; rgb[i][2] >>= w; if (rgb[i][2] < idle_glow[2]) rgb[i][2] = idle_glow[2]; + update = 1; } } } // set cursor as appropriate - for (i = 0; i < 2; i++) { + for (i = 0; i < 3; i++) { cursor[i] = 0; } @@ -442,7 +451,7 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) else typing_fadeout = 0; for (i = 0; i < 9; i++) { - for (j = 0; j < 2; j++) { + for (j = 0; j < 3; j++) { s = rgb[i][j]; s *= typing_fadeout; rgb[i][j] = s >> 8; @@ -455,7 +464,7 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) } // are we on the next character? - if (!(--typing_char_delay)) { + if (!typing_char_delay) { // next character typing_idx++; @@ -463,8 +472,8 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) // at the cursor, we wait two max periods typing_char_delay = TYPING_CHAR_DELAY_MAX << 1; } else if (typing_idx == 10) { - // at the end, we wait half of one max period - typing_char_delay = TYPING_CHAR_DELAY_MAX >> 1; + // at the end, we wait one max period + typing_char_delay = TYPING_CHAR_DELAY_MAX; } else { typing_char_delay = prng_scale16(TYPING_CHAR_DELAY_MIN, TYPING_CHAR_DELAY_MAX); } @@ -479,6 +488,12 @@ void led_rgb_4_typing(uint8_t preview, uint8_t tick) typing_flash_state = 0; typing_flash_delay = 0; } + + typing_char_delay--; + + if (update) { + led_is_updated(); + } } diff --git a/firmware/retro_tech_fw/user/src/rand.c b/firmware/retro_tech_fw/user/src/rand.c index a8082ba..ecdf5af 100644 --- a/firmware/retro_tech_fw/user/src/rand.c +++ b/firmware/retro_tech_fw/user/src/rand.c @@ -151,12 +151,12 @@ static uint32_t tinymt32_temper (tinymt32_t* s) uint16_t prng_scale16(uint16_t min, uint16_t max) { - uint16_t rnd; + uint32_t rnd; rnd = prng_get16(); rnd *= (max - min); rnd >>= 16; rnd += min; - return rnd; + return (uint16_t)rnd; } diff --git a/firmware/retro_tech_fw/user/src/ui.c b/firmware/retro_tech_fw/user/src/ui.c index 9c9e024..fdea3a1 100644 --- a/firmware/retro_tech_fw/user/src/ui.c +++ b/firmware/retro_tech_fw/user/src/ui.c @@ -38,7 +38,7 @@ static uint8_t target_gc = 0; static uint8_t cursor_flash = 0; static uint8_t cursor_state = 0xff; -static const uint16_t cursor_flash_rates[] = { // off-to-on flash rates in 1/256 second increments +const uint16_t cursor_flash_rates[8] = { // off-to-on flash rates in 1/256 second increments 255, // (0.5 on-off/second) 191, // (0.75 on-off/second) 127, // (1.0 on-off/second) diff --git a/firmware/retro_tech_fw/user/src/ui.h b/firmware/retro_tech_fw/user/src/ui.h index e552446..3cf6292 100644 --- a/firmware/retro_tech_fw/user/src/ui.h +++ b/firmware/retro_tech_fw/user/src/ui.h @@ -10,6 +10,10 @@ +extern const uint16_t cursor_flash_rates[8]; + + + void ui_init(); void ui_render();