857 lines
25 KiB
C
857 lines
25 KiB
C
|
#include "smartbox/func_cmd/rtc_func.h"
|
|||
|
#include "smartbox/func_cmd_common.h"
|
|||
|
#include "smartbox/function.h"
|
|||
|
#include "smartbox/config.h"
|
|||
|
#include "smartbox/event.h"
|
|||
|
#include "app_action.h"
|
|||
|
|
|||
|
#include "smartbox_music_info_setting.h"
|
|||
|
#include "btstack/avctp_user.h"
|
|||
|
#include "JL_rcsp_packet.h"
|
|||
|
#include "key_event_deal.h"
|
|||
|
#include "app_msg.h"
|
|||
|
|
|||
|
#include "smartbox_rcsp_manage.h"
|
|||
|
|
|||
|
#if (SMART_BOX_EN)
|
|||
|
|
|||
|
#if TCFG_RTC_ENABLE
|
|||
|
#include "rtc/alarm.h"
|
|||
|
#include "tone_player.h"
|
|||
|
#include "linein/linein.h"
|
|||
|
#include "music_player.h"
|
|||
|
#include "general_player.h"
|
|||
|
#include "browser/browser.h"
|
|||
|
#include "clock_cfg.h"
|
|||
|
|
|||
|
#define RTC_INFO_ATTR_RTC_TIME (0)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALRAM (1)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALRAM_ACTIVE (2)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALRAM_UNACTIVE (3)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALRAM_STRUCTURE (4)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALRAM_DEFAULT_RING (5)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALRAM_RING_AUDITION (6)
|
|||
|
#define RTC_INFO_ATTR_RTC_ALARM_EX (7)
|
|||
|
|
|||
|
// 0是不停止
|
|||
|
#define SMARTBOX_ALARM_RING_MAX 2
|
|||
|
|
|||
|
#pragma pack(1)
|
|||
|
typedef struct __APP_ALARM__ {
|
|||
|
u8 index;
|
|||
|
u8 sw;
|
|||
|
u8 mode;
|
|||
|
u8 bHour;
|
|||
|
u8 bMin;
|
|||
|
u8 name_len;
|
|||
|
} T_ALARM_APP, *PT_ALARM_APP;
|
|||
|
|
|||
|
typedef struct __APP_ALARM_EXTRA_DATA__ {
|
|||
|
u8 type;
|
|||
|
u8 dev;
|
|||
|
u32 clust;
|
|||
|
u8 ring_name_len;
|
|||
|
u8 ring_name[32];
|
|||
|
} T_ALARM_APP_EXTRA_DATA, *PT_ALARM_APP_EXTRA_DATA;
|
|||
|
|
|||
|
typedef struct __APP_ALARM_RING_AUDITION__ {
|
|||
|
u8 prev_app_mode;
|
|||
|
u8 ring_op;
|
|||
|
u8 ring_type;
|
|||
|
u8 ring_dev;
|
|||
|
u32 ring_clust;
|
|||
|
u32 ring_timeout;
|
|||
|
} T_ALARM_APP_RING_AUDITION, *PT_ALARM_APP_RING_AUDITION;
|
|||
|
|
|||
|
typedef struct __APP_ALARM_DATA_EX {
|
|||
|
u8 len;
|
|||
|
u8 index;
|
|||
|
u8 count;
|
|||
|
u8 interval;
|
|||
|
u8 alarmTime;
|
|||
|
} T_ALARM_APP_DATA_EX, *PT_ALARM_APP_DATA_EX;
|
|||
|
|
|||
|
#pragma pack()
|
|||
|
|
|||
|
enum {
|
|||
|
E_ALARM_SET = 0x00,
|
|||
|
E_ALARM_DELETE,
|
|||
|
E_ALARM_UNACTIVE,
|
|||
|
};
|
|||
|
|
|||
|
enum {
|
|||
|
ALARM_IDEX_TONE_NUM_0 = 0,
|
|||
|
ALARM_IDEX_TONE_NUM_1 = 1,
|
|||
|
ALARM_IDEX_TONE_NUM_2 = 2,
|
|||
|
ALARM_IDEX_TONE_NUM_3 = 3,
|
|||
|
ALARM_IDEX_TONE_NUM_4 = 4,
|
|||
|
ALARM_IDEX_TONE_NUM_5 = 5,
|
|||
|
ALARM_IDEX_TONE_NUM_6 = 6,
|
|||
|
ALARM_IDEX_TONE_NUM_7 = 7,
|
|||
|
ALARM_IDEX_TONE_NUM_8 = 8,
|
|||
|
ALARM_IDEX_TONE_NUM_9 = 9,
|
|||
|
|
|||
|
ALARM_IDEX_TONE_MAX_NUM = 10,
|
|||
|
};
|
|||
|
static const char *default_ringtone_table[] = {
|
|||
|
[ALARM_IDEX_TONE_NUM_0] = TONE_RES_ROOT_PATH"tone/0.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_1] = TONE_RES_ROOT_PATH"tone/1.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_2] = TONE_RES_ROOT_PATH"tone/2.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_3] = TONE_RES_ROOT_PATH"tone/3.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_4] = TONE_RES_ROOT_PATH"tone/4.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_5] = TONE_RES_ROOT_PATH"tone/5.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_6] = TONE_RES_ROOT_PATH"tone/6.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_7] = TONE_RES_ROOT_PATH"tone/7.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_8] = TONE_RES_ROOT_PATH"tone/8.*",
|
|||
|
[ALARM_IDEX_TONE_NUM_9] = TONE_RES_ROOT_PATH"tone/9.*",
|
|||
|
};
|
|||
|
|
|||
|
static const char *default_ringtone_name_table[] = {
|
|||
|
[ALARM_IDEX_TONE_NUM_0] = "提示音0",
|
|||
|
[ALARM_IDEX_TONE_NUM_1] = "1",
|
|||
|
[ALARM_IDEX_TONE_NUM_2] = "2",
|
|||
|
[ALARM_IDEX_TONE_NUM_3] = "3",
|
|||
|
[ALARM_IDEX_TONE_NUM_4] = "4",
|
|||
|
[ALARM_IDEX_TONE_NUM_5] = "5",
|
|||
|
[ALARM_IDEX_TONE_NUM_6] = "6",
|
|||
|
[ALARM_IDEX_TONE_NUM_7] = "7",
|
|||
|
[ALARM_IDEX_TONE_NUM_8] = "8",
|
|||
|
[ALARM_IDEX_TONE_NUM_9] = "9",
|
|||
|
};
|
|||
|
|
|||
|
static void scan_enter(struct __dev *dev)
|
|||
|
{
|
|||
|
clock_add_set(SCAN_DISK_CLK);
|
|||
|
}
|
|||
|
|
|||
|
static void scan_exit(struct __dev *dev)
|
|||
|
{
|
|||
|
clock_remove_set(SCAN_DISK_CLK);
|
|||
|
}
|
|||
|
|
|||
|
static const struct __scan_callback scan_cb = {
|
|||
|
.enter = scan_enter,
|
|||
|
.exit = scan_exit,
|
|||
|
.scan_break = general_player_scandisk_break,
|
|||
|
};
|
|||
|
|
|||
|
static u8 rtc_func_structure_flag = CUR_RTC_ALARM_MODE;
|
|||
|
static u8 rtc_ringing_prev_mode = -1;
|
|||
|
static T_ALARM_APP_RING_AUDITION g_ring_audition = {
|
|||
|
.prev_app_mode = -1,
|
|||
|
};
|
|||
|
|
|||
|
static u8 count = 0;
|
|||
|
static u8 flag = 0;
|
|||
|
static u8 count_flag = 0;
|
|||
|
static u16 smart_rtc_ex_timer = 0;
|
|||
|
static u16 smart_rtc_ex_timer1 = 0;
|
|||
|
static u8 alarm_ex_flag = 0;
|
|||
|
|
|||
|
static u8 smart_rtc_get_alarm_info(PT_ALARM_APP p, u8 index)
|
|||
|
{
|
|||
|
extern u8 alarm_get_info(PT_ALARM p, u8 index);
|
|||
|
u8 ret = 0;
|
|||
|
T_ALARM alarm_param;
|
|||
|
ret = alarm_get_info(&alarm_param, index);
|
|||
|
p->index = alarm_param.index;
|
|||
|
p->sw = alarm_param.sw;
|
|||
|
p->mode = alarm_param.mode;
|
|||
|
p->bHour = alarm_param.time.hour;
|
|||
|
p->bMin = alarm_param.time.min;
|
|||
|
p->name_len = alarm_param.name_len;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
static u8 smartbox_rtc_get_alarm_total(void)
|
|||
|
{
|
|||
|
extern u8 alarm_get_total(void);
|
|||
|
u8 total = 0;
|
|||
|
total = alarm_get_total();
|
|||
|
return total;
|
|||
|
}
|
|||
|
|
|||
|
static u8 m_func_alarm_get_active_index(void)
|
|||
|
{
|
|||
|
extern u8 alarm_get_active_index(void);
|
|||
|
return alarm_get_active_index();
|
|||
|
}
|
|||
|
|
|||
|
static u8 m_func_alarm_name_get(u8 *p, u8 index)
|
|||
|
{
|
|||
|
extern u8 alarm_name_get(u8 * p, u8 index);
|
|||
|
return alarm_name_get(p, index);
|
|||
|
}
|
|||
|
|
|||
|
static void smart_rtc_update_time(RTC_TIME *p)
|
|||
|
{
|
|||
|
extern void rtc_update_time_api(struct sys_time * time);
|
|||
|
struct sys_time time = {0};
|
|||
|
time.year = p->dYear;
|
|||
|
time.month = p->bMonth;
|
|||
|
time.day = p->bDay;
|
|||
|
time.hour = p->bHour;
|
|||
|
time.min = p->bMin;
|
|||
|
time.sec = p->bSec;
|
|||
|
rtc_update_time_api(&time);
|
|||
|
}
|
|||
|
|
|||
|
static u8 mfunc_alarm_deal_data(PT_ALARM_APP p)
|
|||
|
{
|
|||
|
extern u8 alarm_add(PT_ALARM p, u8 index);
|
|||
|
T_ALARM tmp_alarm = {0};
|
|||
|
tmp_alarm.index = p->index;
|
|||
|
tmp_alarm.sw = p->sw;
|
|||
|
tmp_alarm.mode = p->mode;
|
|||
|
tmp_alarm.time.hour = p->bHour;
|
|||
|
tmp_alarm.time.min = p->bMin;
|
|||
|
tmp_alarm.name_len = p->name_len;
|
|||
|
return alarm_add(&tmp_alarm, p->index);
|
|||
|
}
|
|||
|
|
|||
|
static void m_func_alarm_name_set(u8 *p, u8 index, u8 len)
|
|||
|
{
|
|||
|
extern void alarm_name_set(u8 * p, u8 index, u8 len);
|
|||
|
alarm_name_set(p, index, len);
|
|||
|
}
|
|||
|
|
|||
|
static void m_func_alarm_dealte(u8 index)
|
|||
|
{
|
|||
|
extern void alarm_delete(u8 index);
|
|||
|
alarm_delete(index);
|
|||
|
}
|
|||
|
|
|||
|
static u8 smart_rtc_alarm_extra_data_set(u8 index, u8 *p, u8 len)
|
|||
|
{
|
|||
|
u8 offset = 0;
|
|||
|
T_ALARM_APP_EXTRA_DATA data = {0};
|
|||
|
data.type = p[offset++];
|
|||
|
data.dev = p[offset++];
|
|||
|
data.clust = READ_BIG_U32(p + offset);
|
|||
|
offset += sizeof(data.clust);
|
|||
|
u8 data_len = p[offset++];
|
|||
|
data.ring_name_len = data_len > 32 ? 32 : data_len;
|
|||
|
memcpy(data.ring_name, p + offset, data.ring_name_len);
|
|||
|
offset += data.ring_name_len;
|
|||
|
printf("ring_type : %d, ring_dev : %d, ring_clust : %d, ring_name_len : %d\n", data.type, data.dev, data.clust, data.ring_name_len);
|
|||
|
syscfg_write(VM_ALARM_RING_NAME_0 + index, &data, sizeof(data));
|
|||
|
return offset;
|
|||
|
}
|
|||
|
|
|||
|
static u8 smart_rtc_alarm_deal(void *priv, u8 *p, u8 len)
|
|||
|
{
|
|||
|
u8 ret = E_SUCCESS;
|
|||
|
u8 op = 0;
|
|||
|
u8 nums = 0;
|
|||
|
u8 index = 0;
|
|||
|
u8 *pTmp = 0;
|
|||
|
u8 i = 0;
|
|||
|
u8 ring_info_offset = 0;
|
|||
|
|
|||
|
T_ALARM_APP alarm_tab;
|
|||
|
|
|||
|
if (len >= 3) {
|
|||
|
op = p[2];
|
|||
|
printf("op = %d\n", op);
|
|||
|
}
|
|||
|
if (len >= 4) {
|
|||
|
nums = p[3];
|
|||
|
printf("nums = %d\n", nums);
|
|||
|
}
|
|||
|
if (nums > M_MAX_ALARM_NUMS) {
|
|||
|
printf("nums is error\n");
|
|||
|
return E_FAILURE;
|
|||
|
}
|
|||
|
|
|||
|
switch (op) {
|
|||
|
case E_ALARM_SET:
|
|||
|
printf("E_ALARM_SET\n");
|
|||
|
for (i = 0; i < nums; i++) {
|
|||
|
pTmp = &(p[4 + i * (6 + alarm_tab.name_len) + ring_info_offset]);
|
|||
|
alarm_tab.index = pTmp[0];
|
|||
|
alarm_tab.sw = pTmp[1];
|
|||
|
alarm_tab.mode = pTmp[2];
|
|||
|
alarm_tab.bHour = pTmp[3];
|
|||
|
alarm_tab.bMin = pTmp[4];
|
|||
|
alarm_tab.name_len = pTmp[5];
|
|||
|
|
|||
|
printf("index : %d, sw : %d, mode : %d, hour : %d, min : %d, name_len : %d\n", pTmp[0], pTmp[1], pTmp[2], pTmp[3], pTmp[4], pTmp[5]);
|
|||
|
ret = mfunc_alarm_deal_data(&alarm_tab);
|
|||
|
if (E_SUCCESS == ret) {
|
|||
|
m_func_alarm_name_set(&(pTmp[6]), alarm_tab.index, alarm_tab.name_len);
|
|||
|
}
|
|||
|
|
|||
|
if (rtc_func_structure_flag) {
|
|||
|
ring_info_offset += smart_rtc_alarm_extra_data_set(alarm_tab.index, &pTmp[6 + alarm_tab.name_len], len);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case E_ALARM_DELETE:
|
|||
|
printf("E_ALARM_DELETE\n");
|
|||
|
for (i = 0; i < nums; i++) {
|
|||
|
index = p[4 + i];
|
|||
|
m_func_alarm_dealte(index);
|
|||
|
}
|
|||
|
if (smart_rtc_ex_timer) {
|
|||
|
sys_timer_del(smart_rtc_ex_timer);
|
|||
|
smart_rtc_ex_timer = 0;
|
|||
|
}
|
|||
|
if (smart_rtc_ex_timer1) {
|
|||
|
sys_timer_del(smart_rtc_ex_timer1);
|
|||
|
smart_rtc_ex_timer1 = 0;
|
|||
|
}
|
|||
|
break;
|
|||
|
case E_ALARM_UNACTIVE:
|
|||
|
printf("E_ALARM_UNACTIVE\n");
|
|||
|
extern void alarm_stop(void);
|
|||
|
alarm_stop();
|
|||
|
if (smart_rtc_ex_timer) {
|
|||
|
sys_timer_del(smart_rtc_ex_timer);
|
|||
|
smart_rtc_ex_timer = 0;
|
|||
|
}
|
|||
|
if (smart_rtc_ex_timer1) {
|
|||
|
sys_timer_del(smart_rtc_ex_timer1);
|
|||
|
smart_rtc_ex_timer1 = 0;
|
|||
|
}
|
|||
|
smartbox_function_update(RTC_FUNCTION_MASK, BIT(RTC_INFO_ATTR_RTC_ALRAM_UNACTIVE));
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf("alarm no action!\n");
|
|||
|
break;
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
static u8 smartbox_rtc_play_dev_ring(PT_ALARM_APP_RING_AUDITION ring_param)
|
|||
|
{
|
|||
|
u8 ret = 0;
|
|||
|
printf("neet to play the dev music, dev %s, clust %x\n", smartbox_browser_dev_remap(ring_param->ring_dev), ring_param->ring_clust);
|
|||
|
ret = general_play_by_sculst(smartbox_browser_dev_remap(ring_param->ring_dev), ring_param->ring_clust);
|
|||
|
if (ret) {
|
|||
|
ring_param->ring_type = 0;
|
|||
|
ring_param->ring_clust = 0;
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
static void music_tone_play_end_callback(void *priv, int flag)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
static u8 smart_rtc_ring_audition_deal(PT_ALARM_APP_RING_AUDITION ring_param)
|
|||
|
{
|
|||
|
u8 ret = 0;
|
|||
|
printf("ring stop");
|
|||
|
/* tone_play_stop(); */
|
|||
|
general_player_stop(0);
|
|||
|
if (1 == ring_param->ring_op) {
|
|||
|
printf("ringing\n");
|
|||
|
if (0 == ring_param->ring_type) {
|
|||
|
general_player_stop(0);
|
|||
|
/* tone_play_by_path(default_ringtone_table[ring_param->ring_clust], 0); */
|
|||
|
tone_play_with_callback_by_name(default_ringtone_table[ring_param->ring_clust], 1, music_tone_play_end_callback, (void *)ring_param->ring_clust);
|
|||
|
} else if (1 == ring_param->ring_type) {
|
|||
|
/* tone_play_stop(); */
|
|||
|
smartbox_rtc_play_dev_ring(ring_param);
|
|||
|
}
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
static u8 smart_rtc_ring_audition_prepare(void *priv, u8 *data, u16 len)
|
|||
|
{
|
|||
|
u8 ret = 0;
|
|||
|
struct smartbox *smart = (struct smartbox *)priv;
|
|||
|
g_ring_audition.ring_op = data[0];
|
|||
|
switch (g_ring_audition.ring_op) {
|
|||
|
case 0:
|
|||
|
// 回到原来的模式
|
|||
|
if ((u8) - 1 != g_ring_audition.prev_app_mode) {
|
|||
|
smartbox_msg_post(USER_MSG_SMARTBOX_MODE_SWITCH, 2, (int)smart, g_ring_audition.prev_app_mode);
|
|||
|
g_ring_audition.prev_app_mode = -1;
|
|||
|
} else {
|
|||
|
smart_rtc_ring_audition_deal(&g_ring_audition);
|
|||
|
}
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
g_ring_audition.ring_type = data[1];
|
|||
|
g_ring_audition.ring_dev = data[2];
|
|||
|
g_ring_audition.ring_clust = READ_BIG_U32(data + 3);
|
|||
|
// 进入rtc模式
|
|||
|
if (RTC_FUNCTION != smart->cur_app_mode) {
|
|||
|
g_ring_audition.prev_app_mode = smart->cur_app_mode;
|
|||
|
// 切换rtc模式
|
|||
|
smartbox_msg_post(USER_MSG_SMARTBOX_MODE_SWITCH, 2, (int)smart, RTC_FUNCTION_MASK);
|
|||
|
} else {
|
|||
|
smart_rtc_ring_audition_deal(&g_ring_audition);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
bool rtc_func_set(void *priv, u8 *data, u16 len)
|
|||
|
{
|
|||
|
u8 ret = 0;
|
|||
|
u8 offset = 0;
|
|||
|
RTC_TIME time_info;
|
|||
|
while (offset < len) {
|
|||
|
u8 len_tmp = data[offset];
|
|||
|
u8 type = data[offset + 1];
|
|||
|
printf("rtc info:\n");
|
|||
|
put_buf(&data[offset], len_tmp + 1);
|
|||
|
|
|||
|
switch (type) {
|
|||
|
case RTC_INFO_ATTR_RTC_TIME:
|
|||
|
printf("RTC_INFO_ATTR_RTC_TIME\n");
|
|||
|
memcpy((u8 *)&time_info, data + 2, sizeof(time_info));
|
|||
|
time_info.dYear = app_htons(time_info.dYear);
|
|||
|
smart_rtc_update_time(&time_info);
|
|||
|
break;
|
|||
|
case RTC_INFO_ATTR_RTC_ALRAM:
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM\n");
|
|||
|
put_buf(data, len);
|
|||
|
ret = smart_rtc_alarm_deal(priv, data, len);
|
|||
|
break;
|
|||
|
case RTC_INFO_ATTR_RTC_ALRAM_RING_AUDITION:
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM_RING_AUDITION\n");
|
|||
|
ret = smart_rtc_ring_audition_prepare(priv, data + offset + 2, len);
|
|||
|
break;
|
|||
|
}
|
|||
|
offset += len_tmp + 1;
|
|||
|
}
|
|||
|
return (E_SUCCESS == ret);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static bool smart_rtc_alarm_deal_ex(void *priv, u8 *data, u16 len)
|
|||
|
{
|
|||
|
u8 *tmp_data = data;
|
|||
|
|
|||
|
T_ALARM_APP_DATA_EX tmp = {0};
|
|||
|
tmp.len = tmp_data[0];
|
|||
|
tmp.index = tmp_data[1];
|
|||
|
tmp.count = tmp_data[2];
|
|||
|
tmp.interval = tmp_data[3];
|
|||
|
tmp.alarmTime = tmp_data[4];
|
|||
|
printf("22222222222222222222222222222222222222222222222\n");
|
|||
|
put_buf((u8 *)&tmp, sizeof(tmp));
|
|||
|
syscfg_write(VM_ALARM_EX0 + tmp.index, &tmp, sizeof(tmp));
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
bool rtc_func_set_ex(void *priv, u8 *data, u16 len)
|
|||
|
{
|
|||
|
printf("rtc_ex info:\n");
|
|||
|
put_buf(data, len);
|
|||
|
|
|||
|
return smart_rtc_alarm_deal_ex(priv, data, len);
|
|||
|
}
|
|||
|
|
|||
|
u16 rtc_func_get_ex(void *priv, u8 *buf, u16 buf_size, u8 mask)
|
|||
|
{
|
|||
|
u16 offset = 0;
|
|||
|
u8 index = 0;
|
|||
|
T_ALARM_APP_DATA_EX data = {0};
|
|||
|
data.len = 0x04;
|
|||
|
data.count |= 0x81;//可设置
|
|||
|
data.interval |= 0x85;
|
|||
|
data.alarmTime |= 0x85;
|
|||
|
u16 size = sizeof(data);
|
|||
|
printf("mask==%u", mask);
|
|||
|
do {
|
|||
|
if (mask & 0x01) {
|
|||
|
if (sizeof(data) != syscfg_read(VM_ALARM_EX0 + index, &data, size)) {
|
|||
|
printf("cccccccccccccccccccccccccccccccccccccccc");
|
|||
|
}
|
|||
|
data.index = index;
|
|||
|
put_buf((u8 *)&data, sizeof(data));
|
|||
|
memcpy(&buf[offset], (u8 *)&data, size);
|
|||
|
offset = offset + size;
|
|||
|
}
|
|||
|
mask = mask >> 1;
|
|||
|
index++;
|
|||
|
} while (index < 5);
|
|||
|
put_buf(buf, buf_size);
|
|||
|
|
|||
|
return offset;
|
|||
|
}
|
|||
|
|
|||
|
static u8 smart_rtc_alarm_extra_data_get(u8 *p, u8 index, u8 is_conversion)
|
|||
|
{
|
|||
|
u8 offset = 0;
|
|||
|
T_ALARM_APP_EXTRA_DATA data = {0};
|
|||
|
if (sizeof(data) != syscfg_read(VM_ALARM_RING_NAME_0 + index, &data, sizeof(data))) {
|
|||
|
// 默认数据
|
|||
|
data.type = 0;
|
|||
|
data.dev = 0;
|
|||
|
data.clust = 0;
|
|||
|
memcpy(data.ring_name, default_ringtone_name_table[data.clust], strlen(default_ringtone_name_table[data.clust]) + 1);
|
|||
|
data.ring_name_len = strlen(data.ring_name) + 1;
|
|||
|
}
|
|||
|
p[offset++] = data.type;
|
|||
|
p[offset++] = data.dev;
|
|||
|
if (is_conversion) {
|
|||
|
WRITE_BIG_U32(p + offset, data.clust);
|
|||
|
} else {
|
|||
|
memcpy(p + offset, &data.clust, sizeof(data.clust));
|
|||
|
}
|
|||
|
offset += sizeof(data.clust);
|
|||
|
p[offset++] = data.ring_name_len;
|
|||
|
memcpy(p + offset, data.ring_name, data.ring_name_len);
|
|||
|
offset += data.ring_name_len;
|
|||
|
return offset;
|
|||
|
}
|
|||
|
|
|||
|
u32 rtc_func_get(void *priv, u8 *buf, u16 buf_size, u32 mask)
|
|||
|
{
|
|||
|
u16 offset = 0;
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_TIME)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_TIME\n");
|
|||
|
RTC_TIME time_info = {
|
|||
|
.dYear = 2020,
|
|||
|
.bMonth = 5,
|
|||
|
.bDay = 15,
|
|||
|
.bHour = 19,
|
|||
|
.bMin = 55,
|
|||
|
.bSec = 40,
|
|||
|
};
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_TIME, (u8 *)&time_info, sizeof(time_info));
|
|||
|
}
|
|||
|
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_ALRAM)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM\n");
|
|||
|
u8 alarm_data[M_MAX_ALARM_NUMS * (sizeof(T_ALARM_APP) + M_MAX_ALARM_NAME_LEN + sizeof(T_ALARM_APP_EXTRA_DATA))];
|
|||
|
u8 total = 0;
|
|||
|
u8 index = 0;
|
|||
|
u8 name_len = 0;
|
|||
|
u8 *pTmp;
|
|||
|
u8 data_len = 0;
|
|||
|
u8 ret = 0;
|
|||
|
|
|||
|
pTmp = alarm_data;
|
|||
|
|
|||
|
total = smartbox_rtc_get_alarm_total();
|
|||
|
printf("total %d alarm!\n", total);
|
|||
|
|
|||
|
pTmp[0] = total;
|
|||
|
|
|||
|
pTmp++;
|
|||
|
data_len++;
|
|||
|
|
|||
|
for (index = 0; index < 5; index++) {
|
|||
|
ret = smart_rtc_get_alarm_info((PT_ALARM_APP)pTmp, index);
|
|||
|
if (alarm_ex_flag) {
|
|||
|
((PT_ALARM_APP)pTmp)->sw = 1;
|
|||
|
}
|
|||
|
if (0 == ret) {
|
|||
|
pTmp += sizeof(T_ALARM_APP);
|
|||
|
data_len += sizeof(T_ALARM_APP);
|
|||
|
|
|||
|
name_len = m_func_alarm_name_get(pTmp, index);
|
|||
|
pTmp += name_len;
|
|||
|
data_len += name_len;
|
|||
|
|
|||
|
if (rtc_func_structure_flag) {
|
|||
|
name_len = smart_rtc_alarm_extra_data_get(pTmp, index, 1);
|
|||
|
pTmp += name_len;
|
|||
|
data_len += name_len;
|
|||
|
}
|
|||
|
|
|||
|
printf("data_len = %d\n", data_len);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
put_buf(alarm_data, data_len);
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_ALRAM, alarm_data, data_len);
|
|||
|
}
|
|||
|
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_ALRAM_ACTIVE)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM_ACTIVE\n");
|
|||
|
u8 index_mask = 0;
|
|||
|
index_mask = m_func_alarm_get_active_index();
|
|||
|
printf("active alarm index : %d\n", index_mask);
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_ALRAM_ACTIVE, (u8 *)&index_mask, sizeof(index_mask));
|
|||
|
|
|||
|
/* extern void alarm_update_info_after_isr(void); */
|
|||
|
/* alarm_update_info_after_isr(); */
|
|||
|
}
|
|||
|
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_ALRAM_UNACTIVE)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM_UNACTIVE\n");
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_ALRAM_UNACTIVE, NULL, 0);
|
|||
|
}
|
|||
|
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_ALRAM_STRUCTURE)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM_STRUCTURE\n");
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_ALRAM_STRUCTURE, &rtc_func_structure_flag, sizeof(rtc_func_structure_flag));
|
|||
|
}
|
|||
|
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_ALRAM_DEFAULT_RING)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALRAM_DEFAULT_RING\n");
|
|||
|
u8 i;
|
|||
|
// total + index
|
|||
|
u8 ring_info_len = 1 + ALARM_IDEX_TONE_MAX_NUM;
|
|||
|
for (i = 0; i < ALARM_IDEX_TONE_MAX_NUM; i++) {
|
|||
|
// name_len + name_data
|
|||
|
ring_info_len += 1 + strlen(default_ringtone_name_table[i]) + 1;
|
|||
|
}
|
|||
|
|
|||
|
u8 default_offset = 0;
|
|||
|
u8 ring_name_len = 0;
|
|||
|
u8 *default_ring = zalloc(ring_info_len);
|
|||
|
default_ring[default_offset++] = ALARM_IDEX_TONE_MAX_NUM;
|
|||
|
for (i = 0; i < ALARM_IDEX_TONE_MAX_NUM; i++) {
|
|||
|
ring_name_len = strlen(default_ringtone_name_table[i]) + 1;
|
|||
|
default_ring[default_offset++] = i;
|
|||
|
default_ring[default_offset++] = ring_name_len;
|
|||
|
if (ring_name_len) {
|
|||
|
memcpy(default_ring + default_offset, default_ringtone_name_table[i], ring_name_len);
|
|||
|
}
|
|||
|
default_offset += ring_name_len;
|
|||
|
}
|
|||
|
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_ALRAM_DEFAULT_RING, default_ring, ring_info_len);
|
|||
|
if (default_ring) {
|
|||
|
free(default_ring);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (mask & BIT(RTC_INFO_ATTR_RTC_ALARM_EX)) {
|
|||
|
printf("RTC_INFO_ATTR_RTC_ALARM_EX\n");
|
|||
|
u8 tmp[1] = {1};
|
|||
|
offset += add_one_attr(buf, buf_size, offset, RTC_INFO_ATTR_RTC_ALARM_EX, tmp, 1);
|
|||
|
}
|
|||
|
|
|||
|
return offset;
|
|||
|
}
|
|||
|
|
|||
|
void smartbot_rtc_msg_deal(int msg)
|
|||
|
{
|
|||
|
struct smartbox *smart = smartbox_handle_get();
|
|||
|
if (smart == NULL) {
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
switch (msg) {
|
|||
|
case (int)-1 :
|
|||
|
rtc_ringing_prev_mode = smart->cur_app_mode;
|
|||
|
smartbox_function_update(RTC_FUNCTION_MASK, BIT(RTC_INFO_ATTR_RTC_ALRAM_ACTIVE));
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static void rtc_ring_stop_handle(void)
|
|||
|
{
|
|||
|
struct smartbox *smart = smartbox_handle_get();
|
|||
|
if (smart == NULL) {
|
|||
|
return ;
|
|||
|
}
|
|||
|
smartbox_function_update(RTC_FUNCTION_MASK, BIT(RTC_INFO_ATTR_RTC_ALRAM_STRUCTURE) | BIT(RTC_INFO_ATTR_RTC_ALRAM_UNACTIVE));
|
|||
|
smartbox_function_update(RTC_FUNCTION_MASK, BIT(RTC_INFO_ATTR_RTC_ALRAM));
|
|||
|
if ((u8) - 1 != rtc_ringing_prev_mode) {
|
|||
|
extern void alarm_play_timer_del(void);
|
|||
|
alarm_play_timer_del();
|
|||
|
smartbox_msg_post(USER_MSG_SMARTBOX_MODE_SWITCH, 2, (int)smart, rtc_ringing_prev_mode);
|
|||
|
rtc_ringing_prev_mode = -1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
u8 rtc_app_alarm_ring_play(u8 alarm_state);
|
|||
|
|
|||
|
void smart_rtc_ex_deal1(void *priv)
|
|||
|
{
|
|||
|
rtc_app_alarm_ring_play(1);
|
|||
|
}
|
|||
|
|
|||
|
void smart_rtc_ex_deal(void *priv)
|
|||
|
{
|
|||
|
rtc_ringing_prev_mode = 8;
|
|||
|
smart_rtc_ex_timer1 = sys_timer_add(NULL, smart_rtc_ex_deal1, 500);
|
|||
|
printf("ooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static void ring_play_ex(u8 index)
|
|||
|
{
|
|||
|
T_ALARM_APP_DATA_EX data = {0};
|
|||
|
data.len = 0x04;
|
|||
|
data.count |= 0x80;//可设置
|
|||
|
data.interval |= 0x80;
|
|||
|
data.alarmTime |= 0x80;
|
|||
|
u16 size = sizeof(data);
|
|||
|
if (sizeof(data) != syscfg_read(VM_ALARM_EX0 + index, &data, size)) {
|
|||
|
printf("read alarm error errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr\n");
|
|||
|
return;
|
|||
|
}
|
|||
|
put_buf((u8 *)&data, sizeof(data));
|
|||
|
if (count_flag == 0) {
|
|||
|
count = data.count & 0x0f;
|
|||
|
count_flag = 1;
|
|||
|
}
|
|||
|
u8 interval = data.interval & 0x1f;
|
|||
|
u8 alarmTime = data.alarmTime & 0x1f;
|
|||
|
flag++;
|
|||
|
if ((!(data.count & 0x0f)) || (!(data.interval & 0x1f)) || (!(data.alarmTime & 0x1f))) {
|
|||
|
extern void alarm_stop(void);
|
|||
|
alarm_stop();
|
|||
|
return;
|
|||
|
}
|
|||
|
if (flag == alarmTime * 3) { //闹铃结束
|
|||
|
flag = 0;
|
|||
|
count--;
|
|||
|
printf("count==================================================%d", count);
|
|||
|
if (count) {
|
|||
|
alarm_ex_flag = 1;
|
|||
|
smart_rtc_ex_timer = sys_timeout_add(NULL, smart_rtc_ex_deal, interval * 60 * 50);
|
|||
|
} else {
|
|||
|
alarm_ex_flag = 0;
|
|||
|
count_flag = 0;
|
|||
|
}
|
|||
|
extern void alarm_stop(void);
|
|||
|
alarm_stop();
|
|||
|
if (smart_rtc_ex_timer1) {
|
|||
|
sys_timer_del(smart_rtc_ex_timer1);
|
|||
|
smart_rtc_ex_timer1 = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
u8 rtc_app_alarm_ring_play(u8 alarm_state)
|
|||
|
{
|
|||
|
// 防止g_ring_audition成为临界资源,所以定义多一个局部变量
|
|||
|
static T_ALARM_APP_RING_AUDITION ringing_info = {0};
|
|||
|
u8 active_flag = m_func_alarm_get_active_index();
|
|||
|
u8 index;
|
|||
|
if (0 == active_flag && 0 == rtc_func_structure_flag) {
|
|||
|
return rtc_func_structure_flag;
|
|||
|
}
|
|||
|
|
|||
|
if (0 == alarm_state) {
|
|||
|
ringing_info.prev_app_mode = 0;
|
|||
|
ringing_info.ring_op = 0;
|
|||
|
ringing_info.ring_timeout = 0;
|
|||
|
smart_rtc_ring_audition_deal(&ringing_info);
|
|||
|
rtc_ring_stop_handle();
|
|||
|
return rtc_func_structure_flag;
|
|||
|
} else {
|
|||
|
if ((u32) - 1 == (--ringing_info.ring_timeout)) {
|
|||
|
ringing_info.ring_timeout = SMARTBOX_ALARM_RING_MAX;
|
|||
|
} else if (0 == ringing_info.ring_timeout) {
|
|||
|
ringing_info.ring_timeout = SMARTBOX_ALARM_RING_MAX;
|
|||
|
ring_play_ex(index);
|
|||
|
return rtc_func_structure_flag;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for (index = 0; index < 5; index++) {
|
|||
|
if (active_flag & BIT(index)) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (index < 5) {
|
|||
|
if (0 == ringing_info.prev_app_mode) {
|
|||
|
// 响铃会进入始终模式,这个时全局变量prev_app_mode应该清除
|
|||
|
g_ring_audition.prev_app_mode = -1;
|
|||
|
// 暂停正在播放的提示音或设备音乐
|
|||
|
g_ring_audition.ring_op = 0;
|
|||
|
smart_rtc_ring_audition_deal(&g_ring_audition);
|
|||
|
|
|||
|
T_ALARM_APP_EXTRA_DATA data = {0};
|
|||
|
u32 data_len = 0;
|
|||
|
|
|||
|
smart_rtc_alarm_extra_data_get(&data, index, 0);
|
|||
|
|
|||
|
ringing_info.prev_app_mode = -1;
|
|||
|
ringing_info.ring_op = 1;
|
|||
|
ringing_info.ring_type = data.type;
|
|||
|
ringing_info.ring_dev = data.dev;
|
|||
|
ringing_info.ring_clust = data.clust;
|
|||
|
}
|
|||
|
|
|||
|
if (get_rcsp_connect_status()) {
|
|||
|
smartbox_function_update(RTC_FUNCTION_MASK, BIT(RTC_INFO_ATTR_RTC_ALRAM_ACTIVE));
|
|||
|
}
|
|||
|
|
|||
|
if (ringing_info.ring_type) {
|
|||
|
if (!music_player_get_play_status()) {
|
|||
|
// 播放设备音乐
|
|||
|
printf("ringing............................\n");
|
|||
|
smartbox_rtc_play_dev_ring(&ringing_info);
|
|||
|
}
|
|||
|
} else {
|
|||
|
/* tone_play_by_path(default_ringtone_table[ringing_info.ring_clust], 0); */
|
|||
|
tone_play_with_callback_by_name(default_ringtone_table[ringing_info.ring_clust], 1, music_tone_play_end_callback, (void *)ringing_info.ring_clust);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return rtc_func_structure_flag;
|
|||
|
}
|
|||
|
|
|||
|
u8 smartbox_rtc_ring_tone(void)
|
|||
|
{
|
|||
|
general_player_init((struct __scan_callback *)&scan_cb);
|
|||
|
if ((u8) - 1 != g_ring_audition.prev_app_mode) {
|
|||
|
smart_rtc_ring_audition_deal(&g_ring_audition);
|
|||
|
} else if ((u8) - 1 == rtc_ringing_prev_mode) {
|
|||
|
app_task_switch_next();
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
void smartbox_rtc_mode_exit(void)
|
|||
|
{
|
|||
|
general_player_exit();
|
|||
|
struct smartbox *smart = smartbox_handle_get();
|
|||
|
if (smart == NULL) {
|
|||
|
return ;
|
|||
|
}
|
|||
|
if ((u8) - 1 != rtc_ringing_prev_mode) {
|
|||
|
rtc_ringing_prev_mode = smart->cur_app_mode;
|
|||
|
rtc_ring_stop_handle();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void rtc_func_stop(void)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
u32 rtc_func_get(void *priv, u8 *buf, u16 buf_size, u32 mask)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
bool rtc_func_set(void *priv, u8 *data, u16 len)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
void smartbot_rtc_msg_deal(int msg)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
u8 smartbox_rtc_ring_tone(void)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
void smartbox_rtc_mode_exit(void)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void rtc_func_stop(void)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#endif
|