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

Dependencies:   SDFileSystem mbed BillyBass

Committer:
bikeNomad
Date:
Tue Jun 18 13:11:31 2013 +0000
Revision:
11:bc25840eca44
Parent:
9:99213347474f
Child:
12:1206e56712d8
got first song working; added inversion of BB outputs; still running out of memory.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bikeNomad 5:5b846ef42702 1 #include "billybass.hpp"
bikeNomad 7:ce27f959813b 2 #include "SDFileSystem.h"
bikeNomad 5:5b846ef42702 3 #include "song.hpp"
bikeNomad 5:5b846ef42702 4 #include "player.hpp"
bikeNomad 5:5b846ef42702 5 #include "action.hpp"
bikeNomad 0:0944c3654ded 6
bikeNomad 0:0944c3654ded 7 // Power:
bikeNomad 0:0944c3654ded 8 // Power GND J9/14
bikeNomad 0:0944c3654ded 9 // Vin (6V) J9/16
bikeNomad 0:0944c3654ded 10
bikeNomad 11:bc25840eca44 11 // tailPin, mouthPin, bodyPin inverted
bikeNomad 11:bc25840eca44 12 BillyBass testBass(LED_RED, LED_GREEN, LED_BLUE, true);
bikeNomad 7:ce27f959813b 13
bikeNomad 7:ce27f959813b 14 // tailPin, mouthPin, bodyPin
bikeNomad 7:ce27f959813b 15 // J3/2, J3/1, J3/3
bikeNomad 7:ce27f959813b 16 BillyBass realBass(PTA13, PTC12, PTC13);
bikeNomad 0:0944c3654ded 17
bikeNomad 0:0944c3654ded 18 DigitalIn pushbutton(PTD5); // J3/4
bikeNomad 0:0944c3654ded 19
bikeNomad 0:0944c3654ded 20 // Analog:
bikeNomad 0:0944c3654ded 21 // GND J3/14
bikeNomad 0:0944c3654ded 22 // VrefH J3/16
bikeNomad 5:5b846ef42702 23 AnalogOut speaker(PTE30); // J10/11
bikeNomad 0:0944c3654ded 24
bikeNomad 5:5b846ef42702 25 // PTD0 D10 - Used for CS of SPI
bikeNomad 5:5b846ef42702 26 // PTD2 D11 - Used for MOSI of SPI
bikeNomad 5:5b846ef42702 27 // PTD3 D12 - Used for MISO of SPI
bikeNomad 0:0944c3654ded 28 // PTC5 J1/9 Used for SCLK of SPI
bikeNomad 0:0944c3654ded 29
bikeNomad 7:ce27f959813b 30 // MOSI, MISO, SCLK, CS, name
bikeNomad 0:0944c3654ded 31 SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, SD_NAME);
bikeNomad 7:ce27f959813b 32
bikeNomad 0:0944c3654ded 33 Serial pc(USBTX, USBRX);
bikeNomad 0:0944c3654ded 34
bikeNomad 11:bc25840eca44 35 static void biggestAllocation()
bikeNomad 8:1dd2bb31dec6 36 {
bikeNomad 8:1dd2bb31dec6 37 size_t blksize = 16384;
bikeNomad 8:1dd2bb31dec6 38 char *m;
bikeNomad 8:1dd2bb31dec6 39
bikeNomad 8:1dd2bb31dec6 40 while (blksize > 0 && (m = (char *)malloc(blksize)) == 0) {
bikeNomad 8:1dd2bb31dec6 41 blksize -= 1024;
bikeNomad 8:1dd2bb31dec6 42 }
bikeNomad 8:1dd2bb31dec6 43
bikeNomad 8:1dd2bb31dec6 44 char *heaptop = m + blksize;
bikeNomad 8:1dd2bb31dec6 45 fprintf(stderr, "biggest: %u, heaptop: %p, current SP: %p, room: %u\r\n",
bikeNomad 8:1dd2bb31dec6 46 blksize,
bikeNomad 8:1dd2bb31dec6 47 heaptop,
bikeNomad 8:1dd2bb31dec6 48 __current_sp(),
bikeNomad 8:1dd2bb31dec6 49 (char *)__current_sp() - heaptop);
bikeNomad 8:1dd2bb31dec6 50
bikeNomad 8:1dd2bb31dec6 51 free(m);
bikeNomad 8:1dd2bb31dec6 52 }
bikeNomad 8:1dd2bb31dec6 53
bikeNomad 11:bc25840eca44 54 static void dumpHeap()
bikeNomad 8:1dd2bb31dec6 55 {
bikeNomad 8:1dd2bb31dec6 56 biggestAllocation();
bikeNomad 8:1dd2bb31dec6 57 __heapstats((__heapprt)fprintf,stderr);
bikeNomad 8:1dd2bb31dec6 58 __heapvalid((__heapprt)fprintf,stderr, 0);
bikeNomad 8:1dd2bb31dec6 59 }
bikeNomad 8:1dd2bb31dec6 60
bikeNomad 0:0944c3654ded 61 int main()
bikeNomad 0:0944c3654ded 62 {
bikeNomad 3:00b4c1aadd30 63 SongPlayer player;
bikeNomad 5:5b846ef42702 64 pc.baud(SERIAL_BAUD);
bikeNomad 7:ce27f959813b 65
bikeNomad 8:1dd2bb31dec6 66 fprintf(stderr, "*** REBOOT ***\r\n");
bikeNomad 3:00b4c1aadd30 67
bikeNomad 0:0944c3654ded 68 // read the directory
bikeNomad 7:ce27f959813b 69 DIR *bassDir = 0;
bikeNomad 7:ce27f959813b 70 while (!bassDir) {
bikeNomad 7:ce27f959813b 71 if ((bassDir = opendir(BASS_DIRECTORY)) != 0)
bikeNomad 7:ce27f959813b 72 break;
bikeNomad 7:ce27f959813b 73 pc.printf("Error opening " BASS_DIRECTORY "\r\n");
bikeNomad 7:ce27f959813b 74 wait(1.0);
bikeNomad 7:ce27f959813b 75 }
bikeNomad 7:ce27f959813b 76
bikeNomad 9:99213347474f 77 while (dirent *d = readdir(bassDir)) {
bikeNomad 11:bc25840eca44 78 dumpHeap();
bikeNomad 9:99213347474f 79 Song *song = Song::newSong(d->d_name);
bikeNomad 9:99213347474f 80 if (song) {
bikeNomad 11:bc25840eca44 81 dumpHeap();
bikeNomad 9:99213347474f 82 pc.printf("Playing %s\r\n", song->getSampleFileName());
bikeNomad 9:99213347474f 83 player.playEntireSong(song);
bikeNomad 9:99213347474f 84 pc.printf("total length: %f done: %u\r\n", player.timeInSong, player.actionsDone);
bikeNomad 9:99213347474f 85 delete song;
bikeNomad 11:bc25840eca44 86 dumpHeap();
bikeNomad 9:99213347474f 87 }
bikeNomad 9:99213347474f 88 }
bikeNomad 9:99213347474f 89
bikeNomad 8:1dd2bb31dec6 90 closedir(bassDir);
bikeNomad 9:99213347474f 91 pc.printf("Done.\r\n");
bikeNomad 0:0944c3654ded 92 }
bikeNomad 8:1dd2bb31dec6 93