Skip to content
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

# CI/release binaries
default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, nodemcuv2_compat, esp8266_2m_compat, esp01_1m_full_compat, esp32dev, esp32dev_V4, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_16MB_opi, esp32s3dev_8MB_opi, esp32s3_4M_qspi, esp32_wrover, usermods

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove change

src_dir = ./wled00
data_dir = ./wled00/data
build_cache_dir = ~/.buildcache
Expand Down
56 changes: 54 additions & 2 deletions wled00/FX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,49 @@ static uint16_t chase(uint32_t color1, uint32_t color2, uint32_t color3, bool do
return FRAMETIME;
}

/**
* Chase_Race function to allow 3 colored bands to race along the LEDs with black between the colors.
* color1, color2, and color3 = colors of the three leaders in the race
*/

uint16_t chase_race(uint32_t color1, uint32_t color2, uint32_t color3)
{
uint16_t counter = strip.now * ((SEGMENT.speed >> 2) + 1);
uint16_t a = (counter * SEGLEN) >> 16;

// Use intensity setting to vary chase up to 1/2 string length
unsigned size = 1 + ((SEGMENT.intensity * SEGLEN) >> 10);
unsigned gap = 1 + size / 4; // Smaller black band size as a fraction of color size

// Calculate positions for each color band
uint16_t positions[] = {
a, // Start of color1
(a + size) % SEGLEN, // End of color1
(a + size + gap) % SEGLEN, // Start of color2
(a + size * 2 + gap) % SEGLEN, // End of color2
(a + size * 2 + gap * 2) % SEGLEN, // Start of color3
(a + size * 3 + gap * 2) % SEGLEN // End of color3
};

// Define compact lambda for filling LED segments using modulo
auto fillSegment = [](uint16_t start, uint16_t end, uint32_t color)
{
for (unsigned count = 0; count < SEGLEN && count < end - start + (end < start ? SEGLEN : 0); count++)
{
SEGMENT.setPixelColor((start + count) % SEGLEN, color);
}
};

// Set background to black
SEGMENT.fill(0);

// Fill the three color segments
fillSegment(positions[0], positions[1], color1);
fillSegment(positions[2], positions[3], color2);
fillSegment(positions[4], positions[5], color3);

return FRAMETIME;
}

/*
* Bicolor chase, more primary color.
Expand All @@ -933,6 +976,14 @@ uint16_t mode_chase_color(void) {
}
static const char _data_FX_MODE_CHASE_COLOR[] PROGMEM = "Chase@!,Width;!,!,!;!";

/*
* Chase Race with 3 color strips
*/
uint16_t chase_race()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the alias function, it does nothing but call the other one.

{
return chase_race(SEGCOLOR(0), SEGCOLOR(1), SEGCOLOR(2));
}
static const char _data_FX_MODE_CHASE_RACE[] PROGMEM = "Chase Race@!,Width;!,!,!;!";

/*
* Primary running followed by random color.
Expand Down Expand Up @@ -10183,7 +10234,7 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_MULTI_STROBE, &mode_multi_strobe, _data_FX_MODE_MULTI_STROBE);
addEffect(FX_MODE_BLINK_RAINBOW, &mode_blink_rainbow, _data_FX_MODE_BLINK_RAINBOW);
addEffect(FX_MODE_ANDROID, &mode_android, _data_FX_MODE_ANDROID);
addEffect(FX_MODE_CHASE_COLOR, &mode_chase_color, _data_FX_MODE_CHASE_COLOR);
addEffect(FX_MODE_CHASE_COLOR, &mode_chase_color, _data_FX_MODE_CHASE_COLOR);
addEffect(FX_MODE_CHASE_RANDOM, &mode_chase_random, _data_FX_MODE_CHASE_RANDOM);
addEffect(FX_MODE_CHASE_RAINBOW, &mode_chase_rainbow, _data_FX_MODE_CHASE_RAINBOW);
addEffect(FX_MODE_CHASE_FLASH, &mode_chase_flash, _data_FX_MODE_CHASE_FLASH);
Expand All @@ -10193,6 +10244,7 @@ void WS2812FX::setupEffectData() {
addEffect(FX_MODE_TRAFFIC_LIGHT, &mode_traffic_light, _data_FX_MODE_TRAFFIC_LIGHT);
addEffect(FX_MODE_COLOR_SWEEP_RANDOM, &mode_color_sweep_random, _data_FX_MODE_COLOR_SWEEP_RANDOM);
addEffect(FX_MODE_RUNNING_COLOR, &mode_running_color, _data_FX_MODE_RUNNING_COLOR);
addEffect(FX_MODE_CHASE_RACE, &chase_race, _data_FX_MODE_CHASE_RACE);
addEffect(FX_MODE_AURORA, &mode_aurora, _data_FX_MODE_AURORA);
addEffect(FX_MODE_RUNNING_RANDOM, &mode_running_random, _data_FX_MODE_RUNNING_RANDOM);
addEffect(FX_MODE_LARSON_SCANNER, &mode_larson_scanner, _data_FX_MODE_LARSON_SCANNER);
Expand Down Expand Up @@ -10388,4 +10440,4 @@ addEffect(FX_MODE_PSFIRE1D, &mode_particleFire1D, _data_FX_MODE_PS_FIRE1D);
addEffect(FX_MODE_PS1DSONICSTREAM, &mode_particle1Dsonicstream, _data_FX_MODE_PS_SONICSTREAM);
#endif // WLED_DISABLE_PARTICLESYSTEM1D

}
}
4 changes: 2 additions & 2 deletions wled00/FX.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,8 @@ extern byte realtimeMode; // used in getMappedPixelIndex()
#define FX_MODE_PS1DGEQ 212
#define FX_MODE_PSFIRE1D 213
#define FX_MODE_PS1DSONICSTREAM 214
#define MODE_COUNT 215

#define FX_MODE_CHASE_RACE 215
#define MODE_COUNT 216

#define BLEND_STYLE_FADE 0x00 // universal
#define BLEND_STYLE_FAIRY_DUST 0x01 // universal
Expand Down