#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define BUTTON_01 GPIO_NUM_13
#define BUTTON_02 GPIO_NUM_12
#define BUTTON_03 GPIO_NUM_14
TaskHandle_t task1_handle, task2_handle, task3_handle;
void task1(void *pvParameter) {
  while(1) {
    printf("Task 1 is running\n");
    vTaskDelay(pdMS_TO_TICKS(500));
  }
}
void task2(void *pvParameter) {
  while(1) {
    printf("Task 2 is running\n");
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}
void task3(void *pvParameter) {
  while(1) {
    printf("Task 3 is running\n");
    vTaskDelay(pdMS_TO_TICKS(2000));
  }
}
extern "C"{
void app_main() {
  // Set the button pins as inputs
  gpio_set_direction(BUTTON_01, GPIO_MODE_INPUT);
  gpio_set_direction(BUTTON_02, GPIO_MODE_INPUT);
  gpio_set_direction(BUTTON_03, GPIO_MODE_INPUT);
  // Create the tasks
  xTaskCreate(task1, "Task 1", 2048, NULL, 2, &task1_handle);
  xTaskCreate(task2, "Task 2", 2048, NULL, 1, &task2_handle);
  xTaskCreate(task3, "Task 3", 2048, NULL, 1, &task3_handle);
  // Set the initial priorities
  vTaskPrioritySet(task1_handle, 2);
  vTaskPrioritySet(task2_handle, 1);
  vTaskPrioritySet(task3_handle, 1);
  while(1) {
    // Check the state of each button
    if(gpio_get_level(BUTTON_01) == 1) {
      // Suspend task 2
      vTaskSuspend(task2_handle);
      printf("Task 2 suspended\n");
    }
    if(gpio_get_level(BUTTON_02) == 1) {
      // Resume task 2
      vTaskResume(task2_handle);
      printf("Task 2 resumed\n");
    }
    if((gpio_get_level(BUTTON_03) == 1)) {
      // Delete task 3
      TaskHandle_t taskHandle = xTaskGetHandle("Task 3");
      if(taskHandle != NULL){
        vTaskDelete(task3_handle);
        printf("Task 3 deleted\n");
      }
    }
    // Delay for a short period
    vTaskDelay(pdMS_TO_TICKS(1500));
    TaskHandle_t taskHandle = xTaskGetHandle("Task 3");
    printf("%p \n",taskHandle);
  }
}
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// #include "freertos/FreeRTOS.h"
// #include "freertos/task.h"
// #include "driver/gpio.h"
// #define BUTTON_01 GPIO_NUM_13
// #define BUTTON_02 GPIO_NUM_12
// #define BUTTON_03 GPIO_NUM_14
// TaskHandle_t task1_handle, task2_handle, task3_handle;
// void task1(void *pvParameter) {
//   while(1) {
//     printf("Task 1 is running\n");
//     vTaskDelay(pdMS_TO_TICKS(500));
//   }
// }
// void task2(void *pvParameter) {
//   while(1) {
//     printf("Task 2 is running\n");
//     vTaskDelay(pdMS_TO_TICKS(1000));
//   }
// }
// void task3(void *pvParameter) {
//   while(1) {
//     printf("Task 3 is running\n");
//     vTaskDelay(pdMS_TO_TICKS(2000));
//   }
// }
// extern "C"{
// void app_main() {
//   // Set the button pins as inputs
//   gpio_set_direction(BUTTON_01, GPIO_MODE_INPUT);
//   gpio_set_direction(BUTTON_02, GPIO_MODE_INPUT);
//   gpio_set_direction(BUTTON_03, GPIO_MODE_INPUT);
//xTaskCreate(task1,"task1",2048,NULL,1,&task1_handle);
//xTaskCreate(task1,"task1",2048,NULL,1,&task1_handle);
//   // Create the tasks
//   xTaskCreate(task1, "Task 1", 2048, NULL, 2, &task1_handle);
//   xTaskCreate(task2, "Task 2", 2048, NULL, 1, &task2_handle);
//   xTaskCreate(task3, "Task 3", 2048, NULL, 1, &task3_handle);
//   // Set the initial priorities
//   vTaskPrioritySet(task1_handle, 2);
//   vTaskPrioritySet(task2_handle, 1);
//   vTaskPrioritySet(task3_handle, 1);
//   while(1) {
//     // Check the state of each button
//     if(gpio_get_level(BUTTON_01) == 1) {
//       // Suspend task 2
//       vTaskSuspend(task2_handle);
//       printf("Task 2 suspended\n");
//     }
//     if(gpio_get_level(BUTTON_02) == 1) {
//       // Resume task 2
//       vTaskResume(task2_handle);
//       printf("Task 2 resumed\n");
//     }
//     if((gpio_get_level(BUTTON_03) == 1)) {
//       // Delete task 3
//       TaskHandle_t taskHandle = xTaskGetHandle("Task 3");
//       if(taskHandle != NULL){
//         vTaskDelete(task3_handle);
//         printf("Task 3 deleted\n");
//       }
//     }
//     // Delay for a short period
//     vTaskDelay(pdMS_TO_TICKS(1500));
//     TaskHandle_t taskHandle = xTaskGetHandle("Task 3");
//     printf("%p \n",taskHandle);
//   }
// }
// }
// #include <stdio.h>
// #include "freertos/FreeRTOS.h"
// #include "freertos/task.h"
// TaskHandle_t task1_handle;
// void task1(*pvParameters){
//   printf("task1 is running %p \n",task1_handle);
// }