832 lines
28 KiB
C
832 lines
28 KiB
C
#include "include.h"
|
||
#include "app_variable.h"
|
||
#include "m_sportInfo.h"
|
||
#define TRACE_EN 0
|
||
|
||
#if TRACE_EN
|
||
#define TRACE(...) printf(__VA_ARGS__)
|
||
#else
|
||
#define TRACE(...)
|
||
#endif
|
||
|
||
#define COMPO_TEXT_AUTOROLL_NORMAL 0 //单方向滚动后循环滚动
|
||
#define COMPO_TEXT_AUTOROLL_LR 1 //左右回弹
|
||
#define COMPO_TEXT_AUTOROLL_DIRECTION COMPO_TEXT_AUTOROLL_NORMAL//文本滚动方向
|
||
|
||
#define COMPO_TEXT_AUTOROLL_START_TICK 1000 //文本滚动开始延时
|
||
#define COMPO_TEXT_AUTOROLL_STOP_TICK 1500 //文本滚动结束延时
|
||
#define COMPO_TEXT_AUTOROLL_TICK 18 //文本滚动
|
||
#define OFFSET(x) ((x)<127?(x):(x-256) )
|
||
/**
|
||
* @brief 根据ID获取组件对象
|
||
* @param[in] id : 组件的ID
|
||
* @return 返回组件的指针
|
||
**/
|
||
void *compo_getobj_byid(u16 id)
|
||
{
|
||
if (id == 0) {
|
||
return NULL;
|
||
}
|
||
component_t *compo = compo_get_head();
|
||
while (compo != NULL) {
|
||
if (compo->id == id) {
|
||
return compo;
|
||
}
|
||
compo = compo_get_next(compo); //遍历组件
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* @brief 更新组件时间到TE时间
|
||
**/
|
||
ALIGNED(256)
|
||
void compo_update(void)
|
||
{
|
||
u32 rtc_cnt, rtc_cnt2, rtc_pr2;
|
||
bool rtc_update;
|
||
|
||
GLOBAL_INT_DISABLE();
|
||
rtc_update = compo_cb.rtc_update;
|
||
rtc_cnt = compo_cb.rtc_cnt;
|
||
rtc_cnt2 = compo_cb.rtc_cnt2 >> 17 << 2;
|
||
rtc_pr2 = (compo_cb.rtc_cnt2 & 0x1FFFF) + 1;
|
||
compo_cb.rtc_update = false;
|
||
GLOBAL_INT_RESTORE();
|
||
|
||
if (!rtc_update) {
|
||
return;
|
||
}
|
||
compo_cb.tm = time_to_tm(rtc_cnt);
|
||
compo_cb.mtime = rtc_cnt2 * 1000 / rtc_pr2;
|
||
compo_set_update(compo_cb.tm, compo_cb.mtime);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置绑定数据
|
||
* @param[in] compo : 组件
|
||
* @param[in] tm : 时间tm结构体
|
||
* @param[in] x : 数据的坐标
|
||
**/
|
||
void compo_set_bonddata_ff(component_t *compo, tm_t tm ,s16 x)
|
||
{
|
||
bool flag_update = true;
|
||
int value = 0;
|
||
u32 value1 = 0;
|
||
tm_t time = rtc_clock_get();
|
||
static u8 time_num = 0;
|
||
char value_str[TEXTBOX_TEXT_BUF_LEN] = {0};
|
||
memset(value_str, '\0', 16);
|
||
|
||
if (x <= 120)
|
||
{
|
||
if (time.hour >= 7)
|
||
{
|
||
value = time.hour - 7;
|
||
}
|
||
else
|
||
{
|
||
value = time.hour + 24 - 7;
|
||
}
|
||
time_num = 1;
|
||
}
|
||
else
|
||
{
|
||
if (time.hour >= 13)
|
||
{
|
||
value = time.hour - 13;
|
||
}
|
||
else
|
||
{
|
||
value = time.hour + 24 - 13;
|
||
}
|
||
}
|
||
|
||
if (flag_update)
|
||
{
|
||
// printf("bond_data:%d, type:%d, value:%d\n", compo->bond_data, compo->type, value);
|
||
if (compo->type == COMPO_TYPE_NUMBER)
|
||
{
|
||
compo_number_t *num = (compo_number_t *)compo;
|
||
if (num->num_part)
|
||
{
|
||
if (num->num_part > 1)
|
||
{
|
||
value /= soft_pow(10, num->num_part - 1);
|
||
}
|
||
value %= 10;
|
||
}
|
||
compo_number_set(num, value);
|
||
compo_number_set_margin(num, 0);
|
||
// compo_number_set_visible(num, true);
|
||
}
|
||
else if (compo->type == COMPO_TYPE_TEXTBOX)
|
||
{
|
||
compo_textbox_t *txt = (compo_textbox_t *)compo;
|
||
compo_textbox_set(txt, value_str);
|
||
// compo_textbox_set_visible(txt, true);
|
||
}
|
||
else if (compo->type == COMPO_TYPE_PICTUREBOX)
|
||
{
|
||
compo_picturebox_t *pic = (compo_picturebox_t *)compo;
|
||
|
||
compo_picturebox_cut(pic, value, pic->radix);
|
||
// compo_picturebox_set_visible(pic, true);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置绑定数据
|
||
* @param[in] compo : 组件
|
||
* @param[in] tm : 时间tm结构体
|
||
|
||
**/
|
||
void compo_set_bonddata(component_t * compo, tm_t tm)
|
||
{
|
||
bool flag_update = true;
|
||
int value = 0;
|
||
u32 value1 = 0;
|
||
s16 temperature = 0;
|
||
tm_t time = rtc_clock_get();
|
||
static u8 time_num = 0;
|
||
char value_str[TEXTBOX_TEXT_BUF_LEN] = {0};
|
||
memset(value_str, '\0', 16);
|
||
|
||
switch (compo->bond_data)
|
||
{
|
||
case COMPO_BOND_YEAD:
|
||
value = tm.year;
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_MONTH:
|
||
if (compo->type == COMPO_TYPE_PICTUREBOX|| compo->type == COMPO_TYPE_NUMBER) {
|
||
compo_picturebox_t *pic = (compo_picturebox_t *)compo;
|
||
// printf("pic->radix = %d\n", pic->radix);
|
||
//如果图片数量超过了11张,说明是12张图片或者24张图片
|
||
if (pic->radix > 11) {
|
||
value = tm.mon - 1;//图片序列一般从0开始
|
||
if(pic->radix == 24)
|
||
{
|
||
#if defined(__LANGUAGE_SM_CHINESE__)
|
||
if(tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese)
|
||
{
|
||
value = value;
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
value += 12;
|
||
}
|
||
}
|
||
sprintf(value_str, "%d", value);
|
||
}
|
||
//如果没超过11张,一般是数字
|
||
else{
|
||
value = tm.mon;
|
||
sprintf(value_str, "%02d", value);
|
||
}
|
||
}
|
||
break;
|
||
|
||
|
||
case COMPO_BOND_DAY:
|
||
value = tm.day;
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_DAY_H:
|
||
value = tm.day / 10;
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_DAY_L:
|
||
value = tm.day % 10;
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_WEEKDAY:
|
||
{
|
||
if(tm.weekday == 0)
|
||
value = 6;
|
||
else
|
||
value = tm.weekday - 1;
|
||
}
|
||
strcpy(value_str, i18n[STR_SUNDAY + value]);
|
||
|
||
if (compo->type == COMPO_TYPE_PICTUREBOX|| compo->type == COMPO_TYPE_NUMBER) {
|
||
compo_picturebox_t *pic = (compo_picturebox_t *)compo;
|
||
if(pic->radix > 7)
|
||
{
|
||
#if defined(__LANGUAGE_SM_CHINESE__)
|
||
if(tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese)
|
||
{
|
||
value = value;
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
value += 7;
|
||
}
|
||
}
|
||
}
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_HOUR:
|
||
value = get_autoformat_hour(tm.hour);
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_MINUTE:
|
||
value = tm.min;
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_HOUR_H:
|
||
value = get_autoformat_hour(tm.hour) / 10;
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_HOUR_L:
|
||
value = get_autoformat_hour(tm.hour) % 10;
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_MINUTE_H:
|
||
value = tm.min / 10;
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_MINUTE_L:
|
||
value = tm.min % 10;
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_SECOND:
|
||
value = tm.sec;
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_DATE:
|
||
value = tm.mon * 100 + tm.day;
|
||
sprintf(value_str, "%02d-%02d", tm.mon, tm.day);
|
||
break;
|
||
|
||
case COMPO_BOND_TIME:
|
||
value = tm.hour * 100 + tm.min;
|
||
sprintf(value_str, "%02d:%02d", get_autoformat_hour(tm.hour), tm.min);
|
||
break;
|
||
|
||
|
||
case COMPO_BOND_IMAGE_WEATHER:
|
||
value = SysVariable.weather.type;
|
||
// printf("weather type ==== value = %d\n");
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_BLE_STA:
|
||
value = ble_is_connected();
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_BT_STA:
|
||
value = !bt_is_connected();
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_BTBLE_STA:
|
||
//0-3:BTBLE,BT,BLE,NULL
|
||
value = ((!bt_is_connected()) << 1) | (!ble_is_connect());
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
// case COMPO_BOND_DISTANCE_PROGRESS:
|
||
// value = 0;
|
||
// if (compo->type == COMPO_TYPE_PICTUREBOX && sys_cb.distance_goal) {
|
||
// value = ((compo_picturebox_t*)compo)->radix * sys_cb.distance_cur / sys_cb.distance_goal;
|
||
// value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value));
|
||
// }
|
||
// sprintf(value_str, "%d", value);
|
||
// break;
|
||
|
||
// case COMPO_BOND_KCAL_PROGRESS:
|
||
// value = 0;
|
||
// if (compo->type == COMPO_TYPE_PICTUREBOX && sys_cb.kcal_goal) {
|
||
// value = ((compo_picturebox_t*)compo)->radix * sys_cb.kcal_cur / sys_cb.kcal_goal;
|
||
// value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value));
|
||
// }
|
||
// sprintf(value_str, "%d", value);
|
||
// break;
|
||
|
||
// case COMPO_BOND_STEPS_PROGRESS:
|
||
// value = 0;
|
||
// if (compo->type == COMPO_TYPE_PICTUREBOX && sys_cb.step_goal) {
|
||
// value = ((compo_picturebox_t*)compo)->radix * sys_cb.step_cur / sys_cb.step_goal;
|
||
// value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value));
|
||
// }
|
||
// sprintf(value_str, "%d", value);
|
||
// break;
|
||
|
||
case COMPO_BOND_VBAT_PROGRESS:
|
||
value = 0;
|
||
if (compo->type == COMPO_TYPE_PICTUREBOX) {
|
||
// value = ((compo_picturebox_t*)compo)->radix * bsp_vbat_percent_get() / 100;
|
||
// value = MAX(0, MIN(((compo_picturebox_t*)compo)->radix - 1, value));
|
||
value = tjd_charging_show_bat_ui_level();
|
||
}
|
||
sprintf(value_str, "%d", value);
|
||
break;
|
||
|
||
|
||
case COMPO_BOND_KCAL:
|
||
value = getCalorie(SysVariable.curSportRecord.pedo)/1000;
|
||
sprintf(value_str, "%04d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_STEP:
|
||
value = SysVariable.curSportRecord.pedo;
|
||
sprintf(value_str, "%05d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_HEARTRATE:
|
||
value = SysVariable.heartRateModule.lastHeart;
|
||
sprintf(value_str, "%03d", value);
|
||
break;
|
||
|
||
case COMPO_BOND_BLOOD_OXYGEN:
|
||
value = SysVariable.heartRateModule.lastSpo2;
|
||
sprintf(value_str, "%03d", value);
|
||
break;
|
||
|
||
// case COMPO_BOND_BLOOD_SUGER:
|
||
// value = 0;
|
||
// sprintf(value_str, "%d", value);
|
||
// break;
|
||
|
||
case COMPO_BOND_WEATHER:
|
||
// value = sys_cb.weather_idx;
|
||
value = SysVariable.weather.temperature;
|
||
value = weather_temperature_transform(OFFSET(value))/100;
|
||
sprintf(value_str, "%d", value);
|
||
// printf("weather - value = %d\n",value);
|
||
// sprintf(value_str, "%s", i18n[STR_CLOUDY + value]);
|
||
break;// case COMPO_BOND_WEATHER:
|
||
// value = sys_cb.weather_idx;
|
||
// sprintf(value_str, "%s", i18n[STR_CLOUDY + value]);
|
||
// break;
|
||
|
||
// case COMPO_BOND_ATMOMS:
|
||
// value = 0;
|
||
// sprintf(value_str, "%d", value);
|
||
// break;
|
||
|
||
case COMPO_BOND_TEMPERATURE:
|
||
temperature = weather_temperature_transform(OFFSET(SysVariable.weather.temperature)) / 100; //温度
|
||
sprintf(value_str, "%d~%d℃", SysVariable.weather.temperature, SysVariable.weather.temperature); //温度范围
|
||
break;
|
||
|
||
// case COMPO_BOND_ALTITUDE:
|
||
// value = 0;
|
||
// sprintf(value_str, "%d", value);
|
||
// break;
|
||
|
||
case COMPO_BOND_BATTERY:
|
||
// value = sys_cb.vbat_percent;
|
||
value = tjd_charging_show_bat_ui_level()*10;
|
||
if(value== 0xff){
|
||
sprintf(value_str, "--%%");
|
||
}
|
||
else{
|
||
sprintf(value_str, "%d%%", value);
|
||
}
|
||
break;
|
||
|
||
case COMPO_BOND_DISTANCE:
|
||
value = getDistance(SysVariable.curSportRecord.pedo);
|
||
value1 = getDistance(SysVariable.curSportRecord.pedo)-(value*1000)/100;
|
||
if (SysVariable.deviceInfo.distanceUnit == 1) {
|
||
value = value * 621371 / 1000000; // 转英制数据
|
||
}
|
||
value = value /1000;
|
||
// sprintf(value_str, "%02d.%01d", value / 1000, value % 1000 / 100);
|
||
// printf("value / 1000 = %d\n",value,value / 1000);
|
||
sprintf(value_str, "%02d.%d", value,value1);
|
||
break;
|
||
case COMPO_BOND_TEMPERATURE_UNIT:
|
||
if (SysVariable.deviceInfo.distanceUnit == UNIT_TYPE_INCH) {
|
||
value = 1; // 转英制数据
|
||
}
|
||
else
|
||
value = 0;
|
||
break;
|
||
|
||
// case COMPO_BOND_DISTANCE_UNIT:
|
||
// value = 0; //0:km 1:mile
|
||
// //strcpy(value_str, i18n[STR_KM + value]);
|
||
// break;
|
||
case COMPO_BOND_CUSTOM_NEW_YORK:
|
||
if(tm.hour<13)
|
||
{
|
||
value = get_autoformat_hour(tm.hour+24-13);
|
||
}
|
||
else
|
||
{
|
||
value = get_autoformat_hour(tm.hour-13);
|
||
}
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
case COMPO_BOND_CUSTOM_PARIS:
|
||
if(tm.hour<7)
|
||
{
|
||
value = get_autoformat_hour(tm.hour+24-7);
|
||
}
|
||
else{
|
||
value = get_autoformat_hour(tm.hour-7);
|
||
}
|
||
sprintf(value_str, "%02d", value);
|
||
break;
|
||
case COMPO_BOND_CUSTOM_WEATHER_MIN:
|
||
temperature = weather_temperature_transform(OFFSET(SysVariable.weather.minTemp)) / 100; //最低温度
|
||
sprintf(value_str, "%d~%d℃", SysVariable.weather.minTemp, SysVariable.weather.maxTemp); //温度范围
|
||
break;
|
||
case COMPO_BOND_CUSTOM_WEATHER_MAX:
|
||
temperature = weather_temperature_transform(OFFSET(SysVariable.weather.n2day_maxTemp)) / 100; //最高温度
|
||
sprintf(value_str, "%d~%d℃", SysVariable.weather.minTemp, SysVariable.weather.maxTemp); //温度范围
|
||
break;
|
||
case COMPO_BOND_CUSTOM0:
|
||
value = getDistance(SysVariable.curSportRecord.pedo);
|
||
if (SysVariable.deviceInfo.distanceUnit == 1) {
|
||
value = value * 621371 / 1000000; // 转英制数据
|
||
}
|
||
value = value%1000/100;
|
||
break;
|
||
default:
|
||
flag_update = false;
|
||
break;
|
||
}
|
||
|
||
if (flag_update) {
|
||
// printf("bond_data:%d, type:%d, value:%d\n", compo->bond_data, compo->type, value);
|
||
if(compo->bond_data==COMPO_BOND_CUSTOM_WEATHER_MIN ||compo->bond_data==COMPO_BOND_CUSTOM_WEATHER_MAX || compo->bond_data== COMPO_BOND_TEMPERATURE)
|
||
{
|
||
compo_number_t *num = (compo_number_t *)compo;
|
||
compo_number_set(num, temperature);
|
||
compo_number_set_margin(num,0);
|
||
}
|
||
else if (compo->type == COMPO_TYPE_NUMBER) {
|
||
compo_number_t *num = (compo_number_t *)compo;
|
||
if (num->num_part) {
|
||
if (num->num_part > 1) {
|
||
value /= soft_pow(10, num->num_part - 1);
|
||
}
|
||
value %= 10;
|
||
}
|
||
compo_number_set(num, value);
|
||
compo_number_set_margin(num,0);
|
||
// compo_number_set_visible(num, true);
|
||
} else if (compo->type == COMPO_TYPE_TEXTBOX) {
|
||
compo_textbox_t *txt = (compo_textbox_t *)compo;
|
||
compo_textbox_set(txt, value_str);
|
||
// compo_textbox_set_visible(txt, true);
|
||
} else if (compo->type == COMPO_TYPE_PICTUREBOX) {
|
||
compo_picturebox_t *pic = (compo_picturebox_t *)compo;
|
||
|
||
compo_picturebox_cut(pic, value, pic->radix);
|
||
// compo_picturebox_set_visible(pic, true);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置滚动
|
||
* @param[in] rcb : 滚动控制结构体
|
||
* @param[in] txt : 滚动Widget Text
|
||
* @param[in] multiline : 是否为多行竖向滚动
|
||
|
||
**/
|
||
static void compo_set_roll(compo_roll_cb_t *rcb, widget_text_t *txt, bool multiline)
|
||
{
|
||
if (!rcb->mode && !rcb->is_drag) {
|
||
return;
|
||
}
|
||
|
||
static bool flag_drag = false;
|
||
static s32 ddy = 0;
|
||
s32 dx=0,dy=0;
|
||
bool align_center = widget_get_align_center(txt);
|
||
area_t rel_textbox_area = widget_text_get_box_area_rel(txt);
|
||
area_t rel_text_area = widget_text_get_area(txt);
|
||
u16 circ_pixel = widget_text_get_autoroll_circ_pixel(txt);
|
||
// int end_hei = rel_textbox_area.hei * 2 / 3;
|
||
int end_hei = widget_text_get_height();
|
||
bool txt_directoion = widget_text_get_right_align(txt);
|
||
|
||
flag_drag = ctp_get_dxy(&dx, &dy);
|
||
if (flag_drag) { //按下
|
||
|
||
} else { //抬起
|
||
ddy = rcb->offset;
|
||
}
|
||
|
||
switch (rcb->sta) {
|
||
case COMPO_ROLL_STA_IDLE:
|
||
if (flag_drag && rcb->is_drag && multiline) { //多行显示可拖拽
|
||
rcb->tick = tick_get();
|
||
rcb->sta = COMPO_ROLL_STA_ROLL;
|
||
} else if (tick_check_expire(rcb->tick, COMPO_TEXT_AUTOROLL_START_TICK)) {
|
||
rcb->tick = tick_get();
|
||
rcb->sta = COMPO_ROLL_STA_ROLL;
|
||
}
|
||
break;
|
||
|
||
case COMPO_ROLL_STA_ROLL:
|
||
if (flag_drag && rcb->is_drag && multiline) { //多行显示可拖拽
|
||
rcb->tick = tick_get();
|
||
rcb->offset = ddy + dy;
|
||
if (rcb->offset > 0) {
|
||
rcb->offset = 0;
|
||
} else if (rcb->offset < end_hei - rel_text_area.hei) {
|
||
rcb->offset = end_hei - rel_text_area.hei;
|
||
}
|
||
widget_text_set_client(txt, 0, rcb->offset);
|
||
} else if (tick_check_expire(rcb->tick, COMPO_TEXT_AUTOROLL_TICK)) {
|
||
rcb->tick = tick_get();
|
||
if (rcb->mode) {
|
||
rcb->offset += rcb->direction;
|
||
}
|
||
if (multiline) {
|
||
if (rel_text_area.hei + rcb->offset <= end_hei) {
|
||
rcb->sta = COMPO_ROLL_STA_STOP;
|
||
}
|
||
widget_text_set_client(txt, 0, rcb->offset);
|
||
|
||
} else {
|
||
int end_wid = 0;
|
||
rel_text_area.wid = align_center ? rel_text_area.wid / 2 : rel_text_area.wid; //文本居中时,宽度需要/2,防止滚完导致C208蓝屏
|
||
if (txt_directoion) {
|
||
#if COMPO_TEXT_AUTOROLL_DIRECTION
|
||
end_wid = rel_textbox_area.wid * 1 / 3;
|
||
if ((rcb->offset <= -(rel_text_area.wid * 1 / 3 + end_wid)) || (rcb->offset >= end_wid)) {
|
||
rcb->direction = -rcb->direction;
|
||
}
|
||
#else
|
||
if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) {
|
||
end_wid = 0;
|
||
} else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL) {
|
||
end_wid = rel_text_area.wid;
|
||
if (rel_textbox_area.wid < rel_text_area.wid / 3) {
|
||
end_wid += (rel_text_area.wid / 3 - rel_textbox_area.wid);
|
||
}
|
||
}
|
||
|
||
if (rcb->offset > end_wid) {
|
||
if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) {
|
||
rcb->offset = -(rel_text_area.wid * (1 + align_center) + circ_pixel);
|
||
} else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL) {
|
||
rcb->sta = COMPO_ROLL_STA_STOP;
|
||
}
|
||
}
|
||
#endif
|
||
} else {
|
||
#if COMPO_TEXT_AUTOROLL_DIRECTION
|
||
end_wid = rel_textbox_area.wid * 1 / 3;
|
||
if ((rcb->offset <= -(rel_text_area.wid * 1 / 3 + end_wid)) || (rcb->offset >= end_wid)) {
|
||
rcb->direction = -rcb->direction;
|
||
}
|
||
#else
|
||
s16 circ_end_wid = align_center ? (rel_text_area.wid * 2 + circ_pixel) : (rel_text_area.wid + circ_pixel);
|
||
if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) {
|
||
end_wid = circ_end_wid;
|
||
} else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL) {
|
||
end_wid = rel_text_area.wid * 2 / 3;
|
||
}
|
||
|
||
if (rel_textbox_area.wid < rel_text_area.wid / 3) {
|
||
end_wid += (rel_text_area.wid / 3 - rel_textbox_area.wid);
|
||
}
|
||
if (rcb->offset < -end_wid) {
|
||
if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC) {
|
||
rcb->offset = 0;
|
||
} else if (rcb->mode == TEXT_AUTOROLL_MODE_SROLL){
|
||
rcb->sta = COMPO_ROLL_STA_STOP;
|
||
}
|
||
|
||
}
|
||
#endif
|
||
}
|
||
widget_text_set_client(txt, rcb->offset, 0);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_ROLL_STA_STOP:
|
||
if (flag_drag && rcb->is_drag && multiline) { //多行显示可拖拽
|
||
rcb->tick = tick_get();
|
||
rcb->sta = COMPO_ROLL_STA_ROLL;
|
||
} else if (tick_check_expire(rcb->tick, COMPO_TEXT_AUTOROLL_STOP_TICK)) {
|
||
rcb->tick = tick_get();
|
||
rcb->sta = COMPO_ROLL_STA_IDLE;
|
||
if (multiline) {
|
||
rcb->offset = 0;
|
||
widget_text_set_client(txt, 0, rcb->offset);
|
||
} else {
|
||
rcb->offset = (txt_directoion && rcb->mode) ? -rel_text_area.wid : 0;
|
||
if (txt_directoion && (rcb->mode == TEXT_AUTOROLL_MODE_SROLL_CIRC)) {
|
||
rcb->offset = -rel_text_area.wid;
|
||
} else {
|
||
rcb->offset = 0;
|
||
}
|
||
//居中对齐且存在滚动时从最左边开始滚动
|
||
if (rcb->direction && widget_get_align_center(txt)) {
|
||
rcb->offset = (rel_text_area.wid - rel_textbox_area.wid) / 2;
|
||
}
|
||
widget_text_set_client(txt, rcb->offset, 0);
|
||
}
|
||
}
|
||
break;
|
||
|
||
default:
|
||
halt(HALT_GUI_COMPO_ROLL);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 设置组件更新
|
||
* @param[in] tm : 时间tm结构体
|
||
* @param[in] mtime : 毫秒
|
||
**/
|
||
void compo_set_update(tm_t tm, u16 mtime)
|
||
{
|
||
component_t *compo = compo_get_head();
|
||
s16 angle_h, angle_m, angle_s;
|
||
char time_str[16];
|
||
|
||
angle_h = tm.hour * 300 + tm.min * 5 + tm.sec / 12;
|
||
angle_m = tm.min * 60 + tm.sec;
|
||
//angle_s = tm.sec * 60 + mtime / 100 * 6 - 900; //按100ms对齐
|
||
angle_s = tm.sec * 60 + mtime * 3 / 100 * 2; //按33ms(0.2度)对齐
|
||
//angle_s = tm.sec * 60 + mtime * 6 / 100 - 900; //按实际ms
|
||
|
||
//printf("%d %d %d\n", angle_h, angle_m, angle_s);
|
||
while (compo != NULL) {
|
||
switch (compo->type) {
|
||
case COMPO_TYPE_DATETIME:
|
||
{
|
||
s16 angle = 0;
|
||
switch (compo->bond_data) {
|
||
case COMPO_BOND_HOUR:
|
||
angle = angle_h;
|
||
break;
|
||
|
||
case COMPO_BOND_MINUTE:
|
||
angle = angle_m;
|
||
break;
|
||
|
||
case COMPO_BOND_SECOND:
|
||
angle = angle_s;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
if (angle) {
|
||
compo_datetime_t *dtime = (compo_datetime_t *)compo;
|
||
angle -= dtime->start_angle;
|
||
angle = dtime->anticlockwise ? (3600 - angle) : angle;
|
||
widget_image_set_rotation(dtime->img, angle);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_TYPE_ICONLIST:
|
||
{
|
||
s16 angle = 0;
|
||
compo_iconlist_t *iconlist = (compo_iconlist_t *)compo;
|
||
if (iconlist->hour != NULL) {
|
||
angle = angle_h - iconlist->start_angle;
|
||
widget_image_set_rotation(iconlist->hour, angle);
|
||
}
|
||
if (iconlist->min != NULL) {
|
||
angle = angle_m - iconlist->start_angle;
|
||
widget_image_set_rotation(iconlist->min, angle);
|
||
}
|
||
if (iconlist->sec != NULL) {
|
||
angle = angle_s - iconlist->start_angle;
|
||
widget_image_set_rotation(iconlist->sec, angle);
|
||
}
|
||
if (iconlist->page_time != NULL) {
|
||
//同步时钟图标Alpha值
|
||
widget_set_alpha(iconlist->page_time , widget_get_alpha(iconlist->time_bg));
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_TYPE_LISTBOX:
|
||
{
|
||
compo_listbox_t *listbox = (compo_listbox_t *)compo;
|
||
int i;
|
||
for (i=0; i<LISTBOX_ITEM_CNT; i++) {
|
||
compo_set_roll(&listbox->roll_cb[i], listbox->item_text[i], false); //滚动
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_TYPE_DISKLIST:
|
||
{
|
||
compo_disklist_t *disklist = (compo_disklist_t *)compo;
|
||
int i;
|
||
for (i=0; i<DISKLIST_ITEM_CNT; i++) {
|
||
compo_set_roll(&disklist->roll_cb[i], disklist->item_text[i], false); //滚动
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_TYPE_CARDBOX:
|
||
{
|
||
compo_cardbox_t *cardbox = (compo_cardbox_t *)compo;
|
||
if (cardbox->text[0]) {
|
||
compo_set_roll(&cardbox->roll_cb, cardbox->text[0], false); //滚动
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_TYPE_FORM:
|
||
{
|
||
compo_form_t *frm = (compo_form_t *)compo;
|
||
if (widget_get_visble(frm->time)) {
|
||
if (SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR)
|
||
sprintf(time_str, "%02d:%02d%s", get_autoformat_hour(tm.hour), tm.min, tm.hour >= 12 ? "PM" : "AM");
|
||
else
|
||
sprintf(time_str, "%02d:%02d", tm.hour, tm.min);
|
||
widget_text_set(frm->time, time_str);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case COMPO_TYPE_NUMBER:
|
||
case COMPO_TYPE_PICTUREBOX:
|
||
compo_set_bonddata(compo, tm);
|
||
break;
|
||
|
||
case COMPO_TYPE_TEXTBOX:
|
||
compo_set_bonddata(compo, tm); //设置绑定数据
|
||
compo_textbox_t *textbox = (compo_textbox_t *)compo;
|
||
compo_set_roll(&textbox->roll_cb, textbox->txt, textbox->multiline); //滚动
|
||
break;
|
||
|
||
case COMPO_TYPE_ANIMATION:
|
||
compo_animation_process((compo_animation_t *)compo);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
compo = compo_get_next(compo); //遍历组件
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 获取按键ID
|
||
**/
|
||
int compo_get_button_id(void)
|
||
{
|
||
point_t pt = ctp_get_sxy();
|
||
component_t *compo = (component_t *)compo_pool_get_top();
|
||
while (compo != NULL) {
|
||
if (compo->type == COMPO_TYPE_BUTTON) {
|
||
compo_button_t *btn = (compo_button_t *)compo;
|
||
rect_t rect = widget_get_absolute(btn->widget);
|
||
|
||
if (abs_s(pt.x - rect.x) * 2 <= rect.wid && abs_s(pt.y - rect.y) * 2 <= rect.hei) {
|
||
return btn->id;
|
||
}
|
||
}
|
||
compo = compo_get_next(compo); //遍历组件
|
||
}
|
||
return ID_NULL;
|
||
}
|
||
|
||
|
||
/**author :gzj
|
||
* @brief 获取不居中 按键id
|
||
**/
|
||
int compo_get_align_center_false_button_id(void)
|
||
{
|
||
point_t pt = ctp_get_sxy();
|
||
component_t *compo = (component_t *)compo_pool_get_top();
|
||
while (compo != NULL) {
|
||
if (compo->type == COMPO_TYPE_BUTTON) {
|
||
compo_button_t *btn = (compo_button_t *)compo;
|
||
rect_t rect = widget_get_absolute(btn->widget);
|
||
if (abs_s(pt.x - rect.x) <= rect.wid && abs_s(pt.y - rect.y) <= rect.hei) {
|
||
return btn->id;
|
||
}
|
||
}
|
||
compo = compo_get_next(compo); //遍历组件
|
||
}
|
||
return ID_NULL;
|
||
}
|