/** 
 *  TaskScheduler测试
 *  时间关键信息的使用说明
 *
 *  任务1每秒运行一次，无限期运行
 *  每次运行时报告回调方法调用的延迟时间，
 *  以及调度超时时间
 *  每次运行任务1随机延迟最多2秒，模拟调度超时
 */
 
 #define _TASK_TIMECRITICAL      // 启用时间关键功能
 #define _TASK_SLEEP_ON_IDLE_RUN  // 启用空闲时睡眠功能
#include <TaskScheduler.h>        // 包含任务调度器库

// 回调方法原型
void t1Callback();


// 任务
Task t1(1000, -1, &t1Callback);  // 任务1：1000毫秒间隔，无限次运行，回调函数t1Callback

Scheduler runner;  // 调度器对象


void t1Callback() {
    Serial.print(millis());  // 打印当前时间（毫秒）
    Serial.print(": overrun = ");  // 打印超时信息
    Serial.print(t1.getOverrun());  // 打印任务超时时间
    Serial.print(", start delayed by ");  // 打印开始延迟信息
    Serial.println(t1.getStartDelay());  // 打印开始延迟时间
    
    int i = random(2000);   // 生成0-2000的随机数
    Serial.print("Delaying for "); Serial.println(i);  // 打印延迟时间
    delay(i);  // 延迟随机时间
}

void setup () {
  Serial.begin(115200);  // 初始化串口通信，波特率115200
  Serial.println("Scheduler TimeCritical TEST");  // 打印时间关键测试信息
  
  runner.init();  // 初始化调度器
  Serial.println("Initialized scheduler");  // 打印调度器初始化信息
  
  runner.addTask(t1);  // 添加任务1到调度器
  Serial.println("added t1. Waiting for 5 seconds.");  // 打印任务添加信息
  
  delay(5000);  // 延时5秒
  
  t1.enable();  // 启用任务1

  Serial.println("Enabled t1");  // 打印任务启用信息
}


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