ECE3872 HW/SW Project Code
Dependencies: mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1
main.cpp
00001 #include "mbed.h" 00002 #include <iostream> 00003 #include <vector> 00004 #include "speaker_out.h" 00005 #include "motor_ctl.h" 00006 #include "SongPlayer.h" 00007 00008 DigitalOut myled1(LED1); 00009 DigitalOut myled2(LED2); 00010 DigitalOut myled3(LED3); 00011 DigitalOut myled4(LED4); 00012 00013 // State Machine control global variables 00014 bool X; //reset 00015 bool P; //play 00016 bool S; //stop 00017 bool R; //record 00018 bool E; //erase 00019 00020 enum sm_state {sRESET, sSTOP, sRECORD, sPLAY, sERASE}; 00021 int curr_state = 1; 00022 00023 Serial pc(USBTX,USBRX); 00024 Speaker mySpeaker(p26); 00025 float time_limit = 30; 00026 //Timer t; 00027 00028 //SongPlayer music; 00029 //Puppet puppet; 00030 vector<float> song; //stores all notes recorded by user 00031 vector<string> dance; 00032 00033 00034 void reset(){ 00035 /* reset state: 00036 Initial state upon powering up the device 00037 1. Cease all motion 00038 2. Reset all motors to initial position 00039 3. Mutes all audio 00040 4. Goes to erase state if reset button is held down for at least 3 seconds 00041 5. Goes to stop state according to rotary switch input 00042 6. LED goes from green to red 00043 NOTE: ONLY exits to stop or erase state 00044 */ 00045 //puppet.reset(); 00046 //music.reset(); 00047 //led = red; //use rgb red for this 00048 } 00049 void stop(){ 00050 /* stop state: 00051 Initiated by rotary switch 00052 1. Cease all motion 00053 2. Stop recording 00054 3. Mute all audio 00055 */ 00056 //puppet.stop(); 00057 //music.stop(); 00058 } 00059 void record(){ 00060 /* record state: 00061 Initiated by rotary switch 00062 1. Cease all motion 00063 2. Begin recording ToF inputs (distance and time) 00064 3. Convert distances to corresponding audio frequencies 00065 4. Append to list of frequencies 00066 5. 00067 */ 00068 float freq; 00069 char note; 00070 t.start(); 00071 while(t.read() < 30){ 00072 note = pc.getc(); 00073 switch (note){ 00074 case 'a': 00075 freq = 523.25; 00076 dance.push_back(move_map[0]); 00077 break; 00078 00079 case 's': 00080 freq = 554.37; 00081 dance.push_back(move_map[1]); 00082 break; 00083 00084 case 'd': 00085 freq = 587.33; 00086 dance.push_back(move_map[2]); 00087 break; 00088 00089 case 'f': 00090 freq = 622.25; 00091 dance.push_back(move_map[3]); 00092 break; 00093 00094 case 'g': 00095 freq = 659.26; 00096 dance.push_back(move_map[4]); 00097 break; 00098 00099 case 'h': 00100 freq = 698.46; 00101 dance.push_back(move_map[5]); 00102 break; 00103 00104 case 'j': 00105 freq = 739.99; 00106 dance.push_back(move_map[6]); 00107 break; 00108 00109 case 'k': 00110 freq = 783.99; 00111 dance.push_back(move_map[7]); 00112 break; 00113 00114 case 'l': 00115 freq = 830.61; 00116 dance.push_back(move_map[8]); 00117 break; 00118 00119 case 'q': 00120 freq = 880.00; 00121 dance.push_back(move_map[9]); 00122 break; 00123 00124 case 'w': 00125 freq = 932.33; 00126 dance.push_back(move_map[10]); 00127 break; 00128 00129 case 'e': 00130 freq = 987.77; 00131 dance.push_back(move_map[11]); 00132 break; 00133 } 00134 song.push_back(freq); 00135 mySpeaker.PlayNote(freq,0.2,0.5); 00136 00137 } 00138 t.stop(); 00139 //curr_state = 3; 00140 00141 } 00142 void play(){ 00143 /* play state: 00144 Initiated by rotary switch 00145 1. wait a few seconds 00146 2. begin reading list of frequencies while concurrently: 00147 - moving servo motors accordingly 00148 - playing corresponding sounds 00149 */ 00150 SongPlayer mySpeaker(p26, song); 00151 mySpeaker.PlaySong(DUR); 00152 } 00153 void erase(){ 00154 /* erase state: 00155 erases entire audio recording 00156 */ 00157 //song.erase(); 00158 } 00159 00160 void state_machine_mgr(){ 00161 00162 char key_input; 00163 X = 1; 00164 S = 0; 00165 R = 0; 00166 P = 0; 00167 E = 0; 00168 while(1) { 00169 if (pc.readable()) { // if they have pressed a key 00170 key_input = pc.getc(); 00171 if(key_input == '1') X=1; //toggle reset 00172 if(key_input == '2') S=1; //toggle stop 00173 if(key_input == '3') R=1; //toogle record 00174 if(key_input == '4') P=1; //toggle play 00175 if(key_input == '5') E=1; //toggle erase 00176 } 00177 //pc.printf("X: %d\n",X); 00178 // pc.printf("S: %d\n",S); 00179 // pc.printf("R: %d\n",R); 00180 // pc.printf("P: %d\n",P); 00181 // pc.printf("E: %d\n",E); 00182 // pc.printf("Current State %d\n",curr_state); 00183 switch(curr_state){ 00184 case 1: 00185 pc.printf("RESET\n"); 00186 P = 0; 00187 R = 0; 00188 if(E){ 00189 curr_state = 5; 00190 X = 0; 00191 }else if(S){ 00192 curr_state = 2; 00193 X = 0; 00194 } 00195 reset(); 00196 break; 00197 case 2: 00198 pc.printf("STOP\n"); 00199 E = 0; 00200 if(X){ 00201 curr_state = 1; 00202 S = 0; 00203 }else if(R){ 00204 curr_state = 3; 00205 S = 0; 00206 }else if(P){ 00207 curr_state = 4; 00208 S = 0; 00209 } 00210 stop(); 00211 break; 00212 case 3: 00213 pc.printf("RECORD\n"); 00214 E = 0; 00215 P = 0; 00216 if(X){ 00217 curr_state = 1; 00218 R = 0; 00219 }else if(S){ 00220 curr_state = 2; 00221 R = 0; 00222 } 00223 record(); 00224 break; 00225 case 4: 00226 pc.printf("PLAY\n"); 00227 E = 0; 00228 R = 0; 00229 if(X){ 00230 curr_state = 1; 00231 P = 0; 00232 }else if(S){ 00233 curr_state = 2; 00234 P = 0; 00235 } 00236 play(); 00237 break; 00238 case 5: 00239 pc.printf("ERASE\n"); 00240 S = 0; 00241 P = 0; 00242 R = 0; 00243 if(X){ 00244 curr_state = 1; 00245 E = 0; 00246 } 00247 erase(); 00248 break; 00249 } 00250 } 00251 } 00252 00253 int main() { 00254 //initialize map of freq to movements 00255 move_map.push_back("1111"); 00256 move_map.push_back("1011"); 00257 move_map.push_back("0111"); 00258 move_map.push_back("1122"); 00259 move_map.push_back("1022"); 00260 move_map.push_back("0122"); 00261 move_map.push_back("1133"); 00262 move_map.push_back("1033"); 00263 move_map.push_back("0133"); 00264 move_map.push_back("0031"); 00265 move_map.push_back("0013"); 00266 move_map.push_back("1101"); 00267 state_machine_mgr(); 00268 //puppet_move(); 00269 //record(); 00270 }
Generated on Thu Jul 21 2022 08:16:25 by 1.7.2