需要创建一个菜单的结构体,以便建立链表
typedef struct menu {
//定义一个菜单
uint8_t range_from,range_to; //当前显示的项开始及结束序号
uint8_t itemCount;//项目总数
uint8_t selected;//当前选择项
char menuItems[SUBMENUS][17];//菜单项目
struct menu *subMenus[SUBMENUS];//子菜单
struct menu *parent;//上级菜单 ,如果是顶级则为null
int (*func[SUBMENUS])(void);//选择相应项按确定键后执行的函数
float funcValue[SUBMENUS];
uint32_t menuId[SUBMENUS];
}Menu;
创建一些基本的函数
/*
* 添加下级单项菜单函数
* menu: 菜单指针
* submenus: 下级单项菜单
* index: 索引值
* return:索引值 error:-1
*/
int Menu_addItem(Menu *menu, Menu * subMenu, uint8_t index) {
if (menu == NULL) {
DEBUGOUT("menu is null");
return -1;
}
if (index > menu->itemCount) {
DEBUGOUT("index too big");
return -2;
}
//menu的下级菜单索引值[i]为subMenu
menu->subMenus[index] = subMenu;
menu->menuId[index+1] = (menu->menuId[0] << 4) | (index + 1);
subMenu->menuId[0] = menu->menuId[index+1];
//subMenu的上级菜单为menu
subMenu->parent = menu;
//printf("menu->id=%02x, submenu->id=%02x\r\n", menu->menuId[0], subMenu->menuId[0]);
return index;
}
这个函数是进行下级菜单的插入,进行菜单的深度插入。
同时,将下级菜单的父级菜单绑定到当前菜单上,这样使用返回的时候,可以跳转到本机菜单。
char Menu_addFunc(Menu * menu, int(*fun)(void), uint8_t index) {
if (menu == NULL) {
DEBUGOUT("menu is null");
return 0;
}
if (index > menu->itemCount) {
DEBUGOUT("index is too big");
return 0;
}
if (fun == NULL