Lab4

Dependencies:   EasyVR mbed

Committer:
cmiller86
Date:
Mon Oct 19 14:42:18 2015 +0000
Revision:
1:a10f4330a948
Parent:
0:0420a5989bff
Commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }