/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
/**
*
* @file     buzzer.c
* @brief    Buzzer dedicated functions with RTTTL format support.
* @author   IB
* @date     07/2007
*
**/
/******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "circle.h"

/// @cond Internal

/* Private typedef -----------------------------------------------------------*/

/*! Octaves */
enum eOctave  {
      OCT_440  = 0,  /*!< o = 5 */
      OCT_880  = 1,  /*!< o = 6 */
      OCT_1760 = 2,  /*!< o = 7 */
      OCT_3520 = 3,  /*!< o = 8 */
      OCT_7040 = 4   /*!< o = 9 */
      } octave;

/*! Notes */
enum eNotes  {
      NOTE_PAUSE = 0,    /*!< P  */
      NOTE_LA    = 1,    /*!< A  */
      NOTE_LA_H  = 8+1,  /*!< A# */
      NOTE_SI    = 2,    /*!< B  */
      NOTE_DO    = 3,    /*!< C  */
      NOTE_DO_H  = 8+3,  /*!< C# */
      NOTE_RE    = 4,    /*!< D  */
      NOTE_RE_H  = 8+4,  /*!< D# */
      NOTE_MI    = 5,    /*!< E  */
      NOTE_FA    = 6,    /*!< F  */
      NOTE_FA_H  = 8+6,  /*!< F# */
      NOTE_SOL   = 7,    /*!< G  */
      NOTE_SOL_H = 8+7   /*!< G# */
      } note;

/* Private define ------------------------------------------------------------*/
#define BUZZER_SHORTBEEP_DURATION   100
#define BUZZER_LONGBEEP_DURATION    1000
#define RTTTL_SEP                   ':'
   
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
int                              buzz_counter         = 0;
int                              buzz_in_progress     = 0;
static TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
static TIM_OCInitTypeDef         TIM_OCInitStructure;
u16                              CCR_Val              = 0x2EE0;
enum BUZZER_mode                 Buzzer_Mode          = BUZZER_UNDEF;
u32                              Buzzer_Counter       = 0;

// For the melody.
const u8*                        CurrentMelody        = 0;
const u8*                        CurrentMelodySTART   = 0;
u8                               DefaultOctave        = OCT_880;
u8                               DefaultDuration      = 4;
u16                              DefaultBeats         = 63;

u16 Note_Freq [16] = {
   0,    //pause
   440,  //A=LA
   494,  //B=SI
   524,  //C=DO
   588,  //D=RE
   660,  //E=MI
   698,  //F=FA
   784,  //G=SOL
   0,    // "8+n" for "NOTE#"
   466,  //A#=LA#
   0,
   544,  //C#=DO#
   622,  //D#=RE#
   0,
   740,  //F#=FA#
   830   //G#=SOL#
   };

/* Private function prototypes -----------------------------------------------*/
static void PlayMusic( void );
static void BUZZER_SetFrequency( u16 freq );

/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
*
*                                PlayMusic
*
*******************************************************************************/
/**
*
*  Play the next note of the current melody.
*
**/
/******************************************************************************/
static void PlayMusic( void )
   {
   u8 duration = DefaultDuration;
   u8 c;

   // Discard blank characters
   while ( *CurrentMelody == ' ')
      {
      CurrentMelody++;
      }

   // Check whether a duration is present.
   if ( (*CurrentMelody > '0') && (*CurrentMelody < '9') )
      {
      duration = *CurrentMelody++ - '0';

      if ( (*CurrentMelody > '0') && (*CurrentMelody < '9') )
         {
         duration *= 10;
         duration += (*CurrentMelody++ - '0');
         }
      }

   Buzzer_Counter = ( (32/duration) * 256L * 32L) / DefaultBeats;
   Buzzer_Counter*= (RCC_ClockFreq.SYSCLK_Frequency / 12000000L); //Adapt to HCLK1

   //read the note
   c = *CurrentMelody++;

   if ( (c >= 'a') && (c <= 'z') )
      {
      c+=('A'-'a');
      }

   if ( c == 'P' )
      {
      note = NOTE_PAUSE;
      }
   else if ( (c >= 'A') && (c <= 'G') )
      {
      note = (c - 'A') + NOTE_LA;

      if ( *CurrentMelody == '#' )
         {
         note|=0x8;
         CurrentMelody++;
         }
      }

   octave = DefaultOctave;
   c = *CurrentMelody;

   if ( (c>= '5') && (c<= '8') )
      {
      octave = OCT_440 + (c-'5');
      CurrentMelody++;
      }

   BUZZER_SetFrequency ( (Note_Freq [ note ] * (1<<octave)));

   //discard delimiter and ignore special duration
   while ( (c = *CurrentMelody++) != 0 )
      {
      if ( c==',')
         break;
      }

   if ( *(CurrentMelody-1)==0 )
      {
      CurrentMelody  = 0;
      }

   if ( c == 0 )
      {
      BUZZER_SetMode ( BUZZER_OFF );
      }
   }

