/********************************* (C) РОТЕК ***********************************
 * @module  led
 * @file    led.c
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   Template
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */
#include "common_config.h" 
#include "led.h"

#include "FreeRTOS.h"
#include "task.h"


#define LEDS_EXPAND_OFF(id, ...) 		\
		LED_Off(id);

#define LED_ALL_OFF() \
	LEDS(LEDS_EXPAND_OFF) \

uint16_t statusLedFreq = 1000; // Определяет частоту мигания STATUS LED


LED_STATE_t sLedInt = {GREEN, TOGGLE_OFF};
LED_STATE_t ledIntTemporary = {GREEN, TOGGLE_OFF};


/**
  * @brief  
  * @retval 
  */
void LED_Init(void)
{
  LED_ALL_OFF();
}

void vTaskServiceLedBlink(void *arg)
{
  for (;;)
  {
	/* Просто отражает состояние контроллера - "живой" */
#ifdef LED_INIT_OK
    LED_Toggle(LED_INIT_OK);
#endif
#ifdef LED_INIT_ERR
    LED_Toggle(LED_INIT_ERR);
#endif
    vTaskDelay(statusLedFreq / 4);
  }
}

void vTaskServiceLedBlinkErr(void *arg)
{
  for (;;)
  {
	/* Просто отражает состояние контроллера - "живой" */
#ifdef LED_INIT_ERR
    LED_Toggle(LED_INIT_ERR);
#endif
    vTaskDelay(statusLedFreq);
  }
}
/**
  * @brief  
  */
void LED_AddStateInt(COLOR_t color, TOGGLE_t toggle)
{
  
  //sLedInt.toggle = toggle;
  
  if ((sLedInt.color == GREEN) && (toggle == TOGGLE_ON))
	sLedInt.toggle = toggle;
  
  switch (color)
  {
	/* Зеленый не перебивает никакой цвет */
    case GREEN :
	  
	break;
	
	/* Красный перебивает все цвета и останавливет мигание*/
	case RED :
	  sLedInt.color = RED;
	  sLedInt.toggle = TOGGLE_OFF;
	break;
	
	/* Желтый перебивает только зеленый и останавливает мигание*/
	case YELLOW :
	  if (sLedInt.color != RED)
	  {	
		sLedInt.color = YELLOW;
		sLedInt.toggle = TOGGLE_OFF;
	  }
	break;
	
    default :
	break;
  }
  
}

/**
  * @brief  
  */
void LED_On(gpio_t pin)
{
	gpio_set(pin, 1);
}

/**
  * @brief  
  */
void LED_Off(gpio_t pin)
{
	gpio_set(pin, 0);
}

/**
  * @brief  Изменить состояние LED 
  */
void LED_Toggle(gpio_t pin)
{
	gpio_invert_output(pin);
}

/**
  * @brief  
  */
void LED_SetStatusLedFreq(uint16_t freq)
{
  statusLedFreq = freq;
}

/********************************* (C) РОТЕК **********************************/