KT24-1110_65E-HA-651B/apps/soundbox/task_manager/rtc/rtc.c

708 lines
18 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#include "app_config.h"
#include "key_event_deal.h"
#include "system/includes.h"
#include "tone_player.h"
#include "app_task.h"
#include "tone_player.h"
#include "media/includes.h"
#include "system/sys_time.h"
#include "ui/ui_api.h"
#include "rtc/alarm.h"
#include "rtc/rtc_ui.h"
#include "clock_cfg.h"
#include "ui/ui_style.h"
#include "ui_manage.h"
/*************************************************************
rtc模式按键处理和事件处理
**************************************************************/
#if TCFG_APP_RTC_EN
#define LOG_TAG_CONST APP_RTC
#define LOG_TAG "[APP_RTC]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#define RTC_SET_MODE 0x55
#define ALM_SET_MODE 0xAA
#define RTC_POS_DEFAULT RTC_POS_YEAR
#define RTC_ALM_POS_DEFAULT ALM_POS_HOUR
#define RTC_MODE_DEFAULT RTC_SET_MODE
#define MAX_YEAR 2099
#define MIN_YEAR 2000
enum {
RTC_POS_NULL = 0,
RTC_POS_YEAR,
RTC_POS_MONTH,
RTC_POS_DAY,
RTC_POS_HOUR,
RTC_POS_MIN,
/* RTC_POS_SEC, */
RTC_POS_MAX,
ALM_POS_HOUR,
ALM_POS_MIN,
ALM_POS_ENABLE,
ALM_POS_MAX,
};
struct rtc_opr {
void *dev_handle;
u8 rtc_set_mode;
u8 rtc_pos;
u8 alm_enable;
u8 alm_num;
struct sys_time set_time;
};
static struct rtc_opr *__this = NULL;
const char *alm_string[] = {" AL ", " ON ", " OFF"};
const char *alm_select[] = {"AL-1", "AL-2", "AL-3", "AL-4", "AL-5"};
static void ui_set_rtc_timeout(u8 menu)
{
if (!__this) {
return ;
}
__this->rtc_set_mode = RTC_SET_MODE;
__this->rtc_pos = RTC_POS_NULL;
}
struct ui_rtc_display *__attribute__((weak)) rtc_ui_get_display_buf()
{
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 闹钟设置 \ 时间设置转换
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void set_rtc_sw()
{
if ((!__this) || (!__this->dev_handle)) {
return;
}
struct ui_rtc_display *rtc = rtc_ui_get_display_buf();
if (!rtc) {
return;
}
switch (__this->rtc_set_mode) {
case RTC_SET_MODE:
__this->rtc_set_mode = ALM_SET_MODE;
__this->rtc_pos = RTC_POS_NULL;
__this->alm_num = 0;
rtc->rtc_menu = UI_RTC_ACTION_STRING_SET;
rtc->str = alm_select[__this->alm_num];
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
case ALM_SET_MODE:
__this->alm_num++;
__this->rtc_pos = RTC_POS_NULL;
if (__this->alm_num >= sizeof(alm_select) / sizeof(alm_select[0])) {
__this->rtc_set_mode = RTC_SET_MODE;
__this->alm_num = 0;
UI_REFLASH_WINDOW(true);
break;
}
rtc->rtc_menu = UI_RTC_ACTION_STRING_SET;
rtc->str = alm_select[__this->alm_num];
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 设置调整时钟的位置
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void set_rtc_pos()
{
T_ALARM alarm = {0};
if ((!__this) || (!__this->dev_handle)) {
return;
}
struct ui_rtc_display *rtc = rtc_ui_get_display_buf();
if (!rtc) {
return;
}
switch (__this->rtc_set_mode) {
case RTC_SET_MODE:
if (__this->rtc_pos == RTC_POS_NULL) {
__this->rtc_pos = RTC_POS_DEFAULT;
dev_ioctl(__this->dev_handle, IOCTL_GET_SYS_TIME, (u32)&__this->set_time);
} else {
__this->rtc_pos++;
if (__this->rtc_pos == RTC_POS_MAX) {
__this->rtc_pos = RTC_POS_NULL;
rtc_update_time_api(&__this->set_time);
UI_REFLASH_WINDOW(true);
break;
}
}
rtc->rtc_menu = UI_RTC_ACTION_YEAR_SET + (__this->rtc_pos - RTC_POS_YEAR);
rtc->time.Year = __this->set_time.year;
rtc->time.Month = __this->set_time.month;
rtc->time.Day = __this->set_time.day;
rtc->time.Hour = __this->set_time.hour;
rtc->time.Min = __this->set_time.min;
rtc->time.Sec = __this->set_time.sec;
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
case ALM_SET_MODE:
if (__this->rtc_pos == RTC_POS_NULL) {
__this->rtc_pos = RTC_ALM_POS_DEFAULT;
if (alarm_get_info(&alarm, __this->alm_num) != 0) {
log_error("alarm_get_info \n");
}
__this->set_time.hour = alarm.time.hour;
__this->set_time.min = alarm.time.min;
__this->alm_enable = alarm.sw;
} else {
__this->rtc_pos++;
if (__this->rtc_pos == ALM_POS_MAX) {
__this->rtc_pos = RTC_POS_NULL;
alarm.time.hour = __this->set_time.hour;
alarm.time.min = __this->set_time.min;
alarm.time.sec = 0;
alarm.sw = __this->alm_enable;
alarm.index = __this->alm_num;
alarm.mode = 0;
alarm_add(&alarm, __this->alm_num);
__this->alm_num++;
if (__this->alm_num >= sizeof(alm_select) / sizeof(alm_select[0])) {
__this->rtc_set_mode = RTC_SET_MODE;
__this->alm_num = 0;
UI_REFLASH_WINDOW(true);
} else {
rtc->rtc_menu = UI_RTC_ACTION_STRING_SET;
rtc->str = alm_select[__this->alm_num];
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
}
break;
}
}
if (ALM_POS_ENABLE == __this->rtc_pos) {
rtc->rtc_menu = UI_RTC_ACTION_STRING_SET;
if (__this->alm_enable) {
rtc->str = " ON ";
} else {
rtc->str = " OFF";
}
} else {
rtc->rtc_menu = UI_RTC_ACTION_HOUR_SET + (__this->rtc_pos - ALM_POS_HOUR);
rtc->time.Year = __this->set_time.year;
rtc->time.Month = __this->set_time.month;
rtc->time.Day = __this->set_time.day;
rtc->time.Hour = __this->set_time.hour;
rtc->time.Min = __this->set_time.min;
rtc->time.Sec = __this->set_time.sec;
}
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 调整时钟 加时间
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void set_rtc_up()
{
if ((!__this) || (!__this->dev_handle)) {
return;
}
struct ui_rtc_display *rtc = rtc_ui_get_display_buf();
if (!rtc) {
return;
}
if (__this->rtc_pos == RTC_POS_NULL) {
return ;
}
switch (__this->rtc_set_mode) {
case RTC_SET_MODE:
switch (__this->rtc_pos) {
case RTC_POS_YEAR:
__this->set_time.year++;
if (__this->set_time.year > MAX_YEAR) {
__this->set_time.year = MIN_YEAR;
}
break;
case RTC_POS_MONTH:
if (++__this->set_time.month > 12) {
__this->set_time.month = 1;
}
break;
case RTC_POS_DAY:
if (++__this->set_time.day > month_for_day(__this->set_time.month, __this->set_time.year)) {
__this->set_time.day = 1;
}
break;
case RTC_POS_HOUR:
if (++__this->set_time.hour >= 24) {
__this->set_time.hour = 0;
}
break;
case RTC_POS_MIN:
if (++__this->set_time.min >= 60) {
__this->set_time.min = 0;
}
break;
/* case RTC_POS_SEC: */
/* break; */
}
rtc->rtc_menu = UI_RTC_ACTION_YEAR_SET + (__this->rtc_pos - RTC_POS_YEAR);
rtc->time.Year = __this->set_time.year;
rtc->time.Month = __this->set_time.month;
rtc->time.Day = __this->set_time.day;
rtc->time.Hour = __this->set_time.hour;
rtc->time.Min = __this->set_time.min;
rtc->time.Sec = __this->set_time.sec;
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
case ALM_SET_MODE:
switch (__this->rtc_pos) {
case ALM_POS_HOUR:
if (++__this->set_time.hour >= 24) {
__this->set_time.hour = 0;
}
break;
case ALM_POS_MIN:
if (++__this->set_time.min >= 60) {
__this->set_time.min = 0;
}
break;
case ALM_POS_ENABLE:
__this->alm_enable = !__this->alm_enable;
break;
}
if (ALM_POS_ENABLE == __this->rtc_pos) {
rtc->rtc_menu = UI_RTC_ACTION_STRING_SET;
if (__this->alm_enable) {
rtc->str = " ON ";
} else {
rtc->str = " OFF";
}
} else {
rtc->rtc_menu = UI_RTC_ACTION_HOUR_SET + (__this->rtc_pos - ALM_POS_HOUR);
rtc->time.Year = __this->set_time.year;
rtc->time.Month = __this->set_time.month;
rtc->time.Day = __this->set_time.day;
rtc->time.Hour = __this->set_time.hour;
rtc->time.Min = __this->set_time.min;
rtc->time.Sec = __this->set_time.sec;
}
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
default:
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 调整时钟 减时间
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void set_rtc_down()
{
if ((!__this) || (!__this->dev_handle)) {
return;
}
struct ui_rtc_display *rtc = rtc_ui_get_display_buf();
if (!rtc) {
return;
}
if (__this->rtc_pos == RTC_POS_NULL) {
return ;
}
switch (__this->rtc_set_mode) {
case RTC_SET_MODE:
switch (__this->rtc_pos) {
case RTC_POS_YEAR:
__this->set_time.year--;
if (__this->set_time.year < MIN_YEAR) {
__this->set_time.year = MAX_YEAR;
}
break;
case RTC_POS_MONTH:
if (__this->set_time.month == 1) {
__this->set_time.month = 12;
} else {
__this->set_time.month--;
}
break;
case RTC_POS_DAY:
if (__this->set_time.day == 1) {
__this->set_time.day = month_for_day(__this->set_time.month, __this->set_time.year);
} else {
__this->set_time.day --;
}
break;
case RTC_POS_HOUR:
if (__this->set_time.hour == 0) {
__this->set_time.hour = 23;
} else {
__this->set_time.hour--;
}
break;
case RTC_POS_MIN:
if (__this->set_time.min == 0) {
__this->set_time.min = 59;
} else {
__this->set_time.min--;
}
break;
}
rtc->rtc_menu = UI_RTC_ACTION_YEAR_SET + (__this->rtc_pos - RTC_POS_YEAR);
rtc->time.Year = __this->set_time.year;
rtc->time.Month = __this->set_time.month;
rtc->time.Day = __this->set_time.day;
rtc->time.Hour = __this->set_time.hour;
rtc->time.Min = __this->set_time.min;
rtc->time.Sec = __this->set_time.sec;
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
case ALM_SET_MODE:
switch (__this->rtc_pos) {
case ALM_POS_HOUR:
if (__this->set_time.hour == 0) {
__this->set_time.hour = 23;
} else {
__this->set_time.hour--;
}
break;
case ALM_POS_MIN:
if (__this->set_time.min == 0) {
__this->set_time.min = 59;
} else {
__this->set_time.min--;
}
break;
case ALM_POS_ENABLE:
__this->alm_enable = !__this->alm_enable;
break;
}
if (ALM_POS_ENABLE == __this->rtc_pos) {
rtc->rtc_menu = UI_RTC_ACTION_STRING_SET;
if (__this->alm_enable) {
rtc->str = " ON ";
} else {
rtc->str = " OFF";
}
} else {
rtc->rtc_menu = UI_RTC_ACTION_HOUR_SET + (__this->rtc_pos - ALM_POS_HOUR);
rtc->time.Year = __this->set_time.year;
rtc->time.Month = __this->set_time.month;
rtc->time.Day = __this->set_time.day;
rtc->time.Hour = __this->set_time.hour;
rtc->time.Min = __this->set_time.min;
rtc->time.Sec = __this->set_time.sec;
}
UI_SHOW_MENU(MENU_RTC_SET, 10 * 1000, 0, ui_set_rtc_timeout);
break;
default:
break;
}
}
static void rtc_app_init()
{
if (!__this) {
__this = zalloc(sizeof(struct rtc_opr));
ASSERT(__this, "%s %di \n", __func__, __LINE__);
__this->dev_handle = dev_open("rtc", NULL);
if (!__this->dev_handle) {
ASSERT(0, "%s %d \n", __func__, __LINE__);
}
}
__this->rtc_set_mode = RTC_SET_MODE;
__this->rtc_pos = RTC_POS_NULL;
ui_update_status(STATUS_RTC_MODE);
clock_idle(RTC_IDLE_CLOCK);
UI_SHOW_WINDOW(ID_WINDOW_CLOCK);
sys_key_event_enable();
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 退出
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void rtc_task_close()
{
#if SMART_BOX_EN
extern void smartbox_rtc_mode_exit(void);
smartbox_rtc_mode_exit();
#endif
UI_HIDE_CURR_WINDOW();
if (__this) {
if (__this->dev_handle) {
dev_close(__this->dev_handle);
__this->dev_handle = NULL;
}
free(__this);
__this = NULL;
}
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 按键消息入口
@param
@return 1common 0common处理
@note
*/
/*----------------------------------------------------------------------------*/
static int rtc_key_event_opr(struct sys_event *event)
{
int ret = true;
int err = 0;
#if (TCFG_SPI_LCD_ENABLE)
extern int key_is_ui_takeover();
if (key_is_ui_takeover()) {
return false;
}
#endif
int key_event = event->u.key.event;
int key_value = event->u.key.value;//
log_info("key_event:%d \n", key_event);
if (__this && __this->dev_handle) {
switch (key_event) {
case KEY_RTC_UP:
log_info("KEY_RTC_UP \n");
set_rtc_up();
break;
case KEY_RTC_DOWN:
log_info("KEY_RTC_DOWN \n");
set_rtc_down();
break;
case KEY_RTC_SW:
log_info("KEY_RTC_SW \n");
set_rtc_sw();
break;
case KEY_RTC_SW_POS:
log_info("KEY_RTC_SW_POS \n");
set_rtc_pos();
break;
default :
ret = false;
break;
}
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 按键消息入口
@param
@return 1common 0common处理
@note
*/
/*----------------------------------------------------------------------------*/
static int rtc_sys_event_handler(struct sys_event *event)
{
switch (event->type) {
case SYS_KEY_EVENT:
return rtc_key_event_opr(event);
case SYS_DEVICE_EVENT:
return false;
default:
return false;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 启动
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void rtc_task_start()
{
rtc_app_init();
if (alarm_active_flag_get()) {
alarm_ring_start();
}
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 模式提示音播放结束处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void rtc_tone_play_end_callback(void *priv, int flag)
{
u32 index = (u32)priv;
if (APP_RTC_TASK != app_get_curr_task()) {
log_error("tone callback task out \n");
return;
}
switch (index) {
case IDEX_TONE_RTC:
///提示音播放结束, 启动播放器播放
break;
default:
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief rtc 主任务
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void app_rtc_task()
{
int res;
int msg[32];
#if (SMART_BOX_EN)
extern u8 smartbox_rtc_ring_tone(void);
if (smartbox_rtc_ring_tone()) {
tone_play_with_callback_by_name(tone_table[IDEX_TONE_RTC], 1, rtc_tone_play_end_callback, (void *)IDEX_TONE_RTC);
}
#else
tone_play_with_callback_by_name(tone_table[IDEX_TONE_RTC], 1, rtc_tone_play_end_callback, (void *)IDEX_TONE_RTC);
#endif
rtc_task_start();
while (1) {
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
case APP_MSG_SYS_EVENT:
if (rtc_sys_event_handler((struct sys_event *)(&msg[1])) == false) {
app_default_event_deal((struct sys_event *)(&msg[1])); //由common统一处理
}
break;
default:
break;
}
if (app_task_exitting()) {
rtc_task_close();
return;
}
}
}
#else
void app_rtc_task()
{
}
#endif