Kevin Chen / Mbed 2 deprecated drue

Dependencies:   mbed SDFileSystem

Committer:
fenix2519
Date:
Fri Apr 26 15:30:05 2019 +0000
Revision:
5:e297f321fa20
Parent:
4:d414aee7ce9d
Child:
6:7f0a090b12e2
nn

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kchen7 0:fa9e77516ba6 1 // ESE350 Final Project: Drue
kchen7 0:fa9e77516ba6 2 #include "mbed.h"
fenix2519 5:e297f321fa20 3 #include "wave_player.h"
fenix2519 5:e297f321fa20 4 #include "SDFileSystem.h"
fenix2519 5:e297f321fa20 5 //#include "SDBlockDevice.h"
fenix2519 5:e297f321fa20 6
fenix2519 5:e297f321fa20 7 //#include "sdCard.cpp"
fenix2519 5:e297f321fa20 8
kchen7 2:81f364f7a4a6 9
kchen7 2:81f364f7a4a6 10 // Pin setup ////////////////////////////////////////////
fenix2519 5:e297f321fa20 11 SDFileSystem sd(p5, p6, p7, p8, "sd");
fenix2519 5:e297f321fa20 12 Timer timer;
fenix2519 5:e297f321fa20 13 Serial pc(USBTX, USBRX);
fenix2519 5:e297f321fa20 14 AnalogOut DACout(p18); //set up speaker
fenix2519 5:e297f321fa20 15 wave_player waver(&DACout); //set up wave player library
fenix2519 5:e297f321fa20 16
kchen7 2:81f364f7a4a6 17 // Button Inputs
kchen7 2:81f364f7a4a6 18 DigitalIn butC(p14);
kchen7 2:81f364f7a4a6 19 DigitalIn butD(p15);
kchen7 2:81f364f7a4a6 20 DigitalIn butE(p16);
kchen7 2:81f364f7a4a6 21 DigitalIn butF(p17);
kchen7 2:81f364f7a4a6 22 DigitalIn butG(p19);
kchen7 2:81f364f7a4a6 23 DigitalIn butA(p20);
kchen7 2:81f364f7a4a6 24 DigitalIn butB(p30);
kchen7 2:81f364f7a4a6 25 DigitalIn butCh(p29);
kchen7 2:81f364f7a4a6 26 DigitalIn butMode(p22);
kchen7 2:81f364f7a4a6 27
kchen7 3:07afde41e7e6 28 // For music
kchen7 3:07afde41e7e6 29 PwmOut speaker(p21);
kchen7 2:81f364f7a4a6 30
kchen7 3:07afde41e7e6 31 // I2C to drive LED srips
kchen7 4:d414aee7ce9d 32 I2C i2cLED(p9, p10);
kchen7 3:07afde41e7e6 33
kchen7 3:07afde41e7e6 34 // LED for tests
kchen7 3:07afde41e7e6 35 DigitalOut testLED(LED1);
kchen7 2:81f364f7a4a6 36
kchen7 2:81f364f7a4a6 37 /////////////////////////////////////////////////////////
kchen7 2:81f364f7a4a6 38
kchen7 3:07afde41e7e6 39 // Variables
kchen7 0:fa9e77516ba6 40 bool switchPressed;
kchen7 2:81f364f7a4a6 41 bool notePressed;
kchen7 2:81f364f7a4a6 42 int prevNote;
kchen7 0:fa9e77516ba6 43 int mode;
kchen7 3:07afde41e7e6 44 int numModes;
kchen7 4:d414aee7ce9d 45 int score;
kchen7 3:07afde41e7e6 46 bool needNote;
kchen7 3:07afde41e7e6 47 const int addr = 0b0100000 << 1;
kchen7 3:07afde41e7e6 48 char cmd[2];
kchen7 2:81f364f7a4a6 49
kchen7 2:81f364f7a4a6 50 ////////////////////////////////////////////////////////
kchen7 2:81f364f7a4a6 51
kchen7 3:07afde41e7e6 52 void variableInit() {
kchen7 3:07afde41e7e6 53 // modes
kchen7 3:07afde41e7e6 54 mode = 0;
kchen7 4:d414aee7ce9d 55 numModes = 3;
kchen7 3:07afde41e7e6 56 switchPressed = false;
kchen7 3:07afde41e7e6 57 // keys
kchen7 3:07afde41e7e6 58 notePressed = false;
kchen7 3:07afde41e7e6 59 prevNote = -1;
kchen7 3:07afde41e7e6 60 // wack-a-mole
kchen7 3:07afde41e7e6 61 needNote = true;
kchen7 4:d414aee7ce9d 62 score = 0;
kchen7 3:07afde41e7e6 63 }
kchen7 3:07afde41e7e6 64
kchen7 2:81f364f7a4a6 65 void buttonSetup() {
kchen7 2:81f364f7a4a6 66 butC.mode(PullUp);
kchen7 2:81f364f7a4a6 67 butD.mode(PullUp);
kchen7 2:81f364f7a4a6 68 butE.mode(PullUp);
kchen7 2:81f364f7a4a6 69 butF.mode(PullUp);
kchen7 2:81f364f7a4a6 70 butG.mode(PullUp);
kchen7 2:81f364f7a4a6 71 butA.mode(PullUp);
kchen7 2:81f364f7a4a6 72 butB.mode(PullUp);
kchen7 2:81f364f7a4a6 73 butCh.mode(PullUp);
kchen7 2:81f364f7a4a6 74 butMode.mode(PullUp);
kchen7 2:81f364f7a4a6 75 }
kchen7 2:81f364f7a4a6 76
fenix2519 5:e297f321fa20 77 void speakerSetup(){
fenix2519 5:e297f321fa20 78
fenix2519 5:e297f321fa20 79 }
fenix2519 5:e297f321fa20 80
kchen7 2:81f364f7a4a6 81 void pressKey() {
kchen7 2:81f364f7a4a6 82 if (butC == 0 || butD == 0 || butE == 0 || butF == 0 || butG == 0
kchen7 2:81f364f7a4a6 83 || butA == 0 || butB == 0 || butCh == 0) {
kchen7 2:81f364f7a4a6 84 // this if statement makes transitions between notes smoother
kchen7 2:81f364f7a4a6 85 // given that a note was already pressed before
kchen7 2:81f364f7a4a6 86 if (prevNote != -1) {
kchen7 2:81f364f7a4a6 87 switch(prevNote) {
kchen7 2:81f364f7a4a6 88 case 0:
kchen7 2:81f364f7a4a6 89 if (butC == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 90 break;
kchen7 2:81f364f7a4a6 91 case 1:
kchen7 2:81f364f7a4a6 92 if (butD == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 93 break;
kchen7 2:81f364f7a4a6 94 case 2:
kchen7 2:81f364f7a4a6 95 if (butE == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 96 break;
kchen7 2:81f364f7a4a6 97 case 3:
kchen7 2:81f364f7a4a6 98 if (butF == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 99 break;
kchen7 2:81f364f7a4a6 100 case 4:
kchen7 2:81f364f7a4a6 101 if (butG == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 102 break;
kchen7 2:81f364f7a4a6 103 case 5:
kchen7 2:81f364f7a4a6 104 if (butA == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 105 break;
kchen7 2:81f364f7a4a6 106 case 6:
kchen7 2:81f364f7a4a6 107 if (butB == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 108 break;
kchen7 2:81f364f7a4a6 109 case 7:
kchen7 2:81f364f7a4a6 110 if (butCh == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 111 break;
kchen7 2:81f364f7a4a6 112 }
kchen7 2:81f364f7a4a6 113 }
kchen7 2:81f364f7a4a6 114 // wait(0.003); needed this before to give period time to update
kchen7 2:81f364f7a4a6 115 // this if statement initializes first note sound
kchen7 2:81f364f7a4a6 116 if (!notePressed) {
kchen7 2:81f364f7a4a6 117 if (butC == 0) {
fenix2519 5:e297f321fa20 118 speaker.period(1.0/523.25);
kchen7 2:81f364f7a4a6 119 prevNote = 0;
kchen7 2:81f364f7a4a6 120 } else if (butD == 0) {
kchen7 2:81f364f7a4a6 121 speaker.period(1.0/587.33);
kchen7 2:81f364f7a4a6 122 prevNote = 1;
kchen7 2:81f364f7a4a6 123 } else if (butE == 0) {
kchen7 2:81f364f7a4a6 124 speaker.period(1.0/659.25);
kchen7 2:81f364f7a4a6 125 prevNote = 2;
kchen7 2:81f364f7a4a6 126 } else if (butF == 0) {
kchen7 2:81f364f7a4a6 127 speaker.period(1.0/698.46);
kchen7 2:81f364f7a4a6 128 prevNote = 3;
kchen7 2:81f364f7a4a6 129 } else if (butG == 0) {
kchen7 2:81f364f7a4a6 130 speaker.period(1.0/783.99);
kchen7 2:81f364f7a4a6 131 prevNote = 4;
kchen7 2:81f364f7a4a6 132 } else if (butA == 0) {
kchen7 2:81f364f7a4a6 133 speaker.period(1.0/880.0);
kchen7 2:81f364f7a4a6 134 prevNote = 5;
kchen7 2:81f364f7a4a6 135 } else if (butB == 0) {
kchen7 2:81f364f7a4a6 136 speaker.period(1.0/987.77);
kchen7 2:81f364f7a4a6 137 prevNote = 6;
kchen7 2:81f364f7a4a6 138 } else if (butCh == 0) {
kchen7 2:81f364f7a4a6 139 speaker.period(1.0/1040.50);
kchen7 2:81f364f7a4a6 140 prevNote = 7;
kchen7 2:81f364f7a4a6 141 }
kchen7 2:81f364f7a4a6 142 }
kchen7 2:81f364f7a4a6 143 notePressed = true;
kchen7 2:81f364f7a4a6 144 speaker = 0.5;
kchen7 2:81f364f7a4a6 145 } else {
kchen7 2:81f364f7a4a6 146 notePressed = false;
kchen7 2:81f364f7a4a6 147 speaker = 0;
kchen7 2:81f364f7a4a6 148 prevNote = -1;
kchen7 2:81f364f7a4a6 149 }
kchen7 2:81f364f7a4a6 150 }
kchen7 2:81f364f7a4a6 151
kchen7 0:fa9e77516ba6 152 void switchModeCheck() {
kchen7 3:07afde41e7e6 153 if (butMode == 0) {
kchen7 0:fa9e77516ba6 154 if (!switchPressed) {
kchen7 0:fa9e77516ba6 155 switchPressed = true;
kchen7 4:d414aee7ce9d 156 prevNote = -1;
kchen7 4:d414aee7ce9d 157 score = 0;
kchen7 4:d414aee7ce9d 158
kchen7 0:fa9e77516ba6 159 mode++;
kchen7 0:fa9e77516ba6 160 if (mode == numModes) {
kchen7 0:fa9e77516ba6 161 mode = 0;
kchen7 0:fa9e77516ba6 162 }
kchen7 0:fa9e77516ba6 163 }
kchen7 0:fa9e77516ba6 164 } else {
kchen7 0:fa9e77516ba6 165 switchPressed = false;
kchen7 0:fa9e77516ba6 166 }
kchen7 0:fa9e77516ba6 167 }
kchen7 2:81f364f7a4a6 168
kchen7 0:fa9e77516ba6 169 void cycleSound() {
kchen7 1:b0962a8bcc6d 170 static int count = 0;
kchen7 1:b0962a8bcc6d 171 if (count == 0){
kchen7 2:81f364f7a4a6 172 speaker.period(1.0/523.25);
kchen7 1:b0962a8bcc6d 173 } else if (count == 1){
kchen7 2:81f364f7a4a6 174 speaker.period(1.0/587.33);
kchen7 2:81f364f7a4a6 175 } else if (count == 2){
kchen7 2:81f364f7a4a6 176 speaker.period(1.0/659.25);
kchen7 2:81f364f7a4a6 177 } else if (count == 3){
kchen7 2:81f364f7a4a6 178 speaker.period(1.0/698.46);
kchen7 2:81f364f7a4a6 179 } else if (count == 4){
kchen7 2:81f364f7a4a6 180 speaker.period(1.0/783.99);
kchen7 2:81f364f7a4a6 181 } else if (count == 5){
kchen7 2:81f364f7a4a6 182 speaker.period(1.0/880.0);
kchen7 2:81f364f7a4a6 183 } else if (count == 6){
kchen7 2:81f364f7a4a6 184 speaker.period(1.0/987.77);
kchen7 2:81f364f7a4a6 185 } else if (count == 7){
kchen7 2:81f364f7a4a6 186 speaker.period(1.0/1040.50);
kchen7 1:b0962a8bcc6d 187 }
kchen7 0:fa9e77516ba6 188 speaker = 0.5;
kchen7 0:fa9e77516ba6 189 wait(0.2);
kchen7 0:fa9e77516ba6 190 speaker = 0;
kchen7 1:b0962a8bcc6d 191 count++;
kchen7 1:b0962a8bcc6d 192 if (count == 8) {count = 0;}
kchen7 4:d414aee7ce9d 193 prevNote = count;
kchen7 4:d414aee7ce9d 194 }
kchen7 4:d414aee7ce9d 195
kchen7 4:d414aee7ce9d 196 void lightLED(int key) {
kchen7 4:d414aee7ce9d 197 switch(key) {
kchen7 4:d414aee7ce9d 198 case 0:
kchen7 4:d414aee7ce9d 199 cmd[0] = 0xFE;
kchen7 4:d414aee7ce9d 200 break;
kchen7 4:d414aee7ce9d 201 case 1:
kchen7 4:d414aee7ce9d 202 cmd[0] = 0xFD;
kchen7 4:d414aee7ce9d 203 break;
kchen7 4:d414aee7ce9d 204 case 2:
kchen7 4:d414aee7ce9d 205 cmd[0] = 0xFB;
kchen7 4:d414aee7ce9d 206 break;
kchen7 4:d414aee7ce9d 207 case 3:
kchen7 4:d414aee7ce9d 208 cmd[0] = 0xF7;
kchen7 4:d414aee7ce9d 209 break;
kchen7 4:d414aee7ce9d 210 case 4:
kchen7 4:d414aee7ce9d 211 cmd[0] = 0x7F;
kchen7 4:d414aee7ce9d 212 break;
kchen7 4:d414aee7ce9d 213 case 5:
kchen7 4:d414aee7ce9d 214 cmd[0] = 0xBF;
kchen7 4:d414aee7ce9d 215 break;
kchen7 4:d414aee7ce9d 216 case 6:
kchen7 4:d414aee7ce9d 217 cmd[0] = 0xDF;
kchen7 4:d414aee7ce9d 218 break;
kchen7 4:d414aee7ce9d 219 case 7:
kchen7 4:d414aee7ce9d 220 cmd[0] = 0xEF;
kchen7 4:d414aee7ce9d 221 break;
kchen7 4:d414aee7ce9d 222 default:
kchen7 4:d414aee7ce9d 223 cmd[0] = 0xFF;
kchen7 4:d414aee7ce9d 224 }
kchen7 4:d414aee7ce9d 225 i2cLED.write(addr, cmd, 1);
kchen7 0:fa9e77516ba6 226 }
kchen7 2:81f364f7a4a6 227
fenix2519 5:e297f321fa20 228 void testSd(){
fenix2519 5:e297f321fa20 229 pc.printf("Kevin sucks\n");
fenix2519 5:e297f321fa20 230 mkdir("/sd/mydir", 0777);
fenix2519 5:e297f321fa20 231 FILE *fp = fopen("/sd/mydir/sdtest.txt", "w");
fenix2519 5:e297f321fa20 232 if(fp == NULL) {
fenix2519 5:e297f321fa20 233 error("Could not open file for write\n");
fenix2519 5:e297f321fa20 234 }
fenix2519 5:e297f321fa20 235 fprintf(fp, "If you see this you owe Mirko a cookie hah");
fenix2519 5:e297f321fa20 236 fclose(fp);
fenix2519 5:e297f321fa20 237
fenix2519 5:e297f321fa20 238 pc.printf("Mirko wins\n");
fenix2519 5:e297f321fa20 239 }
fenix2519 5:e297f321fa20 240
fenix2519 5:e297f321fa20 241 void testSpeaker(){
fenix2519 5:e297f321fa20 242
fenix2519 5:e297f321fa20 243 FILE *wave_file;
fenix2519 5:e297f321fa20 244 wave_file = fopen("/sd/notes/C4.wav","r"); //opens the music file
fenix2519 5:e297f321fa20 245 waver.play(wave_file); //plays the music file
fenix2519 5:e297f321fa20 246 fclose(wave_file);
fenix2519 5:e297f321fa20 247 }
fenix2519 5:e297f321fa20 248
kchen7 0:fa9e77516ba6 249 int main() {
fenix2519 5:e297f321fa20 250 pc.baud (115200);
kchen7 3:07afde41e7e6 251 variableInit();
kchen7 2:81f364f7a4a6 252 buttonSetup();
fenix2519 5:e297f321fa20 253 speakerSetup();
fenix2519 5:e297f321fa20 254 wait(0.5);
fenix2519 5:e297f321fa20 255 testSd();
fenix2519 5:e297f321fa20 256 testSpeaker();
fenix2519 5:e297f321fa20 257 // testSd();
fenix2519 5:e297f321fa20 258
kchen7 0:fa9e77516ba6 259 while(1) {
kchen7 4:d414aee7ce9d 260
kchen7 4:d414aee7ce9d 261 lightLED(prevNote);
kchen7 3:07afde41e7e6 262 switchModeCheck();
kchen7 3:07afde41e7e6 263
kchen7 3:07afde41e7e6 264 if (mode == 0) {
kchen7 4:d414aee7ce9d 265 testLED = 0; // remove once whac-a-mole is implemented
kchen7 3:07afde41e7e6 266 pressKey();
kchen7 3:07afde41e7e6 267 } else if (mode == 1) {
kchen7 4:d414aee7ce9d 268 testLED = 1; // remove once whac-a-mole is implemented
kchen7 4:d414aee7ce9d 269 } else if (mode == 2) {
kchen7 4:d414aee7ce9d 270 testLED = 0; // remove once whac-a-mole is implemented
kchen7 3:07afde41e7e6 271 cycleSound();
kchen7 3:07afde41e7e6 272 }
kchen7 0:fa9e77516ba6 273 }
kchen7 1:b0962a8bcc6d 274 }