Files
xiaozhi-esp32/main/timer_manager.h
2025-09-15 22:04:01 +08:00

165 lines
5.6 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.
#ifndef TIMER_MANAGER_H
#define TIMER_MANAGER_H
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <thread>
#include <atomic>
#include <mutex>
#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/timers.h>
// 定时任务类型
enum class TimerType {
COUNTDOWN, // 倒计时
DELAYED_EXEC, // 延时执行
PERIODIC, // 周期性任务
SCHEDULED // 定时执行
};
// 定时任务状态
enum class TimerStatus {
PENDING, // 等待中
RUNNING, // 运行中
COMPLETED, // 已完成
CANCELLED, // 已取消
FAILED // 失败
};
// MCP工具回调函数类型
using McpToolCallback = std::function<bool(const std::string& tool_name, const std::string& arguments)>;
// 定时任务结构
struct TimerTask {
std::string id; // 唯一标识符
std::string name; // 任务名称
TimerType type; // 任务类型
TimerStatus status; // 任务状态
uint32_t duration_ms; // 持续时间(毫秒)
time_t scheduled_time; // 预定执行时间
time_t created_time; // 创建时间
time_t start_time; // 开始时间
time_t end_time; // 结束时间
// MCP工具相关
std::string mcp_tool_name; // MCP工具名称
std::string mcp_tool_args; // MCP工具参数
McpToolCallback callback; // 回调函数
// 周期性任务相关
uint32_t interval_ms; // 间隔时间(毫秒)
int repeat_count; // 重复次数(-1表示无限
int current_repeat; // 当前重复次数
// 用户数据
std::string user_data; // 用户自定义数据
std::string description; // 任务描述
TimerTask() : type(TimerType::COUNTDOWN), status(TimerStatus::PENDING),
duration_ms(0), scheduled_time(0), created_time(0),
start_time(0), end_time(0), interval_ms(0),
repeat_count(0), current_repeat(0) {}
};
class TimerManager {
public:
static TimerManager& GetInstance() {
static TimerManager instance;
return instance;
}
// 倒计时器功能
std::string CreateCountdownTimer(const std::string& name,
uint32_t duration_ms,
const std::string& description = "");
// 延时执行MCP工具
std::string CreateDelayedMcpTask(const std::string& name,
uint32_t delay_ms,
const std::string& mcp_tool_name,
const std::string& mcp_tool_args = "",
const std::string& description = "");
// 周期性任务
std::string CreatePeriodicTask(const std::string& name,
uint32_t interval_ms,
int repeat_count = -1, // -1表示无限重复
const std::string& mcp_tool_name = "",
const std::string& mcp_tool_args = "",
const std::string& description = "");
// 定时执行任务
std::string CreateScheduledTask(const std::string& name,
time_t scheduled_time,
const std::string& mcp_tool_name,
const std::string& mcp_tool_args = "",
const std::string& description = "");
// 任务管理
bool StartTask(const std::string& task_id);
bool StopTask(const std::string& task_id);
bool CancelTask(const std::string& task_id);
bool DeleteTask(const std::string& task_id);
// 查询功能
TimerTask* GetTask(const std::string& task_id);
std::vector<TimerTask> GetAllTasks();
std::vector<TimerTask> GetTasksByStatus(TimerStatus status);
std::vector<TimerTask> GetRunningTasks();
std::vector<TimerTask> GetUpcomingTasks(int minutes = 60);
// 统计功能
int GetTaskCount();
int GetTaskCountByStatus(TimerStatus status);
int GetTaskCountByType(TimerType type);
// 系统控制
void StartManager();
void StopManager();
bool IsRunning();
// 回调设置
void SetTaskCompletedCallback(std::function<void(const TimerTask&)> callback);
void SetTaskFailedCallback(std::function<void(const TimerTask&, const std::string&)> callback);
// 数据持久化
bool SaveToStorage();
bool LoadFromStorage();
// 导出功能
std::string ExportToJson();
private:
TimerManager();
~TimerManager();
// 内部方法
std::string GenerateTaskId();
void TaskWorker();
void ExecuteTask(TimerTask& task);
bool ExecuteMcpTool(const std::string& tool_name, const std::string& args);
void UpdateTaskStatus(TimerTask& task, TimerStatus status);
void NotifyTaskCompleted(const TimerTask& task);
void NotifyTaskFailed(const TimerTask& task, const std::string& error);
// FreeRTOS定时器回调
static void TimerCallback(TimerHandle_t timer_handle);
std::map<std::string, TimerTask> tasks_;
std::map<std::string, TimerHandle_t> timers_;
std::mutex tasks_mutex_;
std::atomic<bool> is_running_;
std::thread worker_thread_;
// 回调函数
std::function<void(const TimerTask&)> task_completed_callback_;
std::function<void(const TimerTask&, const std::string&)> task_failed_callback_;
static const char* TAG;
};
#endif // TIMER_MANAGER_H