Files
menu/examples/demo.c
2025-12-23 09:45:36 +08:00

149 lines
4.5 KiB
C

#include "menu_api.h"
#include "menu_param.h"
#include "menu_lang.h"
#include "menu_port.h"
#include <stdio.h>
#include <stdlib.h>
// 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;
}