GeekTrack/2.Firmware/components/GeekOS/Pages/SystemInfos/SystemInfosView.cpp

440 lines
8.8 KiB
C++
Raw Normal View History

2022-09-18 18:40:49 +08:00
#include "SystemInfosView.h"
#include <string>
#include "stdio.h"
using namespace Page;
#define ITEM_HEIGHT_MIN 120
#define ITEM_PAD ((LV_VER_RES - ITEM_HEIGHT_MIN) / 2)
static struct
{
lv_style_t icon;
lv_style_t focus;
lv_style_t info;
lv_style_t data;
} style;
void SystemInfosView::Create(lv_obj_t* root)
{
lv_obj_remove_style_all(root);
lv_obj_set_size(root, LV_HOR_RES, LV_VER_RES);
lv_obj_set_style_bg_color(root, lv_color_black(), 0);
lv_obj_set_style_bg_opa(root, LV_OPA_COVER, 0);
lv_obj_set_style_pad_ver(root, ITEM_PAD, 0);
lv_obj_set_flex_flow(root, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(
root,
LV_FLEX_ALIGN_START,
LV_FLEX_ALIGN_START,
LV_FLEX_ALIGN_CENTER
);
Style_Init();
/* Item Sport */
Item_Create(
&ui.sport,
root,
"Sport",
"bicycle",
"Total trip\n"
"Total time\n"
"Max speed"
);
/* Item GPS */
Item_Create(
&ui.gps,
root,
"GPS",
"map_location",
"Latitude\n"
"Longitude\n"
"Altitude\n"
"UTC Time\n\n"
"Course\n"
"Speed"
);
/* Item MAG */
Item_Create(
&ui.mag,
root,
"MAG",
"compass",
"Compass\n"
"X\n"
"Y\n"
"Z"
);
/* Item IMU */
Item_Create(
&ui.imu,
root,
"IMU",
"gyroscope",
"Step\n"
"Ax\n"
"Ay\n"
"Az\n"
"Gx\n"
"Gy\n"
"Gz"
);
/* Item RTC */
Item_Create(
&ui.rtc,
root,
"RTC",
"time_info",
"Date\n"
"Time"
);
/* Item Battery */
Item_Create(
&ui.battery,
root,
"Battery",
"battery_info",
"Usage\n"
"Voltage\n"
"Status"
);
/* Item Storage */
Item_Create(
&ui.storage,
root,
"Storage",
"storage",
"Name\n"
"Size\n"
"Type\n"
"Version"
);
/* Item System */
Item_Create(
&ui.system,
root,
"System",
"system_info",
"Firmware\n"
"Author\n"
"LVGL\n"
"SysTick\n"
"Compiler\n\n"
"Build\n"
);
Group_Init();
}
void SystemInfosView::Group_Init()
{
lv_group_t* group = lv_group_get_default();
lv_group_set_wrap(group, true);
lv_group_set_focus_cb(group, onFocus);
item_t* item_grp = ((item_t*)&ui);
/* Reverse adding to group makes encoder operation more comfortable */
for (int i = sizeof(ui) / sizeof(item_t) - 1; i >= 0; i--)
{
lv_group_add_obj(group, item_grp[i].icon);
}
lv_group_focus_obj(item_grp[0].icon);
}
void SystemInfosView::Delete()
{
lv_group_set_focus_cb(lv_group_get_default(), nullptr);
Style_Reset();
}
void SystemInfosView::SetScrollToY(lv_obj_t* obj, lv_coord_t y, lv_anim_enable_t en)
{
lv_coord_t scroll_y = lv_obj_get_scroll_y(obj);
lv_coord_t diff = -y + scroll_y;
lv_obj_scroll_by(obj, 0, diff, en);
}
void SystemInfosView::onFocus(lv_group_t* g)
{
lv_obj_t* icon = lv_group_get_focused(g);
lv_obj_t* cont = lv_obj_get_parent(icon);
lv_coord_t y = lv_obj_get_y(cont);
lv_obj_scroll_to_y(lv_obj_get_parent(cont), y, LV_ANIM_ON);
}
void SystemInfosView::Style_Init()
{
lv_style_init(&style.icon);
lv_style_set_width(&style.icon, 220);
lv_style_set_bg_color(&style.icon, lv_color_black());
lv_style_set_bg_opa(&style.icon, LV_OPA_COVER);
lv_style_set_text_font(&style.icon, ResourcePool::GetFont("bahnschrift_17"));
lv_style_set_text_color(&style.icon, lv_color_white());
lv_style_init(&style.focus);
lv_style_set_width(&style.focus, 70);
lv_style_set_border_side(&style.focus, LV_BORDER_SIDE_RIGHT);
lv_style_set_border_width(&style.focus, 2);
lv_style_set_border_color(&style.focus, lv_color_hex(0xff931e));
static const lv_style_prop_t style_prop[] =
{
LV_STYLE_WIDTH,
LV_STYLE_PROP_INV
};
static lv_style_transition_dsc_t trans;
lv_style_transition_dsc_init(
&trans,
style_prop,
lv_anim_path_overshoot,
200,
0,
nullptr
);
lv_style_set_transition(&style.focus, &trans);
lv_style_set_transition(&style.icon, &trans);
lv_style_init(&style.info);
lv_style_set_text_font(&style.info, ResourcePool::GetFont("bahnschrift_13"));
lv_style_set_text_color(&style.info, lv_color_hex(0x999999));
lv_style_init(&style.data);
lv_style_set_text_font(&style.data, ResourcePool::GetFont("bahnschrift_13"));
lv_style_set_text_color(&style.data, lv_color_white());
}
void SystemInfosView::Style_Reset()
{
lv_style_reset(&style.icon);
lv_style_reset(&style.info);
lv_style_reset(&style.data);
lv_style_reset(&style.focus);
}
void SystemInfosView::Item_Create(
item_t* item,
lv_obj_t* par,
const char* name,
const char* img_src,
const char* infos
)
{
lv_obj_t* cont = lv_obj_create(par);
lv_obj_enable_style_refresh(false);
lv_obj_remove_style_all(cont);
lv_obj_set_width(cont, 220);
lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLLABLE);
item->cont = cont;
/* icon */
lv_obj_t* icon = lv_obj_create(cont);
lv_obj_enable_style_refresh(false);
lv_obj_remove_style_all(icon);
lv_obj_clear_flag(icon, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_add_style(icon, &style.icon, 0);
lv_obj_add_style(icon, &style.focus, LV_STATE_FOCUSED);
lv_obj_set_style_align(icon, LV_ALIGN_LEFT_MID, 0);
lv_obj_set_flex_flow(icon, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(
icon,
LV_FLEX_ALIGN_SPACE_AROUND,
LV_FLEX_ALIGN_CENTER,
LV_FLEX_ALIGN_CENTER
);
lv_obj_t* img = lv_img_create(icon);
lv_obj_enable_style_refresh(false);
lv_img_set_src(img, ResourcePool::GetImage(img_src));
lv_obj_t* label = lv_label_create(icon);
lv_obj_enable_style_refresh(false);
lv_label_set_text(label, name);
item->icon = icon;
/* infos */
label = lv_label_create(cont);
lv_obj_enable_style_refresh(false);
lv_label_set_text(label, infos);
lv_obj_add_style(label, &style.info, 0);
lv_obj_align(label, LV_ALIGN_LEFT_MID, 75, 0);
item->labelInfo = label;
/* datas */
label = lv_label_create(cont);
lv_obj_enable_style_refresh(false);
lv_label_set_text(label, "-");
lv_obj_add_style(label, &style.data, 0);
lv_obj_align(label, LV_ALIGN_CENTER, 70, 0);
item->labelData = label;
lv_obj_move_foreground(icon);
lv_obj_enable_style_refresh(true);
/* get real max height */
lv_obj_update_layout(item->labelInfo);
lv_coord_t height = lv_obj_get_height(item->labelInfo);
height = LV_MAX(height, ITEM_HEIGHT_MIN);
lv_obj_set_height(cont, height);
lv_obj_set_height(icon, height);
}
void SystemInfosView::SetSport(
float trip,
const char* time,
float maxSpd
)
{
lv_label_set_text_fmt(
ui.sport.labelData,
"%0.2fkm\n"
"%s\n"
"%0.1fkm/h",
trip,
time,
maxSpd
);
}
void SystemInfosView::SetGPS(
float lat,
float lng,
float alt,
const char* utc,
float course,
float speed
)
{
lv_label_set_text_fmt(
ui.gps.labelData,
"%0.6f\n"
"%0.6f\n"
"%0.2fm\n"
"%s\n"
"%0.1f deg\n"
"%0.1fkm/h",
lat,
lng,
alt,
utc,
course,
speed
);
}
void SystemInfosView::SetMAG(
const char* info
)
{
lv_label_set_text_fmt(
ui.mag.labelData,
"%s\n",
info
);
}
void SystemInfosView::SetIMU(
int step,
const char* info
)
{
lv_label_set_text_fmt(
ui.imu.labelData,
"%d\n"
"%s",
step,
info
);
}
void SystemInfosView::SetRTC(
const char* dateTime
)
{
lv_label_set_text(
ui.rtc.labelData,
dateTime
);
}
void SystemInfosView::SetBattery(
const char* info
)
{
lv_label_set_text_fmt(
ui.battery.labelData,
"%s\n",
info
);
}
void SystemInfosView::SetStorage(
const char* detect,
const char* size,
const char* type,
const char* version
)
{
lv_label_set_text_fmt(
ui.storage.labelData,
"%s\n"
"%s\n"
"%s\n"
"%s",
detect,
size,
type,
version
);
}
void SystemInfosView::SetSystem(
const char* firmVer,
const char* authorName,
const char* lvglVer,
const char* bootTime,
const char* compilerName,
const char* bulidTime
)
{
lv_label_set_text_fmt(
ui.system.labelData,
"%s\n"
"%s\n"
"%s\n"
"%s\n"
"%s\n"
"%s",
firmVer,
authorName,
lvglVer,
bootTime,
compilerName,
bulidTime
);
}