#ifndef ALARM_MANAGER_H #define ALARM_MANAGER_H #include #include #include #include #include #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; using AlarmSnoozeCallback = std::function; using AlarmStopCallback = std::function; 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 GetAllAlarms() const; AlarmItem* GetAlarm(int alarm_id); std::vector 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> alarms_; std::unique_ptr 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