plays 4 songs, worked off of hexiwear click buzzer example

Dependencies:   FXOS8700 Hexi_KW40Z PWM_Tone_Library_4th_Octave-6th_Octave

Fork of Hexi_Click_Buzzer_Example by Hexiwear

ECE Department IUPUI

IotMain.cpp

Committer:
naikhar0
Date:
2017-04-12
Revision:
1:95876081cc0d

File content as of revision 1:95876081cc0d:

#include "mbed.h"
#include "pwm_tone.h"
#include "Hexi_OLED_SSD1351.h"

#include "IotMainImage.h"
#include "string.h"

#include "Hexi_KW40Z.h"
#include "FXOS8700.h"

#define LED_ON      0
#define LED_OFF     1


/*------------------FUNCTIONS-------------------------------------------------*/

//Defining functions for haptic feedback
void StartHaptic(void);
void StopHaptic(void const *n);

//LED functions
DigitalOut redLed(LED1);
DigitalOut greenLed(LED2);
DigitalOut blueLed(LED3);
DigitalOut haptic(PTB9);

// Pin connections
DigitalOut led1(LED_GREEN); // RGB LED
FXOS8700 accel(PTC11, PTC10);
SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // SSD1351 OLED Driver (MOSI,SCLK,POWER,CS,RST,DC)

// Define the Buzzer Pinout (PWM Out)
PwmOut Buzzer(PTA10);

// Define timer for haptic feedback
RtosTimer hapticTimer(StopHaptic, osTimerOnce);

// Instantiate the Hexi KW40Z Driver (UART TX, UART RX)
KW40Z kw40z_device(PTE24, PTE25);

/*------------------VARIABLES-------------------------------------------------*/

float C_3 =  1000000/Do3,                                                      
      Cs_3 = 1000000/Do3s,        
      D_3 =  1000000/Re3,                                                       
      Ds_3 = 1000000/Re3s,
      E_3 =  1000000/Mi3,
      F_3 =  1000000/Fa3,
      Fs_3 = 1000000/Fa3s,
      G_3 =  1000000/So3,
      Gs_3 = 1000000/So3s,
      A_3 =  1000000/La3,
      As_3 = 1000000/La3s,
      B_3 =  1000000/Ti3,
      C_4 =  1000000/Do4,
      Cs_4 = 1000000/Do4s,
      D_4 =  1000000/Re4,
      Ds_4 = 1000000/Re4s,
      E_4 =  1000000/Mi4,
      F_4 =  1000000/Fa4,
      Fs_4 = 1000000/Fa4s,
      G_4 =  1000000/So4,
      Gs_4 = 1000000/So4s,
      A_4 =  1000000/La4,
      As_4 = 1000000/La4s,
      B_4 =  1000000/Ti4,
      C_5 =  1000000/Do5,
      Cs_5 = 1000000/Do5s,
      D_5 =  1000000/Re5,
      Ds_5 = 1000000/Re5s,
      E_5 =  1000000/Mi5,
      F_5 =  1000000/Fa5,
      Fs_5 = 1000000/Fa5s,
      G_5 =  1000000/So5,
      Gs_5 = 1000000/So5s,
      A_5 =  1000000/La5,
      As_5 = 1000000/La5s,
      B_5 =  1000000/Ti5,
      C_6 =  1000000/Do6,  
      Cs_6 = 1000000/Do6s, 
      D_6  = 1000000/Re6,   
      Ds_6 = 1000000/Re6s,
      E_6  = 1000000/Mi6,
      F_6  = 1000000/Fa6,  
      Fs_6 = 1000000/Fa6s, 
      G_6  = 1000000/So6, 
      Gs_6 = 1000000/So6s,
      A_6  = 1000000/La6,  
      As_6 = 1000000/La6s, 
      B_6 =  1000000/Ti6;  
      
//Notes defined by a million/defined value in pwm_tone.h file
//Organize code such that all variables in .h file and all functions in seperate .cpp file for simpler debugging
//Song tones-------------------------------------------------------------------

