#include <Arduino_FreeRTOS.h>
#include <semphr.h>
SemaphoreHandle_t interruptSemaphore;

void setup() 
{
  Serial.begin(9600); 
  pinMode(LED_BUILTIN, OUTPUT);

// Tạo 2 task
    xTaskCreate(TaskLedon, // Task function
              "Ledon", // Task name
              128, // Stack size 
              NULL, 
              0 ,// Priority
              NULL );
   xTaskCreate(TaskLedoff, // Task function
              "Ledoff", // Task name
              128, // Stack size 
              NULL, 
              0, // Priority
              NULL );
  interruptSemaphore = xSemaphoreCreateBinary();
  if (interruptSemaphore != NULL) 
  {
    // Thiết lập interrupt vào chân 2 khi nhả nút nhấn
    attachInterrupt(digitalPinToInterrupt(2), interruptHandler, HIGH);
  }  
}

void loop() {}

// Hàm phục vụ ngắt: give token khi ngắt xảy ra
void interruptHandler() 
{ 
  Serial.println("Semaphore is given");
  BaseType_t  xHigherPriorityTaskWoken  pdFALSE;
  xSemaphoreGiveFromISR(interruptSemaphore, &xHigherPriorityTaskWoken);
}

// Thực hiện take token, bật đèn khi thành công
void TaskLedon(void *pvParameters)
{
  (void) pvParameters;

  for (;;) 
  {
    if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS) 
    {
      Serial.println("TaskLedon Received Semaphore");
      digitalWrite(LED_BUILTIN, HIGH);
    }
  }
}
// Thực hiện take token, tắt đèn khi take thành công
void TaskLedoff(void *pvParameters)
{
  (void) pvParameters;
  for (;;) 
  {
    if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS)
    {
      Serial.println("TaskLedoff Received Semaphore");
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}