mcu_hi3321_watch/tjd/service/service_alarm.c
2025-05-26 20:15:20 +08:00

125 lines
4.1 KiB
C
Raw 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 "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;
}