/*******************************************************************************
 * Aleix Riera                                                                 *
 * www.fjarre.com/~aleix                                                       *
 * aleix@fjarre.com                                                            *
 *******************************************************************************/
static rtems_task led_task1(rtems_task_argument argument)
{
	rtems_name		name;
	rtems_id		period_id;
	rtems_status_code	status;
	int			panel = argument;
	name = rtems_build_name('P', 'E', 'R', '1');
	status = rtems_rate_monotonic_create(name, &period_id);
	if (status == RTEMS_SUCCESSFUL)
	{
		while (rtems_rate_monotonic_period(period_id,period[Actual.Line[menu_index_part].Freq[0]]) != RTEMS_TIMEOUT)
		{
			switch (led_bits&PANEL01_LED_CTRL1)
			{
				case 0:
					led_bits = led_bits|PANEL01_LED_CTRL1;
					break;
				default:
					led_bits = led_bits&~(PANEL01_LED_CTRL1);
					break;
			}
			if (!panel_out_led(panel, led_bits))	break;
		}
	}
	TRACE("ERROR: unexpected exit from led_task.\n");
	rtems_task_delete(RTEMS_SELF);
}

rtems_id create_led_task1(rtems_task_argument argument)
{
	rtems_id		task_id;
	rtems_status_code	status;
	rtems_name		name;
	name = rtems_build_name('1', 'L', 'E', 'D');
	status = rtems_task_create(
		name,
		100,
		RTEMS_MINIMUM_STACK_SIZE,
		RTEMS_DEFAULT_MODES,
		RTEMS_DEFAULT_ATTRIBUTES,
		&task_id
	);
	if (status != RTEMS_SUCCESSFUL)
		return 0;
	status = rtems_task_start(task_id, led_task1, argument);
	if (status != RTEMS_SUCCESSFUL)
		return 0;
	return task_id;
}

static rtems_task led_task2(rtems_task_argument argument)
{
	rtems_name		name;
	rtems_id		period_id;
	rtems_status_code	status;
	int			panel = argument;
	name = rtems_build_name('P', 'E', 'R', '2');
	status = rtems_rate_monotonic_create(name, &period_id);
	if (status == RTEMS_SUCCESSFUL)
	{
		while (rtems_rate_monotonic_period(period_id,period[Actual.Line[menu_index_part].Freq[1]]) != RTEMS_TIMEOUT)
		{
			switch (led_bits&PANEL01_LED_CTRL2)
			{
				case 0:
					led_bits = led_bits|PANEL01_LED_CTRL2;
					break;
				default:
					led_bits = led_bits&~(PANEL01_LED_CTRL2);
					break;
			}
			if (!panel_out_led(panel, led_bits))	break;
		}
	}
	TRACE("ERROR: unexpected exit from led_task.\n");
	rtems_task_delete(RTEMS_SELF);
}

rtems_id create_led_task2(rtems_task_argument argument)
{
	rtems_id		task_id;
	rtems_status_code	status;
	rtems_name		name;
	name = rtems_build_name('2', 'L', 'E', 'D');
	status = rtems_task_create(
		name,
		100,
		RTEMS_MINIMUM_STACK_SIZE,
		RTEMS_DEFAULT_MODES,
		RTEMS_DEFAULT_ATTRIBUTES,
		&task_id
	);
	if (status != RTEMS_SUCCESSFUL)
		return 0;
	status = rtems_task_start(task_id, led_task2, argument);
	if (status != RTEMS_SUCCESSFUL)
		return 0;
	return task_id;
}
static rtems_task led_task3(rtems_task_argument argument)
{
	rtems_name		name;
	rtems_id		period_id;
	rtems_status_code	status;
	int			panel = argument;
	name = rtems_build_name('P', 'E', 'R', '2');
	status = rtems_rate_monotonic_create(name, &period_id);
	if (status == RTEMS_SUCCESSFUL)
	{
		while (rtems_rate_monotonic_period(period_id,period[Actual.Line[menu_index_part].Freq[2]]) != RTEMS_TIMEOUT)
		{
			switch (led_bits&PANEL01_LED_CTRL3)
			{
				case 0:
					led_bits = led_bits|PANEL01_LED_CTRL3;
					break;
				default:
					led_bits = led_bits&~(PANEL01_LED_CTRL3);
					break;
			}
			if (!panel_out_led(panel, led_bits))	break;
		}
	}
	TRACE("ERROR: unexpected exit from led_task.\n");
	rtems_task_delete(RTEMS_SELF);
}

rtems_id create_led_task3(rtems_task_argument argument)
{
	rtems_id		task_id;
	rtems_status_code	status;
	rtems_name		name;
	name = rtems_build_name('3', 'L', 'E', 'D');
	status = rtems_task_create(
		name,
		100,
		RTEMS_MINIMUM_STACK_SIZE,
		RTEMS_DEFAULT_MODES,
		RTEMS_DEFAULT_ATTRIBUTES,
		&task_id
	);
	if (status != RTEMS_SUCCESSFUL)
		return 0;
	status = rtems_task_start(task_id, led_task3, argument);
	if (status != RTEMS_SUCCESSFUL)
		return 0;
	return task_id;
}