/** 
 *  TaskScheduler 测试示例
 *
 *  初始时只有任务1和任务2被启用
 *  任务1每2秒运行一次，运行10次后停止
 *  任务2每3秒运行一次，无限期运行
 *  任务1在第一次运行时启用任务3
 *  任务3每5秒运行一次
 *  任务1在最后一次迭代时禁用任务3，并将任务2的运行间隔改为每1/2秒
 *  最终只有任务2每1/2秒运行
 */
 
 
#include <TaskScheduler.h>  // 包含TaskScheduler库

// 回调方法原型声明
void t1Callback();
void t2Callback();
void t3Callback();

// 任务定义
Task t4();  // 空任务定义（未使用）
Task t1(2000, 10, &t1Callback);      // 任务1：每2000毫秒运行一次，运行10次
Task t2(3000, TASK_FOREVER, &t2Callback);  // 任务2：每3000毫秒运行一次，无限期运行
Task t3(5000, TASK_FOREVER, &t3Callback);  // 任务3：每5000毫秒运行一次，无限期运行

Scheduler runner;  // 创建调度器对象


void t1Callback() {
    Serial.print("t1: ");  // 打印任务1标识
    Serial.println(millis());  // 打印当前时间戳
    
    if (t1.isFirstIteration()) {
      runner.addTask(t3);  // 将任务3添加到调度器
      t3.enable();  // 启用任务3
      Serial.println("t1: enabled t3 and added to the chain");  // 打印任务3已启用并添加到链表的确认信息
    }
    
    if (t1.isLastIteration()) {
      t3.disable();  // 禁用任务3
      runner.deleteTask(t3);  // 从调度器中删除任务3
      t2.setInterval(500);  // 将任务2的运行间隔改为500毫秒（每0.5秒）
      Serial.println("t1: disable t3 and delete it from the chain. t2 interval set to 500");  // 打印任务3已禁用删除，任务2间隔已修改的确认信息
    }
}

void t2Callback() {
    Serial.print("t2: ");  // 打印任务2标识
    Serial.println(millis());  // 打印当前时间戳
  
}

void t3Callback() {
    Serial.print("t3: ");  // 打印任务3标识
    Serial.println(millis());  // 打印当前时间戳
  
}

void setup () {
  Serial.begin(115200);  // 初始化串口通信，波特率115200
  Serial.println("Scheduler TEST");  // 打印测试标题
  
  runner.init();  // 初始化调度器
  Serial.println("Initialized scheduler");  // 打印调度器初始化完成信息
  
  runner.addTask(t1);  // 将任务1添加到调度器
  Serial.println("added t1");  // 打印任务1添加完成信息
  
  runner.addTask(t2);  // 将任务2添加到调度器
  Serial.println("added t2");  // 打印任务2添加完成信息

  delay(5000);  // 延时5秒，让用户有时间打开串口监视器
  
  t1.enable();  // 启用任务1
  Serial.println("Enabled t1");  // 打印任务1启用信息
  t2.enable();  // 启用任务2
  Serial.println("Enabled t2");  // 打印任务2启用信息
}


void loop () {
  runner.execute();  // 执行调度器，运行所有已安排的任务
}