//Marry had a little lamb red led, leftmost button
int tones1[] = {E_4, D_4, C_4, D_4, E_4, E_4, E_4, 0,   D_4, D_4, D_4, 0,   \
                E_4, G_4, G_4, 0,   E_4, D_4, C_4, D_4, E_4, E_4, E_4, 0,   \
                D_4, D_4, E_4, D_4, C_4, 0,   0,   0};
                //done
                
//Senya -Itachi theme 
int tones2a[] = {G_5, Gs_5, G_5, Ds_5, F_5,  0, Ds_5, F_5, Ds_5, As_4, D_5, \
                 0};
                //C_5(4), Ds_5(4), As_4(4), C_5(12)
                //x3    
                 
int tones2b[] = {C_5, D_5, Ds_5, D_5, C_5, As_4, C_5, D_5, F_5}; 
                //Ds_5(12) 
                //x3 twice as slow   

int tones2c[] = {C_5, D_5, Ds_5, D_5, C_5, As_4, C_5, D_5, F_5, D_5};
                //C_5(8) 
                //x1 twice as slow





int tones3[] = {As_3, A_3, Gs_3, G_3, Fs_3, F_3, E_3, Ds_3, D_3, Cs_3, C_3, 0,\
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
               };
               
//OneRepublic -Secrets
int tones4[] = {D_4, F_4, A_4, F_4, A_4, F_4, D_4, F_4, D_4, F_4, A_4, F_4, \
                A_4, F_4, D_4, F_4, C_4, F_4, A_4, F_4, A_4, F_4, C_4, F_4, \
                C_4, F_4, A_4, F_4, A_4, F_4, C_4, F_4, B_3, D_4, B_4, D_4, \
                B_4, D_4, B_3, D_4, B_3, D_4, B_4, D_4, B_4, D_4, B_3, D_4, \
                G_3, D_4, B_4, D_4, B_4, D_4, B_4, D_4, 0,   0,   A_4, A_4, \
                A_4, A_4, A_4};  
                //12 notes per row, done
                
//Number of tones---------------------------------------------------------------

int tones_num1 = 32; // Auto performance, 32 notes max
int tones_num2 = 63; // Auto performance, 23 notes max
int tones_num3 = 12; // Auto performance, 12 notes max
int tones_num4 = 9;  // Auto performance, 9 notes max  
int i;
Timer t;

const uint8_t *image1; // Pointer for the image1 to be displayed
char text1[20]; // Text Buffer for dynamic value displayed
char text2[20]; // Text Buffer for dynamic value displayed
char text3[20]; // Text Buffer for dynamic value displayed
char text4[20]; // Text Buffer for dynamic value displayed
char text5[20]; // Test Buffer for dynamic value displayed
char text6[20]; // Text Buffer for dynamic value displayed

/*------------------FUNCTIONS-------------------------------------------------*/

