125 lines
4.1 KiB
C
125 lines
4.1 KiB
C
#include "power_display_service.h"
|
||
#include "securec.h"
|
||
#include "sys_config.h"
|
||
#include "common_def.h"
|
||
#include "sys_typedef.h"
|
||
#include "service_alarm.h"
|
||
#include "soc_osal.h"
|
||
#include "cmsis_os2.h"
|
||
#include "sql_alarm.h"
|
||
#include "rtc_api.h"
|
||
#include "task_service_timer.h"
|
||
#include "TjdUiMsgCenter.h"
|
||
#include <stdio.h>
|
||
|
||
static struct alarm_time g_time_data;
|
||
struct delay_alarm g_delay_alarm;
|
||
|
||
static bool isDayInMask(uint8_t dayOfWeek, uint8_t dayMask)
|
||
{
|
||
// 检查dayOfWeek是否在有效范围内(0-6代表周日到周六)
|
||
if (dayOfWeek >= 7) {
|
||
return false;
|
||
}
|
||
|
||
// 对于周日(dayOfWeek为0),我们需要检查dayMask中的0x40位
|
||
if (dayOfWeek == 0) {
|
||
return (dayMask & 0x40) != 0;
|
||
}
|
||
|
||
// 对于其他天(周一至周六),我们可以直接进行位运算
|
||
uint8_t mask = 1 << (dayOfWeek - 1); // 注意这里减1,因为dayMask从0x01开始(周一)
|
||
return (dayMask & mask) != 0;
|
||
}
|
||
|
||
static signed int tjd_service_alarm_handle(void *param)
|
||
{
|
||
struct rtc_class_ops *rtc_handle = tjd_driver_rtc_get_ops();
|
||
struct rtc_time time;
|
||
rtc_handle->get_rtc_time(&time);
|
||
|
||
uint8_t weekday = time.tm_wday;
|
||
uint8_t hour = time.tm_hour;
|
||
uint8_t minute = time.tm_min;
|
||
uint8_t second = time.tm_sec;
|
||
if (second != 0) return 1000;
|
||
|
||
uint8_t alarm_counts = sql_alarm_get_alarm_number(NULL);
|
||
uint8_t alarms_id[alarm_counts];
|
||
uint8_t *array_ptr = alarms_id;
|
||
sql_alarm_get_alarm_index_list(&array_ptr);
|
||
|
||
if (g_delay_alarm.enable) {
|
||
if (g_delay_alarm.time.hour==hour && g_delay_alarm.time.minute==minute){
|
||
// 发送通知
|
||
g_delay_alarm.enable = false;
|
||
g_time_data.hour = g_delay_alarm.time.hour;
|
||
g_time_data.minute = g_delay_alarm.time.minute;
|
||
uint32_t size = sizeof(struct alarm_time);
|
||
TjdUiMsgEventPublish(TJDUI_TOPIC_EVENT_ALARM, &g_time_data, size);
|
||
}
|
||
}
|
||
|
||
for (int i=0; i<alarm_counts; i++){
|
||
if (!sql_alarm_get_switch(alarms_id[i])) return 1000;
|
||
|
||
uint8_t alarm_hour;
|
||
uint8_t alarm_min;
|
||
sql_alarm_get_time(alarms_id[i], &alarm_hour, &alarm_min);
|
||
uint8_t alarm_cycle_mode = sql_alarm_get_cycle(alarms_id[i]);
|
||
|
||
if ((alarm_hour==hour && alarm_min==minute && isDayInMask(weekday, alarm_cycle_mode))
|
||
|| (alarm_hour==hour && alarm_min==minute && alarm_cycle_mode==0x00)){
|
||
// 发送通知
|
||
g_time_data.hour = alarm_hour;
|
||
g_time_data.minute = alarm_min;
|
||
uint32_t size = sizeof(struct alarm_time);
|
||
TjdUiMsgEventPublish(TJDUI_TOPIC_EVENT_ALARM, &g_time_data, size);
|
||
|
||
if (alarm_cycle_mode == 0x00) {// 一次性闹钟
|
||
sql_alarm_set_valid(i,false);
|
||
}
|
||
}
|
||
}
|
||
|
||
return 1000;
|
||
}
|
||
|
||
static void tjd_service_alarm_start_send(void)
|
||
{
|
||
queue_default_info_t msg_data = { tjd_service_alarm_handle, NULL, 1000, NULL};
|
||
osal_msg_queue_write_copy(tjd_task_service_timer_get_queue_id(), (void *)&msg_data, sizeof(queue_default_info_t), 0);
|
||
}
|
||
|
||
static void tjd_service_alarm_end_send(void)
|
||
{
|
||
queue_default_info_t msg_data = { tjd_service_alarm_handle, NULL, 0, NULL};
|
||
osal_msg_queue_write_copy(tjd_task_service_timer_get_queue_id(), (void *)&msg_data, sizeof(queue_default_info_t), 0);
|
||
}
|
||
|
||
void tjd_service_alarm_set_delay_alarm(uint8_t hour, uint8_t min)
|
||
{
|
||
g_delay_alarm.enable = true;
|
||
g_delay_alarm.time.hour = hour;
|
||
g_delay_alarm.time.minute = min;
|
||
}
|
||
|
||
void tjd_service_alarm_open(void)
|
||
{
|
||
tjd_service_alarm_start_send();
|
||
}
|
||
|
||
void tjd_service_alarm_close(void)
|
||
{
|
||
tjd_service_alarm_end_send();
|
||
}
|
||
|
||
static void tjd_service_alarm_set_screen_on(int32_t timeout)
|
||
{
|
||
const power_display_svr_api_t *display_api = power_display_svr_get_api();
|
||
if (display_api->get_screen_state() != SCREEN_ON) {
|
||
display_api->turn_on_screen();
|
||
}
|
||
// display_api->set_screen_set_keepon_timeout(timeout);
|
||
return;
|
||
} |