Simon Sez prototype

Dependencies:   4DGL-uLCD-SE MMA8452 SDFileSystem mbed wave_player

Committer:
kennyainny
Date:
Fri Jul 14 23:29:31 2017 +0000
Revision:
1:86a07445351b
Parent:
0:10177c8cba93
prototype

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kennyainny 0:10177c8cba93 1 /**********************************
kennyainny 0:10177c8cba93 2 * Author:
kennyainny 0:10177c8cba93 3 * Institution: Georgia Tech
kennyainny 0:10177c8cba93 4 *
kennyainny 0:10177c8cba93 5 * Title: MAIN
kennyainny 0:10177c8cba93 6 * Class: ECE2035
kennyainny 0:10177c8cba93 7 * Assignment: Project 2 Summer 2017
kennyainny 0:10177c8cba93 8 **********************************/
kennyainny 0:10177c8cba93 9
kennyainny 0:10177c8cba93 10 //includes
kennyainny 0:10177c8cba93 11 #include <string.h>
kennyainny 0:10177c8cba93 12 #include <stdio.h>
kennyainny 0:10177c8cba93 13 #include <math.h>
kennyainny 0:10177c8cba93 14 #include <cstdarg>
kennyainny 0:10177c8cba93 15 #include "mbed.h"
kennyainny 0:10177c8cba93 16 #include "SDFileSystem.h"
kennyainny 0:10177c8cba93 17 #include "wave_player.h"
kennyainny 0:10177c8cba93 18 #include "MMA8452.h"
kennyainny 0:10177c8cba93 19
kennyainny 0:10177c8cba93 20 #include "uLCD_4DGL.h"
kennyainny 0:10177c8cba93 21
kennyainny 0:10177c8cba93 22 //defines
kennyainny 0:10177c8cba93 23 #define YELLOW 0xFFFF00
kennyainny 0:10177c8cba93 24 #define BUFFSIZE 100
kennyainny 0:10177c8cba93 25 #define PI 3.141592653589793238462643f
kennyainny 0:10177c8cba93 26 #define TEST_WAVFILE "/sd/wavfiles/BUZZER.wav"
kennyainny 0:10177c8cba93 27 #define SEQ_LEN 20
kennyainny 0:10177c8cba93 28
kennyainny 0:10177c8cba93 29 //function prototypes
kennyainny 0:10177c8cba93 30 int invert(int value);
kennyainny 0:10177c8cba93 31 void print(const char *format, ...);
kennyainny 0:10177c8cba93 32 void lowerCase(char *src);
kennyainny 0:10177c8cba93 33 void playSound(void);
kennyainny 0:10177c8cba93 34 void pb1_hit_callback(void);
kennyainny 0:10177c8cba93 35 void pb2_hit_callback(void);
kennyainny 0:10177c8cba93 36 void pb3_hit_callback(void);
kennyainny 0:10177c8cba93 37 void pb4_hit_callback(void);
kennyainny 0:10177c8cba93 38 void createSequence(int *Sequence, int length);
kennyainny 0:10177c8cba93 39 void drawFore(int position, int color);
kennyainny 0:10177c8cba93 40 void drawBack(int position, int color);
kennyainny 0:10177c8cba93 41 void drawNum (int i);
kennyainny 0:10177c8cba93 42
kennyainny 0:10177c8cba93 43 //initialize hardware
kennyainny 0:10177c8cba93 44 SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
kennyainny 0:10177c8cba93 45 uLCD_4DGL uLCD(p9, p10, p11); // uLCD-144-G2 screen, (serial tx, serial rx, reset pin)
kennyainny 0:10177c8cba93 46 AnalogOut DACout(p18);
kennyainny 0:10177c8cba93 47 wave_player waver(&DACout);
kennyainny 0:10177c8cba93 48
kennyainny 0:10177c8cba93 49 DigitalIn pb1(p21);
kennyainny 0:10177c8cba93 50 DigitalIn pb2(p22);
kennyainny 0:10177c8cba93 51 DigitalIn pb3(p23);
kennyainny 0:10177c8cba93 52 DigitalIn pb4(p24);
kennyainny 0:10177c8cba93 53
kennyainny 0:10177c8cba93 54 AnalogIn randSeed(p20);
kennyainny 0:10177c8cba93 55
kennyainny 0:10177c8cba93 56 Serial pc(USBTX,USBRX); // used by Accelerometer
kennyainny 0:10177c8cba93 57 MMA8452 accel(p28, p27, 100000); // Accelerometer
kennyainny 0:10177c8cba93 58
kennyainny 0:10177c8cba93 59 // array for Simon sequence
kennyainny 0:10177c8cba93 60 int Sequence[SEQ_LEN];
kennyainny 0:10177c8cba93 61
kennyainny 0:10177c8cba93 62 //main
kennyainny 0:10177c8cba93 63 int main()
kennyainny 0:10177c8cba93 64 {
kennyainny 0:10177c8cba93 65 // Use internal pullups for pushbuttons
kennyainny 0:10177c8cba93 66 pb1.mode(PullUp);
kennyainny 0:10177c8cba93 67 pb2.mode(PullUp);
kennyainny 0:10177c8cba93 68 pb3.mode(PullUp);
kennyainny 0:10177c8cba93 69 pb4.mode(PullUp);
kennyainny 0:10177c8cba93 70
kennyainny 0:10177c8cba93 71 //check for wav file
kennyainny 0:10177c8cba93 72 uLCD.cls();
kennyainny 0:10177c8cba93 73 uLCD.printf("Locating WAV files...");
kennyainny 0:10177c8cba93 74 FILE *test_file;
kennyainny 0:10177c8cba93 75 //while(1) {
kennyainny 0:10177c8cba93 76 test_file=fopen(TEST_WAVFILE,"r");
kennyainny 0:10177c8cba93 77 if(test_file != NULL)
kennyainny 0:10177c8cba93 78 uLCD.printf("Wav file sucessfully loaded");
kennyainny 0:10177c8cba93 79 else
kennyainny 0:10177c8cba93 80 uLCD.printf("Wav file not found");
kennyainny 0:10177c8cba93 81 wait(1);
kennyainny 0:10177c8cba93 82 //}
kennyainny 0:10177c8cba93 83 //fclose(test_file);
kennyainny 0:10177c8cba93 84
kennyainny 0:10177c8cba93 85 uLCD.cls();
kennyainny 0:10177c8cba93 86
kennyainny 0:10177c8cba93 87 // set background colors / clear screen
kennyainny 0:10177c8cba93 88 uLCD.background_color(WHITE);
kennyainny 0:10177c8cba93 89 uLCD.cls();
kennyainny 0:10177c8cba93 90 uLCD.background_color(WHITE);
kennyainny 0:10177c8cba93 91 uLCD.textbackground_color(WHITE);
kennyainny 0:10177c8cba93 92
kennyainny 0:10177c8cba93 93 //loop
kennyainny 0:10177c8cba93 94 int val1, val2, val3, val4;
kennyainny 0:10177c8cba93 95 double x,y,z;
kennyainny 0:10177c8cba93 96
kennyainny 0:10177c8cba93 97 while(1) {
kennyainny 0:10177c8cba93 98 //have fun...
kennyainny 0:10177c8cba93 99 // pushbuttons pull low when pressed, so invert them
kennyainny 0:10177c8cba93 100 val1 = invert(pb1.read());
kennyainny 0:10177c8cba93 101 val2 = invert(pb2.read());
kennyainny 0:10177c8cba93 102 val3 = invert(pb3.read());
kennyainny 0:10177c8cba93 103 val4 = invert(pb4.read());
kennyainny 0:10177c8cba93 104
kennyainny 0:10177c8cba93 105 accel.readXYZGravity(&x,&y,&z);
kennyainny 0:10177c8cba93 106 //pc.printf("read gravity: x=%lf, y=%lf, z=%lf\n", x, y, z);
kennyainny 0:10177c8cba93 107
kennyainny 0:10177c8cba93 108 wait(1);
kennyainny 0:10177c8cba93 109
kennyainny 0:10177c8cba93 110 if(val1|| x>=0.3) { //left = 1
kennyainny 0:10177c8cba93 111 pb1_hit_callback();
kennyainny 0:10177c8cba93 112 }
kennyainny 0:10177c8cba93 113 if(val2 || x<=-0.3){ //right = 2
kennyainny 0:10177c8cba93 114 pb2_hit_callback();
kennyainny 0:10177c8cba93 115 }
kennyainny 0:10177c8cba93 116 if(val3|| y<=-0.3){ //up = 3
kennyainny 0:10177c8cba93 117 pb3_hit_callback();
kennyainny 0:10177c8cba93 118 }
kennyainny 0:10177c8cba93 119 if(val4 || y>=0.3){ // down = 4
kennyainny 0:10177c8cba93 120 pb4_hit_callback();
kennyainny 0:10177c8cba93 121 }
kennyainny 0:10177c8cba93 122
kennyainny 0:10177c8cba93 123 // draw some colors
kennyainny 0:10177c8cba93 124 drawFore(0, RED);
kennyainny 0:10177c8cba93 125 wait(0.2);
kennyainny 0:10177c8cba93 126 drawBack(0, WHITE);
kennyainny 0:10177c8cba93 127 drawFore(1, GREEN);
kennyainny 0:10177c8cba93 128 wait(0.2);
kennyainny 0:10177c8cba93 129 drawBack(1, WHITE);
kennyainny 0:10177c8cba93 130 drawFore(2, YELLOW);
kennyainny 0:10177c8cba93 131 wait(0.2);
kennyainny 0:10177c8cba93 132 drawBack(2, WHITE);
kennyainny 0:10177c8cba93 133 drawFore(3, BLUE);
kennyainny 0:10177c8cba93 134 wait(0.2);
kennyainny 0:10177c8cba93 135 drawBack(3, WHITE);
kennyainny 0:10177c8cba93 136
kennyainny 0:10177c8cba93 137 }
kennyainny 0:10177c8cba93 138 //end loop
kennyainny 0:10177c8cba93 139 }
kennyainny 0:10177c8cba93 140
kennyainny 0:10177c8cba93 141
kennyainny 0:10177c8cba93 142 //create a sequence and store in Sequence[]
kennyainny 0:10177c8cba93 143 void createSequence(int *Sequence, int length)
kennyainny 0:10177c8cba93 144 {
kennyainny 0:10177c8cba93 145 srand((int ) (randSeed * 50000)); // seed the pseudo-random number generator with electrical noise from a pin
kennyainny 0:10177c8cba93 146 for(int i=0; i<length; i++) {
kennyainny 0:10177c8cba93 147 Sequence[i] = rand() % 4;
kennyainny 0:10177c8cba93 148 }
kennyainny 0:10177c8cba93 149 }
kennyainny 0:10177c8cba93 150
kennyainny 0:10177c8cba93 151 //fcn to play a wav
kennyainny 0:10177c8cba93 152 void playSound(char * wav)
kennyainny 0:10177c8cba93 153 {
kennyainny 0:10177c8cba93 154 //open wav file
kennyainny 0:10177c8cba93 155 FILE *wave_file;
kennyainny 0:10177c8cba93 156 wave_file=fopen(wav,"r");
kennyainny 0:10177c8cba93 157
kennyainny 0:10177c8cba93 158 //play wav file
kennyainny 0:10177c8cba93 159 waver.play(wave_file);
kennyainny 0:10177c8cba93 160
kennyainny 0:10177c8cba93 161 //close wav file
kennyainny 0:10177c8cba93 162 fclose(wave_file);
kennyainny 0:10177c8cba93 163 }
kennyainny 0:10177c8cba93 164
kennyainny 0:10177c8cba93 165 //fcn to print to console
kennyainny 0:10177c8cba93 166 void print(const char *format, ...)
kennyainny 0:10177c8cba93 167 {
kennyainny 0:10177c8cba93 168 //temp variables
kennyainny 0:10177c8cba93 169 char buffer[BUFFSIZE];
kennyainny 0:10177c8cba93 170 char temp[BUFFSIZE-6];
kennyainny 0:10177c8cba93 171
kennyainny 0:10177c8cba93 172 //construct message part 1
kennyainny 0:10177c8cba93 173 sprintf(buffer, "print-");
kennyainny 0:10177c8cba93 174
kennyainny 0:10177c8cba93 175 //construct message part 2
kennyainny 0:10177c8cba93 176 va_list arguments;
kennyainny 0:10177c8cba93 177 va_start(arguments, format);
kennyainny 0:10177c8cba93 178 vsnprintf(temp, BUFFSIZE-7, format, arguments);
kennyainny 0:10177c8cba93 179 va_end(arguments);
kennyainny 0:10177c8cba93 180
kennyainny 0:10177c8cba93 181 //concatenate parts
kennyainny 0:10177c8cba93 182 strcat(buffer, temp);
kennyainny 0:10177c8cba93 183
kennyainny 0:10177c8cba93 184 //send message
kennyainny 0:10177c8cba93 185 pc.printf(buffer);
kennyainny 0:10177c8cba93 186 }
kennyainny 0:10177c8cba93 187
kennyainny 0:10177c8cba93 188 //fcn to convert string to lowercase
kennyainny 0:10177c8cba93 189 void lowerCase(char *src)
kennyainny 0:10177c8cba93 190 {
kennyainny 0:10177c8cba93 191 int i=0;;
kennyainny 0:10177c8cba93 192 while(src[i] != '\0') {
kennyainny 0:10177c8cba93 193 if((src[i] > 64) && (src[i] < 91)) {
kennyainny 0:10177c8cba93 194 src[i]+=32;
kennyainny 0:10177c8cba93 195 }
kennyainny 0:10177c8cba93 196 i++;
kennyainny 0:10177c8cba93 197 }
kennyainny 0:10177c8cba93 198 return;
kennyainny 0:10177c8cba93 199 }
kennyainny 0:10177c8cba93 200
kennyainny 0:10177c8cba93 201 //function to perform bitwise inversion
kennyainny 0:10177c8cba93 202 int invert(int value)
kennyainny 0:10177c8cba93 203 {
kennyainny 0:10177c8cba93 204 if (value == 0) {
kennyainny 0:10177c8cba93 205 return 1;
kennyainny 0:10177c8cba93 206 } else {
kennyainny 0:10177c8cba93 207 return 0;
kennyainny 0:10177c8cba93 208 }
kennyainny 0:10177c8cba93 209 }
kennyainny 0:10177c8cba93 210
kennyainny 0:10177c8cba93 211 //functions to call when a pushbutton is pressed
kennyainny 0:10177c8cba93 212 void pb1_hit_callback (void)
kennyainny 0:10177c8cba93 213 {
kennyainny 0:10177c8cba93 214 drawNum(1);
kennyainny 0:10177c8cba93 215 }
kennyainny 0:10177c8cba93 216 void pb2_hit_callback (void)
kennyainny 0:10177c8cba93 217 {
kennyainny 0:10177c8cba93 218 drawNum(2);
kennyainny 0:10177c8cba93 219 }
kennyainny 0:10177c8cba93 220 void pb3_hit_callback (void)
kennyainny 0:10177c8cba93 221 {
kennyainny 0:10177c8cba93 222 drawNum(3);
kennyainny 0:10177c8cba93 223 }
kennyainny 0:10177c8cba93 224 void pb4_hit_callback (void)
kennyainny 0:10177c8cba93 225 {
kennyainny 0:10177c8cba93 226 drawNum(4);
kennyainny 0:10177c8cba93 227 }
kennyainny 0:10177c8cba93 228
kennyainny 0:10177c8cba93 229 //color the background of one of the four corners
kennyainny 0:10177c8cba93 230 void drawBack(int position, int color)
kennyainny 0:10177c8cba93 231 {
kennyainny 0:10177c8cba93 232 int x11, x12, x21, x22, y11, y12, y21, y22;
kennyainny 0:10177c8cba93 233
kennyainny 0:10177c8cba93 234 switch(position) {
kennyainny 0:10177c8cba93 235 case 3:
kennyainny 0:10177c8cba93 236 x11 = 64;
kennyainny 0:10177c8cba93 237 x12 = 127;
kennyainny 0:10177c8cba93 238 x21 = 85;
kennyainny 0:10177c8cba93 239 x22 = 127;
kennyainny 0:10177c8cba93 240 y11 = 85;
kennyainny 0:10177c8cba93 241 y12 = 127;
kennyainny 0:10177c8cba93 242 y21 = 64;
kennyainny 0:10177c8cba93 243 y22 = 84;
kennyainny 0:10177c8cba93 244 break;
kennyainny 0:10177c8cba93 245 case 2:
kennyainny 0:10177c8cba93 246 x11 = 0;
kennyainny 0:10177c8cba93 247 x12 = 63;
kennyainny 0:10177c8cba93 248 x21 = 0;
kennyainny 0:10177c8cba93 249 x22 = 42;
kennyainny 0:10177c8cba93 250 y11 = 85;
kennyainny 0:10177c8cba93 251 y12 = 127;
kennyainny 0:10177c8cba93 252 y21 = 64;
kennyainny 0:10177c8cba93 253 y22 = 84;
kennyainny 0:10177c8cba93 254 break;
kennyainny 0:10177c8cba93 255 case 1:
kennyainny 0:10177c8cba93 256 x11 = 0;
kennyainny 0:10177c8cba93 257 x12 = 63;
kennyainny 0:10177c8cba93 258 x21 = 0;
kennyainny 0:10177c8cba93 259 x22 = 42;
kennyainny 0:10177c8cba93 260 y11 = 0;
kennyainny 0:10177c8cba93 261 y12 = 42;
kennyainny 0:10177c8cba93 262 y21 = 43;
kennyainny 0:10177c8cba93 263 y22 = 63;
kennyainny 0:10177c8cba93 264 break;
kennyainny 0:10177c8cba93 265 default:
kennyainny 0:10177c8cba93 266 x11 = 64;
kennyainny 0:10177c8cba93 267 x12 = 127;
kennyainny 0:10177c8cba93 268 x21 = 85;
kennyainny 0:10177c8cba93 269 x22 = 127;
kennyainny 0:10177c8cba93 270 y11 = 0;
kennyainny 0:10177c8cba93 271 y12 = 42;
kennyainny 0:10177c8cba93 272 y21 = 43;
kennyainny 0:10177c8cba93 273 y22 = 63;
kennyainny 0:10177c8cba93 274 }
kennyainny 0:10177c8cba93 275
kennyainny 0:10177c8cba93 276
kennyainny 0:10177c8cba93 277 uLCD.filled_rectangle(x11, y11, x12, y12, color);
kennyainny 0:10177c8cba93 278 uLCD.filled_rectangle(x21, y21, x22, y22, color);
kennyainny 0:10177c8cba93 279 }
kennyainny 0:10177c8cba93 280
kennyainny 0:10177c8cba93 281 //color the foreground of one of the four corners
kennyainny 0:10177c8cba93 282 void drawFore(int position, int color)
kennyainny 0:10177c8cba93 283 {
kennyainny 0:10177c8cba93 284 int x11, x12, x21, x22, y11, y12, y21, y22;
kennyainny 0:10177c8cba93 285
kennyainny 0:10177c8cba93 286 switch(position) {
kennyainny 0:10177c8cba93 287 case 3:
kennyainny 0:10177c8cba93 288 x11 = 68;
kennyainny 0:10177c8cba93 289 x12 = 123;
kennyainny 0:10177c8cba93 290 x21 = 89;
kennyainny 0:10177c8cba93 291 x22 = 123;
kennyainny 0:10177c8cba93 292 y11 = 89;
kennyainny 0:10177c8cba93 293 y12 = 123;
kennyainny 0:10177c8cba93 294 y21 = 68;
kennyainny 0:10177c8cba93 295 y22 = 89;
kennyainny 0:10177c8cba93 296 break;
kennyainny 0:10177c8cba93 297 case 2:
kennyainny 0:10177c8cba93 298 x11 = 4;
kennyainny 0:10177c8cba93 299 x12 = 59;
kennyainny 0:10177c8cba93 300 x21 = 4;
kennyainny 0:10177c8cba93 301 x22 = 38;
kennyainny 0:10177c8cba93 302 y11 = 89;
kennyainny 0:10177c8cba93 303 y12 = 123;
kennyainny 0:10177c8cba93 304 y21 = 68;
kennyainny 0:10177c8cba93 305 y22 = 89;
kennyainny 0:10177c8cba93 306 break;
kennyainny 0:10177c8cba93 307 case 1:
kennyainny 0:10177c8cba93 308 x11 = 4;
kennyainny 0:10177c8cba93 309 x12 = 59;
kennyainny 0:10177c8cba93 310 x21 = 4;
kennyainny 0:10177c8cba93 311 x22 = 38;
kennyainny 0:10177c8cba93 312 y11 = 4;
kennyainny 0:10177c8cba93 313 y12 = 38;
kennyainny 0:10177c8cba93 314 y21 = 39;
kennyainny 0:10177c8cba93 315 y22 = 59;
kennyainny 0:10177c8cba93 316 break;
kennyainny 0:10177c8cba93 317 default:
kennyainny 0:10177c8cba93 318 x11 = 68;
kennyainny 0:10177c8cba93 319 x12 = 123;
kennyainny 0:10177c8cba93 320 x21 = 89;
kennyainny 0:10177c8cba93 321 x22 = 123;
kennyainny 0:10177c8cba93 322 y11 = 4;
kennyainny 0:10177c8cba93 323 y12 = 38;
kennyainny 0:10177c8cba93 324 y21 = 39;
kennyainny 0:10177c8cba93 325 y22 = 59;
kennyainny 0:10177c8cba93 326 }
kennyainny 0:10177c8cba93 327
kennyainny 0:10177c8cba93 328
kennyainny 0:10177c8cba93 329 uLCD.filled_rectangle(x11, y11, x12, y12, color);
kennyainny 0:10177c8cba93 330 uLCD.filled_rectangle(x21, y21, x22, y22, color);
kennyainny 0:10177c8cba93 331 }
kennyainny 0:10177c8cba93 332
kennyainny 0:10177c8cba93 333 //print a number in the middle of the screen
kennyainny 0:10177c8cba93 334 void drawNum(int i) {
kennyainny 0:10177c8cba93 335 uLCD.text_width(3);
kennyainny 0:10177c8cba93 336 uLCD.text_height(3);
kennyainny 0:10177c8cba93 337 uLCD.color(BLACK);
kennyainny 0:10177c8cba93 338 uLCD.locate(2,2);
kennyainny 0:10177c8cba93 339 uLCD.printf("%2D",i);
kennyainny 0:10177c8cba93 340 }