Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 9Rmain
  • anon/gpndemo
  • anon/update-sim
  • anon/webflasher
  • audio_input
  • audio_io
  • bl00mbox
  • bl00mbox_old
  • captouch-threshold
  • ch3/bl00mbox_docs
  • ci-1690580595
  • compressor
  • dev_p4
  • dev_p4-iggy
  • dev_p4-iggy-rebased
  • dos
  • dos-main-patch-50543
  • events
  • fm_fix
  • fm_fix2
  • fpletz/flake
  • history-rewrite
  • icon-flower
  • iggy/stemming
  • iggy/stemming_merge
  • json-error
  • main
  • main+schneider
  • media-buf
  • micropython_api
  • moon2_applications
  • moon2_demo_temp
  • moon2_gay_drums
  • passthrough
  • phhw
  • pippin/display-python-errors-on-display
  • pippin/make_empty_drawlists_skip_render_and_blit
  • pippin/media_framework
  • pippin/uhm_flash_access_bust
  • pressable_bugfix
  • q3k/doom-poc
  • rahix/big-flow3r
  • rahix/flow3rseeds
  • raw_captouch_new
  • raw_captouch_old
  • release/1.0.0
  • release/1.1.0
  • release/1.1.1
  • rev4_micropython
  • schneider/application-remove-name
  • schneider/bhi581
  • schneider/factory_test
  • schneider/recovery
  • scope
  • scope_hack
  • sdkconfig-spiram-tinyusb
  • sec/auto-nick
  • sec/blinky
  • simtest
  • slewtest
  • t
  • test
  • test2
  • uctx-wip
  • view-think
  • vm-pending
  • vsync
  • wave
  • wip-docs
  • wip-tinyusb
  • v1.0.0
  • v1.0.0+rc1
  • v1.0.0+rc2
  • v1.0.0+rc3
  • v1.0.0+rc4
  • v1.0.0+rc5
  • v1.0.0+rc6
  • v1.1.0
  • v1.1.0+rc1
  • v1.1.1
  • v1.2.0
  • v1.2.0+rc1
  • v1.3.0
83 results

Target

Select target project
  • flow3r/flow3r-firmware
  • Vespasian/flow3r-firmware
  • alxndr42/flow3r-firmware
  • pl/flow3r-firmware
  • Kari/flow3r-firmware
  • raimue/flow3r-firmware
  • grandchild/flow3r-firmware
  • mu5tach3/flow3r-firmware
  • Nervengift/flow3r-firmware
  • arachnist/flow3r-firmware
  • TheNewCivilian/flow3r-firmware
  • alibi/flow3r-firmware
  • manuel_v/flow3r-firmware
  • xeniter/flow3r-firmware
  • maxbachmann/flow3r-firmware
  • yGifoom/flow3r-firmware
  • istobic/flow3r-firmware
  • EiNSTeiN_/flow3r-firmware
  • gnudalf/flow3r-firmware
  • 999eagle/flow3r-firmware
  • toerb/flow3r-firmware
  • pandark/flow3r-firmware
  • teal/flow3r-firmware
  • x42/flow3r-firmware
  • alufers/flow3r-firmware
  • dos/flow3r-firmware
  • yrlf/flow3r-firmware
  • LuKaRo/flow3r-firmware
  • ThomasElRubio/flow3r-firmware
  • ai/flow3r-firmware
  • T_X/flow3r-firmware
  • highTower/flow3r-firmware
  • beanieboi/flow3r-firmware
  • Woazboat/flow3r-firmware
  • gooniesbro/flow3r-firmware
  • marvino/flow3r-firmware
  • kressnerd/flow3r-firmware
  • quazgar/flow3r-firmware
  • aoid/flow3r-firmware
  • jkj/flow3r-firmware
  • naomi/flow3r-firmware
41 results
Select Git revision
  • 89-apps-should-be-able-to-specify-if-they-want-wifi-to-be-disabled-when-entering-them
  • 9Rmain
  • allow-reloading-sunmenu
  • always-have-a-wifi-instance
  • anon/gpndemo
  • anon/update-sim
  • anon/webflasher
  • app_text_viewer
  • audio_input
  • audio_io
  • blm_dev_chan
  • ch3/bl00mbox_docs
  • ci-1690580595
  • dev_p4
  • dev_p4-iggy
  • dev_p4-iggy-rebased
  • dx/dldldld
  • dx/fb-save-restore
  • dx/hint-hint
  • dx/jacksense-headset-mic-only
  • events
  • fil3s-limit-filesize
  • fil3s-media
  • fpletz/flake
  • gr33nhouse-improvements
  • history-rewrite
  • icon-flower
  • iggy/stemming
  • iggy/stemming_merge
  • led_fix_fix
  • main
  • main+schneider
  • media_has_video_has_audio
  • micropython_api
  • mixer2
  • moon2_demo_temp
  • moon2_migrate_apps
  • more-accurate-battery
  • pippin/ctx_sprite_sheet_support
  • pippin/display-python-errors-on-display
  • pippin/make_empty_drawlists_skip_render_and_blit
  • pippin/more-accurate-battery
  • pippin/tcp_redirect_hack
  • pippin/tune_ctx_config_update_from_upstream
  • pippin/uhm_flash_access_bust
  • pressable_bugfix
  • py_only_update_fps_overlay_when_changing
  • q3k/doom-poc
  • q3k/render-to-texture
  • rahix/flow3rseeds
  • raw_captouch_new
  • raw_captouch_old
  • release/1.0.0
  • release/1.1.0
  • release/1.1.1
  • release/1.2.0
  • release/1.3.0
  • release/1.4.0
  • restore_blit
  • return_of_melodic_demo
  • rev4_micropython
  • schneider/application-remove-name
  • schneider/bhi581
  • schneider/factory_test
  • schneider/recovery
  • scope_hack
  • sdkconfig-spiram-tinyusb
  • sec/auto-nick
  • sec/blinky
  • sector_size_512
  • shoegaze-fps
  • smaller_gradient_lut
  • store_delta_ms_and_ins_as_class_members
  • task_cleanup
  • uctx-wip
  • w1f1-in-sim
  • widgets_draw
  • wifi-json-error-handling
  • wip-docs
  • wip-tinyusb
  • v1.0.0
  • v1.0.0+rc1
  • v1.0.0+rc2
  • v1.0.0+rc3
  • v1.0.0+rc4
  • v1.0.0+rc5
  • v1.0.0+rc6
  • v1.1.0
  • v1.1.0+rc1
  • v1.1.1
  • v1.2.0
  • v1.2.0+rc1
  • v1.3.0
  • v1.4.0
