fix: show keyboard placeholders only for sensors with actual live data

Replace getAvailableLPPTypes() (hardware-detected) with a live querySensors()
call so only placeholders for sensors currently returning values appear in
the picker.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-05-14 16:41:04 +02:00
co-authored by Claude Sonnet 4.6
parent 9c4dc0039a
commit e43047f561
@@ -1,7 +1,7 @@
#pragma once #pragma once
// Populates a KeyboardWidget's placeholder list with sensor types currently // Populates a KeyboardWidget's placeholder list based on live sensor data.
// detected by SensorManager. Always adds {loc} and {time} via begin(); this // Only adds placeholders for types that actually returned a value right now.
// helper appends the sensor-specific entries on top. // Always adds {loc} and {time} via begin(); this helper appends the rest.
#include "KeyboardWidget.h" #include "KeyboardWidget.h"
#include <helpers/SensorManager.h> #include <helpers/SensorManager.h>
@@ -9,8 +9,23 @@
inline void kbAddSensorPlaceholders(KeyboardWidget& kb, SensorManager* sm) { inline void kbAddSensorPlaceholders(KeyboardWidget& kb, SensorManager* sm) {
if (!sm) return; if (!sm) return;
uint8_t types[16];
int tc = sm->getAvailableLPPTypes(types, 16); CayenneLPP lpp(100);
sm->querySensors(0xFF, lpp);
// collect unique LPP types that have actual data
uint8_t present[16];
int pc = 0;
{
LPPReader r(lpp.getBuffer(), lpp.getSize());
uint8_t ch, type;
while (r.readHeader(ch, type)) {
bool already = false;
for (int i = 0; i < pc; i++) if (present[i] == type) { already = true; break; }
if (!already && pc < 16) present[pc++] = type;
r.skipData(type);
}
}
static const struct { uint8_t t; const char* ph; } MAP[] = { static const struct { uint8_t t; const char* ph; } MAP[] = {
{ LPP_TEMPERATURE, "{temp}" }, { LPP_TEMPERATURE, "{temp}" },
@@ -24,8 +39,8 @@ inline void kbAddSensorPlaceholders(KeyboardWidget& kb, SensorManager* sm) {
}; };
for (const auto& m : MAP) { for (const auto& m : MAP) {
for (int i = 0; i < tc; i++) { for (int i = 0; i < pc; i++) {
if (types[i] == m.t) { kb.addPlaceholder(m.ph); break; } if (present[i] == m.t) { kb.addPlaceholder(m.ph); break; }
} }
} }
} }