Upgrade Playlist Features

This commit is contained in:
2025-12-09 17:20:01 +08:00
parent 577990de69
commit 8bd2780688
683 changed files with 91812 additions and 81260 deletions

140
main/alarm_manager.h Normal file
View File

@@ -0,0 +1,140 @@
#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