94 results
Show changes
Commits on Source (1)
  • dos's avatar
    st3m: leds: Scale the slew rate for each channel separately · 03762590
    dos authored
    The reason why this is needed is pretty easy to observe when
    taking a color like (1.0, 0.75, 0.0), which appears yellow,
    and transitioning it to (0.0, 0.0, 0.0). Without this,
    all the channel values get reduced at constant rate, meaning
    that the green channel will reach zero much earlier than
    the red one, so in the middle of transition the yellow color
    will turn into red.
    
    To prevent that and preserve the hue, desaturate only the channel
    with the greatest difference from target at full rate and scale
    the rest in relation to that one. This way the transition still
    takes the exact same time, but doesn't go through unexpected
    color hues during it.
    Verified
    03762590
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#define TAU360 0.017453292519943295 #define TAU360 0.017453292519943295
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
static const char *TAG = "st3m-leds"; static const char *TAG = "st3m-leds";
typedef struct { typedef struct {
...@@ -66,7 +68,8 @@ static void set_single_led(uint8_t index, st3m_u8_rgb_t c) { ...@@ -66,7 +68,8 @@ static void set_single_led(uint8_t index, st3m_u8_rgb_t c) {
flow3r_bsp_leds_set_pixel(index, c.r, c.g, c.b); flow3r_bsp_leds_set_pixel(index, c.r, c.g, c.b);
} }
static uint16_t led_get_slew(uint16_t old, uint16_t new, uint16_t slew) { static uint16_t led_get_slew(uint16_t old, uint16_t new, uint16_t slew,
uint16_t factor) {
new = new << 8; new = new << 8;
if (slew == 255 || (old == new)) return new; if (slew == 255 || (old == new)) return new;
int16_t bonus = ((int16_t)slew) - 225; int16_t bonus = ((int16_t)slew) - 225;
...@@ -74,6 +77,7 @@ static uint16_t led_get_slew(uint16_t old, uint16_t new, uint16_t slew) { ...@@ -74,6 +77,7 @@ static uint16_t led_get_slew(uint16_t old, uint16_t new, uint16_t slew) {
if (bonus > 0) { if (bonus > 0) {
slew += 62 * bonus * bonus; slew += 62 * bonus * bonus;
} }
slew = ((uint32_t)slew * factor) >> 8;
if (new > old + slew) { if (new > old + slew) {
return old + slew; return old + slew;
...@@ -110,13 +114,21 @@ void st3m_leds_update_hardware() { ...@@ -110,13 +114,21 @@ void st3m_leds_update_hardware() {
for (int i = 0; i < 40; i++) { for (int i = 0; i < 40; i++) {
st3m_u8_rgb_t ret = state.target[i]; st3m_u8_rgb_t ret = state.target[i];
st3m_u16_rgb_t c;
st3m_u16_rgb_t prev = state.slew_output[i]; st3m_u16_rgb_t prev = state.slew_output[i];
c.r = led_get_slew(prev.r, ret.r, state.slew_rate); st3m_u16_rgb_t c = prev;
c.g = led_get_slew(prev.g, ret.g, state.slew_rate); uint16_t diff_r = abs((int32_t)prev.r - (ret.r << 8u));
c.b = led_get_slew(prev.b, ret.b, state.slew_rate); uint16_t diff_g = abs((int32_t)prev.g - (ret.g << 8u));
if ((prev.r != c.r) || (prev.g != c.g) || (prev.b != c.b)) uint16_t diff_b = abs((int32_t)prev.b - (ret.b << 8u));
uint16_t max_diff = MAX(MAX(diff_r, diff_g), diff_b);
if (max_diff) {
c.r = led_get_slew(prev.r, ret.r, state.slew_rate,
((uint32_t)diff_r * 256) / max_diff);
c.g = led_get_slew(prev.g, ret.g, state.slew_rate,
((uint32_t)diff_g * 256) / max_diff);
c.b = led_get_slew(prev.b, ret.b, state.slew_rate,
((uint32_t)diff_b * 256) / max_diff);
is_steady = false; is_steady = false;
}
state.slew_output[i] = c; state.slew_output[i] = c;
c.r = ((uint32_t)c.r * state.brightness) >> 8; c.r = ((uint32_t)c.r * state.brightness) >> 8;
......