Commit Graph

117 Commits

Author SHA1 Message Date
Damian Schneider
76cb2e9988 Improvements to heap-memory and PSRAM handling (#4791)
* Improved heap and PSRAM handling

- Segment `allocateData()` uses more elaborate DRAM checking to reduce fragmentation and allow for larger setups to run on low heap
- Segment data allocation fails if minimum contiguous block size runs low to keep the UI working
- Increased `MAX_SEGMENT_DATA` to account for better segment data handling
- Memory allocation functions try to keep enough DRAM for segment data
- Added constant `PSRAM_THRESHOLD` to improve PSARM usage
- Increase MIN_HEAP_SIZE to reduce risk of breaking UI due to low memory for JSON response
- ESP32 makes use of IRAM (no 8bit access) for pixeluffers, freeing up to 50kB of RAM
- Fix to properly get available heap on all platforms: added function `getFreeHeapSize()`
- Bugfix for effects that divide by SEGLEN: don't run FX in service() if segment is not active
-Syntax fix in AR: calloc() uses (numelements, size) as arguments

* Added new functions for allocation and heap checking

- added `allocate_buffer()` function that can be used to allocate large buffers: takes parameters to set preferred ram location, including 32bit accessible RAM on ESP32. Returns null if heap runs low or switches to PSRAM
- getFreeHeapSize() and getContiguousFreeHeap() helper functions for all platforms to correctly report free useable heap
- updated some constants
- updated segment data allocation to free the data if it is large

- replaced "psramsafe" variable with it's #ifdef: BOARD_HAS_PSRAM and made accomodating changes
- added some compile-time checks to handle invalid env. definitions
- updated all allocation functions and some of the logic behind them
- added use of fast RTC-Memory where available
- increased MIN_HEAP_SIZE for all systems (improved stability in tests)
- updated memory calculation in web-UI to account for required segment buffer
- added UI alerts if buffer allocation fails
- made getUsedSegmentData() non-private (used in buffer alloc function)
- changed MAX_SEGMENT_DATA
- added more detailed memory log to DEBUG output
- added debug output to buffer alloc function
2025-09-16 19:46:16 +02:00
Damian Schneider
a037d99469 added debug output on crash, removed whitespaces 2025-09-01 22:22:16 +02:00
Will Miles
6f914d79b1 Increase boot loop timeout
Any repeating crash that prevents a human from logging in and fixing
the config should be treated as a boot loop.  Increase the detection
timeout, so anything that's fast enough to preclude a user fix will
trigger the recovery behaviour.
2025-08-28 21:17:12 -04:00
Will Miles
dd13c2df47 Reset crash counter after long interval
Don't treat consecutive but infrequent crashes as bootloops.  The
bootloop recovery actions only make sense when there is no opportunity
for a user to reconfigure their system.

Suggested by @coderabbitai
2025-08-28 21:10:39 -04:00
Will Miles
46f3bc0ced Bootloop: Include soft wdt on ESP8266 2025-08-26 21:00:54 -04:00
Will Miles
85d4db83ed Isolate platform differences in bootloop check
Separate the platform-specific code from the logic, so any future
changes can be made in fewer places.
2025-08-20 11:32:32 -04:00
Will Miles
5146926723 Use direct references to RTC RAM on ESP8266
ESP8266 RTC RAM requires 32-bit accesses, but there's no need to jump
through a bunch of functions for it.  Use references to simplify access
and harmonize the implementation with ESP32.
2025-08-20 10:22:42 -04:00
Will Miles
3b5c6ca284 Fix bootloop if config is reset (#4852)
* Fix bootloop if config missing/reset

Can't reset the config if there's nothing to reset!

* ESP8266: Commit ACTIONT_TRACKER

* Use consistent naming for backups and reset cfgs

Use 'rst.cfg.json' instead of 'cfg.json.rst.json' for configs that were
reset.

* Add a little more PSTR to bootloop handling
2025-08-20 07:37:14 +02:00
Damian Schneider
f4d89c4196 add IDF V3 support for bootloop detection 2025-08-16 08:45:41 +02:00
Damian Schneider
c9c442a933 Bootloop detection & recovery (#4793)
* added boot loop detection and config backup
* automatic OTA rollback if loading backup does not fix it
* added new file handling functions
* adding verification of json files, added config restore at bootup if broken
* added function to compare contents of two files for future use (currently not used)
2025-08-15 20:43:04 +02:00
Damian Schneider
e2f5becdd0 Bugfixes in FX data allocation (#4783)
- Bugfixes in FX data allocation: realloc was not handled properly.
- Added *intermediate* fix for waitForIt(), see https://github.com/wled/WLED/issues/4779
- Bugfix in 1D->2D expansions: corner-expansion MUST be boundary checked as it blindly writes the max dimension
- removed some realloc(), improving fragmentation on large setups
- increased min heap constant
- ESP32 C3 has no PSRAM, it now uses default alloc functions
- also added missing UI info for "Error 7"
2025-07-23 06:42:06 +02:00
Blaž Kristan
c934776f45 Address issues reported 2025-04-26 20:08:15 +02:00
Blaž Kristan
ee9ac947a1 Segment layering & effect blending improvements
- Photoshop-style segment/layer blending
- return of strip ABL
- remove global LED buffer in favour of segment-local buffer
- new effect blending modes/transitions
- custom palettes moved out of WS2812FX class
- increased limits (matrix size, LED RAM)
- added "rainbow"-mode colorwheel
- replaced palettes with gamma unmodified ones
- move gamma adjustment to last step before sending to LEDs
- Segment & WS2812FX class reorganisation (mutable members, reordered members, protected members)
2025-04-22 22:37:18 +02:00
Damian Schneider
229e7b940f added ranges, removed unused code 2025-03-12 19:58:32 +01:00
Damian Schneider
95dcb03f6d updated scaling 2025-03-12 06:56:33 +01:00
Damian Schneider
4ecc531998 updated scaling, improved hashing, updated rotozoomer to not use a buffer 2025-03-08 12:48:27 +01:00
Damian Schneider
5e8073022b 3D works but needs finetuning to match old looks 2025-03-07 06:39:49 +01:00
Damian Schneider
9553425374 some speed improvements using better hash, scaling is still off...
needs a proper scaling analysis of all steps in all resolutions to minimize errors.
2025-03-04 07:55:41 +01:00
Damian Schneider
2012317bc9 initial version, basically working but repetitive patterns, work in progress 2025-03-03 06:57:16 +01:00
Blaž Kristan
d7103cd75c Merge pull request #4262 from blazoncek/large-ledmap
Large ledmap support
2025-02-19 13:43:52 +01:00
maxi4329
aa3fb7d165 update links to point to the new repo 2025-02-15 20:07:41 +01:00
Blaž Kristan
3a426e258b Merge branch 'main' into blending-styles 2025-01-20 11:19:43 +01:00
Blaž Kristan
b062d1ee3e Merge branch 'main' into large-ledmap 2025-01-20 09:03:55 +01:00
Blaž Kristan
01c463c8e8 More tuning
- replaced POD new/delete with malloc/free
- some more SEGLEN <= 1
- some gnu::pure
- more const attributes
- some static attributes
2025-01-19 07:35:46 +01:00
Frank
90c2955a71 avoid using keywords for variables: module, final
these are reserved names and future compilers may reject them.
2025-01-19 07:35:46 +01:00
Frank
7be868db12 bugfix: indexOf() returns -1 if string not found
... so we must use `int` instead of `unsigned`
2025-01-19 07:35:46 +01:00
Blaž Kristan
a65f97ac75 Merge branch 'main' into blending-styles 2025-01-14 22:39:20 +01:00
Damian Schneider
5f77478841 Replace PRNG with hardware RNG (#4225)
Both ESP8266 and ESP32 have a hardware random register. This update makes use of that. It is slightly faster than the fastled variants but mostly it is truly random, even when the timing limitations stated in the datasheet are disregarded. Also saves a bit on code size.

- Replaced all random8() and random16() calls with new hw_random() versions
- Not replaced in FX where PRNG is required
2024-12-20 19:12:29 +01:00
Blaž Kristan
4758b5efe8 Proper fix for #3605 & #4346
- allow incrementing/decrementing as specified in API
2024-12-07 10:11:25 +01:00
Blaž Kristan
ba5ec57e4d Enumeration support. 2024-11-09 11:33:10 +01:00
Damian Schneider
7b855c851d Added integer based sin()/cos() functions, changed all trig functions to wled_math
- `sin16_t() / cos16_t()` are faster and more accurate than fastled versions
- `sin_approx() / cos_approx()` are float wrappers for `sin16_t() / cos16_t()` and are accurate enough to replace `sinf()/cosf()`
- `atan2()` is used only in octopus to calculate center offset, new approximated version saves flash
- `tan(), atan(), asin(), acos(), floor(), fmod()` are used only for sunrise/sunset calculation, using wled_math version saves flash
- `beatsinx()` replacements are to make use of new `sin16_t()/sin8_t()` functions to reduce flash size
- Extensively tested surnise/sunset calculation: deviation is 1min. max
- Tested some of the relevant FX and found no visual difference: Julia, 2D Drift, Drift Rose, Ghost rider, Rotozoomer, Palette, Arc 1D expansion
- total flash savings: 7.4k
2024-10-05 12:32:41 +02:00
Will Miles
45cf90094a Rename destination for getSettingsJS
Use a name that makes it a bit clearer what the output is.  The new name
is applied consistently through most uses.
Usermods are not yet updated.
2024-09-18 23:35:36 -04:00
Blaz Kristan
ae1df20893 New names 2024-09-18 23:32:15 -04:00
Will Miles
71148740d4 Replace sappend and sappends
Use named functions to describe what's being printed.
2024-09-18 23:31:19 -04:00
Will Miles
32f9616b6e Remove oappend
Remove the large stack buffer as we're just going to copy it in to a
heap buffer anyways.  Later we can refine the length estimation or use a
rope-style dynamic data structure like DynamicBufferList.
2024-09-18 23:18:51 -04:00
Blaz Kristan
ce5ee65d60 Merge branch '0_15' into blending-styles 2024-09-15 11:05:16 +02:00
Blaz Kristan
65a8dbfe41 FX: Usermod Temperature effect 2024-09-15 11:04:02 +02:00
Blaz Kristan
011afd0910 Merge branch '0_15' into blending-styles 2024-08-17 15:24:20 +02:00
Blaž Kristan
9d860c265c Merge pull request #4089 from willmmiles/improved-locking
Improve jsonBufferLock management
2024-08-05 21:04:24 +02:00
Blaz Kristan
e1598a9966 Merge branch '0_15' into blending-styles 2024-08-05 16:47:25 +02:00
Blaz Kristan
e82f38e277 Tuning 2024-08-05 16:42:21 +02:00
Will Miles
113dbbdf94 Use DEBUG_PRINTF_P for jsonBufferLock
Tiny code space usage reduction.
2024-08-04 15:27:23 -04:00
Will Miles
e701b5b5eb util: Print locking module when JSON lock fails
For debugging, also log who was trying to lock when it was contended.
2024-08-04 15:27:23 -04:00
Will Miles
6f01896d04 requestJSONBufferLock: Fix locking implementation
On ESP8266, it isn't permissible to call delay() in system context;
ensure this is legal before waiting.

On ESP32, use an operating system mutex to ensure consistent variable
state in a multicore environment, and manage the wait without needing
to loop.
2024-08-04 15:27:18 -04:00
Blaz Kristan
13ed78be96 Merge branch '0_15' into blending-styles 2024-07-11 21:30:10 +02:00
Blaz Kristan
cd1ede38a7 Size & speed optimisations 2024-07-11 21:22:58 +02:00
Blaz Kristan
efa32ed4f6 Size optimisations 2024-07-09 21:50:27 +02:00
Blaz Kristan
296df2660a Merge branch '0_15' into blending-styles 2024-06-16 18:22:21 +02:00
Blaz Kristan
ed0e73803f Minor tweaks for ESP8266
- update was restarting device on some occasions
- a bit of throttling in UI
2024-06-14 22:12:09 +02:00
Blaz Kristan
0c8d9d5614 Mode blending styles
- alternative to #3669
2024-04-03 18:38:06 +02:00