//------------------RED LED-----------------------------------------------------
void ButtonLeft(void)
{
    StartHaptic();
    redLed      = LED_ON;
    greenLed    = LED_OFF;
    blueLed     = LED_OFF;

     // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0
    oled.DrawImage(image1,0,0);
    oled_text_properties_t textProperties = {0};
    oled.GetTextProperties(&textProperties);
    
    /* Set text properties to white and right aligned for the dynamic text */
    textProperties.fontColor = COLOR_YELLOW;
    textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
    oled.SetTextProperties(&textProperties);
    /* Display text2 */
    strcpy((char *) text1,"When red LED");
    oled.Label((uint8_t *)text1,3,28);
    /* Display text3 */
    strcpy((char *) text2,"turns off, press"); //17 characters max length per statement
    oled.Label((uint8_t *)text2,3,41);
    /* Display text4 */
    strcpy((char *) text3,"another button");
    oled.Label((uint8_t *)text3,3,54);
    /* Display text5 */
    strcpy((char *) text4,"to play");
    oled.Label((uint8_t *)text4,3,67);
    /* Register callbacks to application functions */
    strcpy((char *)text5,"another song");
    oled.Label((uint8_t *)text5,3,80);

    for(i=0; i<tones_num1; i++) 
    {
        Auto_tunes(Buzzer, tones1[i], 4); // Auto performance
        Stop_tunes(Buzzer);
    }
    
    redLed      = LED_OFF;
    greenLed    = LED_OFF;
    blueLed     = LED_OFF;
}
//-------------------------GREEN LED--------------------------------------------
void ButtonRight(void)
{
    StartHaptic();

    redLed      = LED_OFF;
    greenLed    = LED_ON;
    blueLed     = LED_OFF;

    oled.DrawImage(image1,0,0);
    oled_text_properties_t textProperties = {0};
    oled.GetTextProperties(&textProperties);
    
    /* Set text properties to white and right aligned for the dynamic text */
    textProperties.fontColor = COLOR_YELLOW;
    textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
    oled.SetTextProperties(&textProperties);
    /* Display text2 */
    strcpy((char *) text1,"When green LED");
    oled.Label((uint8_t *)text1,3,28);
    /* Display text3 */
    strcpy((char *) text2,"turns off, press"); //17 characters max length per statement
    oled.Label((uint8_t *)text2,3,41);
    /* Display text4 */
    strcpy((char *) text3,"another button");
    oled.Label((uint8_t *)text3,3,54);
    /* Display text5 */
    strcpy((char *) text4,"to play");
    oled.Label((uint8_t *)text4,3,67);
    /* Register callbacks to application functions */
    strcpy((char *)text5,"another song");
    oled.Label((uint8_t *)text5,3,80);

    for(i=0; i<tones_num3; i++) 
    {
        Auto_tunes(Buzzer, tones2a[i], 4); // Auto performance
        Stop_tunes(Buzzer);
    }  
    Tune(Buzzer, C_5, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, Ds_5, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, As_4, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, C_5, 20);
    wait_ms(250);
    
    for(i=0; i<tones_num3; i++) 
    {
        Auto_tunes(Buzzer, tones2a[i], 4); // Auto performance
        Stop_tunes(Buzzer);
    }  
    Tune(Buzzer, C_5, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, Ds_5, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, As_4, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, C_5, 20);
    wait_ms(250);
    
    for(i=0; i<tones_num3; i++) 
    {
        Auto_tunes(Buzzer, tones2a[i], 4); // Auto performance
        Stop_tunes(Buzzer);
    }  
    Tune(Buzzer, C_5, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, Ds_5, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, As_4, 8);  //4 Octave C beat 4/16
    wait_ms(25);
    Tune(Buzzer, C_5, 20);
    wait_ms(250);
    
    for(i=0; i<tones_num4; i++) 
    {
        Auto_tunes(Buzzer, tones2b[i], 8); // Auto performance
        Stop_tunes(Buzzer);
    }
    Tune(Buzzer, Ds_5, 12);  //4 Octave C beat 4/16
    wait_ms(250); 
    
    for(i=0; i<tones_num4; i++) 
    {
        Auto_tunes(Buzzer, tones2b[i], 8); // Auto performance
        Stop_tunes(Buzzer);
    }
    Tune(Buzzer, Ds_5, 12);  //4 Octave C beat 4/16
    wait_ms(250);
    
    for(i=0; i<tones_num4; i++) 
    {
        Auto_tunes(Buzzer, tones2b[i], 8); // Auto performance
        Stop_tunes(Buzzer);
    }
    Tune(Buzzer, Ds_5, 12);  //4 Octave C beat 4/16
    wait_ms(250);
    
    for(i=0; i<tones_num4; i++) 
    {
        Auto_tunes(Buzzer, tones2c[i], 8); // Auto performance
        Stop_tunes(Buzzer);
    }
    Tune(Buzzer, C_5, 12);  //4 Octave C beat 4/16
    wait_ms(250);
    
    redLed      = LED_OFF;
    greenLed    = LED_OFF;
    blueLed     = LED_OFF;
}
//-------------------------BLUE LED---------------------------------------------
void ButtonDown(void)
{
    StartHaptic();

    redLed      = LED_OFF;
    greenLed    = LED_OFF;
    blueLed     = LED_ON;

    oled.DrawImage(image1,0,0);
    oled_text_properties_t textProperties = {0};
    oled.GetTextProperties(&textProperties);
    
    /* Set text properties to white and right aligned for the dynamic text */
    textProperties.fontColor = COLOR_YELLOW;
    textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
    oled.SetTextProperties(&textProperties);
    /* Display text2 */
    strcpy((char *) text1,"When blue LED");
    oled.Label((uint8_t *)text1,3,28);
    /* Display text3 */
    strcpy((char *) text2,"turns off, press"); //17 characters max length per statement
    oled.Label((uint8_t *)text2,3,41);
    /* Display text4 */
    strcpy((char *) text3,"another button");
    oled.Label((uint8_t *)text3,3,54);
    /* Display text5 */
    strcpy((char *) text4,"to play");
    oled.Label((uint8_t *)text4,3,67);
    /* Register callbacks to application functions */
    strcpy((char *)text5,"another song");
    oled.Label((uint8_t *)text5,3,80);

    Tune(Buzzer, 0, 4);    //1
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //2 
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //3 
    wait_ms(25);
    Tune(Buzzer, A_5, 4);  //4 
    wait_ms(25);
    Tune(Buzzer, G_5, 24); //5  
    wait_ms(25);
    Tune(Buzzer, A_5, 2);  //6
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //7
    wait_ms(25);
    Tune(Buzzer, A_5, 2);  //8
    wait_ms(25);
    Tune(Buzzer, G_5, 24); //9 
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //10
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //11
    wait_ms(25);
    Tune(Buzzer, C_6, 4);  //12
    wait_ms(25);
    Tune(Buzzer, B_5, 24); //13
    wait_ms(25);
    Tune(Buzzer, A_5, 2);  //14
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //15
    wait_ms(25);
    Tune(Buzzer, A_5, 6);  //16
    wait_ms(25);
    Tune(Buzzer, G_5, 18); //17
    wait_ms(25);
    Tune(Buzzer, G_5, 3);  //18
    wait_ms(25);
    Tune(Buzzer, A_5, 3);  //19
    wait_ms(25);
    Tune(Buzzer, G_5, 3);  //20
    wait_ms(25);
    Tune(Buzzer, D_6, 4);  //21
    wait_ms(25);
    Tune(Buzzer, Fs_6, 2); //22
    wait_ms(25);
    Tune(Buzzer, B_5, 10); //23
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //24
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //25
    wait_ms(25);
    Tune(Buzzer, A_5, 2);  //26
    wait_ms(25);
    Tune(Buzzer, G_5, 4);  //27
    wait_ms(25);
    Tune(Buzzer, C_6, 3);  //28
    wait_ms(25);
    Tune(Buzzer, E_5, 22); //29
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //30
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //31
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //32
    wait_ms(25);
    Tune(Buzzer, A_5, 2);  //33
    wait_ms(25);
    Tune(Buzzer, G_5, 4);  //34
    wait_ms(25);
    Tune(Buzzer, C_6, 4);  //35
    wait_ms(25);
    Tune(Buzzer, B_6, 10); //36
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //37
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //38
    wait_ms(25);
    Tune(Buzzer, G_5, 2);  //39
    wait_ms(25);
    Tune(Buzzer, G_5, 3);  //40
    wait_ms(25);
    Tune(Buzzer, A_5, 3);  //41
    wait_ms(25);
    Tune(Buzzer, G_5, 3);  //42
    wait_ms(25);
    Tune(Buzzer, A_5, 5);  //43
    wait_ms(25);
    Tune(Buzzer, G_5, 14); //44
    wait_ms(25);
    Tune(Buzzer, G_4, 2);  //45
    wait_ms(25);
    Tune(Buzzer, B_4, 4);  //46
    wait_ms(25);
    Tune(Buzzer, A_4, 4);  //47
    wait_ms(25);
    Tune(Buzzer, G_4, 4);  //48
    wait_ms(25);
    Tune(Buzzer, G_4, 4);  //49
    wait_ms(25);
    Tune(Buzzer, B_4, 2);  //50
    wait_ms(25);
    Tune(Buzzer, A_4, 4);  //51
    wait_ms(25);
    Tune(Buzzer, G_4, 6);  //52
    wait_ms(25);
    Tune(Buzzer, G_4, 2);  //53
    wait_ms(25);
    Tune(Buzzer, B_4, 2);  //54
    wait_ms(25);
    Tune(Buzzer, A_4, 4);  //55
    wait_ms(25);
    Tune(Buzzer, G_4, 6);  //56
    wait_ms(25);
    Tune(Buzzer, G_4, 2);  //57
    wait_ms(25);
    Tune(Buzzer, C_5, 4);  //58
    wait_ms(25);
    Tune(Buzzer, B_4, 4);  //59
    wait_ms(25);
    Tune(Buzzer, G_4, 4);  //60
    wait_ms(25);
    Tune(Buzzer, Fs_4, 6); //61
    wait_ms(25);
    Tune(Buzzer, G_4, 2);  //62
    wait_ms(25); 
    Tune(Buzzer, B_5, 4);  //63
    wait_ms(25); 
    Tune(Buzzer, B_4, 6);  //64
    wait_ms(25); 
    Tune(Buzzer, G_4, 4);  //65
    wait_ms(25); 
    Tune(Buzzer, C_5, 4);  //66
    wait_ms(25); 
    Tune(Buzzer, B_4, 2);  //67
    wait_ms(25); 
    Tune(Buzzer, B_4, 10); //68
    wait_ms(25); 
    Tune(Buzzer, A_4, 2);  //69
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //70
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //71
    wait_ms(25); 
    Tune(Buzzer, A_4, 6);  //72
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //73
    wait_ms(25); 
    Tune(Buzzer, G_4, 4);  //74
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //75
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //76
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //77
    wait_ms(25); 
    Tune(Buzzer, G_4, 4);  //78
    wait_ms(25); 
    Tune(Buzzer, G_4, 8);  //79
    wait_ms(25); 
    Tune(Buzzer, G_4, 8);  //80
    wait_ms(25); 
    Tune(Buzzer, 0, 4);    //81
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //82
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //83
    wait_ms(25); 
    Tune(Buzzer, G_4, 2);  //84
    wait_ms(25); 
    Tune(Buzzer, A_4, 2);  //85
    wait_ms(25);
    Tune(Buzzer, A_4, 8);  //86
    wait_ms(25); 
    Tune(Buzzer, A_4, 8);  //87
    wait_ms(25); 
    Tune(Buzzer, 0, 4);    //88
    wait_ms(25); 
    Tune(Buzzer, C_5, 4);  //89
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //90
    wait_ms(25); 
    Tune(Buzzer, A_4, 2);  //91
    wait_ms(25); 
    Tune(Buzzer, B_4, 2);  //92
    wait_ms(25); 
    Tune(Buzzer, B_4, 8);  //93
    wait_ms(25); 
    Tune(Buzzer, B_4, 8);  //94
    wait_ms(25); 
    Tune(Buzzer, Fs_4, 8); //95
    wait_ms(25); 
    Tune(Buzzer, G_4, 4);  //96 
    wait_ms(25); 
    Tune(Buzzer, C_4, 20); //97
    wait_ms(25); 
    Tune(Buzzer, 0, 4);    //98
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //99
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //100
    wait_ms(25); 
    Tune(Buzzer, G_4, 4);  //101
    wait_ms(25); 
    Tune(Buzzer, G_4, 8);  //102
    wait_ms(25); 
    Tune(Buzzer, G_4, 8);  //103
    wait_ms(25); 
    Tune(Buzzer, G_4, 2);  //104
    wait_ms(25); 
    Tune(Buzzer, A_4, 2);  //105
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //106
    wait_ms(25); 
    Tune(Buzzer, A_4, 4);  //107
    wait_ms(25); 
    Tune(Buzzer, G_4, 2);  //108
    wait_ms(25); 
    Tune(Buzzer, A_4, 2);  //109
    wait_ms(25); 
    Tune(Buzzer, A_4, 8);  //110
    wait_ms(25); 
    Tune(Buzzer, A_4, 8);  //111
    wait_ms(25); 
    Tune(Buzzer, 0, 4);    //112
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //113
    wait_ms(25); 
    Tune(Buzzer, B_4, 4);  //114
    wait_ms(25); 
    Tune(Buzzer, A_4, 2);  //115
    wait_ms(25); 
    Tune(Buzzer, B_4, 2);  //116
    wait_ms(25); 
    Tune(Buzzer, B_4, 8);  //117
    wait_ms(25); 
    Tune(Buzzer, B_4, 8);  //118
    wait_ms(25); 
    Tune(Buzzer, A_4, 8);  //119
    wait_ms(25); 
    Tune(Buzzer, G_4, 4);  //120
    wait_ms(25); 
    Tune(Buzzer, G_4, 2);  //121
    wait_ms(25); 
    Tune(Buzzer, G_4, 2);  //122  
    wait_ms(25); 
    Tune(Buzzer, D_5, 4);  //123
    wait_ms(25);  
    Tune(Buzzer, D_4, 2);  //124
    wait_ms(25);  
    Tune(Buzzer, D_4, 2);  //125
    wait_ms(25);  
    Tune(Buzzer, B_4, 4);  //126
    wait_ms(25);  
    Tune(Buzzer, G_4, 2);  //127
    wait_ms(25);  
    Tune(Buzzer, D_5, 4);  //128
    wait_ms(25);  
    Tune(Buzzer, D_5, 4);  //129
    wait_ms(25);  
    Tune(Buzzer, D_5, 2);  //130
    wait_ms(25);  
    Tune(Buzzer, B_4, 6);  //131
    wait_ms(25);  
    Tune(Buzzer, G_4, 2);    //132
    wait_ms(25);  
    Tune(Buzzer, B_4, 16);  //133
    wait_ms(25);  
    Tune(Buzzer, A_4, 14);  //134
    wait_ms(25);  
    Tune(Buzzer, G_4, 2);  //135
    wait_ms(25);  
    Tune(Buzzer, A_4, 4);  //136
    wait_ms(25);  
    Tune(Buzzer, A_4, 4);  //137
    wait_ms(25);  
    Tune(Buzzer, A_4, 6);  //138
    wait_ms(25);  
    Tune(Buzzer, G_4, 2);  //139
    wait_ms(25);  
    Tune(Buzzer, A_4, 2);  //140
    wait_ms(25);  
    Tune(Buzzer, G_4, 2);  //141
    wait_ms(25);  
    Tune(Buzzer, B_4, 4);  //142
    wait_ms(25);  
    Tune(Buzzer, B_4, 4);  //143
    wait_ms(25);  
    Tune(Buzzer, G_4, 4);  //144
    wait_ms(25);  
    Tune(Buzzer, G_4, 32);  //145
    wait_ms(25);  
    Tune(Buzzer, D_4, 10);  //146
    wait_ms(25);  
    Tune(Buzzer, D_4, 8);  //147
    wait_ms(25);  
    
    
        
    redLed      = LED_OFF;
    greenLed    = LED_OFF;
    blueLed     = LED_OFF;
}
//-------------------------Yellow LED-------------------------------------------
void ButtonUp(void)
{
    StartHaptic();

    redLed      = LED_ON;
    greenLed    = LED_ON;
    blueLed     = LED_OFF;

    oled.DrawImage(image1,0,0);
    oled_text_properties_t textProperties = {0};
    oled.GetTextProperties(&textProperties);
    
        /* Set text properties to white and right aligned for the dynamic text */
        textProperties.fontColor = COLOR_YELLOW;
        textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
        oled.SetTextProperties(&textProperties);
        /* Display text2 */
        strcpy((char *) text1,"When yellow LED");
        oled.Label((uint8_t *)text1,3,28);
        /* Display text3 */
        strcpy((char *) text2,"turns off, press"); //17 characters max length per statement
        oled.Label((uint8_t *)text2,3,41);
        /* Display text4 */
        strcpy((char *) text3,"another button");
        oled.Label((uint8_t *)text3,3,54);
        /* Display text5 */
        strcpy((char *) text4,"to play");
        oled.Label((uint8_t *)text4,3,67);
        /* Register callbacks to application functions */
        strcpy((char *)text5,"another song");
        oled.Label((uint8_t *)text5,3,80);

    for(i=0; i<tones_num2; i++) 
    {
        Auto_tunes(Buzzer, tones4[i], 4); // Auto performance
        Stop_tunes(Buzzer);
    }
    Tune(Buzzer, A_4, 8);  //4 Octave F beat 4/16
    Tune(Buzzer, F_4, 16);  //4 Octave F beat 4/16
    wait_ms(250);
    
    redLed      = LED_OFF;
    greenLed    = LED_OFF;
    blueLed     = LED_OFF;
}


