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:
Thu Jun 20 15:03:54 2013 +0000
Revision:
16:82a1bdc3320f
Parent:
14:79b3fd23c7b5
Made main loop repeat forever; eliminated time shifting

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 14:79b3fd23c7b5 6 #include <ctype.h>
bikeNomad 0:0944c3654ded 7
bikeNomad 13:c13b3db9649b 8 // tailPin, mouthPin, bodyPin inverted
bikeNomad 13:c13b3db9649b 9 // BillyBass testBass(LED_RED, LED_GREEN, LED_BLUE, true);
bikeNomad 0:0944c3654ded 10
bikeNomad 13:c13b3db9649b 11 // tailPin, mouthPin, bodyPin
bikeNomad 13:c13b3db9649b 12 BillyBass bass1(BASS1_TAIL, BASS1_MOUTH, BASS1_BODY);
bikeNomad 13:c13b3db9649b 13 // tailPin, mouthPin, bodyPin
bikeNomad 13:c13b3db9649b 14 BillyBass bass2(BASS2_TAIL, BASS2_MOUTH, BASS2_BODY);
bikeNomad 13:c13b3db9649b 15 DigitalIn button1(BASS1_BUTTON); // J3/4
bikeNomad 13:c13b3db9649b 16 DigitalIn button2(BASS2_BUTTON); // J3/2
bikeNomad 0:0944c3654ded 17
bikeNomad 0:0944c3654ded 18 // Analog:
bikeNomad 0:0944c3654ded 19 // GND J3/14
bikeNomad 0:0944c3654ded 20 // VrefH J3/16
bikeNomad 5:5b846ef42702 21 AnalogOut speaker(PTE30); // J10/11
bikeNomad 0:0944c3654ded 22
bikeNomad 13:c13b3db9649b 23 // MOSI, MISO, SCLK, CS, name
bikeNomad 13:c13b3db9649b 24 SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCLK, SD_CS, SD_NAME);
bikeNomad 0:0944c3654ded 25 Serial pc(USBTX, USBRX);
bikeNomad 0:0944c3654ded 26
bikeNomad 14:79b3fd23c7b5 27 Timer t;
bikeNomad 14:79b3fd23c7b5 28
bikeNomad 14:79b3fd23c7b5 29 void serialIrqHandler()
bikeNomad 14:79b3fd23c7b5 30 {
bikeNomad 14:79b3fd23c7b5 31 int c = pc.getc();
bikeNomad 14:79b3fd23c7b5 32 bool isLower = islower(c);
bikeNomad 14:79b3fd23c7b5 33 c = toupper(c);
bikeNomad 14:79b3fd23c7b5 34 DigitalOut *out = 0;
bikeNomad 14:79b3fd23c7b5 35 float elapsed = t.read();
bikeNomad 14:79b3fd23c7b5 36 t.reset();
bikeNomad 14:79b3fd23c7b5 37 pc.printf("%d %f\r\n", (int)!isLower, elapsed);
bikeNomad 14:79b3fd23c7b5 38
bikeNomad 14:79b3fd23c7b5 39 switch (c) {
bikeNomad 14:79b3fd23c7b5 40 case 'H':
bikeNomad 14:79b3fd23c7b5 41 case 'B':
bikeNomad 14:79b3fd23c7b5 42 out = bass1.outputNamed("body");
bikeNomad 14:79b3fd23c7b5 43 break;
bikeNomad 14:79b3fd23c7b5 44 case 'T':
bikeNomad 14:79b3fd23c7b5 45 out = bass1.outputNamed("tail");
bikeNomad 14:79b3fd23c7b5 46 break;
bikeNomad 14:79b3fd23c7b5 47 case 'M':
bikeNomad 14:79b3fd23c7b5 48 out = bass1.outputNamed("mouth");
bikeNomad 14:79b3fd23c7b5 49 default:
bikeNomad 14:79b3fd23c7b5 50 break;
bikeNomad 14:79b3fd23c7b5 51 }
bikeNomad 14:79b3fd23c7b5 52 if (out) {
bikeNomad 14:79b3fd23c7b5 53 if (isLower)
bikeNomad 14:79b3fd23c7b5 54 out->write(0);
bikeNomad 14:79b3fd23c7b5 55 else
bikeNomad 14:79b3fd23c7b5 56 out->write(1);
bikeNomad 14:79b3fd23c7b5 57 }
bikeNomad 14:79b3fd23c7b5 58 }
bikeNomad 14:79b3fd23c7b5 59
bikeNomad 0:0944c3654ded 60 int main()
bikeNomad 0:0944c3654ded 61 {
bikeNomad 3:00b4c1aadd30 62 SongPlayer player;
bikeNomad 5:5b846ef42702 63 pc.baud(SERIAL_BAUD);
bikeNomad 14:79b3fd23c7b5 64 t.start();
bikeNomad 14:79b3fd23c7b5 65 pc.attach(serialIrqHandler);
bikeNomad 13:c13b3db9649b 66 button1.mode(PullUp);
bikeNomad 13:c13b3db9649b 67 button2.mode(PullUp);
bikeNomad 7:ce27f959813b 68
bikeNomad 8:1dd2bb31dec6 69 fprintf(stderr, "*** REBOOT ***\r\n");
bikeNomad 3:00b4c1aadd30 70
bikeNomad 16:82a1bdc3320f 71 for (;;) {
bikeNomad 16:82a1bdc3320f 72 // read the directory
bikeNomad 16:82a1bdc3320f 73 DIR *bassDir = 0;
bikeNomad 16:82a1bdc3320f 74 while (!bassDir) {
bikeNomad 16:82a1bdc3320f 75 if ((bassDir = opendir(BASS_DIRECTORY)) != 0)
bikeNomad 16:82a1bdc3320f 76 break;
bikeNomad 16:82a1bdc3320f 77 pc.printf("Error opening " BASS_DIRECTORY "\r\n");
bikeNomad 16:82a1bdc3320f 78 wait(1.0);
bikeNomad 16:82a1bdc3320f 79 }
bikeNomad 7:ce27f959813b 80
bikeNomad 16:82a1bdc3320f 81 while (dirent *d = readdir(bassDir)) {
bikeNomad 16:82a1bdc3320f 82 Song *song = Song::newSong(d->d_name);
bikeNomad 16:82a1bdc3320f 83 if (song) {
bikeNomad 16:82a1bdc3320f 84 fprintf(stderr, "Waiting to play %s\r\n", song->getSampleFileName());
bikeNomad 16:82a1bdc3320f 85 while (!(!button1 || !button2))
bikeNomad 16:82a1bdc3320f 86 wait(0.1);
bikeNomad 16:82a1bdc3320f 87 player.playEntireSong(song);
bikeNomad 16:82a1bdc3320f 88 fprintf(stderr, "total length: %f done: %u\r\n", player.timeInSong, player.actionsDone);
bikeNomad 16:82a1bdc3320f 89 }
bikeNomad 9:99213347474f 90 }
bikeNomad 16:82a1bdc3320f 91 closedir(bassDir);
bikeNomad 16:82a1bdc3320f 92 fprintf(stderr, "Done.\r\n");
bikeNomad 9:99213347474f 93 }
bikeNomad 0:0944c3654ded 94 }
bikeNomad 8:1dd2bb31dec6 95