/***********************************************************************************
*
*                                BUZZER_SetFrequency
*
************************************************************************************/
/**
*
*  Set the buzzer frequency
*
*  @param[in]  freq New frequency.
*
**/
/********************************************************************************/
void BUZZER_SetFrequency ( u16 freq )
   {
   /* Calculate the frequency (depend on the PCLK1 clock value) */
   CCR_Val = (RCC_ClockFreq.PCLK1_Frequency / freq);

   TIM_TimeBaseStructure.TIM_Period          = CCR_Val * 2;
   TIM_TimeBaseStructure.TIM_Prescaler       = 0x0;
   TIM_TimeBaseStructure.TIM_ClockDivision   = 0x0;
   TIM_TimeBaseStructure.TIM_CounterMode     = TIM_CounterMode_Up;

   TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure );

   /* Output Compare Toggle Mode configuration: Channel3 */
   TIM_OCInitStructure.TIM_OCMode   = TIM_OCMode_PWM1;
   TIM_OCInitStructure.TIM_Channel  = TIM_Channel_3;
   TIM_OCInitStructure.TIM_Pulse    = CCR_Val;

   TIM_OCInit( TIM3, &TIM_OCInitStructure );
   TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );
   }

/* Public functions for CircleOS ---------------------------------------------*/

/*******************************************************************************
*
*                                BUZZER_Init
*
*******************************************************************************/
/**
*
*  Buzzer Initialization
*
*  @attention  This function must <b>NOT</b> be called by the user.
*
**/
/******************************************************************************/
void BUZZER_Init( void )
   {
   GPIO_InitTypeDef GPIO_InitStructure;

   /* Enable GPIOB clock  */
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );

   /* GPIOB Configuration: TIM3 3in Output */
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init( GPIOB, &GPIO_InitStructure );

   /* TIM3 Configuration ------------------------------------------------------*/
   /* TIM3CLK = 18 MHz, Prescaler = 0x0, TIM3 counter clock = 18  MHz */
   /* CC update rate = TIM3 counter clock / (2* CCR_Val) ~= 750 Hz */

   /* Enable TIM3 clock */
   RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
   TIM_DeInit( TIM3 );
   TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
   TIM_OCStructInit( &TIM_OCInitStructure );

   /* Time base configuration */
   TIM_TimeBaseStructure.TIM_Period          = 0xFFFF;
   TIM_TimeBaseStructure.TIM_Prescaler       = 0x0;
   TIM_TimeBaseStructure.TIM_ClockDivision   = 0x0;
   TIM_TimeBaseStructure.TIM_CounterMode     = TIM_CounterMode_Up;

   TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure );

   /* Output Compare Toggle Mode configuration: Channel3 */
   TIM_OCInitStructure.TIM_OCMode   = TIM_OCMode_Toggle;
   TIM_OCInitStructure.TIM_Channel  = TIM_Channel_3;
   TIM_OCInitStructure.TIM_Pulse    = CCR_Val;

   TIM_OCInit( TIM3, &TIM_OCInitStructure );
   TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Disable );
   BUZZER_SetFrequency( 440 );

   /* Enable TIM3 IT */
   TIM_ITConfig( TIM3, TIM_IT_CC3, ENABLE );

   Buzzer_Mode  = BUZZER_OFF;
   }

/*******************************************************************************
*
*                                BUZZER_Handler
*
*******************************************************************************/
/**
*
*  Called by the CircleOS scheduler to manage Buzzer tasks.
*
*  @attention  This function must <b>NOT</b> be called by the user.
*
**/
/******************************************************************************/
void BUZZER_Handler( void )
   {
   int fSetOFF = 0;

   if ( Buzzer_Mode == BUZZER_PLAYMUSIC )
      {
      if ( Buzzer_Counter == 0 )
         {
         PlayMusic();
         }
      else 
         {
         Buzzer_Counter--;
         }

      return;
      }
   else if ( Buzzer_Mode == BUZZER_SHORTBEEP )
      {
      if ( Buzzer_Counter++ == (BUZZER_SHORTBEEP_DURATION) ) 
         {
         Buzzer_Mode  = BUZZER_OFF;

         return;
         }
      if ( Buzzer_Counter == (BUZZER_SHORTBEEP_DURATION/2) )
         {
         fSetOFF = 1;
         }
      }
   else if ( Buzzer_Mode == BUZZER_LONGBEEP )
      {
      if ( Buzzer_Counter++ == (BUZZER_LONGBEEP_DURATION) )
         {
         Buzzer_Mode  = BUZZER_OFF;

         return;
         }
      if ( Buzzer_Counter > (BUZZER_LONGBEEP_DURATION/2) )
         {
         fSetOFF = 1;
         }
      }

   if ( fSetOFF == 1 )
      {
      TIM_Cmd(TIM3, DISABLE);
      }
   }

/// @endcond

/* Public functions ----------------------------------------------------------*/

