From cc5dc5046c512e194854f0195dadbc6b29453d6c Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 1 Jul 2025 00:48:11 +0200 Subject: [PATCH 01/16] indicator: adaptations for arduino-esp32 v3.2 --- arch/esp32/esp32.ini | 4 ++-- platformio.ini | 5 +++-- src/modules/esp32/PaxcounterModule.cpp | 2 -- src/platform/esp32/main-esp32.cpp | 3 ++- .../seeed-sensecap-indicator/platformio.ini | 22 ++++++++++++++++--- variants/seeed-sensecap-indicator/variant.h | 2 +- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini index cba84181b..8b5ef7147 100644 --- a/arch/esp32/esp32.ini +++ b/arch/esp32/esp32.ini @@ -52,8 +52,8 @@ lib_deps = https://github.com/meshtastic/esp32_https_server/archive/896f1771ceb5979987a0b41028bf1b4e7aad419b.zip # renovate: datasource=custom.pio depName=NimBLE-Arduino packageName=h2zero/library/NimBLE-Arduino h2zero/NimBLE-Arduino@^1.4.3 - # renovate: datasource=git-refs depName=libpax packageName=https://github.com/dbinfrago/libpax gitBranch=master - https://github.com/dbinfrago/libpax/archive/3cdc0371c375676a97967547f4065607d4c53fd1.zip + # renovate: datasource=git-refs depName=libpax packageName=https://github.com/mverch67/libpax gitBranch=master + https://github.com/mverch67/libpax/archive/6f52ee989301cdabaeef00bcbf93bff55708ce2f.zip # renovate: datasource=custom.pio depName=XPowersLib packageName=lewisxhe/library/XPowersLib lewisxhe/XPowersLib@^0.2.7 # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master diff --git a/platformio.ini b/platformio.ini index 693fdc9c3..d03843d17 100644 --- a/platformio.ini +++ b/platformio.ini @@ -86,8 +86,9 @@ check_flags = framework = arduino lib_deps = ${env.lib_deps} - # renovate: datasource=custom.pio depName=NonBlockingRTTTL packageName=end2endzone/library/NonBlockingRTTTL - end2endzone/NonBlockingRTTTL@1.3.0 + # renovate: datasource=custom.pio depName=NonBlockingRTTTL packageName=mverch67/library/NonBlockingRTTTL + https://github.com/mverch67/NonBlockingRTTTL/archive/ad1c2fb12bc81db546c6a94e963acb3382d3689e.zip ; TODO + build_flags = ${env.build_flags} -Os build_src_filter = ${env.build_src_filter} - - diff --git a/src/modules/esp32/PaxcounterModule.cpp b/src/modules/esp32/PaxcounterModule.cpp index 8b1fc5302..b8dd9ecc8 100644 --- a/src/modules/esp32/PaxcounterModule.cpp +++ b/src/modules/esp32/PaxcounterModule.cpp @@ -90,8 +90,6 @@ int32_t PaxcounterModule::runOnce() configuration.blecounter = 1; configuration.blescantime = 0; // infinite configuration.wificounter = 1; - configuration.wifi_channel_map = WIFI_CHANNEL_ALL; - configuration.wifi_channel_switch_interval = 50; configuration.wifi_rssi_threshold = Default::getConfiguredOrDefault(moduleConfig.paxcounter.wifi_threshold, -80); configuration.ble_rssi_threshold = Default::getConfiguredOrDefault(moduleConfig.paxcounter.ble_threshold, -80); libpax_update_config(&configuration); diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp index cdea53c9a..679938c35 100644 --- a/src/platform/esp32/main-esp32.cpp +++ b/src/platform/esp32/main-esp32.cpp @@ -169,9 +169,10 @@ void esp32Setup() // #define APP_WATCHDOG_SECS 45 #define APP_WATCHDOG_SECS 90 -#ifdef CONFIG_IDF_TARGET_ESP32C6 +#if defined(CONFIG_IDF_TARGET_ESP32C6) || defined(SENSECAP_INDICATOR) esp_task_wdt_config_t *wdt_config = (esp_task_wdt_config_t *)malloc(sizeof(esp_task_wdt_config_t)); wdt_config->timeout_ms = APP_WATCHDOG_SECS * 1000; + wdt_config->idle_core_mask = 0; wdt_config->trigger_panic = true; res = esp_task_wdt_init(wdt_config); assert(res == ESP_OK); diff --git a/variants/seeed-sensecap-indicator/platformio.ini b/variants/seeed-sensecap-indicator/platformio.ini index 140c6f527..ba5f87bcb 100644 --- a/variants/seeed-sensecap-indicator/platformio.ini +++ b/variants/seeed-sensecap-indicator/platformio.ini @@ -1,15 +1,18 @@ ; Seeed Studio SenseCAP Indicator [env:seeed-sensecap-indicator] extends = esp32s3_base +platform = + https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip platform_packages = - platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/aef7fef6de3329ed6f75512d46d63bba12b09bb5.zip ; add_tca9535 (based on 2.0.16) + ;platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/aef7fef6de3329ed6f75512d46d63bba12b09bb5.zip ; add_tca9535 (based on 2.0.16) + platformio/framework-arduinoespressif32-libs@https://dl.espressif.com/AE/esp-arduino-libs/esp32-3.2.0-h.zip board = seeed-sensecap-indicator board_check = true board_build.partitions = default_8MB.csv upload_protocol = esptool -build_flags = ${esp32_base.build_flags} +build_flags = ${esp32_base.build_flags} -D lcd_periph_signals=lcd_periph_rgb_signals -Ivariants/seeed-sensecap-indicator -DSENSECAP_INDICATOR -DCONFIG_ARDUHAL_LOG_COLORS @@ -24,10 +27,23 @@ build_flags = ${esp32_base.build_flags} -DUSE_ARDUINO_HAL_GPIO lib_deps = ${esp32s3_base.lib_deps} - https://github.com/mverch67/LovyanGFX/archive/4c76238c1344162a234ae917b27651af146d6fb2.zip + https://github.com/mverch67/LovyanGFX/archive/502127dfe28ab766b7ce7ba6470175ab6c9c1288.zip earlephilhower/ESP8266Audio@^1.9.9 earlephilhower/ESP8266SAM@^1.0.1 +custom_component_remove = + espressif/esp_hosted + espressif/esp_wifi_remote + espressif/esp-dsp + espressif/esp32-camera + espressif/libsodium + espressif/esp-modbus + espressif/qrcode + espressif/esp_insights + espressif/esp_diag_data_store + espressif/esp_diagnostics + espressif/esp_rainmaker + espressif/rmaker_common [env:seeed-sensecap-indicator-tft] extends = env:seeed-sensecap-indicator diff --git a/variants/seeed-sensecap-indicator/variant.h b/variants/seeed-sensecap-indicator/variant.h index 8915395f3..4bdb83c93 100644 --- a/variants/seeed-sensecap-indicator/variant.h +++ b/variants/seeed-sensecap-indicator/variant.h @@ -4,7 +4,7 @@ // This board has a serial coprocessor for sensor readings #define SENSOR_RP2040_TXD 19 #define SENSOR_RP2040_RXD 20 -#define SENSOR_PORT_NUM 2 +#define SENSOR_PORT_NUM UART_NUM_2 #define SENSOR_BAUD_RATE 115200 #define BUTTON_PIN 38 From c6e2a53a02b08a1ee11df99cb90bcba9deec85ec Mon Sep 17 00:00:00 2001 From: mverch67 Date: Thu, 3 Jul 2025 17:08:29 +0200 Subject: [PATCH 02/16] exclude not needed modules --- variants/seeed-sensecap-indicator/platformio.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/variants/seeed-sensecap-indicator/platformio.ini b/variants/seeed-sensecap-indicator/platformio.ini index ba5f87bcb..d3d172b71 100644 --- a/variants/seeed-sensecap-indicator/platformio.ini +++ b/variants/seeed-sensecap-indicator/platformio.ini @@ -53,6 +53,11 @@ upload_speed = 460800 build_flags = ${env:seeed-sensecap-indicator.build_flags} -D INPUTDRIVER_BUTTON_TYPE=38 + -D MESHTASTIC_EXCLUDE_WEBSERVER=1 + -D MESHTASTIC_EXCLUDE_SERIAL=1 + -D MESHTASTIC_EXCLUDE_SOCKETAPI=1 + -D MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR=1 + -D HAS_TELEMETRY=0 -D CONFIG_DISABLE_HAL_LOCKS=1 -D HAS_SCREEN=1 -D HAS_TFT=1 From fa169a5e43646c3d62874134ad910b13fe850ecb Mon Sep 17 00:00:00 2001 From: mverch67 Date: Mon, 14 Jul 2025 17:14:21 +0200 Subject: [PATCH 03/16] compare IDF versions --- src/platform/esp32/main-esp32.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp index 679938c35..f233db777 100644 --- a/src/platform/esp32/main-esp32.cpp +++ b/src/platform/esp32/main-esp32.cpp @@ -25,6 +25,8 @@ #include #include +#include "esp_idf_version.h" + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !MESHTASTIC_EXCLUDE_BLUETOOTH void setBluetoothEnable(bool enable) { @@ -169,7 +171,7 @@ void esp32Setup() // #define APP_WATCHDOG_SECS 45 #define APP_WATCHDOG_SECS 90 -#if defined(CONFIG_IDF_TARGET_ESP32C6) || defined(SENSECAP_INDICATOR) +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) esp_task_wdt_config_t *wdt_config = (esp_task_wdt_config_t *)malloc(sizeof(esp_task_wdt_config_t)); wdt_config->timeout_ms = APP_WATCHDOG_SECS * 1000; wdt_config->idle_core_mask = 0; From cd170fb01165e4bf356a62329f3567818a66bf81 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Wed, 16 Jul 2025 20:50:25 +0200 Subject: [PATCH 04/16] boot_freq 120MHz --- boards/seeed-sensecap-indicator.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/seeed-sensecap-indicator.json b/boards/seeed-sensecap-indicator.json index 03bff35b5..7e73fca72 100644 --- a/boards/seeed-sensecap-indicator.json +++ b/boards/seeed-sensecap-indicator.json @@ -15,7 +15,7 @@ ], "f_cpu": "240000000L", "f_flash": "80000000L", - "f_boot": "120000000L", + "boot_freq": "120000000L", "boot": "qio", "flash_mode": "qio", "psram_type": "opi", From 5033fd1f9f3a9f79269874f727b0c3a0bdd66c9a Mon Sep 17 00:00:00 2001 From: mverch67 Date: Thu, 17 Jul 2025 12:40:02 +0200 Subject: [PATCH 05/16] fix MESHTASTIC_EXCLUDE_I2C compile errors --- src/graphics/draw/MenuHandler.cpp | 13 +++++++++++-- src/modules/Modules.cpp | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 9736cf9d1..856f56de2 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -318,10 +318,13 @@ void menuHandler::positionBaseMenu() static const char *optionsArray[] = {"Back", "GPS Toggle", "Compass"}; static const char *optionsArrayCalibrate[] = {"Back", "GPS Toggle", "Compass", "Compass Calibrate"}; +#if !MESHTASTIC_EXCLUDE_I2C if (accelerometerThread) { optionsArrayPtr = optionsArrayCalibrate; options = 4; - } else { + } else +#endif + { optionsArrayPtr = optionsArray; options = 3; } @@ -334,9 +337,15 @@ void menuHandler::positionBaseMenu() #endif } else if (selected == 2) { menuQueue = compass_point_north_menu; - } else if (selected == 3) { + } +#if !MESHTASTIC_EXCLUDE_I2C + else if (selected == 3) { accelerometerThread->calibrate(30); } +#endif + else { + menuQueue = menu_none; + } }); } diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp index 783c08b9f..2b3e89fb3 100644 --- a/src/modules/Modules.cpp +++ b/src/modules/Modules.cpp @@ -162,7 +162,7 @@ void setupModules() #endif // Example: Put your module here // new ReplyModule(); -#if (HAS_BUTTON || ARCH_PORTDUINO) && !MESHTASTIC_EXCLUDE_INPUTBROKER +#if (HAS_BUTTON || ARCH_PORTDUINO) && !MESHTASTIC_EXCLUDE_INPUTBROKER && !MESHTASTIC_EXCLUDE_I2C if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) { rotaryEncoderInterruptImpl1 = new RotaryEncoderInterruptImpl1(); From f40b2ba1538ea6723729b4cb9815efe5191ee9d7 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Fri, 18 Jul 2025 03:14:45 +0200 Subject: [PATCH 06/16] temp workaround for nimble compile --- arch/esp32/esp32.ini | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini index 8b5ef7147..cbc5e753b 100644 --- a/arch/esp32/esp32.ini +++ b/arch/esp32/esp32.ini @@ -4,7 +4,7 @@ extends = arduino_base custom_esp32_kind = esp32 platform = # renovate: datasource=custom.pio depName=platformio/espressif32 packageName=platformio/platform/espressif32 - platformio/espressif32@6.11.0 + # platformio/espressif32@6.11.0 build_src_filter = ${arduino_base.build_src_filter} - - - - - @@ -30,10 +30,10 @@ build_flags = -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -DMYNEWT_VAL_BLE_HS_LOG_LVL=LOG_LEVEL_CRITICAL -DAXP_DEBUG_PORT=Serial - -DCONFIG_BT_NIMBLE_ENABLED - -DCONFIG_NIMBLE_CPP_LOG_LEVEL=2 - -DCONFIG_BT_NIMBLE_MAX_CCCDS=20 - -DCONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=8192 + ;-DCONFIG_BT_NIMBLE_ENABLED + ;-DCONFIG_NIMBLE_CPP_LOG_LEVEL=2 + ;-DCONFIG_BT_NIMBLE_MAX_CCCDS=20 + ;-DCONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=8192 -DESP_OPENSSL_SUPPRESS_LEGACY_WARNING -DSERIAL_BUFFER_SIZE=4096 -DLIBPAX_ARDUINO From f25544c7e07affe8c97f5dddf0795d1f194c0478 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Fri, 18 Jul 2025 03:16:54 +0200 Subject: [PATCH 07/16] updated platform references --- .../seeed-sensecap-indicator/platformio.ini | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/variants/seeed-sensecap-indicator/platformio.ini b/variants/seeed-sensecap-indicator/platformio.ini index d3d172b71..aafb55449 100644 --- a/variants/seeed-sensecap-indicator/platformio.ini +++ b/variants/seeed-sensecap-indicator/platformio.ini @@ -2,17 +2,25 @@ [env:seeed-sensecap-indicator] extends = esp32s3_base platform = - https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip + ;https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip + https://github.com/pioarduino/platform-espressif32.git#develop + ;symlink:///home/manuel/Documents/PlatformIO/Projects/platform-espressif32 platform_packages = - ;platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/aef7fef6de3329ed6f75512d46d63bba12b09bb5.zip ; add_tca9535 (based on 2.0.16) - platformio/framework-arduinoespressif32-libs@https://dl.espressif.com/AE/esp-arduino-libs/esp32-3.2.0-h.zip + ;platformio/framework-arduinoespressif32-libs@https://dl.espressif.com/AE/esp-arduino-libs/esp32-3.2.0-h.zip + platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/919e485187a77b62b93f9b7fa09f43a8eeceaa44.zip + ;platformio/framework-arduinoespressif32 @ symlink:///home/manuel/Documents/PlatformIO/Projects/arduino-esp32 board = seeed-sensecap-indicator board_check = true -board_build.partitions = default_8MB.csv upload_protocol = esptool -build_flags = ${esp32_base.build_flags} -D lcd_periph_signals=lcd_periph_rgb_signals +build_unflags = + -DCONFIG_BT_NIMBLE_ENABLED + -DCONFIG_NIMBLE_CPP_LOG_LEVEL=2 + -DCONFIG_BT_NIMBLE_MAX_CCCDS=20 + -DCONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=8192 + +build_flags = ${esp32_base.build_flags} -D lcd_periph_signals=lcd_periph_rgb_signals -mtext-section-literals -ffat-lto-objects -Ivariants/seeed-sensecap-indicator -DSENSECAP_INDICATOR -DCONFIG_ARDUHAL_LOG_COLORS @@ -28,8 +36,6 @@ build_flags = ${esp32_base.build_flags} -D lcd_periph_signals=lcd_periph_rgb_sig lib_deps = ${esp32s3_base.lib_deps} https://github.com/mverch67/LovyanGFX/archive/502127dfe28ab766b7ce7ba6470175ab6c9c1288.zip - earlephilhower/ESP8266Audio@^1.9.9 - earlephilhower/ESP8266SAM@^1.0.1 custom_component_remove = espressif/esp_hosted @@ -45,6 +51,40 @@ custom_component_remove = espressif/esp_rainmaker espressif/rmaker_common +custom_sdkconfig = + CONFIG_SPIRAM_MODE_OCT=y + CONFIG_SPIRAM_SPEED_120M=y + CONFIG_LCD_RGB_ISR_IRAM_SAFE=y + CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y + CONFIG_I2S_ISR_IRAM_SAFE=y + CONFIG_GDMA_ISR_IRAM_SAFE=y + CONFIG_SPIRAM_XIP_FROM_PSRAM=y + CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y + CONFIG_SPIRAM_RODATA=y + CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y + CONFIG_ESP32S3_DATA_CACHE_64KB=y + CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y + CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y + CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y + CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y + CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH=y + CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM=y + CONFIG_ESP_WIFI_IRAM_OPT=n + CONFIG_ESP32_WIFI_RX_IRAM_OPT=n + CONFIG_SPIRAM_CACHE_LIBCHAR_IN_IRAM=n + CONFIG_SPIRAM_CACHE_LIBSTR_IN_IRAM=n + CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM=n + CONFIG_SPIRAM_CACHE_LIBTIME_IN_IRAM=n + CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=0 + CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y + CONFIG_BT_ENABLED=y + CONFIG_BT_NIMBLE_ENABLED=y + CONFIG_BT_BLUEDROID_ENABLED=y + CONFIG_BT_CONTROLLER_ENABLED=y + CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=8192 + CONFIG_BT_NIMBLE_MAX_CCCDS=20 + CONFIG_BT_NIMBLE_CPP_LOG_LEVEL=2 + [env:seeed-sensecap-indicator-tft] extends = env:seeed-sensecap-indicator board_level = main @@ -53,10 +93,12 @@ upload_speed = 460800 build_flags = ${env:seeed-sensecap-indicator.build_flags} -D INPUTDRIVER_BUTTON_TYPE=38 + -D MESHTASTIC_EXCLUDE_I2C=1 -D MESHTASTIC_EXCLUDE_WEBSERVER=1 -D MESHTASTIC_EXCLUDE_SERIAL=1 -D MESHTASTIC_EXCLUDE_SOCKETAPI=1 -D MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR=1 + -D MESHTASTIC_EXCLUDE_WIFI=1 ; workaround due to duplicated definitions of Syslog -D HAS_TELEMETRY=0 -D CONFIG_DISABLE_HAL_LOCKS=1 -D HAS_SCREEN=1 From 6cdb92b7a892484b0fb9b8dcd5e8a6861b95a880 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 21:06:19 +0200 Subject: [PATCH 08/16] fix merge error --- src/graphics/draw/MenuHandler.cpp | 1301 +++++++++++++++-------------- 1 file changed, 652 insertions(+), 649 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 99989c235..2225db8b4 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -483,7 +483,7 @@ void menuHandler::positionBaseMenu() } else #endif { - optionsArrayPtr = optionsArray; + bannerOptions.optionsArrayPtr = optionsArray; options = 3; } BannerOverlayOptions bannerOptions; @@ -502,709 +502,712 @@ void menuHandler::positionBaseMenu() } else if (selected == CompassCalibrate) { accelerometerThread->calibrate(30); #endif - else { - menuQueue = menu_none; - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::nodeListMenu() -{ - enum optionsNumbers { Back, Favorite, TraceRoute, Verify, Reset, enumEnd }; - static const char *optionsArray[] = {"Back", "Add Favorite", "Trace Route", "Key Verification", "Reset NodeDB"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Node Action"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 5; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Favorite) { - menuQueue = add_favorite; - screen->runNow(); - } else if (selected == Verify) { - menuQueue = key_verification_init; - screen->runNow(); - } else if (selected == Reset) { - menuQueue = reset_node_db_menu; - screen->runNow(); - } else if (selected == TraceRoute) { - menuQueue = trace_route_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::resetNodeDBMenu() -{ - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Confirm Reset NodeDB"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - disableBluetooth(); - LOG_INFO("Initiate node-db reset"); - nodeDB->resetNodes(); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::compassNorthMenu() -{ - enum optionsNumbers { Back, Dynamic, Fixed, Freeze }; - static const char *optionsArray[] = {"Back", "Dynamic", "Fixed Ring", "Freeze Heading"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "North Directions?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; - bannerOptions.InitialSelected = uiconfig.compass_mode + 1; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Dynamic) { - if (uiconfig.compass_mode != meshtastic_CompassMode_DYNAMIC) { - uiconfig.compass_mode = meshtastic_CompassMode_DYNAMIC; - saveUIConfig(); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + else + { + menuQueue = menu_none; } - } else if (selected == Fixed) { - if (uiconfig.compass_mode != meshtastic_CompassMode_FIXED_RING) { - uiconfig.compass_mode = meshtastic_CompassMode_FIXED_RING; - saveUIConfig(); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + }; + screen->showOverlayBanner(bannerOptions); + } + + void + menuHandler::nodeListMenu() + { + enum optionsNumbers { Back, Favorite, TraceRoute, Verify, Reset, enumEnd }; + static const char *optionsArray[] = {"Back", "Add Favorite", "Trace Route", "Key Verification", "Reset NodeDB"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Node Action"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 5; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Favorite) { + menuQueue = add_favorite; + screen->runNow(); + } else if (selected == Verify) { + menuQueue = key_verification_init; + screen->runNow(); + } else if (selected == Reset) { + menuQueue = reset_node_db_menu; + screen->runNow(); + } else if (selected == TraceRoute) { + menuQueue = trace_route_menu; + screen->runNow(); } - } else if (selected == Freeze) { - if (uiconfig.compass_mode != meshtastic_CompassMode_FREEZE_HEADING) { - uiconfig.compass_mode = meshtastic_CompassMode_FREEZE_HEADING; - saveUIConfig(); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + }; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::resetNodeDBMenu() + { + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Confirm Reset NodeDB"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + disableBluetooth(); + LOG_INFO("Initiate node-db reset"); + nodeDB->resetNodes(); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); } - } else if (selected == Back) { - menuQueue = position_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} + }; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::compassNorthMenu() + { + enum optionsNumbers { Back, Dynamic, Fixed, Freeze }; + static const char *optionsArray[] = {"Back", "Dynamic", "Fixed Ring", "Freeze Heading"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "North Directions?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + bannerOptions.InitialSelected = uiconfig.compass_mode + 1; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Dynamic) { + if (uiconfig.compass_mode != meshtastic_CompassMode_DYNAMIC) { + uiconfig.compass_mode = meshtastic_CompassMode_DYNAMIC; + saveUIConfig(); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } + } else if (selected == Fixed) { + if (uiconfig.compass_mode != meshtastic_CompassMode_FIXED_RING) { + uiconfig.compass_mode = meshtastic_CompassMode_FIXED_RING; + saveUIConfig(); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } + } else if (selected == Freeze) { + if (uiconfig.compass_mode != meshtastic_CompassMode_FREEZE_HEADING) { + uiconfig.compass_mode = meshtastic_CompassMode_FREEZE_HEADING; + saveUIConfig(); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } + } else if (selected == Back) { + menuQueue = position_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } #if !MESHTASTIC_EXCLUDE_GPS -void menuHandler::GPSToggleMenu() -{ + void menuHandler::GPSToggleMenu() + { - static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Toggle GPS"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 3; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_ENABLED; - playGPSEnableBeep(); - gps->enable(); - service->reloadConfig(SEGMENT_CONFIG); - } else if (selected == 2) { - config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_DISABLED; - playGPSDisableBeep(); - gps->disable(); - service->reloadConfig(SEGMENT_CONFIG); - } else { - menuQueue = position_base_menu; - screen->runNow(); - } - }; - bannerOptions.InitialSelected = config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED ? 1 : 2; - screen->showOverlayBanner(bannerOptions); -} + static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Toggle GPS"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 3; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_ENABLED; + playGPSEnableBeep(); + gps->enable(); + service->reloadConfig(SEGMENT_CONFIG); + } else if (selected == 2) { + config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_DISABLED; + playGPSDisableBeep(); + gps->disable(); + service->reloadConfig(SEGMENT_CONFIG); + } else { + menuQueue = position_base_menu; + screen->runNow(); + } + }; + bannerOptions.InitialSelected = config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED ? 1 : 2; + screen->showOverlayBanner(bannerOptions); + } #endif -void menuHandler::BluetoothToggleMenu() -{ - static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Toggle Bluetooth"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 3; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1 || selected == 2) { - InputEvent event = {.inputEvent = (input_broker_event)170, .kbchar = 170, .touchX = 0, .touchY = 0}; - inputBroker->injectInputEvent(&event); - } - }; - bannerOptions.InitialSelected = config.bluetooth.enabled ? 1 : 2; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::BuzzerModeMenu() -{ - static const char *optionsArray[] = {"All Enabled", "Disabled", "Notifications", "System Only"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Buzzer Mode"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; - bannerOptions.bannerCallback = [](int selected) -> void { - config.device.buzzer_mode = (meshtastic_Config_DeviceConfig_BuzzerMode)selected; - service->reloadConfig(SEGMENT_CONFIG); - }; - bannerOptions.InitialSelected = config.device.buzzer_mode; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::BrightnessPickerMenu() -{ - static const char *optionsArray[] = {"Back", "Low", "Medium", "High"}; - - // Get current brightness level to set initial selection - int currentSelection = 1; // Default to Medium - if (uiconfig.screen_brightness >= 255) { - currentSelection = 3; // Very High - } else if (uiconfig.screen_brightness >= 128) { - currentSelection = 2; // High - } else { - currentSelection = 1; // Medium + void menuHandler::BluetoothToggleMenu() + { + static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Toggle Bluetooth"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 3; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1 || selected == 2) { + InputEvent event = {.inputEvent = (input_broker_event)170, .kbchar = 170, .touchX = 0, .touchY = 0}; + inputBroker->injectInputEvent(&event); + } + }; + bannerOptions.InitialSelected = config.bluetooth.enabled ? 1 : 2; + screen->showOverlayBanner(bannerOptions); } - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Brightness"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { // Medium - uiconfig.screen_brightness = 64; - } else if (selected == 2) { // High - uiconfig.screen_brightness = 128; - } else if (selected == 3) { // Very High - uiconfig.screen_brightness = 255; + void menuHandler::BuzzerModeMenu() + { + static const char *optionsArray[] = {"All Enabled", "Disabled", "Notifications", "System Only"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Buzzer Mode"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + bannerOptions.bannerCallback = [](int selected) -> void { + config.device.buzzer_mode = (meshtastic_Config_DeviceConfig_BuzzerMode)selected; + service->reloadConfig(SEGMENT_CONFIG); + }; + bannerOptions.InitialSelected = config.device.buzzer_mode; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::BrightnessPickerMenu() + { + static const char *optionsArray[] = {"Back", "Low", "Medium", "High"}; + + // Get current brightness level to set initial selection + int currentSelection = 1; // Default to Medium + if (uiconfig.screen_brightness >= 255) { + currentSelection = 3; // Very High + } else if (uiconfig.screen_brightness >= 128) { + currentSelection = 2; // High + } else { + currentSelection = 1; // Medium } - if (selected != 0) { // Not "Back" - // Apply brightness immediately + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Brightness"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { // Medium + uiconfig.screen_brightness = 64; + } else if (selected == 2) { // High + uiconfig.screen_brightness = 128; + } else if (selected == 3) { // Very High + uiconfig.screen_brightness = 255; + } + + if (selected != 0) { // Not "Back" + // Apply brightness immediately #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) - // For HELTEC devices, use analogWrite to control backlight - analogWrite(VTFT_LEDA, uiconfig.screen_brightness); + // For HELTEC devices, use analogWrite to control backlight + analogWrite(VTFT_LEDA, uiconfig.screen_brightness); #elif defined(ST7789_CS) - static_cast(screen->getDisplayDevice())->setDisplayBrightness(uiconfig.screen_brightness); + static_cast(screen->getDisplayDevice())->setDisplayBrightness(uiconfig.screen_brightness); #elif defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) - screen->getDisplayDevice()->setBrightness(uiconfig.screen_brightness); + screen->getDisplayDevice()->setBrightness(uiconfig.screen_brightness); #endif - // Save to device - saveUIConfig(); + // Save to device + saveUIConfig(); - LOG_INFO("Screen brightness set to %d", uiconfig.screen_brightness); - } - }; - bannerOptions.InitialSelected = currentSelection; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::switchToMUIMenu() -{ - static const char *optionsArray[] = {"No", "Yes"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Switch to MUI?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - config.display.displaymode = meshtastic_Config_DisplayConfig_DisplayMode_COLOR; - config.bluetooth.enabled = false; - service->reloadConfig(SEGMENT_CONFIG); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::TFTColorPickerMenu(OLEDDisplay *display) -{ - static const char *optionsArray[] = {"Back", "Default", "Meshtastic Green", "Yellow", "Red", "Orange", "Purple", "Teal", - "Pink", "White"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Select Screen Color"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 10; - bannerOptions.bannerCallback = [display](int selected) -> void { -#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT - uint8_t TFT_MESH_r = 0; - uint8_t TFT_MESH_g = 0; - uint8_t TFT_MESH_b = 0; - if (selected == 1) { - LOG_INFO("Setting color to system default or defined variant"); - // Given just before we set all these to zero, we will allow this to go through - } else if (selected == 2) { - LOG_INFO("Setting color to Meshtastic Green"); - TFT_MESH_r = 103; - TFT_MESH_g = 234; - TFT_MESH_b = 148; - } else if (selected == 3) { - LOG_INFO("Setting color to Yellow"); - TFT_MESH_r = 255; - TFT_MESH_g = 255; - TFT_MESH_b = 128; - } else if (selected == 4) { - LOG_INFO("Setting color to Red"); - TFT_MESH_r = 255; - TFT_MESH_g = 64; - TFT_MESH_b = 64; - } else if (selected == 5) { - LOG_INFO("Setting color to Orange"); - TFT_MESH_r = 255; - TFT_MESH_g = 160; - TFT_MESH_b = 20; - } else if (selected == 6) { - LOG_INFO("Setting color to Purple"); - TFT_MESH_r = 204; - TFT_MESH_g = 153; - TFT_MESH_b = 255; - } else if (selected == 7) { - LOG_INFO("Setting color to Teal"); - TFT_MESH_r = 64; - TFT_MESH_g = 224; - TFT_MESH_b = 208; - } else if (selected == 8) { - LOG_INFO("Setting color to Pink"); - TFT_MESH_r = 255; - TFT_MESH_g = 105; - TFT_MESH_b = 180; - } else if (selected == 9) { - LOG_INFO("Setting color to White"); - TFT_MESH_r = 255; - TFT_MESH_g = 255; - TFT_MESH_b = 255; - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - - if (selected != 0) { - display->setColor(BLACK); - display->fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - display->setColor(WHITE); - - if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { -#ifdef TFT_MESH_OVERRIDE - TFT_MESH = TFT_MESH_OVERRIDE; -#else - TFT_MESH = COLOR565(0x67, 0xEA, 0x94); -#endif - } else { - TFT_MESH = COLOR565(TFT_MESH_r, TFT_MESH_g, TFT_MESH_b); + LOG_INFO("Screen brightness set to %d", uiconfig.screen_brightness); } + }; + bannerOptions.InitialSelected = currentSelection; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::switchToMUIMenu() + { + static const char *optionsArray[] = {"No", "Yes"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Switch to MUI?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + config.display.displaymode = meshtastic_Config_DisplayConfig_DisplayMode_COLOR; + config.bluetooth.enabled = false; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } + }; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::TFTColorPickerMenu(OLEDDisplay * display) + { + static const char *optionsArray[] = {"Back", "Default", "Meshtastic Green", "Yellow", "Red", "Orange", "Purple", "Teal", + "Pink", "White"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Select Screen Color"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 10; + bannerOptions.bannerCallback = [display](int selected) -> void { +#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT + uint8_t TFT_MESH_r = 0; + uint8_t TFT_MESH_g = 0; + uint8_t TFT_MESH_b = 0; + if (selected == 1) { + LOG_INFO("Setting color to system default or defined variant"); + // Given just before we set all these to zero, we will allow this to go through + } else if (selected == 2) { + LOG_INFO("Setting color to Meshtastic Green"); + TFT_MESH_r = 103; + TFT_MESH_g = 234; + TFT_MESH_b = 148; + } else if (selected == 3) { + LOG_INFO("Setting color to Yellow"); + TFT_MESH_r = 255; + TFT_MESH_g = 255; + TFT_MESH_b = 128; + } else if (selected == 4) { + LOG_INFO("Setting color to Red"); + TFT_MESH_r = 255; + TFT_MESH_g = 64; + TFT_MESH_b = 64; + } else if (selected == 5) { + LOG_INFO("Setting color to Orange"); + TFT_MESH_r = 255; + TFT_MESH_g = 160; + TFT_MESH_b = 20; + } else if (selected == 6) { + LOG_INFO("Setting color to Purple"); + TFT_MESH_r = 204; + TFT_MESH_g = 153; + TFT_MESH_b = 255; + } else if (selected == 7) { + LOG_INFO("Setting color to Teal"); + TFT_MESH_r = 64; + TFT_MESH_g = 224; + TFT_MESH_b = 208; + } else if (selected == 8) { + LOG_INFO("Setting color to Pink"); + TFT_MESH_r = 255; + TFT_MESH_g = 105; + TFT_MESH_b = 180; + } else if (selected == 9) { + LOG_INFO("Setting color to White"); + TFT_MESH_r = 255; + TFT_MESH_g = 255; + TFT_MESH_b = 255; + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + + if (selected != 0) { + display->setColor(BLACK); + display->fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + display->setColor(WHITE); + + if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { +#ifdef TFT_MESH_OVERRIDE + TFT_MESH = TFT_MESH_OVERRIDE; +#else + TFT_MESH = COLOR565(0x67, 0xEA, 0x94); +#endif + } else { + TFT_MESH = COLOR565(TFT_MESH_r, TFT_MESH_g, TFT_MESH_b); + } #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) - static_cast(screen->getDisplayDevice())->setRGB(TFT_MESH); + static_cast(screen->getDisplayDevice())->setRGB(TFT_MESH); #endif - screen->setFrames(graphics::Screen::FOCUS_SYSTEM); - if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { - uiconfig.screen_rgb_color = 0; - } else { - uiconfig.screen_rgb_color = (TFT_MESH_r << 16) | (TFT_MESH_g << 8) | TFT_MESH_b; + screen->setFrames(graphics::Screen::FOCUS_SYSTEM); + if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { + uiconfig.screen_rgb_color = 0; + } else { + uiconfig.screen_rgb_color = (TFT_MESH_r << 16) | (TFT_MESH_g << 8) | TFT_MESH_b; + } + LOG_INFO("Storing Value of %d to uiconfig.screen_rgb_color", uiconfig.screen_rgb_color); + saveUIConfig(); } - LOG_INFO("Storing Value of %d to uiconfig.screen_rgb_color", uiconfig.screen_rgb_color); - saveUIConfig(); - } #endif - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::rebootMenu() -{ - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Reboot Device?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - IF_SCREEN(screen->showSimpleBanner("Rebooting...", 0)); - nodeDB->saveToDisk(); - rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; - } else { - menuQueue = power_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::shutdownMenu() -{ - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Shutdown Device?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - InputEvent event = {.inputEvent = (input_broker_event)INPUT_BROKER_SHUTDOWN, .kbchar = 0, .touchX = 0, .touchY = 0}; - inputBroker->injectInputEvent(&event); - } else { - menuQueue = power_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::addFavoriteMenu() -{ - screen->showNodePicker("Node To Favorite", 30000, [](uint32_t nodenum) -> void { - LOG_WARN("Nodenum: %u", nodenum); - nodeDB->set_favorite(true, nodenum); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); - }); -} - -void menuHandler::removeFavoriteMenu() -{ - - static const char *optionsArray[] = {"Back", "Yes"}; - BannerOverlayOptions bannerOptions; - std::string message = "Unfavorite This Node?\n"; - auto node = nodeDB->getMeshNode(graphics::UIRenderer::currentFavoriteNodeNum); - if (node && node->has_user) { - message += sanitizeString(node->user.long_name).substr(0, 15); + }; + screen->showOverlayBanner(bannerOptions); } - bannerOptions.message = message.c_str(); - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - LOG_INFO("Removing %x as favorite node", graphics::UIRenderer::currentFavoriteNodeNum); - nodeDB->set_favorite(false, graphics::UIRenderer::currentFavoriteNodeNum); - screen->setFrames(graphics::Screen::FOCUS_DEFAULT); + + void menuHandler::rebootMenu() + { + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Reboot Device?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + IF_SCREEN(screen->showSimpleBanner("Rebooting...", 0)); + nodeDB->saveToDisk(); + rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; + } else { + menuQueue = power_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::shutdownMenu() + { + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Shutdown Device?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + InputEvent event = { + .inputEvent = (input_broker_event)INPUT_BROKER_SHUTDOWN, .kbchar = 0, .touchX = 0, .touchY = 0}; + inputBroker->injectInputEvent(&event); + } else { + menuQueue = power_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::addFavoriteMenu() + { + screen->showNodePicker("Node To Favorite", 30000, [](uint32_t nodenum) -> void { + LOG_WARN("Nodenum: %u", nodenum); + nodeDB->set_favorite(true, nodenum); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + }); + } + + void menuHandler::removeFavoriteMenu() + { + + static const char *optionsArray[] = {"Back", "Yes"}; + BannerOverlayOptions bannerOptions; + std::string message = "Unfavorite This Node?\n"; + auto node = nodeDB->getMeshNode(graphics::UIRenderer::currentFavoriteNodeNum); + if (node && node->has_user) { + message += sanitizeString(node->user.long_name).substr(0, 15); } - }; - screen->showOverlayBanner(bannerOptions); -} + bannerOptions.message = message.c_str(); + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + LOG_INFO("Removing %x as favorite node", graphics::UIRenderer::currentFavoriteNodeNum); + nodeDB->set_favorite(false, graphics::UIRenderer::currentFavoriteNodeNum); + screen->setFrames(graphics::Screen::FOCUS_DEFAULT); + } + }; + screen->showOverlayBanner(bannerOptions); + } -void menuHandler::traceRouteMenu() -{ - screen->showNodePicker("Node to Trace", 30000, [](uint32_t nodenum) -> void { - LOG_INFO("Menu: Node picker selected node 0x%08x, traceRouteModule=%p", nodenum, traceRouteModule); - if (traceRouteModule) { - traceRouteModule->startTraceRoute(nodenum); - } - }); -} + void menuHandler::traceRouteMenu() + { + screen->showNodePicker("Node to Trace", 30000, [](uint32_t nodenum) -> void { + LOG_INFO("Menu: Node picker selected node 0x%08x, traceRouteModule=%p", nodenum, traceRouteModule); + if (traceRouteModule) { + traceRouteModule->startTraceRoute(nodenum); + } + }); + } -void menuHandler::testMenu() -{ + void menuHandler::testMenu() + { - static const char *optionsArray[] = {"Back", "Number Picker"}; - BannerOverlayOptions bannerOptions; - std::string message = "Test to Run?\n"; - bannerOptions.message = message.c_str(); - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - menuQueue = number_test; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} + static const char *optionsArray[] = {"Back", "Number Picker"}; + BannerOverlayOptions bannerOptions; + std::string message = "Test to Run?\n"; + bannerOptions.message = message.c_str(); + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + menuQueue = number_test; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } -void menuHandler::numberTest() -{ - screen->showNumberPicker("Pick a number\n ", 30000, 4, - [](int number_picked) -> void { LOG_WARN("Nodenum: %u", number_picked); }); -} + void menuHandler::numberTest() + { + screen->showNumberPicker("Pick a number\n ", 30000, 4, + [](int number_picked) -> void { LOG_WARN("Nodenum: %u", number_picked); }); + } -void menuHandler::wifiBaseMenu() -{ - enum optionsNumbers { Back, Wifi_toggle }; + void menuHandler::wifiBaseMenu() + { + enum optionsNumbers { Back, Wifi_toggle }; - static const char *optionsArray[] = {"Back", "WiFi Toggle"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "WiFi Menu"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Wifi_toggle) { - menuQueue = wifi_toggle_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} + static const char *optionsArray[] = {"Back", "WiFi Toggle"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "WiFi Menu"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Wifi_toggle) { + menuQueue = wifi_toggle_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } -void menuHandler::wifiToggleMenu() -{ - enum optionsNumbers { Back, Wifi_toggle }; + void menuHandler::wifiToggleMenu() + { + enum optionsNumbers { Back, Wifi_toggle }; - static const char *optionsArray[] = {"Back", "Disable"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Disable Wifi and\nEnable Bluetooth?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Wifi_toggle) { - config.network.wifi_enabled = false; - config.bluetooth.enabled = true; - service->reloadConfig(SEGMENT_CONFIG); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - } - }; - screen->showOverlayBanner(bannerOptions); -} + static const char *optionsArray[] = {"Back", "Disable"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Disable Wifi and\nEnable Bluetooth?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Wifi_toggle) { + config.network.wifi_enabled = false; + config.bluetooth.enabled = true; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } + }; + screen->showOverlayBanner(bannerOptions); + } -void menuHandler::notificationsMenu() -{ - enum optionsNumbers { Back, BuzzerActions }; - static const char *optionsArray[] = {"Back", "Buzzer Actions"}; - static int optionsEnumArray[] = {Back, BuzzerActions}; - int options = 2; + void menuHandler::notificationsMenu() + { + enum optionsNumbers { Back, BuzzerActions }; + static const char *optionsArray[] = {"Back", "Buzzer Actions"}; + static int optionsEnumArray[] = {Back, BuzzerActions}; + int options = 2; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Notifications"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = options; - bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == BuzzerActions) { - menuHandler::menuQueue = menuHandler::buzzermodemenupicker; - screen->runNow(); - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Notifications"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == BuzzerActions) { + menuHandler::menuQueue = menuHandler::buzzermodemenupicker; + screen->runNow(); + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } -void menuHandler::screenOptionsMenu() -{ - // Check if brightness is supported - bool hasSupportBrightness = false; + void menuHandler::screenOptionsMenu() + { + // Check if brightness is supported + bool hasSupportBrightness = false; #if defined(ST7789_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) - hasSupportBrightness = true; + hasSupportBrightness = true; #endif #if defined(T_DECK) - // TDeck Doesn't seem to support brightness at all, at least not reliably - hasSupportBrightness = false; + // TDeck Doesn't seem to support brightness at all, at least not reliably + hasSupportBrightness = false; #endif - enum optionsNumbers { Back, Brightness, ScreenColor }; - static const char *optionsArray[4] = {"Back"}; - static int optionsEnumArray[4] = {Back}; - int options = 1; + enum optionsNumbers { Back, Brightness, ScreenColor }; + static const char *optionsArray[4] = {"Back"}; + static int optionsEnumArray[4] = {Back}; + int options = 1; - // Only show brightness for B&W displays - if (hasSupportBrightness) { - optionsArray[options] = "Brightness"; - optionsEnumArray[options++] = Brightness; - } + // Only show brightness for B&W displays + if (hasSupportBrightness) { + optionsArray[options] = "Brightness"; + optionsEnumArray[options++] = Brightness; + } - // Only show screen color for TFT displays + // Only show screen color for TFT displays #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT - optionsArray[options] = "Screen Color"; - optionsEnumArray[options++] = ScreenColor; + optionsArray[options] = "Screen Color"; + optionsEnumArray[options++] = ScreenColor; #endif - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Screen Options"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = options; - bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Brightness) { - menuHandler::menuQueue = menuHandler::brightness_picker; - screen->runNow(); - } else if (selected == ScreenColor) { - menuHandler::menuQueue = menuHandler::tftcolormenupicker; - screen->runNow(); - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::powerMenu() -{ - - enum optionsNumbers { Back, Reboot, Shutdown, MUI }; - static const char *optionsArray[4] = {"Back"}; - static int optionsEnumArray[4] = {Back}; - int options = 1; - - optionsArray[options] = "Reboot"; - optionsEnumArray[options++] = Reboot; - - optionsArray[options] = "Shutdown"; - optionsEnumArray[options++] = Shutdown; - -#if HAS_TFT - optionsArray[options] = "Switch to MUI"; - optionsEnumArray[options++] = MUI; -#endif - - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Reboot / Shutdown"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = options; - bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Reboot) { - menuHandler::menuQueue = menuHandler::reboot_menu; - screen->runNow(); - } else if (selected == Shutdown) { - menuHandler::menuQueue = menuHandler::shutdown_menu; - screen->runNow(); - } else if (selected == MUI) { - menuHandler::menuQueue = menuHandler::mui_picker; - screen->runNow(); - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); -} - -void menuHandler::keyVerificationInitMenu() -{ - screen->showNodePicker("Node to Verify", 30000, - [](uint32_t selected) -> void { keyVerificationModule->sendInitialRequest(selected); }); -} - -void menuHandler::keyVerificationFinalPrompt() -{ - char message[40] = {0}; - memset(message, 0, sizeof(message)); - sprintf(message, "Verification: \n"); - keyVerificationModule->generateVerificationCode(message + 15); // send the toPhone packet - - if (screen) { - static const char *optionsArray[] = {"Reject", "Accept"}; - graphics::BannerOverlayOptions options; - options.message = message; - options.durationMs = 30000; - options.optionsArrayPtr = optionsArray; - options.optionsCount = 2; - options.notificationType = graphics::notificationTypeEnum::selection_picker; - options.bannerCallback = [=](int selected) { - if (selected == 1) { - auto remoteNodePtr = nodeDB->getMeshNode(keyVerificationModule->getCurrentRemoteNode()); - remoteNodePtr->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Screen Options"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Brightness) { + menuHandler::menuQueue = menuHandler::brightness_picker; + screen->runNow(); + } else if (selected == ScreenColor) { + menuHandler::menuQueue = menuHandler::tftcolormenupicker; + screen->runNow(); + } else { + menuQueue = system_base_menu; + screen->runNow(); } }; - screen->showOverlayBanner(options); + screen->showOverlayBanner(bannerOptions); } -} -void menuHandler::handleMenuSwitch(OLEDDisplay *display) -{ - if (menuQueue != menu_none) - test_count = 0; - switch (menuQueue) { - case menu_none: - break; - case lora_picker: - LoraRegionPicker(); - break; - case TZ_picker: - TZPicker(); - break; - case twelve_hour_picker: - TwelveHourPicker(); - break; - case clock_face_picker: - ClockFacePicker(); - break; - case clock_menu: - clockMenu(); - break; - case system_base_menu: - systemBaseMenu(); - break; - case position_base_menu: - positionBaseMenu(); - break; -#if !MESHTASTIC_EXCLUDE_GPS - case gps_toggle_menu: - GPSToggleMenu(); - break; + void menuHandler::powerMenu() + { + + enum optionsNumbers { Back, Reboot, Shutdown, MUI }; + static const char *optionsArray[4] = {"Back"}; + static int optionsEnumArray[4] = {Back}; + int options = 1; + + optionsArray[options] = "Reboot"; + optionsEnumArray[options++] = Reboot; + + optionsArray[options] = "Shutdown"; + optionsEnumArray[options++] = Shutdown; + +#if HAS_TFT + optionsArray[options] = "Switch to MUI"; + optionsEnumArray[options++] = MUI; #endif - case compass_point_north_menu: - compassNorthMenu(); - break; - case reset_node_db_menu: - resetNodeDBMenu(); - break; - case buzzermodemenupicker: - BuzzerModeMenu(); - break; - case mui_picker: - switchToMUIMenu(); - break; - case tftcolormenupicker: - TFTColorPickerMenu(display); - break; - case brightness_picker: - BrightnessPickerMenu(); - break; - case reboot_menu: - rebootMenu(); - break; - case shutdown_menu: - shutdownMenu(); - break; - case add_favorite: - addFavoriteMenu(); - break; - case remove_favorite: - removeFavoriteMenu(); - break; - case trace_route_menu: - traceRouteMenu(); - break; - case test_menu: - testMenu(); - break; - case number_test: - numberTest(); - break; - case wifi_toggle_menu: - wifiToggleMenu(); - break; - case key_verification_init: - keyVerificationInitMenu(); - break; - case key_verification_final_prompt: - keyVerificationFinalPrompt(); - break; - case bluetooth_toggle_menu: - BluetoothToggleMenu(); - break; - case notifications_menu: - notificationsMenu(); - break; - case screen_options_menu: - screenOptionsMenu(); - break; - case power_menu: - powerMenu(); - break; - case throttle_message: - screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); - break; - } - menuQueue = menu_none; -} -void menuHandler::saveUIConfig() -{ - nodeDB->saveProto("/prefs/uiconfig.proto", meshtastic_DeviceUIConfig_size, &meshtastic_DeviceUIConfig_msg, &uiconfig); -} + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Reboot / Shutdown"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Reboot) { + menuHandler::menuQueue = menuHandler::reboot_menu; + screen->runNow(); + } else if (selected == Shutdown) { + menuHandler::menuQueue = menuHandler::shutdown_menu; + screen->runNow(); + } else if (selected == MUI) { + menuHandler::menuQueue = menuHandler::mui_picker; + screen->runNow(); + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); + } + + void menuHandler::keyVerificationInitMenu() + { + screen->showNodePicker("Node to Verify", 30000, + [](uint32_t selected) -> void { keyVerificationModule->sendInitialRequest(selected); }); + } + + void menuHandler::keyVerificationFinalPrompt() + { + char message[40] = {0}; + memset(message, 0, sizeof(message)); + sprintf(message, "Verification: \n"); + keyVerificationModule->generateVerificationCode(message + 15); // send the toPhone packet + + if (screen) { + static const char *optionsArray[] = {"Reject", "Accept"}; + graphics::BannerOverlayOptions options; + options.message = message; + options.durationMs = 30000; + options.optionsArrayPtr = optionsArray; + options.optionsCount = 2; + options.notificationType = graphics::notificationTypeEnum::selection_picker; + options.bannerCallback = [=](int selected) { + if (selected == 1) { + auto remoteNodePtr = nodeDB->getMeshNode(keyVerificationModule->getCurrentRemoteNode()); + remoteNodePtr->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; + } + }; + screen->showOverlayBanner(options); + } + } + + void menuHandler::handleMenuSwitch(OLEDDisplay * display) + { + if (menuQueue != menu_none) + test_count = 0; + switch (menuQueue) { + case menu_none: + break; + case lora_picker: + LoraRegionPicker(); + break; + case TZ_picker: + TZPicker(); + break; + case twelve_hour_picker: + TwelveHourPicker(); + break; + case clock_face_picker: + ClockFacePicker(); + break; + case clock_menu: + clockMenu(); + break; + case system_base_menu: + systemBaseMenu(); + break; + case position_base_menu: + positionBaseMenu(); + break; +#if !MESHTASTIC_EXCLUDE_GPS + case gps_toggle_menu: + GPSToggleMenu(); + break; +#endif + case compass_point_north_menu: + compassNorthMenu(); + break; + case reset_node_db_menu: + resetNodeDBMenu(); + break; + case buzzermodemenupicker: + BuzzerModeMenu(); + break; + case mui_picker: + switchToMUIMenu(); + break; + case tftcolormenupicker: + TFTColorPickerMenu(display); + break; + case brightness_picker: + BrightnessPickerMenu(); + break; + case reboot_menu: + rebootMenu(); + break; + case shutdown_menu: + shutdownMenu(); + break; + case add_favorite: + addFavoriteMenu(); + break; + case remove_favorite: + removeFavoriteMenu(); + break; + case trace_route_menu: + traceRouteMenu(); + break; + case test_menu: + testMenu(); + break; + case number_test: + numberTest(); + break; + case wifi_toggle_menu: + wifiToggleMenu(); + break; + case key_verification_init: + keyVerificationInitMenu(); + break; + case key_verification_final_prompt: + keyVerificationFinalPrompt(); + break; + case bluetooth_toggle_menu: + BluetoothToggleMenu(); + break; + case notifications_menu: + notificationsMenu(); + break; + case screen_options_menu: + screenOptionsMenu(); + break; + case power_menu: + powerMenu(); + break; + case throttle_message: + screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); + break; + } + menuQueue = menu_none; + } + + void menuHandler::saveUIConfig() + { + nodeDB->saveProto("/prefs/uiconfig.proto", meshtastic_DeviceUIConfig_size, &meshtastic_DeviceUIConfig_msg, &uiconfig); + } } // namespace graphics From 5afc43ebc10f1a85f30a212072428adbaac291c4 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 21:07:28 +0200 Subject: [PATCH 09/16] try-out WDT timer issue --> needs revert --- src/platform/esp32/main-esp32.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp index f233db777..785eae4f3 100644 --- a/src/platform/esp32/main-esp32.cpp +++ b/src/platform/esp32/main-esp32.cpp @@ -180,10 +180,10 @@ void esp32Setup() assert(res == ESP_OK); #else res = esp_task_wdt_init(APP_WATCHDOG_SECS, true); - assert(res == ESP_OK); + // assert(res == ESP_OK); #endif res = esp_task_wdt_add(NULL); - assert(res == ESP_OK); + // assert(res == ESP_OK); #ifdef HAS_32768HZ enableSlowCLK(); @@ -193,7 +193,11 @@ void esp32Setup() /// loop code specific to ESP32 targets void esp32Loop() { - esp_task_wdt_reset(); // service our app level watchdog + +if (esp_task_wdt_reset() != ESP_OK) + { + +LOG_ERROR("Failed to reset task watchdog"); + + + } // for debug printing // radio.radioIf.canSleep(); From 74d0472834abeee3faaaf707b4a7e3efe1b1b693 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 21:55:34 +0200 Subject: [PATCH 10/16] fix merge again --- src/graphics/draw/MenuHandler.cpp | 1277 ++++++++++++++--------------- 1 file changed, 634 insertions(+), 643 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 2225db8b4..60b261b8b 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -480,12 +480,8 @@ void menuHandler::positionBaseMenu() if (accelerometerThread) { optionsArray[options] = "Compass Calibrate"; optionsEnumArray[options++] = CompassCalibrate; - } else -#endif - { - bannerOptions.optionsArrayPtr = optionsArray; - options = 3; } +#endif BannerOverlayOptions bannerOptions; bannerOptions.message = "Position Action"; bannerOptions.optionsArrayPtr = optionsArray; @@ -502,712 +498,707 @@ void menuHandler::positionBaseMenu() } else if (selected == CompassCalibrate) { accelerometerThread->calibrate(30); #endif - else - { - menuQueue = menu_none; - } - }; - screen->showOverlayBanner(bannerOptions); - } + } + }; + screen->showOverlayBanner(bannerOptions); +} - void - menuHandler::nodeListMenu() - { - enum optionsNumbers { Back, Favorite, TraceRoute, Verify, Reset, enumEnd }; - static const char *optionsArray[] = {"Back", "Add Favorite", "Trace Route", "Key Verification", "Reset NodeDB"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Node Action"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 5; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Favorite) { - menuQueue = add_favorite; - screen->runNow(); - } else if (selected == Verify) { - menuQueue = key_verification_init; - screen->runNow(); - } else if (selected == Reset) { - menuQueue = reset_node_db_menu; - screen->runNow(); - } else if (selected == TraceRoute) { - menuQueue = trace_route_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); - } +void menuHandler::nodeListMenu() +{ + enum optionsNumbers { Back, Favorite, TraceRoute, Verify, Reset, enumEnd }; + static const char *optionsArray[] = {"Back", "Add Favorite", "Trace Route", "Key Verification", "Reset NodeDB"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Node Action"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 5; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Favorite) { + menuQueue = add_favorite; + screen->runNow(); + } else if (selected == Verify) { + menuQueue = key_verification_init; + screen->runNow(); + } else if (selected == Reset) { + menuQueue = reset_node_db_menu; + screen->runNow(); + } else if (selected == TraceRoute) { + menuQueue = trace_route_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::resetNodeDBMenu() - { - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Confirm Reset NodeDB"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - disableBluetooth(); - LOG_INFO("Initiate node-db reset"); - nodeDB->resetNodes(); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - } - }; - screen->showOverlayBanner(bannerOptions); - } +void menuHandler::resetNodeDBMenu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Confirm Reset NodeDB"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + disableBluetooth(); + LOG_INFO("Initiate node-db reset"); + nodeDB->resetNodes(); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::compassNorthMenu() - { - enum optionsNumbers { Back, Dynamic, Fixed, Freeze }; - static const char *optionsArray[] = {"Back", "Dynamic", "Fixed Ring", "Freeze Heading"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "North Directions?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; - bannerOptions.InitialSelected = uiconfig.compass_mode + 1; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Dynamic) { - if (uiconfig.compass_mode != meshtastic_CompassMode_DYNAMIC) { - uiconfig.compass_mode = meshtastic_CompassMode_DYNAMIC; - saveUIConfig(); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); - } - } else if (selected == Fixed) { - if (uiconfig.compass_mode != meshtastic_CompassMode_FIXED_RING) { - uiconfig.compass_mode = meshtastic_CompassMode_FIXED_RING; - saveUIConfig(); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); - } - } else if (selected == Freeze) { - if (uiconfig.compass_mode != meshtastic_CompassMode_FREEZE_HEADING) { - uiconfig.compass_mode = meshtastic_CompassMode_FREEZE_HEADING; - saveUIConfig(); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); - } - } else if (selected == Back) { - menuQueue = position_base_menu; - screen->runNow(); +void menuHandler::compassNorthMenu() +{ + enum optionsNumbers { Back, Dynamic, Fixed, Freeze }; + static const char *optionsArray[] = {"Back", "Dynamic", "Fixed Ring", "Freeze Heading"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "North Directions?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + bannerOptions.InitialSelected = uiconfig.compass_mode + 1; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Dynamic) { + if (uiconfig.compass_mode != meshtastic_CompassMode_DYNAMIC) { + uiconfig.compass_mode = meshtastic_CompassMode_DYNAMIC; + saveUIConfig(); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); } - }; - screen->showOverlayBanner(bannerOptions); - } + } else if (selected == Fixed) { + if (uiconfig.compass_mode != meshtastic_CompassMode_FIXED_RING) { + uiconfig.compass_mode = meshtastic_CompassMode_FIXED_RING; + saveUIConfig(); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } + } else if (selected == Freeze) { + if (uiconfig.compass_mode != meshtastic_CompassMode_FREEZE_HEADING) { + uiconfig.compass_mode = meshtastic_CompassMode_FREEZE_HEADING; + saveUIConfig(); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } + } else if (selected == Back) { + menuQueue = position_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} #if !MESHTASTIC_EXCLUDE_GPS - void menuHandler::GPSToggleMenu() - { +void menuHandler::GPSToggleMenu() +{ - static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Toggle GPS"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 3; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_ENABLED; - playGPSEnableBeep(); - gps->enable(); - service->reloadConfig(SEGMENT_CONFIG); - } else if (selected == 2) { - config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_DISABLED; - playGPSDisableBeep(); - gps->disable(); - service->reloadConfig(SEGMENT_CONFIG); - } else { - menuQueue = position_base_menu; - screen->runNow(); - } - }; - bannerOptions.InitialSelected = config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED ? 1 : 2; - screen->showOverlayBanner(bannerOptions); - } -#endif - - void menuHandler::BluetoothToggleMenu() - { - static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Toggle Bluetooth"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 3; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1 || selected == 2) { - InputEvent event = {.inputEvent = (input_broker_event)170, .kbchar = 170, .touchX = 0, .touchY = 0}; - inputBroker->injectInputEvent(&event); - } - }; - bannerOptions.InitialSelected = config.bluetooth.enabled ? 1 : 2; - screen->showOverlayBanner(bannerOptions); - } - - void menuHandler::BuzzerModeMenu() - { - static const char *optionsArray[] = {"All Enabled", "Disabled", "Notifications", "System Only"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Buzzer Mode"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; - bannerOptions.bannerCallback = [](int selected) -> void { - config.device.buzzer_mode = (meshtastic_Config_DeviceConfig_BuzzerMode)selected; + static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Toggle GPS"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 3; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_ENABLED; + playGPSEnableBeep(); + gps->enable(); + service->reloadConfig(SEGMENT_CONFIG); + } else if (selected == 2) { + config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_DISABLED; + playGPSDisableBeep(); + gps->disable(); service->reloadConfig(SEGMENT_CONFIG); - }; - bannerOptions.InitialSelected = config.device.buzzer_mode; - screen->showOverlayBanner(bannerOptions); - } - - void menuHandler::BrightnessPickerMenu() - { - static const char *optionsArray[] = {"Back", "Low", "Medium", "High"}; - - // Get current brightness level to set initial selection - int currentSelection = 1; // Default to Medium - if (uiconfig.screen_brightness >= 255) { - currentSelection = 3; // Very High - } else if (uiconfig.screen_brightness >= 128) { - currentSelection = 2; // High } else { - currentSelection = 1; // Medium + menuQueue = position_base_menu; + screen->runNow(); + } + }; + bannerOptions.InitialSelected = config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED ? 1 : 2; + screen->showOverlayBanner(bannerOptions); +} +#endif + +void menuHandler::BluetoothToggleMenu() +{ + static const char *optionsArray[] = {"Back", "Enabled", "Disabled"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Toggle Bluetooth"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 3; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1 || selected == 2) { + InputEvent event = {.inputEvent = (input_broker_event)170, .kbchar = 170, .touchX = 0, .touchY = 0}; + inputBroker->injectInputEvent(&event); + } + }; + bannerOptions.InitialSelected = config.bluetooth.enabled ? 1 : 2; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::BuzzerModeMenu() +{ + static const char *optionsArray[] = {"All Enabled", "Disabled", "Notifications", "System Only"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Buzzer Mode"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + bannerOptions.bannerCallback = [](int selected) -> void { + config.device.buzzer_mode = (meshtastic_Config_DeviceConfig_BuzzerMode)selected; + service->reloadConfig(SEGMENT_CONFIG); + }; + bannerOptions.InitialSelected = config.device.buzzer_mode; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::BrightnessPickerMenu() +{ + static const char *optionsArray[] = {"Back", "Low", "Medium", "High"}; + + // Get current brightness level to set initial selection + int currentSelection = 1; // Default to Medium + if (uiconfig.screen_brightness >= 255) { + currentSelection = 3; // Very High + } else if (uiconfig.screen_brightness >= 128) { + currentSelection = 2; // High + } else { + currentSelection = 1; // Medium + } + + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Brightness"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 4; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { // Medium + uiconfig.screen_brightness = 64; + } else if (selected == 2) { // High + uiconfig.screen_brightness = 128; + } else if (selected == 3) { // Very High + uiconfig.screen_brightness = 255; } - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Brightness"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 4; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { // Medium - uiconfig.screen_brightness = 64; - } else if (selected == 2) { // High - uiconfig.screen_brightness = 128; - } else if (selected == 3) { // Very High - uiconfig.screen_brightness = 255; - } - - if (selected != 0) { // Not "Back" - // Apply brightness immediately + if (selected != 0) { // Not "Back" + // Apply brightness immediately #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) - // For HELTEC devices, use analogWrite to control backlight - analogWrite(VTFT_LEDA, uiconfig.screen_brightness); + // For HELTEC devices, use analogWrite to control backlight + analogWrite(VTFT_LEDA, uiconfig.screen_brightness); #elif defined(ST7789_CS) - static_cast(screen->getDisplayDevice())->setDisplayBrightness(uiconfig.screen_brightness); + static_cast(screen->getDisplayDevice())->setDisplayBrightness(uiconfig.screen_brightness); #elif defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) - screen->getDisplayDevice()->setBrightness(uiconfig.screen_brightness); + screen->getDisplayDevice()->setBrightness(uiconfig.screen_brightness); #endif - // Save to device - saveUIConfig(); + // Save to device + saveUIConfig(); - LOG_INFO("Screen brightness set to %d", uiconfig.screen_brightness); - } - }; - bannerOptions.InitialSelected = currentSelection; - screen->showOverlayBanner(bannerOptions); - } + LOG_INFO("Screen brightness set to %d", uiconfig.screen_brightness); + } + }; + bannerOptions.InitialSelected = currentSelection; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::switchToMUIMenu() - { - static const char *optionsArray[] = {"No", "Yes"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Switch to MUI?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - config.display.displaymode = meshtastic_Config_DisplayConfig_DisplayMode_COLOR; - config.bluetooth.enabled = false; - service->reloadConfig(SEGMENT_CONFIG); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - } - }; - screen->showOverlayBanner(bannerOptions); - } +void menuHandler::switchToMUIMenu() +{ + static const char *optionsArray[] = {"No", "Yes"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Switch to MUI?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + config.display.displaymode = meshtastic_Config_DisplayConfig_DisplayMode_COLOR; + config.bluetooth.enabled = false; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::TFTColorPickerMenu(OLEDDisplay * display) - { - static const char *optionsArray[] = {"Back", "Default", "Meshtastic Green", "Yellow", "Red", "Orange", "Purple", "Teal", - "Pink", "White"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Select Screen Color"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 10; - bannerOptions.bannerCallback = [display](int selected) -> void { +void menuHandler::TFTColorPickerMenu(OLEDDisplay *display) +{ + static const char *optionsArray[] = {"Back", "Default", "Meshtastic Green", "Yellow", "Red", "Orange", "Purple", "Teal", + "Pink", "White"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Select Screen Color"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 10; + bannerOptions.bannerCallback = [display](int selected) -> void { #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT - uint8_t TFT_MESH_r = 0; - uint8_t TFT_MESH_g = 0; - uint8_t TFT_MESH_b = 0; - if (selected == 1) { - LOG_INFO("Setting color to system default or defined variant"); - // Given just before we set all these to zero, we will allow this to go through - } else if (selected == 2) { - LOG_INFO("Setting color to Meshtastic Green"); - TFT_MESH_r = 103; - TFT_MESH_g = 234; - TFT_MESH_b = 148; - } else if (selected == 3) { - LOG_INFO("Setting color to Yellow"); - TFT_MESH_r = 255; - TFT_MESH_g = 255; - TFT_MESH_b = 128; - } else if (selected == 4) { - LOG_INFO("Setting color to Red"); - TFT_MESH_r = 255; - TFT_MESH_g = 64; - TFT_MESH_b = 64; - } else if (selected == 5) { - LOG_INFO("Setting color to Orange"); - TFT_MESH_r = 255; - TFT_MESH_g = 160; - TFT_MESH_b = 20; - } else if (selected == 6) { - LOG_INFO("Setting color to Purple"); - TFT_MESH_r = 204; - TFT_MESH_g = 153; - TFT_MESH_b = 255; - } else if (selected == 7) { - LOG_INFO("Setting color to Teal"); - TFT_MESH_r = 64; - TFT_MESH_g = 224; - TFT_MESH_b = 208; - } else if (selected == 8) { - LOG_INFO("Setting color to Pink"); - TFT_MESH_r = 255; - TFT_MESH_g = 105; - TFT_MESH_b = 180; - } else if (selected == 9) { - LOG_INFO("Setting color to White"); - TFT_MESH_r = 255; - TFT_MESH_g = 255; - TFT_MESH_b = 255; - } else { - menuQueue = system_base_menu; - screen->runNow(); - } + uint8_t TFT_MESH_r = 0; + uint8_t TFT_MESH_g = 0; + uint8_t TFT_MESH_b = 0; + if (selected == 1) { + LOG_INFO("Setting color to system default or defined variant"); + // Given just before we set all these to zero, we will allow this to go through + } else if (selected == 2) { + LOG_INFO("Setting color to Meshtastic Green"); + TFT_MESH_r = 103; + TFT_MESH_g = 234; + TFT_MESH_b = 148; + } else if (selected == 3) { + LOG_INFO("Setting color to Yellow"); + TFT_MESH_r = 255; + TFT_MESH_g = 255; + TFT_MESH_b = 128; + } else if (selected == 4) { + LOG_INFO("Setting color to Red"); + TFT_MESH_r = 255; + TFT_MESH_g = 64; + TFT_MESH_b = 64; + } else if (selected == 5) { + LOG_INFO("Setting color to Orange"); + TFT_MESH_r = 255; + TFT_MESH_g = 160; + TFT_MESH_b = 20; + } else if (selected == 6) { + LOG_INFO("Setting color to Purple"); + TFT_MESH_r = 204; + TFT_MESH_g = 153; + TFT_MESH_b = 255; + } else if (selected == 7) { + LOG_INFO("Setting color to Teal"); + TFT_MESH_r = 64; + TFT_MESH_g = 224; + TFT_MESH_b = 208; + } else if (selected == 8) { + LOG_INFO("Setting color to Pink"); + TFT_MESH_r = 255; + TFT_MESH_g = 105; + TFT_MESH_b = 180; + } else if (selected == 9) { + LOG_INFO("Setting color to White"); + TFT_MESH_r = 255; + TFT_MESH_g = 255; + TFT_MESH_b = 255; + } else { + menuQueue = system_base_menu; + screen->runNow(); + } - if (selected != 0) { - display->setColor(BLACK); - display->fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - display->setColor(WHITE); + if (selected != 0) { + display->setColor(BLACK); + display->fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + display->setColor(WHITE); - if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { + if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { #ifdef TFT_MESH_OVERRIDE - TFT_MESH = TFT_MESH_OVERRIDE; + TFT_MESH = TFT_MESH_OVERRIDE; #else - TFT_MESH = COLOR565(0x67, 0xEA, 0x94); + TFT_MESH = COLOR565(0x67, 0xEA, 0x94); #endif - } else { - TFT_MESH = COLOR565(TFT_MESH_r, TFT_MESH_g, TFT_MESH_b); - } + } else { + TFT_MESH = COLOR565(TFT_MESH_r, TFT_MESH_g, TFT_MESH_b); + } #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) - static_cast(screen->getDisplayDevice())->setRGB(TFT_MESH); + static_cast(screen->getDisplayDevice())->setRGB(TFT_MESH); #endif - screen->setFrames(graphics::Screen::FOCUS_SYSTEM); - if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { - uiconfig.screen_rgb_color = 0; - } else { - uiconfig.screen_rgb_color = (TFT_MESH_r << 16) | (TFT_MESH_g << 8) | TFT_MESH_b; - } - LOG_INFO("Storing Value of %d to uiconfig.screen_rgb_color", uiconfig.screen_rgb_color); - saveUIConfig(); - } -#endif - }; - screen->showOverlayBanner(bannerOptions); - } - - void menuHandler::rebootMenu() - { - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Reboot Device?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - IF_SCREEN(screen->showSimpleBanner("Rebooting...", 0)); - nodeDB->saveToDisk(); - rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; + screen->setFrames(graphics::Screen::FOCUS_SYSTEM); + if (TFT_MESH_r == 0 && TFT_MESH_g == 0 && TFT_MESH_b == 0) { + uiconfig.screen_rgb_color = 0; } else { - menuQueue = power_menu; - screen->runNow(); + uiconfig.screen_rgb_color = (TFT_MESH_r << 16) | (TFT_MESH_g << 8) | TFT_MESH_b; } - }; - screen->showOverlayBanner(bannerOptions); - } - - void menuHandler::shutdownMenu() - { - static const char *optionsArray[] = {"Back", "Confirm"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Shutdown Device?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - InputEvent event = { - .inputEvent = (input_broker_event)INPUT_BROKER_SHUTDOWN, .kbchar = 0, .touchX = 0, .touchY = 0}; - inputBroker->injectInputEvent(&event); - } else { - menuQueue = power_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); - } - - void menuHandler::addFavoriteMenu() - { - screen->showNodePicker("Node To Favorite", 30000, [](uint32_t nodenum) -> void { - LOG_WARN("Nodenum: %u", nodenum); - nodeDB->set_favorite(true, nodenum); - screen->setFrames(graphics::Screen::FOCUS_PRESERVE); - }); - } - - void menuHandler::removeFavoriteMenu() - { - - static const char *optionsArray[] = {"Back", "Yes"}; - BannerOverlayOptions bannerOptions; - std::string message = "Unfavorite This Node?\n"; - auto node = nodeDB->getMeshNode(graphics::UIRenderer::currentFavoriteNodeNum); - if (node && node->has_user) { - message += sanitizeString(node->user.long_name).substr(0, 15); + LOG_INFO("Storing Value of %d to uiconfig.screen_rgb_color", uiconfig.screen_rgb_color); + saveUIConfig(); } - bannerOptions.message = message.c_str(); - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - LOG_INFO("Removing %x as favorite node", graphics::UIRenderer::currentFavoriteNodeNum); - nodeDB->set_favorite(false, graphics::UIRenderer::currentFavoriteNodeNum); - screen->setFrames(graphics::Screen::FOCUS_DEFAULT); - } - }; - screen->showOverlayBanner(bannerOptions); +#endif + }; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::rebootMenu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Reboot Device?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + IF_SCREEN(screen->showSimpleBanner("Rebooting...", 0)); + nodeDB->saveToDisk(); + rebootAtMsec = millis() + DEFAULT_REBOOT_SECONDS * 1000; + } else { + menuQueue = power_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::shutdownMenu() +{ + static const char *optionsArray[] = {"Back", "Confirm"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Shutdown Device?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + InputEvent event = {.inputEvent = (input_broker_event)INPUT_BROKER_SHUTDOWN, .kbchar = 0, .touchX = 0, .touchY = 0}; + inputBroker->injectInputEvent(&event); + } else { + menuQueue = power_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::addFavoriteMenu() +{ + screen->showNodePicker("Node To Favorite", 30000, [](uint32_t nodenum) -> void { + LOG_WARN("Nodenum: %u", nodenum); + nodeDB->set_favorite(true, nodenum); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + }); +} + +void menuHandler::removeFavoriteMenu() +{ + + static const char *optionsArray[] = {"Back", "Yes"}; + BannerOverlayOptions bannerOptions; + std::string message = "Unfavorite This Node?\n"; + auto node = nodeDB->getMeshNode(graphics::UIRenderer::currentFavoriteNodeNum); + if (node && node->has_user) { + message += sanitizeString(node->user.long_name).substr(0, 15); } + bannerOptions.message = message.c_str(); + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + LOG_INFO("Removing %x as favorite node", graphics::UIRenderer::currentFavoriteNodeNum); + nodeDB->set_favorite(false, graphics::UIRenderer::currentFavoriteNodeNum); + screen->setFrames(graphics::Screen::FOCUS_DEFAULT); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::traceRouteMenu() - { - screen->showNodePicker("Node to Trace", 30000, [](uint32_t nodenum) -> void { - LOG_INFO("Menu: Node picker selected node 0x%08x, traceRouteModule=%p", nodenum, traceRouteModule); - if (traceRouteModule) { - traceRouteModule->startTraceRoute(nodenum); - } - }); - } +void menuHandler::traceRouteMenu() +{ + screen->showNodePicker("Node to Trace", 30000, [](uint32_t nodenum) -> void { + LOG_INFO("Menu: Node picker selected node 0x%08x, traceRouteModule=%p", nodenum, traceRouteModule); + if (traceRouteModule) { + traceRouteModule->startTraceRoute(nodenum); + } + }); +} - void menuHandler::testMenu() - { +void menuHandler::testMenu() +{ - static const char *optionsArray[] = {"Back", "Number Picker"}; - BannerOverlayOptions bannerOptions; - std::string message = "Test to Run?\n"; - bannerOptions.message = message.c_str(); - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { - menuQueue = number_test; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); - } + static const char *optionsArray[] = {"Back", "Number Picker"}; + BannerOverlayOptions bannerOptions; + std::string message = "Test to Run?\n"; + bannerOptions.message = message.c_str(); + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == 1) { + menuQueue = number_test; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::numberTest() - { - screen->showNumberPicker("Pick a number\n ", 30000, 4, - [](int number_picked) -> void { LOG_WARN("Nodenum: %u", number_picked); }); - } +void menuHandler::numberTest() +{ + screen->showNumberPicker("Pick a number\n ", 30000, 4, + [](int number_picked) -> void { LOG_WARN("Nodenum: %u", number_picked); }); +} - void menuHandler::wifiBaseMenu() - { - enum optionsNumbers { Back, Wifi_toggle }; +void menuHandler::wifiBaseMenu() +{ + enum optionsNumbers { Back, Wifi_toggle }; - static const char *optionsArray[] = {"Back", "WiFi Toggle"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "WiFi Menu"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Wifi_toggle) { - menuQueue = wifi_toggle_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); - } + static const char *optionsArray[] = {"Back", "WiFi Toggle"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "WiFi Menu"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Wifi_toggle) { + menuQueue = wifi_toggle_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::wifiToggleMenu() - { - enum optionsNumbers { Back, Wifi_toggle }; +void menuHandler::wifiToggleMenu() +{ + enum optionsNumbers { Back, Wifi_toggle }; - static const char *optionsArray[] = {"Back", "Disable"}; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Disable Wifi and\nEnable Bluetooth?"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Wifi_toggle) { - config.network.wifi_enabled = false; - config.bluetooth.enabled = true; - service->reloadConfig(SEGMENT_CONFIG); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - } - }; - screen->showOverlayBanner(bannerOptions); - } + static const char *optionsArray[] = {"Back", "Disable"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Disable Wifi and\nEnable Bluetooth?"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 2; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Wifi_toggle) { + config.network.wifi_enabled = false; + config.bluetooth.enabled = true; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::notificationsMenu() - { - enum optionsNumbers { Back, BuzzerActions }; - static const char *optionsArray[] = {"Back", "Buzzer Actions"}; - static int optionsEnumArray[] = {Back, BuzzerActions}; - int options = 2; +void menuHandler::notificationsMenu() +{ + enum optionsNumbers { Back, BuzzerActions }; + static const char *optionsArray[] = {"Back", "Buzzer Actions"}; + static int optionsEnumArray[] = {Back, BuzzerActions}; + int options = 2; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Notifications"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = options; - bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == BuzzerActions) { - menuHandler::menuQueue = menuHandler::buzzermodemenupicker; - screen->runNow(); - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); - } + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Notifications"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == BuzzerActions) { + menuHandler::menuQueue = menuHandler::buzzermodemenupicker; + screen->runNow(); + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} - void menuHandler::screenOptionsMenu() - { - // Check if brightness is supported - bool hasSupportBrightness = false; +void menuHandler::screenOptionsMenu() +{ + // Check if brightness is supported + bool hasSupportBrightness = false; #if defined(ST7789_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) - hasSupportBrightness = true; + hasSupportBrightness = true; #endif #if defined(T_DECK) - // TDeck Doesn't seem to support brightness at all, at least not reliably - hasSupportBrightness = false; + // TDeck Doesn't seem to support brightness at all, at least not reliably + hasSupportBrightness = false; #endif - enum optionsNumbers { Back, Brightness, ScreenColor }; - static const char *optionsArray[4] = {"Back"}; - static int optionsEnumArray[4] = {Back}; - int options = 1; + enum optionsNumbers { Back, Brightness, ScreenColor }; + static const char *optionsArray[4] = {"Back"}; + static int optionsEnumArray[4] = {Back}; + int options = 1; - // Only show brightness for B&W displays - if (hasSupportBrightness) { - optionsArray[options] = "Brightness"; - optionsEnumArray[options++] = Brightness; - } - - // Only show screen color for TFT displays -#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT - optionsArray[options] = "Screen Color"; - optionsEnumArray[options++] = ScreenColor; -#endif - - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Screen Options"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = options; - bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Brightness) { - menuHandler::menuQueue = menuHandler::brightness_picker; - screen->runNow(); - } else if (selected == ScreenColor) { - menuHandler::menuQueue = menuHandler::tftcolormenupicker; - screen->runNow(); - } else { - menuQueue = system_base_menu; - screen->runNow(); - } - }; - screen->showOverlayBanner(bannerOptions); + // Only show brightness for B&W displays + if (hasSupportBrightness) { + optionsArray[options] = "Brightness"; + optionsEnumArray[options++] = Brightness; } - void menuHandler::powerMenu() - { + // Only show screen color for TFT displays +#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT + optionsArray[options] = "Screen Color"; + optionsEnumArray[options++] = ScreenColor; +#endif - enum optionsNumbers { Back, Reboot, Shutdown, MUI }; - static const char *optionsArray[4] = {"Back"}; - static int optionsEnumArray[4] = {Back}; - int options = 1; + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Screen Options"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Brightness) { + menuHandler::menuQueue = menuHandler::brightness_picker; + screen->runNow(); + } else if (selected == ScreenColor) { + menuHandler::menuQueue = menuHandler::tftcolormenupicker; + screen->runNow(); + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} - optionsArray[options] = "Reboot"; - optionsEnumArray[options++] = Reboot; +void menuHandler::powerMenu() +{ - optionsArray[options] = "Shutdown"; - optionsEnumArray[options++] = Shutdown; + enum optionsNumbers { Back, Reboot, Shutdown, MUI }; + static const char *optionsArray[4] = {"Back"}; + static int optionsEnumArray[4] = {Back}; + int options = 1; + + optionsArray[options] = "Reboot"; + optionsEnumArray[options++] = Reboot; + + optionsArray[options] = "Shutdown"; + optionsEnumArray[options++] = Shutdown; #if HAS_TFT - optionsArray[options] = "Switch to MUI"; - optionsEnumArray[options++] = MUI; + optionsArray[options] = "Switch to MUI"; + optionsEnumArray[options++] = MUI; #endif - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Reboot / Shutdown"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = options; - bannerOptions.optionsEnumPtr = optionsEnumArray; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Reboot) { - menuHandler::menuQueue = menuHandler::reboot_menu; - screen->runNow(); - } else if (selected == Shutdown) { - menuHandler::menuQueue = menuHandler::shutdown_menu; - screen->runNow(); - } else if (selected == MUI) { - menuHandler::menuQueue = menuHandler::mui_picker; - screen->runNow(); - } else { - menuQueue = system_base_menu; - screen->runNow(); + BannerOverlayOptions bannerOptions; + bannerOptions.message = "Reboot / Shutdown"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = options; + bannerOptions.optionsEnumPtr = optionsEnumArray; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == Reboot) { + menuHandler::menuQueue = menuHandler::reboot_menu; + screen->runNow(); + } else if (selected == Shutdown) { + menuHandler::menuQueue = menuHandler::shutdown_menu; + screen->runNow(); + } else if (selected == MUI) { + menuHandler::menuQueue = menuHandler::mui_picker; + screen->runNow(); + } else { + menuQueue = system_base_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + +void menuHandler::keyVerificationInitMenu() +{ + screen->showNodePicker("Node to Verify", 30000, + [](uint32_t selected) -> void { keyVerificationModule->sendInitialRequest(selected); }); +} + +void menuHandler::keyVerificationFinalPrompt() +{ + char message[40] = {0}; + memset(message, 0, sizeof(message)); + sprintf(message, "Verification: \n"); + keyVerificationModule->generateVerificationCode(message + 15); // send the toPhone packet + + if (screen) { + static const char *optionsArray[] = {"Reject", "Accept"}; + graphics::BannerOverlayOptions options; + options.message = message; + options.durationMs = 30000; + options.optionsArrayPtr = optionsArray; + options.optionsCount = 2; + options.notificationType = graphics::notificationTypeEnum::selection_picker; + options.bannerCallback = [=](int selected) { + if (selected == 1) { + auto remoteNodePtr = nodeDB->getMeshNode(keyVerificationModule->getCurrentRemoteNode()); + remoteNodePtr->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; } }; - screen->showOverlayBanner(bannerOptions); + screen->showOverlayBanner(options); } +} - void menuHandler::keyVerificationInitMenu() - { - screen->showNodePicker("Node to Verify", 30000, - [](uint32_t selected) -> void { keyVerificationModule->sendInitialRequest(selected); }); - } - - void menuHandler::keyVerificationFinalPrompt() - { - char message[40] = {0}; - memset(message, 0, sizeof(message)); - sprintf(message, "Verification: \n"); - keyVerificationModule->generateVerificationCode(message + 15); // send the toPhone packet - - if (screen) { - static const char *optionsArray[] = {"Reject", "Accept"}; - graphics::BannerOverlayOptions options; - options.message = message; - options.durationMs = 30000; - options.optionsArrayPtr = optionsArray; - options.optionsCount = 2; - options.notificationType = graphics::notificationTypeEnum::selection_picker; - options.bannerCallback = [=](int selected) { - if (selected == 1) { - auto remoteNodePtr = nodeDB->getMeshNode(keyVerificationModule->getCurrentRemoteNode()); - remoteNodePtr->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; - } - }; - screen->showOverlayBanner(options); - } - } - - void menuHandler::handleMenuSwitch(OLEDDisplay * display) - { - if (menuQueue != menu_none) - test_count = 0; - switch (menuQueue) { - case menu_none: - break; - case lora_picker: - LoraRegionPicker(); - break; - case TZ_picker: - TZPicker(); - break; - case twelve_hour_picker: - TwelveHourPicker(); - break; - case clock_face_picker: - ClockFacePicker(); - break; - case clock_menu: - clockMenu(); - break; - case system_base_menu: - systemBaseMenu(); - break; - case position_base_menu: - positionBaseMenu(); - break; +void menuHandler::handleMenuSwitch(OLEDDisplay *display) +{ + if (menuQueue != menu_none) + test_count = 0; + switch (menuQueue) { + case menu_none: + break; + case lora_picker: + LoraRegionPicker(); + break; + case TZ_picker: + TZPicker(); + break; + case twelve_hour_picker: + TwelveHourPicker(); + break; + case clock_face_picker: + ClockFacePicker(); + break; + case clock_menu: + clockMenu(); + break; + case system_base_menu: + systemBaseMenu(); + break; + case position_base_menu: + positionBaseMenu(); + break; #if !MESHTASTIC_EXCLUDE_GPS - case gps_toggle_menu: - GPSToggleMenu(); - break; + case gps_toggle_menu: + GPSToggleMenu(); + break; #endif - case compass_point_north_menu: - compassNorthMenu(); - break; - case reset_node_db_menu: - resetNodeDBMenu(); - break; - case buzzermodemenupicker: - BuzzerModeMenu(); - break; - case mui_picker: - switchToMUIMenu(); - break; - case tftcolormenupicker: - TFTColorPickerMenu(display); - break; - case brightness_picker: - BrightnessPickerMenu(); - break; - case reboot_menu: - rebootMenu(); - break; - case shutdown_menu: - shutdownMenu(); - break; - case add_favorite: - addFavoriteMenu(); - break; - case remove_favorite: - removeFavoriteMenu(); - break; - case trace_route_menu: - traceRouteMenu(); - break; - case test_menu: - testMenu(); - break; - case number_test: - numberTest(); - break; - case wifi_toggle_menu: - wifiToggleMenu(); - break; - case key_verification_init: - keyVerificationInitMenu(); - break; - case key_verification_final_prompt: - keyVerificationFinalPrompt(); - break; - case bluetooth_toggle_menu: - BluetoothToggleMenu(); - break; - case notifications_menu: - notificationsMenu(); - break; - case screen_options_menu: - screenOptionsMenu(); - break; - case power_menu: - powerMenu(); - break; - case throttle_message: - screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); - break; - } - menuQueue = menu_none; + case compass_point_north_menu: + compassNorthMenu(); + break; + case reset_node_db_menu: + resetNodeDBMenu(); + break; + case buzzermodemenupicker: + BuzzerModeMenu(); + break; + case mui_picker: + switchToMUIMenu(); + break; + case tftcolormenupicker: + TFTColorPickerMenu(display); + break; + case brightness_picker: + BrightnessPickerMenu(); + break; + case reboot_menu: + rebootMenu(); + break; + case shutdown_menu: + shutdownMenu(); + break; + case add_favorite: + addFavoriteMenu(); + break; + case remove_favorite: + removeFavoriteMenu(); + break; + case trace_route_menu: + traceRouteMenu(); + break; + case test_menu: + testMenu(); + break; + case number_test: + numberTest(); + break; + case wifi_toggle_menu: + wifiToggleMenu(); + break; + case key_verification_init: + keyVerificationInitMenu(); + break; + case key_verification_final_prompt: + keyVerificationFinalPrompt(); + break; + case bluetooth_toggle_menu: + BluetoothToggleMenu(); + break; + case notifications_menu: + notificationsMenu(); + break; + case screen_options_menu: + screenOptionsMenu(); + break; + case power_menu: + powerMenu(); + break; + case throttle_message: + screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); + break; } + menuQueue = menu_none; +} - void menuHandler::saveUIConfig() - { - nodeDB->saveProto("/prefs/uiconfig.proto", meshtastic_DeviceUIConfig_size, &meshtastic_DeviceUIConfig_msg, &uiconfig); - } +void menuHandler::saveUIConfig() +{ + nodeDB->saveProto("/prefs/uiconfig.proto", meshtastic_DeviceUIConfig_size, &meshtastic_DeviceUIConfig_msg, &uiconfig); +} } // namespace graphics From bc8e509a8cd2351cd7af6d0f5f0ad8d24a80bb66 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 22:05:29 +0200 Subject: [PATCH 11/16] fix copy&paste --- src/platform/esp32/main-esp32.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp index 785eae4f3..1a0357e32 100644 --- a/src/platform/esp32/main-esp32.cpp +++ b/src/platform/esp32/main-esp32.cpp @@ -193,10 +193,8 @@ void esp32Setup() /// loop code specific to ESP32 targets void esp32Loop() { - +if (esp_task_wdt_reset() != ESP_OK) - { - +LOG_ERROR("Failed to reset task watchdog"); - + + if (esp_task_wdt_reset() != ESP_OK) { + LOG_ERROR("Failed to reset task watchdog"); } // for debug printing From f3734d407d3976f6dec8acb0eb1e69a334aa7f6c Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 22:06:21 +0200 Subject: [PATCH 12/16] remove OTA partition for now until fw size got smaller again --- 8MB_no_ota.csv | 6 ++++++ boards/seeed-sensecap-indicator.json | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 8MB_no_ota.csv diff --git a/8MB_no_ota.csv b/8MB_no_ota.csv new file mode 100644 index 000000000..61fea7afe --- /dev/null +++ b/8MB_no_ota.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x660000, +spiffs, data, spiffs, 0x670000,0x180000, +coredump, data, coredump,0x7F0000,0x10000, diff --git a/boards/seeed-sensecap-indicator.json b/boards/seeed-sensecap-indicator.json index 7e73fca72..594bce8a5 100644 --- a/boards/seeed-sensecap-indicator.json +++ b/boards/seeed-sensecap-indicator.json @@ -2,7 +2,7 @@ "build": { "arduino": { "ldscript": "esp32s3_out.ld", - "partitions": "default_8MB.csv", + "partitions": "8MB_no_ota.csv", "memory_type": "qio_opi" }, "core": "esp32", @@ -15,6 +15,7 @@ ], "f_cpu": "240000000L", "f_flash": "80000000L", + "f_boot": "120000000L", "boot_freq": "120000000L", "boot": "qio", "flash_mode": "qio", From 05dc8caed8d5097a50a511fbf80401f4ce37f3c0 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 22:07:18 +0200 Subject: [PATCH 13/16] platformio updates --- .../seeed-sensecap-indicator/platformio.ini | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini index cf01c8748..b18e99e4b 100644 --- a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini +++ b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini @@ -1,18 +1,21 @@ ; Seeed Studio SenseCAP Indicator +; note: does not work with vscode platformio plugin; needs pioarduino IDE plugin instead [env:seeed-sensecap-indicator] extends = esp32s3_base platform = ;https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip - https://github.com/pioarduino/platform-espressif32.git#develop + https://github.com/pioarduino/platform-espressif32.git#55.03.30-1 ;symlink:///home/manuel/Documents/PlatformIO/Projects/platform-espressif32 platform_packages = ;platformio/framework-arduinoespressif32-libs@https://dl.espressif.com/AE/esp-arduino-libs/esp32-3.2.0-h.zip - platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/919e485187a77b62b93f9b7fa09f43a8eeceaa44.zip - ;platformio/framework-arduinoespressif32 @ symlink:///home/manuel/Documents/PlatformIO/Projects/arduino-esp32 + ;platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/919e485187a77b62b93f9b7fa09f43a8eeceaa44.zip + ; ^^^ THIS IS THE NEW IO_EXPANDER THAT MUST BE USED; BUT BRANCH NEEDS REBASE TO v3.3 ^^^ board = seeed-sensecap-indicator board_check = true +board_build.partitions = 8MB_no_ota.csv upload_protocol = esptool +;extra_scripts = ; dummy just to check if new toolchain compiles without platformio-custom.py ==> may remove it! build_unflags = -DCONFIG_BT_NIMBLE_ENABLED @@ -23,7 +26,10 @@ build_unflags = build_flags = ${esp32_base.build_flags} -D lcd_periph_signals=lcd_periph_rgb_signals -mtext-section-literals -ffat-lto-objects -Ivariants/esp32s3/seeed-sensecap-indicator -DSENSECAP_INDICATOR - -DCONFIG_ARDUHAL_LOG_COLORS + -DARDUINO_HAL_LOG_LEVEL=5 + -DARDUHAL_LOG_MAXIMUM_LEVEL=5 + -DARDUHAL_LOG_COLORS=1 + -DUSE_ARDUINO_HAL_GPIO -DRADIOLIB_DEBUG_SPI=0 -DRADIOLIB_DEBUG_PROTOCOL=0 -DRADIOLIB_DEBUG_BASIC=0 @@ -31,15 +37,16 @@ build_flags = ${esp32_base.build_flags} -D lcd_periph_signals=lcd_periph_rgb_sig -DRADIOLIB_SPI_PARANOID=0 -DIO_EXPANDER=0x40 -DIO_EXPANDER_IRQ=42 - ;-DIO_EXPANDER_DEBUG - -DUSE_ARDUINO_HAL_GPIO + -DIO_EXPANDER_DEBUG +; -DARDUINO_SKIP_IDF_VERSION_CHECK=1 lib_deps = ${esp32s3_base.lib_deps} - https://github.com/mverch67/LovyanGFX/archive/502127dfe28ab766b7ce7ba6470175ab6c9c1288.zip + https://github.com/mverch67/LovyanGFX/archive/a1c1278fc9116d1c6cb15a7bb14565aef59a9a97.zip custom_component_remove = espressif/esp_hosted espressif/esp_wifi_remote + espressif/esp_modem espressif/esp-dsp espressif/esp32-camera espressif/libsodium @@ -50,8 +57,14 @@ custom_component_remove = espressif/esp_diagnostics espressif/esp_rainmaker espressif/rmaker_common + espressif/network_provisioning + chmorgan/esp-libhelix-mp3 custom_sdkconfig = + CONFIG_LOG_DEFAULT_LEVEL=5 + CONFIG_LOG_MAXIMUM_LEVEL=5 + CONFIG_LOG_COLORS=y + CONFIG_ARDUHAL_LOG_COLORS=y CONFIG_SPIRAM_MODE_OCT=y CONFIG_SPIRAM_SPEED_120M=y CONFIG_LCD_RGB_ISR_IRAM_SAFE=y @@ -84,6 +97,9 @@ custom_sdkconfig = CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=8192 CONFIG_BT_NIMBLE_MAX_CCCDS=20 CONFIG_BT_NIMBLE_CPP_LOG_LEVEL=2 + CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y + CONFIG_ESPTOOLPY_FLASHSIZE="8MB" + [env:seeed-sensecap-indicator-tft] extends = env:seeed-sensecap-indicator From 27bb42ed3b13ae34c41e087ab0ad17445cbf4d4a Mon Sep 17 00:00:00 2001 From: mverch67 Date: Tue, 29 Jul 2025 22:08:07 +0200 Subject: [PATCH 14/16] git ignore new toolchain tmp files --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index cc742c6c1..51c96f445 100644 --- a/.gitignore +++ b/.gitignore @@ -39,5 +39,14 @@ release/ src/mesh/raspihttp/certificate.pem src/mesh/raspihttp/private_key.pem +# pioarduino platform +managed_components/* +arduino-lib-builder* +dependencies.lock +idf_component.yml +CMakeLists.txt +sdkconfig.* +.dummy/* + # Ignore logo (set at build time with platformio-custom.py) data/boot/logo.* From effb454af07aaa2b682b3bfd46738495004a3187 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Wed, 30 Jul 2025 23:24:31 +0200 Subject: [PATCH 15/16] comment out assert on watchdog creation --- src/platform/esp32/main-esp32.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp index 1a0357e32..468974773 100644 --- a/src/platform/esp32/main-esp32.cpp +++ b/src/platform/esp32/main-esp32.cpp @@ -177,10 +177,10 @@ void esp32Setup() wdt_config->idle_core_mask = 0; wdt_config->trigger_panic = true; res = esp_task_wdt_init(wdt_config); - assert(res == ESP_OK); + // assert(res == ESP_OK); #else res = esp_task_wdt_init(APP_WATCHDOG_SECS, true); - // assert(res == ESP_OK); + assert(res == ESP_OK); #endif res = esp_task_wdt_add(NULL); // assert(res == ESP_OK); From aa7abb1d3ed7f4d17e1123b7a54b4eb18ccb9b51 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Wed, 30 Jul 2025 23:37:09 +0200 Subject: [PATCH 16/16] use ng-io-expander 3.3.0 --- variants/esp32s3/seeed-sensecap-indicator/platformio.ini | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini index b18e99e4b..24ea32e21 100644 --- a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini +++ b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini @@ -8,14 +8,13 @@ platform = ;symlink:///home/manuel/Documents/PlatformIO/Projects/platform-espressif32 platform_packages = ;platformio/framework-arduinoespressif32-libs@https://dl.espressif.com/AE/esp-arduino-libs/esp32-3.2.0-h.zip - ;platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32/archive/919e485187a77b62b93f9b7fa09f43a8eeceaa44.zip - ; ^^^ THIS IS THE NEW IO_EXPANDER THAT MUST BE USED; BUT BRANCH NEEDS REBASE TO v3.3 ^^^ + platformio/framework-arduinoespressif32 @ https://github.com/mverch67/arduino-esp32#509bd10c6c71f70f1a22a1be00fec45f47682f32 + ;platformio/framework-arduinoespressif32 @ symlink:///home/manuel/Documents/PlatformIO/Projects/arduino-esp32 board = seeed-sensecap-indicator board_check = true board_build.partitions = 8MB_no_ota.csv upload_protocol = esptool -;extra_scripts = ; dummy just to check if new toolchain compiles without platformio-custom.py ==> may remove it! build_unflags = -DCONFIG_BT_NIMBLE_ENABLED