【VtorMenu多級(jí)菜單】
【VtorMenu多級(jí)菜單】
【01】序
源碼gitee網(wǎng)址,與視頻講解網(wǎng)址
https://gitee.com/vtor3478/vtor_menu
https://www.bilibili.com/video/BV1vB4y1E7Ej
VtorMenu由偽鈔vtor原創(chuàng)開(kāi)發(fā),轉(zhuǎn)載注明出處
發(fā)布于gitee,目前僅有diaan工程包含了該子模塊
發(fā)布視頻后對(duì)其進(jìn)行了模塊化,但大差不差,問(wèn)題不大
VtorMenu及其所屬工程遵循LGPL V3,
如需移植,請(qǐng)遵循開(kāi)源協(xié)議
VtorMenu大量使用指針與樹(shù),
理解需要一定c語(yǔ)言與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)
VtorMenu包含函數(shù)指針模擬晚綁定,
理解需要一定設(shè)計(jì)模式基礎(chǔ)
VtorMenu使用純c語(yǔ)言,接口隔離,
可便于移植到用戶的工程中
本設(shè)計(jì)(包括但不限于文字、圖片、視頻)
發(fā)布于博客園(主要),吾愛(ài)論壇,偽鈔雜貨鋪微信公眾號(hào),
嗶哩嗶哩,知乎(暫定),開(kāi)源中國(guó)(暫定),影子論壇(待定)等
【02】設(shè)計(jì)方案
【0201】結(jié)構(gòu)體設(shè)計(jì)
【0201-結(jié)構(gòu)體設(shè)計(jì).png】

內(nèi)部成員有菜單名,
菜單項(xiàng)的值
指向其他菜單項(xiàng)的指針
顯示自身的函數(shù)
雙擊回調(diào)函數(shù)(用于擴(kuò)展)
當(dāng)前菜單內(nèi)所選項(xiàng)
菜單內(nèi)有多少項(xiàng)
【0202】菜單實(shí)例
【0202-菜單實(shí)例(參考手機(jī)).png】

參考我的miui手機(jī)的設(shè)置,寫(xiě)了基本菜單
使用縮進(jìn)表示層級(jí),最頂層為自身,
下面有my device,mobile net,display三個(gè)大菜單,
下面還有子菜單,自行查看即可
【0203】構(gòu)建菜單樹(shù)方法
【0203-構(gòu)建菜單樹(shù)方法.png】

詳見(jiàn)MENU_RelateItem函數(shù)
參數(shù)為父菜單,和子項(xiàng)的指針
將子項(xiàng)根據(jù)父菜單的itemCnt添加到父菜單的item指針數(shù)組中
再將子項(xiàng)的item[0]指向父菜單,
這里就完成了樹(shù)的創(chuàng)建
后面是display函數(shù),如果為空,則使用默認(rèn)的顯示函數(shù)
【0204】操作菜單
【0204-操作菜單.png】

在MENU_Operate函數(shù)中
opType為操作類型
opValue為操作值
操作類型有 無(wú)操作 單擊 選擇項(xiàng) 更改值 雙擊
單擊會(huì)進(jìn)入所選菜單,
如果是自身,會(huì)回到上級(jí)菜單,省去了一個(gè)項(xiàng)
如果是子項(xiàng),會(huì)進(jìn)入選中的子項(xiàng)
此操作會(huì)影響全局指針變量pCurVtorMenu,特地單獨(dú)處理
雙擊調(diào)用回調(diào)函數(shù),暫時(shí)為空,誰(shuí)知道用戶會(huì)有什么奇怪需求呢
選擇項(xiàng)是操作pCurVtorMenu,因?yàn)楫?dāng)前菜單中的所選項(xiàng)
更改值是操作pCurMenuItem,因?yàn)橐淖冞x中的那一項(xiàng)
需要注意,因?yàn)閕tem[0]指向父菜單,
所以需要重新指向自身?。。。。。?!
【0205】顯示菜單
【0205-顯示菜單.png】

通過(guò)pCurVtorMenu獲取其子項(xiàng)
并通過(guò)函數(shù)指針display進(jìn)行顯示
與操作相似,當(dāng)遇上item[0]時(shí),需要重新指向自身??!
在MENU_DisplayItem函數(shù)中,
有exData擴(kuò)展表示是否被選中
如果被選中,反色,且前面顯示“>”符號(hào)
并將其格式化,再通過(guò)oled進(jìn)行顯示,同時(shí)串口輸出
【03】用戶使用方法
說(shuō)了這么多,終于到使用方法了
【0301】用戶初始化菜單
【0301-用戶初始化菜單.png】

前面我使用了手機(jī)內(nèi)設(shè)置作為參考菜單
并且用縮進(jìn)表明層級(jí)關(guān)系
在用戶使用方法中,建議模仿我
使用局部指針指向具體菜單項(xiàng)
然后為各個(gè)菜單項(xiàng)添加子菜單,自頂向下添加
比如device,mobilenet,display均是root的子菜單
此外還需注意,為保證返回上級(jí)不會(huì)異常
需要將root設(shè)置為root的子菜單
【0302】用戶使用菜單
【0302-用戶使用菜單.png】

在User_Init中運(yùn)行一次MENU_Init,構(gòu)建菜單樹(shù)
示例為1秒操作并更新菜單
調(diào)用MENU_Operate操作菜單
調(diào)用MENU_Display顯示菜單
因?yàn)樵O(shè)備不同,你應(yīng)該要自行實(shí)現(xiàn)MENU_Display
【0303】操作菜單示例
【0303-操作菜單示例.png】

?電腦鍵盤(pán)如圖所示
以? 數(shù)字8? 舉例,觸發(fā)的操作應(yīng)該是是上移所選項(xiàng)
所以opType為2,Opvalue為1
使用正點(diǎn)原子xcom發(fā)送十六進(jìn)制【0x21】即可
在diaan工程中
? ? ? 串口接收中斷回調(diào)函數(shù)中opType與opValue
再在主循環(huán)中進(jìn)行處理即可。
?
vtor_menu多級(jí)菜單,全文完,2022年9月18日。?