/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
/**
*
* @file     led.c
* @brief    LED management.
* @author   IB
* @date     07/2007
*
**/
/******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "circle.h"

/// @cond Internal

/* Private variables ---------------------------------------------------------*/

int            GreenLED_Counter  = 0;
int            RedLED_Counter    = 0;
enum LED_mode  GreenLED_mode     = LED_UNDEF;
enum LED_mode  RedLED_mode       = LED_UNDEF;
enum LED_mode  GreenLED_newmode  = LED_OFF;
enum LED_mode  RedLED_newmode    = LED_OFF;
const int      HalfPeriod_LF     = 200;
const int      HalfPeriod_HF     = 50;
const int      Period_LF         = 200 * 2;
const int      Period_HF         = 50 * 2;

/* Public functions for CircleOS ---------------------------------------------*/

/*******************************************************************************
*
*                                LED_Init
*
*******************************************************************************/
/**
*
*  Initialization of the GPIOs for the LEDs
*
*  @note    Is called by CircleOS startup.
*
**/
/******************************************************************************/
void LED_Init( void )
   {
   GPIO_InitTypeDef GPIO_InitStructure;

   /* Enable LED GPIO clock */
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );

   /* Configure LED pins as output push-pull */
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9 ;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init( GPIOB, &GPIO_InitStructure );
   }

/*******************************************************************************
*
*                                LED_Handler
*
*******************************************************************************/
/**
*
*  Called by the CircleOS scheduler to manage the states of the LEDs.
*  LEDs may be on, off or blinking according to their state.
*
**/
/******************************************************************************/
void LED_Handler( void )
   {
   LED_Handler_hw(LED_GREEN);
   LED_Handler_hw(LED_RED);
   }

/*******************************************************************************
*
*                                LED_Handler
*
*******************************************************************************/
/**
*
*  Called by the CircleOS scheduler to manage the states of the LEDs.
*  LEDs may be on, off or blinking according to their state.
*
*  @param[in]  id       A LED_id indicating the LED to take care of.
*
**/
/******************************************************************************/
void LED_Handler_hw( enum LED_id id )
   {
   int            counter;
   enum LED_mode  mode;
   
   // Choose the right LED parameters.
   if( id == LED_GREEN )
      {
      counter = GreenLED_Counter;
      mode    = GreenLED_newmode;
      }
   else
      {
      counter = RedLED_Counter;
      mode    = RedLED_newmode;
      }

   switch( mode )
      {
      case LED_OFF         :
      case LED_ON          :
         if( ( ( id == LED_GREEN ) && ( GreenLED_mode == mode ) ) ||
             ( ( id == LED_RED   ) && ( RedLED_mode   == mode ) ) )
            {
            return;
            }

         if( id == LED_GREEN )
            {
            GPIO_WriteBit( GPIOB, GPIO_Pin_8, ( mode == LED_OFF ) ? Bit_RESET : Bit_SET );

            GreenLED_mode = mode;
            }
         else if( id == LED_RED )
            {
            GPIO_WriteBit( GPIOB, GPIO_Pin_9, ( mode == LED_OFF ) ? Bit_RESET : Bit_SET );

            RedLED_mode = mode;
            }

         counter = -1;
         break;

      case LED_BLINKING_HF :
         counter++;

         if( counter == HalfPeriod_HF )
            {
            GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_SET );
            }
         else if( ( counter < 0 ) || ( counter >= Period_HF ) )
            {
            GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_RESET );

            counter = 0;
            }
         break;

      case LED_BLINKING_LF :
         counter++;

         if( counter == HalfPeriod_LF )
            {
            GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_SET );
            }

         else if( ( counter < 0 ) || ( counter >= Period_LF ) )
            {
            GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_RESET );

            counter = 0;
            }
         break;

      default              :
         break;
      }

   if( id == LED_GREEN )
      {
      GreenLED_Counter = counter;
      GreenLED_mode    = mode;
      }
   else
      {
      RedLED_Counter = counter;
      RedLED_mode    = mode;
      }
   }

/// @endcond

/* Public functions ----------------------------------------------------------*/

/*******************************************************************************
*
*                                LED_Set
*
*******************************************************************************/
/**
*
*  Set a specified LED in a specified mode.
*
*  @param[in]  id    A LED_id specifying the LED to change the mode.
*  @param[in]  mode  A LED_mode describing the new LED mode.
*
**/
/******************************************************************************/
void LED_Set( enum LED_id id, enum LED_mode mode )
   {
   if( id == LED_GREEN )
      {
      GreenLED_newmode = mode;
      }
   else if( id == LED_RED )
      {
      RedLED_newmode = mode;
      }
   }
