Example of using the SOMO-14D and the created libraries.

Dependencies:   MessageQueue SOMO14D includes mbed

Application

This application uses SOMO-14D and STM32F030R8 nucleo board for testing the audio module.

A microcontroller is used to act as a serial commander between the Computer and the audio module.

Simple commands are used to proceed and make actions like:

  • play
  • pause
  • stop and low power pode
  • previous song
  • next song
  • volume up
  • volume down

Check the wikis of this application and the library wiki for more reference.

main.cpp

Committer:
issaiass
Date:
2015-03-13
Revision:
0:b9c385255fc8
Child:
1:e666958b0e85

File content as of revision 0:b9c385255fc8:

/*
*******************************************************************************
*                              CERES CONTROLS
*                         PANAMA, REPULIC OF PANAMA
*
*  File          : main.cpp
*  Programmer(s) : Rangel Alvarado
*  Language      : ANSI-C
*  Description   : Main file for SOMO-14D (version 1) terminal controller.
*
*  Note          : The SOMO-14D is a tiny Audio-Sound module that can 
*                  play back pre-stored audio files such as voice and music 
*                  from a micro-SD memory card.
*
*  Warning       : Tested only on a STM32F030R8 mbed board.
*                  Software must have to do a call on
*                  - MsgRxISR()
*                  - SOMO14DISR()
*
*  Usage         : 1 - Open a terminal program like CoolTerm in 9600,8N1
*                  2 - Use only the following commands
*                      List of available commands:
*                      p       play the current song
*                      h       hold the current song
*                      n       play the next song in the queue
*                      r       play the previous song in the queue
*                      a <num> set audio to a specific song, 511 > num > 0
*                              i.e.   num = 0010
*                      +       set volume up, max 8 levels
*                      -       set volume down, max 8 levels
*
*  ----------------------------------------------------------------------------
*  HISTORY
*   DD MM AA
*   09 03 15    Created.
*   09 03 15    Modified.
*   12 03 15    Import to mbed platform.
*******************************************************************************
*/

/*
*******************************************************************************
*                                              INCLUDE FILES
*******************************************************************************
*/

#include "includes.h"                      /* Include all header files       */


/*
*******************************************************************************
*                              CONSTANTS AND MACROS
*******************************************************************************
*/

enum SOMO_ACTION {PLAY  = 'p', HOLD  = 'h',/* The list of available commands */
                  STOP  = 's', NEXT  = 'n', 
                  PREV  = 'r', STAU  = 'a', 
                  VOLUP = '+', VOLDN = '-'
                 };


/*
*******************************************************************************
*                                            FUNCTION PROTOTYPES 
*******************************************************************************
*/
                                 
void SOMOManageAction(INT8U nbytes);       /* Check will action be performed */
void SOMO14DISR(void);                     /* Interrupt routine of busy pin  */
void MsgRxISR(void);                       /* Interrupt routine of rx char   */

                                 
/*
*******************************************************************************
*                                               MAIN FUNCTION 
*******************************************************************************
*/                               
                                 
int main() {
  INT8U action;                             /* Variable for action command    */
    
    
    
  action   = 0;                             /* Set action initially to 0      */
  SOMO14DInit(SOMO14DISR);                  /* Set up the sound module pins   */
  MsgBufInit();                             /* Initialize the buffer          */
  MsgRxISRCfg(MsgRxISR);                    /* Attach Rx IRQ function         */
  MsgPutLine((INT8U *)"SOMO Waiting for commands\r"); /* Hello Message        */
  MsgPut('>');                              /* Waiting a command sign         */
  while(1) {                                /* Repeat forever                 */
    if (!MsgRxBufEmpty()) {                 /* If there is something Received */
      action = MsgGetChar();                /* Get the action                 */
      SOMOManageAction(action);             /* Check which action to perform  */
    }
  }
}


/*
*******************************************************************************
*                           
*                 MANAGE AN ACTION ON THE SOUND MODULE AND RETURN A MESSAGE
*
*  Description : Check before a received character which action to perform
*  Arguments   : None
*  Return        : None
*  Note(s)     : None
*******************************************************************************
*/

