Bust-a-Beat

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem PinDetect

main.cpp

Committer:
javenho14
Date:
2022-04-27
Revision:
2:d4fbe8a6302e
Parent:
0:bdbd3d6fc5d5

File content as of revision 2:d4fbe8a6302e:

#include "mbed.h"
#include "Speaker.h"
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "PinDetect.h"
#include "mpr121.h"
#include "rtos.h"
#include "wave_player.h"
#include <algorithm>

//Volume level
BusOut myleds(LED1, LED2, LED3, LED4);

//Frequency one of song
Speaker speaker1(p21);
//Frequency two of song
Speaker speaker2(p21);

//Help guide recording if recording 
//If not recording then show notes being played
uLCD_4DGL uLCD(p9, p10, p11);

//Save recording and play recording from
SDFileSystem sd(p5, p6, p7, p8, "sd");

//Push button to switch instruments
PinDetect pianoPB(p19);
PinDetect synthPB(p20);
PinDetect stringsPB(p16);

//Red LEDs to show current instrument
BusOut redLEDs(p22, p23, p24);

// ======= INIT FOR TOUCH PAD =======
// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);

// Setup the Serial to the PC for debugging
Serial pc(USBTX, USBRX);

// Setup the i2c bus on pins 28 and 27
I2C i2c(p28, p27);

// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
// ======= INIT FOR TOUCH PAD =======

//Bluetooth
RawSerial bluemod(p13,p14);

//Mutex Locks
//uLCD
Mutex stdio_mutex;
Mutex currState_mutex;

// ===== GLOBAL VARIABLES ======
enum instr{PIANO, SYNTH, STRINGS};
enum state{STARTING, IDLE, PLAYING, LOADING, SAVING};
enum playback{PAUSE, PLAY};

//Check how many places change state -> be sure to add mutex
volatile int currInstr = PIANO;
volatile int currState = STARTING;
volatile int volume = 0.5;
volatile int playback = PLAY;

volatile int gridPosX = 0;
volatile int gridPosY = 0;
// ===== GLOBAL VARIABLES ======

void fallInterrupt() {
    int key_code=0;
    int i=0;
    int value=mpr121.read(0x00);
    value +=mpr121.read(0x01)<<8;
    for (i=0; i<12; i++) {
        if (((value>>i)&0x01)==1) key_code=i+1;
    }
    switch (key_code) {
        case 1: //Right
            gridPosX = std::min(8, gridPosX + 1);
            break;
        case 4: //Up
            gridPosY = std::max(8, gridPosY + 1);
            break;
        case 5: //Select
            break;
        case 6: //Down
            gridPosY = std::min(0, gridPosY - 1);
            break;
        case 9: //Left
            gridPosX = std::min(0, gridPosX - 1);
            break;
        default:
            break;
    }
}

void piano_hit_callback (void){  
    redLEDs.write(0x04);
    currInstr = PIANO;
}

void synth_hit_callback (void){  
    redLEDs.write(0x02);
    currInstr = SYNTH;
}

void strings_hit_callback (void){  
    redLEDs.write(0x01);
    currInstr = STRINGS;
}

void lcdThread(void const *args) {
    while(1) {
//        switch(currState) {
//            case STARTING:
//                stdio_mutex.lock();
//                    uLCD.text_width(4);
//                    uLCD.text_height(4);
//                    uLCD.printf("Welcome to\n");
//                    uLCD.printf("BUST A BEAT\n");
//                stdio_mutex.unlock();
//                break;
//            case IDLE:
//                break;
//            case PLAYING:
//                break;
//            case LOADING:
//                break;
//            case SAVING:
//                break;
//        }
        Thread::wait(1000.0*0.2);
    }
}

void beatThread(void const *args) {
    while(1) {
//        if (currState == PLAYING) {
//            
//        }
        Thread::wait(1000.0*0.2);
    }
}

void noteThread(void const *args) {
    while(1) {
        if (currState == PLAYING) {
            
        }
        Thread::wait(1000.0*0.2);
    }
}

void blueToothThread(void const *args) {
    char bnum=0;
    char bhit=0;
    while(1) {
        if (bluemod.getc()=='!') {
            if (bluemod.getc()=='B') { //color data packet
                bnum = bluemod.getc(); //button number
                bhit = bluemod.getc(); //1=hit, 0=release
                if (bluemod.getc()==char(~('!' + 'B' + bnum + bhit))) {
                    switch (bnum) {
                        case '1': //Playback Start
                            playback = PLAY;
                            break;   
                        case '2': //Playback Stop
                            playback = PAUSE;
                            break;
                        case '3': //Save recording
                            currState = SAVING;
                            break;
                        case '4': //Load recording
                            currState = LOADING;
                            break;
                        case '5': //Volume Up
                            volume = std::min(1.0, volume + 0.1);
                            break;
                        case '6': //Volume Down
                            volume = std::max(0.0, volume - 0.1);
                            break;
                        default:
                            break;
                    }                    
                }
            }
        }
        if (volume >= 1) {
            myleds.write(0x0F);    
        } else if (volume >= 0.75) {
            myleds.write(0x07);    
        } else if (volume >= 0.50) {
            myleds.write(0x03); 
        } else if (volume >= 0.25) {
            myleds.write(0x01); 
        } else {
            myleds.write(0x00);
        }
        myleds.write(0x0F);  
        Thread::wait(1000.0*0.2);
    }
}

void init() {
    pianoPB.mode(PullUp);
    synthPB.mode(PullUp); 
    stringsPB.mode(PullUp); 
    interrupt.mode(PullUp);
    wait(0.01);
    pc.printf("I am here\n");
    pianoPB.attach_deasserted(&piano_hit_callback);
    synthPB.attach_deasserted(&synth_hit_callback);
    stringsPB.attach_deasserted(&strings_hit_callback);
    interrupt.fall(&fallInterrupt);
    
    pianoPB.setSampleFrequency();
    synthPB.setSampleFrequency();
    stringsPB.setSampleFrequency();
    
    Thread thread2(lcdThread);
    Thread thread3(beatThread);
    Thread thread4(noteThread);
    Thread thread5(blueToothThread);
}

int main() {
    init();
    //Touchpad
    currState = IDLE;
    while(1) {
        wait(0.2);
    }
}