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

120 lines
3.2 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)
}
// 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
// Simulation Loop
int steps = 0;
while (steps < 20) {
menu_main_loop(0);
// Simulate inputs
if (steps == 2) {
menu_port_log("User Press: ENTER");
menu_post_event(MENU_EVENT_KEY_ENTER, 0);
}
if (steps == 4) {
menu_port_log("User Press: DOWN");
menu_post_event(MENU_EVENT_KEY_DOWN, 0);
}
steps++;
// sleep
}
return 0;
}