Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@0:36358c0a184c, 2016-08-12 (annotated)
- Committer:
- ziadeldebri
- Date:
- Fri Aug 12 21:39:58 2016 +0000
- Revision:
- 0:36358c0a184c
ECE111
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ziadeldebri | 0:36358c0a184c | 1 | #include "mbed_beat_factory.h" |
| ziadeldebri | 0:36358c0a184c | 2 | /************************************* Lab3 Mbed beat factory ***************************/ |
| ziadeldebri | 0:36358c0a184c | 3 | /* */ |
| ziadeldebri | 0:36358c0a184c | 4 | /* File: main.cpp */ |
| ziadeldebri | 0:36358c0a184c | 5 | /* Author: Ziad Eldebri */ |
| ziadeldebri | 0:36358c0a184c | 6 | /* Date Created: 8/6/2016 */ |
| ziadeldebri | 0:36358c0a184c | 7 | /* Description: Receives song data from a python GUI and subsequently plays it. It */ |
| ziadeldebri | 0:36358c0a184c | 8 | /* additionally provides the GUI with live song bar updates */ |
| ziadeldebri | 0:36358c0a184c | 9 | /* */ |
| ziadeldebri | 0:36358c0a184c | 10 | /****************************************************************************************/ |
| ziadeldebri | 0:36358c0a184c | 11 | /********************** |
| ziadeldebri | 0:36358c0a184c | 12 | * Setup Portion * |
| ziadeldebri | 0:36358c0a184c | 13 | **********************/ |
| ziadeldebri | 0:36358c0a184c | 14 | |
| ziadeldebri | 0:36358c0a184c | 15 | Serial pc(USBTX, USBRX); |
| ziadeldebri | 0:36358c0a184c | 16 | PwmOut Speaker(PTE31); |
| ziadeldebri | 0:36358c0a184c | 17 | commStruct comm; |
| ziadeldebri | 0:36358c0a184c | 18 | songStruct song; |
| ziadeldebri | 0:36358c0a184c | 19 | BusOut test(LED_RED,LED_GREEN); |
| ziadeldebri | 0:36358c0a184c | 20 | |
| ziadeldebri | 0:36358c0a184c | 21 | int freq[25] = {220,233,246,261,277,293,311,329,349,369,392,415,440,466,493,523,554,587,622,659,698,740,784,831,0} ; |
| ziadeldebri | 0:36358c0a184c | 22 | //int freq[25] = {220,233,261,277,293,220,233,261,277,293,220,233,261,277,293,220,233,261,277,293,220,233,261,277,293}; |
| ziadeldebri | 0:36358c0a184c | 23 | |
| ziadeldebri | 0:36358c0a184c | 24 | /************************************* serial_wait_packet ***************************/ |
| ziadeldebri | 0:36358c0a184c | 25 | /* */ |
| ziadeldebri | 0:36358c0a184c | 26 | /* File: main.cpp */ |
| ziadeldebri | 0:36358c0a184c | 27 | /* Author: Ziad Eldebri */ |
| ziadeldebri | 0:36358c0a184c | 28 | /* Date Created: 8/6/2016 */ |
| ziadeldebri | 0:36358c0a184c | 29 | /* Description: Receives song data from a python GUI and subsequently plays it. It */ |
| ziadeldebri | 0:36358c0a184c | 30 | /* additionally provides the GUI with live song bar updates */ |
| ziadeldebri | 0:36358c0a184c | 31 | /* */ |
| ziadeldebri | 0:36358c0a184c | 32 | /****************************************************************************************/ |
| ziadeldebri | 0:36358c0a184c | 33 | |
| ziadeldebri | 0:36358c0a184c | 34 | char serial_wait_packet() |
| ziadeldebri | 0:36358c0a184c | 35 | { |
| ziadeldebri | 0:36358c0a184c | 36 | while( !pc.readable()) {}; |
| ziadeldebri | 0:36358c0a184c | 37 | return pc.getc(); |
| ziadeldebri | 0:36358c0a184c | 38 | } |
| ziadeldebri | 0:36358c0a184c | 39 | |
| ziadeldebri | 0:36358c0a184c | 40 | |
| ziadeldebri | 0:36358c0a184c | 41 | /************************************* get_serial_data ***************************/ |
| ziadeldebri | 0:36358c0a184c | 42 | /* */ |
| ziadeldebri | 0:36358c0a184c | 43 | /* File: main.cpp */ |
| ziadeldebri | 0:36358c0a184c | 44 | /* Author: Ziad Eldebri */ |
| ziadeldebri | 0:36358c0a184c | 45 | /* Date Created: 8/6/2016 */ |
| ziadeldebri | 0:36358c0a184c | 46 | /* Description: Receives song data from a python GUI and subsequently plays it. It */ |
| ziadeldebri | 0:36358c0a184c | 47 | /* additionally provides the GUI with live song bar updates */ |
| ziadeldebri | 0:36358c0a184c | 48 | /* */ |
| ziadeldebri | 0:36358c0a184c | 49 | /****************************************************************************************/ |
| ziadeldebri | 0:36358c0a184c | 50 | |
| ziadeldebri | 0:36358c0a184c | 51 | |
| ziadeldebri | 0:36358c0a184c | 52 | int get_serial_data() |
| ziadeldebri | 0:36358c0a184c | 53 | { |
| ziadeldebri | 0:36358c0a184c | 54 | |
| ziadeldebri | 0:36358c0a184c | 55 | int byt_count= 0; |
| ziadeldebri | 0:36358c0a184c | 56 | int data_count = 0; |
| ziadeldebri | 0:36358c0a184c | 57 | |
| ziadeldebri | 0:36358c0a184c | 58 | /* Clear the the data array in the comm struct */ |
| ziadeldebri | 0:36358c0a184c | 59 | for( int i = 0; i < 3; i++ ) { |
| ziadeldebri | 0:36358c0a184c | 60 | for( int j = 0; j <3; j++ ) { |
| ziadeldebri | 0:36358c0a184c | 61 | comm.data[ i ][ j ] = 0; |
| ziadeldebri | 0:36358c0a184c | 62 | } |
| ziadeldebri | 0:36358c0a184c | 63 | } |
| ziadeldebri | 0:36358c0a184c | 64 | |
| ziadeldebri | 0:36358c0a184c | 65 | |
| ziadeldebri | 0:36358c0a184c | 66 | |
| ziadeldebri | 0:36358c0a184c | 67 | |
| ziadeldebri | 0:36358c0a184c | 68 | if(serial_wait_packet() == '$') { |
| ziadeldebri | 0:36358c0a184c | 69 | comm.packetType = pc.getc(); |
| ziadeldebri | 0:36358c0a184c | 70 | |
| ziadeldebri | 0:36358c0a184c | 71 | for(;;) { |
| ziadeldebri | 0:36358c0a184c | 72 | |
| ziadeldebri | 0:36358c0a184c | 73 | char data = pc.getc(); |
| ziadeldebri | 0:36358c0a184c | 74 | |
| ziadeldebri | 0:36358c0a184c | 75 | if(data == '$' ) { |
| ziadeldebri | 0:36358c0a184c | 76 | return 0; |
| ziadeldebri | 0:36358c0a184c | 77 | } else if(data == '\n') { |
| ziadeldebri | 0:36358c0a184c | 78 | comm.data[data_count][byt_count]= '\n'; |
| ziadeldebri | 0:36358c0a184c | 79 | return byt_count ; |
| ziadeldebri | 0:36358c0a184c | 80 | } else { |
| ziadeldebri | 0:36358c0a184c | 81 | comm.data[data_count][byt_count]= data; |
| ziadeldebri | 0:36358c0a184c | 82 | byt_count++; |
| ziadeldebri | 0:36358c0a184c | 83 | } |
| ziadeldebri | 0:36358c0a184c | 84 | |
| ziadeldebri | 0:36358c0a184c | 85 | } |
| ziadeldebri | 0:36358c0a184c | 86 | } |
| ziadeldebri | 0:36358c0a184c | 87 | |
| ziadeldebri | 0:36358c0a184c | 88 | return 0; |
| ziadeldebri | 0:36358c0a184c | 89 | } |
| ziadeldebri | 0:36358c0a184c | 90 | |
| ziadeldebri | 0:36358c0a184c | 91 | /************************************* extract_from_packet ***************************/ |
| ziadeldebri | 0:36358c0a184c | 92 | /* */ |
| ziadeldebri | 0:36358c0a184c | 93 | /* File: main.cpp */ |
| ziadeldebri | 0:36358c0a184c | 94 | /* Author: Ziad Eldebri */ |
| ziadeldebri | 0:36358c0a184c | 95 | /* Date Created: 8/6/2016 */ |
| ziadeldebri | 0:36358c0a184c | 96 | /* Description: Receives song data from a python GUI and subsequently plays it. It */ |
| ziadeldebri | 0:36358c0a184c | 97 | /* additionally provides the GUI with live song bar updates */ |
| ziadeldebri | 0:36358c0a184c | 98 | /* */ |
| ziadeldebri | 0:36358c0a184c | 99 | /****************************************************************************************/ |
| ziadeldebri | 0:36358c0a184c | 100 | |
| ziadeldebri | 0:36358c0a184c | 101 | void extract_from_packet() |
| ziadeldebri | 0:36358c0a184c | 102 | { |
| ziadeldebri | 0:36358c0a184c | 103 | /* Switch to specified packet */ |
| ziadeldebri | 0:36358c0a184c | 104 | switch( comm.packetType ) { |
| ziadeldebri | 0:36358c0a184c | 105 | |
| ziadeldebri | 0:36358c0a184c | 106 | /* New Song Packet */ |
| ziadeldebri | 0:36358c0a184c | 107 | case 'N': |
| ziadeldebri | 0:36358c0a184c | 108 | initializeSong(); |
| ziadeldebri | 0:36358c0a184c | 109 | break; |
| ziadeldebri | 0:36358c0a184c | 110 | |
| ziadeldebri | 0:36358c0a184c | 111 | /* Tempo Packet */ |
| ziadeldebri | 0:36358c0a184c | 112 | case 'T': |
| ziadeldebri | 0:36358c0a184c | 113 | song.tempo = atoi( comm.data[0] ); |
| ziadeldebri | 0:36358c0a184c | 114 | break; |
| ziadeldebri | 0:36358c0a184c | 115 | |
| ziadeldebri | 0:36358c0a184c | 116 | /* Song length packet */ |
| ziadeldebri | 0:36358c0a184c | 117 | case 'L': |
| ziadeldebri | 0:36358c0a184c | 118 | song.notes = atoi( comm.data[0] ); |
| ziadeldebri | 0:36358c0a184c | 119 | break; |
| ziadeldebri | 0:36358c0a184c | 120 | |
| ziadeldebri | 0:36358c0a184c | 121 | /* Song data packet */ |
| ziadeldebri | 0:36358c0a184c | 122 | case 'S': |
| ziadeldebri | 0:36358c0a184c | 123 | song.note[ song.currentNote ] = atoi(comm.data[ 0 ]); |
| ziadeldebri | 0:36358c0a184c | 124 | song.currentNote++; |
| ziadeldebri | 0:36358c0a184c | 125 | break; |
| ziadeldebri | 0:36358c0a184c | 126 | |
| ziadeldebri | 0:36358c0a184c | 127 | /* Play song packet */ |
| ziadeldebri | 0:36358c0a184c | 128 | case 'P': |
| ziadeldebri | 0:36358c0a184c | 129 | playSong(); |
| ziadeldebri | 0:36358c0a184c | 130 | break; |
| ziadeldebri | 0:36358c0a184c | 131 | |
| ziadeldebri | 0:36358c0a184c | 132 | } |
| ziadeldebri | 0:36358c0a184c | 133 | |
| ziadeldebri | 0:36358c0a184c | 134 | } |
| ziadeldebri | 0:36358c0a184c | 135 | |
| ziadeldebri | 0:36358c0a184c | 136 | void initializeSong( void ) |
| ziadeldebri | 0:36358c0a184c | 137 | { |
| ziadeldebri | 0:36358c0a184c | 138 | for( int i = 0; i < 128; i++ ) { |
| ziadeldebri | 0:36358c0a184c | 139 | song.note[i] = 0; |
| ziadeldebri | 0:36358c0a184c | 140 | } |
| ziadeldebri | 0:36358c0a184c | 141 | song.tempo = 120; |
| ziadeldebri | 0:36358c0a184c | 142 | song.notes = 0; |
| ziadeldebri | 0:36358c0a184c | 143 | song.currentNote = 0; |
| ziadeldebri | 0:36358c0a184c | 144 | } |
| ziadeldebri | 0:36358c0a184c | 145 | |
| ziadeldebri | 0:36358c0a184c | 146 | |
| ziadeldebri | 0:36358c0a184c | 147 | void playSong( void ) |
| ziadeldebri | 0:36358c0a184c | 148 | { |
| ziadeldebri | 0:36358c0a184c | 149 | |
| ziadeldebri | 0:36358c0a184c | 150 | |
| ziadeldebri | 0:36358c0a184c | 151 | for( int i = 0; i < song.notes; i++ ) { |
| ziadeldebri | 0:36358c0a184c | 152 | /* Send the current bar we're on to the gui */ |
| ziadeldebri | 0:36358c0a184c | 153 | pc.printf("%d\n",i); |
| ziadeldebri | 0:36358c0a184c | 154 | |
| ziadeldebri | 0:36358c0a184c | 155 | /* Set the frequency of the PWM for the specified note */ |
| ziadeldebri | 0:36358c0a184c | 156 | if(song.note[i] == 24) { |
| ziadeldebri | 0:36358c0a184c | 157 | Speaker.period(0); |
| ziadeldebri | 0:36358c0a184c | 158 | Speaker = 0; |
| ziadeldebri | 0:36358c0a184c | 159 | } else { |
| ziadeldebri | 0:36358c0a184c | 160 | Speaker.period( ((float)1/freq[song.note[i]]) ); |
| ziadeldebri | 0:36358c0a184c | 161 | |
| ziadeldebri | 0:36358c0a184c | 162 | Speaker = 0.5; |
| ziadeldebri | 0:36358c0a184c | 163 | |
| ziadeldebri | 0:36358c0a184c | 164 | /* Wait a specific amount of time based on the tempo */ |
| ziadeldebri | 0:36358c0a184c | 165 | wait_ms(((float)((float)60/(float)song.tempo)*(float)1000.0)); |
| ziadeldebri | 0:36358c0a184c | 166 | test = ~ test; |
| ziadeldebri | 0:36358c0a184c | 167 | } |
| ziadeldebri | 0:36358c0a184c | 168 | } |
| ziadeldebri | 0:36358c0a184c | 169 | |
| ziadeldebri | 0:36358c0a184c | 170 | Speaker.period(0); |
| ziadeldebri | 0:36358c0a184c | 171 | Speaker = 0; |
| ziadeldebri | 0:36358c0a184c | 172 | /* Turn off speaker */ |
| ziadeldebri | 0:36358c0a184c | 173 | |
| ziadeldebri | 0:36358c0a184c | 174 | /* Print an end of packet byte 0xFF */ |
| ziadeldebri | 0:36358c0a184c | 175 | pc.printf("255\n"); |
| ziadeldebri | 0:36358c0a184c | 176 | |
| ziadeldebri | 0:36358c0a184c | 177 | } |
| ziadeldebri | 0:36358c0a184c | 178 | |
| ziadeldebri | 0:36358c0a184c | 179 | |
| ziadeldebri | 0:36358c0a184c | 180 | |
| ziadeldebri | 0:36358c0a184c | 181 | |
| ziadeldebri | 0:36358c0a184c | 182 | |
| ziadeldebri | 0:36358c0a184c | 183 | |
| ziadeldebri | 0:36358c0a184c | 184 | |
| ziadeldebri | 0:36358c0a184c | 185 | |
| ziadeldebri | 0:36358c0a184c | 186 | |
| ziadeldebri | 0:36358c0a184c | 187 | |
| ziadeldebri | 0:36358c0a184c | 188 | |
| ziadeldebri | 0:36358c0a184c | 189 | |
| ziadeldebri | 0:36358c0a184c | 190 | |
| ziadeldebri | 0:36358c0a184c | 191 | |
| ziadeldebri | 0:36358c0a184c | 192 | int main() |
| ziadeldebri | 0:36358c0a184c | 193 | { |
| ziadeldebri | 0:36358c0a184c | 194 | test =3; |
| ziadeldebri | 0:36358c0a184c | 195 | while (true) { |
| ziadeldebri | 0:36358c0a184c | 196 | |
| ziadeldebri | 0:36358c0a184c | 197 | if( get_serial_data()> 0) { |
| ziadeldebri | 0:36358c0a184c | 198 | |
| ziadeldebri | 0:36358c0a184c | 199 | extract_from_packet(); |
| ziadeldebri | 0:36358c0a184c | 200 | test = 0; |
| ziadeldebri | 0:36358c0a184c | 201 | } |
| ziadeldebri | 0:36358c0a184c | 202 | |
| ziadeldebri | 0:36358c0a184c | 203 | |
| ziadeldebri | 0:36358c0a184c | 204 | } |
| ziadeldebri | 0:36358c0a184c | 205 | |
| ziadeldebri | 0:36358c0a184c | 206 | } |