Files
DTU-HMI/src/Drv/menu/app/menu.c

192 lines
6.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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"); }