#include <Arduino_FreeRTOS.h>
#include <queue.h>

QueueHandle_t queue;

// Task gửi dữ liệu
void TaskSendData(void *pvParameters) {
  int valueToSend = 0;
  while (1) {
    valueToSend = random(0, 15); // Sinh ra giá trị ngẫu nhiên từ 0 đến 14
    xQueueSend(queue, &valueToSend, portMAX_DELAY);
    vTaskDelay(1000 / portTICK_PERIOD_MS); // Gửi dữ liệu mỗi giây
  }
}

// Task nhận dữ liệu
void TaskReceiveData(void *pvParameters) {
  int receivedValue;
  while (1) {
    if (xQueueReceive(queue, &receivedValue, 1000 / portTICK_PERIOD_MS) == pdPASS) {
      if (receivedValue >= 4 && receivedValue <= 10) {
        digitalWrite(8, LOW); // Tắt LED 8
        digitalWrite(9, HIGH); // Bật LED 9
      } else {
        digitalWrite(8, HIGH); // Bật LED 8
        digitalWrite(9, LOW); // Tắt LED 9
      }
    }
    vTaskDelay(500 / portTICK_PERIOD_MS); // Đọc hàng đợi mỗi 500 ms
  }
}

void setup() {
  // Khởi tạo các chân LED
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);

  // Tạo hàng đợi với chiều dài 10 và kích thước của một phần tử là int
  queue = xQueueCreate(10, sizeof(int));

  if (queue != NULL) {
    // Tạo hai task
    xTaskCreate(TaskSendData, "TaskSendData", 128, NULL, 1, NULL);
    xTaskCreate(TaskReceiveData, "TaskReceiveData", 128, NULL, 1, NULL);

    // Bắt đầu hệ điều hành đa nhiệm FreeRTOS
    vTaskStartScheduler();
  }
}

void loop() {
  // Không sử dụng hàm loop() khi sử dụng FreeRTOS
}