Big Mouth Billy Bass player that takes raw wavefiles and decision list text files from an SD card
Dependencies: SDFileSystem mbed BillyBass
main.cpp@16:82a1bdc3320f, 2013-06-20 (annotated)
- 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?
User | Revision | Line number | New 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 |