[ota] Move notify_state_deferred_ out of header to avoid inlining at 8 call sites

This commit is contained in:
J. Nick Koston
2026-03-18 10:54:46 -10:00
parent 8ee6392b01
commit 7cc3bf6425
2 changed files with 14 additions and 12 deletions
+13
View File
@@ -13,6 +13,19 @@ OTAGlobalCallback *get_global_ota_callback() {
return global_ota_callback;
}
void OTAComponent::notify_state_deferred_(OTAState state, float progress, uint8_t error) {
// Pack state, error, and progress into a single uint32_t so the lambda
// captures only [this, packed] (8 bytes) — fits in std::function SBO.
// Layout: [state:8][error:8][progress_fixed:16] where progress is 010000 (0.01% resolution)
static_assert(OTA_ERROR <= 0xFF, "OTAState must fit in 8 bits for packing");
uint32_t packed = (static_cast<uint32_t>(state) << 24) | (static_cast<uint32_t>(error) << 16) |
static_cast<uint16_t>(progress * 100.0f);
this->defer([this, packed]() {
this->notify_state_(static_cast<OTAState>(packed >> 24), static_cast<float>(packed & 0xFFFF) / 100.0f,
static_cast<uint8_t>(packed >> 16));
});
}
void OTAComponent::notify_state_(OTAState state, float progress, uint8_t error) {
for (auto *listener : this->state_listeners_) {
listener->on_ota_state(state, progress, error);
+1 -12
View File
@@ -73,18 +73,7 @@ class OTAComponent : public Component {
* This should be used by OTA implementations that run in separate tasks
* (like web_server OTA) to ensure listeners execute in the main loop.
*/
void notify_state_deferred_(OTAState state, float progress, uint8_t error) {
// Pack state, error, and progress into a single uint32_t so the lambda
// captures only [this, packed] (8 bytes) — intended to fit in std::function SBO on supported toolchains.
// Layout: [state:8][error:8][progress_fixed:16] where progress is 010000 (0.01% resolution)
static_assert(OTA_ERROR <= 0xFF, "OTAState must fit in 8 bits for packing");
uint32_t packed = (static_cast<uint32_t>(state) << 24) | (static_cast<uint32_t>(error) << 16) |
static_cast<uint16_t>(progress * 100.0f);
this->defer([this, packed]() {
this->notify_state_(static_cast<OTAState>(packed >> 24), static_cast<float>(packed & 0xFFFF) / 100.0f,
static_cast<uint8_t>(packed >> 16));
});
}
void notify_state_deferred_(OTAState state, float progress, uint8_t error);
std::vector<OTAStateListener *> state_listeners_;
#endif