|
|
#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();
|
|
|
}
|