3872 Play-live--test code - tempting to make this the main one

Dependencies:   mbed fastlib

main.cpp

Committer:
chenchen2020
Date:
2020-11-11
Revision:
2:9296823ea33d
Parent:
1:c704bea518d8

File content as of revision 2:9296823ea33d:

#include <mbed.h>
#include <string>
#include <list>

#include <mpr121.h>
#include "SongPlayer.h"
#include "fastlib/clock.h"

SongPlayer mySpeaker(p21);

//fl_select_pll0_clock_source(1);
//fl_pll0_control(1,1); //enable PLL clock
//fl_pll0_config(1, 512); //Configure output clock freq.

Timer       t;
Timer       t_rest;
Timer       t_base;
Timer       reset_timer;
Timer       song_timer;
bool        timer_begin = 0;
bool        played = 0;
uint16_t    value = 0;
float       temp_value;
PwmOut      jawServo(p26);
PwmOut      baseServo(p25);
DigitalIn   record_mode(p14);
DigitalIn   play_back_mode(p16);
DigitalIn   play_live_mode(p15);
DigitalIn   stop_mode(p17);
DigitalIn   reset_mode(p20);
DigitalOut  greenLED(p23);
DigitalOut  redLED(p18);
DigitalOut  blueLED(p22);


enum        Statetype {IDLE = 0, REC = 1, PLAY_BACK = 2, PLAY_LIVE = 3, STOP = 4, RESET = 5};

Statetype   mode;

float       mem_note[160];
float       mem_duration[160];
int         mem_ind;
float       dt;
float dur[1]= {0.5f};

class Watchdog
{
public:
// Load timeout value in watchdog timer and enable
    void kick(float s)
    {
        LPC_WDT->WDCLKSEL = 0x1;                // Set CLK src to PCLK
        uint32_t clk = SystemCoreClock / 16;    // WD has a fixed /4 prescaler, PCLK default is /4
        LPC_WDT->WDTC = s * (float)clk;
        LPC_WDT->WDMOD = 0x3;                   // Enabled and Reset
        kick();
    }
// "kick" or "feed" the dog - reset the watchdog timer
// by writing this required bit pattern
    void kick()
    {
        LPC_WDT->WDFEED = 0xAA;
        LPC_WDT->WDFEED = 0x55;
    }
};

Watchdog wdt;

// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p30);

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

// Setup the i2c bus on pins 28 and 27
I2C i2c(p9, p10);

// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);

float note = 0;

float parse_key(uint16_t input)
{
    switch(input) {
        case 0x0:
            return 0.0;
        case 0x1:
            return 440.0;
        case 0x2:
            return 446.16;
        case 0x4:
            return 493.88;
        case 0x8:
            return 523.25;
        case 0x10:
            return 554.37;
        case 0x20:
            return 587.33;
        case 0x40:
            return 622.25;
        case 0x80:
            return 659.25;
        case 0x100:
            return 698.46;
        case 0x200:
            return 739.99;
        case 0x400:
            return 783.99;
        case 0x800:
            return 830.61;
        default:
            return 0.0;
    }
}

void dance(uint16_t note_input)
{

    if(note_input == 0x1) {
        redLED = 1;
        greenLED = 0;
        blueLED = 0;
        jawServo.write(0.11f);
        baseServo.write(0.11f);
    } else if(note_input == 0x1) {
        redLED = 1;
        greenLED = 1;
        blueLED = 0;
        jawServo.write(0.18f);
        baseServo.write(0.18f);
    } else if(note_input == 0x2) {
        redLED = 1;
        greenLED = 1;
        blueLED = 1;
        jawServo.write(0.23f);
        baseServo.write(0.23f);
    } else if(note_input == 0x4) {
        redLED = 0;
        greenLED = 1;
        blueLED = 1;
        jawServo.write(0.28f);
        baseServo.write(0.28f);
    } else if(note_input == 0x8) {
        redLED = 0;
        greenLED = 0;
        blueLED = 1;
        jawServo.write(0.34f);
        baseServo.write(0.34f);
    } else if(note_input == 0x10) {
        redLED = 0;
        greenLED = 1;
        blueLED = 1;
        jawServo.write(0.39f);
        baseServo.write(0.39f);
    } else if(note_input == 0x20) {
        redLED = 1;
        greenLED = 0;
        blueLED = 1;
        jawServo.write(0.48f);
        baseServo.write(0.48f);
    } else if(note_input == 0x40) {
        redLED = 1;
        greenLED = 1;
        blueLED = 0;
        jawServo.write(0.55f);
        baseServo.write(0.55f);
    } else if(note_input == 0x80) {
        redLED = 0;
        greenLED = 1;
        blueLED = 1;
        jawServo.write(0.63f);
        baseServo.write(0.63f);
    } else if(note_input == 0x100) {
        redLED = 1;
        greenLED = 1;
        blueLED = 0;
        jawServo.write(0.73f);
        baseServo.write(0.73f);
    } else if(note_input == 0x200) {
        redLED = 1;
        greenLED = 0;
        blueLED = 1;
        jawServo.write(0.83f);
        baseServo.write(0.83f);
    } else if(note_input == 0x400) {
        redLED = 1;
        greenLED = 0;
        blueLED = 1;
        jawServo.write(0.88f);
        baseServo.write(0.88f);
    } else if(note_input == 0x800) {
        redLED = 1;
        greenLED = 1;
        blueLED = 1;
        jawServo.write(0.93f);
        baseServo.write(0.93f);
    } else {
        redLED = 1;
        greenLED = 1;
        blueLED = 1;
        jawServo.write(0.98f);
        baseServo.write(0.98f);
    }
    //wait(0.45);
}

