Conversation
still not working
…dy to avoid multiple sendouts
…reduce interrupt frequency
|
OK! I should be able to get some time to do a detailed review on the weekend. |
|
I'm finding it challenging to review this properly - I just keep exploding in a hundred nitpicks. It's hard to know where to start and I feel bad pushing suggestions in dribs and drabs. Bigger things I've noticed so far:
|
|
Thanks for taking a dive.
Fully understand, its a major overhaul and a "diamond in the rough", I also did not start out with a full concept but kept adding and replacing things (as you can see in the PR having over 200 commits). Each time I read through the code I find things that could be done better or more clearly but let's do it in increments, its just too much code to have a clean overview and its easy to get lost in details.
This was actually intentional - I did try to keep current code & structure intact as much as possible, also to not change things and loose backwards compatibility. I am not saying it's the way it has to be in the end.
I did not build it up to be an independent library - but ultimately that should be the goal. I did focus on getting the drivers to work and somehow integrate them and less on making it as clean - as I am sure you can tell ;)
Agreed, the point from above applies here as well: I kept the old structure to not get tangled up and keep my focus on the pixel-pushing driver. I am not sure on where to make the split i.e. should the WLEDpixelBus replace bus digital or be more of an independent library.
sounds like a good idea, I have no real grasp on that concept though - it's a bit above my every-day C++ knowledge but I am sure I can learn that abstraction level. Maybe we should have a call to discuss some of this? |
… out parallel SPI state machine briefly tested on S3, RMT and I2S work, parlio and parallel SPI is untested, so are other ESPs
|
@willmmiles one issue that remains is the default color order (I do have a solution for color order override but need to review and test it). I had an AI summarise the color orders used by the NPB buses in the original buswrapper. Its pretty inconsistent, assuming the summary is correct. This is what the AI spit out, I checked some of the values and the ones I checked were assessed correctly:
WLED’s UI/config default is always COL_ORDER_GRB unless overridden by a color-order mapping. This is defined in bus_manager.h:472 and const.h:394-399. With the legacy driver, PolyBus first applies co, then NeoPixelBus applies the feature’s native order in bus_wrapper.h:791-813.
The exact feature selections are in bus_wrapper.h:159-209 and bus_wrapper.h:281-315. The NeoPixelBus feature definitions confirm the channel sequences, including NeoBrgFeature, NeoGrbcwxFeature, and the SM16825 aliases. TYPE_WS2812_1CH and TYPE_GS8608 are declared but unused/unmapped in this legacy dispatch. Analog, network, on/off, and HUB75 types do not use NeoPixelBus color-order features. For the new driver, the existing TODO is accurate: WLEDpixelBus.cpp needs chip-specific native-order handling. Pay special attention to TM1829, APA106, TM1914, FW1906, WS2805, SM16825, WS2801, APA102, and P9813.
|
|
Hmm, that is tricky. Probably what I'd suggest is to change the config schema (though I think we should consider that anyways). If the new (and accurate) schema is present, use it; if only the old keys are present, adapt them using a compatibility table. If it were up to me I'd get rid of the |
|
I like the idea. The LED types could be put into a LEDtypes.json file and served as a gzip to the UI to read, just like we do for the htm pages. New/custom types could live in userLEDtypes.json on the file system. |
This is a major update adding WLED Pixel Bus written from scratch to replace NeoPixelBus and it packs a lot of useful features. From a user perspective the main improvements are less memory use and dynamic adjustment of LED timing to eliminate flickering by fine-tuning the timing from -30% to + 30% in 10% steps (dropdown menu).
The new hardware driver structure allows for fully dynamic updates of LED outputs and LED timings. It also adds glitch free parallel SPI output support on the C3 as well as parallel bit-banging on all platforms including ESP8266.
All parallel outputs (except bit-bang) use ping-pong DMA buffers instead of fully pre-filled buffers - memory usage is optimized and DMA buffers are independent of number of LEDs. Also the calculation from LED colors to DMA buffers is highly speed optimized, making the driver blazing fast - I saw 30% FPS improvements in some cases.
The fully dynamic nature of the driver allows for a "Custom digital bus" in the LED settings to support virtually any LED bus type out there - specify timing, number of color channels, invert any color channel or set any color channel combination. The driver also supports inverting the output signal on any pin (ESP32 only).
The LED config UI was updated to fully support the new driver options.
A lot more testing is required for all different kind of LEDs on all platforms. I am sure there is a ton of bugs and kinks to iron out.
I would like to take this opportunity to thank @Makuna for his outstanding work on NeoPixelBus which served me well as a reference on hardware configurations and special LED types.
ESP32 flash and RAM usage comparison (bit bang disabled)
using NeoPixelBus
RAM: [== ] 24.9% (used 81576 bytes from 327680 bytes)
Flash: [======== ] 83.1% (used 1306493 bytes from 1572864 bytes)
Free Heap: (6 outputs, 256 each): 79.8k
using WLEDpixelBus
RAM: [== ] 24.9% (used 81680 bytes from 327680 bytes)
Flash: [======== ] 83.0% (used 1306053 bytes from 1572864 bytes)
Free Heap: (6 outputs, 256 each): 92.8k
Summary by CodeRabbit