Files
Power-Pico/Power_Pico/User/GUI/screens/ui_SetPage.c
2025-12-05 20:16:08 +08:00

437 lines
18 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.
// This file was generated by SquareLine Studio
// SquareLine Studio version: SquareLine Studio 1.5.3
// LVGL version: 9.2.2
// Project name: PowerPico
#include "../ui.h"
#include "./ui_PPSPage.h"
lv_obj_t * ui_SetPage = NULL;
// backlight
static lv_obj_t * ui_PanelBL = NULL;
static lv_obj_t * ui_SliderBL = NULL;
static lv_obj_t * ui_LabelBL = NULL;
// key sound
static lv_obj_t * ui_PanelKS = NULL;
static lv_obj_t * ui_SwitchKS = NULL;
static lv_obj_t * ui_LabelKS = NULL;
// language
static lv_obj_t * ui_PanelLang = NULL;
static lv_obj_t * ui_SwitchLang = NULL;
static lv_obj_t * ui_LabelLang = NULL;
// chose rotation
static lv_obj_t * ui_PanelRotate = NULL;
static lv_obj_t * ui_LabelRotation = NULL;
static lv_obj_t * ui_LabelRotNum = NULL;
// enable PPS, goto PPS page
static lv_obj_t * ui_PanelPPS = NULL;
static lv_obj_t * ui_SwitchPPS = NULL;
static lv_obj_t * ui_LabelPPS = NULL;
// about
static lv_obj_t * ui_PanelAbout = NULL;
static lv_obj_t * ui_LabelAbout = NULL;
static lv_timer_t * _setting_timer = NULL;
static lv_obj_t * msgbox = NULL; // msgbox 对象
static lv_obj_t * spinner = NULL; // spinner 对象
static bool waiting_for_signal = false; // 标志位,表示是否在等待信号
static lv_obj_t * panels[6]; // 存储所有 panel 的指针
static int current_panel_index = 0; // 当前选中的 panel 索引
static void show_msgbox(void);
static void hide_msgbox(void);
// event funtions
// comunicate with PD UFP Task
#include "user_PDUFPTask.h"
/////////////////////// Timer //////////////////////
static void _setting_timer_cb(lv_timer_t * timer) {
PD_handle_event_t pd_handle_event;
// 非阻塞获取消息
if(osMessageQueueGet(PD_handle_event_MsgQueue, &pd_handle_event, NULL, 0)==osOK) {
if(pd_handle_event == PD_EVT_PPS_READY) {
// 隐藏等待框
hide_msgbox();
lv_lib_pm_goto("PPS Page", NULL);
} else if(pd_handle_event == PD_EVT_PPS_FAILED) {
// 隐藏等待框
hide_msgbox();
}
}
}
///////////////// outer function ///////////////////
static void _send_pps_start_msg(void) {
PD_command_msg_t pd_ui_msg;
pd_ui_msg.event = PD_CMD_START;
osMessageQueuePut(PD_cmd_MessageQueue, &pd_ui_msg, 0, 1);
}
#include "key.h"
void ui_set_page_key_handler(void *key_event)
{
if(waiting_for_signal) return;
int panel_count = sizeof(panels) / sizeof(panels[0]);
// key boot
if (((key_event_t*)key_event)->id == KEY_ID_B && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
lv_lib_pm_goto_first();
}
// key left
if (((key_event_t*)key_event)->id == KEY_ID_L && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
lv_obj_clear_state(panels[current_panel_index], LV_STATE_CHECKED);
current_panel_index = (current_panel_index - 1 + panel_count) % panel_count;
lv_obj_add_state(panels[current_panel_index], LV_STATE_CHECKED);
lv_obj_scroll_to_view(panels[current_panel_index], LV_ANIM_ON);
}
// key right
else if (((key_event_t*)key_event)->id == KEY_ID_R && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
lv_obj_clear_state(panels[current_panel_index], LV_STATE_CHECKED);
current_panel_index = (current_panel_index + 1) % panel_count;
lv_obj_add_state(panels[current_panel_index], LV_STATE_CHECKED);
lv_obj_scroll_to_view(panels[current_panel_index], LV_ANIM_ON);
}
// key yes or key neg
else if(((key_event_t*)key_event)->id == KEY_ID_Y || ((key_event_t*)key_event)->id == KEY_ID_N)
{
switch(current_panel_index)
{
// Screen Brightness
case 0:
if (((key_event_t*)key_event)->id == KEY_ID_Y &&
(((key_event_t*)key_event)->type == KEY_EVT_CLICK || ((key_event_t*)key_event)->type == KEY_EVT_REPEAT)) { // key yes
int16_t slider_value = lv_slider_get_value(ui_SliderBL);
slider_value += 10;
if(slider_value > 100) slider_value = 100;
lv_slider_set_value(ui_SliderBL, slider_value, LV_ANIM_ON);
ui_set_back_light_level(slider_value);
} else if (((key_event_t*)key_event)->id == KEY_ID_N &&
(((key_event_t*)key_event)->type == KEY_EVT_CLICK || ((key_event_t*)key_event)->type == KEY_EVT_REPEAT)) { // key neg
int16_t slider_value = lv_slider_get_value(ui_SliderBL);
slider_value -= 10;
if(slider_value < 10) slider_value = 10;
lv_slider_set_value(ui_SliderBL, slider_value, LV_ANIM_ON);
ui_set_back_light_level(slider_value);
}
break;
// key sound
case 1:
// key yes
if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
lv_obj_add_state(ui_SwitchKS, LV_STATE_CHECKED);
ui_set_key_sound_enable(1);
}
// key neg
else if (((key_event_t*)key_event)->id == KEY_ID_N && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
lv_obj_clear_state(ui_SwitchKS, LV_STATE_CHECKED);
ui_set_key_sound_enable(0);
}
break;
// language
case 2:
// do nothing
break;
// chose rotation
case 3:
uint16_t rotation = ui_get_display_rotation();
// key yes
if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
rotation = (rotation + 360 + 90) % 360;
}
// key neg
else if (((key_event_t*)key_event)->id == KEY_ID_N && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
rotation = (rotation + 360 - 90) % 360;
}
if (rotation == 0) {
lv_label_set_text(ui_LabelRotNum, "< 0 >");
} else if (rotation == 90) {
lv_label_set_text(ui_LabelRotNum, "< 90 >");
} else if (rotation == 180) {
lv_label_set_text(ui_LabelRotNum, "< 180 >");
} else if (rotation == 270) {
lv_label_set_text(ui_LabelRotNum, "< 270 >");
}
ui_set_display_rotation(rotation);
ui_full_screen_refresh(ui_SetPage);
break;
// PPS page
case 4:
// 发送开启PD诱骗的信号
if (((key_event_t*)key_event)->id == KEY_ID_Y && ((key_event_t*)key_event)->type == KEY_EVT_CLICK)
{
// 发送pps开始信号到PD UFP Task
_send_pps_start_msg();
// 弹出 msgbox 等待PD完成并锁住按键操作
show_msgbox();
// lv_lib_pm_goto("PPS Page", NULL);
}
break;
// about
case 5:
// do nothing
break;
}
// save settings to eeprom
ui_system_settings_save();
}
}
/////////////////////// para_initialize //////////////////////
static void on_setpage_loaded(lv_event_t * e) {
// 当 SetPage 页面加载完成后,滚动到当前选中的 panel
lv_obj_scroll_to_view(panels[current_panel_index], LV_ANIM_ON);
}
static void _setting_init(void) {
// backlight
lv_slider_set_value(ui_SliderBL, ui_get_back_light_level(), LV_ANIM_OFF);
// key sound
if(ui_get_key_sound_enable())
lv_obj_add_state(ui_SwitchKS, LV_STATE_CHECKED);
else
lv_obj_clear_state(ui_SwitchKS, LV_STATE_CHECKED);
// lcd rotation
uint16_t rotation = ui_get_display_rotation();
if (rotation == 0) {
lv_label_set_text(ui_LabelRotNum, "< 0 >");
} else if (rotation == 90) {
lv_label_set_text(ui_LabelRotNum, "< 90 >");
} else if (rotation == 180) {
lv_label_set_text(ui_LabelRotNum, "< 180 >");
} else if (rotation == 270) {
lv_label_set_text(ui_LabelRotNum, "< 270 >");
}
}
/////////////////////// ui_initialize //////////////////////
// 显示 msgbox
static void show_msgbox(void) {
// 获取当前视角y pos
int32_t view_y = lv_obj_get_scroll_top(ui_SetPage);
// 创建 msgbox
msgbox = lv_obj_create(ui_SetPage);
lv_obj_set_size(msgbox, 200, 160);
lv_obj_center(msgbox);
lv_obj_set_pos(msgbox, 0, view_y);
lv_obj_set_style_bg_color(msgbox, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(msgbox, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
// 添加 spinner
spinner = lv_spinner_create(msgbox);
lv_obj_set_size(spinner, 60, 60);
lv_obj_center(spinner);
// 添加文本
lv_obj_t * label = lv_label_create(msgbox);
lv_label_set_text(label, "Waiting for PD...");
lv_obj_set_align(label, LV_ALIGN_BOTTOM_MID);
lv_obj_set_style_text_font(label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT);
// 设置标志位
waiting_for_signal = true;
}
// 隐藏 msgbox
static void hide_msgbox(void) {
if (msgbox) {
lv_obj_del(msgbox);
msgbox = NULL;
spinner = NULL;
}
waiting_for_signal = false;
}
// build funtions
void ui_SetPage_screen_init(void)
{
ui_SetPage = lv_obj_create(NULL);
ui_PanelBL = lv_obj_create(ui_SetPage);
lv_obj_set_width(ui_PanelBL, 234);
lv_obj_set_height(ui_PanelBL, 65);
lv_obj_set_x(ui_PanelBL, 0);
lv_obj_set_y(ui_PanelBL, 5);
lv_obj_set_align(ui_PanelBL, LV_ALIGN_TOP_MID);
lv_obj_add_flag(ui_PanelBL, LV_OBJ_FLAG_CHECKABLE); /// Flags
lv_obj_remove_flag(ui_PanelBL, LV_OBJ_FLAG_SCROLLABLE); /// Flags
lv_obj_set_style_bg_color(ui_PanelBL, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED);
lv_obj_set_style_bg_opa(ui_PanelBL, 255, LV_PART_MAIN | LV_STATE_CHECKED);
ui_SliderBL = lv_slider_create(ui_PanelBL);
lv_slider_set_value(ui_SliderBL, 50, LV_ANIM_OFF);
if(lv_slider_get_mode(ui_SliderBL) == LV_SLIDER_MODE_RANGE) lv_slider_set_left_value(ui_SliderBL, 0, LV_ANIM_OFF);
lv_obj_set_width(ui_SliderBL, 200);
lv_obj_set_height(ui_SliderBL, 10);
lv_obj_set_align(ui_SliderBL, LV_ALIGN_BOTTOM_MID);
//Compensating for LVGL9.1 draw crash with bar/slider max value when top-padding is nonzero and right-padding is 0
if(lv_obj_get_style_pad_top(ui_SliderBL, LV_PART_MAIN) > 0) lv_obj_set_style_pad_right(ui_SliderBL,
lv_obj_get_style_pad_right(ui_SliderBL, LV_PART_MAIN) + 1, LV_PART_MAIN);
ui_LabelBL = lv_label_create(ui_PanelBL);
lv_obj_set_width(ui_LabelBL, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelBL, LV_SIZE_CONTENT); /// 1
lv_obj_set_x(ui_LabelBL, 0);
lv_obj_set_y(ui_LabelBL, -5);
lv_label_set_text(ui_LabelBL, "Screen Brightness :");
lv_obj_set_style_text_font(ui_LabelBL, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_PanelKS = lv_obj_create(ui_SetPage);
lv_obj_set_width(ui_PanelKS, 234);
lv_obj_set_height(ui_PanelKS, 45);
lv_obj_set_x(ui_PanelKS, 0);
lv_obj_set_y(ui_PanelKS, 75);
lv_obj_set_align(ui_PanelKS, LV_ALIGN_TOP_MID);
lv_obj_add_flag(ui_PanelKS, LV_OBJ_FLAG_CHECKABLE); /// Flags
lv_obj_remove_flag(ui_PanelKS, LV_OBJ_FLAG_SCROLLABLE); /// Flags
lv_obj_set_style_bg_color(ui_PanelKS, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED);
lv_obj_set_style_bg_opa(ui_PanelKS, 255, LV_PART_MAIN | LV_STATE_CHECKED);
ui_SwitchKS = lv_switch_create(ui_PanelKS);
lv_obj_set_width(ui_SwitchKS, 50);
lv_obj_set_height(ui_SwitchKS, 25);
lv_obj_set_align(ui_SwitchKS, LV_ALIGN_RIGHT_MID);
lv_obj_add_state(ui_SwitchKS, LV_STATE_CHECKED); /// States
ui_LabelKS = lv_label_create(ui_PanelKS);
lv_obj_set_width(ui_LabelKS, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelKS, LV_SIZE_CONTENT); /// 1
lv_obj_set_align(ui_LabelKS, LV_ALIGN_LEFT_MID);
lv_label_set_text(ui_LabelKS, "Enable key sound");
lv_obj_set_style_text_font(ui_LabelKS, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_PanelLang = lv_obj_create(ui_SetPage);
lv_obj_set_width(ui_PanelLang, 234);
lv_obj_set_height(ui_PanelLang, 45);
lv_obj_set_x(ui_PanelLang, 0);
lv_obj_set_y(ui_PanelLang, 125);
lv_obj_set_align(ui_PanelLang, LV_ALIGN_TOP_MID);
lv_obj_add_flag(ui_PanelLang, LV_OBJ_FLAG_CHECKABLE); /// Flags
lv_obj_remove_flag(ui_PanelLang, LV_OBJ_FLAG_SCROLLABLE); /// Flags
lv_obj_set_style_bg_color(ui_PanelLang, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED);
lv_obj_set_style_bg_opa(ui_PanelLang, 255, LV_PART_MAIN | LV_STATE_CHECKED);
ui_SwitchLang = lv_switch_create(ui_PanelLang);
lv_obj_set_width(ui_SwitchLang, 50);
lv_obj_set_height(ui_SwitchLang, 25);
lv_obj_set_align(ui_SwitchLang, LV_ALIGN_RIGHT_MID);
ui_LabelLang = lv_label_create(ui_PanelLang);
lv_obj_set_width(ui_LabelLang, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelLang, LV_SIZE_CONTENT); /// 1
lv_obj_set_align(ui_LabelLang, LV_ALIGN_LEFT_MID);
lv_label_set_text(ui_LabelLang, "Enable Chinese");
lv_obj_set_style_text_font(ui_LabelLang, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_PanelRotate = lv_obj_create(ui_SetPage);
lv_obj_set_width(ui_PanelRotate, 234);
lv_obj_set_height(ui_PanelRotate, 45);
lv_obj_set_x(ui_PanelRotate, 0);
lv_obj_set_y(ui_PanelRotate, 175);
lv_obj_set_align(ui_PanelRotate, LV_ALIGN_TOP_MID);
lv_obj_add_flag(ui_PanelRotate, LV_OBJ_FLAG_CHECKABLE); /// Flags
lv_obj_remove_flag(ui_PanelRotate, LV_OBJ_FLAG_SCROLLABLE); /// Flags
lv_obj_set_style_bg_color(ui_PanelRotate, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED);
lv_obj_set_style_bg_opa(ui_PanelRotate, 255, LV_PART_MAIN | LV_STATE_CHECKED);
ui_LabelRotation = lv_label_create(ui_PanelRotate);
lv_obj_set_width(ui_LabelRotation, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelRotation, LV_SIZE_CONTENT); /// 1
lv_obj_set_align(ui_LabelRotation, LV_ALIGN_LEFT_MID);
lv_label_set_text(ui_LabelRotation, "Chose Rotation");
lv_obj_set_style_text_font(ui_LabelRotation, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_LabelRotNum = lv_label_create(ui_PanelRotate);
lv_obj_set_width(ui_LabelRotNum, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelRotNum, LV_SIZE_CONTENT); /// 1
lv_obj_set_align(ui_LabelRotNum, LV_ALIGN_RIGHT_MID);
lv_label_set_text(ui_LabelRotNum, "< 180 >");
lv_obj_set_style_text_font(ui_LabelRotNum, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_PanelPPS = lv_obj_create(ui_SetPage);
lv_obj_set_width(ui_PanelPPS, 234);
lv_obj_set_height(ui_PanelPPS, 45);
lv_obj_set_x(ui_PanelPPS, 0);
lv_obj_set_y(ui_PanelPPS, 225);
lv_obj_set_align(ui_PanelPPS, LV_ALIGN_TOP_MID);
lv_obj_add_flag(ui_PanelPPS, LV_OBJ_FLAG_CHECKABLE); /// Flags
lv_obj_remove_flag(ui_PanelPPS, LV_OBJ_FLAG_SCROLLABLE); /// Flags
lv_obj_set_style_bg_color(ui_PanelPPS, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED);
lv_obj_set_style_bg_opa(ui_PanelPPS, 255, LV_PART_MAIN | LV_STATE_CHECKED);
ui_SwitchPPS = lv_switch_create(ui_PanelPPS);
lv_obj_set_width(ui_SwitchPPS, 50);
lv_obj_set_height(ui_SwitchPPS, 25);
lv_obj_set_align(ui_SwitchPPS, LV_ALIGN_RIGHT_MID);
ui_LabelPPS = lv_label_create(ui_PanelPPS);
lv_obj_set_width(ui_LabelPPS, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelPPS, LV_SIZE_CONTENT); /// 1
lv_obj_set_align(ui_LabelPPS, LV_ALIGN_LEFT_MID);
lv_label_set_text(ui_LabelPPS, "PD Setting");
lv_obj_set_style_text_font(ui_LabelPPS, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
ui_PanelAbout = lv_obj_create(ui_SetPage);
lv_obj_set_width(ui_PanelAbout, 234);
lv_obj_set_height(ui_PanelAbout, 100);
lv_obj_set_x(ui_PanelAbout, 0);
lv_obj_set_y(ui_PanelAbout, 275);
lv_obj_set_align(ui_PanelAbout, LV_ALIGN_TOP_MID);
lv_obj_add_flag(ui_PanelAbout, LV_OBJ_FLAG_CHECKABLE); /// Flags
lv_obj_remove_flag(ui_PanelAbout, LV_OBJ_FLAG_SCROLLABLE); /// Flags
lv_obj_set_style_bg_color(ui_PanelAbout, lv_color_hex(0x606060), LV_PART_MAIN | LV_STATE_CHECKED);
lv_obj_set_style_bg_opa(ui_PanelAbout, 255, LV_PART_MAIN | LV_STATE_CHECKED);
ui_LabelAbout = lv_label_create(ui_PanelAbout);
lv_obj_set_width(ui_LabelAbout, LV_SIZE_CONTENT); /// 1
lv_obj_set_height(ui_LabelAbout, LV_SIZE_CONTENT); /// 1
lv_label_set_text(ui_LabelAbout, "About\nPower-Pico\nThe uA current meter\nV 1.0.0");
lv_obj_set_style_text_font(ui_LabelAbout, &lv_font_montserrat_16, LV_PART_MAIN | LV_STATE_DEFAULT);
// init setting values
_setting_init();
// store panels in array
panels[0] = ui_PanelBL;
panels[1] = ui_PanelKS;
panels[2] = ui_PanelLang;
panels[3] = ui_PanelRotate;
panels[4] = ui_PanelPPS;
panels[5] = ui_PanelAbout;
lv_obj_add_state(panels[current_panel_index], LV_STATE_CHECKED);
// timer
_setting_timer = lv_timer_create(_setting_timer_cb, 500, NULL);
//
lv_obj_add_event_cb(ui_SetPage, on_setpage_loaded, LV_EVENT_SCREEN_LOADED, NULL);
}
void ui_SetPage_screen_destroy(void)
{
if(_setting_timer) {
lv_timer_delete(_setting_timer);
}
}