149 lines
4.5 KiB
C
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;
|
|
}
|