void fallInterrupt()
{
    //int key_code=0;
    //int i=0;
    //wdt.kick();
    interrupt.fall(NULL);
    t_rest.stop();
    t.start();
    uint16_t value=mpr121.read(0x00);
    value +=mpr121.read(0x01)<<8;
    float temp_value = parse_key(value);
    if(record_mode == 0 && mem_ind < 160){
        //Write duration and silence in object
        mem_note[mem_ind] = 0;
        mem_duration[mem_ind] = t_rest.read();
        pc.printf("New Data in memory:  Note: %f  Duration: %f\n", mem_note[mem_ind], mem_duration[mem_ind]);
        mem_ind++;    
    }
    pc.printf("The time of silence seconds %f \n", t_rest.read());
    t_rest.reset();
    wait(0.1);
    float note = parse_key(value);
    if(play_live_mode == 0 || record_mode == 0){
        mySpeaker.Play_Note(note);
        dance(note);
    }
    //wdt.kick();
    //sustaining note
    while(value > 0){
        if(play_live_mode == 0 || record_mode == 0){
            mySpeaker.Play_Note(note);
        }
        wait(0.05);
        pc.printf("MPR value: %x \r\n", value);
        note = parse_key(value);
        if(play_live_mode == 0 || record_mode == 0){
            mySpeaker.Play_Note(note);
        }
        value=mpr121.read(0x00);
        value +=mpr121.read(0x01)<<8;
        //wdt.kick();
    }
    mySpeaker.Play_Note(0);
    t.stop();
    if(record_mode == 0 && mem_ind < 160){
        mem_note[mem_ind] = temp_value;
        mem_duration[mem_ind] = t.read();
        pc.printf("New Data in memory:  Note: %f  Duration: %f\n", mem_note[mem_ind], mem_duration[mem_ind]);
        mem_ind++;
    }
    t_rest.start();
    float duration[] = {t.read()};
    pc.printf("The of note seconds %f \n", t.read());
    t.reset();
    //wait(0.05);
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);
    //wdt.kick();
}

int main()
{
    wait(1); //initialization
    //pc.printf("SystemCoreClock = %d Hz\r\n", SystemCoreClock);
    //wdt.kick(100);

    //reset_mode.fall(&reset);
    //reset_mode.rise(&reset_over);
    //reset_mode.mode(PullUp);

    jawServo.period_ms(20);
    baseServo.period_ms(20);
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);

    while (1) {
        if(record_mode == 0 && reset_mode == 1) {
            redLED = 1;
            blueLED = 0;
            greenLED = 0;
            played = 0;
            //wdt.kick();
        } else if(play_back_mode == 0 && reset_mode == 1) {
            note = 0;
            redLED = 0;
            blueLED = 1;
            greenLED = 0;
            interrupt.fall(NULL); //disable interrupt
            //t.stop();
            //t.reset();
            //t_rest.stop();
            //t_rest.reset();
            for(int k = 0; k < mem_ind; k++) {
                mySpeaker.Play_Note(mem_note[k]);
                dance(mem_note[k]);
                if(reset_mode == 0){
                    break;   
                }
                wait(mem_duration[k]);
            }
            interrupt.fall(&fallInterrupt);
            interrupt.mode(PullUp);
            //wdt.kick();
        } else if(play_live_mode == 0 && reset_mode == 1) {
            note = 0;
            redLED = 0;
            blueLED = 0;
            greenLED = 1;
            played = 0;
            //wdt.kick();
        } else if(stop_mode == 0 && reset_mode == 1) {
            note = 0;
            redLED = 0;
            blueLED = 0;
            greenLED = 0;
            //wdt.kick();
        } else if(reset_mode == 0) {
            //wdt.kick();
            note = 0;
            redLED = 0;
            blueLED = 0;
            greenLED = 0;
            interrupt.fall(NULL);
            mySpeaker.Play_Note(0);
            if(!timer_begin) {
                timer_begin = 1;
                reset_timer.start();
            }
            while(reset_mode == 0) {

                //t_base.stop();
                //dt += t_base.read();
                //t_base.reset();

                //rotation orientation back to original position
                //baseServo.pulsewidth_ms(1.9);
                //wait(dt);
                //dt = 0;
                if(reset_timer.read() > 3) {
                    for(int n = 0; n < 160; n++) {
                        mem_note[n] = 0;
                        mem_duration[n] = 0;
                    }
                }
                //wdt.kick();
            }
            reset_timer.stop();
            reset_timer.reset();
            timer_begin = 1;
            mem_ind = 0;
            interrupt.fall(&fallInterrupt);
            interrupt.mode(PullUp);
        }
        //wdt.kick();
    }
}