help :(

Dependencies:   FFT

main.cpp

Committer:
dimitryjl23
Date:
2020-12-04
Revision:
10:a259a4a70210
Parent:
9:97abd5e954f1
Child:
11:951bbb0385aa

File content as of revision 10:a259a4a70210:

#include "mbed.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "rtos.h"
#include "FFT.h"
#include <string>
#include "around_the_world-atc-array.h"
#include "dont_speak-no_doubt-array.h"
#include "my-love-array.h"

SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card

I2C i2c(p28, p27); // LED display
Adafruit_8x8matrix matrix = Adafruit_8x8matrix(&i2c);

AnalogOut DACout(p18); // speaker
wave_player waver(&DACout);
Mutex speaker_lock;
Mutex file_lock;
DigitalOut myled(LED1); // mbed LED
Serial pc (USBTX,USBRX);
string dir;         // "/sd/" + song + ".wav"
//string song = "around_the_world-atc";
string song;
int song_data_length;
const unsigned short *song_data;
bool play = false;
bool song_selected = false;


// delete later
/*int sample[12][8] = {
 34085,32666,29810,29823,27514,24175,24468,32559,
 36401,33075,29037,21933,20189,21751,20975,20087,
 17530,27723,30891,21128,19982,15446,12413,13597,
 15776,14233,15622,16334,15485,17136,16389,17954,
 20349,18486,23377,34447,34400,34681,33107,31171,
 30007,33640,37007,38136,39187,38169,51831,52041,
 47831,48634,44189,43878,44743,46468,43170,47172,
 53518,52294,54825,51992,49619,48147,47901,48413,
 46049,49090,47590,46154,45423,41223,41782,54695,
 57452,51210,52462,59096,56711,52268,49364,42865,
 41483,37964,39215,35908,31570,28332,24492,23121,
 22874,18154,15541,15263,12463,12198,13301,9951
};*/


#define BUFFER_SIZE 64

// states for display output
const int on[8][8] = {
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1
};

const int high[8][8] = {
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0,
    0, 1, 1, 1, 1, 1, 1, 0,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1
};

const int med[8][8] = {
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0,
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1
};

const int low[8][8] = {
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 1, 1, 1, 1, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0,
    1, 1, 1, 1, 1, 1, 1, 1
};

const int off[8][8] = {
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0
};




void display_fft(float sample[])
{

    int state = 0;
    float freq = 0;
    matrix.begin(0x70);

        
    
    //calculates FFT value of passed in array
    //Value scaled down by 4 for visualization
    freq = sample[1]/4;


    //pc.printf("%f\n",freq);

    // determine state based on the FFT output range
    if (freq < 10000) {
        state = 5; // OFF
    } else if (freq >= 10000 && freq < 25000) {
        state = 4; // LOW
    } else if (freq >= 25000 && freq < 40000) {
        state = 3; // MED
    } else if (freq >= 40000 && freq < 55000) {
        state = 2; // HIGH
    } else if (freq >= 55000) {
        state = 1; // ON
    }

    // switch statement based on the state
    switch (state) {
        case(1): // CASE HIGHEST
            matrix.clear();
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (on[i][j] == 1) {
                        matrix.drawPixel(i, j, LED_ON);
                    }
                }
            }
            matrix.writeDisplay();
            Thread::wait(10);
            //wait(.15);
            break;

        case(2): // CASE HIGH
            matrix.clear();
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (high[i][j] == 1) {
                        matrix.drawPixel(i, j, LED_ON);
                    }
                }
            }
            matrix.writeDisplay();
            Thread::wait(10);
            //wait(.15);



        case(3): // CASE MEDIUM
            matrix.clear();
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (med[i][j] == 1) {
                        matrix.drawPixel(i, j, LED_ON);
                    }
                }
            }
            matrix.writeDisplay();
            Thread::wait(10);
            //wait(.15);
            break;

        case(4): // CASE LOW
            matrix.clear();
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (low[i][j] == 1) {
                        matrix.drawPixel(i, j, LED_ON);
                    }
                }
            }
            matrix.writeDisplay();
            Thread::wait(10);
            break;

        case(5): // CASE OFF
            matrix.clear();
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (off[i][j] == 1) {
                        matrix.drawPixel(i, j, LED_ON);
                    }
                }
            }
            matrix.writeDisplay();
            Thread::wait(10);
            //wait(.15);
            break;

        default:
            break;
    }


}

//Reads SD card and passes value to frequency display
void display_thread(void const* args)
{
    while(1) {
        
        //Buffer which will hold 64 values
        float buffer[BUFFER_SIZE];
        //index for iteratiing through buffer
        int buffer_index = 0;
        //index for iterating through song array
        int song_array_index = 0;
        if(play) {
            //int num_elements = NUM_ELEMENTS_AROUND_THE_WORLD;
            while(play && song_array_index < song_data_length) {
                buffer[buffer_index] = song_data[song_array_index];
                song_array_index++;
                // pc.printf("%f", buffer[buffer_index]);
                buffer_index++;
                //pc.printf("%d\n",value);
                //buffer_index++;
                if(buffer_index == BUFFER_SIZE) {
                    //fast fourier tranform function here
                    vRealFFT(buffer, 4);
                    display_fft(buffer);
                    buffer_index = 0;
                    memset(buffer,0,sizeof(buffer));

                }

            }
        }
        Thread::wait(300);
    }

}

void speaker_thread(void const* args)
{
    while(1) {
        // check helper function for new song in GUI
        // grab file here and put together string
        // string song_title = "/sd/" + "" + ".wav";


        if(play == true && song_selected == true) {
            speaker_lock.lock();
            FILE *wave_file;
            dir = "/sd/" + song + ".wav";

            file_lock.lock();
            wave_file=fopen(dir.c_str(),"r");
            if(wave_file == NULL)
            {
                pc.printf("Error opening music file\n");
                }
            file_lock.unlock();

            waver.play(wave_file);

            file_lock.lock();
            fclose(wave_file);
            file_lock.unlock();
            play = false;
            myled = 0;
            speaker_lock.unlock();
        } 
        Thread::wait(1000);
    }

}


int main()
{
    //sd.mount();
    pc.printf("I have updated\n");
    Thread th1(speaker_thread);
    Thread th2(display_thread);
    char c;
    while(1) {
        /*myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
        */
        while(!pc.readable()) {
            Thread::wait(1);
        }
        if (pc.getc() == '!') {
            c = pc.getc();
            switch(c) {
                /*
                case '1':
                    song = "africa-toto";

                    break;
                */
                case '2':
                    song = "around_the_world-atc";
                    song_data_length = NUM_ELEMENTS_AROUND_THE_WORLD;
                    song_data = data_around_the_world;
                    song_selected = true;
                    //play = true;
                    break;
                    
                /*
                case '3':
                    song = "beautiful_life-ace_of_base";
                    break;
                */
                
                
                case '4':
                    song = "dont_speak-no_doubt";
                    song_data_length = NUM_ELEMENTS_DONT_SPEAK_NO_DOUBT;
                    song_data = data_dont_speak_no_doubt;
                    song_selected = true;
                    break;
                case '5':
                    song = "my-love";
                    song_data_length = NUM_ELEMENTS_MY_LOVE;
                    song_data = data_my_love;
                    song_selected = true;
                    break;
                
                /*
                case '6':
                    song = "Song1_test";
                    break;
                */
                
                case 'P':
                    // wave_player plays
                    play = true;
                    myled =1;
                    break;
                case 'S':
                    // wave_player stops
                    play = false;
                    myled = 0;
                    break;
                default:
                    break;
            }
        }
        Thread::wait(100);
    }

}