Gatech ECE 4180 Lab 4 Deal or No Deal Game -Alex Ferrara -Luke LeFeve
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
main.cpp
- Committer:
- AlexFerrara
- Date:
- 2016-10-31
- Revision:
- 3:0d3cadcd159b
- Parent:
- 1:13d194e38ea6
- Child:
- 4:1c7f2541afc1
File content as of revision 3:0d3cadcd159b:
#include <mbed.h> #include <mpr121.h> #include "uLCD_4DGL.h" DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalIn pb1(p8); uLCD_4DGL uLCD(p28,p27,p30); void draw_case(int x, int y); void draw_case_grid(void); void draw_single_case(int caseNum); void flashCase(int caseNum); void draw_banker_screen(void); char* valuesStr[] = {"1","5","10","20","50","100","$ 250","$ 500","$ 1k","$2.5k","$ 5k","$ 10k"}; bool isCase[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; bool isOpen[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; bool valueOpen[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int case_values[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int values[12] = {1, 5, 10, 20, 50, 100, 250, 500, 1000, 2500, 5000, 10000}; int cases_picked = 0; int cases_to_pick; int round = 0; int G_HANDLE_HEIGHT = 1; int G_HANDLE_LENGTH = 2; int G_CASE_HEIGHT = 2; int G_CASE_LENGTH = 3; int current_val; // Create the interrupt receiver object on pin 26 InterruptIn interrupt(p26); // Setup the i2c bus on pins 9 and 10 I2C i2c(p9, p10); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); void round0(){ cases_to_pick = 1; draw_case_grid(); } int bankOfferGen(){ float multiplier; int offer = 0; if(cases_picked == 5) multiplier = .20; else if(cases_picked == 8) multiplier = .28; else if(cases_picked == 10) multiplier = .36; else if(cases_picked == 11) multiplier = .42; for(int i=0; i<12; i++){ if(isOpen[i]) offer += case_values[i]; } offer = (int) multiplier * (offer/cases_picked); return offer; } volatile bool stateTrigger; // true if hit , false if released volatile int buttonValue; // value of the pin touched. // Key hit/release interrupt routine for MPR121 void fallInterrupt() { //Only read the device when the previous interrupt has been handled by main if (stateTrigger == false) { // test global variable buttonValue = mpr121.read(0x00); buttonValue += mpr121.read(0x01)<<8; stateTrigger = true; // set global variable } } //initialize case values void Case_Init() { int num; //int case_values[12]; int A[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; bool done = 0; while(done){ num = rand() % 12 + 1; for(int i=0; i<12; i++){ if(A[i] == 0) A[i] = num; else if(A[i] == num) break; else done = 1; } } for(int i=0; i<12; i++) case_values[i] = values[A[i]]; } void draw_case(int x, int y, int scale, bool gold, bool open){ int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale; int HANDLE_LENGTH = G_HANDLE_LENGTH * scale; int CASE_HEIGHT = G_CASE_HEIGHT * scale; int CASE_LENGTH = G_CASE_LENGTH * scale; int HANDLE_OFFSET = (CASE_LENGTH - HANDLE_LENGTH) /2; int c1,c2,c3; (gold) ? (c1=0xfff08c) : (c1=LGREY); (gold) ? (c2=0xc99700) : (c2=DGREY); (gold) ? (c3= 0xFFDF00) : (c3=WHITE); //handle uLCD.rectangle(x+HANDLE_OFFSET, y, x+HANDLE_OFFSET+HANDLE_LENGTH, y+HANDLE_HEIGHT, c1); //main section uLCD.filled_rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c3); uLCD.rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c2); //uLCD.printf("%d, %d",x+HANDLE_HEIGHT+(CASE_HEIGHT/2), y+CASE_LENGTH/2); if(open){ uLCD.line(x,y,x+CASE_LENGTH,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); uLCD.line(x+1,y,x+CASE_LENGTH+1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); uLCD.line(x-1,y,x+CASE_LENGTH-1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); uLCD.line(x,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH,y,RED); uLCD.line(x+1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH+1,y,RED); uLCD.line(x-1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH-1,y,RED); } } int text_offset_x = 7; int text_offset_y = 4; int xPos[] = {0,33,66,99};//,0,33,66,99,0,33,66,99}; int yPos[] = {0,33,66};//0,0,0,33,33,33,33,66,66,66,66}; char* caseLabel[] = {"1"," 2"," 3","4","5"," 6"," 7","8","9","10","11","12"}; int labelCol[] = {2,6,11,16};//,2,6,11,16,2,6,11,16}; int labelRow[] = {2,6,10};//2,2,2,6,6,6,6,10,10,10,10}; void draw_case_grid(void){ //draw 12 case grid for(int i=0; i<12; i++){ uLCD.text_mode(TRANSPARENT); draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]); uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK); } uLCD.text_mode(OPAQUE); draw_case(60,100,9, false, false); uLCD.locate(9,14); uLCD.textbackground_color(WHITE); uLCD.printf("%d",12); uLCD.textbackground_color(BLACK); uLCD.color(GREEN); uLCD.locate(0,13); uLCD.printf("%d cases",cases_to_pick); uLCD.locate(0,14); uLCD.printf("left in"); uLCD.locate(0,15); uLCD.printf("round"); uLCD.locate(10,15); uLCD.printf("$%d",current_val); } void flashCase(int caseNum){ int i = caseNum - 1; int scale = 8; int tempX = xPos[i%4]+text_offset_x-1; int tempY = yPos[i/4]+text_offset_y-1; int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale; int CASE_HEIGHT = G_CASE_HEIGHT * scale; int CASE_LENGTH = G_CASE_LENGTH * scale; for(int j=0;j<2;j++){ uLCD.filled_rectangle(tempX,tempY,tempX+CASE_LENGTH+2,tempY+CASE_HEIGHT+HANDLE_HEIGHT+2,BLACK); wait(0.2); draw_single_case(i+1); wait(0.2); } } void draw_single_case(int caseNum){ int i = caseNum-1; uLCD.text_mode(TRANSPARENT); draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]); uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK); } void draw_banker_screen(void){ //uLCD.locate(0,0); //uLCD.printf("test"); for(int i=0;i<6;i++){ uLCD.locate(0,i); (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN); uLCD.printf("$%d",values[i]); } for(int i=6;i<12;i++){ //int j = ((int) log10((double)values[i]) + 1); uLCD.locate(13,(i-6)); (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN); /*char* val; (values[i]>500) ? val=values[i] : valuesStr[i];*/ uLCD.printf(valuesStr[i]); } uLCD.locate(0,8); uLCD.printf("The banker's"); uLCD.locate(0,9); uLCD.printf("offer is: $%d",bankOfferGen()); } int main() { stateTrigger = false; buttonValue = 0; Case_Init(); interrupt.mode(PullUp); interrupt.fall(&fallInterrupt); round0(); while (1) { int key_code=0; int i=0; for (i=0; i<12; i++) { if (((buttonValue>>i)&0x01)==1) key_code=i; } if (stateTrigger == true && key_code >-1 && key_code < 12) { led1=led2=led3=led4=1; /*led4=key_code & 0x01; led3=(key_code>>1) & 0x01; led2=(key_code>>2) & 0x01; led1=(key_code>>3) & 0x01;*/ //pick initial case if(cases_picked == 0) isCase[key_code] = 1; //check to see if that case has been picked /* for(int i=0; i<12; i++){ if(cases_picked == 0) picked = 0; else if(isOpen[i] == 1) picked = 1; else picked = 0; }*/ uLCD.locate(0, 0); uLCD.printf("%d",key_code); if(!isOpen[key_code]){ //uLCD.locate(0, 2); //uLCD.printf("reach 2"); cases_picked += 1; cases_to_pick -= 1; if(cases_picked != 1){ current_val = case_values[key_code]; isOpen[key_code] = 1; if(case_values[key_code] == 1) valueOpen[0] = 1; else if(case_values[key_code] == 5) valueOpen[1] = 1; else if(case_values[key_code] == 10) valueOpen[2] = 1; else if(case_values[key_code] == 20) valueOpen[3] = 1; else if(case_values[key_code] == 50) valueOpen[4] = 1; else if(case_values[key_code] == 100) valueOpen[5] = 1; else if(case_values[key_code] == 250) valueOpen[6] = 1; else if(case_values[key_code] == 500) valueOpen[7] = 1; else if(case_values[key_code] == 1000) valueOpen[8] = 1; else if(case_values[key_code] == 2500) valueOpen[9] = 1; else if(case_values[key_code] == 5000) valueOpen[10] = 1; else if(case_values[key_code] == 10000) valueOpen[11] = 1; } //uLCD.locate(0, 4); //uLCD.printf("reach 3"); //draw_case_grid(); draw_single_case(key_code+1); } else flashCase(key_code); //flash picked case with red border if(cases_picked == 1) cases_to_pick = 4; else if(cases_picked == 5){ cases_to_pick = 3; draw_banker_screen(); } else if(cases_picked == 8){ cases_to_pick = 2; draw_banker_screen(); } else if(cases_picked == 10){ cases_to_pick = 1; draw_banker_screen(); } else if(cases_picked == 11){ cases_to_pick = 1; draw_banker_screen(); } } stateTrigger = false; led1=led2=led3=led4=0; } }