feat(ui): page radio and system status
This commit is contained in:
1 parent
527bc98da2
commit
a95f7b3d16
28 files changed
+2075
-73
No files matched your search
@@ -4,6 +4,59 @@
|
||||
#include <helpers/UsbLogging.h>
|
||||
#include <helpers/CommonCLI.h>
|
||||
#include <helpers/ui/WiFiSetupQrDisplay.h>
|
||||
#include <helpers/ui/RadioProfileDisplayPage.h>
|
||||
#include <helpers/ui/RadioProfileSystemStatus.h>
|
||||
#include <RadioProfiles.h>
|
||||
#include "MyMesh.h"
|
||||
|
||||
extern MyMesh the_mesh;
|
||||
|
||||
namespace {
|
||||
|
||||
const mesh::RadioProfiles* configuredRadioProfiles() {
|
||||
const auto* radio = the_mesh.getProfileRadio();
|
||||
return radio ? radio->profiles() : NULL;
|
||||
}
|
||||
|
||||
mesh::ui::RadioProfileSystemStatus radioProfileSystemStatus(
|
||||
const NodePrefs& prefs) {
|
||||
mesh::ui::RadioProfileSystemStatus status;
|
||||
const auto* profiles = configuredRadioProfiles();
|
||||
status.public_key = the_mesh.getSelfId().pub_key;
|
||||
status.powersaving_enabled = prefs.powersaving_enabled != 0;
|
||||
#if ENV_INCLUDE_GPS == 1
|
||||
status.gps_enabled = prefs.gps_enabled != 0;
|
||||
#endif
|
||||
status.fem_enabled = board.canControlLoRaFemLna()
|
||||
&& board.isLoRaFemLnaEnabled();
|
||||
status.rx_boosted_gain = prefs.rx_boosted_gain != 0;
|
||||
status.rx_powersaving_enabled = prefs.rx_powersaving_enabled != 0;
|
||||
status.cad_enabled = prefs.cad_enabled != 0;
|
||||
status.dual_radio_enabled = profiles != NULL && profiles->enabled();
|
||||
if (status.dual_radio_enabled) {
|
||||
status.secondary_temporary = profiles->secondary_temporary;
|
||||
status.secondary_mode = profiles->secondary.mode;
|
||||
status.cross = profiles->cross;
|
||||
}
|
||||
status.noise_floor_1 = radio_driver.getNoiseFloorDbm(0);
|
||||
status.noise_floor_1_seconds =
|
||||
radio_driver.getNoiseFloorCalibrationSecondsRemaining(0);
|
||||
if (status.dual_radio_enabled) {
|
||||
status.noise_floor_2 = radio_driver.getNoiseFloorDbm(1);
|
||||
status.noise_floor_2_seconds =
|
||||
radio_driver.getNoiseFloorCalibrationSecondsRemaining(1);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
uint8_t radioProfileStatusPageCount(DisplayDriver& display,
|
||||
bool dual_radio_enabled) {
|
||||
display.setTextSize(1);
|
||||
return mesh::ui::radioProfileSystemStatusPageCount(display,
|
||||
dual_radio_enabled);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
#ifdef DISPLAY_REDRAW_ON_CHANGE
|
||||
#include <helpers/ui/DisplayFrameSignature.h>
|
||||
@@ -78,6 +131,7 @@ void UITask::begin(NodePrefs* node_prefs, const char* build_date, const char* fi
|
||||
_prevBtnState = HIGH;
|
||||
_started_at = millis();
|
||||
_node_prefs = node_prefs;
|
||||
resetRadioProfileDisplayPage();
|
||||
#ifdef DISPLAY_ACTIVITY_DASHBOARD
|
||||
ObserverDashboard::applyDarkPalette(); // retunes UIColor for this target only
|
||||
#endif
|
||||
@@ -109,6 +163,25 @@ void UITask::begin(NodePrefs* node_prefs, const char* build_date, const char* fi
|
||||
free(version);
|
||||
}
|
||||
|
||||
void UITask::resetRadioProfileDisplayPage() {
|
||||
_radio_profile_page_started_at = millis();
|
||||
_dual_radio_enabled_seen = the_mesh.isDualRadioActive();
|
||||
}
|
||||
|
||||
bool UITask::showingSecondaryRadioProfilePage() {
|
||||
const bool dual_radio_enabled = the_mesh.isDualRadioActive();
|
||||
const uint32_t now = millis();
|
||||
if (dual_radio_enabled != _dual_radio_enabled_seen) {
|
||||
_dual_radio_enabled_seen = dual_radio_enabled;
|
||||
_radio_profile_page_started_at = now;
|
||||
}
|
||||
const uint8_t status_pages = radioProfileStatusPageCount(*_display,
|
||||
dual_radio_enabled);
|
||||
return mesh::ui::showSecondaryRadioProfilePage(dual_radio_enabled,
|
||||
status_pages,
|
||||
now - _radio_profile_page_started_at);
|
||||
}
|
||||
|
||||
void UITask::renderCurrScreen() {
|
||||
char tmp[80];
|
||||
#ifdef DISPLAY_ACTIVITY_DASHBOARD
|
||||
@@ -196,20 +269,57 @@ void UITask::renderCurrScreen() {
|
||||
renderDashboard();
|
||||
return;
|
||||
#endif
|
||||
const bool dual_radio_enabled = the_mesh.isDualRadioActive();
|
||||
const uint8_t status_pages = radioProfileStatusPageCount(
|
||||
*_display, dual_radio_enabled);
|
||||
uint8_t status_page_index = 0;
|
||||
if (mesh::ui::showRadioProfileSystemStatusPage(dual_radio_enabled,
|
||||
status_pages, millis() - _radio_profile_page_started_at,
|
||||
&status_page_index)) {
|
||||
mesh::ui::drawRadioProfileSystemStatusPage(*_display,
|
||||
radioProfileSystemStatus(*_node_prefs), status_page_index);
|
||||
return;
|
||||
}
|
||||
// node name
|
||||
_display->setCursor(0, 0);
|
||||
_display->setTextSize(1);
|
||||
_display->setColor(UIColor::primary_txt);
|
||||
_display->print(_node_prefs->node_name);
|
||||
|
||||
// freq / sf
|
||||
const mesh::RadioProfiles* profiles = configuredRadioProfiles();
|
||||
const bool secondary_page = showingSecondaryRadioProfilePage();
|
||||
const bool dual_radio = profiles != NULL && profiles->enabled();
|
||||
float freq = _node_prefs->freq;
|
||||
float bw = _node_prefs->bw;
|
||||
uint8_t sf = _node_prefs->sf;
|
||||
uint8_t cr = _node_prefs->cr;
|
||||
const char* profile_tag = "";
|
||||
if (dual_radio) {
|
||||
const uint8_t profile = secondary_page ? 1 : 0;
|
||||
const auto& params = profiles->params(profile);
|
||||
freq = params.freq;
|
||||
bw = params.bw;
|
||||
sf = params.sf;
|
||||
cr = params.cr;
|
||||
profile_tag = mesh::ui::radioProfileDisplayTag(profile,
|
||||
profile == 1 ? profiles->secondary_temporary : profiles->primary_temporary);
|
||||
}
|
||||
|
||||
// Compact R1/R2 rows preserve every RF field on 128px displays.
|
||||
_display->setCursor(0, 20);
|
||||
sprintf(tmp, "FREQ: %06.3f SF%d", _node_prefs->freq, _node_prefs->sf);
|
||||
if (dual_radio) {
|
||||
snprintf(tmp, sizeof(tmp), "%s F:%06.3f S:%d", profile_tag, freq, sf);
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), "FREQ: %06.3f SF%d", freq, sf);
|
||||
}
|
||||
_display->print(tmp);
|
||||
|
||||
// bw / cr
|
||||
_display->setCursor(0, 30);
|
||||
sprintf(tmp, "BW: %03.2f CR: %d", _node_prefs->bw, _node_prefs->cr);
|
||||
if (dual_radio) {
|
||||
snprintf(tmp, sizeof(tmp), "%s B:%03.2f C:%d", profile_tag, bw, cr);
|
||||
} else {
|
||||
snprintf(tmp, sizeof(tmp), "BW: %03.2f CR: %d", bw, cr);
|
||||
}
|
||||
_display->print(tmp);
|
||||
|
||||
#ifdef WITH_MQTT_BRIDGE
|
||||
@@ -256,9 +366,36 @@ uint32_t UITask::getFrameSignature() {
|
||||
|
||||
signature = DisplayFrameSignature::append(signature, "home");
|
||||
signature = DisplayFrameSignature::append(signature, _node_prefs->node_name);
|
||||
snprintf(tmp, sizeof(tmp), "FREQ: %06.3f SF%d", _node_prefs->freq, _node_prefs->sf);
|
||||
const mesh::RadioProfiles* profiles = configuredRadioProfiles();
|
||||
const bool dual_radio = profiles != NULL && profiles->enabled();
|
||||
const uint8_t status_pages = radioProfileStatusPageCount(*_display,
|
||||
dual_radio);
|
||||
uint8_t status_page_index = 0;
|
||||
if (mesh::ui::showRadioProfileSystemStatusPage(dual_radio, status_pages,
|
||||
millis() - _radio_profile_page_started_at, &status_page_index)) {
|
||||
snprintf(tmp, sizeof(tmp), "radio-status:%u:%lu", status_page_index,
|
||||
(unsigned long)(millis() / 1000UL));
|
||||
return DisplayFrameSignature::append(signature, tmp);
|
||||
}
|
||||
const bool secondary_page = showingSecondaryRadioProfilePage();
|
||||
float freq = _node_prefs->freq;
|
||||
float bw = _node_prefs->bw;
|
||||
uint8_t sf = _node_prefs->sf;
|
||||
uint8_t cr = _node_prefs->cr;
|
||||
if (dual_radio) {
|
||||
const uint8_t profile = secondary_page ? 1 : 0;
|
||||
const auto& params = profiles->params(profile);
|
||||
freq = params.freq;
|
||||
bw = params.bw;
|
||||
sf = params.sf;
|
||||
cr = params.cr;
|
||||
signature = DisplayFrameSignature::append(signature,
|
||||
mesh::ui::radioProfileDisplayTag(profile,
|
||||
profile == 1 ? profiles->secondary_temporary : profiles->primary_temporary));
|
||||
}
|
||||
snprintf(tmp, sizeof(tmp), "FREQ: %06.3f SF%d", freq, sf);
|
||||
signature = DisplayFrameSignature::append(signature, tmp);
|
||||
snprintf(tmp, sizeof(tmp), "BW: %03.2f CR: %d", _node_prefs->bw, _node_prefs->cr);
|
||||
snprintf(tmp, sizeof(tmp), "BW: %03.2f CR: %d", bw, cr);
|
||||
signature = DisplayFrameSignature::append(signature, tmp);
|
||||
|
||||
#if defined(WITH_MQTT_BRIDGE) && !defined(DISPLAY_ACTIVITY_DASHBOARD)
|
||||
@@ -285,6 +422,18 @@ bool UITask::buildDashboardContext(ObserverDashboard::Context* ctx) {
|
||||
ctx->freq = _node_prefs->freq;
|
||||
ctx->sf = _node_prefs->sf;
|
||||
ctx->bw = _node_prefs->bw;
|
||||
ctx->radio_label = "";
|
||||
const mesh::RadioProfiles* profiles = configuredRadioProfiles();
|
||||
if (profiles != NULL && profiles->enabled()) {
|
||||
const uint8_t profile = showingSecondaryRadioProfilePage() ? 1 : 0;
|
||||
const auto& params = profiles->params(profile);
|
||||
ctx->freq = params.freq;
|
||||
ctx->sf = params.sf;
|
||||
ctx->bw = params.bw;
|
||||
ctx->radio_label = mesh::ui::radioProfileDisplayTag(profile,
|
||||
profile == 1 ? profiles->secondary_temporary : profiles->primary_temporary);
|
||||
}
|
||||
ctx->dual_radio = the_mesh.isDualRadioActive();
|
||||
#ifdef WITH_MQTT_BRIDGE
|
||||
ctx->link_up = (WiFi.status() == WL_CONNECTED);
|
||||
#else
|
||||
@@ -329,6 +478,7 @@ void UITask::updateActivityRows() {
|
||||
#ifdef DISPLAY_TOUCH_TOGGLE
|
||||
void UITask::toggleDisplay(const char* source) {
|
||||
_display->wake(mesh::ui::DisplayWake::Button);
|
||||
resetRadioProfileDisplayPage();
|
||||
#ifdef DISPLAY_TOUCH_DEBUG
|
||||
mesh::usbConsolePort().printf("Display: %s -> %s\n", source, _display->isOn() ? "on" : "off");
|
||||
#else
|
||||
@@ -346,6 +496,7 @@ void UITask::toggleDisplay(const char* source) {
|
||||
|
||||
void UITask::loop() {
|
||||
if (_display->servicePower(board.isExternalPowered() || board.isUsbHostConnected())) {
|
||||
resetRadioProfileDisplayPage();
|
||||
_next_refresh = 0;
|
||||
#ifdef DISPLAY_REDRAW_ON_CHANGE
|
||||
_frame_valid = false;
|
||||
@@ -381,6 +532,7 @@ void UITask::loop() {
|
||||
if (ev != BUTTON_EVENT_NONE) {
|
||||
if (!_display->isOn()) {
|
||||
_display->wake(mesh::ui::DisplayWake::Button);
|
||||
resetRadioProfileDisplayPage();
|
||||
#ifdef DISPLAY_REDRAW_ON_CHANGE
|
||||
_frame_valid = false;
|
||||
#endif
|
||||
@@ -403,6 +555,7 @@ void UITask::loop() {
|
||||
// TODO: any action ?
|
||||
} else {
|
||||
_display->wake(mesh::ui::DisplayWake::Button);
|
||||
resetRadioProfileDisplayPage();
|
||||
#ifdef DISPLAY_REDRAW_ON_CHANGE
|
||||
_frame_valid = false;
|
||||
#endif
|
||||
|
||||
Reference in new issue
Block a user