blob: 107ac66c4f7e107869e3e75cc21c998275491584 [file] [log] [blame]
/********************* (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;
}
}