1382 lines
34 KiB
C
1382 lines
34 KiB
C
#include "ui/ui.h"
|
||
#include "app_config.h"
|
||
#include "ui/ui_style.h"
|
||
#include "ui/ui_api.h"
|
||
#include "app_task.h"
|
||
#include "system/timer.h"
|
||
#include "key_event_deal.h"
|
||
#include "audio_config.h"
|
||
#include "jiffies.h"
|
||
#include "system/timer.h"
|
||
#include "system/includes.h"
|
||
#include "rtc/alarm.h"
|
||
#include "app_power_manage.h"
|
||
#include "asm/charge.h"
|
||
#ifndef CONFIG_MEDIA_NEW_ENABLE
|
||
#include "application/audio_eq_drc_apply.h"
|
||
#else
|
||
#include "audio_eq.h"
|
||
#endif
|
||
|
||
#if (TCFG_UI_ENABLE&&(CONFIG_UI_STYLE == STYLE_JL_SOUNDBOX))
|
||
#if (TCFG_APP_RTC_EN)
|
||
|
||
#define STYLE_NAME JL
|
||
|
||
extern int ui_hide_main(int id);
|
||
extern int ui_show_main(int id);
|
||
extern void key_ui_takeover(u8 on);
|
||
extern void power_off_deal(struct sys_event *event, u8 step);
|
||
|
||
struct rtc_ui_opr {
|
||
void *dev_handle;
|
||
int timer;
|
||
};
|
||
|
||
static struct rtc_ui_opr *__this = NULL;
|
||
|
||
|
||
/* static int test_timer =0; */
|
||
|
||
/************************************************************
|
||
电池控件事件
|
||
************************************************************/
|
||
|
||
static void battery_timer(void *priv)
|
||
{
|
||
int incharge = 0;//充电标志
|
||
int id = (int)(priv);
|
||
static u8 percent = 0;
|
||
static u8 percent_last = 0;
|
||
if (1 || get_charge_online_flag()) { //充电时候图标动态效果
|
||
if (percent > get_vbat_percent()) {
|
||
percent = 0;
|
||
}
|
||
ui_battery_set_level_by_id(id, percent, incharge); //充电标志,ui可以显示不一样的图标
|
||
percent += 20;
|
||
} else {
|
||
|
||
percent = get_vbat_percent();
|
||
if (percent != percent_last) {
|
||
ui_battery_set_level_by_id(id, percent, incharge); //充电标志,ui可以显示不一样的图标,需要工具设置
|
||
percent_last = percent;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
static int battery_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_battery *battery = (struct ui_battery *)ctr;
|
||
static u32 timer = 0;
|
||
int incharge = 0;//充电标志
|
||
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
ui_battery_set_level(battery, get_vbat_percent(), incharge);
|
||
if (!timer) {
|
||
timer = sys_timer_add((void *)battery->elm.id, battery_timer, 1 * 1000); //传入的id就是BT_BAT
|
||
}
|
||
break;
|
||
case ON_CHANGE_FIRST_SHOW:
|
||
break;
|
||
case ON_CHANGE_RELEASE:
|
||
if (timer) {
|
||
sys_timer_del(timer);
|
||
timer = 0;
|
||
}
|
||
break;
|
||
default:
|
||
return false;
|
||
}
|
||
return false;
|
||
}
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_BAT)
|
||
.onchange = battery_onchange,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
|
||
static void timer_add_update(void *p)
|
||
{
|
||
struct utime time_r;
|
||
struct sys_time current_time;
|
||
dev_ioctl(__this->dev_handle, IOCTL_GET_SYS_TIME, (u32)¤t_time);
|
||
|
||
time_r.year = current_time.year;//, jiffies /1 %3000;
|
||
time_r.month = current_time.month;//jiffies /2 %12;
|
||
time_r.day = current_time.day;//jiffies /3 %30;
|
||
|
||
time_r.hour = current_time.hour;//jiffies /4 % 60;
|
||
time_r.min = current_time.min;//jiffies /5 %60;
|
||
time_r.sec = current_time.sec;//jiffies /6 %60;
|
||
|
||
if (ui_get_disp_status_by_id(CLOCK_TIME_YMD) > 0) {
|
||
ui_time_update_by_id(CLOCK_TIME_YMD, &time_r);
|
||
}
|
||
|
||
if (ui_get_disp_status_by_id(CLOCK_TIME_HMS) > 0) {
|
||
ui_time_update_by_id(CLOCK_TIME_HMS, &time_r);
|
||
}
|
||
}
|
||
|
||
|
||
/************************************************************
|
||
时钟主页窗口控件
|
||
************************************************************/
|
||
static int clock_mode_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct window *window = (struct window *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
puts("\n***clock_mode_onchange***\n");
|
||
/* key_ui_takeover(1); */
|
||
|
||
if (!__this) {
|
||
__this = zalloc(sizeof(struct rtc_ui_opr));
|
||
}
|
||
__this->dev_handle = dev_open("rtc", NULL);
|
||
|
||
if (!__this->dev_handle) {
|
||
free(__this);
|
||
__this = NULL;
|
||
break;
|
||
}
|
||
|
||
if (!__this->timer) {
|
||
__this->timer = sys_timer_add(NULL, timer_add_update, 500);
|
||
}
|
||
|
||
|
||
/*
|
||
* 注册APP消息响应
|
||
*/
|
||
break;
|
||
case ON_CHANGE_RELEASE:
|
||
|
||
if (__this && __this->timer) {
|
||
sys_timer_del(__this->timer);
|
||
__this->timer = 0;
|
||
}
|
||
|
||
if (__this && __this->dev_handle) {
|
||
dev_close(__this->dev_handle);
|
||
__this->dev_handle = 0;
|
||
}
|
||
|
||
if (__this) {
|
||
free(__this);
|
||
__this = NULL;
|
||
}
|
||
|
||
break;
|
||
default:
|
||
return false;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ID_WINDOW_CLOCK)
|
||
.onchange = clock_mode_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/************************************************************
|
||
时钟显示界面的布局控件
|
||
************************************************************/
|
||
|
||
|
||
static int clock_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
break;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
static int clock_layout_onkey(void *ctr, struct element_key_event *e)
|
||
{
|
||
printf("clock_layout_onkey %d\n", e->value);
|
||
switch (e->value) {
|
||
case KEY_MENU:
|
||
if (ui_get_disp_status_by_id(CLOCK_MENU_LAYOUT) <= 0) {
|
||
printf("CLOCK_MENU_LAYOUT\n");
|
||
ui_show(CLOCK_MENU_LAYOUT);
|
||
}
|
||
break;
|
||
case KEY_UP:
|
||
case KEY_DOWN:
|
||
break;
|
||
case KEY_VOLUME_INC:
|
||
case KEY_VOLUME_DEC:
|
||
if (ui_get_disp_status_by_id(CLOCK_VOL_LAYOUT) <= 0) {
|
||
ui_hide(CLOCK_LAYOUT);
|
||
ui_show(CLOCK_VOL_LAYOUT);
|
||
}
|
||
break;
|
||
case KEY_MODE:
|
||
ui_hide_curr_main();
|
||
ui_show_main(ID_WINDOW_SYS);
|
||
break;
|
||
case KEY_POWER_START:
|
||
case KEY_POWER:
|
||
power_off_deal(NULL, e->value - KEY_POWER_START);
|
||
break;
|
||
default:
|
||
return false;
|
||
break;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_LAYOUT)
|
||
.onchange = clock_layout_onchange,
|
||
.onkey = clock_layout_onkey,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
|
||
/************************************************************
|
||
时钟显示菜单的列表控件
|
||
************************************************************/
|
||
static int clock_menu_list_onkey(void *ctr, struct element_key_event *e)
|
||
{
|
||
struct ui_grid *grid = (struct ui_grid *)ctr;
|
||
int sel_item = 0;
|
||
printf("ui key %s %d\n", __FUNCTION__, e->value);
|
||
switch (e->value) {
|
||
case KEY_OK:
|
||
sel_item = ui_grid_cur_item(grid);
|
||
switch (sel_item) {
|
||
case 0:
|
||
ui_show(CLOCK_TIME_SET_LAYOUT);
|
||
break;
|
||
case 1:
|
||
ui_show(CLOCK_ALM_SET_LAYOUT);
|
||
break;
|
||
case 2:
|
||
ui_hide(CLOCK_MENU_LAYOUT);
|
||
break;
|
||
}
|
||
break;
|
||
default:
|
||
return false;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_MENU_LIST)
|
||
.onchange = NULL,
|
||
.onkey = clock_menu_list_onkey,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
/************************************************************
|
||
时钟音量设置布局控件
|
||
************************************************************/
|
||
static u16 vol_timer = 0;
|
||
static void clock_vol_lay_timeout(void *p)
|
||
{
|
||
int id = (int)(p);
|
||
if (ui_get_disp_status_by_id(id) == TRUE) {
|
||
ui_hide(id);
|
||
ui_show(CLOCK_LAYOUT);
|
||
}
|
||
vol_timer = 0;
|
||
}
|
||
|
||
|
||
static void vol_init(int id)
|
||
{
|
||
struct unumber num;
|
||
num.type = TYPE_NUM;
|
||
num.numbs = 1;
|
||
num.number[0] = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
||
ui_number_update_by_id(CLOCK_VOL_NUM, &num);
|
||
}
|
||
|
||
static int clock_vol_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct layout *layout = (struct layout *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
if (!vol_timer) {
|
||
vol_timer = sys_timer_add((void *)layout->elm.id, clock_vol_lay_timeout, 3000);
|
||
}
|
||
break;
|
||
|
||
case ON_CHANGE_FIRST_SHOW:
|
||
ui_set_call(vol_init, 0);
|
||
/* ui_number_update_by_id(CLOCK_VOL_NUM,&num); */
|
||
break;
|
||
|
||
case ON_CHANGE_SHOW_POST:
|
||
break;
|
||
|
||
case ON_CHANGE_RELEASE:
|
||
if (vol_timer) {
|
||
sys_timeout_del(vol_timer);
|
||
vol_timer = 0;
|
||
}
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
static int clock_vol_layout_onkey(void *ctr, struct element_key_event *e)
|
||
{
|
||
printf("clock_vol_layout_onkey %d\n", e->value);
|
||
struct unumber num;
|
||
u8 vol;
|
||
|
||
if (vol_timer) {
|
||
sys_timer_modify(vol_timer, 3000);
|
||
}
|
||
|
||
|
||
switch (e->value) {
|
||
case KEY_MENU:
|
||
break;
|
||
|
||
case KEY_UP:
|
||
case KEY_VOLUME_INC:
|
||
app_audio_volume_up(1);
|
||
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
||
num.type = TYPE_NUM;
|
||
num.numbs = 1;
|
||
num.number[0] = vol;
|
||
ui_number_update_by_id(CLOCK_VOL_NUM, &num);
|
||
break;
|
||
case KEY_DOWN:
|
||
case KEY_VOLUME_DEC:
|
||
app_audio_volume_down(1);
|
||
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
||
num.type = TYPE_NUM;
|
||
num.numbs = 1;
|
||
num.number[0] = vol;
|
||
ui_number_update_by_id(CLOCK_VOL_NUM, &num);
|
||
break;
|
||
default:
|
||
return false;
|
||
break;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_VOL_LAYOUT)
|
||
.onchange = clock_vol_layout_onchange,
|
||
.onkey = clock_vol_layout_onkey,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
/***************************** 时间显示控件初始化 ************************************/
|
||
static int clock_timer_show_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_time *time = (struct ui_time *)ctr;
|
||
struct sys_time current_time;
|
||
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
dev_ioctl(__this->dev_handle, IOCTL_GET_SYS_TIME, (u32)¤t_time);
|
||
time->year = current_time.year;
|
||
time->month = current_time.month;
|
||
time->day = current_time.day;
|
||
time->hour = current_time.hour;
|
||
time->min = current_time.min;
|
||
time->sec = current_time.sec;
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIME_YMD)
|
||
.onchange = clock_timer_show_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIME_HMS)
|
||
.onchange = clock_timer_show_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
/***************************** 日期时间设置 ************************************/
|
||
struct time_setting {
|
||
const char *mark;
|
||
u32 time_id;
|
||
u16 time_value;
|
||
};
|
||
static struct time_setting time_set_table[] = {
|
||
{"year", CLOCK_TIMER_YEAR, 0},
|
||
{"month", CLOCK_TIMER_MONTH, 0},
|
||
{"day", CLOCK_TIMER_DAY, 0},
|
||
{"hour", CLOCK_TIMER_HOUR, 0},
|
||
{"min", CLOCK_TIMER_MINUTE, 0},
|
||
{"sec", CLOCK_TIMER_SECOND, 0},
|
||
};
|
||
enum sw_dir { /* 切换方向 */
|
||
DIR_NEXT = 1,
|
||
DIR_PREV,
|
||
DIR_SET,
|
||
};
|
||
enum set_mod { /* 加减时间方向 */
|
||
MOD_ADD = 1,
|
||
MOD_DEC,
|
||
MOD_SET,
|
||
};
|
||
|
||
static void get_sys_time(struct sys_time *time)
|
||
{
|
||
void *fd = dev_open("rtc", NULL);
|
||
if (!fd) {
|
||
memset(time, 0, sizeof(*time));
|
||
return;
|
||
}
|
||
dev_ioctl(fd, IOCTL_GET_SYS_TIME, (u32)time);
|
||
/* printf("get_sys_time : %d-%d-%d,%d:%d:%d\n", time->year, time->month, time->day, time->hour, time->min, time->sec); */
|
||
dev_close(fd);
|
||
}
|
||
static u16 time_set_p = 0xff; /* time_set_table的当前设置指针 */
|
||
static u8 __time_search_by_mark(const char *mark)
|
||
{
|
||
u16 p = 0;
|
||
u16 table_sum = sizeof(time_set_table) / sizeof(struct time_setting);
|
||
while (p < table_sum) {
|
||
if (!strcmp(mark, time_set_table[p].mark)) {
|
||
return p;
|
||
}
|
||
p++;
|
||
}
|
||
return -1;
|
||
}
|
||
static u8 __time_set_switch(enum sw_dir dir, const char *mark)
|
||
{
|
||
u16 table_sum;
|
||
u16 prev_set_p = time_set_p;
|
||
u8 p;
|
||
printf("__time_set_switch dir: %d\n", dir);
|
||
table_sum = sizeof(time_set_table) / sizeof(struct time_setting);
|
||
ASSERT(dir == DIR_NEXT || dir == DIR_PREV || dir == DIR_SET);
|
||
switch (dir) {
|
||
case DIR_NEXT:
|
||
if (time_set_p >= (table_sum - 1)) {
|
||
time_set_p = 0;
|
||
} else {
|
||
time_set_p++;
|
||
}
|
||
break;
|
||
case DIR_PREV:
|
||
if (time_set_p >= (table_sum - 1)) {
|
||
time_set_p = 0;
|
||
}
|
||
|
||
|
||
if (time_set_p == 0) {
|
||
time_set_p = (table_sum - 1);
|
||
} else {
|
||
time_set_p--;
|
||
}
|
||
break;
|
||
case DIR_SET:
|
||
p = __time_search_by_mark(mark);
|
||
if (p == (u8) - 1) {
|
||
return -1;
|
||
}
|
||
time_set_p = p;
|
||
|
||
break;
|
||
}
|
||
if (prev_set_p != 0xff) {
|
||
ui_no_highlight_element_by_id(time_set_table[prev_set_p].time_id);
|
||
}
|
||
|
||
ui_highlight_element_by_id(time_set_table[time_set_p].time_id);
|
||
printf("__time_set_switch ok.\n");
|
||
return 0;
|
||
}
|
||
static u8 __time_set_reset(void)
|
||
{
|
||
struct sys_time time;
|
||
|
||
time_set_p = 0xff;
|
||
/*
|
||
* 此处应该读取系统RTC时间
|
||
*/
|
||
get_sys_time(&time);
|
||
|
||
time_set_table[0].time_value = time.year;
|
||
time_set_table[1].time_value = time.month;
|
||
time_set_table[2].time_value = time.day;
|
||
time_set_table[3].time_value = time.hour;
|
||
time_set_table[4].time_value = time.min;
|
||
time_set_table[5].time_value = time.sec;
|
||
|
||
return 0;
|
||
}
|
||
const u16 leap_month_table[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||
static u8 __is_leap_year(u16 year)
|
||
{
|
||
return (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0));
|
||
}
|
||
static u8 __time_update_show(u8 pos) /* 更新单个时间控件的时间 */
|
||
{
|
||
struct utime t;
|
||
t.year = time_set_table[0].time_value;
|
||
t.month = time_set_table[1].time_value;
|
||
t.day = time_set_table[2].time_value;
|
||
t.hour = time_set_table[3].time_value;
|
||
t.min = time_set_table[4].time_value;
|
||
t.sec = time_set_table[5].time_value;
|
||
ui_time_update_by_id(time_set_table[pos].time_id, &t);
|
||
return 0;
|
||
}
|
||
static u8 __time_set_value(enum set_mod mod, u16 value)
|
||
{
|
||
|
||
enum set_mod need_check = 0;
|
||
u16 year, month, day;
|
||
ASSERT(mod == MOD_ADD || mod == MOD_DEC || mod == MOD_SET);
|
||
switch (mod) {
|
||
case MOD_ADD:
|
||
switch (time_set_p) {
|
||
case 0: /* year */
|
||
value = time_set_table[time_set_p].time_value + 1;
|
||
if (value >= 2100) {
|
||
value = 2099;
|
||
}
|
||
need_check = MOD_ADD;
|
||
break;
|
||
case 1: /* month */
|
||
value = time_set_table[time_set_p].time_value + 1;
|
||
if (value > 12) {
|
||
value = 1;
|
||
}
|
||
need_check = MOD_ADD;
|
||
break;
|
||
case 2: /* day */
|
||
month = time_set_table[1].time_value;
|
||
ASSERT(month >= 1 && month <= 12);
|
||
value = time_set_table[time_set_p].time_value + 1;
|
||
if (value > leap_month_table[month - 1]) {
|
||
value = 1;
|
||
}
|
||
need_check = MOD_ADD;
|
||
break;
|
||
case 3: /* hour */
|
||
value = time_set_table[time_set_p].time_value + 1;
|
||
if (value > 23) {
|
||
value = 0;
|
||
}
|
||
break;
|
||
case 4: /* min */
|
||
value = time_set_table[time_set_p].time_value + 1;
|
||
if (value > 59) {
|
||
value = 0;
|
||
}
|
||
break;
|
||
case 5: /* sec */
|
||
value = time_set_table[time_set_p].time_value + 1;
|
||
if (value > 59) {
|
||
value = 0;
|
||
}
|
||
break;
|
||
default:
|
||
/* ASSERT(0, "mod_add time_set_p:%d err!", time_set_p); */
|
||
return 0;
|
||
break;
|
||
}
|
||
break;
|
||
case MOD_DEC:
|
||
switch (time_set_p) {
|
||
case 0: /* year */
|
||
value = time_set_table[time_set_p].time_value - 1;
|
||
if (value <= 2000) {
|
||
value = 2001;
|
||
}
|
||
need_check = MOD_DEC;
|
||
break;
|
||
case 1: /* month */
|
||
value = time_set_table[time_set_p].time_value;
|
||
if (value == 1) {
|
||
value = 12;
|
||
} else {
|
||
value--;
|
||
}
|
||
need_check = MOD_DEC;
|
||
break;
|
||
case 2: /* day */
|
||
value = time_set_table[time_set_p].time_value;
|
||
if (value == 1) {
|
||
month = time_set_table[1].time_value;
|
||
ASSERT(month >= 1 && month <= 12);
|
||
value = leap_month_table[month - 1];
|
||
} else {
|
||
value--;
|
||
}
|
||
need_check = MOD_DEC;
|
||
break;
|
||
case 3: /* hour */
|
||
value = time_set_table[time_set_p].time_value;
|
||
if (value == 0) {
|
||
value = 23;
|
||
} else {
|
||
value--;
|
||
}
|
||
break;
|
||
case 4: /* min */
|
||
value = time_set_table[time_set_p].time_value;
|
||
if (value == 0) {
|
||
value = 59;
|
||
} else {
|
||
value--;
|
||
}
|
||
break;
|
||
case 5: /* sec */
|
||
value = time_set_table[time_set_p].time_value;
|
||
if (value == 0) {
|
||
value = 59;
|
||
} else {
|
||
value--;
|
||
}
|
||
break;
|
||
default:
|
||
/* ASSERT(0, "mod_dec time_set_p:%d err!", time_set_p); */
|
||
|
||
return 0;
|
||
break;
|
||
}
|
||
break;
|
||
case MOD_SET:
|
||
switch (time_set_p) {
|
||
case 0: /* year */
|
||
need_check = MOD_SET;
|
||
break;
|
||
case 1: /* month */
|
||
ASSERT(value >= 1 && value <= 12);
|
||
need_check = MOD_SET;
|
||
break;
|
||
case 2: /* day */
|
||
need_check = MOD_SET;
|
||
break;
|
||
case 3: /* hour */
|
||
ASSERT(value >= 0 && value <= 23);
|
||
break;
|
||
case 4: /* min */
|
||
ASSERT(value >= 0 && value <= 59);
|
||
break;
|
||
case 5: /* sec */
|
||
ASSERT(value >= 0 && value <= 59);
|
||
break;
|
||
default:
|
||
/* ASSERT(0, "mod_set time_set_p:%d err!", time_set_p); */
|
||
|
||
return 0;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
time_set_table[time_set_p].time_value = value;
|
||
|
||
if (need_check) {
|
||
year = time_set_table[0].time_value;
|
||
month = time_set_table[1].time_value;
|
||
day = time_set_table[2].time_value;
|
||
if (month == 2 && !__is_leap_year(year)) {
|
||
if (day >= 29) {
|
||
if (need_check == MOD_ADD) {
|
||
day = 1;
|
||
} else if (need_check == MOD_DEC) {
|
||
day = 28;
|
||
} else {
|
||
day = 28;
|
||
}
|
||
time_set_table[2].time_value = day;
|
||
__time_update_show(2); /* 调整day数值显示 */
|
||
}
|
||
|
||
} else {
|
||
if (day > leap_month_table[month - 1]) {
|
||
day = leap_month_table[month - 1];
|
||
time_set_table[2].time_value = day;
|
||
__time_update_show(2); /* 调整day数值显示 */
|
||
}
|
||
}
|
||
}
|
||
__time_update_show(time_set_p); /* 更新当前位数值显示 */
|
||
|
||
return 0;
|
||
}
|
||
static int __time_get(struct sys_time *t)
|
||
{
|
||
t->year = time_set_table[0].time_value;
|
||
t->month = time_set_table[1].time_value;
|
||
t->day = time_set_table[2].time_value;
|
||
t->hour = time_set_table[3].time_value;
|
||
t->min = time_set_table[4].time_value;
|
||
t->sec = time_set_table[5].time_value;
|
||
return 0;
|
||
}
|
||
|
||
|
||
extern void rtc_update_time_api(struct sys_time *time);
|
||
static int menu_sys_time_set()
|
||
{
|
||
struct sys_time t;
|
||
|
||
__time_get(&t);
|
||
|
||
rtc_update_time_api(&t);
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
/************************************************************
|
||
时钟置布局控件
|
||
************************************************************/
|
||
//是时钟初始化消息入口
|
||
static void __time_set_switch_init(int id)
|
||
{
|
||
__time_set_switch(DIR_SET, "year");//设置默认高亮的选项,可以是year day
|
||
/* __time_set_switch(DIR_SET, NULL); */
|
||
}
|
||
|
||
|
||
static int time_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct layout *layout = (struct layout *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
puts("time_layout_onchange onfocus.\n");
|
||
layout_on_focus(layout);//设置焦点在本布局(如果布局下还有列表,焦点会最后显示出的列表这里,防止焦点不在,可以把焦点控制在本布局)
|
||
__time_set_reset();//初始化一些信息
|
||
break;
|
||
case ON_CHANGE_RELEASE:
|
||
puts("time_layout_onchange losefocus.\n");
|
||
layout_lose_focus(layout);//失去本焦点
|
||
break;
|
||
case ON_CHANGE_FIRST_SHOW:
|
||
puts("time_layout_onchange ON_CHANGE_FIRST_SHOW.\n");
|
||
ui_set_call(__time_set_switch_init, 0);
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//是时钟消息入口,控制设置显示的选项和加减
|
||
static int time_layout_onkey(void *ctr, struct element_key_event *e)
|
||
{
|
||
|
||
switch (e->value) {
|
||
case KEY_OK:
|
||
puts("time_layout_onkey KEY_OK.\n");
|
||
__time_set_switch(DIR_NEXT, NULL);//切换选项
|
||
|
||
break;
|
||
case KEY_VOLUME_DEC:
|
||
case KEY_DOWN:
|
||
__time_set_value(MOD_ADD, 0);
|
||
|
||
break;
|
||
case KEY_VOLUME_INC:
|
||
case KEY_UP:
|
||
__time_set_value(MOD_DEC, 0);
|
||
|
||
break;
|
||
case KEY_MODE:
|
||
case KEY_MENU:
|
||
menu_sys_time_set();//保存设置
|
||
ui_hide(CLOCK_TIME_SET_LAYOUT);//退出当前布局
|
||
break;
|
||
default:
|
||
return false;
|
||
break;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIME_SET_LAYOUT)
|
||
.onchange = time_layout_onchange,
|
||
.onkey = time_layout_onkey,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
//如果不对控件进行初始化,默认显示0的,因此需要对控件进行初始先
|
||
/***************************** 系统时间各个数字动作 ************************************/
|
||
static int clock_timer_sys_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_time *time = (struct ui_time *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
puts("timer_sys_onchange .\n");
|
||
time->year = time_set_table[0].time_value;
|
||
time->month = time_set_table[1].time_value;
|
||
time->day = time_set_table[2].time_value;
|
||
time->hour = time_set_table[3].time_value;
|
||
time->min = time_set_table[4].time_value;
|
||
time->sec = time_set_table[5].time_value;
|
||
break;
|
||
#if 0
|
||
case ON_CHANGE_SHOW_POST:
|
||
printf("~~~~~~~~~~~~%x\n", time->text.elm.id);
|
||
if (time->text.elm.highlight) {
|
||
printf("~~~~~~~~~~~~%x\n", time->text.elm.id);
|
||
/* ui_invert_element_by_id(time->text.elm.id); */
|
||
}
|
||
break;
|
||
#endif
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIMER_YEAR)
|
||
.onchange = clock_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIMER_MONTH)
|
||
.onchange = clock_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIMER_DAY)
|
||
.onchange = clock_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIMER_HOUR)
|
||
.onchange = clock_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIMER_MINUTE)
|
||
.onchange = clock_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_TIMER_SECOND)
|
||
.onchange = clock_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
|
||
/***************************** 闹钟日期时间设置 ************************************/
|
||
|
||
static const int alm_rep_list[] = {
|
||
ALM_SUN,
|
||
ALM_MON,
|
||
ALM_TUE,
|
||
ALM_WED,
|
||
ALM_THU,
|
||
ALM_FRI,
|
||
ALM_SAT,
|
||
};
|
||
|
||
|
||
struct alm_data_rep {
|
||
int rep_set;
|
||
int mask;
|
||
};
|
||
|
||
static struct time_setting alm_set_table[] = {
|
||
{"hour", ALM_H, 0},
|
||
{"min", ALM_M, 0},
|
||
{"rep", 0, 0},
|
||
{"sw", ALM_SW, 0},
|
||
};
|
||
|
||
|
||
struct alm_data_rep alm_rep[] = {
|
||
{E_ALARM_MODE_ONCE, 0},
|
||
//只响应一次
|
||
{E_ALARM_MODE_EVERY_DAY, 0xff},
|
||
//每天
|
||
{
|
||
E_ALARM_MODE_EVERY_MONDAY | E_ALARM_MODE_EVERY_TUESDAY | \
|
||
E_ALARM_MODE_EVERY_WEDNESDAY | E_ALARM_MODE_EVERY_THURSDAY | \
|
||
E_ALARM_MODE_EVERY_FRIDAY, BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5)
|
||
},
|
||
//工作日
|
||
|
||
{E_ALARM_MODE_EVERY_SUNDAY, BIT(0)},
|
||
{E_ALARM_MODE_EVERY_MONDAY, BIT(1)},
|
||
{E_ALARM_MODE_EVERY_TUESDAY, BIT(2)},
|
||
{E_ALARM_MODE_EVERY_WEDNESDAY, BIT(3)},
|
||
{E_ALARM_MODE_EVERY_THURSDAY, BIT(4)},
|
||
{E_ALARM_MODE_EVERY_FRIDAY, BIT(5)},
|
||
{E_ALARM_MODE_EVERY_SATURDAY, BIT(6)},
|
||
//独立日
|
||
};
|
||
|
||
|
||
|
||
static u16 alm_set_p = 0xff; /* time_set_table的当前设置指针 */
|
||
|
||
static u8 __alm_search_by_mark(const char *mark)
|
||
{
|
||
u16 p = 0;
|
||
u16 table_sum = sizeof(alm_set_table) / sizeof(struct time_setting);
|
||
while (p < table_sum) {
|
||
if (!strcmp(mark, alm_set_table[p].mark)) {
|
||
return p;
|
||
}
|
||
p++;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
static u8 __alm_set_switch(enum sw_dir dir, const char *mark)
|
||
{
|
||
u16 table_sum;
|
||
u16 prev_set_p = alm_set_p;
|
||
u8 p;
|
||
printf("__time_set_switch dir: %d\n", dir);
|
||
table_sum = sizeof(alm_set_table) / sizeof(struct time_setting);
|
||
ASSERT(dir == DIR_NEXT || dir == DIR_PREV || dir == DIR_SET);
|
||
switch (dir) {
|
||
case DIR_NEXT:
|
||
if (alm_set_p >= (table_sum - 1)) {
|
||
alm_set_p = 0;
|
||
} else {
|
||
alm_set_p++;
|
||
}
|
||
break;
|
||
case DIR_PREV:
|
||
if (alm_set_p >= (table_sum - 1)) {
|
||
alm_set_p = 0;
|
||
}
|
||
|
||
if (alm_set_p == 0) {
|
||
alm_set_p = (table_sum - 1);
|
||
} else {
|
||
alm_set_p--;
|
||
}
|
||
break;
|
||
case DIR_SET:
|
||
p = __alm_search_by_mark(mark);
|
||
if (p == (u8) - 1) {
|
||
return -1;
|
||
}
|
||
alm_set_p = p;
|
||
break;
|
||
}
|
||
|
||
if (prev_set_p != 0xff && alm_set_table[prev_set_p].time_id) {
|
||
ui_no_highlight_element_by_id(alm_set_table[prev_set_p].time_id);
|
||
}
|
||
|
||
|
||
if (alm_set_table[alm_set_p].time_id) {
|
||
ui_highlight_element_by_id(alm_set_table[alm_set_p].time_id);
|
||
}
|
||
|
||
printf("__time_set_switch ok.\n");
|
||
return 0;
|
||
}
|
||
|
||
static u8 __alm_set_reset(void)
|
||
{
|
||
T_ALARM alarm;
|
||
alm_set_p = 0xff;
|
||
alarm_get_info(&alarm, 0);
|
||
alm_set_table[0].time_value = alarm.time.hour;
|
||
alm_set_table[1].time_value = alarm.time.min;
|
||
|
||
for (int i = 0; i < sizeof(alm_rep) / sizeof(alm_rep[0]); i++) {
|
||
if (alm_rep[i].rep_set == alarm.mode) {
|
||
alm_set_table[2].time_value = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
alm_set_table[3].time_value = alarm.sw;
|
||
return 0;
|
||
}
|
||
|
||
static u8 __alm_update_show(u8 pos) /* 更新单个时间控件的时间 */
|
||
{
|
||
struct utime t;
|
||
t.hour = alm_set_table[0].time_value;
|
||
t.min = alm_set_table[1].time_value;
|
||
int rep_set = alm_set_table[2].time_value;
|
||
int sw = alm_set_table[3].time_value;
|
||
|
||
if (pos == 2) { //
|
||
for (int i = 0; i < sizeof(alm_rep_list) / sizeof(alm_rep_list[0]); i++) {
|
||
if (BIT(i) & alm_rep[rep_set].mask) {
|
||
ui_highlight_element_by_id(alm_rep_list[i]);
|
||
} else {
|
||
ui_no_highlight_element_by_id(alm_rep_list[i]);
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
if (pos == 3) { //开关
|
||
if (sw) {
|
||
ui_text_show_index_by_id(alm_set_table[pos].time_id, 1);
|
||
} else {
|
||
ui_text_show_index_by_id(alm_set_table[pos].time_id, 0);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
ui_time_update_by_id(alm_set_table[pos].time_id, &t);
|
||
return 0;
|
||
}
|
||
|
||
static u8 __alm_set_value(enum set_mod mod, u16 value)
|
||
{
|
||
enum set_mod need_check = 0;
|
||
u16 year, month, day;
|
||
ASSERT(mod == MOD_ADD || mod == MOD_DEC || mod == MOD_SET);
|
||
switch (mod) {
|
||
case MOD_ADD:
|
||
switch (alm_set_p) {
|
||
case 0: /* hour */
|
||
value = alm_set_table[alm_set_p].time_value + 1;
|
||
if (value > 23) {
|
||
value = 0;
|
||
}
|
||
break;
|
||
case 1: /* min */
|
||
value = alm_set_table[alm_set_p].time_value + 1;
|
||
if (value > 59) {
|
||
value = 0;
|
||
}
|
||
break;
|
||
case 2: /* rep */
|
||
value = alm_set_table[alm_set_p].time_value + 1;
|
||
if (value >= sizeof(alm_rep) / sizeof(alm_rep[0])) {
|
||
value = 0;
|
||
}
|
||
break;
|
||
case 3: /* sw */
|
||
value = !alm_set_table[alm_set_p].time_value;
|
||
break;
|
||
default:
|
||
/* ASSERT(0, "mod_add time_set_p:%d err!", time_set_p); */
|
||
return 0;
|
||
break;
|
||
}
|
||
break;
|
||
case MOD_DEC:
|
||
switch (alm_set_p) {
|
||
case 0: /* hour */
|
||
value = alm_set_table[alm_set_p].time_value;
|
||
if (value == 0) {
|
||
value = 23;
|
||
} else {
|
||
value--;
|
||
}
|
||
break;
|
||
case 1: /* min */
|
||
value = alm_set_table[alm_set_p].time_value;
|
||
if (value == 0) {
|
||
value = 59;
|
||
} else {
|
||
value--;
|
||
}
|
||
break;
|
||
case 2://rep
|
||
value = alm_set_table[alm_set_p].time_value;
|
||
if (value == 0) {
|
||
value = sizeof(alm_rep) / sizeof(alm_rep[0]) - 1;
|
||
} else {
|
||
value--;
|
||
}
|
||
break;
|
||
case 3: /* sw */
|
||
value = !alm_set_table[alm_set_p].time_value;
|
||
break;
|
||
default:
|
||
/* ASSERT(0, "mod_dec time_set_p:%d err!", time_set_p); */
|
||
return 0;
|
||
break;
|
||
}
|
||
break;
|
||
case MOD_SET:
|
||
switch (alm_set_p) {
|
||
case 0: /* hour */
|
||
ASSERT(value >= 0 && value <= 23);
|
||
break;
|
||
case 1: /* min */
|
||
ASSERT(value >= 0 && value <= 59);
|
||
break;
|
||
default:
|
||
/* ASSERT(0, "mod_set time_set_p:%d err!", time_set_p); */
|
||
return 0;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
|
||
alm_set_table[alm_set_p].time_value = value;
|
||
|
||
__alm_update_show(alm_set_p); /* 更新当前位数值显示 */
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
static int menu_sys_alm_set()
|
||
{
|
||
u8 index = 0;
|
||
T_ALARM alarm;
|
||
alarm.time.hour = alm_set_table[0].time_value ;
|
||
alarm.time.min = alm_set_table[1].time_value;
|
||
alarm.mode = alm_rep[alm_set_table[2].time_value].rep_set;
|
||
alarm.sw = alm_set_table[3].time_value;
|
||
alarm.index = index;
|
||
alarm_add(&alarm, index);
|
||
return 0;
|
||
}
|
||
|
||
|
||
static void __alm_set_switch_init(int id)
|
||
{
|
||
__alm_set_switch(DIR_SET, NULL);
|
||
}
|
||
|
||
static int alm_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct layout *layout = (struct layout *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
puts("time_layout_onchange onfocus.\n");
|
||
layout_on_focus(layout);
|
||
__alm_set_reset();
|
||
break;
|
||
case ON_CHANGE_RELEASE:
|
||
puts("time_layout_onchange losefocus.\n");
|
||
layout_lose_focus(layout);
|
||
break;
|
||
case ON_CHANGE_FIRST_SHOW:
|
||
puts("time_layout_onchange ON_CHANGE_FIRST_SHOW.\n");
|
||
ui_set_call(__time_set_switch_init, 0);
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return FALSE;
|
||
}
|
||
static int alm_layout_onkey(void *ctr, struct element_key_event *e)
|
||
{
|
||
|
||
switch (e->value) {
|
||
case KEY_OK:
|
||
puts("time_layout_onkey KEY_OK.\n");
|
||
__alm_set_switch(DIR_NEXT, NULL);
|
||
|
||
break;
|
||
case KEY_DOWN:
|
||
__alm_set_value(MOD_ADD, 0);
|
||
|
||
break;
|
||
case KEY_UP:
|
||
__alm_set_value(MOD_DEC, 0);
|
||
|
||
break;
|
||
case KEY_MODE:
|
||
case KEY_MENU:
|
||
menu_sys_alm_set();
|
||
ui_hide(CLOCK_ALM_SET_LAYOUT);
|
||
break;
|
||
default:
|
||
return false;
|
||
break;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
REGISTER_UI_EVENT_HANDLER(CLOCK_ALM_SET_LAYOUT)
|
||
.onchange = alm_layout_onchange,
|
||
.onkey = alm_layout_onkey,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
/***************************** 闹钟各个数字动作 ************************************/
|
||
static int alm_timer_sys_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_time *time = (struct ui_time *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
puts("timer_sys_onchange .\n");
|
||
time->hour = alm_set_table[0].time_value;
|
||
time->min = alm_set_table[1].time_value;
|
||
break;
|
||
case ON_CHANGE_SHOW_POST:
|
||
#if 0
|
||
printf("~~~~~~~~~~~~%x\n", time->text.elm.id);
|
||
if (time->text.elm.highlight) {
|
||
printf("~~~~~~~~~~~~%x\n", time->text.elm.id);
|
||
/* ui_invert_element_by_id(time->text.elm.id); */
|
||
}
|
||
#endif
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_H)
|
||
.onchange = alm_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_M)
|
||
.onchange = alm_timer_sys_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
static int alm_timer_rep_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_text *text = (struct ui_text *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
for (int i = 0; i < sizeof(alm_rep_list) / sizeof(alm_rep_list[0]); i++) {
|
||
if (text->elm.id == alm_rep_list[i]) {
|
||
if (BIT(i) & alm_rep[alm_set_table[2].time_value].mask) {
|
||
ui_highlight_element(&text->elm);
|
||
/* text->elm.highlight = 1; */
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
case ON_CHANGE_SHOW_POST:
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_SUN)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_MON)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_TUE)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_WED)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_THU)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_FRI)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_SAT)
|
||
.onchange = alm_timer_rep_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
static int alm_timer_sw_onchange(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_text *text = (struct ui_text *)ctr;
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
if (alm_set_table[3].time_value) {
|
||
ui_text_set_index(text, 1);
|
||
} else {
|
||
ui_text_set_index(text, 0);
|
||
}
|
||
break;
|
||
case ON_CHANGE_SHOW_POST:
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
REGISTER_UI_EVENT_HANDLER(ALM_SW)
|
||
.onchange = alm_timer_sw_onchange,
|
||
.onkey = NULL,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
#endif //#if (TCFG_APP_RTC_EN)
|
||
#endif
|