192 lines
6.5 KiB
C
192 lines
6.5 KiB
C
#include "menu.h"
|
||
|
||
#include <stddef.h>
|
||
#include <stdio.h>
|
||
|
||
#include "../model/display.h"
|
||
#include "../../key.h"
|
||
#include "../view/menu_layout.h"
|
||
#include "../presenter/menu_presenter.h"
|
||
#include "../view/menu_render_port.h"
|
||
#include "../common/menu_state_types.h"
|
||
|
||
/* -------------------------------------------------------------------------
|
||
* 运行态状态收口(App 层私有)
|
||
*
|
||
* 设计意图:
|
||
* 1) 避免全局变量四处散落,统一由 app/menu.c 托管生命周期;
|
||
* 2) 外部模块只能经由 MenuApp_* 接口访问,降低耦合;
|
||
* 3) Presenter/Model/View 依赖都在初始化时一次性装配。
|
||
*
|
||
* 变量职责:
|
||
* - s_dspCtrl:
|
||
* 显示刷新控制状态(例如首帧标记 bFirst)。
|
||
* - s_menuCtrl:
|
||
* 导航与路由控制状态(当前节点、各级 route、0 级入口等)。
|
||
* - s_menuItems[300]:
|
||
* 运行时菜单节点池(树构建后常驻内存),由 Model 初始化、View 读取布局/渲染。
|
||
* - g_menuPresenter:
|
||
* MVP 调度中枢实例,封装输入处理与刷新协同。
|
||
* - g_menuLayoutConfig:
|
||
* 布局参数快照(屏幕尺寸、行高、边距、菜单宽度等),初始化时写入一次。
|
||
* ------------------------------------------------------------------------- */
|
||
static tagDspCtrl s_dspCtrl;
|
||
static tagMenuCtrl s_menuCtrl;
|
||
static tagMenuItem s_menuItems[300];
|
||
|
||
static MenuPresenter g_menuPresenter;
|
||
static MenuLayoutConfig g_menuLayoutConfig;
|
||
|
||
void MenuApp_Render(void)
|
||
{
|
||
/* 统一渲染入口:由 Presenter 决定全量/增量刷新策略。 */
|
||
MenuPresenter_Refresh(&g_menuPresenter);
|
||
}
|
||
|
||
void MenuApp_HandleInput(uint8_t keyVal)
|
||
{
|
||
/* 单次输入事件入口:按键解释与状态迁移都在 Presenter 内完成。 */
|
||
MenuPresenter_HandleInput(&g_menuPresenter, keyVal);
|
||
}
|
||
|
||
void MenuApp_PollInput(void)
|
||
{
|
||
/* 轮询输入设备(键盘/按键),再复用事件处理入口。 */
|
||
MenuApp_HandleInput(Key_Read());
|
||
}
|
||
|
||
void MenuApp_Init(void)
|
||
{
|
||
const MenuRenderPort *renderPort = MenuRenderPort_Lcd();
|
||
uint16_t lcdSizeX;
|
||
uint16_t lcdSizeY;
|
||
|
||
/* 1) 初始化底层渲染设备(LCD/模拟器具体实现由 renderPort 决定)。 */
|
||
renderPort->init();
|
||
|
||
/* 2) 通过渲染端口查询设备能力,避免 app 层直接依赖 lcd.h 宏。 */
|
||
lcdSizeX = renderPort->get_size_x();
|
||
lcdSizeY = renderPort->get_size_y();
|
||
|
||
/* 3) 组装布局配置(后续由 View 布局计算与渲染阶段复用)。 */
|
||
g_menuLayoutConfig.lcdSizeX = lcdSizeX;
|
||
g_menuLayoutConfig.lcdSizeY = lcdSizeY;
|
||
g_menuLayoutConfig.menuYMin = MENU_YMIN;
|
||
g_menuLayoutConfig.menuYMax = MENU_YMAX_FROM_LCD(lcdSizeY);
|
||
g_menuLayoutConfig.lineHeight = LINE_HEIGHT;
|
||
g_menuLayoutConfig.menuWidth = MENU_WITDTH;
|
||
g_menuLayoutConfig.menuXAdd = MENU_XADD;
|
||
g_menuLayoutConfig.menuYAdd = MENU_YADD;
|
||
|
||
/* 4) 装配 Presenter:注入控制状态、菜单池、渲染端口与布局配置。 */
|
||
MenuPresenter_Setup(&g_menuPresenter,
|
||
&s_dspCtrl,
|
||
&s_menuCtrl,
|
||
s_menuItems,
|
||
renderPort,
|
||
&g_menuLayoutConfig);
|
||
|
||
/* 5) 初始化模型数据并建立初始路由/布局。 */
|
||
MenuPresenter_InitModel(&g_menuPresenter, g_tMenuModelTab, MENU_MAX_ITEM);
|
||
}
|
||
|
||
const tagMenuItem *MenuApp_GetMenuItems(uint16_t *count)
|
||
{
|
||
/* 诊断/测试只读访问接口:
|
||
* - 返回内部菜单池首地址;
|
||
* - 若 count 非空,同步返回数组容量。 */
|
||
if (count != NULL)
|
||
{
|
||
*count = (uint16_t)(sizeof(s_menuItems) / sizeof(s_menuItems[0]));
|
||
}
|
||
return s_menuItems;
|
||
}
|
||
|
||
void MenuProc_See_AppInfo()
|
||
{
|
||
printf("MenuProc_See_AppInfo\n");
|
||
}
|
||
|
||
void MenuProc_See_YC()
|
||
{
|
||
printf("MenuProc_See_YC\n");
|
||
}
|
||
void MenuProc_Set_Value()
|
||
{
|
||
printf("MenuProc_Set_Value\n");
|
||
}
|
||
void MenuProc_Set_Soft()
|
||
{
|
||
printf("MenuProc_Set_Soft\n");
|
||
}
|
||
void MenuProc_Cfg_Time()
|
||
{
|
||
printf("MenuProc_Cfg_Time\n");
|
||
}
|
||
void MenuProc_Cfg_RevEvent()
|
||
{
|
||
printf("MenuProc_Cfg_RevEvent\n");
|
||
}
|
||
void MenuProc_Cfg_ManualWave()
|
||
{
|
||
printf("MenuProc_Cfg_ManualWave\n");
|
||
}
|
||
void MenuProc_See_Input()
|
||
{
|
||
printf("MenuProc_See_Input\n");
|
||
}
|
||
|
||
void MenuProc_See_Set()
|
||
{
|
||
printf("MenuProc_See_Set\n");
|
||
}
|
||
|
||
void MenuProc_See_Soft()
|
||
{
|
||
printf("MenuProc_See_Soft\n");
|
||
}
|
||
void MenuProc_YX_SetCommType()
|
||
{
|
||
printf("MenuProc_YX_SetCommType\n");
|
||
}
|
||
|
||
void MenuProc_YX_SetWidth()
|
||
{
|
||
printf("MenuProc_YX_SetWidth\n");
|
||
}
|
||
|
||
void MenuProc_YX_SetTwin()
|
||
{
|
||
printf("MenuProc_YX_SetTwin\n");
|
||
}
|
||
|
||
/* ---------- 以下为 display.c 菜单表引用、暂无具体实现的桩函数,避免链接未定义符号 ---------- */
|
||
void Menu_NonPfunc(void) { printf("Menu_NonPfunc\n"); }
|
||
void MenuProc_AllInf_Default(void) { printf("MenuProc_AllInf_Default\n"); }
|
||
void MenuProc_Para_Default(void) { printf("MenuProc_Para_Default\n"); }
|
||
void MenuProc_Set_Default(void) { printf("MenuProc_Set_Default\n"); }
|
||
void MenuProc_Resume_Soft(void) { printf("MenuProc_Resume_Soft\n"); }
|
||
void MenuProc_Cfg_CellDef(void) { printf("MenuProc_Cfg_CellDef\n"); }
|
||
void MenuProc_Cfg_ShowAnaType(void) { printf("MenuProc_Cfg_ShowAnaType\n"); }
|
||
void MenuProc_Dbg_XuYX(void) { printf("MenuProc_Dbg_XuYX\n"); }
|
||
void MenuProc_Dbg_XuYC(void) { printf("MenuProc_Dbg_XuYC\n"); }
|
||
void MenuProc_Dbg_XuEvent(void) { printf("MenuProc_Dbg_XuEvent\n"); }
|
||
void MenuProc_Dbg_Relay(void) { printf("MenuProc_Dbg_Relay\n"); }
|
||
void MenuProc_See_VersionBoard(void) { printf("MenuProc_See_VersionBoard\n"); }
|
||
void MenuProc_Cfg_ClrRec(void) { printf("MenuProc_Cfg_ClrRec\n"); }
|
||
void MenuProc_Cfg_ComPara(void) { printf("MenuProc_Cfg_ComPara\n"); }
|
||
void MenuProc_Cfg_EditIP(void) { printf("MenuProc_Cfg_EditIP\n"); }
|
||
void MenuProc_Cfg_EditSntp(void) { printf("MenuProc_Cfg_EditSntp\n"); }
|
||
void MenuProc_Cfg_CellConf(void) { printf("MenuProc_Cfg_CellConf\n"); }
|
||
void MenuProc_See_RecSOE(void) { printf("MenuProc_See_RecSOE\n"); }
|
||
void MenuProc_See_RecAct(void) { printf("MenuProc_See_RecAct\n"); }
|
||
void MenuProc_See_RecOpt(void) { printf("MenuProc_See_RecOpt\n"); }
|
||
void MenuProc_See_RecAlm(void) { printf("MenuProc_See_RecAlm\n"); }
|
||
void MenuProc_See_RecStart(void) { printf("MenuProc_See_RecStart\n"); }
|
||
void MenuProc_See_RecYK(void) { printf("MenuProc_See_RecYK\n"); }
|
||
void MenuProc_See_RecChk(void) { printf("MenuProc_See_RecChk\n"); }
|
||
void MenuProc_See_RecRun(void) { printf("MenuProc_See_RecRun\n"); }
|
||
void MenuProc_See_RecFault(void) { printf("MenuProc_See_RecFault\n"); }
|
||
void MenuProc_YC_SetSqValue(void) { printf("MenuProc_YC_SetSqValue\n"); }
|
||
void MenuProc_YC_SetAdjCoe(void) { printf("MenuProc_YC_SetAdjCoe\n"); }
|