141 lines
5.0 KiB
C++
141 lines
5.0 KiB
C++
#ifndef ALARM_MANAGER_H
|
||
#define ALARM_MANAGER_H
|
||
|
||
#include <string>
|
||
#include <vector>
|
||
#include <memory>
|
||
#include <functional>
|
||
#include <esp_timer.h>
|
||
#include "settings.h"
|
||
|
||
// 闹钟重复模式
|
||
enum AlarmRepeatMode {
|
||
kAlarmOnce = 0, // 一次性闹钟
|
||
kAlarmDaily = 1, // 每日重复
|
||
kAlarmWeekdays = 2, // 工作日(周一到周五)
|
||
kAlarmWeekends = 3, // 周末(周六周日)
|
||
kAlarmCustom = 4 // 自定义星期(使用weekdays_mask)
|
||
};
|
||
|
||
// 闹钟状态
|
||
enum AlarmStatus {
|
||
kAlarmEnabled = 0, // 启用
|
||
kAlarmDisabled = 1, // 禁用
|
||
kAlarmTriggered = 2, // 已触发(等待贪睡或关闭)
|
||
kAlarmSnoozed = 3 // 贪睡中
|
||
};
|
||
|
||
// 闹钟项结构
|
||
struct AlarmItem {
|
||
int id; // 闹钟ID
|
||
int hour; // 小时 (0-23)
|
||
int minute; // 分钟 (0-59)
|
||
AlarmRepeatMode repeat_mode; // 重复模式
|
||
uint8_t weekdays_mask; // 星期掩码 (bit0=周日, bit1=周一, ..., bit6=周六)
|
||
AlarmStatus status; // 闹钟状态
|
||
std::string label; // 闹钟标签/备注
|
||
std::string music_name; // 指定的音乐名称(空则使用默认铃声)
|
||
int snooze_count; // 当前贪睡次数
|
||
int max_snooze_count; // 最大贪睡次数 (默认3次)
|
||
int snooze_minutes; // 贪睡间隔(分钟,默认5分钟)
|
||
int64_t last_triggered_time; // 上次触发时间戳(避免重复触发)
|
||
int64_t next_snooze_time; // 下次贪睡时间戳
|
||
|
||
AlarmItem() : id(0), hour(0), minute(0), repeat_mode(kAlarmOnce),
|
||
weekdays_mask(0), status(kAlarmEnabled), label(""),
|
||
music_name(""), snooze_count(0), max_snooze_count(3),
|
||
snooze_minutes(5), last_triggered_time(0), next_snooze_time(0) {}
|
||
};
|
||
|
||
// 闹钟触发回调类型
|
||
using AlarmTriggeredCallback = std::function<void(const AlarmItem& alarm)>;
|
||
using AlarmSnoozeCallback = std::function<void(const AlarmItem& alarm)>;
|
||
using AlarmStopCallback = std::function<void(const AlarmItem& alarm)>;
|
||
|
||
class AlarmManager {
|
||
public:
|
||
static AlarmManager& GetInstance() {
|
||
static AlarmManager instance;
|
||
return instance;
|
||
}
|
||
|
||
// 删除拷贝构造函数和赋值运算符
|
||
AlarmManager(const AlarmManager&) = delete;
|
||
AlarmManager& operator=(const AlarmManager&) = delete;
|
||
|
||
// 初始化和清理
|
||
void Initialize();
|
||
void Cleanup();
|
||
|
||
// 闹钟管理
|
||
int AddAlarm(int hour, int minute, AlarmRepeatMode repeat_mode = kAlarmOnce,
|
||
const std::string& label = "", const std::string& music_name = "");
|
||
bool RemoveAlarm(int alarm_id);
|
||
bool EnableAlarm(int alarm_id, bool enabled = true);
|
||
bool ModifyAlarm(int alarm_id, int hour, int minute, AlarmRepeatMode repeat_mode = kAlarmOnce,
|
||
const std::string& label = "", const std::string& music_name = "");
|
||
|
||
// 查询功能
|
||
std::vector<AlarmItem> GetAllAlarms() const;
|
||
AlarmItem* GetAlarm(int alarm_id);
|
||
std::vector<AlarmItem> GetActiveAlarms() const;
|
||
std::string GetNextAlarmInfo() const; // 获取下一个闹钟的信息字符串
|
||
|
||
// 贪睡和停止
|
||
bool SnoozeAlarm(int alarm_id);
|
||
bool StopAlarm(int alarm_id);
|
||
void StopAllActiveAlarms();
|
||
|
||
// 时间检查 (由Application的CLOCK_TICK调用)
|
||
void CheckAlarms();
|
||
|
||
// 回调设置
|
||
void SetAlarmTriggeredCallback(AlarmTriggeredCallback callback);
|
||
void SetAlarmSnoozeCallback(AlarmSnoozeCallback callback);
|
||
void SetAlarmStopCallback(AlarmStopCallback callback);
|
||
|
||
// 配置设置
|
||
void SetDefaultSnoozeMinutes(int minutes);
|
||
void SetDefaultMaxSnoozeCount(int count);
|
||
|
||
// 时间工具
|
||
static std::string FormatTime(int hour, int minute);
|
||
static std::string FormatAlarmTime(const AlarmItem& alarm);
|
||
static bool IsWeekdayActive(const AlarmItem& alarm, int weekday); // 0=周日, 1=周一, ..., 6=周六
|
||
|
||
private:
|
||
AlarmManager();
|
||
~AlarmManager();
|
||
|
||
// 内部方法
|
||
void LoadAlarmsFromStorage();
|
||
void SaveAlarmsToStorage();
|
||
void SaveAlarmToStorage(const AlarmItem& alarm);
|
||
void RemoveAlarmFromStorage(int alarm_id);
|
||
|
||
int GetNextAlarmId();
|
||
bool ShouldTriggerToday(const AlarmItem& alarm) const;
|
||
int64_t GetCurrentTimeInMinutes() const; // 获取当前时间的分钟数(从午夜开始)
|
||
int GetCurrentWeekday() const; // 获取当前星期几
|
||
|
||
// 成员变量
|
||
std::vector<std::unique_ptr<AlarmItem>> alarms_;
|
||
std::unique_ptr<Settings> settings_;
|
||
bool initialized_;
|
||
int next_alarm_id_;
|
||
|
||
// 配置
|
||
int default_snooze_minutes_;
|
||
int default_max_snooze_count_;
|
||
|
||
// 回调函数
|
||
AlarmTriggeredCallback on_alarm_triggered_;
|
||
AlarmSnoozeCallback on_alarm_snoozed_;
|
||
AlarmStopCallback on_alarm_stopped_;
|
||
|
||
// 互斥锁保护
|
||
mutable std::mutex alarms_mutex_;
|
||
};
|
||
|
||
#endif // ALARM_MANAGER_H
|