K1Guitar/UI/UI_global.c

1026 lines
33 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 "includes.h"
extern uint8_t level;
// ==============================================
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBB6A8>
// ==============================================
void (*MenuPage_Idle_Proc)(void);
void (*MenuPage_SongMode_Proc)(void);
void (*MenuPage_ExpertMode_Proc)(void);
void (*MenuPage_FreeMode_Proc)(void);
void (*MenuPage_Setting_Proc)(void);
void (*MenuPage_SystemSetting_Proc)(void);
void (*MenuPage_Mixer_Proc)(void);
void (*MenuPage_Restore_Proc)(void);
// ==============================================
// <20><>ʼ<EFBFBD><CABC><EFBFBD>˵<EFBFBD>UI
// ==============================================
void InitMenuUI(void) {
MenuPage_Idle_Proc = CallUI_Idle; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MenuPage_SongMode_Proc = CallUI_SongMode; // <20><><EFBFBD><EFBFBD>ģʽ
MenuPage_ExpertMode_Proc = CallUI_ExpertMode; // ר<><D7A8>ģʽ
MenuPage_FreeMode_Proc = CallUI_FreeMode; // <20><><EFBFBD><EFBFBD>ģʽ
MenuPage_Setting_Proc = CallUI_Setting; // <20><><EFBFBD><EFBFBD>
MenuPage_SystemSetting_Proc = CallUI_SystemSetting; // ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
MenuPage_Mixer_Proc = CallUI_Mixer; //<2F><><EFBFBD><EFBFBD>̨
MenuPage_Restore_Proc = CallUI_RestoreSelect;
}
// ==============================================
// <20><><EFBFBD><EFBFBD> UI <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
// ==============================================
void CallUI_Idle(void) {
CurrUIProcress = IdleProcess;
app_log_set_ui_page("Idle");
LOG_I("UI", "page Idle");
}
void CallUI_SongMode(void) {
app_touch_suppress(500);
UI_SongMode_Init();
CurrUIProcress = UI_SongMode_Process;
app_log_set_ui_page("Song");
LOG_I("UI", "page SongMode tab=%u", (unsigned)mGuiData[GUI_TAB_INDEX].Current);
}
void CallUI_ExpertMode(void) {
app_touch_suppress(500);
UI_ExpertMode_Init();
// CurrUIProcress = UI_ExpertMode_Process;
CurrUIProcress = UI_SongMode_Process;
app_log_set_ui_page("Expert");
LOG_I("UI", "page ExpertMode");
}
void CallUI_FreeMode(void) {
app_touch_suppress(500);
UI_FreeMode_Init();
// CurrUIProcress = UI_FreeMode_Process;
CurrUIProcress = UI_SongMode_Process;
app_log_set_ui_page("Free");
LOG_I("UI", "page FreeMode");
}
void CallUI_Setting(void) {
app_touch_suppress(500);
CurrUIProcress = UI_Setting_Process;
UI_Setting_Init();
app_log_set_ui_page("Setting");
LOG_I("UI", "page Setting");
}
void CallUI_Mixer(void) {
app_touch_suppress(500);
CurrUIProcress = UI_Mixer_Process;
UI_Mixer_Init();
app_log_set_ui_page("Mixer");
LOG_I("UI", "page Mixer");
}
void CallUI_SystemSetting(void) {
app_touch_suppress(500);
CurrUIProcress = UI_SystemSet_Process;
UI_SystemSet_Init();
app_log_set_ui_page("SysSet");
LOG_I("UI", "page SystemSetting");
}
void CallUI_RestoreSelect(void) {
CurrUIProcress = UI_Restore_Select_Process;
UI_Restore_Select_Init();
app_log_set_ui_page("Restore");
LOG_I("UI", "page Restore");
}
static uint8_t s_ui_focus_id = UI_FOCUS_NONE;
static uint8_t UI_NormalizeFocusId(uint8_t widget_id)
{
if (widget_id == GUI_AUTOBAND_SW)
return GUI_MODE_PARAM;
return widget_id;
}
static void UI_RedrawWidget(uint8_t id)
{
if (CurrUIProcress == UI_SongMode_Process)
{
switch (id)
{
case GUI_TRANSPOSE:
label_Tranzpose_ui(&UI_Label[GUI_TRANSPOSE], &mGuiData[GUI_TRANSPOSE]);
break;
case GUI_SPEED:
label_Speed_ui(&UI_Label[GUI_SPEED], &mGuiData[GUI_SPEED]);
break;
case GUI_MODE_PARAM:
label_ModeSelece_ui(&UI_Label[GUI_MODE_PARAM], &mGuiData[GUI_MODE_PARAM]);
break;
case GUI_TIMBRE_SELECT:
label_TimbreSelece_ui(&UI_Label[GUI_TIMBRE_SELECT], &mGuiData[GUI_TIMBRE_SELECT]);
break;
case GUI_PLAY_SECTION:
label_PlaySection_ui(&UI_Label[GUI_PLAY_SECTION], &mGuiData[GUI_PLAY_SECTION]);
break;
default:
break;
}
}
else if (CurrUIProcress == UI_Setting_Process)
{
if (id <= GUI_RESTORE)
Draw_System_Item_List(&SystemSetting[id], &mGuiData_SystemSETTING[id]);
}
}
void UI_ClearFocus(void)
{
s_ui_focus_id = UI_FOCUS_NONE;
}
uint8_t UI_IsFocused(uint8_t widget_id)
{
return (s_ui_focus_id == UI_NormalizeFocusId(widget_id)) ? 1 : 0;
}
void UI_GetFocusGrad(uint8_t widget_id, uint16_t *c_top, uint16_t *c_bot)
{
if (UI_IsFocused(widget_id))
{
*c_top = START_COLOR;
*c_bot = END_COLOR;
}
else
{
*c_top = COLOR_NORMAL_BG;
*c_bot = COLOR_NORMAL_BG;
}
}
uint8_t UI_SetFocus(uint8_t widget_id)
{
uint8_t prev = s_ui_focus_id;
widget_id = UI_NormalizeFocusId(widget_id);
if (prev == widget_id)
return 0;
s_ui_focus_id = widget_id;
if (prev != UI_FOCUS_NONE)
UI_RedrawWidget(prev);
if (widget_id != UI_FOCUS_NONE)
UI_RedrawWidget(widget_id);
return 1;
}
void label_top()
{
const uint16_t btn_color = /*DARKLGRAY*/0x2988;
LCD_FillByColor(0, 0, 240, UI_STATUS_BAR_H, UI0902_BG_COLOR);
/* 仅一组动态音量条(音量图标素材本身也是竖条,不再叠绘以免双图标) */
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY);
LCD_DrawLine(0, 26, 240, 26, btn_color);
Show_BL_Icon(mGuiData[GUI_BL_SW].Current);
Show_Battery_Icon(usb_charging_state);
}
/* 小节选择刷新(占位,实际绘制在 UI_SongMode 内部) */
void Refresh_SectionSelect(uint16_t last_value, const LEBEL_UI *UI, GUI_SWITCH *Group)
{
Draw_Tab_Section_Menu(UI,(TAB_SECTION_INDEX)Group->Current);
}
/* TAB 选择刷新tab 未变时不切页,避免误触/phantom touch 整页重绘闪烁 */
void Refresh_TabSelect_ui(const LEBEL_UI *UI, GUI_SWITCH *Group)
{
static uint8_t s_last_tab = 0xFFU;
uint8_t tab = (uint8_t)Group->Current;
(void)UI;
if (tab == s_last_tab) {
return;
}
s_last_tab = tab;
switch (tab)
{
case 0:
MenuPage_SongMode_Proc();
break;
case 1:
MenuPage_ExpertMode_Proc();
break;
case 2:
MenuPage_FreeMode_Proc();
break;
case 3:
MenuPage_SystemSetting_Proc();
break;
default:
break;
}
}
/* 返回当前 TAB 对应的模式页(设置/调音台页的“返回”用) */
void UI_GotoCurrentModePage(void)
{
switch (mGuiData[GUI_TAB_INDEX].Current)
{
case 0:
ADDRESS = mGuiData[GUI_AUTOBAND_SW].Current ? 0x0009EB5F : 0x0001B8F0;
MenuPage_SongMode_Proc();
break;
case 1:
ADDRESS = mGuiData[GUI_AUTOBAND_SW].Current ? 0x0009EB5F : 0x00000000;
MenuPage_ExpertMode_Proc();
break;
case 2:
ADDRESS = 0x0009598F;
MenuPage_FreeMode_Proc();
break;
default:
MenuPage_SongMode_Proc();
break;
}
}
/* 蓝牙图标:设计稿居中 */
void Show_BL_Icon(uint8_t value)
{
LCD_FillByColor(UI0902_BT_X, UI0902_BT_Y,
UI0902_BT_X + UI0902_BT_W - 1,
UI0902_BT_Y + UI0902_BT_H - 1, UI0902_BG_COLOR);
if (value)
{
LCD_WR_PIC_Trans(UI0902_BT_X, UI0902_BT_Y, UI0902_BT_W, UI0902_BT_H,
gImage_UI0902_Bluetooth_11x17, BLACK);
}
BSP_BlueToothPowerEnable(value);
}
void Draw_Status_Battery_Icon(uint8_t battery_percent)
{
uint8_t Info[8];
uint16_t fill_w;
uint16_t text_w;
uint16_t bat_x;
uint16_t text_x;
uint16_t text_y;
if (battery_percent > 100)
battery_percent = 100;
sprintf((char *)Info, "%d%%", battery_percent);
text_w = (uint16_t)(strlen((char *)Info) * (UI0902_BATTERY_TEXT_SIZE / 2));
bat_x = (uint16_t)(240 - UI0902_BATTERY_RIGHT_MARGIN - text_w
- UI0902_BATTERY_TEXT_GAP - UI0902_BATTERY_W);
text_x = (uint16_t)(bat_x + UI0902_BATTERY_W + UI0902_BATTERY_TEXT_GAP);
text_y = (uint16_t)((UI_STATUS_BAR_H - UI0902_BATTERY_TEXT_SIZE) / 2);
LCD_FillByColor(bat_x > 2 ? (uint16_t)(bat_x - 2) : 0, 0, 240, UI_STATUS_BAR_H,
UI0902_BG_COLOR);
fill_w = (uint16_t)((22UL * battery_percent) / 100);
LCD_WR_PIC_ClipX(bat_x + 3, UI0902_BATTERY_Y + 2, 22, 9, fill_w,
gImage_UI0902_BatteryFill_22x9);
LCD_WR_PIC_Trans(bat_x, UI0902_BATTERY_Y, UI0902_BATTERY_W, UI0902_BATTERY_H,
gImage_UI0902_BatteryOutline_29x12, BLACK);
LCD_ShowString(text_x, text_y, Info, WHITE, UI0902_BG_COLOR,
UI0902_BATTERY_TEXT_SIZE, 0);
}
void Show_Battery_Icon(uint8_t flag)
{
(void)flag;
Draw_Status_Battery_Icon(percentage);
}
void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group)
{
char Textstr_new[40] = {0};
char NumBuf[8] = {0};
uint16_t text_y = UI->y + 25+5+5;
uint8_t idx = Group->Current + 1;
uint16_t c_top, c_bot;
UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x+25, UI->y+20+5,
UI->x + UI->w-40-(UI->x+25),
UI->h-20,
0,
c_top, c_bot
);
// 拼接序号 1. 2. 3.
sprintf(NumBuf, "%d.", idx);
// 计算数字宽度
uint16_t num_w = (strlen(NumBuf)) * (UI->Text_size / 2);
// 获取音色中文
GET_ParamNum_Str(Group->Current, 0, Textstr_new, Group->Id);
uint32_t string_start_x = LCD_ShowMixedString(UI->x+10, UI->x + UI->w, text_y, (uint8_t *)Textstr_new , LCD_ALIGN_CENTER, WHITE, BLACK, UI->Text_size, 1);
//序号X = 中文起点 - 数字宽度 - 5<EFBC8C>?像素
uint16_t num_x = string_start_x - num_w;
// 绘制左侧数字序号
LCD_ShowString(num_x, text_y, (const uint8_t *)NumBuf, UI->Text_fc, UI->Text_bc, UI->Text_size, 1);
}
//void Refresh_Transpose(uint8_t last_data,const LEBEL_UI *UI, GUI_SWITCH * Group)
//{
// LCD_FillRoundRectGradient(
// UI->x+30,
// UI->y + 20,
// 25 + 10+10+5,
// 20,
// 0,
// START_COLOR, END_COLOR
// );
// char Textstr1[20] = {0,};
// GET_Num_Str(Group->Current,0,Textstr1,Group->Id);
//
// LCD_ShowString_AutoAlign_Gradient(
// UI->x, // 坐标<E59D90>?
// UI->x+UI->w,
// UI->y + 17,
// (const uint8_t*)Textstr1,
// UI->Text_Align,
// UI->Text_fc,
// START_COLOR,
// END_COLOR,
// UI->Text_size
// );
//}
void Refresh_Transpose(const LEBEL_UI *UI, GUI_SWITCH * Group)
{
uint16_t c_top, c_bot;
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x+30,
UI->y + 20,
25 + 10+10+5,
20,
0,
c_top, c_bot
);
char Textstr1[20] = {0,};
GET_Num_Str(Group->Current,0,Textstr1,Group->Id);
LCD_ShowString_AutoAlign_Gradient(
UI->x, // 坐标
UI->x+UI->w,
UI->y + 17,
(const uint8_t*)Textstr1,
UI->Text_Align,
UI->Text_fc,
c_top,
c_bot,
UI->Text_size
);
}
void Refresh_StringTimbre(uint8_t last_data,const LEBEL_UI *UI, GUI_SWITCH * Group)
{
uint16_t c_top, c_bot;
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x + 40,
UI->y + 25,
UI->x + UI->w - 40 - (UI->x + 40),
UI->y + 25 + UI->Text_size + 5 -(UI->y + 25),
0,
c_top, c_bot
);
char Textstr1[20] = {0,};
char NumBuf[8] = {0};
uint8_t idx = Group->Current + 1;
uint16_t text_y = UI->y + 25;
// 拼接ASCII序号字符串1. 2. 3. ...
sprintf(NumBuf, "%d.", idx);
// 计算数字总像素宽<E7B4A0>?
uint16_t num_w = (strlen(NumBuf)) * (UI->Text_size / 2);
// 获取音色中文
GET_Num_Str(Group->Current,0,Textstr1,Group->Id);
// 先调用获取中文实际绘制起始X坐标
uint32_t chinese_start_x = LCD_ShowChinese_AutoAlign(
UI->x + num_w,
UI->x + UI->w,
text_y + 3,
(const uint8_t*)Textstr1,
UI->Text_Align,
UI->Text_fc,
UI->Text_bc,
1,
UI->Text_size
);
// 序号X = 中文起点 - 数字宽度 - 10向左偏<E5B7A6>?0像素紧贴文字
uint16_t num_x = chinese_start_x - num_w - 5;
// 绘制序号
LCD_ShowString(num_x, text_y + 3 , (const uint8_t *)NumBuf, UI->Text_fc, UI->Text_bc, UI->Text_size, 1);
switch(Group->Id)
{
case GUI_TIMBRE_SELECT:
{
uint8_t AllNoteOff_buff[3] = {0xB0,0x7B,0x00};
SendMidiDataToDreamDSP(AllNoteOff_buff,sizeof(AllNoteOff_buff));
SendProgramChangeMidiEvent(0,Timbre_index[Group->Current]);
}
break;
default:
break;
}
}
void Refresh_ModeSelect(uint8_t last_data, const LEBEL_UI *UI, GUI_SWITCH *Group)
{
Draw_Tab_Mode_Menu(UI,Group);
}
void Refresh_Mode1Select(uint8_t last_data, LEBEL_UI *UI, GUI_SWITCH *Group)
{
char Textstr1[20] = {0};
char Textstr2[20] = {0};
GUI_SWITCH *pCurData =NULL;
// 重点<EFBC9A>?当前选中的模式2/3/4找到<E689BE>?<3F>应数据结构<E7BB93>?
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: pCurData = &ParamGuiData[SONG_MODE_PARAM]; break; // 歌曲
case 1: pCurData = &ParamGuiData[EXPRESS_MODE_PARAM]; break; // 专家
case 2: pCurData = &ParamGuiData[ALL_MODE_PARAM]; break; // 万能
//default: pCurData = &mGuiData[GUI_MODE1_SELECT];
}
// 清除旧数字(清除的是旧值,不是当前值)
GET_ParamNum_Str(last_data, 0, Textstr1, pCurData->Id);
LCD_ClearString_AutoAlign(
UI->x, UI->x + UI->w,
UI->y + 25,
(const uint8_t*)Textstr1,
UI->Text_Align,
UI->Text_fc,
UI->Text_bc,
0, UI->Text_size
);
// 显示当前选中模式的真实数<E5AE9E>?
GET_ParamNum_Str(pCurData->Current, 0, Textstr2, pCurData->Id);
LCD_ShowString_AutoAlign(
UI->x, UI->x + UI->w,
UI->y + 25,
(const uint8_t*)Textstr2,
UI->Text_Align,
UI->Text_fc,
UI->Text_bc,
0, UI->Text_size
);
}
void label_Tranzpose_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
uint8_t Textstr[20] = {0};
uint16_t c_top, c_bot;
uint16_t chev_cy = UI->y + UI->h - 12; /* < > 纵向中心 */
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x,
UI->y,
UI->w,
UI->h,
10,
c_top,
c_bot
);
LCD_ShowChinese_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y+5,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
c_top,
c_bot,
UI->Tab_size
);
LCD_DrawChevron_Left(UI->x + 18, chev_cy, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 18, chev_cy, 7, 2, WHITE);
GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id);
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 17,
Textstr,
UI->Text_Align,
UI->Text_fc,
c_top,
c_bot,
UI->Text_size
);
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 17+21,
(const uint8_t*)"KEY",
UI->Text_Align,
UI->Text_fc,
c_top,
c_bot,
12
);
}
void label_Speed_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
uint8_t Textstr[20] = {0};
uint16_t c_top, c_bot;
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x,
UI->y,
UI->w,
UI->h,
10,
c_top, c_bot
);
LCD_ShowChinese_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y+5,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
c_top,
c_bot,
UI->Tab_size
);
LCD_WR_PIC_FROM_FLASH_Trans(UI->x + 5, UI->y + UI->h - 22,
UI0902_BTN_MINUS_GRAY_W, UI0902_BTN_MINUS_GRAY_H,
UI0902_BTN_MINUS_GRAY_ADDR);
LCD_WR_PIC_FROM_FLASH_Trans(UI->x + UI->w - 5 - UI0902_BTN_PLUS_GRAY_W,
UI->y + UI->h - 22,
UI0902_BTN_PLUS_GRAY_W, UI0902_BTN_PLUS_GRAY_H,
UI0902_BTN_PLUS_GRAY_ADDR);
GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id);
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 17,
Textstr,
UI->Text_Align,
UI->Text_fc,
c_top,
c_bot,
UI->Text_size
);
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 17+21,
(const uint8_t*)"BPM",
UI->Text_Align,
UI->Text_fc,
c_top,
c_bot,
12
);
}
// <20>޸<EFBFBD><DEB8>棺ȥ<E6A3BA><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>autobandֵ<64><D6B5>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ʾ
void label_ModeSelece_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
char *str;
GUI_SWITCH *paramCurData = NULL;
uint16_t c_top, c_bot;
UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot);
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: paramCurData = &ParamGuiData[SONG_MODE_PARAM]; break;
case 1: paramCurData = &ParamGuiData[EXPRESS_MODE_PARAM]; break;
case 2: paramCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
LCD_FillRoundRectGradient(UI->x, UI->y+20+5, UI->w, UI->h-20, 10, c_top, c_bot);
switch(mGuiData[GUI_TAB_INDEX].Current) {
case 0:case 1:
Draw_Tab_Mode_Menu(UI, &mGuiData[GUI_AUTOBAND_SW]);
break;
case 2:
str = (char*)"\xBA\xCD\xCF\xD2\xD7\xDF\xCF\xF2";
LCD_ShowChinese_AutoAlign(
UI->x, UI->x+UI->w, UI->y+5+5,
(uint8_t *)str, UI->Tab_Align, UI->Tab_fc, BLACK, 0, UI->Tab_size
);
break;
}
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: case 1:
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
paramCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
}else
{
paramCurData = &ParamGuiData[SONG_MODE_PARAM];
}
break;
case 2: paramCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
show_Param(&UI_Label[GUI_MODE_PARAM], paramCurData);
LCD_DrawChevron_Left(UI->x + 15, UI->y + 40, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 15, UI->y + 40, 7, 2, WHITE);
}
void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group)
{
uint8_t Textstr[20] = {0};
char NumBuf[8] = {0};
uint16_t text_y = UI->y + 25;
uint8_t idx = mGuiData[UI->Id].Current + 1;
uint16_t c_top, c_bot;
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x,
UI->y+20,
UI->w,
UI->h-20,
10,
c_top, c_bot
);
LCD_ShowChinese_AutoAlign(
UI->x,
UI->x+UI->w,
UI->y+5,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
BLACK,
0,
UI->Tab_size
);
LCD_DrawChevron_Left(UI->x + 15, UI->y + 35, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 15, UI->y + 35, 7, 2, WHITE);
LCD_FillRoundRectGradient(
UI->x + 40,
UI->y+20,
UI->x + UI->w - 40 - UI->x - 40 ,
UI->h-20,
0,
c_top, c_bot
);
sprintf(NumBuf, "%d.", idx);
uint16_t num_w = (strlen(NumBuf)) * (UI->Text_size / 2);
GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id);
uint32_t chinese_start_x = LCD_ShowChinese_AutoAlign_Gradient(
UI->x + num_w,
UI->x + UI->w,
text_y+3,
(const uint8_t*)Textstr,
UI->Text_Align,
UI->Text_fc,
c_top, c_bot,
UI->Text_size
);
uint16_t num_x = chinese_start_x - num_w - 5;
LCD_ShowString_AutoAlign_Gradient(num_x, num_x + num_w, text_y+3,
(const uint8_t *)NumBuf, LCD_ALIGN_LEFT, UI->Text_fc,
c_top, c_bot, UI->Text_size);
switch(Group->Id)
{
case GUI_TIMBRE_SELECT:
SendProgramChangeMidiEvent(0,Timbre_index[Group->Current]);
break;
default:
break;
}
}
void label_PlaySection_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
// 显示<E698BE>?<3F>?
LCD_ShowChinese_AutoAlign(
UI->x, // 坐标<E59D90>?
UI->x+UI->w,
UI->y+5,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
UI->Tab_bc,
0,
UI->Tab_size
);
Draw_Tab_Section_Menu(UI,(TAB_SECTION_INDEX)Group->Current);
}
void Draw_Bottom_Bar(uint8_t sel, uint8_t first_back)
{
const uint8_t *icon0;
const uint8_t *icon1;
const uint8_t *icon2;
uint8_t w0, w1, w2, h0, h1, h2;
LCD_FillByColor(0, 275, 240, 320, UI0902_BG_COLOR);
if (first_back) { icon0 = gImage_UI0902_TabBack_Not_18x28; w0 = 18; h0 = 28; }
else if (sel == 0) { icon0 = gImage_UI0902_TabSetting_Sel_36x28; w0 = 36; h0 = 28; }
else { icon0 = gImage_UI0902_TabSetting_Not_35x28; w0 = 35; h0 = 28; }
if (sel == 1) { icon1 = gImage_UI0902_TabMixer_Sel_35x27; w1 = 35; h1 = 27; }
else { icon1 = gImage_UI0902_TabMixer_Not_35x28; w1 = 35; h1 = 28; }
if (sel == 2) { icon2 = gImage_UI0902_TabMode_Sel_36x28; w2 = 36; h2 = 28; }
else { icon2 = gImage_UI0902_TabMode_Not_35x29; w2 = 35; h2 = 29; }
LCD_WR_PIC_Trans(40 - w0 / 2, 283, w0, h0, icon0, BLACK);
LCD_WR_PIC_Trans(120 - w1 / 2, 283, w1, h1, icon1, BLACK);
LCD_WR_PIC_Trans(200 - w2 / 2, 283, w2, h2, icon2, BLACK);
}
void label_Tab_Select_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
(void)UI;
(void)Group;
Draw_Bottom_Bar(UI0902_NAV_NONE, 0);
}
void Draw_Tab_Section_Menu(const LEBEL_UI *UI, TAB_SECTION_INDEX select_tab)
{
const uint16_t tab_w = 47;
const uint16_t tab_h = 34;
const uint8_t tab_r = 5;
const uint8_t pitch = 57;
const uint16_t start_x = 12;
const uint16_t start_y = UI->y + 19;
const uint16_t text_y = start_y + 11;
const char *nums[4] = {"1", "2", "3", "4"};
uint8_t i;
for (i = 0; i < 4; i++)
{
uint16_t x = start_x + i * pitch;
uint16_t bg = (select_tab == i) ? COLOR_GRAD_MID : COLOR_NORMAL_BG;
LCD_FillRoundRect(x, start_y, tab_w, tab_h, tab_r, bg);
LCD_ShowString_AutoAlign(
x, x + tab_w, text_y,
(const uint8_t*)nums[i],
UI->Text_Align,
WHITE,
bg,
0,
12
);
}
}
void GET_ParamNum_Str(int16_t NUM, uint8_t ValidLen, char* Str, uint8_t hasSign)
{
// int16_t Value;
switch(hasSign)
{
case 0:
switch(NUM)
{
case 0: strcpy(Str,"\xBC\xAA\xCB\xFB\xBE\xAD\xB5\xE4\xB7\xD6\xBD\xE2 4-4\0"); break; // 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>4-4
case 1: strcpy(Str,"\xBC\xAA\xCB\xFB\xBE\xAD\xB5\xE4\xC9\xA8\xCF\xD2 4-4\0"); break; // 01 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>4-4
case 2: strcpy(Str,"\xB8\xB4\xB9\xC5\xBC\xAA\xCB\xFB\xC1\xF7\xD0\xD0 4-4\0"); break; // 02 <20><><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 3: strcpy(Str,"\xC1\xF7\xD0\xD0\xD2\xA1\xB9\xF6 4-4\0"); break; // 03 <20><><EFBFBD><EFBFBD>ҡ<EFBFBD><D2A1>4-4
case 4: strcpy(Str,"\xBE\xAD\xB5\xE4\xC7\xE9\xB8\xE8 4-4\0"); break; // 04 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 5: strcpy(Str,"\xC1\xB5\xC8\xCB\xC7\xE9\xB8\xE8 2-4\0"); break; // 05 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2-4
case 6: strcpy(Str,"\xCC\xF0\xC3\xDB\xC7\xE9\xB8\xE8 4-4\0"); break; // 06 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 7: strcpy(Str,"\xCE\xC2\xC7\xE9 8 \xC5\xC4 4-4\0"); break; // 07 <20><><EFBFBD><EFBFBD>8<EFBFBD><38>4-4
case 8: strcpy(Str,"\xCE\xC2\xC8\xE1 8 \xC5\xC4 4-4\0"); break; // 08 <20><><EFBFBD><EFBFBD>8<EFBFBD><38>4-4
case 9: strcpy(Str,"\xCF\xA6\xD1\xF4\xC1\xF7\xD0\xD0 4-4\0"); break; // 09 Ϧ<><CFA6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 10: strcpy(Str,"\xCE\xF7\xB7\xBD\xCA\xEF\xB9\xE2 4-4\0"); break; // 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 11: strcpy(Str,"\xCE\xC2\xDC\xB0\xC3\xF1\xD2\xA5 4-4\0"); break; // 11 <20><>ܰ<EFBFBD><DCB0>ҥ4-4
case 12: strcpy(Str,"\xD6\xD0\xCB\xD9\xD2\xA1\xB9\xF6 4-4\0"); break; // 12 <20><><EFBFBD><EFBFBD>ҡ<EFBFBD><D2A1>4-4
case 13: strcpy(Str,"\xD6\xD0\xCB\xD9\xC7\xE9\xB8\xE8 4-4\0"); break; // 13 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 14: strcpy(Str,"\xCC\xF0\xC3\xC0 8 \xC5\xC4 4-4\0"); break; // 14 <20><><EFBFBD><EFBFBD>8<EFBFBD><38>4-4
case 15: strcpy(Str,"\xC0\xD6\xB6\xD3 8 \xC5\xC4 4-4\0"); break; // 15 <20>ֶ<EFBFBD>8<EFBFBD><38>4-4
case 16: strcpy(Str,"8 \xC5\xC4\xBB\xB3\xBE\xC9 4-4\0"); break; // 16 8<>Ļ<EFBFBD><C4BB><EFBFBD>4-4
case 17: strcpy(Str,"\xCF\xC4\xC8\xD5\xB2\xA8\xC8\xF8 4-4\0"); break; // 17 <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>4-4
case 18: strcpy(Str,"\xB7\xC5\xBF\xCB\xC2\xC9\xB6\xAF 4-4\0"); break; // 18 <20>ſ<EFBFBD><C5BF>ɶ<EFBFBD>4-4
case 19: strcpy(Str,"\xB4\xF2\xB0\xF1\xD2\xA1\xB9\xF6\xC0\xD6 4-4\0"); break; // 19 <20><><EFBFBD>ҡ<EFBFBD><D2A1><EFBFBD><EFBFBD>4-4
case 20: strcpy(Str,"\xC1\xF7\xD0\xD0\xD6\xD0\xCB\xD9\xB5\xAF\xB3\xAA 4-4\0"); break; // 20 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD>4-4
case 21: strcpy(Str,"\xC8\xF8\xBF\xCB\xCB\xB9 8 \xC5\xC4 4-4\0"); break; // 21 <20><><EFBFBD><EFBFBD>˹8<CBB9><38>4-4
case 22: strcpy(Str,"\xB8\xD6\xC7\xD9\xC2\xC9\xB6\xAF 4-4\0"); break; // 22 <20><><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>4-4
case 23: strcpy(Str,"\xBF\xE1\xEC\xC5\xD0\xF0\xCA\xC2\xC7\xFA 4-4\0"); break; // 23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 24: strcpy(Str,"\xBF\xEC\xC0\xD6\xC7\xA1\xC7\xA1 4-4\0"); break; // 24 <20><><EFBFBD><EFBFBD>ǡǡ4-4
case 25: strcpy(Str,"16 \xC5\xC4\xC7\xE9\xB8\xE8 4-4\0"); break; // 25 16<31><36><EFBFBD><EFBFBD><EFBFBD>4-4
case 26: strcpy(Str,"\xB1\xEA\xD7\xBC\xD0\xF0\xCA\xC2\xC7\xFA 6-8\0"); break; // 26 <20><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6-8
case 27: strcpy(Str,"\xCC\xA8\xCD\xE5\xC1\xF7\xD0\xD0\xC0\xD6 4-4\0"); break; // 27 ̨<><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
case 28: strcpy(Str,"\xB5\xE7\xD3\xB0\xD0\xF0\xCA\xC2 6-8\0"); break; // 28 <20><>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>6-8
case 29: strcpy(Str,"\xCA\xA5\xB5\xAE\xD6\xAE\xD2\xB9 3-4\0"); break; // 29 ʥ<><CAA5>֮ҹ3-4
case 30: strcpy(Str,"\xBC\xAA\xCB\xFB\xB3\xAA\xD7\xF7\xD5\xDF 4-4\0"); break; // 30 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4-4
}
return;
break;
case 1:
sprintf(Str, "%d", NUM);
return;
break;
case 2:
switch(NUM)
{
case 0: memcpy(Str,"1645", 4); break;
case 1: memcpy(Str,"1564", 4); break;
case 2: memcpy(Str,"1364", 4); break;
}
return;
break;
}
}
void GET_Num_Str(int16_t NUM, uint8_t ValidLen, char* Str, uint8_t hasSign)
{
switch(hasSign)
{
case 0:
switch(NUM)
{
case 0: memcpy(Str,"C\0", 2); break;
case 1: memcpy(Str,"Db\0",3); break;
case 2: memcpy(Str,"D\0", 2); break;
case 3: memcpy(Str,"Eb\0",3); break;
case 4: memcpy(Str,"E\0", 2); break;
case 5: memcpy(Str,"F\0", 2); break;
case 6: memcpy(Str,"Gb\0",3); break;
case 7: memcpy(Str,"G\0", 2); break;
case 8: memcpy(Str,"Ab\0",3); break;
case 9: memcpy(Str,"A\0", 2); break;
case 10: memcpy(Str,"Bb\0",3); break;
case 11: memcpy(Str,"B\0", 2); break;
}
return;
break;
case 1:
sprintf(Str, "%d", NUM);
return;
break;
case 3:
switch(NUM)
{
case 0: memcpy(Str,"\xD2\xF4\xC0\xD6\xBB\xE1\xB8\xD6\xCF\xD2\xBC\xAA\xCB\xFB\x00", 15); break; // 01 音乐会钢弦吉<E5BCA6>?
case 1: memcpy(Str,"\xBE\xAD\xB5\xE4\xB8\xD6\xCF\xD2\xBC\xAA\xCB\xFB\x00", 13); break; // 02 经典钢弦吉他
case 2: memcpy(Str,"\xBE\xAD\xB5\xE4\xC7\xE5\xD2\xF4\xBC\xAA\xCB\xFB\x00", 13); break; // 03 经典轻音吉他
case 3: memcpy(Str,"\xB8\xB4\xB9\xC5\xCA\xA7\xD5\xE6\xB5\xE7\xBC\xAA\xCB\xFB\x00",15); break; // 04 复古失真电吉<E794B5>?
case 4: memcpy(Str,"\xB5\xE7\xB1\xB4\xCB\xBE\x00", 7); break; // 05 电贝<E794B5>?
}
return;
break;
case 5:
sprintf(Str, "%d", NUM);
return;
break;
case 6:
sprintf(Str, "%d", NUM);
return;
break;
case 7:
sprintf(Str, "%d", NUM);
return;
break;
}
}
void RefreshSystemSetting(uint8_t last_data,const LEBEL_UI *UI,GUI_SWITCH * Group)
{
Draw_System_Item_List(UI,Group);
}
void RestoreSetting()
{
uint8_t new_trans;
NvmParam_Type * nvm = drv_nvm_param_ptr();
//last_value = mGuiData[GUI_TRANSPOSE].Current;
mGuiData[GUI_TRANSPOSE].Current = 0;
new_trans = mGuiData[GUI_TRANSPOSE].Current;
if(nvm->param.Transpose != mGuiData[GUI_TRANSPOSE].Current)
{
nvm->param.Transpose = mGuiData[GUI_TRANSPOSE].Current;
}
// delta = new_trans - last_value;
// USE_MIDI.Midi_1 += delta;
// USE_MIDI.Midi_2 += delta;
// USE_MIDI.Midi_3 += delta;
// USE_MIDI.Midi_4 += delta;
// USE_MIDI.Midi_5 += delta;
// USE_MIDI.Midi_6 += delta;
// mGuiData[GUI_SPEED].Current = 78;
// AutoBandTop1_ChangeBPM(mGuiData[GUI_SPEED].Current);
if(nvm->param.BPM != mGuiData[GUI_SPEED].Current)
{
nvm->param.BPM = mGuiData[GUI_SPEED].Current;
}
mGuiData[GUI_TIMBRE_SELECT].Current = 0;
SendProgramChangeMidiEvent(0,Timbre_index[mGuiData[GUI_TIMBRE_SELECT].Current]);
if(nvm->param.Timbre != mGuiData[GUI_TIMBRE_SELECT].Current)
{
nvm->param.Timbre = mGuiData[GUI_TIMBRE_SELECT].Current;
}
mGuiData[GUI_PLAY_SECTION].Current = 0;
//AutoBandTop1_SetRunVar(mGuiData[GUI_PLAY_SECTION].Current);
ParamGuiData[SONG_MODE_PARAM].Current = 0;
ParamGuiData[EXPRESS_MODE_PARAM].Current = 0;
ParamGuiData[ALL_MODE_PARAM].Current = 0;
faders[0].val = 7;
uint8_t val_127 = (faders[0].val * 127) / 10;
SendVolumeChangeMidiEvent(1,val_127);
SendVolumeChangeMidiEvent(2,val_127);
SendVolumeChangeMidiEvent(3,val_127);
SendVolumeChangeMidiEvent(4,val_127);
SendVolumeChangeMidiEvent(5,val_127);
SendVolumeChangeMidiEvent(6,val_127);
SendVolumeChangeMidiEvent(7,val_127);
SendVolumeChangeMidiEvent(8,val_127);
SendVolumeChangeMidiEvent(9,val_127);
SendVolumeChangeMidiEvent(10,val_127);
SendVolumeChangeMidiEvent(11,val_127);
SendVolumeChangeMidiEvent(12,val_127);
SendVolumeChangeMidiEvent(13,val_127);
SendVolumeChangeMidiEvent(14,val_127);
SendVolumeChangeMidiEvent(15,val_127);
faders[1].val = 7;
uint8_t Str_val_127 = (faders[1].val * 127) / 10;
SendVolumeChangeMidiEvent(0,Str_val_127);
faders[2].val = 7;
AW816_Set_Volume(MIC_VOL_MAP[faders[2].val]);
faders[3].val = 7;
AW816_Set_Reverb(faders[3].val * 10);
mGuiData_SystemSETTING[GUI_BLUETOOTH_SW].Current = 1;
mGuiData[GUI_BL_SW].Current = 1;
BSP_BlueToothPowerEnable (mGuiData_SystemSETTING[GUI_BLUETOOTH_SW].Current);
mGuiData_SystemSETTING[GUI_AUTOCLOSE].Current = 1;
}
void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group)
{
NvmParam_Type * nvm = drv_nvm_param_ptr();
char Info[40];
uint16_t c_top, c_bot;
uint16_t text_y = UI->y + 10;
uint16_t val_x1 = UI->x + 120;
uint16_t val_x2 = UI->x + 190;
if (UI_IsFocused(Group->Id))
{
c_top = START_COLOR;
c_bot = END_COLOR;
LCD_FillRoundRectGradient(UI->x, UI->y, 214, UI->h, 8, c_top, c_bot);
}
else
{
c_top = c_bot = UI0902_ROW_BG;
LCD_FillRoundRect(UI->x, UI->y, 214, UI->h, 8, UI0902_ROW_BG);
}
/* 行标签MiSans 13 */
LCD_ShowChinese_AutoAlign_Gradient(UI->x+49, UI->x+214, text_y, UI->p, LCD_ALIGN_LEFT, WHITE, c_top, c_bot, 13);
switch(Group->Id)
{
case GUI_VERSION:
LCD_WR_PIC_FROM_FLASH_Trans(UI->x+12, UI->y+7, 19, 18, UI0902_ICON_SYS_VERSION_ADDR);
sprintf (Info, "%d.%d.%d", Version[0], Version[1],Version[2]);
LCD_ShowString_AutoAlign_Gradient(val_x1, val_x2, text_y+1,(const uint8_t*)Info,LCD_ALIGN_RIGHT, GRAY,c_top, c_bot,11);
break;
case GUI_BLUETOOTH_SW:
LCD_WR_PIC_FROM_FLASH_Trans(UI->x+7, UI->y, 34, 33, UI0902_ICON_SET_BLUETOOTH_ADDR);
if(Group->Current)
{
LCD_ShowChinese_AutoAlign_Gradient(val_x1, val_x2, text_y+1,(const uint8_t*)"\xBF\xAA",LCD_ALIGN_RIGHT, GRAY,c_top, c_bot,11);
}else
{
LCD_ShowChinese_AutoAlign_Gradient(val_x1, val_x2, text_y+1,(const uint8_t*)"\xB9\xD8",LCD_ALIGN_RIGHT, GRAY,c_top, c_bot,11);
}
BSP_BlueToothPowerEnable (Group->Current);
mGuiData[GUI_BL_SW].Current = Group->Current;
break;
case GUI_AUTOCLOSE:
LCD_WR_PIC_FROM_FLASH_Trans(UI->x+7, UI->y, 33, 34, UI0902_ICON_SET_GEAR_ADDR);
switch(Group->Current)
{
case 0:AutoCloseTime = 5;mAutoPowerOffCount = AutoCloseTime * 60;break;
case 1:AutoCloseTime = 15;mAutoPowerOffCount = AutoCloseTime * 60;break;
case 2:AutoCloseTime = 30;mAutoPowerOffCount = AutoCloseTime * 60;break;
case 3:AutoCloseTime = 0;AutoCloseFlag = 0;break; //never
}
if(Group->Current != 3)
{
sprintf (Info, "%d",AutoCloseTime);
LCD_ShowString_AutoAlign_Gradient(val_x1, val_x2-28, text_y+1, (const uint8_t*)Info, LCD_ALIGN_RIGHT, GRAY, c_top, c_bot, 11);
LCD_ShowChinese_AutoAlign_Gradient(val_x2-26, val_x2, text_y+1, (const uint8_t*)"\xB7\xD6\xD6\xD3", LCD_ALIGN_RIGHT, GRAY, c_top, c_bot, 11);
}else
{
LCD_ShowChinese_AutoAlign_Gradient(val_x1, val_x2, text_y+1,(uint8_t*)"\xB9\xD8",LCD_ALIGN_RIGHT, GRAY, c_top, c_bot, 11);
}
nvm->param.AutoCloseTime = Group->Current;
drv_nvm_save_to_flash();
break;
case GUI_RESTORE:
LCD_WR_PIC_FROM_FLASH_Trans(UI->x+13, UI->y+6, 13, 21, UI0902_ICON_SYS_RESTORE_ADDR);
break;
default: break;
}
/* 右侧箭头 */
LCD_WR_PIC_FROM_FLASH_Trans(UI->x+197, UI->y+8, 10, 18, UI0902_ICON_CHEVRON_ADDR);
}