#if CONFIG_FREERTOS_UNICORE
#define ESP32_RUNNING_CORE 0
#else
#define ESP32_RUNNING_CORE 1
#endif

static const int LED_PIN = 23;
const char msg[] = "Hello Everyone";

static TaskHandle_t Task_1 = NULL;
static TaskHandle_t Task_2 = NULL;

void starttask1 (void* parameter)
{
  int msg_len = strlen(msg);
  while(1)
  {
    Serial.println();
    for(int i=0;i<msg_len;i++)
    {
      Serial.print(msg[i]);
    }
    Serial.println();
    vTaskDelay(1000/portTICK_PERIOD_MS);
  }
}

void toggleLED(void* parameter)
{
  while(1)
  {
    digitalWrite(LED_PIN,HIGH);
    vTaskDelay(500/portTICK_PERIOD_MS);
    digitalWrite(LED_PIN,LOW);
    vTaskDelay(500/portTICK_PERIOD_MS);
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");
  Serial.print(xPortGetCoreID());
  Serial.print("with Priority");
  Serial.print(uxTaskPriorityGet(NULL));
  pinMode(LED_PIN,OUTPUT);

  xTaskCreatePinnedToCore(
    toggleLED,
    "Toggle LED",
    1024,
    NULL,
    1,
    &Task_1,
    ESP32_RUNNING_CORE);

   xTaskCreatePinnedToCore(
    starttask1,
    "Print message", 
    1500,
    NULL,
    1,
    &Task_2,
    ESP32_RUNNING_CORE);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  for (int i =0;i<2;i++)
  {
    vTaskSuspend(Task_2);
    vTaskDelay(2000/portTICK_PERIOD_MS);
    vTaskResume(Task_2);
    
  }

  if(Task_1 != NULL)
  {
    Serial.println("Task1 Resumed");
        vTaskSuspend(Task_1);
  }
  else
  {
    vTaskResume(Task_1);
        Serial.println("Hi");
    Task_1 =NULL;
  
  }
    
}