Skip to content

Conversation

@willmmiles
Copy link
Member

Replacement for #4134 without any usermod changes, which can be considered as a separate PR.

Replace the usage of oppend with Arduino's Print abstraction. This permits efficient use of dynamically allocated memory for returning settings page data, without requiring a single large contiguous allocation up front, or risking smashing the stack.

This change also permits the output generation functions to easily use more sophisticated serialization functions such as printf, reducing the number of required function calls. With this optimization, the overall result is approximate parity in code size to the original implementation.

willmmiles and others added 8 commits September 18, 2024 19:47
Since we validate the file existence ourselves, no need to have
AsyncWebServer do it again.
Useful for checking that I haven't broken anything.
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.
Use a static Print* to transform old oappend calls to print calls.
Reduce the total number of calls by using printf_P and skipping atoi().
Use named functions to describe what's being printed.
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.
@willmmiles willmmiles mentioned this pull request Sep 19, 2024
@softhack007
Copy link
Member

👍

@blazoncek
Copy link
Contributor

I am ok to merge this PR.

@willmmiles willmmiles merged commit e789a18 into wled:0_15 Sep 24, 2024
@willmmiles willmmiles deleted the end_oappend_v2 branch September 24, 2024 20:56
@netmindz
Copy link
Member

Great work

@FreakyJ
Copy link
Contributor

FreakyJ commented Sep 28, 2024

Is this a bug or by purpose in xml.cpp? SET_F changed to F
grafik

@willmmiles
Copy link
Member Author

Is this a bug or by purpose in xml.cpp? SET_F changed to F

It's intentional. F() informs print() (via overloading) that the string is stored in PROGMEM on PROGMEM-distinct boards, so it can use an optimized/safer algorithm. SET_F() casts away the distinction, which can result in poor performance or crashes.

@willmmiles willmmiles mentioned this pull request Oct 24, 2024
@willmmiles willmmiles mentioned this pull request Nov 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants