ui: sensors page

This commit is contained in:
Florent de Lamotte
2025-09-05 15:20:52 +02:00
parent 6fae950814
commit 2d651221c4

View File

@@ -75,6 +75,7 @@ class HomeScreen : public UIScreen {
RADIO,
BLUETOOTH,
ADVERT,
SENSORS,
SHUTDOWN,
Count // keep as last
};
@@ -113,9 +114,32 @@ class HomeScreen : public UIScreen {
display.fillRect(iconX + 2, iconY + 2, fillWidth, iconHeight - 4);
}
DynamicJsonDocument _sensors_doc;
JsonArray _sensors_arr;
bool scroll = false;
int scroll_offset = 0;
int next_sensors_refresh = 0;
void refresh_sensors() {
CayenneLPP lpp(200);
if (millis() > next_sensors_refresh) {
lpp.addVoltage(TELEM_CHANNEL_SELF, (float)board.getBattMilliVolts() / 1000.0f);
sensors.querySensors(0xFF, lpp);
_sensors_arr.clear();
lpp.decode(lpp.getBuffer(), lpp.getSize(), _sensors_arr);
scroll = _sensors_arr.size() > UI_RECENT_LIST_SIZE; // there is a status line
#if AUTO_OFF_MILLIS > 0
next_sensors_refresh = millis() + 5000; // refresh sensor values every 5 sec
#else
next_sensors_refresh = millis() + 60000; // refresh sensor values every 1 min
#endif
}
}
public:
HomeScreen(UITask* task, mesh::RTCClock* rtc, SensorManager* sensors, NodePrefs* node_prefs)
: _task(task), _rtc(rtc), _sensors(sensors), _node_prefs(node_prefs), _page(0), _shutdown_init(false) { }
: _task(task), _rtc(rtc), _sensors(sensors), _node_prefs(node_prefs), _page(0),
_shutdown_init(false), _sensors_doc(2048) { _sensors_arr=_sensors_doc.to<JsonArray>(); }
void poll() override {
if (_shutdown_init && !_task->isButtonPressed()) { // must wait for USR button to be released
@@ -211,6 +235,34 @@ public:
display.setColor(DisplayDriver::GREEN);
display.drawXbm((display.width() - 32) / 2, 18, advert_icon, 32, 32);
display.drawTextCentered(display.width() / 2, 64 - 11, "advert: " PRESS_LABEL);
} else if (_page == HomePage::SENSORS) {
int y = 18;
refresh_sensors();
char buf[100];
int s_size = _sensors_arr.size();
for (int i = 0; i < (scroll?UI_RECENT_LIST_SIZE:s_size); i++) {
JsonObject v = _sensors_arr[(i+scroll_offset)%s_size];
display.setCursor(0, y);
switch (v["type"].as<int>()) {
case 136: // GPS
sprintf(buf, "%.4f %.4f",
v["value"]["latitude"].as<float>(),
v["value"]["longitude"].as<float>());
break;
default: // will be a float for now
sprintf(buf, "%.02f",
v["value"].as<float>());
}
display.setCursor(0, y);
display.print(v["name"].as<JsonString>().c_str());
display.setCursor(
display.width()-display.getTextWidth(buf)-1, y
);
display.print(buf);
y = y + 12;
}
if (scroll) scroll_offset = (scroll_offset+1)%s_size;
else scroll_offset = 0;
} else if (_page == HomePage::SHUTDOWN) {
display.setColor(DisplayDriver::GREEN);
display.setTextSize(1);