487 lines
19 KiB
C
487 lines
19 KiB
C
#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;
|
||
}
|
||
|