Big Mouth Billy Bass player that takes raw wavefiles and decision list text files from an SD card

Dependencies:   SDFileSystem mbed BillyBass

main.cpp

Committer:
bikeNomad
Date:
2013-06-18
Revision:
12:1206e56712d8
Parent:
11:bc25840eca44
Child:
13:c13b3db9649b

File content as of revision 12:1206e56712d8:

#include "billybass.hpp"
#include "SDFileSystem.h"
#include "song.hpp"
#include "player.hpp"
#include "action.hpp"

// Power:
// Power GND  J9/14
// Vin (6V)   J9/16

//                 tailPin,  mouthPin, bodyPin   inverted
BillyBass testBass(LED_RED, LED_GREEN, LED_BLUE, true);

//               tailPin, mouthPin, bodyPin
//                  J3/2,  J3/1, J3/3
BillyBass realBass(PTA13, PTC12, PTC13);

DigitalIn pushbutton(PTD5); // J3/4

// Analog:
// GND   J3/14
// VrefH J3/16
AnalogOut speaker(PTE30);              // J10/11

// PTD0 D10 - Used for CS of SPI
// PTD2 D11 - Used for MOSI of SPI
// PTD3 D12 - Used for MISO of SPI
// PTC5 J1/9  Used for SCLK of SPI

//              MOSI, MISO, SCLK,   CS, name
SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, SD_NAME);

Serial pc(USBTX, USBRX);

static void biggestAllocation()
{
    size_t blksize = 16384;
    char *m;

    while (blksize > 0 && (m = (char *)malloc(blksize)) == 0) {
        blksize -= 1024;
    }

    char *heaptop = m + blksize;
    fprintf(stderr, "biggest: %u, heaptop: %p, current SP: %p, room: %u\r\n",
            blksize,
            heaptop,
            __current_sp(),
            (char *)__current_sp() - heaptop);

    free(m);
}

static void dumpHeap()
{
    biggestAllocation();
    __heapstats((__heapprt)fprintf,stderr);
    __heapvalid((__heapprt)fprintf,stderr, 0);
}

int main()
{
    SongPlayer player;
    pc.baud(SERIAL_BAUD);

    fprintf(stderr, "*** REBOOT ***\r\n");

    // read the directory
    DIR *bassDir = 0;
    while (!bassDir) {
        if ((bassDir = opendir(BASS_DIRECTORY)) != 0)
            break;
        pc.printf("Error opening " BASS_DIRECTORY "\r\n");
        wait(1.0);
    }

    while (dirent *d = readdir(bassDir)) {
        Song *song = Song::newSong(d->d_name);
        if (song) {
            pc.printf("Playing %s\r\n", song->getSampleFileName());
            player.playEntireSong(song);
            pc.printf("total length: %f done: %u\r\n", player.timeInSong, player.actionsDone);
        }
    }

    closedir(bassDir);
    pc.printf("Done.\r\n");
}