From 87396d9105f8c45f63525787ffaeb84a91331d3a Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 9 Oct 2023 20:43:16 -0500 Subject: [PATCH] Refactor away some code duplication in screen frames and display formatter for modem presets (#2872) * Refactor away some duplication * Refactor preset names to display formatter method * Remove unused screen brightness adjustment and extract wifi disconnect reason name to display formatter method * Tronk * Let's be more clear with this naming * Effed * DisplayFormatters static class and use native wifi disconnect reason names method * git mv file so casing should match now * Include titlecase * Trunk --- src/DisplayFormatters.cpp | 34 ++++++ src/DisplayFormatters.h | 8 ++ src/graphics/Screen.cpp | 232 ++++++++------------------------------ src/graphics/Screen.h | 5 +- src/mesh/Channels.cpp | 34 +----- 5 files changed, 95 insertions(+), 218 deletions(-) create mode 100644 src/DisplayFormatters.cpp create mode 100644 src/DisplayFormatters.h diff --git a/src/DisplayFormatters.cpp b/src/DisplayFormatters.cpp new file mode 100644 index 000000000..f15052de6 --- /dev/null +++ b/src/DisplayFormatters.cpp @@ -0,0 +1,34 @@ +#include "DisplayFormatters.h" + +const char *DisplayFormatters::getModemPresetDisplayName(meshtastic_Config_LoRaConfig_ModemPreset preset, bool useShortName) +{ + switch (preset) { + case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW: + return useShortName ? "ShortS" : "ShortSlow"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST: + return useShortName ? "ShortF" : "ShortFast"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW: + return useShortName ? "MedS" : "MediumSlow"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST: + return useShortName ? "MedF" : "MediumFast"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW: + return useShortName ? "LongS" : "LongSlow"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST: + return useShortName ? "LongF" : "LongFast"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE: + return useShortName ? "LongM" : "LongMod"; + break; + case meshtastic_Config_LoRaConfig_ModemPreset_VERY_LONG_SLOW: + return useShortName ? "VeryL" : "VLongSlow"; + break; + default: + return useShortName ? "Custom" : "Invalid"; + break; + } +} \ No newline at end of file diff --git a/src/DisplayFormatters.h b/src/DisplayFormatters.h new file mode 100644 index 000000000..f8ccfcbb6 --- /dev/null +++ b/src/DisplayFormatters.h @@ -0,0 +1,8 @@ +#pragma once +#include "NodeDB.h" + +class DisplayFormatters +{ + public: + static const char *getModemPresetDisplayName(meshtastic_Config_LoRaConfig_ModemPreset preset, bool useShortName); +}; diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 547d7f59e..b626e393a 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -24,6 +24,7 @@ along with this program. If not, see . #if HAS_SCREEN #include +#include "DisplayFormatters.h" #include "GPS.h" #include "MeshService.h" #include "NodeDB.h" @@ -160,34 +161,9 @@ static void drawIconScreen(const char *upperMsg, OLEDDisplay *display, OLEDDispl xstr(APP_VERSION_SHORT)); // Note: we don't bother printing region or now, it makes the string too long display->drawString(x + SCREEN_WIDTH - display->getStringWidth(buf), y + 0, buf); screen->forceDisplay(); - // FIXME - draw serial # somewhere? } -#ifdef ARCH_ESP32 -static void drawFrameResume(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -{ - uint16_t x_offset = display->width() / 2; - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(FONT_MEDIUM); - display->drawString(x_offset + x, 26 + y, "Resuming..."); -} -#endif - -static void drawBootScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -{ -#ifdef ARCH_ESP32 - if (wakeCause == ESP_SLEEP_WAKEUP_TIMER || wakeCause == ESP_SLEEP_WAKEUP_EXT1) { - drawFrameResume(display, state, x, y); - } else -#endif - { - // Draw region in upper left - const char *region = myRegion ? myRegion->name : NULL; - drawIconScreen(region, display, state, x, y); - } -} - static void drawOEMIconScreen(const char *upperMsg, OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // draw an xbm image. @@ -237,6 +213,28 @@ static void drawOEMBootScreen(OLEDDisplay *display, OLEDDisplayUiState *state, i drawOEMIconScreen(region, display, state, x, y); } +static void drawFrameText(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y, const char *message) +{ + uint16_t x_offset = display->width() / 2; + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(FONT_MEDIUM); + display->drawString(x_offset + x, 26 + y, message); +} + +static void drawBootScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ +#ifdef ARCH_ESP32 + if (wakeCause == ESP_SLEEP_WAKEUP_TIMER || wakeCause == ESP_SLEEP_WAKEUP_EXT1) { + drawFrameText(display, state, x, y, "Resuming..."); + } else +#endif + { + // Draw region in upper left + const char *region = myRegion ? myRegion->name : NULL; + drawIconScreen(region, display, state, x, y); + } +} + // Used on boot when a certificate is being created static void drawSSLScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { @@ -337,22 +335,6 @@ static void drawFrameBluetooth(OLEDDisplay *display, OLEDDisplayUiState *state, display->drawString(x_offset + x, y_offset + y, deviceName); } -static void drawFrameShutdown(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -{ - uint16_t x_offset = display->width() / 2; - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(FONT_MEDIUM); - display->drawString(x_offset + x, 26 + y, "Shutting down..."); -} - -static void drawFrameReboot(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -{ - uint16_t x_offset = display->width() / 2; - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(FONT_MEDIUM); - display->drawString(x_offset + x, 26 + y, "Rebooting..."); -} - static void drawFrameFirmware(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { display->setTextAlignment(TEXT_ALIGN_CENTER); @@ -923,20 +905,6 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_ drawColumns(display, x, y, fields); } -// #ifdef RAK4630 -// Screen::Screen(uint8_t address, int sda, int scl) : OSThread("Screen"), cmdQueue(32), dispdev(address, sda, scl), -// dispdev_oled(address, sda, scl), ui(&dispdev) -// { -// address_found = address; -// cmdQueue.setReader(this); -// if (screen_found) { -// (void)dispdev; -// AutoOLEDWire dispdev = dispdev_oled; -// (void)ui; -// OLEDDisplayUi ui(&dispdev); -// } -// } -// #else Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_OledType screenType, OLEDDISPLAY_GEOMETRY geometry) : concurrency::OSThread("Screen"), address_found(address), model(screenType), geometry(geometry), cmdQueue(32), dispdev(address.address, -1, -1, geometry, (address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE), @@ -944,7 +912,7 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O { cmdQueue.setReader(this); } -// #endif + /** * Prepare the display for the unit going to the lowest power mode possible. Most screens will just * poweroff, but eink screens will show a "I'm sleeping" graphic, possibly with a QR code @@ -1261,11 +1229,8 @@ void Screen::setWelcomeFrames() { if (address_found.address) { // LOG_DEBUG("showing Welcome frames\n"); - ui.disableAllIndicators(); - - static FrameCallback welcomeFrames[] = {drawWelcomeScreen}; - ui.setFrames(welcomeFrames, 1); - ui.update(); + static FrameCallback frames[] = {drawWelcomeScreen}; + setFrameImmediateDraw(frames); } } @@ -1352,12 +1317,15 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin) LOG_DEBUG("showing bluetooth screen\n"); showingNormalScreen = false; - static FrameCallback btFrames[] = {drawFrameBluetooth}; - + static FrameCallback frames[] = {drawFrameBluetooth}; snprintf(btPIN, sizeof(btPIN), "%06u", pin); + setFrameImmediateDraw(frames); +} +void Screen::setFrameImmediateDraw(FrameCallback *drawFrames) +{ ui.disableAllIndicators(); - ui.setFrames(btFrames, 1); + ui.setFrames(drawFrames, 1); setFastFramerate(); } @@ -1366,11 +1334,12 @@ void Screen::handleShutdownScreen() LOG_DEBUG("showing shutdown screen\n"); showingNormalScreen = false; - static FrameCallback shutdownFrames[] = {drawFrameShutdown}; + auto frame = [](OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -> void { + drawFrameText(display, state, x, y, "Shutting down..."); + }; + static FrameCallback frames[] = {frame}; - ui.disableAllIndicators(); - ui.setFrames(shutdownFrames, 1); - setFastFramerate(); + setFrameImmediateDraw(frames); } void Screen::handleRebootScreen() @@ -1378,11 +1347,11 @@ void Screen::handleRebootScreen() LOG_DEBUG("showing reboot screen\n"); showingNormalScreen = false; - static FrameCallback rebootFrames[] = {drawFrameReboot}; - - ui.disableAllIndicators(); - ui.setFrames(rebootFrames, 1); - setFastFramerate(); + auto frame = [](OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) -> void { + drawFrameText(display, state, x, y, "Rebooting..."); + }; + static FrameCallback frames[] = {frame}; + setFrameImmediateDraw(frames); } void Screen::handleStartFirmwareUpdateScreen() @@ -1390,11 +1359,8 @@ void Screen::handleStartFirmwareUpdateScreen() LOG_DEBUG("showing firmware screen\n"); showingNormalScreen = false; - static FrameCallback btFrames[] = {drawFrameFirmware}; - - ui.disableAllIndicators(); - ui.setFrames(btFrames, 1); - setFastFramerate(); + static FrameCallback frames[] = {drawFrameFirmware}; + setFrameImmediateDraw(frames); } void Screen::blink() @@ -1655,65 +1621,8 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i } else { // Codes: // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#wi-fi-reason-code - if (getWifiDisconnectReason() == 2) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Authentication Invalid"); - } else if (getWifiDisconnectReason() == 3) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "De-authenticated"); - } else if (getWifiDisconnectReason() == 4) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Disassociated Expired"); - } else if (getWifiDisconnectReason() == 5) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "AP - Too Many Clients"); - } else if (getWifiDisconnectReason() == 6) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "NOT_AUTHED"); - } else if (getWifiDisconnectReason() == 7) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "NOT_ASSOCED"); - } else if (getWifiDisconnectReason() == 8) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Disassociated"); - } else if (getWifiDisconnectReason() == 9) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "ASSOC_NOT_AUTHED"); - } else if (getWifiDisconnectReason() == 10) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "DISASSOC_PWRCAP_BAD"); - } else if (getWifiDisconnectReason() == 11) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "DISASSOC_SUPCHAN_BAD"); - } else if (getWifiDisconnectReason() == 13) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "IE_INVALID"); - } else if (getWifiDisconnectReason() == 14) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "MIC_FAILURE"); - } else if (getWifiDisconnectReason() == 15) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "AP Handshake Timeout"); - } else if (getWifiDisconnectReason() == 16) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "GROUP_KEY_UPDATE_TIMEOUT"); - } else if (getWifiDisconnectReason() == 17) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "IE_IN_4WAY_DIFFERS"); - } else if (getWifiDisconnectReason() == 18) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Invalid Group Cipher"); - } else if (getWifiDisconnectReason() == 19) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Invalid Pairwise Cipher"); - } else if (getWifiDisconnectReason() == 20) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "AKMP_INVALID"); - } else if (getWifiDisconnectReason() == 21) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "UNSUPP_RSN_IE_VERSION"); - } else if (getWifiDisconnectReason() == 22) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "INVALID_RSN_IE_CAP"); - } else if (getWifiDisconnectReason() == 23) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "802_1X_AUTH_FAILED"); - } else if (getWifiDisconnectReason() == 24) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "CIPHER_SUITE_REJECTED"); - } else if (getWifiDisconnectReason() == 200) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "BEACON_TIMEOUT"); - } else if (getWifiDisconnectReason() == 201) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "AP Not Found"); - } else if (getWifiDisconnectReason() == 202) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "AUTH_FAIL"); - } else if (getWifiDisconnectReason() == 203) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "ASSOC_FAIL"); - } else if (getWifiDisconnectReason() == 204) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "HANDSHAKE_TIMEOUT"); - } else if (getWifiDisconnectReason() == 205) { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Connection Failed"); - } else { - display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Unknown Status"); - } + display->drawString(x, y + FONT_HEIGHT_SMALL * 1, + WiFi.disconnectReasonName(static_cast(getWifiDisconnectReason()))); } display->drawString(x, y + FONT_HEIGHT_SMALL * 2, "SSID: " + String(wifiName)); @@ -1760,37 +1669,7 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat display->drawString(x + 1, y, String("USB")); } - auto mode = ""; - - switch (config.lora.modem_preset) { - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW: - mode = "ShortS"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST: - mode = "ShortF"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW: - mode = "MedS"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST: - mode = "MedF"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW: - mode = "LongS"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST: - mode = "LongF"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE: - mode = "LongM"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_VERY_LONG_SLOW: - mode = "VeryL"; - break; - default: - mode = "Custom"; - break; - } + auto mode = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, true); display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode), y, mode); if (config.display.heading_bold) @@ -1857,23 +1736,6 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat heartbeat = !heartbeat; #endif } -// adjust Brightness cycle through 1 to 254 as long as attachDuringLongPress is true -void Screen::adjustBrightness() -{ - if (!useDisplay) - return; - - if (brightness == 254) { - brightness = 0; - } else { - brightness++; - } - int width = brightness / (254.00 / SCREEN_WIDTH); - dispdev.drawRect(0, 30, SCREEN_WIDTH, 4); - dispdev.fillRect(0, 31, width, 2); - dispdev.display(); - dispdev.setBrightness(brightness); -} int Screen::handleStatusUpdate(const meshtastic::Status *arg) { diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 8812b7c70..d6fb7b5d3 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -19,7 +19,6 @@ class Screen void setup() {} void setOn(bool) {} void print(const char *) {} - void adjustBrightness() {} void doDeepSleep() {} void forceDisplay() {} void startBluetoothPinScreen(uint32_t pin) {} @@ -161,7 +160,6 @@ class Screen : public concurrency::OSThread void showNextFrame() { enqueueCmd(ScreenCmd{.cmd = Cmd::SHOW_NEXT_FRAME}); } // Implementation to Adjust Brightness - void adjustBrightness(); uint8_t brightness = BRIGHTNESS_DEFAULT; /// Starts showing the Bluetooth PIN screen. @@ -363,6 +361,9 @@ class Screen : public concurrency::OSThread /// Try to start drawing ASAP void setFastFramerate(); + // Sets frame up for immediate drawing + void setFrameImmediateDraw(FrameCallback *drawFrames); + /// Called when debug screen is to be drawn, calls through to debugInfo.drawFrame. static void drawDebugInfoTrampoline(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y); diff --git a/src/mesh/Channels.cpp b/src/mesh/Channels.cpp index 2a0b5ee39..9974297fa 100644 --- a/src/mesh/Channels.cpp +++ b/src/mesh/Channels.cpp @@ -1,5 +1,6 @@ #include "Channels.h" #include "CryptoEngine.h" +#include "DisplayFormatters.h" #include "NodeDB.h" #include "configuration.h" @@ -239,38 +240,9 @@ const char *Channels::getName(size_t chIndex) const char *channelName = channelSettings.name; if (!*channelName) { // emptystring // Per mesh.proto spec, if bandwidth is specified we must ignore modemPreset enum, we assume that in that case - // the app fucked up and forgot to set channelSettings.name - + // the app effed up and forgot to set channelSettings.name if (config.lora.use_preset) { - switch (config.lora.modem_preset) { - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW: - channelName = "ShortSlow"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST: - channelName = "ShortFast"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW: - channelName = "MediumSlow"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST: - channelName = "MediumFast"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW: - channelName = "LongSlow"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST: - channelName = "LongFast"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE: - channelName = "LongMod"; - break; - case meshtastic_Config_LoRaConfig_ModemPreset_VERY_LONG_SLOW: - channelName = "VLongSlow"; - break; - default: - channelName = "Invalid"; - break; - } + channelName = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false); } else { channelName = "Custom"; }