#include "menu_api.h" #include "menu_param.h" #include "menu_lang.h" #include "menu_port.h" #include #include // Globals int32_t g_volume = 50; int32_t g_brightness = 80; uint8_t g_language = 1; // 0=EN, 1=CN // Callbacks MenuErrCode on_enter_main(MenuNodeId id, struct MenuCoreCtx* ctx) { menu_port_log(">> Entered Main Menu"); return MENU_ERR_OK; } MenuErrCode on_enter_settings(MenuNodeId id, struct MenuCoreCtx* ctx) { menu_port_log(">> Entered Settings"); return MENU_ERR_OK; } MenuErrCode on_enter_volume(MenuNodeId id, struct MenuCoreCtx* ctx) { menu_port_log(">> Entered Volume Param Edit"); return MENU_ERR_OK; } MenuErrCode on_enter_brightness(MenuNodeId id, struct MenuCoreCtx* ctx) { menu_port_log(">> Entered Brightness Param Edit"); return MENU_ERR_OK; } MenuErrCode on_render(MenuNodeId id, struct MenuCoreCtx* ctx) { // In a real system, this would draw to screen // Here we just print the current state occasionally or on change // For demo simplicity, we rely on enter/exit logs return MENU_ERR_OK; } void setup_params(void) { menu_param_init(); MenuParam p_vol = {0}; p_vol.id = 1; p_vol.type = MENU_PARAM_TYPE_INT32; p_vol.name = "Volume"; p_vol.value_ptr = &g_volume; p_vol.meta.num.min = 0; p_vol.meta.num.max = 100; p_vol.meta.num.step = 5; menu_param_register(&p_vol); MenuParam p_bri = {0}; p_bri.id = 2; p_bri.type = MENU_PARAM_TYPE_INT32; p_bri.name = "Brightness"; p_bri.value_ptr = &g_brightness; p_bri.meta.num.min = 10; p_bri.meta.num.max = 100; p_bri.meta.num.step = 10; menu_param_register(&p_bri); } void setup_menu(void) { menu_init(); // Root: Main Menu MenuNodeId main = menu_register_node(0, 0, "$MAIN", on_enter_main, NULL); // Child: Settings MenuNodeId settings = menu_register_node(0, main, "$SETTING", on_enter_settings, NULL); // Child: Info MenuNodeId info = menu_register_node(0, main, "$INFO", NULL, NULL); // Child of Settings: Volume MenuNodeId vol_node = menu_register_node(0, settings, "Volume", on_enter_volume, NULL); menu_node_bind_param(vol_node, 1); // Bind to Volume param (ID 1) // Child of Settings: Brightness MenuNodeId bri_node = menu_register_node(0, settings, "Brightness", on_enter_brightness, NULL); menu_node_bind_param(bri_node, 2); // Bind to Brightness param (ID 2) // Set permission levels for nodes menu_permission_update_node_level(settings, 1); // User level required for Settings menu_permission_update_node_level(vol_node, 1); // User level required for Volume menu_permission_update_node_level(bri_node, 1); // User level required for Brightness } // Stub for binding param (will implement in API) void bind_param(MenuNodeId node, uint16_t param) { // Need API support } int main(void) { menu_port_init(); setup_params(); setup_menu(); menu_port_log("Menu System Demo Started"); menu_enter(); // Enter root // Demo: Permission management menu_port_log("=== Permission Management Demo ==="); menu_port_log("Current role: Guest"); menu_port_log("Trying to enter Settings..."); menu_post_event_normal(MENU_EVENT_KEY_ENTER, 0); menu_main_loop(0); menu_port_log("Switching to User role..."); menu_permission_set_current_role(2); // Switch to User role menu_post_event_normal(MENU_EVENT_KEY_ENTER, 0); menu_main_loop(0); // Navigate to Volume setting menu_post_event_normal(MENU_EVENT_KEY_DOWN, 0); menu_main_loop(0); menu_post_event_normal(MENU_EVENT_KEY_ENTER, 0); menu_main_loop(0); // Demo: Persistence menu_port_log("=== Persistence Demo ==="); menu_port_log("Saving current state..."); menu_persistence_save(); menu_port_log("Exiting Volume menu..."); menu_post_event_normal(MENU_EVENT_MENU_EXIT, 0); menu_main_loop(0); menu_port_log("Loading saved state..."); menu_persistence_load(); menu_main_loop(0); // Demo: Clear persistence menu_port_log("=== Clear Persistence Demo ==="); menu_port_log("Clearing saved state..."); menu_persistence_clear(); menu_port_log("Trying to load cleared state (should fail)..."); MenuErrCode err = menu_persistence_load(); if (err != MENU_ERR_OK) { menu_port_log("Load failed as expected (state was cleared)"); } menu_port_log("Menu System Demo Completed"); return 0; }