#include <Arduino_FreeRTOS.h>
#include "semphr.h"

// Định nghĩa chân LED
#define LED 10

// Khai báo semaphore nhị phân
SemaphoreHandle_t xBinarySemaphore;

void setup() {
  // Khởi tạo Serial Monitor
  Serial.begin(9600);
  
  // Cấu hình chân LED là OUTPUT
  pinMode(LED, OUTPUT);

  // Tạo semaphore nhị phân
  xBinarySemaphore = xSemaphoreCreateBinary();
  if (xBinarySemaphore == NULL) {
    Serial.println("Không thể tạo semaphore");
    while (1); // Dừng chương trình nếu không thể tạo semaphore
  }

  // Tạo các task
  xTaskCreate(LedOnTask, "LedON", 100, NULL, 1, NULL);
  xTaskCreate(LedoffTask, "LedOFF", 100, NULL, 1, NULL);

  // Nhả semaphore để task đầu tiên có thể chạy
  xSemaphoreGive(xBinarySemaphore);
}

void loop() {
  // Không cần làm gì trong hàm loop
}

// Task bật LED
void LedOnTask(void *pvParameters) {
  while (1) {
    // Chờ semaphore
    if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
      Serial.println("Inside LedOnTask");
      digitalWrite(LED, LOW); // Bật LED
      vTaskDelay(1000 / portTICK_PERIOD_MS); // Chờ 1 giây
      // Nhả semaphore
      xSemaphoreGive(xBinarySemaphore);
      vTaskDelay(1); // Chờ 1 tick trước khi lặp lại
    }
  }
}

// Task tắt LED
void LedoffTask(void *pvParameters) {
  while (1) {
    // Chờ semaphore
    if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
      Serial.println("Inside LedoffTask");
      digitalWrite(LED, HIGH); // Tắt LED
      vTaskDelay(1000 / portTICK_PERIOD_MS); // Chờ 1 giây
      // Nhả semaphore
      xSemaphoreGive(xBinarySemaphore);
      vTaskDelay(1); // Chờ 1 tick trước khi lặp lại
    }
  }
}