Skip to content

Commit

Permalink
Merge pull request Aircoookie#3552 from TripleWhy/seedRandom16
Browse files Browse the repository at this point in the history
Seed FastLED's RNG
  • Loading branch information
blazoncek authored and softhack007 committed Dec 12, 2023
1 parent 68dc4d1 commit 451243c
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 12 deletions.
24 changes: 12 additions & 12 deletions wled00/FX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1722,7 +1722,7 @@ uint16_t mode_multi_comet(void) {
}
comets[i]++;
} else {
if(!random(SEGLEN)) {
if(!random16(SEGLEN)) {
comets[i] = 0;
}
}
Expand Down Expand Up @@ -2074,7 +2074,7 @@ uint16_t mode_fire_2012() {

// Step 1. Cool down every cell a little
for (int i = 0; i < SEGLEN; i++) {
uint8_t cool = (it != SEGENV.step) ? random8((((20 + SEGMENT.speed/3) * 16) / SEGLEN)+2) : random(4);
uint8_t cool = (it != SEGENV.step) ? random8((((20 + SEGMENT.speed/3) * 16) / SEGLEN)+2) : random8(4);
uint8_t minTemp = (i<ignition) ? (ignition-i)/4 + 16 : 0; // should not become black in ignition area
uint8_t temp = qsub8(heat[i], cool);
heat[i] = temp<minTemp ? minTemp : temp;
Expand Down Expand Up @@ -4580,15 +4580,15 @@ class AuroraWave {

public:
void init(uint32_t segment_length, CRGB color) {
ttl = random(500, 1501);
ttl = random16(500, 1501);
basecolor = color;
basealpha = random(60, 101) / (float)100;
basealpha = random8(60, 101) / (float)100;
age = 0;
width = random(segment_length / 20, segment_length / W_WIDTH_FACTOR); //half of width to make math easier
width = random16(segment_length / 20, segment_length / W_WIDTH_FACTOR); //half of width to make math easier
if (!width) width = 1;
center = random(101) / (float)100 * segment_length;
goingleft = random(0, 2) == 0;
speed_factor = (random(10, 31) / (float)100 * W_MAX_SPEED / 255);
center = random8(101) / (float)100 * segment_length;
goingleft = random8(0, 2) == 0;
speed_factor = (random8(10, 31) / (float)100 * W_MAX_SPEED / 255);
alive = true;
}

Expand Down Expand Up @@ -4673,7 +4673,7 @@ uint16_t mode_aurora(void) {
waves = reinterpret_cast<AuroraWave*>(SEGENV.data);

for (int i = 0; i < SEGENV.aux1; i++) {
waves[i].init(SEGLEN, CRGB(SEGMENT.color_from_palette(random8(), false, false, random(0, 3))));
waves[i].init(SEGLEN, CRGB(SEGMENT.color_from_palette(random8(), false, false, random8(0, 3))));
}
} else {
waves = reinterpret_cast<AuroraWave*>(SEGENV.data);
Expand All @@ -4685,7 +4685,7 @@ uint16_t mode_aurora(void) {

if(!(waves[i].stillAlive())) {
//If a wave dies, reinitialize it starts over.
waves[i].init(SEGLEN, CRGB(SEGMENT.color_from_palette(random8(), false, false, random(0, 3))));
waves[i].init(SEGLEN, CRGB(SEGMENT.color_from_palette(random8(), false, false, random8(0, 3))));
}
}

Expand Down Expand Up @@ -5993,7 +5993,7 @@ uint16_t mode_2Dghostrider(void) {
if (lighter->reg[i]) {
lighter->lightersPosY[i] = lighter->gPosY;
lighter->lightersPosX[i] = lighter->gPosX;
lighter->Angle[i] = lighter->gAngle + random(-10, 10);
lighter->Angle[i] = lighter->gAngle + ((int)random8(20) - 10);
lighter->time[i] = 0;
lighter->reg[i] = false;
} else {
Expand Down Expand Up @@ -6928,7 +6928,7 @@ uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline.

uint16_t size = 0;
uint8_t fadeVal = map(SEGMENT.speed,0,255, 224, 254);
uint16_t pos = random(SEGLEN); // Set a random starting position.
uint16_t pos = random16(SEGLEN); // Set a random starting position.

um_data_t *um_data;
if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) {
Expand Down
13 changes: 13 additions & 0 deletions wled00/wled.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -735,7 +735,20 @@ void WLED::setup()
DEBUG_PRINT(pcTaskGetTaskName(NULL)); DEBUG_PRINT(F(" free stack ")); DEBUG_PRINTLN(uxTaskGetStackHighWaterMark(NULL));
#endif

// Seed FastLED random functions with an esp random value, which already works properly at this point.

This comment has been minimized.

Copy link
@softhack007

softhack007 Dec 12, 2023

Collaborator

@ewoudwijma this part causes fastled random16() to always be initialised with a different seed at startup.

Please check if that's compatible with sypersync. If it makes things worse, simply comment out the new code block.

#if defined(ARDUINO_ARCH_ESP32)
uint32_t seed32 = esp_random();
seed32 ^= random(); // WLEDMM some extra entropy (for older frameworks where esp_ramdom alone might be too predictable after startup)
#elif defined(ARDUINO_ARCH_ESP8266)
const uint32_t seed32 = RANDOM_REG32;
#else
const uint32_t seed32 = random(std::numeric_limits<long>::max());
#endif
random16_set_seed((uint16_t)((seed32 & 0xFFFF) ^ (seed32 >> 16)));

#if WLED_WATCHDOG_TIMEOUT > 0
enableWatchdog();
#endif

#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_DISABLE_BROWNOUT_DET)
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1); //enable brownout detector
Expand Down

2 comments on commit 451243c

@ewoudwijma
Copy link
Collaborator

Choose a reason for hiding this comment

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

Think it is okay, just go ahead and we will test it.
@troyhacks , where are we with super sync ?

@troyhacks
Copy link
Collaborator

Choose a reason for hiding this comment

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

Well, I'm deep inside of other code now. 🤣

I don't think it matters - I'd merge and we can test.

Right now my SuperSync stuff is in use on other test projects for WLED, but we will find out quickly enough and patch it back if needed.

Please sign in to comment.