#include "menus.h" #include "menu_life.h" #include "menu_cmdr.h" #include "menu_counters.h" #include "menu_dice.h" #include "menu_settings.h" #include "state.h" #include "ble.h" // Array index = header slot position (0–NUM_MENU_SLOTS-1). // Initialized with offline CMDR vtable; menus_init() fixes up slot 1 based on g_ble_enabled. const menu_vtable_t *menus[NUM_MENU_SLOTS] = { [MENU_LIFE] = &menu_life_vtable, // slot 0 — life counter [MENU_CMDR] = &menu_cmdr_offline_vtable, // slot 1 — commander damage (fixed by menus_init) [MENU_COUNTERS] = &menu_counters_vtable, // slot 2 — counters [MENU_DICE] = &menu_dice_vtable, // slot 3 — dice [4] = NULL, // slot 4 — empty [5] = NULL, // slot 5 — battery pct (special in oled_draw_header) [6] = NULL, // slot 6 — battery icon (special in oled_draw_header) [MENU_SETTINGS] = &menu_settings_vtable, // slot 7 — FWD+BACK combo to enter/exit }; void menus_init(void) { menus[MENU_CMDR] = g_ble_enabled ? &menu_cmdr_ble_vtable : &menu_cmdr_offline_vtable; } void menus_nav_short(int d) { const menu_vtable_t *m = menus[g_active_menu]; if (m && m->nav_short) m->nav_short(d); menus_draw(); } void menus_lr_delta(int d) { const menu_vtable_t *m = menus[g_active_menu]; if (m && m->lr_delta) m->lr_delta(d); menus_draw(); if (g_active_menu == MENU_LIFE || g_active_menu == MENU_COUNTERS || g_active_menu == MENU_CMDR) ble_adv_update(); led_sync(true); } void menus_draw(void) { const menu_vtable_t *m = menus[g_active_menu]; if (m && m->draw) m->draw(); }