Chad Miller
/
Lab4
Lab4
main.cpp@1:a10f4330a948, 2015-10-19 (annotated)
- Committer:
- cmiller86
- Date:
- Mon Oct 19 14:42:18 2015 +0000
- Revision:
- 1:a10f4330a948
- Parent:
- 0:0420a5989bff
Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cmiller86 | 0:0420a5989bff | 1 | /* |
cmiller86 | 0:0420a5989bff | 2 | * Documentation: |
cmiller86 | 0:0420a5989bff | 3 | * http://www.zagrosrobotics.com/files/easyvr-user-manual-30.pdf |
cmiller86 | 0:0420a5989bff | 4 | */ |
cmiller86 | 0:0420a5989bff | 5 | |
cmiller86 | 0:0420a5989bff | 6 | #include "easyvr.h" |
cmiller86 | 0:0420a5989bff | 7 | |
cmiller86 | 0:0420a5989bff | 8 | #define BUF_SIZE 32 |
cmiller86 | 0:0420a5989bff | 9 | #define NUM_NOTES 8 |
cmiller86 | 0:0420a5989bff | 10 | |
cmiller86 | 0:0420a5989bff | 11 | EasyVR easyVR( p28, p27 ); |
cmiller86 | 0:0420a5989bff | 12 | Serial term( USBTX, USBRX ); |
cmiller86 | 0:0420a5989bff | 13 | PwmOut speaker( p21 ); |
cmiller86 | 0:0420a5989bff | 14 | InterruptIn hold_button( p8 ); |
cmiller86 | 0:0420a5989bff | 15 | |
cmiller86 | 0:0420a5989bff | 16 | // C major scale starting at C4 |
cmiller86 | 0:0420a5989bff | 17 | char *note_table[] = { "C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5" }; |
cmiller86 | 0:0420a5989bff | 18 | float freq_table[] = { 261.63, 293.66, 329.63, 349.23, 392.0, 440.0, 493.88, 523.25 }; |
cmiller86 | 0:0420a5989bff | 19 | |
cmiller86 | 0:0420a5989bff | 20 | char note_buffer[BUF_SIZE]; |
cmiller86 | 0:0420a5989bff | 21 | short note_buffer_pos = 0; |
cmiller86 | 0:0420a5989bff | 22 | bool do_read = false; |
cmiller86 | 0:0420a5989bff | 23 | |
cmiller86 | 0:0420a5989bff | 24 | void print_error( int error ) |
cmiller86 | 0:0420a5989bff | 25 | { |
cmiller86 | 0:0420a5989bff | 26 | switch( error ) |
cmiller86 | 0:0420a5989bff | 27 | { |
cmiller86 | 0:0420a5989bff | 28 | case ERR_DATACOL_TOO_NOISY: |
cmiller86 | 0:0420a5989bff | 29 | term.printf( "Too noisy, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 30 | break; |
cmiller86 | 0:0420a5989bff | 31 | case ERR_DATACOL_TOO_SOFT: |
cmiller86 | 0:0420a5989bff | 32 | term.printf( "Spoke too softly, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 33 | break; |
cmiller86 | 0:0420a5989bff | 34 | case ERR_DATACOL_TOO_LOUD: |
cmiller86 | 0:0420a5989bff | 35 | term.printf( "Spoke too loudly, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 36 | break; |
cmiller86 | 0:0420a5989bff | 37 | case ERR_DATACOL_TOO_SOON: |
cmiller86 | 0:0420a5989bff | 38 | term.printf( "Spoke too soon, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 39 | break; |
cmiller86 | 0:0420a5989bff | 40 | case ERR_DATACOL_TOO_CHOPPY: |
cmiller86 | 0:0420a5989bff | 41 | term.printf( "Too complex, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 42 | break; |
cmiller86 | 0:0420a5989bff | 43 | case ERR_RECOG_FAIL: |
cmiller86 | 0:0420a5989bff | 44 | term.printf( "Recognition failed, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 45 | break; |
cmiller86 | 0:0420a5989bff | 46 | case ERR_RECOG_LOW_CONF: |
cmiller86 | 0:0420a5989bff | 47 | term.printf( "Recognition result status: doubtful, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 48 | break; |
cmiller86 | 0:0420a5989bff | 49 | case ERR_RECOG_MID_CONF: |
cmiller86 | 0:0420a5989bff | 50 | term.printf( "Recognition result status: maybe, try again\r\n" ); |
cmiller86 | 0:0420a5989bff | 51 | break; |
cmiller86 | 0:0420a5989bff | 52 | case ERR_RECOG_BAD_TEMPLATE: |
cmiller86 | 0:0420a5989bff | 53 | term.printf( "Invalid command stored in memory\r\n" ); |
cmiller86 | 0:0420a5989bff | 54 | break; |
cmiller86 | 0:0420a5989bff | 55 | case ERR_RECOG_DURATION: |
cmiller86 | 0:0420a5989bff | 56 | term.printf( "Bad duration patterns\r\n" ); |
cmiller86 | 0:0420a5989bff | 57 | break; |
cmiller86 | 0:0420a5989bff | 58 | case ERR_SYNTH_BAD_VERSION: |
cmiller86 | 0:0420a5989bff | 59 | term.printf( "Bad release number in speech file\r\n" ); |
cmiller86 | 0:0420a5989bff | 60 | break; |
cmiller86 | 0:0420a5989bff | 61 | case ERR_SYNTH_BAD_MSG: |
cmiller86 | 0:0420a5989bff | 62 | term.printf( "Bad data in speech file\r\n" ); |
cmiller86 | 0:0420a5989bff | 63 | break; |
cmiller86 | 0:0420a5989bff | 64 | case ERR_NOT_A_WORD: |
cmiller86 | 0:0420a5989bff | 65 | term.printf( "Spoken word is not in vocabulary\r\n" ); |
cmiller86 | 0:0420a5989bff | 66 | break; |
cmiller86 | 0:0420a5989bff | 67 | default: |
cmiller86 | 0:0420a5989bff | 68 | break; |
cmiller86 | 0:0420a5989bff | 69 | } |
cmiller86 | 0:0420a5989bff | 70 | } |
cmiller86 | 0:0420a5989bff | 71 | |
cmiller86 | 0:0420a5989bff | 72 | void add_command( int index ) |
cmiller86 | 0:0420a5989bff | 73 | { |
cmiller86 | 0:0420a5989bff | 74 | char command_num = i2a( index ); |
cmiller86 | 0:0420a5989bff | 75 | char note = note_table[index][0]; |
cmiller86 | 0:0420a5989bff | 76 | char scale = (char)( note_table[index][1] + 17 ); |
cmiller86 | 0:0420a5989bff | 77 | |
cmiller86 | 0:0420a5989bff | 78 | char err; |
cmiller86 | 0:0420a5989bff | 79 | |
cmiller86 | 0:0420a5989bff | 80 | easyVR.send( CMD_GROUP_SD ); |
cmiller86 | 0:0420a5989bff | 81 | easyVR.send( i2a( 1 ) ); |
cmiller86 | 0:0420a5989bff | 82 | easyVR.send( command_num ); |
cmiller86 | 0:0420a5989bff | 83 | |
cmiller86 | 0:0420a5989bff | 84 | if( ( err = easyVR.receive() ) != STS_SUCCESS ) |
cmiller86 | 0:0420a5989bff | 85 | term.printf( "(in add_command( %s ) line %d) Error %c\r\n", note_table[index], __LINE__, err ); |
cmiller86 | 0:0420a5989bff | 86 | |
cmiller86 | 0:0420a5989bff | 87 | easyVR.send( CMD_NAME_SD ); |
cmiller86 | 0:0420a5989bff | 88 | easyVR.send( i2a( 1 ) ); |
cmiller86 | 0:0420a5989bff | 89 | easyVR.send( command_num ); |
cmiller86 | 0:0420a5989bff | 90 | easyVR.send( i2a( 3 ) ); |
cmiller86 | 0:0420a5989bff | 91 | easyVR.send( note ); |
cmiller86 | 0:0420a5989bff | 92 | easyVR.send( '^' ); |
cmiller86 | 0:0420a5989bff | 93 | easyVR.send( scale ); |
cmiller86 | 0:0420a5989bff | 94 | |
cmiller86 | 0:0420a5989bff | 95 | if( ( err = easyVR.receive() ) != STS_SUCCESS ) |
cmiller86 | 0:0420a5989bff | 96 | term.printf( "(in add_command( %s ) line %d) Error %c\r\n", note_table[index], __LINE__, err ); |
cmiller86 | 0:0420a5989bff | 97 | } |
cmiller86 | 0:0420a5989bff | 98 | |
cmiller86 | 0:0420a5989bff | 99 | char train_command( int index ) |
cmiller86 | 0:0420a5989bff | 100 | { |
cmiller86 | 0:0420a5989bff | 101 | char command_num = i2a( index ); |
cmiller86 | 0:0420a5989bff | 102 | char note = note_table[index][0]; |
cmiller86 | 0:0420a5989bff | 103 | char scale = (char)( note_table[index][1] + 17 ); |
cmiller86 | 0:0420a5989bff | 104 | |
cmiller86 | 0:0420a5989bff | 105 | term.printf( "Please say: %s\r\n", note_table[index] ); |
cmiller86 | 0:0420a5989bff | 106 | |
cmiller86 | 0:0420a5989bff | 107 | easyVR.send( CMD_TRAIN_SD ); |
cmiller86 | 0:0420a5989bff | 108 | easyVR.send( i2a( 1 ) ); |
cmiller86 | 0:0420a5989bff | 109 | easyVR.send( command_num ); |
cmiller86 | 0:0420a5989bff | 110 | |
cmiller86 | 0:0420a5989bff | 111 | char recv, err, retval; |
cmiller86 | 0:0420a5989bff | 112 | |
cmiller86 | 0:0420a5989bff | 113 | switch( ( recv = easyVR.receive() ) ) |
cmiller86 | 0:0420a5989bff | 114 | { |
cmiller86 | 0:0420a5989bff | 115 | case STS_SUCCESS: |
cmiller86 | 0:0420a5989bff | 116 | term.printf( "Successfully trained command %c^%c\r\n", note, scale ); |
cmiller86 | 0:0420a5989bff | 117 | retval = recv; |
cmiller86 | 0:0420a5989bff | 118 | break; |
cmiller86 | 0:0420a5989bff | 119 | case STS_RESULT: |
cmiller86 | 0:0420a5989bff | 120 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 121 | err = a2i( easyVR.receive() ); |
cmiller86 | 0:0420a5989bff | 122 | term.printf( "Successfully trained command %c^%c, but similar to SD command %d\r\n", note, scale, err ); |
cmiller86 | 0:0420a5989bff | 123 | retval = STS_SUCCESS; |
cmiller86 | 0:0420a5989bff | 124 | break; |
cmiller86 | 0:0420a5989bff | 125 | case STS_SIMILAR: |
cmiller86 | 0:0420a5989bff | 126 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 127 | err = a2i( easyVR.receive() ); |
cmiller86 | 0:0420a5989bff | 128 | term.printf( "Successfully trained command %c^%c, but similar to SI command %d\r\n", note, scale, err ); |
cmiller86 | 0:0420a5989bff | 129 | retval = STS_SUCCESS; |
cmiller86 | 0:0420a5989bff | 130 | break; |
cmiller86 | 0:0420a5989bff | 131 | case STS_TIMEOUT: |
cmiller86 | 0:0420a5989bff | 132 | term.printf( "Timed out trying to train %c^%c!\r\n", note, scale ); |
cmiller86 | 0:0420a5989bff | 133 | retval = recv; |
cmiller86 | 0:0420a5989bff | 134 | break; |
cmiller86 | 0:0420a5989bff | 135 | case STS_ERROR: |
cmiller86 | 0:0420a5989bff | 136 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 137 | err = a2i( easyVR.receive() ) * 16; |
cmiller86 | 0:0420a5989bff | 138 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 139 | err += a2i( easyVR.receive() ); |
cmiller86 | 0:0420a5989bff | 140 | print_error( err ); |
cmiller86 | 0:0420a5989bff | 141 | retval = err; |
cmiller86 | 0:0420a5989bff | 142 | break; |
cmiller86 | 0:0420a5989bff | 143 | default: |
cmiller86 | 0:0420a5989bff | 144 | term.printf( "(in train_command( %s ) line %d) Error %c\r\n", note_table[index], __LINE__, recv ); |
cmiller86 | 0:0420a5989bff | 145 | retval = recv; |
cmiller86 | 0:0420a5989bff | 146 | break; |
cmiller86 | 0:0420a5989bff | 147 | } |
cmiller86 | 0:0420a5989bff | 148 | |
cmiller86 | 0:0420a5989bff | 149 | return retval; |
cmiller86 | 0:0420a5989bff | 150 | } |
cmiller86 | 0:0420a5989bff | 151 | |
cmiller86 | 0:0420a5989bff | 152 | void enable_read() |
cmiller86 | 0:0420a5989bff | 153 | { |
cmiller86 | 0:0420a5989bff | 154 | do_read = true; |
cmiller86 | 0:0420a5989bff | 155 | } |
cmiller86 | 0:0420a5989bff | 156 | |
cmiller86 | 0:0420a5989bff | 157 | void play_buffer() |
cmiller86 | 0:0420a5989bff | 158 | { |
cmiller86 | 0:0420a5989bff | 159 | do_read = false; |
cmiller86 | 0:0420a5989bff | 160 | easyVR.send( CMD_BREAK ); |
cmiller86 | 0:0420a5989bff | 161 | |
cmiller86 | 0:0420a5989bff | 162 | for( int i = 0; i < note_buffer_pos; i++ ) |
cmiller86 | 0:0420a5989bff | 163 | { |
cmiller86 | 0:0420a5989bff | 164 | speaker.period( 1.0 / freq_table[note_buffer[i]] ); |
cmiller86 | 0:0420a5989bff | 165 | speaker = 0.25; |
cmiller86 | 0:0420a5989bff | 166 | wait( 0.5 ); |
cmiller86 | 0:0420a5989bff | 167 | } |
cmiller86 | 0:0420a5989bff | 168 | |
cmiller86 | 0:0420a5989bff | 169 | speaker = 0; |
cmiller86 | 0:0420a5989bff | 170 | note_buffer_pos = 0; |
cmiller86 | 0:0420a5989bff | 171 | } |
cmiller86 | 0:0420a5989bff | 172 | |
cmiller86 | 0:0420a5989bff | 173 | int main( void ) |
cmiller86 | 0:0420a5989bff | 174 | { |
cmiller86 | 0:0420a5989bff | 175 | term.baud( 19200 ); |
cmiller86 | 0:0420a5989bff | 176 | |
cmiller86 | 0:0420a5989bff | 177 | easyVR.wakeup(); |
cmiller86 | 0:0420a5989bff | 178 | easyVR.setup( 0, 3 ); |
cmiller86 | 0:0420a5989bff | 179 | |
cmiller86 | 0:0420a5989bff | 180 | char err; |
cmiller86 | 0:0420a5989bff | 181 | |
cmiller86 | 0:0420a5989bff | 182 | easyVR.baud( 9600 ); |
cmiller86 | 0:0420a5989bff | 183 | easyVR.send( CMD_BAUDRATE ); |
cmiller86 | 0:0420a5989bff | 184 | easyVR.send( i2a( 12 ) ); |
cmiller86 | 0:0420a5989bff | 185 | |
cmiller86 | 0:0420a5989bff | 186 | if( ( err = easyVR.receive() ) != STS_SUCCESS ) |
cmiller86 | 0:0420a5989bff | 187 | term.printf( "(in main() line %d) Error: %c\r\n", __LINE__, err ); |
cmiller86 | 0:0420a5989bff | 188 | |
cmiller86 | 0:0420a5989bff | 189 | easyVR.send( CMD_LEVEL ); |
cmiller86 | 0:0420a5989bff | 190 | easyVR.send( i2a( 1 ) ); |
cmiller86 | 0:0420a5989bff | 191 | |
cmiller86 | 0:0420a5989bff | 192 | if( ( err = easyVR.receive() ) != STS_SUCCESS ) |
cmiller86 | 0:0420a5989bff | 193 | term.printf( "(in main() line %d) Error: %c\r\n", __LINE__, err ); |
cmiller86 | 0:0420a5989bff | 194 | |
cmiller86 | 0:0420a5989bff | 195 | /* |
cmiller86 | 0:0420a5989bff | 196 | int result; |
cmiller86 | 0:0420a5989bff | 197 | |
cmiller86 | 0:0420a5989bff | 198 | for( int i = 0; i < NUM_NOTES; i++ ) |
cmiller86 | 0:0420a5989bff | 199 | { |
cmiller86 | 0:0420a5989bff | 200 | add_command( i ); |
cmiller86 | 0:0420a5989bff | 201 | |
cmiller86 | 0:0420a5989bff | 202 | do |
cmiller86 | 0:0420a5989bff | 203 | { |
cmiller86 | 0:0420a5989bff | 204 | result = train_command( i ); |
cmiller86 | 0:0420a5989bff | 205 | wait( 0.5 ); |
cmiller86 | 0:0420a5989bff | 206 | } while( result != STS_SUCCESS ); |
cmiller86 | 0:0420a5989bff | 207 | } |
cmiller86 | 0:0420a5989bff | 208 | */ |
cmiller86 | 0:0420a5989bff | 209 | |
cmiller86 | 0:0420a5989bff | 210 | hold_button.rise( enable_read ); |
cmiller86 | 0:0420a5989bff | 211 | hold_button.fall( play_buffer ); |
cmiller86 | 0:0420a5989bff | 212 | |
cmiller86 | 0:0420a5989bff | 213 | char note, recv; |
cmiller86 | 0:0420a5989bff | 214 | |
cmiller86 | 0:0420a5989bff | 215 | while( 1 ) |
cmiller86 | 0:0420a5989bff | 216 | { |
cmiller86 | 0:0420a5989bff | 217 | while( do_read ) |
cmiller86 | 0:0420a5989bff | 218 | { |
cmiller86 | 0:0420a5989bff | 219 | term.printf( "Ready!\r\n" ); |
cmiller86 | 0:0420a5989bff | 220 | |
cmiller86 | 0:0420a5989bff | 221 | easyVR.send( CMD_RECOG_SI ); |
cmiller86 | 0:0420a5989bff | 222 | easyVR.send( i2a( 3 ) ); |
cmiller86 | 0:0420a5989bff | 223 | |
cmiller86 | 0:0420a5989bff | 224 | switch( ( recv = easyVR.receive() ) ) |
cmiller86 | 0:0420a5989bff | 225 | { |
cmiller86 | 0:0420a5989bff | 226 | case STS_SIMILAR: |
cmiller86 | 0:0420a5989bff | 227 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 228 | note = a2i( easyVR.receive() ); |
cmiller86 | 0:0420a5989bff | 229 | |
cmiller86 | 0:0420a5989bff | 230 | if( note < NUM_NOTES ) |
cmiller86 | 0:0420a5989bff | 231 | { |
cmiller86 | 0:0420a5989bff | 232 | term.printf( "Heard: %s\r\n", note_table[note] ); |
cmiller86 | 0:0420a5989bff | 233 | |
cmiller86 | 0:0420a5989bff | 234 | if( note_buffer_pos < BUF_SIZE ) |
cmiller86 | 0:0420a5989bff | 235 | { |
cmiller86 | 0:0420a5989bff | 236 | note_buffer[note_buffer_pos] = note; |
cmiller86 | 0:0420a5989bff | 237 | note_buffer_pos++; |
cmiller86 | 0:0420a5989bff | 238 | } |
cmiller86 | 0:0420a5989bff | 239 | else |
cmiller86 | 0:0420a5989bff | 240 | term.printf( "Buffer full\r\n" ); |
cmiller86 | 0:0420a5989bff | 241 | } |
cmiller86 | 0:0420a5989bff | 242 | else |
cmiller86 | 0:0420a5989bff | 243 | term.printf( "Heard SI command %d\r\n", note ); |
cmiller86 | 0:0420a5989bff | 244 | |
cmiller86 | 0:0420a5989bff | 245 | break; |
cmiller86 | 0:0420a5989bff | 246 | /* |
cmiller86 | 0:0420a5989bff | 247 | case STS_SIMILAR: |
cmiller86 | 0:0420a5989bff | 248 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 249 | err = a2i( easyVR.receive() ); |
cmiller86 | 0:0420a5989bff | 250 | term.printf( "Heard similar to SI command %d\r\n", err ); |
cmiller86 | 0:0420a5989bff | 251 | break; |
cmiller86 | 0:0420a5989bff | 252 | */ |
cmiller86 | 0:0420a5989bff | 253 | case STS_TIMEOUT: |
cmiller86 | 0:0420a5989bff | 254 | term.printf( "Timed out\r\n" ); |
cmiller86 | 0:0420a5989bff | 255 | break; |
cmiller86 | 0:0420a5989bff | 256 | case STS_ERROR: |
cmiller86 | 0:0420a5989bff | 257 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 258 | err = a2i( easyVR.receive() ) * 16; |
cmiller86 | 0:0420a5989bff | 259 | easyVR.send( ARG_ACK ); |
cmiller86 | 0:0420a5989bff | 260 | err += a2i( easyVR.receive() ); |
cmiller86 | 0:0420a5989bff | 261 | print_error( err ); |
cmiller86 | 0:0420a5989bff | 262 | break; |
cmiller86 | 0:0420a5989bff | 263 | default: |
cmiller86 | 0:0420a5989bff | 264 | if( recv != STS_INTERR ) |
cmiller86 | 0:0420a5989bff | 265 | term.printf( "(in main() line %d) Error %c\r\n", __LINE__, recv ); |
cmiller86 | 0:0420a5989bff | 266 | |
cmiller86 | 0:0420a5989bff | 267 | break; |
cmiller86 | 0:0420a5989bff | 268 | } |
cmiller86 | 0:0420a5989bff | 269 | } |
cmiller86 | 0:0420a5989bff | 270 | } |
cmiller86 | 0:0420a5989bff | 271 | } |