/*******************************************************************************
*
*                                BUZZER_GetMode
*
*******************************************************************************/
/**
*
*  Get the current buzzer mode.
*
*  @return  Current buzzer mode.
*
**/
/******************************************************************************/
enum BUZZER_mode BUZZER_GetMode( void )
   {
   return Buzzer_Mode;
   }

/*******************************************************************************
*
*                                BUZZER_SetMode
*
*******************************************************************************/
/**
*
*  Set new buzzer mode
*
*  @param[in]  mode  New buzzer mode.
*
**/
/******************************************************************************/
void BUZZER_SetMode( enum BUZZER_mode mode )
   {
   Buzzer_Mode    = mode;
   Buzzer_Counter = 0;

   switch ( mode )
      {
      case BUZZER_PLAYMUSIC   :
         PlayMusic(); //start melody
         /* no break */

      case BUZZER_LONGBEEP    :
      case BUZZER_SHORTBEEP   :
      case BUZZER_ON          :
         TIM_Cmd( TIM3, ENABLE );
         break;

      case BUZZER_OFF         :
         TIM_Cmd( TIM3, DISABLE );
         break;
      }
   }

/*******************************************************************************
*
*                                BUZZER_PlayMusic
*
*******************************************************************************/
/**
*
*  Plays the provided melody that follows the RTTTL Format.
*
*  Official Specification
*  @verbatim
<ringing-tones-text-transfer-language> :=
   <name> <sep> [<defaults>] <sep> <note-command>+
<name> := <char>+ ; maximum name length 10 characters
<sep> := ":"
<defaults> :=
   <def-note-duration> |
   <def-note-scale> |
   <def-beats>
<def-note-duration> := "d=" <duration>
<def-note-scale> := "o=" <scale>
<def-beats> := "b=" <beats-per-minute>
<beats-per-minute> := 25,28,...,900 ; decimal value
; If not specified, defaults are
   ;
   ; 4 = duration
   ; 6 = scale
   ; 63 = beats-per-minute
<note-command> :=
   [<duration>] <note> [<scale>] [<special-duration>] <delimiter>
   <duration> :=
   "1" | ; Full 1/1 note
   "2" | ; 1/2 note
   "4" | ; 1/4 note
   "8" | ; 1/8 note
   "16" | ; 1/16 note
   "32" | ; 1/32 note
<note> :=
   "P"  | ; pause
   "C"  |
   "C#" |
   "D"  |
   "D#" |
   "E"  |
   "F"  |
   "F#" |
   "G"  |
   "G#" |
   "A"  |
   "A#" |
   "B"
<scale> :=
   "5" | ; Note A is 440Hz
   "6" | ; Note A is 880Hz
   "7" | ; Note A is 1.76 kHz
   "8" ; Note A is 3.52 kHz
<special-duration> :=
   "." ; Dotted note
<delimiter> := ","
@endverbatim
*
*  @param[in]  melody New melody to play on buzzer.
*
**/
/******************************************************************************/
void BUZZER_PlayMusic (const u8 *melody )
   {
   u8    c;
   u8    default_id  = 0;
   u16   default_val = 0;

   DefaultOctave      = OCT_880;  // Default for the default Octave.
   DefaultDuration    = 4;        // Default for the default Duration.
   DefaultBeats       = 63;
   CurrentMelody      = melody;
   CurrentMelodySTART = melody;

   while( *CurrentMelody != RTTTL_SEP )
      {
      if( *CurrentMelody == 0 ) 
         {
         return;
         }

      // Discard the melody name.
      CurrentMelody++; 
      }

   // Now read the defaults if any.
   for( ++CurrentMelody; *CurrentMelody != RTTTL_SEP; CurrentMelody++ )
      {
      if( *CurrentMelody == 0 ) 
         {
         return;
         }

      // Discard any blank.
      while ( *CurrentMelody == ' ' ) 
         {
         CurrentMelody++;
         }

      c = *CurrentMelody;

      if ( c == RTTTL_SEP )
         {
         break;
         }

      if ( (c >= 'a') && (c <= 'z') )
         {
         c+=('A'-'a');
         }

      if ( (c >= 'A') && (c <= 'Z') )
         {
         default_id = c;
         continue;
         }

      if ( (c >= '0') && (c <= '9') )
         {
         default_val *= 10;
         default_val += (c-'0');
         c = * (CurrentMelody + 1 );

         if ( (c >= '0') && (c <= '9') )
            {
            continue;
            }

         if ( default_id == 'D' )
            {
            DefaultDuration = default_val;
            }
         else if ( default_id == 'O' )
            {
            DefaultOctave = default_val - 5;

            if ( DefaultOctave > OCT_7040 )
               DefaultOctave = OCT_440;
            }
         else if ( default_id == 'B' )
            {
            DefaultBeats = default_val;

            if ( ( DefaultBeats == 0 ) || ( DefaultBeats > 500 ) )
               DefaultBeats = 63;
            }

         default_val = 0;
         default_id  = 0;
         }
      }

   BUZZER_SetMode( BUZZER_PLAYMUSIC );
   }
