KT24-1110_65E-HA-651B/apps/soundbox/ui/lcd/STYLE_02/clock_action.c
2024-11-10 18:44:17 +08:00

1382 lines
34 KiB
C
Raw Permalink 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 "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)&current_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)&current_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