Kevin Chen / Mbed 2 deprecated drue

Dependencies:   mbed SDFileSystem

Committer:
kchen7
Date:
Fri Apr 26 07:28:26 2019 +0000
Revision:
4:d414aee7ce9d
Parent:
3:07afde41e7e6
Child:
5:e297f321fa20
ready for demo 2;

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"
kchen7 2:81f364f7a4a6 3
kchen7 2:81f364f7a4a6 4 // Pin setup ////////////////////////////////////////////
kchen7 2:81f364f7a4a6 5 // Button Inputs
kchen7 2:81f364f7a4a6 6 DigitalIn butC(p14);
kchen7 2:81f364f7a4a6 7 DigitalIn butD(p15);
kchen7 2:81f364f7a4a6 8 DigitalIn butE(p16);
kchen7 2:81f364f7a4a6 9 DigitalIn butF(p17);
kchen7 2:81f364f7a4a6 10 DigitalIn butG(p19);
kchen7 2:81f364f7a4a6 11 DigitalIn butA(p20);
kchen7 2:81f364f7a4a6 12 DigitalIn butB(p30);
kchen7 2:81f364f7a4a6 13 DigitalIn butCh(p29);
kchen7 2:81f364f7a4a6 14 DigitalIn butMode(p22);
kchen7 2:81f364f7a4a6 15
kchen7 3:07afde41e7e6 16 // For music
kchen7 3:07afde41e7e6 17 PwmOut speaker(p21);
kchen7 2:81f364f7a4a6 18
kchen7 3:07afde41e7e6 19 // I2C to drive LED srips
kchen7 4:d414aee7ce9d 20 I2C i2cLED(p9, p10);
kchen7 3:07afde41e7e6 21
kchen7 3:07afde41e7e6 22 // LED for tests
kchen7 3:07afde41e7e6 23 DigitalOut testLED(LED1);
kchen7 2:81f364f7a4a6 24
kchen7 2:81f364f7a4a6 25 /////////////////////////////////////////////////////////
kchen7 2:81f364f7a4a6 26
kchen7 3:07afde41e7e6 27 // Variables
kchen7 0:fa9e77516ba6 28 bool switchPressed;
kchen7 2:81f364f7a4a6 29 bool notePressed;
kchen7 2:81f364f7a4a6 30 int prevNote;
kchen7 0:fa9e77516ba6 31 int mode;
kchen7 3:07afde41e7e6 32 int numModes;
kchen7 4:d414aee7ce9d 33 int score;
kchen7 3:07afde41e7e6 34 bool needNote;
kchen7 3:07afde41e7e6 35 const int addr = 0b0100000 << 1;
kchen7 3:07afde41e7e6 36 char cmd[2];
kchen7 2:81f364f7a4a6 37
kchen7 2:81f364f7a4a6 38 ////////////////////////////////////////////////////////
kchen7 2:81f364f7a4a6 39
kchen7 3:07afde41e7e6 40 void variableInit() {
kchen7 3:07afde41e7e6 41 // modes
kchen7 3:07afde41e7e6 42 mode = 0;
kchen7 4:d414aee7ce9d 43 numModes = 3;
kchen7 3:07afde41e7e6 44 switchPressed = false;
kchen7 3:07afde41e7e6 45 // keys
kchen7 3:07afde41e7e6 46 notePressed = false;
kchen7 3:07afde41e7e6 47 prevNote = -1;
kchen7 3:07afde41e7e6 48 // wack-a-mole
kchen7 3:07afde41e7e6 49 needNote = true;
kchen7 4:d414aee7ce9d 50 score = 0;
kchen7 3:07afde41e7e6 51 }
kchen7 3:07afde41e7e6 52
kchen7 2:81f364f7a4a6 53 void buttonSetup() {
kchen7 2:81f364f7a4a6 54 butC.mode(PullUp);
kchen7 2:81f364f7a4a6 55 butD.mode(PullUp);
kchen7 2:81f364f7a4a6 56 butE.mode(PullUp);
kchen7 2:81f364f7a4a6 57 butF.mode(PullUp);
kchen7 2:81f364f7a4a6 58 butG.mode(PullUp);
kchen7 2:81f364f7a4a6 59 butA.mode(PullUp);
kchen7 2:81f364f7a4a6 60 butB.mode(PullUp);
kchen7 2:81f364f7a4a6 61 butCh.mode(PullUp);
kchen7 2:81f364f7a4a6 62 butMode.mode(PullUp);
kchen7 2:81f364f7a4a6 63 }
kchen7 2:81f364f7a4a6 64
kchen7 2:81f364f7a4a6 65 void pressKey() {
kchen7 2:81f364f7a4a6 66 if (butC == 0 || butD == 0 || butE == 0 || butF == 0 || butG == 0
kchen7 2:81f364f7a4a6 67 || butA == 0 || butB == 0 || butCh == 0) {
kchen7 2:81f364f7a4a6 68 // this if statement makes transitions between notes smoother
kchen7 2:81f364f7a4a6 69 // given that a note was already pressed before
kchen7 2:81f364f7a4a6 70 if (prevNote != -1) {
kchen7 2:81f364f7a4a6 71 switch(prevNote) {
kchen7 2:81f364f7a4a6 72 case 0:
kchen7 2:81f364f7a4a6 73 if (butC == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 74 break;
kchen7 2:81f364f7a4a6 75 case 1:
kchen7 2:81f364f7a4a6 76 if (butD == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 77 break;
kchen7 2:81f364f7a4a6 78 case 2:
kchen7 2:81f364f7a4a6 79 if (butE == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 80 break;
kchen7 2:81f364f7a4a6 81 case 3:
kchen7 2:81f364f7a4a6 82 if (butF == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 83 break;
kchen7 2:81f364f7a4a6 84 case 4:
kchen7 2:81f364f7a4a6 85 if (butG == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 86 break;
kchen7 2:81f364f7a4a6 87 case 5:
kchen7 2:81f364f7a4a6 88 if (butA == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 89 break;
kchen7 2:81f364f7a4a6 90 case 6:
kchen7 2:81f364f7a4a6 91 if (butB == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 92 break;
kchen7 2:81f364f7a4a6 93 case 7:
kchen7 2:81f364f7a4a6 94 if (butCh == 1) {notePressed = false;}
kchen7 2:81f364f7a4a6 95 break;
kchen7 2:81f364f7a4a6 96 }
kchen7 2:81f364f7a4a6 97 }
kchen7 2:81f364f7a4a6 98 // wait(0.003); needed this before to give period time to update
kchen7 2:81f364f7a4a6 99 // this if statement initializes first note sound
kchen7 2:81f364f7a4a6 100 if (!notePressed) {
kchen7 2:81f364f7a4a6 101 if (butC == 0) {
kchen7 2:81f364f7a4a6 102 speaker.period(1.0/523.25);
kchen7 2:81f364f7a4a6 103 prevNote = 0;
kchen7 2:81f364f7a4a6 104 } else if (butD == 0) {
kchen7 2:81f364f7a4a6 105 speaker.period(1.0/587.33);
kchen7 2:81f364f7a4a6 106 prevNote = 1;
kchen7 2:81f364f7a4a6 107 } else if (butE == 0) {
kchen7 2:81f364f7a4a6 108 speaker.period(1.0/659.25);
kchen7 2:81f364f7a4a6 109 prevNote = 2;
kchen7 2:81f364f7a4a6 110 } else if (butF == 0) {
kchen7 2:81f364f7a4a6 111 speaker.period(1.0/698.46);
kchen7 2:81f364f7a4a6 112 prevNote = 3;
kchen7 2:81f364f7a4a6 113 } else if (butG == 0) {
kchen7 2:81f364f7a4a6 114 speaker.period(1.0/783.99);
kchen7 2:81f364f7a4a6 115 prevNote = 4;
kchen7 2:81f364f7a4a6 116 } else if (butA == 0) {
kchen7 2:81f364f7a4a6 117 speaker.period(1.0/880.0);
kchen7 2:81f364f7a4a6 118 prevNote = 5;
kchen7 2:81f364f7a4a6 119 } else if (butB == 0) {
kchen7 2:81f364f7a4a6 120 speaker.period(1.0/987.77);
kchen7 2:81f364f7a4a6 121 prevNote = 6;
kchen7 2:81f364f7a4a6 122 } else if (butCh == 0) {
kchen7 2:81f364f7a4a6 123 speaker.period(1.0/1040.50);
kchen7 2:81f364f7a4a6 124 prevNote = 7;
kchen7 2:81f364f7a4a6 125 }
kchen7 2:81f364f7a4a6 126 }
kchen7 2:81f364f7a4a6 127 notePressed = true;
kchen7 2:81f364f7a4a6 128 speaker = 0.5;
kchen7 2:81f364f7a4a6 129 } else {
kchen7 2:81f364f7a4a6 130 notePressed = false;
kchen7 2:81f364f7a4a6 131 speaker = 0;
kchen7 2:81f364f7a4a6 132 prevNote = -1;
kchen7 2:81f364f7a4a6 133 }
kchen7 2:81f364f7a4a6 134 }
kchen7 2:81f364f7a4a6 135
kchen7 0:fa9e77516ba6 136 void switchModeCheck() {
kchen7 3:07afde41e7e6 137 if (butMode == 0) {
kchen7 0:fa9e77516ba6 138 if (!switchPressed) {
kchen7 0:fa9e77516ba6 139 switchPressed = true;
kchen7 4:d414aee7ce9d 140 prevNote = -1;
kchen7 4:d414aee7ce9d 141 score = 0;
kchen7 4:d414aee7ce9d 142
kchen7 0:fa9e77516ba6 143 mode++;
kchen7 0:fa9e77516ba6 144 if (mode == numModes) {
kchen7 0:fa9e77516ba6 145 mode = 0;
kchen7 0:fa9e77516ba6 146 }
kchen7 0:fa9e77516ba6 147 }
kchen7 0:fa9e77516ba6 148 } else {
kchen7 0:fa9e77516ba6 149 switchPressed = false;
kchen7 0:fa9e77516ba6 150 }
kchen7 0:fa9e77516ba6 151 }
kchen7 2:81f364f7a4a6 152
kchen7 0:fa9e77516ba6 153 void cycleSound() {
kchen7 1:b0962a8bcc6d 154 static int count = 0;
kchen7 1:b0962a8bcc6d 155 if (count == 0){
kchen7 2:81f364f7a4a6 156 speaker.period(1.0/523.25);
kchen7 1:b0962a8bcc6d 157 } else if (count == 1){
kchen7 2:81f364f7a4a6 158 speaker.period(1.0/587.33);
kchen7 2:81f364f7a4a6 159 } else if (count == 2){
kchen7 2:81f364f7a4a6 160 speaker.period(1.0/659.25);
kchen7 2:81f364f7a4a6 161 } else if (count == 3){
kchen7 2:81f364f7a4a6 162 speaker.period(1.0/698.46);
kchen7 2:81f364f7a4a6 163 } else if (count == 4){
kchen7 2:81f364f7a4a6 164 speaker.period(1.0/783.99);
kchen7 2:81f364f7a4a6 165 } else if (count == 5){
kchen7 2:81f364f7a4a6 166 speaker.period(1.0/880.0);
kchen7 2:81f364f7a4a6 167 } else if (count == 6){
kchen7 2:81f364f7a4a6 168 speaker.period(1.0/987.77);
kchen7 2:81f364f7a4a6 169 } else if (count == 7){
kchen7 2:81f364f7a4a6 170 speaker.period(1.0/1040.50);
kchen7 1:b0962a8bcc6d 171 }
kchen7 0:fa9e77516ba6 172 speaker = 0.5;
kchen7 0:fa9e77516ba6 173 wait(0.2);
kchen7 0:fa9e77516ba6 174 speaker = 0;
kchen7 1:b0962a8bcc6d 175 count++;
kchen7 1:b0962a8bcc6d 176 if (count == 8) {count = 0;}
kchen7 4:d414aee7ce9d 177 prevNote = count;
kchen7 4:d414aee7ce9d 178 }
kchen7 4:d414aee7ce9d 179
kchen7 4:d414aee7ce9d 180 void lightLED(int key) {
kchen7 4:d414aee7ce9d 181 switch(key) {
kchen7 4:d414aee7ce9d 182 case 0:
kchen7 4:d414aee7ce9d 183 cmd[0] = 0xFE;
kchen7 4:d414aee7ce9d 184 break;
kchen7 4:d414aee7ce9d 185 case 1:
kchen7 4:d414aee7ce9d 186 cmd[0] = 0xFD;
kchen7 4:d414aee7ce9d 187 break;
kchen7 4:d414aee7ce9d 188 case 2:
kchen7 4:d414aee7ce9d 189 cmd[0] = 0xFB;
kchen7 4:d414aee7ce9d 190 break;
kchen7 4:d414aee7ce9d 191 case 3:
kchen7 4:d414aee7ce9d 192 cmd[0] = 0xF7;
kchen7 4:d414aee7ce9d 193 break;
kchen7 4:d414aee7ce9d 194 case 4:
kchen7 4:d414aee7ce9d 195 cmd[0] = 0x7F;
kchen7 4:d414aee7ce9d 196 break;
kchen7 4:d414aee7ce9d 197 case 5:
kchen7 4:d414aee7ce9d 198 cmd[0] = 0xBF;
kchen7 4:d414aee7ce9d 199 break;
kchen7 4:d414aee7ce9d 200 case 6:
kchen7 4:d414aee7ce9d 201 cmd[0] = 0xDF;
kchen7 4:d414aee7ce9d 202 break;
kchen7 4:d414aee7ce9d 203 case 7:
kchen7 4:d414aee7ce9d 204 cmd[0] = 0xEF;
kchen7 4:d414aee7ce9d 205 break;
kchen7 4:d414aee7ce9d 206 default:
kchen7 4:d414aee7ce9d 207 cmd[0] = 0xFF;
kchen7 4:d414aee7ce9d 208 }
kchen7 4:d414aee7ce9d 209 i2cLED.write(addr, cmd, 1);
kchen7 0:fa9e77516ba6 210 }
kchen7 2:81f364f7a4a6 211
kchen7 0:fa9e77516ba6 212 int main() {
kchen7 3:07afde41e7e6 213 variableInit();
kchen7 2:81f364f7a4a6 214 buttonSetup();
kchen7 2:81f364f7a4a6 215
kchen7 0:fa9e77516ba6 216 while(1) {
kchen7 4:d414aee7ce9d 217
kchen7 4:d414aee7ce9d 218 lightLED(prevNote);
kchen7 3:07afde41e7e6 219 switchModeCheck();
kchen7 3:07afde41e7e6 220
kchen7 3:07afde41e7e6 221 if (mode == 0) {
kchen7 4:d414aee7ce9d 222 testLED = 0; // remove once whac-a-mole is implemented
kchen7 3:07afde41e7e6 223 pressKey();
kchen7 3:07afde41e7e6 224 } else if (mode == 1) {
kchen7 4:d414aee7ce9d 225 testLED = 1; // remove once whac-a-mole is implemented
kchen7 4:d414aee7ce9d 226 } else if (mode == 2) {
kchen7 4:d414aee7ce9d 227 testLED = 0; // remove once whac-a-mole is implemented
kchen7 3:07afde41e7e6 228 cycleSound();
kchen7 3:07afde41e7e6 229 }
kchen7 0:fa9e77516ba6 230 }
kchen7 1:b0962a8bcc6d 231 }