config: generalize CONFIG_HAS_BATTERY meaning in Kconfig
What changed, and why it matters
This commit is a configuration cleanup for the Blockstream Jade hardware wallet firmware. It generalizes the meaning of the 'HAS_BATTERY' setting so that battery-related and camera-related menu options are automatically hidden on device variants that lack those hardware parts. There is no direct security fix here; it is a maintainability and user-interface change that prevents unsupported features from being shown or compiled on devices that do not have the required hardware.
Treat as a normal firmware maintenance commit. No urgent security action is required. Reviewers may want to verify that the new Kconfig defaults correctly cover all battery-equipped board variants and that no intended feature is accidentally disabled on supported hardware.
Security signals we found
Feature-gating of hardware-specific code paths (battery, camera, USB storage) behind CONFIG_HAS_BATTERY / CONFIG_HAS_CAMERA
Removal of a user-selectable HAS_BATTERY option in favor of board-level defaults
No direct memory-safety, cryptographic, or authentication fix visible in the diff
Evidence from the diff
The patch moves CONFIG_HAS_BATTERY from a user-selectable option tied only to TTGO T-DISPLAYS3 into a board-selected default, and makes several UI/button/USB-storage code paths conditional on both the ESP32S3 target and CONFIG_HAS_BATTERY (or CONFIG_HAS_CAMERA) rather than the target alone. It also replaces hard-coded menu button counts with sizeof calculations. The changes reduce the chance of compiling or exposing hardware-specific features on incompatible boards, but they do not patch a known vulnerability.
Changed components
main/Kconfig.projbuildmain/amalgamated.cmain/button_events.hmain/gui.cmain/main.cmain/power/jadev20.incmain/process/dashboard.cmain/ui/dashboard.cInspect captured patch +97 / −44
diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild
index 89bac38..d3fa788 100644
--- a/main/Kconfig.projbuild
+++ b/main/Kconfig.projbuild
@@ -33,32 +33,41 @@ menu "Blockstream Jade"
bool "Blockstream Jade v1 (wheel)"
select HAS_AXP
select HAS_CAMERA
+ select HAS_BATTERY
config BOARD_TYPE_JADE_V1_1
bool "Blockstream Jade v1.1 (rocker)"
select HAS_AXP
select HAS_CAMERA
+ select HAS_BATTERY
config BOARD_TYPE_JADE_V2
bool "Blockstream Jade v2 (esp32s3)"
select HAS_AXP
select HAS_CAMERA
+ select HAS_BATTERY
config BOARD_TYPE_M5_FIRE
bool "M5Stack Fire"
select HAS_IP5306
+ select HAS_BATTERY
config BOARD_TYPE_M5_BLACK_GRAY
bool "M5Stack Black/Gray"
select HAS_IP5306
+ select HAS_BATTERY
config BOARD_TYPE_M5_CORE2
bool "M5Stack Core 2"
select HAS_AXP
+ select HAS_BATTERY
config BOARD_TYPE_M5_CORES3
bool "M5Stack Core S3"
select HAS_AXP
select HAS_CAMERA
+ select HAS_BATTERY
config BOARD_TYPE_M5_STICKC_PLUS
bool "M5StickC Plus"
select HAS_AXP
+ select HAS_BATTERY
config BOARD_TYPE_M5_STICKC_PLUS_2
bool "M5StickC Plus 2"
+ select HAS_BATTERY
config BOARD_TYPE_TTGO_TDISPLAY
bool "TTGO T-DISPLAY"
config BOARD_TYPE_TTGO_TDISPLAYS3
@@ -154,13 +163,6 @@ menu "Blockstream Jade"
help
Jade v1 (and some other devices) come with the AXP192 to manage power to ESP, display, camera
- config HAS_BATTERY
- bool "Use analog input as battery level indicator and USB connection"
- depends on BOARD_TYPE_TTGO_TDISPLAYS3
- default n
- help
- Some devices can measure voltage and detect charging status through an analog input.
-
menu "SDA/SCL Pin Mapping"
visible if BOARD_TYPE_CUSTOM
@@ -279,6 +281,12 @@ menu "Blockstream Jade"
Enables USB JTAG serial rather than CDC tinyusb, implies no tinyusb/host storage/etc
default n
+ config HAS_BATTERY
+ bool "Enable Battery Functions"
+ help
+ Enables battery functionality
+ default y if BOARD_TYPE_JADE_V2 || BOARD_TYPE_JADE_V1_1 || BOARD_TYPE_JADE || BOARD_TYPE_M5_FIRE || BOARD_TYPE_M5_BLACK_GRAY || BOARD_TYPE_M5_CORE2 || BOARD_TYPE_M5_CORES3 || BOARD_TYPE_M5_STICKC_PLUS || BOARD_TYPE_M5_STICKC_PLUS_2
+
config HAS_CAMERA
bool "Enable Camera Functions"
help
diff --git a/main/amalgamated.c b/main/amalgamated.c
index 4047331..78d6fec 100644
--- a/main/amalgamated.c
+++ b/main/amalgamated.c
@@ -164,10 +164,10 @@ void __wrap_abort(void);
#include "./ui/sign_tx.c"
#include "./ui/signer.c"
#include "./ui/update_pinserver.c"
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
#include "./usbhmsc/usbhmsc.c"
#include "./usbhmsc/usbmode.c"
-#endif // CONFIG_IDF_TARGET_ESP32S3
+#endif // CONFIG_IDF_TARGET_ESP32S3 && CONFIG_HAS_BATTERY
#include "./utils/address.c"
#include "./utils/cbor_rpc.c"
#ifndef CONFIG_LIBJADE_NO_GUI
diff --git a/main/button_events.h b/main/button_events.h
index fdce240..7401cb0 100644
--- a/main/button_events.h
+++ b/main/button_events.h
@@ -139,7 +139,9 @@ typedef enum {
BTN_SETTINGS_TEMPORARY_WALLET_LOGIN,
BTN_SETTINGS_PINSERVER,
BTN_SETTINGS_PINSERVER_SHOW,
+#ifdef CONFIG_HAS_CAMERA
BTN_SETTINGS_PINSERVER_SCAN_QR,
+#endif
BTN_SETTINGS_PINSERVER_RESET,
BTN_SETTINGS_PINSERVER_HELP,
BTN_SETTINGS_PINSERVER_EXIT,
@@ -149,7 +151,9 @@ typedef enum {
BTN_SETTINGS_INFO_FWVERSION_EXIT,
BTN_SETTINGS_DEVICE_INFO,
BTN_SETTINGS_DEVICE_INFO_MAC,
+#ifdef CONFIG_HAS_BATTERY
BTN_SETTINGS_DEVICE_INFO_BATTERY,
+#endif
BTN_SETTINGS_DEVICE_INFO_STORAGE,
BTN_SETTINGS_DEVICE_INFO_STORAGE_EXIT,
BTN_SETTINGS_DEVICE_INFO_DETAIL_EXIT,
@@ -163,12 +167,14 @@ typedef enum {
BTN_SETTINGS_OTP,
BTN_SETTINGS_OTP_VIEW,
BTN_SETTINGS_OTP_NEW,
+#ifdef CONFIG_HAS_CAMERA
BTN_SETTINGS_OTP_NEW_QR,
+#endif
BTN_SETTINGS_OTP_NEW_KB,
BTN_SETTINGS_OTP_NEW_EXIT,
BTN_SETTINGS_OTP_HELP,
BTN_SETTINGS_OTP_EXIT,
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
BTN_SETTINGS_USBSTORAGE,
BTN_SETTINGS_USBSTORAGE_FW,
BTN_SETTINGS_USBSTORAGE_BACK,
@@ -180,7 +186,9 @@ typedef enum {
BTN_SETTINGS_BLE,
BTN_SETTINGS_NETWORK_TYPE,
BTN_SETTINGS_CHANGE_PIN,
+#ifdef CONFIG_HAS_CAMERA
BTN_SETTINGS_CHANGE_PIN_QR,
+#endif
BTN_SETTINGS_RESET,
BTN_SETTINGS_EXIT,
diff --git a/main/gui.c b/main/gui.c
index 49e7a1a..3851c38 100644
--- a/main/gui.c
+++ b/main/gui.c
@@ -2291,7 +2291,12 @@ static bool update_status_bar(const bool force_redraw)
if (status_bar.battery_update_counter == 0) {
uint8_t new_bat = power_get_battery_status();
+#ifdef CONFIG_HAS_BATTERY
color_t color = new_bat == 0 ? TFT_RED : new_bat == 1 ? TFT_ORANGE : TFT_WHITE;
+#else
+ // If no battery on the device then hide the battery icon with background color
+ color_t color = status_bar.root->fill->color;
+#endif
if (power_get_battery_charging()) {
new_bat = new_bat + 12;
}
diff --git a/main/main.c b/main/main.c
index 6ab5af4..fd8ea4f 100644
--- a/main/main.c
+++ b/main/main.c
@@ -198,7 +198,7 @@ static void boot_process(void)
JADE_ASSERT(event_data);
gui_activity_register_event(splash, GUI_EVENT, GUI_FRONT_CLICK_EVENT, sync_wait_event_handler, event_data);
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
usbstorage_init();
#endif
diff --git a/main/power/jadev20.inc b/main/power/jadev20.inc
index f85610e..e276167 100644
--- a/main/power/jadev20.inc
+++ b/main/power/jadev20.inc
@@ -205,14 +205,17 @@ esp_err_t power_camera_on(void) { return ESP_OK; }
esp_err_t power_camera_off(void)
{
+#ifdef CONFIG_HAS_CAMERA
esp_rom_gpio_pad_select_gpio(CONFIG_CAMERA_PWDN);
gpio_set_direction(CONFIG_CAMERA_PWDN, GPIO_MODE_OUTPUT);
gpio_set_level(CONFIG_CAMERA_PWDN, 1);
+#endif
return ESP_OK;
}
uint16_t power_get_vbat(void)
{
+#ifdef CONFIG_HAS_BATTERY
uint8_t msb, lsb;
JADE_SEMAPHORE_TAKE(i2c_mutex);
I2C_LOG_ANY_ERROR(_power_master_read_slave(stm32, STM32_REG_BAT_VOLTS_0, &lsb, 1));
@@ -220,10 +223,14 @@ uint16_t power_get_vbat(void)
JADE_SEMAPHORE_GIVE(i2c_mutex);
return (msb << 8) + lsb;
+#else
+ return 0;
+#endif
}
uint8_t power_get_battery_status(void)
{
+#ifdef CONFIG_HAS_BATTERY
const uint16_t vbat = power_get_vbat();
if (vbat > 4000) {
return 5;
@@ -236,11 +243,13 @@ uint8_t power_get_battery_status(void)
} else if (vbat > 3400) {
return 1;
}
+#endif
return 0;
}
bool power_get_battery_charging(void)
{
+#ifdef CONFIG_HAS_BATTERY
JADE_SEMAPHORE_TAKE(i2c_mutex);
uint8_t charging_status;
// Bit5-Bit4: 0b00 Ready 0b01 Charging 0b10 Charge done 0b11 Fault
@@ -248,6 +257,9 @@ bool power_get_battery_charging(void)
JADE_SEMAPHORE_GIVE(i2c_mutex);
return (charging_status & STM32_REG_BAT_CHARGING_MASK) == STM32_REG_BAT_CHARGING;
+#else
+ return false;
+#endif
}
uint16_t power_get_ibat_charge(void) { return 0; }
diff --git a/main/process/dashboard.c b/main/process/dashboard.c
index 94afa5a..d8dda2b 100644
--- a/main/process/dashboard.c
+++ b/main/process/dashboard.c
@@ -2154,7 +2154,7 @@ static void handle_settings(const bool startup_menu)
case BTN_SETTINGS_WALLET_EXIT:
case BTN_SETTINGS_AUTHENTICATION_EXIT:
case BTN_SETTINGS_PINSERVER_EXIT:
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
case BTN_SETTINGS_USBSTORAGE_EXIT:
#endif
// Change to base 'Settings' menu
@@ -2233,9 +2233,11 @@ static void handle_settings(const bool startup_menu)
handle_display_mac_address();
break;
+#ifdef CONFIG_HAS_BATTERY
case BTN_SETTINGS_DEVICE_INFO_BATTERY:
handle_display_battery_volts();
break;
+#endif
case BTN_SETTINGS_DEVICE_INFO_STORAGE:
handle_storage();
@@ -2257,9 +2259,11 @@ static void handle_settings(const bool startup_menu)
handle_change_pin();
break;
+#ifdef CONFIG_HAS_CAMERA
case BTN_SETTINGS_CHANGE_PIN_QR:
done = handle_change_pin_qr();
break;
+#endif
// NOTE: Only Jade v1.1's and v2's have brightness controls
#if defined(CONFIG_BOARD_TYPE_JADE_V1_1) || defined(CONFIG_BOARD_TYPE_JADE_V2) \
@@ -2322,7 +2326,7 @@ static void handle_settings(const bool startup_menu)
done = offer_temporary_wallet_login();
break;
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
case BTN_SETTINGS_USBSTORAGE:
// when entering manually (rather than detecting hot plug)
// we have to first manually disable the usb serial, no op if already off
@@ -2364,9 +2368,11 @@ static void handle_settings(const bool startup_menu)
handle_view_otps();
break;
+#ifdef CONFIG_HAS_CAMERA
case BTN_SETTINGS_OTP_NEW_QR:
register_otp_qr();
break;
+#endif
case BTN_SETTINGS_OTP_NEW_KB:
register_otp_kb_entry();
@@ -2376,9 +2382,11 @@ static void handle_settings(const bool startup_menu)
show_pinserver_details();
break;
+#ifdef CONFIG_HAS_CAMERA
case BTN_SETTINGS_PINSERVER_SCAN_QR:
handle_pinserver_scan();
break;
+#endif
case BTN_SETTINGS_PINSERVER_RESET:
handle_pinserver_reset();
diff --git a/main/ui/dashboard.c b/main/ui/dashboard.c
index 6a7f84c..b0905a2 100644
--- a/main/ui/dashboard.c
+++ b/main/ui/dashboard.c
@@ -285,7 +285,7 @@ gui_activity_t* make_uninitialised_settings_activity(void)
{ .txt = NULL, .font = GUI_DEFAULT_FONT, .ev_id = GUI_BUTTON_EVENT_NONE } };
btn_data_t menubtns[]
= { { .txt = "Temporary Signer", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_TEMPORARY_WALLET_LOGIN },
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
{ .txt = "USB Storage", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_USBSTORAGE },
#endif
{ .txt = "BIP39 Passphrase", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_BIP39_PASSPHRASE },
@@ -312,12 +312,13 @@ gui_activity_t* make_unlocked_settings_activity(void)
btn_data_t hdrbtns[] = { { .txt = "=", .font = JADE_SYMBOLS_16x16_FONT, .ev_id = BTN_SETTINGS_EXIT },
{ .txt = NULL, .font = GUI_DEFAULT_FONT, .ev_id = GUI_BUTTON_EVENT_NONE } };
- btn_data_t menubtns[] = { { .txt = "Wallet", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_WALLET },
- { .txt = "Device", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE },
-#ifdef CONFIG_IDF_TARGET_ESP32S3
- { .txt = "USB Storage", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_USBSTORAGE },
+ btn_data_t menubtns[]
+ = { { .txt = "Wallet", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_WALLET },
+ { .txt = "Device", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE },
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
+ { .txt = "USB Storage", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_USBSTORAGE },
#endif
- { .txt = "Authentication", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_AUTHENTICATION } };
+ { .txt = "Authentication", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_AUTHENTICATION } };
return make_menu_activity("Options", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
}
@@ -334,7 +335,7 @@ gui_activity_t* make_wallet_settings_activity(void)
return make_menu_activity("Wallet", hdrbtns, 2, menubtns, 3);
}
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
gui_activity_t* make_usbstorage_settings_activity(const bool unlocked)
{
btn_data_t hdrbtns[] = { { .txt = "=", .font = JADE_SYMBOLS_16x16_FONT, .ev_id = BTN_SETTINGS_USBSTORAGE_EXIT },
@@ -403,23 +404,19 @@ gui_activity_t* make_display_settings_activity(void)
= { { .txt = "Display Brightness", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_BRIGHTNESS },
{ .txt = "Flip Orientation", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_ORIENTATION },
{ .txt = "Theme", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_THEME } };
- const size_t num_menubtns = 3;
#elif defined(CONFIG_BOARD_TYPE_JADE_V1_1)
btn_data_t menubtns[]
= { { .txt = "Display Brightness", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_BRIGHTNESS },
{ .txt = "Theme", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_THEME } };
- const size_t num_menubtns = 2;
#elif defined(CONFIG_BOARD_TYPE_JADE)
btn_data_t menubtns[] = { { .txt = "Theme", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_THEME } };
- const size_t num_menubtns = 1;
#else // DIY units
btn_data_t menubtns[]
= { { .txt = "Flip Orientation", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_ORIENTATION },
{ .txt = "Theme", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DISPLAY_THEME } };
- const size_t num_menubtns = 2;
#endif
- return make_menu_activity("Display", hdrbtns, 2, menubtns, num_menubtns);
+ return make_menu_activity("Display", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
}
gui_activity_t* make_authentication_activity(const bool initialised_and_pin_unlocked)
@@ -429,11 +426,19 @@ gui_activity_t* make_authentication_activity(const bool initialised_and_pin_unlo
btn_data_t menubtns[] = { { .txt = "Duress PIN", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_WALLET_ERASE_PIN },
{ .txt = "OTP", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_OTP },
- { .txt = "Change PIN (QR)", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_CHANGE_PIN_QR } };
+#ifdef CONFIG_HAS_CAMERA
+ { .txt = "Change PIN (QR)", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_CHANGE_PIN_QR }
+#endif
+ };
- const size_t num_btns = initialised_and_pin_unlocked ? 3 : 2;
+ size_t num_menubtns = 2;
+#ifdef CONFIG_HAS_CAMERA
+ if (initialised_and_pin_unlocked) {
+ num_menubtns = 3;
+ }
+#endif
- return make_menu_activity("Authentication", hdrbtns, 2, menubtns, num_btns);
+ return make_menu_activity("Authentication", hdrbtns, 2, menubtns, num_menubtns);
}
gui_activity_t* make_otp_activity(void)
@@ -452,10 +457,14 @@ gui_activity_t* make_new_otp_activity(void)
btn_data_t hdrbtns[] = { { .txt = "=", .font = JADE_SYMBOLS_16x16_FONT, .ev_id = BTN_SETTINGS_OTP_NEW_EXIT },
{ .txt = "?", .font = GUI_TITLE_FONT, .ev_id = BTN_SETTINGS_OTP_HELP } };
- btn_data_t menubtns[] = { { .txt = "Scan QR", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_OTP_NEW_QR },
- { .txt = "Enter URI", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_OTP_NEW_KB } };
+ btn_data_t menubtns[] = {
+#ifdef CONFIG_HAS_CAMERA
+ { .txt = "Scan QR", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_OTP_NEW_QR },
+#endif
+ { .txt = "Enter URI", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_OTP_NEW_KB }
+ };
- return make_menu_activity("New OTP", hdrbtns, 2, menubtns, 2);
+ return make_menu_activity("New OTP", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
}
gui_activity_t* make_pinserver_activity(void)
@@ -464,13 +473,15 @@ gui_activity_t* make_pinserver_activity(void)
{ .txt = "?", .font = GUI_TITLE_FONT, .ev_id = BTN_SETTINGS_PINSERVER_HELP } };
btn_data_t menubtns[] = { { .txt = "Settings", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_PINSERVER_SHOW },
+#ifdef CONFIG_HAS_CAMERA
{ .txt = "Scan Oracle QR", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_PINSERVER_SCAN_QR },
+#endif
{ .txt = "Reset Oracle", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_PINSERVER_RESET } };
- return make_menu_activity("Blind Oracle", hdrbtns, 2, menubtns, 3);
+ return make_menu_activity("Blind Oracle", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
}
-#ifdef CONFIG_IDF_TARGET_ESP32S3
+#if defined(CONFIG_IDF_TARGET_ESP32S3) && defined(CONFIG_HAS_BATTERY)
gui_activity_t* make_usb_connect_activity(const char* title)
{
JADE_ASSERT(title);
@@ -544,7 +555,7 @@ gui_activity_t* make_session_activity(void)
#endif
};
- return make_menu_activity("Session", hdrbtns, 2, menubtns, 2);
+ return make_menu_activity("Session", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
}
gui_activity_t* make_ble_activity(gui_view_node_t** ble_status_item)
@@ -605,18 +616,17 @@ gui_activity_t* make_info_activity(const char* fw_version)
gui_set_align(fwver, GUI_ALIGN_LEFT, GUI_ALIGN_MIDDLE);
gui_set_parent(fwver, splitfw);
- btn_data_t menubtns[] = { { .content = splitfw, .ev_id = BTN_SETTINGS_INFO_FWVERSION },
- { .txt = "Device Info", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE_INFO },
- { .txt = "Legal", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_LEGAL } };
-
- // Legal screens only apply to proper jade hw
+ btn_data_t menubtns[]
+ = { { .content = splitfw, .ev_id = BTN_SETTINGS_INFO_FWVERSION },
+ { .txt = "Device Info", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE_INFO }
#if defined(CONFIG_BOARD_TYPE_JADE) || defined(CONFIG_BOARD_TYPE_JADE_V1_1) || defined(CONFIG_BOARD_TYPE_JADE_V2)
- const size_t num_menubtns = 3;
-#else
- const size_t num_menubtns = 2;
+ // Legal screens only apply to proper jade hw
+ ,
+ { .txt = "Legal", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_LEGAL }
#endif
+ };
- gui_activity_t* const act = make_menu_activity("Info", hdrbtns, 2, menubtns, num_menubtns);
+ gui_activity_t* const act = make_menu_activity("Info", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
// NOTE: can only set scrolling *after* gui tree created
gui_set_text_scroll_selected(fwver, true, TFT_BLACK, gui_get_highlight_color());
@@ -630,10 +640,12 @@ gui_activity_t* make_device_info_activity(void)
{ .txt = NULL, .font = GUI_DEFAULT_FONT, .ev_id = GUI_BUTTON_EVENT_NONE } };
btn_data_t menubtns[] = { { .txt = "MAC Address", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE_INFO_MAC },
+#ifdef CONFIG_HAS_BATTERY
{ .txt = "Battery Volts", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE_INFO_BATTERY },
+#endif
{ .txt = "Storage", .font = GUI_DEFAULT_FONT, .ev_id = BTN_SETTINGS_DEVICE_INFO_STORAGE } };
- return make_menu_activity("Device Info", hdrbtns, 2, menubtns, 3);
+ return make_menu_activity("Device Info", hdrbtns, 2, menubtns, sizeof(menubtns) / sizeof(btn_data_t));
}
#if defined(CONFIG_BOARD_TYPE_JADE) || defined(CONFIG_BOARD_TYPE_JADE_V1_1) || defined(CONFIG_BOARD_TYPE_JADE_V2)
Why this scored 19/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.