// GPIO LED
#define RedLEDPin 4
#define GreenLEDPin 14

// Using C struct to define LED parameters
typedef struct led_st {
  uint8_t LEDpin;
  unsigned long delay_ms;
} ledStruct;

// C unique Task Function using C struct parameter
static void blinkLED(void *arg) {
  ledStruct *myLED = (ledStruct *)arg;

  pinMode(myLED->LEDpin, OUTPUT);
  while (1) {
    digitalWrite(myLED->LEDpin, HIGH);
    delay(myLED->delay_ms);
    digitalWrite(myLED->LEDpin, LOW);
    delay(myLED->delay_ms);
  }
}

// 2 LED behaviours - C struct 
ledStruct rLED = {RedLEDPin, 1000};
ledStruct gLED = {GreenLEDPin, 500};

void setup() {
  Serial.begin(115200);

  // One single Task Function using a C stuct pointer as parameter
  xTaskCreate(
    blinkLED             // Single C Task Function
    ,  "Red LED Blinker" // A name just for humans
    ,  2048              // The stack size
    ,  &rLED             // Task parameter - C Struct pointer Red LED data
    ,  2                 // Priority
    ,  NULL              // Task handle is not used here - simply pass NULL
    );
  xTaskCreate(
    blinkLED                // Single C Task Function
    ,  "Green LED Blinker"  // A name just for humans
    ,  2048                 // The stack size
    ,  &gLED                // Task parameter - C Struct pointer Green LED data
    ,  2                    // Priority
    ,  NULL                 // Task handle is not used here - simply pass NULL
    );
}

void loop() {
  // When using Task, loop() is free for any other need.
  // Blinking the LED is done in the Task Function
  Serial.println("Looping...");
  delay(5000);
}