/*
  程序: Software Timer
  公众号:孤独的二进制
  API:
    xTimerCreate //创建时间
    xTimerStart //时间开始
    到时间后,会运行callback函数
*/

TimerHandle_t lockHandle, checkHandle;

void carKey(void *ptParam) {
  byte lockPin = 23;
  pinMode(lockPin, INPUT_PULLUP);

  for (;;) {
    if (digitalRead(lockPin) == LOW) {
      //timeout 3000 ticks
      //xTimerStart 只是开启时间而已,而不是创造时间对象
      //所以如果多次按按钮的话,不会有多个时间对象生成
      //多次按按钮相当于每次对timer进行reset xTimerReset()
      if (xTimerStart(lockHandle, 3000) == pdPASS) {
        Serial.println("About to lock the car");
      } else {
        Serial.println("Unable to lock the car");
      };
      vTaskDelay(100); //very rude Button Debounce
    }

  }
}

void lockCarCallback(TimerHandle_t xTimer) {
  Serial.println("Timer CallBack: Car is Locked");
}

void checkCallback(TimerHandle_t xTimer) {
  // ------- 很复杂的检测汽车Sensors的方法,时间不定 ---------
  Serial.print(xTaskGetTickCount());Serial.println("  -  All Sensors are working."); vTaskDelay(random(10, 90));
}

void setup() {
  Serial.begin(115200);
  xTaskCreate(carKey,
              "Check If Owner Press Lock Button",
              1024 * 1,
              NULL,
              1,
              NULL);

  lockHandle = xTimerCreate("Lock Car",
                            2000, // ticks
                            pdFALSE, // 不循环,单次运行
                            (void *)0, // timer id
                            lockCarCallback); // 需执行函数

  checkHandle = xTimerCreate("Sensors Check",
                             100,
                             pdTRUE,
                             (void *)1,
                             checkCallback);

  //必须要在 portMAX_DELAY 内开启 timer start
  //portMAX_DELAY is listed as value for waiting indefinitely
  //实际上0xFFFFFFFF 2^32-1  49天 7周
  //在此期间,此task进入Block状态
  xTimerStart(checkHandle, portMAX_DELAY);
}

void loop() {
}