void SOMOManageAction(INT8U action) {
           INT8U  msg[4];                    /* Buffer the audio no.            */
           INT8U      n;                     /* Iterator                        */
    static INT16U   song;                    /* Current song to 0               */
    static INT8U vol = 7;                    /* Volume to max                   */
    

    switch (action) {                        /* Manage action                   */
      case PLAY:                             /* Play the current song           */
        SOMO14DSetAudio(song);               /* Set the current song and play it*/
        MsgPutLine((INT8U *)"PLAY\r>");      /* Execution message               */
        break;                               /* Terminate action                */
      case HOLD:                             /* Hold/Release the current song   */
        SOMO14DPause();                      /* Pause/Play the song             */
        MsgPutLine((INT8U *)"HOLD\r>");      /* Execution message               */
        break;                               /* Terminate action                */
      case STOP:                             /* Stop the song                   */
        SOMO14DStop();                       /* Quit playing the song           */
        MsgPutLine((INT8U *)"STOP\r>");      /* Execution message               */
        break;                               /* Terminate action                */
      case NEXT:                             /* Play the next song              */
        SOMO14DSetAudio(++song);             /* Increment song and play         */
        MsgPutLine((INT8U *)"NEXT SONG\r>"); /* Execution message               */
        break;                               /* Terminate action                */
      case PREV:                             /* Play the previous song          */
        SOMO14DSetAudio(--song);             /* Decrement song and play         */
        MsgPutLine((INT8U *)"PREVIOUS SONG\r>"); /* Execution message           */
        break;                               /* Terminate action                */
      case STAU:                             /* Set the audio                   */
        MsgPutLine((INT8U *)"SET AUDIO TO: ");   /* Step 1 message              */
        for(n = 0; n < 4; n++) {             /* Repeat for 4 numbers            */
          while(MsgRxBufEmpty()) {           /* Wait if is empty                */
            ;
          }
          msg[n] = MsgGetChar();             /* Hold the current no. in buffer  */
          MsgPut(msg[n]);                    /* Print the received char         */
        }
        MsgPutLine((INT8U *)".ad4\r>");      /* Print an extra string (format)  */
        song = atoi((const char *)msg);      /* Convert ASCII to number         */
        SOMO14DSetAudio(song);               /* Play the song                   */
        break;                               /* Terminate action                */
      case VOLUP:                            /* Increase volume                 */
        SOMO14DSetVol(&(++vol));             /* Alter reference, increment vol  */
        MsgPutLine((INT8U *)"VOLUME ");      /* Execution message               */
        MsgPut(vol + '0');                   /* ASCII representation of numbers */
        MsgPutLine((INT8U *)"\r>");          /* Print a command line            */
        break;                               /* Terminate action                */
      case VOLDN:                            /* Decrease volume                 */
        SOMO14DSetVol(&(--vol));             /* Alter reference, decrement vol  */
        MsgPutLine((INT8U *)"VOLUME ");      /* Execution message               */
        MsgPut(vol + '0');                   /* ASCII representation of numbers */
        MsgPutLine((INT8U *)"\r>");          /* Print a command line            */
        break;                               /* Terminate action                */
      default:                               /* Not a command? Print the help   */
        MsgPutLine((INT8U *)"NOT A COMMAND\r>");
        MsgPutLine((INT8U *)"List of available commands:\r");
        MsgPutLine((INT8U *)"p       play the current song\r");
        MsgPutLine((INT8U *)"h       hold the current song\r");
        MsgPutLine((INT8U *)"n       play the next song in the queue\r");
        MsgPutLine((INT8U *)"r       play the previous song in the queue\r");
        MsgPutLine((INT8U *)"a <num> set audio to a specific song, 511 > num > 0\r");
        MsgPutLine((INT8U *)"+       set volume up, max 8 levels\r");
        MsgPutLine((INT8U *)"-       set volume down, max 8 levels\r>");
        break;                               /* Terminate action                */
  }
}


/*
*******************************************************************************
*                           
*                      RX INTERRUPT SUBROUTINE REQUEST
*
*  Description : Get the received character and insert it into the buffer
*  Arguments   : None
*  Return        : None
*  Note(s)     : None
*******************************************************************************
*/

void MsgRxISR(void) {
  MsgPutRxChar(MsgGet());                  /* Put a byte on the buffer        */
}


/*
*******************************************************************************
*                           
*                SOMO14D INTERRUPT SUBROUTINE REQUEST ATTACH
*
*  Description : Interrupt request when Busy pins goes from HIGH to LOW
*  Arguments   : None
*  Return      : None
*  Notes       : Busy pin is active low triggered.
*******************************************************************************
*/

void SOMO14DISR(void) {
  MsgPutLine((INT8U *)"Audio finish\r>"); /* Message on interrupt request     */
}