Simon Sez prototype
Dependencies: 4DGL-uLCD-SE MMA8452 SDFileSystem mbed wave_player
Diff: main.cpp
- Revision:
- 0:10177c8cba93
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jul 14 23:23:38 2017 +0000 @@ -0,0 +1,340 @@ +/********************************** + * Author: + * Institution: Georgia Tech + * + * Title: MAIN + * Class: ECE2035 + * Assignment: Project 2 Summer 2017 + **********************************/ + +//includes +#include <string.h> +#include <stdio.h> +#include <math.h> +#include <cstdarg> +#include "mbed.h" +#include "SDFileSystem.h" +#include "wave_player.h" +#include "MMA8452.h" + +#include "uLCD_4DGL.h" + +//defines +#define YELLOW 0xFFFF00 +#define BUFFSIZE 100 +#define PI 3.141592653589793238462643f +#define TEST_WAVFILE "/sd/wavfiles/BUZZER.wav" +#define SEQ_LEN 20 + +//function prototypes +int invert(int value); +void print(const char *format, ...); +void lowerCase(char *src); +void playSound(void); +void pb1_hit_callback(void); +void pb2_hit_callback(void); +void pb3_hit_callback(void); +void pb4_hit_callback(void); +void createSequence(int *Sequence, int length); +void drawFore(int position, int color); +void drawBack(int position, int color); +void drawNum (int i); + +//initialize hardware +SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs +uLCD_4DGL uLCD(p9, p10, p11); // uLCD-144-G2 screen, (serial tx, serial rx, reset pin) +AnalogOut DACout(p18); +wave_player waver(&DACout); + +DigitalIn pb1(p21); +DigitalIn pb2(p22); +DigitalIn pb3(p23); +DigitalIn pb4(p24); + +AnalogIn randSeed(p20); + +Serial pc(USBTX,USBRX); // used by Accelerometer +MMA8452 accel(p28, p27, 100000); // Accelerometer + +// array for Simon sequence +int Sequence[SEQ_LEN]; + +//main +int main() +{ + // Use internal pullups for pushbuttons + pb1.mode(PullUp); + pb2.mode(PullUp); + pb3.mode(PullUp); + pb4.mode(PullUp); + + //check for wav file + uLCD.cls(); + uLCD.printf("Locating WAV files..."); + FILE *test_file; + //while(1) { + test_file=fopen(TEST_WAVFILE,"r"); + if(test_file != NULL) + uLCD.printf("Wav file sucessfully loaded"); + else + uLCD.printf("Wav file not found"); + wait(1); + //} + //fclose(test_file); + + uLCD.cls(); + + // set background colors / clear screen + uLCD.background_color(WHITE); + uLCD.cls(); + uLCD.background_color(WHITE); + uLCD.textbackground_color(WHITE); + + //loop + int val1, val2, val3, val4; + double x,y,z; + + while(1) { + //have fun... + // pushbuttons pull low when pressed, so invert them + val1 = invert(pb1.read()); + val2 = invert(pb2.read()); + val3 = invert(pb3.read()); + val4 = invert(pb4.read()); + + accel.readXYZGravity(&x,&y,&z); + //pc.printf("read gravity: x=%lf, y=%lf, z=%lf\n", x, y, z); + + wait(1); + + if(val1|| x>=0.3) { //left = 1 + pb1_hit_callback(); + } + if(val2 || x<=-0.3){ //right = 2 + pb2_hit_callback(); + } + if(val3|| y<=-0.3){ //up = 3 + pb3_hit_callback(); + } + if(val4 || y>=0.3){ // down = 4 + pb4_hit_callback(); + } + + // draw some colors + drawFore(0, RED); + wait(0.2); + drawBack(0, WHITE); + drawFore(1, GREEN); + wait(0.2); + drawBack(1, WHITE); + drawFore(2, YELLOW); + wait(0.2); + drawBack(2, WHITE); + drawFore(3, BLUE); + wait(0.2); + drawBack(3, WHITE); + + } + //end loop +} + + +//create a sequence and store in Sequence[] +void createSequence(int *Sequence, int length) +{ + srand((int ) (randSeed * 50000)); // seed the pseudo-random number generator with electrical noise from a pin + for(int i=0; i<length; i++) { + Sequence[i] = rand() % 4; + } +} + +//fcn to play a wav +void playSound(char * wav) +{ + //open wav file + FILE *wave_file; + wave_file=fopen(wav,"r"); + + //play wav file + waver.play(wave_file); + + //close wav file + fclose(wave_file); +} + +//fcn to print to console +void print(const char *format, ...) +{ + //temp variables + char buffer[BUFFSIZE]; + char temp[BUFFSIZE-6]; + + //construct message part 1 + sprintf(buffer, "print-"); + + //construct message part 2 + va_list arguments; + va_start(arguments, format); + vsnprintf(temp, BUFFSIZE-7, format, arguments); + va_end(arguments); + + //concatenate parts + strcat(buffer, temp); + + //send message + pc.printf(buffer); +} + +//fcn to convert string to lowercase +void lowerCase(char *src) +{ + int i=0;; + while(src[i] != '\0') { + if((src[i] > 64) && (src[i] < 91)) { + src[i]+=32; + } + i++; + } + return; +} + +//function to perform bitwise inversion +int invert(int value) +{ + if (value == 0) { + return 1; + } else { + return 0; + } +} + +//functions to call when a pushbutton is pressed +void pb1_hit_callback (void) +{ + drawNum(1); +} +void pb2_hit_callback (void) +{ + drawNum(2); +} +void pb3_hit_callback (void) +{ + drawNum(3); +} +void pb4_hit_callback (void) +{ + drawNum(4); +} + +//color the background of one of the four corners +void drawBack(int position, int color) +{ + int x11, x12, x21, x22, y11, y12, y21, y22; + + switch(position) { + case 3: + x11 = 64; + x12 = 127; + x21 = 85; + x22 = 127; + y11 = 85; + y12 = 127; + y21 = 64; + y22 = 84; + break; + case 2: + x11 = 0; + x12 = 63; + x21 = 0; + x22 = 42; + y11 = 85; + y12 = 127; + y21 = 64; + y22 = 84; + break; + case 1: + x11 = 0; + x12 = 63; + x21 = 0; + x22 = 42; + y11 = 0; + y12 = 42; + y21 = 43; + y22 = 63; + break; + default: + x11 = 64; + x12 = 127; + x21 = 85; + x22 = 127; + y11 = 0; + y12 = 42; + y21 = 43; + y22 = 63; + } + + + uLCD.filled_rectangle(x11, y11, x12, y12, color); + uLCD.filled_rectangle(x21, y21, x22, y22, color); +} + +//color the foreground of one of the four corners +void drawFore(int position, int color) +{ + int x11, x12, x21, x22, y11, y12, y21, y22; + + switch(position) { + case 3: + x11 = 68; + x12 = 123; + x21 = 89; + x22 = 123; + y11 = 89; + y12 = 123; + y21 = 68; + y22 = 89; + break; + case 2: + x11 = 4; + x12 = 59; + x21 = 4; + x22 = 38; + y11 = 89; + y12 = 123; + y21 = 68; + y22 = 89; + break; + case 1: + x11 = 4; + x12 = 59; + x21 = 4; + x22 = 38; + y11 = 4; + y12 = 38; + y21 = 39; + y22 = 59; + break; + default: + x11 = 68; + x12 = 123; + x21 = 89; + x22 = 123; + y11 = 4; + y12 = 38; + y21 = 39; + y22 = 59; + } + + + uLCD.filled_rectangle(x11, y11, x12, y12, color); + uLCD.filled_rectangle(x21, y21, x22, y22, color); +} + +//print a number in the middle of the screen +void drawNum(int i) { + uLCD.text_width(3); + uLCD.text_height(3); + uLCD.color(BLACK); + uLCD.locate(2,2); + uLCD.printf("%2D",i); +} \ No newline at end of file