前段时间写了一篇文章《C++面向对象语言自制多级菜单》,文中指出了可以将HeleMenu库进行移植,现已完成技术思路,特此记录。
一、特性
基本与上一篇文章指出的一致,只是将菜单显示和响应函数合二为一
二、代码实现
基本与上一篇文章指出的一致,只是考虑到右值和左值的问题,将形参改为了const类型
三、使用示例
(一)手动生成
void setup() {
/*手动生成菜单,测试用例3*/
HeleMenu *m1 = new HeleMenu("Root");
m1->attachAction(display_root);
HeleMenuViewer::init(m1); //初始化根菜单
HeleMenu *m2 = new HeleMenu("Log",m1);
m2->attachAction(display_log);
m2->addToMenus();
m2 = new HeleMenu("Opt",m1);
m2->addValues({"save","unsave"});
m2->attachAction(display_opt);
m2->addToMenus();
m2 = new HeleMenu("Menu",m1);
m2->attachAction(display_menu);
m2->addToMenus();
m1 = m2; //构建下一层子菜单
m1->addValues({"1.Adjust", "2.About"});
HeleMenuViewer::gotoRoot(); //到达根菜单
}
void loop() {
//显示与响应
lcd.clear();
HeleMenuViewer::action();
_delay_ms(50);
}
(二)脚本生成
void setup() {
/*脚本生成菜单*/
//测试用例1
void (*p_display[])(const string&, const vector<string>&, uint8_t&) = {/*root*/display_root, /*log*/display_log, /*operate*/display_opt, /*menu*/display_menu};
HeleMenu *m1 = HeleMenu::parseMenu("Root{Log{},Opt{save,unsave},Menu{0.Contrast,2.About}}", p_display);
HeleMenuViewer::init(m1);
//测试用例2
// void (*p_display[])(const string&, const vector<string>&, uint8_t&) = {/*root*/display_root, /*log*/display_log, /*operate*/display_opt, /*menu*/display_menu};
// HeleMenu *m1 = HeleMenu::parseMenu("{Log{},Opt{save,unsave},Menu{0.Contrast,2.About}}", p_display);
// HeleMenuViewer::init(m1);
HeleMenuViewer::gotoRoot(); //到达根菜单
}
void loop() {
//显示与响应
lcd.clear();
HeleMenuViewer::action();
_delay_ms(50);
}
(三)演示
菜单结构如下:
-Root
-Log
-XX
-...
-Opt
-save
-unsave
-Menu
-Contrast
-About
四、参考资料
- c++中string& , const string& 和 string&& 的区别是什么?
- 简单剖析C++右值引用和左值引用
- Reduce the size and memory usage of your sketch