440 lines
8.8 KiB
C++
440 lines
8.8 KiB
C++
|
#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
|
||
|
);
|
||
|
}
|