mcu_ab568x/app/platform/bsp/bsp_uitool_phrase.c
2025-05-30 18:03:10 +08:00

487 lines
19 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 "include.h"
#include "../gui/components/compo_form.h"
#include "app_variable.h"
#define TRACE_EN 0
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
static u8 animation_id = 0;
enum {
//按键
COMPO_ID_BTN_GAME_KNIFE = 31, //射箭游戏对应quick_btn_tbl的顺序
};
//表盘文本编号表
const u8 text_str_tbl[] =
{
[1] = STR_CALORIE,
STR_STEPS,
STR_DISTANCE,
STR_HEART_RATE,
STR_BLOOD_OXYGEN,
// STR_BLOOD_SUGAR,
STR_WEATHER,
// STR_BAROMETER,//气压计
// STR_TEMPERATURE,//温度
// STR_CELSIUS,//摄氏度
// STR_ALTITUDE,//海拔
STR_SPORTS,
// STR_YEAR,
// STR_MON,
// STR_MDAY,
// STR_HOUR,
// STR_MIN,
// STR_SEC,
};
void compo_set_bonddata(component_t *compo, tm_t tm);
//时针
void bsp_uitool_pointer_create(compo_form_t *frm, uitool_res_t *uitool_res, u32 res_addr)
{
TRACE("UITOOL_TYPE_POINTER:%d, x:%d, y:%d, angle:%d\n", uitool_res->bond_type, uitool_res->x, uitool_res->y, uitool_res->param2);
s16 pivot_x = uitool_res->param1 & 0xff;
s16 pivot_y = uitool_res->param1 >> 16;
s16 start_angle = uitool_res->param2 & 0xffff;
bool anticlockwise = (uitool_res->param2 >> 16) & 0x01;
compo_datetime_t *pointer = compo_datetime_create(frm, res_addr);
compo_bonddata(pointer, uitool_res->bond_type);
// printf("create pointer[%x] bond[%d] img[%x]\n", pointer, uitool_res->bond_type, pointer->img);
compo_datetime_set_pos(pointer, uitool_res->x, uitool_res->y);
compo_datetime_set_center(pointer, pivot_x, pivot_y);
compo_datetime_set_start_angle(pointer, start_angle);
compo_datetime_set_anticlockwise(pointer, anticlockwise);
}
//图像
void bsp_uitool_image_create(compo_form_t *frm, uitool_res_t *uitool_res, u32 res_addr)
{
u8 interval = BYTE2(uitool_res->param1);
s16 click_wid = (BYTE0(uitool_res->param2) << 8) | BYTE3(uitool_res->param1);
s16 click_hei = (BYTE2(uitool_res->param2) << 8) | BYTE1(uitool_res->param2);
// TRACE("UITOOL_TYPE_IMAGE:%d, res_addr:%x, x:%d, y:%d\n", uitool_res->bond_type, uitoolres->res_addr, uitool_res->x, uitool_res->y);
switch (uitool_res->bond_type) {
case COMPO_BOND_IMAGE_STATIC:
compo_form_add_image(frm, res_addr, uitool_res->x, uitool_res->y);
break;
case COMPO_BOND_IMAGE_CLICK:
{
compo_animation_t *animation = compo_animation_create(frm, res_addr);
compo_animation_set_click_area(animation, uitool_res->x, uitool_res->y, click_wid, click_hei);
compo_animation_set_pos(animation, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y);
compo_animation_set_radix(animation, uitool_res->res_num);
compo_animation_set_interval(animation, 0);
compo_bonddata(animation, uitool_res->bond_type);
compo_setid(animation, ++animation_id);
}
break;
case COMPO_BOND_ANIMATION_STATIC:
{
compo_animation_t *animation = compo_animation_create(frm, res_addr);
compo_animation_set_pos(animation, uitool_res->x, uitool_res->y);
compo_animation_set_radix(animation, uitool_res->res_num);
compo_animation_set_interval(animation, interval);
compo_bonddata(animation, uitool_res->bond_type);
}
break;
case COMPO_BOND_ANIMATION_AREA_CLICK:
{
for (u8 i = 0; i < COMPO_ANIMATION_CLICK_NUM; i++) {
compo_animation_t *animation = compo_animation_create(frm, res_addr);
compo_animation_set_click_area(animation, uitool_res->x, uitool_res->y, click_wid, click_hei);
compo_animation_set_pos(animation, 0, 0);
compo_animation_set_radix(animation, uitool_res->res_num);
compo_animation_set_interval(animation, interval);
compo_animation_set_visible(animation, false);
compo_bonddata(animation, uitool_res->bond_type);
compo_setid(animation, ++animation_id);
}
}
break;
case COMPO_BOND_ANIMATION_CLICK:
{
}
break;
case COMPO_BOND_IMAGE_WEATHER:
case COMPO_BOND_BLE_STA:
case COMPO_BOND_BT_STA:
case COMPO_BOND_BTBLE_STA:
case COMPO_BOND_DISTANCE_PROGRESS:
case COMPO_BOND_KCAL_PROGRESS:
case COMPO_BOND_STEPS_PROGRESS:
case COMPO_BOND_VBAT_PROGRESS:
{
compo_picturebox_t *pic;
pic = compo_picturebox_create(frm, res_addr);
compo_picturebox_cut(pic, 0, uitool_res->res_num); //默认第1张图
compo_picturebox_set_pos(pic, uitool_res->x, uitool_res->y);
compo_bonddata(pic, uitool_res->bond_type);
// printf("type[%d]\n", uitool_res->bond_type);
}
break;
case COMPO_BOND_IMAGE_DISTANCE_UNIT:
{
compo_picturebox_t *pic;
pic = compo_picturebox_create(frm, res_addr);
if(uitool_res->res_num == 2){
#if defined(__LANGUAGE_SM_CHINESE__)
if (tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese){
compo_picturebox_cut(pic, 0, uitool_res->res_num); //默认第1张图
}else
#endif
{
compo_picturebox_cut(pic, 1, uitool_res->res_num); //默认第2张图
}
}
else if(uitool_res->res_num == 4)
{
#if defined(__LANGUAGE_SM_CHINESE__)
if (tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese)
{
if(SysVariable.deviceInfo.distanceUnit==UNIT_TYPE_INCH){
compo_picturebox_cut(pic, 1, uitool_res->res_num); //默认第2张图
}else{
compo_picturebox_cut(pic, 0, uitool_res->res_num); //默认第1张图
}
}
else
#endif
{
if(SysVariable.deviceInfo.distanceUnit==UNIT_TYPE_INCH){
compo_picturebox_cut(pic, 3, uitool_res->res_num); //默认第2张图
}else{
compo_picturebox_cut(pic, 2, uitool_res->res_num); //默认第1张图
}
}
}
compo_picturebox_set_pos(pic, uitool_res->x, uitool_res->y);
// compo_bonddata(pic, uitool_res->bond_type);
// printf("type[%d]\n", uitool_res->bond_type);
}
break;
case COMPO_BOND_IMAGE_AM_PM:
{
compo_picturebox_t *pic;
tm_t time = rtc_clock_get();
pic = compo_picturebox_create(frm, res_addr);
/*24小时制下不显示上下午的图片框*/
if(SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR)
{
compo_picturebox_set_visible(pic,true);
}
else
{
compo_picturebox_set_visible(pic,false);
}
//只有纯英文或者纯中文,仅两张的情况
if(uitool_res->res_num == 2){
if (time.hour < 12){
compo_picturebox_cut(pic, 0, uitool_res->res_num); //默认第1张图
}else{
compo_picturebox_cut(pic, 1, uitool_res->res_num); //默认第2张图
}
}
//有中英文的上下午
else if(uitool_res->res_num == 4)
{
#if defined(__LANGUAGE_SM_CHINESE__)
if (tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese)
{
if(time.hour < 12){
compo_picturebox_cut(pic, 0, uitool_res->res_num); //默认第1张图
}else{
compo_picturebox_cut(pic, 1, uitool_res->res_num); //默认第2张图
}
}
else
#endif
{
if(time.hour < 12){
compo_picturebox_cut(pic, 2, uitool_res->res_num); //默认第3张图
}else{
compo_picturebox_cut(pic, 3, uitool_res->res_num); //默认第4张图
}
}
}
compo_picturebox_set_pos(pic, uitool_res->x, uitool_res->y);
}
break;
default:
break;
}
}
//文本
void bsp_uitool_text_create(compo_form_t *frm, uitool_res_t *uitool_res, u32 res_addr)
{
u8 index = BYTE0(uitool_res->param1);
TRACE("UITOOL_TYPE_TEXT:%d\n", index);
compo_textbox_t *txt = compo_textbox_create(frm, 10);
compo_textbox_set_location(txt, uitool_res->x, uitool_res->y, 80, 40);
compo_textbox_set(txt, i18n[text_str_tbl[index]]);
}
//图片/字库数字
void bsp_uitool_num_create(compo_form_t *frm, uitool_res_t *uitool_res, u32 res_addr)
{
bool use_num = uitool_res->param1 & BIT(0);
u8 max_cnt = 0;
area_t button;
u8 bond_compo_type = COMPO_TYPE_NONE;
u8 value = 0;
u8 picturebox_type = PICTUREBOX_TYPE_NONE;
if (uitool_res->bond_type == COMPO_BOND_CUSTOM) {
uitool_res->bond_type = COMPO_BOND_CUSTOM0 + (*((char *)(&uitool_res->param1) + 1) - '0');
}
TRACE("UITOOL_TYPE_NUM:%d, x:%d, y:%d, res_num:%d\n", uitool_res->bond_type, uitool_res->x, uitool_res->y, uitool_res->res_num);
if (use_num) {
switch (uitool_res->bond_type) {
case COMPO_BOND_HOUR_H:
case COMPO_BOND_MINUTE_H:
case COMPO_BOND_HOUR_L:
case COMPO_BOND_MINUTE_L:
//case COMPO_BOND_CUSTOM:
case COMPO_BOND_CUSTOM0:
bond_compo_type = COMPO_TYPE_NUMBER;
max_cnt = 1;
break;
case COMPO_BOND_WEEKDAY:
bond_compo_type = COMPO_TYPE_PICTUREBOX;
picturebox_type=PICTUREBOX_TYPE_WEEKDAY;
break;
case COMPO_BOND_TEMPERATURE_UNIT:
bond_compo_type = COMPO_TYPE_PICTUREBOX;
picturebox_type=PICTUREBOX_TYPE_TEMPERATURE_UNIT;
break;
case COMPO_BOND_MONTH:
//如果图片数量超过了11张说明是12张图片或者24张图片
if (uitool_res->res_num > 11) {
bond_compo_type = COMPO_TYPE_PICTUREBOX;
picturebox_type=PICTUREBOX_TYPE_MONTH;
}
//如果没超过11张一般是数字
else{
bond_compo_type = COMPO_TYPE_NUMBER;
}
max_cnt = 2;
break;
case COMPO_BOND_YEAD:
case COMPO_BOND_KCAL:
bond_compo_type = COMPO_TYPE_NUMBER;
max_cnt = 4;
break;
case COMPO_BOND_STEP:
bond_compo_type = COMPO_TYPE_NUMBER;
max_cnt = 5;
break;
case COMPO_BOND_HEARTRATE:
case COMPO_BOND_BLOOD_OXYGEN:
case COMPO_BOND_BLOOD_SUGER:
case COMPO_BOND_ALTITUDE:
case COMPO_BOND_WEATHER:
case COMPO_BOND_ATMOMS:
case COMPO_BOND_TEMPERATURE:
case COMPO_BOND_BATTERY:
case COMPO_BOND_CUSTOM_WEATHER_MIN:
case COMPO_BOND_CUSTOM_WEATHER_MAX:
//case COMPO_BOND_DISTANCE:
bond_compo_type = COMPO_TYPE_NUMBER;
max_cnt = 3;
break;
default:
bond_compo_type = COMPO_TYPE_NUMBER;
max_cnt = 2;
break;
}
if (bond_compo_type == COMPO_TYPE_NUMBER) {
//数字
bool minus = uitool_res->param1 & BIT(1);
bool num_part_en = uitool_res->param1 & BIT(2);
s16 delt_x = num_part_en ? ((uitool_res->param1 >> 8) & 0xffff) : 0;
s16 delt_y = num_part_en ? ((uitool_res->param1 >> 24) & 0xffff) : 0;
u8 cnt = num_part_en ? 5 : 1;
max_cnt = num_part_en ? 1 : max_cnt;
compo_number_t *num;
for(u8 i=0;i<cnt;i++) {
num = compo_number_create(frm, res_addr, max_cnt);
if(uitool_res->bond_type==COMPO_BOND_CUSTOM_WEATHER_MAX||uitool_res->bond_type==COMPO_BOND_CUSTOM_WEATHER_MIN)
{
compo_number_set_radix(num, uitool_res->res_num, true);
}
else
{
compo_number_set_radix(num, uitool_res->res_num, minus);
}
num->num_part = num_part_en ? i + 1 : 0;
//个位中心坐标
compo_number_set_pos(num, uitool_res->x - delt_x * i, uitool_res->y + delt_y * i);
if(uitool_res->bond_type==COMPO_BOND_TEMPERATURE||uitool_res->bond_type==COMPO_BOND_CUSTOM_WEATHER_MAX||uitool_res->bond_type==COMPO_BOND_CUSTOM_WEATHER_MIN)
{
compo_number_set_zfill(num, false);
}
else
{
compo_number_set_zfill(num, true);
}
//compo_number_set_visible(num, false);
compo_bonddata(num, uitool_res->bond_type);
compo_set_bonddata((component_t *)num, time_to_tm(compo_cb.rtc_cnt));
}
} else if (bond_compo_type == COMPO_TYPE_PICTUREBOX) {
//图像
compo_picturebox_t *pic;
pic = compo_picturebox_create(frm, res_addr);
tm_t tm=SysVariable.Rtc;
switch (picturebox_type)
{
case PICTUREBOX_TYPE_WEEKDAY:
if(tm.weekday == 0){
value = 6;
}else{
value = tm.weekday - 1;
}
if ((uitool_res->res_num > 7) && (tjd_Get_Language_Current_Index() != LANGUAGE_TYPE_Chinese)) {
value += 7;
}
break;
case PICTUREBOX_TYPE_TEMPERATURE_UNIT:
if (SysVariable.deviceInfo.distanceUnit == UNIT_TYPE_INCH) {
value = 1; // 转英制数据
}else{
value = 0;
}
break;
case PICTUREBOX_TYPE_MONTH:
if (uitool_res->res_num > 11) {
value = tm.mon - 1;//图片序列一般从0开始
if((uitool_res->res_num == 24)&&(tjd_Get_Language_Current_Index() != LANGUAGE_TYPE_Chinese))
{
value += 12;
}
}
break;
default:
break;
}
compo_picturebox_cut(pic, value, uitool_res->res_num);//显示实际的图片
compo_picturebox_set_pos(pic, uitool_res->x, uitool_res->y);
compo_bonddata(pic, uitool_res->bond_type);
}
} else {
switch (uitool_res->bond_type)
{
case COMPO_BOND_CUSTOM_GAME:
bond_compo_type = COMPO_TYPE_BUTTON;
button.hei = 60;
button.wid = 60;
break;
default:
max_cnt = 2;
compo_textbox_t *txt = compo_textbox_create(frm, max_cnt);
compo_textbox_set_location(txt, uitool_res->x, uitool_res->y, 80, 40);
// compo_textbox_set_visible(txt, false);
compo_bonddata(txt, uitool_res->bond_type);
break;
}
if (bond_compo_type == COMPO_TYPE_BUTTON)
{
compo_button_t *btn;
btn = compo_button_create(frm);
compo_setid(btn, COMPO_ID_BTN_GAME_KNIFE);
compo_button_set_location(btn, uitool_res->x, uitool_res->y, button.wid, button.hei);
compo_bonddata(btn, uitool_res->bond_type);
}
}
}
//区域
void bsp_uitool_area_create(compo_form_t *frm, uitool_res_t *uitool_res, u32 res_addr)
{
u8 index = uitool_res->param2 & 0xff;
s16 wid = uitool_res->param1 & 0xff;
s16 hei = uitool_res->param1 >> 16;
TRACE("UITOOL_TYPE_AREA:%d, %d, %d\n", index, wid, hei);
compo_button_t *btn;
btn = compo_button_create(frm);
compo_setid(btn, index);
compo_button_set_location(btn, uitool_res->x, uitool_res->y, wid, hei);
}
u16 bsp_uitool_header_phrase(u32 base_addr)
{
uitool_header_t uitool_header;
os_spiflash_read(&uitool_header, base_addr, UITOOL_HEADER);
TRACE("base_addr:%d,sig:%x, ver:%d, size:%x, num:%x\n", base_addr,uitool_header.sig, uitool_header.ver, uitool_header.size, uitool_header.num);
TRACE("user id:%d, index:%d, wid:%d, hei:%d\n", uitool_header.user_id, uitool_header.index, uitool_header.wid, uitool_header.hei);
// print_r(uitool_header.user_extend, 32);
if (uitool_header.sig != UITOOL_HEADER_FORMAT) {
// printf("UITOOL Format Uncorrect:%x, %x\n", uitool_header.sig, UITOOL_HEADER_FORMAT);
return false;
}
return uitool_header.num;
}
void bsp_uitool_create(compo_form_t *frm, u32 base_addr, u16 compo_num)
{
uitool_res_t uitool_res;
memset(&uitool_res, 0, sizeof(uitool_res_t));
animation_id = 0;
for(u16 i=0;i<compo_num;i++) {
os_spiflash_read(&uitool_res, base_addr + UITOOL_HEADER + i * UITOOL_RES_HEADER, UITOOL_RES_HEADER);
u32 res_addr = base_addr + uitool_res.res_addr;
switch (uitool_res.res_type) {
case UITOOL_TYPE_POINTER:
bsp_uitool_pointer_create(frm, &uitool_res, res_addr);
break;
case UITOOL_TYPE_IMAGE:
bsp_uitool_image_create(frm, &uitool_res, res_addr);
break;
case UITOOL_TYPE_TEXT:
bsp_uitool_text_create(frm, &uitool_res, res_addr);
break;
case UITOOL_TYPE_NUM:
bsp_uitool_num_create(frm, &uitool_res, res_addr);
break;
case UITOOL_TYPE_AREA:
bsp_uitool_area_create(frm, &uitool_res, res_addr);
break;
default:
TRACE("HALT_GUI_DIALPLATE_TYPE:%d\n", uitool_res.res_type);
halt(HALT_GUI_DIALPLATE_TYPE);
break;
}
}
compo_cb.rtc_update = true;
}