重构显示逻辑为 MVP 架构,进行显示模块的解耦
This commit is contained in:
191
src/Drv/menu/app/menu.c
Normal file
191
src/Drv/menu/app/menu.c
Normal file
@@ -0,0 +1,191 @@
|
||||
#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"); }
|
||||
Reference in New Issue
Block a user