From 44122565f6f276d6a4864086a4914cce9081677e Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Sun, 17 May 2026 18:32:49 +0200 Subject: [PATCH] perf: query sensors once for both lock screen dashboard fields Previously each LPP sensor field called querySensors() separately. Now a single querySensors() call fills a shared buffer used by both fields. Co-Authored-By: Claude Sonnet 4.6 --- examples/companion_radio/ui-new/UITask.cpp | 25 +++++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 9fa0f97f..456ebc1d 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -1123,7 +1123,8 @@ bool UITask::isButtonPressed() const { #endif } -static void formatDashVal(uint8_t field, char* val, int val_len, uint16_t batt_mv) { +static void formatDashVal(uint8_t field, char* val, int val_len, uint16_t batt_mv, + CayenneLPP* lpp = nullptr) { val[0] = '\0'; switch (field) { case DASH_NONE: return; @@ -1146,7 +1147,7 @@ static void formatDashVal(uint8_t field, char* val, int val_len, uint16_t batt_m #endif default: break; } - // LPP sensor fields: query sensors into a local buffer + // LPP sensor fields uint8_t lpp_type = 0; switch (field) { case DASH_TEMP: lpp_type = LPP_TEMPERATURE; break; @@ -1157,10 +1158,9 @@ static void formatDashVal(uint8_t field, char* val, int val_len, uint16_t batt_m case DASH_CO2: lpp_type = LPP_CONCENTRATION; break; } if (lpp_type) { - CayenneLPP lpp(200); - lpp.reset(); - sensors.querySensors(0xFF, lpp); - LPPReader r(lpp.getBuffer(), lpp.getSize()); + CayenneLPP local_lpp(200); + if (!lpp) { local_lpp.reset(); sensors.querySensors(0xFF, local_lpp); lpp = &local_lpp; } + LPPReader r(lpp->getBuffer(), lpp->getSize()); uint8_t ch, type; while (r.readHeader(ch, type)) { if (type == lpp_type) { @@ -1345,8 +1345,17 @@ void UITask::loop() { // Two sensor values side by side (dashboard_fields[0] and [1]) if (_node_prefs) { char v0[20] = "", v1[20] = ""; - formatDashVal(_node_prefs->dashboard_fields[0], v0, sizeof(v0), _batt_mv); - formatDashVal(_node_prefs->dashboard_fields[1], v1, sizeof(v1), _batt_mv); + CayenneLPP shared_lpp(200); + CayenneLPP* lpp_ptr = nullptr; + uint8_t f0 = _node_prefs->dashboard_fields[0], f1 = _node_prefs->dashboard_fields[1]; + auto isLPP = [](uint8_t f) { + return f==DASH_TEMP||f==DASH_HUM||f==DASH_PRES||f==DASH_ALT||f==DASH_LUX||f==DASH_CO2; + }; + if (isLPP(f0) || isLPP(f1)) { + shared_lpp.reset(); sensors.querySensors(0xFF, shared_lpp); lpp_ptr = &shared_lpp; + } + formatDashVal(f0, v0, sizeof(v0), _batt_mv, lpp_ptr); + formatDashVal(f1, v1, sizeof(v1), _batt_mv, lpp_ptr); if (v0[0] || v1[0]) { _display->setTextSize(1); _display->setColor(DisplayDriver::LIGHT);