/*
 * led_task.c
 *
 *  Created on: Oct 6, 2025
 *      Author: jomaa
 */

#include "led_task.h"

TaskHandle_t hButtonTask;
TaskHandle_t hLedTask;

void CreateLedTask()
{
	/* EJERCICIOS 1/2/3
	LED_Config* cfg = pvPortMalloc(sizeof(LED_Config));

	if (cfg != NULL)
	{
		cfg->led = 0;
		cfg->delay = 200;
	}

	xTaskCreate(
		LedToggleTask,
		"LedToggleTask_1",
		128,
		(void*) cfg,
		1,
		NULL
	);
	*/

	/* EJERCICIO 4
	xTaskCreate(
		LedAnimationTask,
		"LedAnimationTask",
		128,
		NULL,
		1,
		NULL
	);
	*/

	/* EJERCICIO 5
	 * - con la misma prioridad alternan continuamente entre ellas y son animaciones
	 *   sin sentido
	 * - con prioridades distintas, visualmente y con un delay un poco más alto
	 *   podría parecer que se hacen una detrás de otra (en orden de prioridad)
	 
	xTaskCreate(
		LedAnimationTask1,
		"LedAnimationTask1",
		128,
		NULL,
		1,
		NULL
	);

	xTaskCreate(
		LedAnimationTask2,
		"LedAnimationTask2",
		128,
		NULL,
		2,
		NULL
	);*/
}

void LedToggleTask(void* pArgs)
{
	LED_Config* cfg = (LED_Config*) pArgs;
	uint8_t counter = 5;
	for(;;)
	{
		if(cfg->led > 2)
		{
			cfg->led = 0;
		}

		while (counter > 0)
		{
			LED_Toggle(cfg->led);
			vTaskDelay(cfg->delay);
			counter--;
		}

		cfg->led++;

		xTaskCreate(
			LedToggleTask,
			"LedToggleTask_New",
			128,
			(void*) cfg,
			1,
			NULL
		);

		vTaskDelete(NULL);
	}
}

void LedAnimationTask(void* pArgs)
{
	for(;;)
	{
		switch(ReadJoy())
		{
		case 0:
			// stand-by
			LED_Off(0);
			LED_Off(1);
			LED_Off(2);
			break;
		case 1:
			animation1();
			break;
		case 2:
			animation2();
			break;
		case 3:
			animation3();
			break;
		}
		vTaskDelay(50);
	}
}

void LedAnimationTask1(void* pArgs)
{
	for(;;)
	{
		int i;
		for(i = 0; i < 3; i++)
		{
			LED_On(i);
			vTaskDelay(150);
			LED_Off(i);
		}
		for(i = 1; i > 0; i--)
		{
			LED_On(i);
			vTaskDelay(150);
			LED_Off(i);
		}
	}
}

void LedAnimationTask2(void* pArgs)
{
	for(;;)
	{
		int i, j;
		for(j = 0; j < 5; j++)
		{
			for(i = 0; i < 3; i++)
				LED_On(i);

			vTaskDelay(100);

			for(i = 0; i < 3; i++)
				LED_Off(i);

			vTaskDelay(100);
		}
	}
}

void LedAnimationTask3(void* pArgs)
{
	for(;;)
	{
		int i;
		for(i = 0; i < 3; i++)
		{
			LED_On(i);
			vTaskDelay(150);
		}
		for(i = 2; i >= 0; i--)
		{
			LED_Off(i);
			vTaskDelay(150);
		}
	}
}
