guowenxue
2021-11-03 1a128c78e4119cae8d35b661149a12d0fd083b1a
modules/c/beep.c
@@ -32,9 +32,32 @@
//#define CONFIG_ACTV_BEEP
/* Only passive buzzer can play tone */
#ifndef CONFIG_ACTV_BEEP
#define CONFIG_PLAY_LITTLE_STAR
//#define CONFIG_PLAY_TONE_TEST
#endif
void play_tone_freq(void);
void play_little_star(void);
int main(int argc, char *argv[])
{
          wiringPiSetup();
#ifdef CONFIG_PLAY_LITTLE_STAR
   while(1)
   {
      play_little_star();
      sleep(3);
   }
#elif (defined CONFIG_PLAY_TONE_TEST)
   while(1)
   {
             play_tone_freq();
      sleep(3);
   }
#else
   while(1)
   {
@@ -52,20 +75,20 @@
#endif
      sleep(1);
   }
#endif
        return 0;
}
/*+-----------------------------+
 *|  Turn buzzer on or off API  |
 *+-----------------------------+*/
int turn_passive_beep(int cmd, int freq)
{
          int range;
   if(freq<2000 || freq>2500)
   {
      printf("Beep set invalid PWM frequency!\n");
      return -1;
   }
   if(OFF == cmd)
   {
@@ -74,6 +97,13 @@
   }
   else
   {
      if(freq<2000 || freq>5000)
             {
                printf("Beep set invalid PWM frequency[%d]!\n", freq);
                return -1;
             }
      /* Set GPIO as PWM output mode */
             pinMode(PWM_PIN, PWM_OUTPUT) ;
@@ -91,6 +121,7 @@
      pwmWrite(PWM_PIN, range/2);
   }
}
/* Turn ON/OFF buzzer, Active Buzzer can not set frequency */
int turn_active_beep(int cmd)
@@ -116,3 +147,111 @@
}
/*+---------------------------------+
 *|  Play Tone OD,RE,MI....XI,DO1   |
 *+---------------------------------+*/
enum
{
   UNUSED=0,
   DO,
   RE,
   MI,
   FA,
   SO,
   LA,
   XI,
   DO1,
   RI1,
   TONE_MAX,
};
#define msleep(x) usleep( 1000*(x) )
static int tone_freq[TONE_MAX]={0, 2093, 2349, 2637, 2794, 3136, 3520, 3952, 4186, 4698 };
//static int tone_freq[TONE_MAX]={0, 2000, 2130, 2250, 2360, 2450, 2530, 2620, 2700, 2780};
static inline void play_tone(int tone, int delay)
{
   if(tone<DO || tone>RI1)
      return ;
          turn_passive_beep(ON, tone_freq[tone]);
   msleep(delay);
          turn_passive_beep(OFF, 0);
}
void play_tone_freq(void)
{
   int            i;
   for(i=DO; i<TONE_MAX; i++)
   {
      play_tone( i, 500 );
      msleep(500);
   }
}
/*+------------------------------+
 *|  Play song "Little Start"    |
 *+------------------------------+*/
typedef struct tone_s
{
   int     tone;
   int     delay_ms;
} tone_t;
#define DEF_DELAY      350
static tone_t little_start_notation[]=
{
   {DO, DEF_DELAY},
   {DO, DEF_DELAY},
   {SO, DEF_DELAY},
   {SO, DEF_DELAY},
   {LA, DEF_DELAY},
   {LA, DEF_DELAY},
   {SO, DEF_DELAY*2},
   {FA, DEF_DELAY},
   {FA, DEF_DELAY},
   {MI, DEF_DELAY},
   {MI, DEF_DELAY},
   {RE, DEF_DELAY},
   {RE, DEF_DELAY},
   {DO, DEF_DELAY*2},
   {SO, DEF_DELAY},
   {SO, DEF_DELAY},
   {FA, DEF_DELAY},
   {FA, DEF_DELAY},
   {MI, DEF_DELAY},
   {MI, DEF_DELAY},
   {RE, DEF_DELAY*2},
   {SO, DEF_DELAY},
   {SO, DEF_DELAY},
   {FA, DEF_DELAY},
   {FA, DEF_DELAY},
   {MI, DEF_DELAY},
   {MI, DEF_DELAY},
   {RE, DEF_DELAY*2},
};
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
void play_little_star(void)
{
   int        i;
   for(i=0; i<ARRAY_SIZE(little_start_notation); i++)
   {
      play_tone(little_start_notation[i].tone, little_start_notation[i].delay_ms);
      msleep(30);
   }
}