TiSmartCar/example/2025_source_user/OledMenuPaint.cpp
Boen_Shi 8be2866433 feat(base): 初始化 MSPM0 开发环境
- 添加头文件和配置文件支持
- 更新.gitignore忽略编译和IDE相关文件
- 添加基础的bsp代码
2026-07-16 14:45:26 +08:00

103 lines
2.7 KiB
C++

#include "OledMenuDriver.h"
#include "OledMenuPaint.h"
#include "../2025_include_user/OledMenuConfig.h"
const MenuPaint::Menu *MenuPaint::currentMenu = nullptr;
uint8_t MenuPaint::currentMenuSize = 0;
int8_t MenuPaint::selectIndex = 0;
int8_t MenuPaint::scrollOffset = 0;
bool MenuPaint::switchStates[20] = {0};
const MenuPaint::Menu *MenuPaint::menuStack[5] = {nullptr};
uint8_t MenuPaint::stackIndex = 0;
void MenuPaint::Init() {
currentMenu = menuRoot;
currentMenuSize = sizeof(menuRoot) / sizeof(Menu);
selectIndex = 0;
scrollOffset = 0;
}
void MenuPaint::Paint() {
MenuDriver::canvasClear();
for (int i = 0; i < 4; i++) {
int itemIndex = scrollOffset + i;
if (itemIndex >= currentMenuSize) break;
const Menu &item = currentMenu[itemIndex];
bool selected = (itemIndex == selectIndex);
bool checked = false;
if (item.type == MENU_TYPE_SWITCH) {
checked = switchStates[item.switchId];
}
RenderItem(16 * i, item.name, selected, checked);
}
MenuDriver::canvasUpdate();
}
void MenuPaint::RenderItem(int y, const char *text, bool selected, bool checked) {
MenuDriver::drawChinese(0, y + 12, text);
if (selected) {
MenuDriver::drawFrame(0, y, 128, 16);
}
if (checked) {
MenuDriver::drawCheckMark(128 - 12, y + 2, 10, 10);
}
}
void MenuPaint::ScrollUp() {
if (selectIndex > 0) {
selectIndex--;
if (selectIndex < scrollOffset) scrollOffset--;
Paint();
}
}
void MenuPaint::ScrollDown() {
if (selectIndex < currentMenuSize - 1) {
selectIndex++;
if (selectIndex >= scrollOffset + 4) scrollOffset++;
Paint();
}
}
void MenuPaint::Enter() {
const Menu &item = currentMenu[selectIndex];
if (item.type == MENU_TYPE_FOLDER && item.subMenus != nullptr) {
if (stackIndex < 5) {
menuStack[stackIndex++] = currentMenu;
}
currentMenu = item.subMenus;
currentMenuSize = item.subMenuCount;
selectIndex = 0;
scrollOffset = 0;
Paint();
} else if (item.type == MENU_TYPE_SWITCH) {
if (item.switchId < sizeof(switchStates)) {
switchStates[item.switchId] = !switchStates[item.switchId];
}
Paint();
}
}
void MenuPaint::Exit() {
if (stackIndex > 0) {
currentMenu = menuStack[--stackIndex];
currentMenuSize = sizeof(menuRoot) / sizeof(Menu); // 示例只返回一级
selectIndex = 0;
scrollOffset = 0;
Paint();
}
}
bool MenuPaint::GetSwitchState(uint8_t switchId) {
if (switchId >= sizeof(switchStates)) return false;
return switchStates[switchId];
}