Upgrade Playlist Features
This commit is contained in:
140
main/alarm_manager.h
Normal file
140
main/alarm_manager.h
Normal 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
|
||||
Reference in New Issue
Block a user