this hurts

Dependencies:   FFT

main.cpp

Committer:
annieluo2
Date:
2020-12-02
Revision:
1:5dd6801bb0d6
Parent:
0:d6c9b09b4042
Child:
2:a6e81c45ef48

File content as of revision 1:5dd6801bb0d6:

#include "mbed.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "rtos.h"
#include "FFT.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;

DigitalOut myled(LED1); // mbed LED

// 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
};

// 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_thread(void const* args) {
    
    int state = 0;
    matrix.begin(0x70);
    
    while(1) {
        for (int a = 0; a < 12; a++) {
            for (int b = 0; b < 8; b++) {
        
        // grab the FFT frequencies;
        int freq = sample[a][b];
        
        // determine state based on the FFT output range
        if (freq >= 0 && 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();
                wait(1);
                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();
                wait(1);
        
            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();
                wait(1);
                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();
                wait(1);
                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();
                wait(1);
                break;
        
            default:
                break;
        }
        
        
        }
        }
    }
}

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";
        
        FILE *wave_file;
        wave_file=fopen("/sd/africa-toto.wav","r");
        
        speaker_lock.lock();
        waver.play(wave_file);
        speaker_lock.unlock();
        fclose(wave_file);
        Thread::wait(100);
        
    }
}
    

int main()
{
   
    Thread th1(speaker_thread);
    Thread th2(display_thread);

    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
        Thread::wait(100);
    }
    
}