/*------------------MAIN------------------------------------------------------*/

// main() runs in its own thread in the OS
// (note the calls to Thread::wait below for delays)

int main()
{
    while(true)
    {
        // Setting pointer location of the 96 by 96 pixel bitmap
        image1  = Accelero;
        // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0
        oled.DrawImage(image1,0,0);
        
        redLed = LED_ON;
        greenLed = LED_OFF;
        blueLed = LED_OFF;
        wait(1);
        
        redLed = LED_OFF;
        greenLed = LED_ON;
        blueLed = LED_OFF;
        wait(1);
        
        redLed = LED_OFF;
        greenLed = LED_OFF;
        blueLed = LED_ON;
        wait(1);
        
        oled_text_properties_t textProperties = {0};
        oled.GetTextProperties(&textProperties);
        /* Set text properties to white and right aligned for the dynamic text */
        textProperties.fontColor = COLOR_YELLOW;
        textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
        oled.SetTextProperties(&textProperties);
        /* Display text2 */
        strcpy((char *) text1,"Hello! Press the ");
        oled.Label((uint8_t *)text1,3,28);
        /* Display text3 */
        strcpy((char *) text2,"the left, right, "); //17 characters max length per statement
        oled.Label((uint8_t *)text2,3,41);
        /* Display text4 */
        strcpy((char *) text3,"top, or bottom   ");
        oled.Label((uint8_t *)text3,3,54);
        /* Display text5 */
        strcpy((char *) text4,"buttons to play  ");
        oled.Label((uint8_t *)text4,3,67);
        /* Register callbacks to application functions */
        strcpy((char *)text5,"a song            ");
        oled.Label((uint8_t *)text5,3,80);
        
        kw40z_device.attach_buttonUp(&ButtonUp);
        kw40z_device.attach_buttonDown(&ButtonDown);
        kw40z_device.attach_buttonLeft(&ButtonLeft);
        kw40z_device.attach_buttonRight(&ButtonRight);
        while(true){
        Thread::wait(500);}
    }
}

void StartHaptic(void)
{
    hapticTimer.start(50);
    haptic = 1;
}

void StopHaptic(void const *n)
{
    haptic = 0;
    hapticTimer.stop();
}