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 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-05-17 18:32:49 +02:00
co-authored by Claude Sonnet 4.6
parent 360d5d10f7
commit b023fcdf95
+17 -8
View File
@@ -1123,7 +1123,8 @@ bool UITask::isButtonPressed() const {
#endif #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'; val[0] = '\0';
switch (field) { switch (field) {
case DASH_NONE: return; case DASH_NONE: return;
@@ -1146,7 +1147,7 @@ static void formatDashVal(uint8_t field, char* val, int val_len, uint16_t batt_m
#endif #endif
default: break; default: break;
} }
// LPP sensor fields: query sensors into a local buffer // LPP sensor fields
uint8_t lpp_type = 0; uint8_t lpp_type = 0;
switch (field) { switch (field) {
case DASH_TEMP: lpp_type = LPP_TEMPERATURE; break; 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; case DASH_CO2: lpp_type = LPP_CONCENTRATION; break;
} }
if (lpp_type) { if (lpp_type) {
CayenneLPP lpp(200); CayenneLPP local_lpp(200);
lpp.reset(); if (!lpp) { local_lpp.reset(); sensors.querySensors(0xFF, local_lpp); lpp = &local_lpp; }
sensors.querySensors(0xFF, lpp); LPPReader r(lpp->getBuffer(), lpp->getSize());
LPPReader r(lpp.getBuffer(), lpp.getSize());
uint8_t ch, type; uint8_t ch, type;
while (r.readHeader(ch, type)) { while (r.readHeader(ch, type)) {
if (type == lpp_type) { if (type == lpp_type) {
@@ -1345,8 +1345,17 @@ void UITask::loop() {
// Two sensor values side by side (dashboard_fields[0] and [1]) // Two sensor values side by side (dashboard_fields[0] and [1])
if (_node_prefs) { if (_node_prefs) {
char v0[20] = "", v1[20] = ""; char v0[20] = "", v1[20] = "";
formatDashVal(_node_prefs->dashboard_fields[0], v0, sizeof(v0), _batt_mv); CayenneLPP shared_lpp(200);
formatDashVal(_node_prefs->dashboard_fields[1], v1, sizeof(v1), _batt_mv); 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]) { if (v0[0] || v1[0]) {
_display->setTextSize(1); _display->setTextSize(1);
_display->setColor(DisplayDriver::LIGHT); _display->setColor(DisplayDriver::LIGHT);