ECE3872 HW/SW Project Code

Dependencies:   mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }