Gatech ECE 4180 Lab 4 Deal or No Deal Game -Alex Ferrara -Luke LeFeve
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
main.cpp
00001 #include "mbed.h" 00002 #include "uLCD_4DGL.h" 00003 #include "SDFileSystem.h" 00004 #include "wave_player.h" 00005 #include <mpr121.h> 00006 #include <algorithm> 00007 DigitalOut led1(LED1); 00008 DigitalOut led2(LED2); 00009 DigitalOut led3(LED3); 00010 DigitalOut led4(LED4); 00011 DigitalIn pb1(p11); 00012 DigitalIn pb2(p12); 00013 FILE *wave_file; 00014 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card 00015 AnalogOut DACout(p18); 00016 wave_player waver(&DACout); 00017 bool offer; 00018 int myCaseKeyCode = 0; 00019 volatile bool stateTrigger; // true if hit , false if released 00020 volatile int buttonValue; // value of the pin touched. 00021 int key_code; 00022 void draw_case(int x, int y); 00023 void draw_case_grid(void); 00024 void draw_grid_info(void); 00025 void draw_single_case(int caseNum); 00026 void flashCase(int caseNum); 00027 void draw_banker_screen(void); 00028 void Case_Init(void); 00029 void start_screen(void); 00030 int bankOfferGen(void); 00031 uLCD_4DGL uLCD(p28,p27,p30); 00032 bool isCase[] = {false,false,false,false,false,false,false,false,false,false,false,false}; 00033 bool isOpen[] = {false,false,false,false,false,false,false,false,false,false,false,false}; 00034 int case_values[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 00035 int prizes[] = {0, 5, 10, 20, 50, 100, 250, 500, 1000, 2500, 5000, 10000}; 00036 int current_value = 4; 00037 int num_cases_picked = 0; 00038 int num_cases_to_pick = 6; 00039 // Create the interrupt receiver object on pin 26 00040 InterruptIn interrupt(p26); 00041 00042 // Setup the i2c bus on pins 9 and 10 00043 I2C i2c(p9, p10); 00044 00045 // Setup the Mpr121: 00046 // constructor(i2c object, i2c address of the mpr121) 00047 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); 00048 00049 void start_screen(){ 00050 uLCD.media_init(); 00051 uLCD.set_sector_address(0x003B, 0x9000); 00052 uLCD.display_image(0,0); 00053 uLCD.locate(1, 12); 00054 uLCD.text_mode(TRANSPARENT); 00055 uLCD.printf("Press Deal Button to Start"); 00056 wave_file=fopen("/sd/theme.wav","r"); 00057 waver.play(wave_file); 00058 fclose(wave_file); 00059 while(pb1 == 1){}; 00060 uLCD.cls(); 00061 uLCD.set_sector_address(0x003B, 0x9041); 00062 uLCD.display_image(0,0); 00063 uLCD.text_mode(OPAQUE); 00064 } 00065 00066 int G_HANDLE_HEIGHT = 1; 00067 int G_HANDLE_LENGTH = 2; 00068 int G_CASE_HEIGHT = 2; 00069 int G_CASE_LENGTH = 3; 00070 void draw_case(int x, int y, int scale, bool gold, bool open){ 00071 int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale; 00072 int HANDLE_LENGTH = G_HANDLE_LENGTH * scale; 00073 int CASE_HEIGHT = G_CASE_HEIGHT * scale; 00074 int CASE_LENGTH = G_CASE_LENGTH * scale; 00075 int HANDLE_OFFSET = (CASE_LENGTH - HANDLE_LENGTH) /2; 00076 int c1,c2,c3; 00077 (gold) ? (c1=0xfff08c) : (c1=LGREY); 00078 (gold) ? (c2=0xc99700) : (c2=DGREY); 00079 (gold) ? (c3= 0xFFDF00) : (c3=WHITE); 00080 //handle 00081 uLCD.rectangle(x+HANDLE_OFFSET, y, x+HANDLE_OFFSET+HANDLE_LENGTH, y+HANDLE_HEIGHT, c1); 00082 //main section 00083 uLCD.filled_rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c3); 00084 uLCD.rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c2); 00085 //uLCD.printf("%d, %d",x+HANDLE_HEIGHT+(CASE_HEIGHT/2), y+CASE_LENGTH/2); 00086 if(open){ 00087 uLCD.line(x,y,x+CASE_LENGTH,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); 00088 uLCD.line(x+1,y,x+CASE_LENGTH+1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); 00089 uLCD.line(x-1,y,x+CASE_LENGTH-1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); 00090 00091 uLCD.line(x,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH,y,RED); 00092 uLCD.line(x+1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH+1,y,RED); 00093 uLCD.line(x-1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH-1,y,RED); 00094 } 00095 } 00096 00097 int text_offset_x = 7; 00098 int text_offset_y = 4; 00099 int xPos[] = {0,33,66,99};//,0,33,66,99,0,33,66,99}; 00100 int yPos[] = {0,33,66};//0,0,0,33,33,33,33,66,66,66,66}; 00101 char* caseLabel[] = {"1"," 2"," 3","4","5"," 6"," 7","8","9","10","11","12"}; 00102 int labelCol[] = {2,6,11,16};//,2,6,11,16,2,6,11,16}; 00103 int labelRow[] = {2,6,10};//2,2,2,6,6,6,6,10,10,10,10}; 00104 void draw_case_grid(void){ 00105 //draw 12 case grid 00106 for(int i=0; i<12; i++){ 00107 uLCD.text_mode(TRANSPARENT); 00108 draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]); 00109 uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK); 00110 } 00111 uLCD.text_mode(OPAQUE); 00112 draw_case(60,100,9, false, false); 00113 /*uLCD.locate(9,14); 00114 uLCD.textbackground_color(WHITE); 00115 uLCD.printf("%d",12);*/ 00116 uLCD.textbackground_color(BLACK); 00117 uLCD.color(GREEN); 00118 uLCD.locate(0,13); 00119 uLCD.printf("%d cases",num_cases_to_pick-1); 00120 uLCD.locate(0,14); 00121 uLCD.printf("left to"); 00122 uLCD.locate(0,15); 00123 uLCD.printf("pick"); 00124 /*uLCD.locate(10,15); 00125 uLCD.printf("$%d",current_value);*/ 00126 } 00127 void flashCase(int caseNum){ 00128 int i = caseNum - 1; 00129 int scale = 8; 00130 int tempX = xPos[i%4]+text_offset_x-1; 00131 int tempY = yPos[i/4]+text_offset_y-1; 00132 int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale; 00133 int CASE_HEIGHT = G_CASE_HEIGHT * scale; 00134 int CASE_LENGTH = G_CASE_LENGTH * scale; 00135 for(int j=0;j<2;j++){ 00136 uLCD.filled_rectangle(tempX,tempY,tempX+CASE_LENGTH+2,tempY+CASE_HEIGHT+HANDLE_HEIGHT+2,BLACK); 00137 wait(0.2); 00138 draw_single_case(i+1); 00139 wait(0.2); 00140 } 00141 } 00142 void draw_single_case(int caseNum){ 00143 int i = caseNum-1; 00144 uLCD.text_mode(TRANSPARENT); 00145 draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]); 00146 uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK); 00147 } 00148 void draw_grid_info(){ 00149 //update case #, amount, cases left 00150 uLCD.text_mode(OPAQUE); 00151 uLCD.locate(10,15); 00152 uLCD.printf(" "); 00153 draw_case(60,100,9, false, false); 00154 uLCD.locate(9,14); 00155 uLCD.textbackground_color(WHITE); 00156 uLCD.printf("%d",key_code+1); 00157 uLCD.textbackground_color(BLACK); 00158 uLCD.color(GREEN); 00159 uLCD.locate(0,13); 00160 uLCD.printf("%d cases",num_cases_to_pick); 00161 uLCD.locate(0,14); 00162 uLCD.printf("left to"); 00163 uLCD.locate(0,15); 00164 uLCD.printf("pick"); 00165 uLCD.locate(10,15); 00166 uLCD.printf("$%d",case_values[key_code]); 00167 } 00168 00169 int values[] = {0,5,10,20,50,100,250,500,1000,2500,5000,10000}; 00170 char* valuesStr[] = {"0","5","10","20","50","100","$ 250","$ 500","$ 1k","$2.5k","$ 5k","$ 10k"}; 00171 bool valueOpen[]= {false,false,false,false,false,false,false,false,false,false,false,false}; 00172 void update_bank_table(void){ 00173 for(int i=0;i<12;i++){ 00174 if(case_values[key_code] == values[i]){ 00175 valueOpen[i] = true; 00176 break;} 00177 } 00178 } 00179 void draw_banker_screen(void){ 00180 //uLCD.locate(0,0); 00181 //uLCD.printf("test"); 00182 offer = true; 00183 for(int i=0;i<6;i++){ 00184 uLCD.locate(0,i); 00185 (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN); 00186 uLCD.printf("$%d",values[i]); 00187 } 00188 for(int i=6;i<12;i++){ 00189 //int j = ((int) log10((double)values[i]) + 1); 00190 uLCD.locate(13,(i-6)); 00191 (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN); 00192 /*char* val; 00193 (values[i]>500) ? val=values[i] : valuesStr[i];*/ 00194 uLCD.printf(valuesStr[i]); 00195 } 00196 wave_file=fopen("/sd/banker_calling.wav","r"); 00197 waver.play(wave_file); 00198 fclose(wave_file); 00199 uLCD.color(GREEN); 00200 uLCD.locate(0,8); 00201 uLCD.printf("The banker's"); 00202 uLCD.locate(0,9); 00203 uLCD.printf("offer is:"); 00204 wait(1); 00205 wave_file=fopen("/sd/case_opened.wav","r"); 00206 waver.play(wave_file); 00207 fclose(wave_file); 00208 uLCD.printf("$%d",bankOfferGen()); 00209 00210 } 00211 00212 //initialize case values 00213 void Case_Init() 00214 { 00215 int A[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 00216 srand(time(0)); 00217 random_shuffle(&A[0], &A[12]); 00218 00219 /* num = rand() % 12 + 1; 00220 num = rand() % 12 + 1; 00221 uLCD.locate(0,0); 00222 uLCD.printf("%d", num);*/ 00223 00224 for(int i=0; i<12; i++) 00225 case_values[i] = prizes[A[i]]; 00226 00227 } 00228 00229 int bankOfferGen(){ 00230 float multiplier; 00231 int offer = 0; 00232 if(num_cases_picked == 6) 00233 multiplier = .36; 00234 else if(num_cases_picked == 8) 00235 multiplier = .28; 00236 else if(num_cases_picked == 10) 00237 multiplier = .36; 00238 else if(num_cases_picked == 11) 00239 multiplier = .42; 00240 00241 for(int i=0; i<12; i++){ 00242 if(!isOpen[i]) 00243 offer += case_values[i]; 00244 } 00245 00246 offer = multiplier * (offer/(12 - num_cases_picked)); 00247 00248 return offer; 00249 } 00250 00251 volatile int prevVal = 0; 00252 // Key hit/release interrupt routine for MPR121 00253 void fallInterrupt() { 00254 00255 //Only read the device when the previous interrupt has been handled by main 00256 //led1=led2=led3=led4=0; 00257 if (stateTrigger == false) { // test global variable 00258 prevVal = buttonValue; 00259 buttonValue = mpr121.read(0x00); 00260 buttonValue += mpr121.read(0x01)<<8; 00261 if(((buttonValue != prevVal) && buttonValue != 0) || (buttonValue ==0 && prevVal == 0)) 00262 stateTrigger = true; // set global variable 00263 } 00264 } 00265 00266 int main() { 00267 //uLCD.baudrate(299999); 00268 //draw_case_grid(); 00269 //wait(2); 00270 //flashCase(2); 00271 //draw_banker_screen(); 00272 pb1.mode(PullUp); pb2.mode(PullUp); 00273 start_screen(); 00274 Case_Init(); 00275 stateTrigger = false; 00276 buttonValue = 0; 00277 bool round1 = true; 00278 interrupt.mode(PullUp); 00279 interrupt.fall(&fallInterrupt); // Attach interrupt and its mode respectively. 00280 draw_case_grid(); 00281 while (1) { 00282 if(pb1 == 0) 00283 led1 = !led1; 00284 if(pb2 == 0) 00285 led2 = !led2; 00286 00287 while(offer){ 00288 //wait for pb to update state as deal or no deal 00289 if(pb1 == 0 ) //deal 00290 { 00291 uLCD.locate(0,12); 00292 uLCD.printf("Congratulations, you have accepted the offer!"); 00293 } 00294 if(pb2 == 0 ) //no deal 00295 { 00296 offer=false; 00297 uLCD.locate(0,12); 00298 uLCD.printf("Offer declined. You won $%d",case_values[myCaseKeyCode]); 00299 uLCD.locate(0,14); 00300 uLCD.printf("from your case."); 00301 /*draw_case_grid(); 00302 stateTrigger == false; */ 00303 } 00304 } 00305 //Test for state change 00306 //led1=led2=1; 00307 //led3=led4=0; 00308 if (stateTrigger == true) { 00309 led1=led2=led3=led4=1; 00310 00311 /*while(offer){ 00312 //wait for pb to update state as deal or no deal 00313 if(key_code == 8) //deal 00314 { 00315 uLCD.locate(0,13); 00316 uLCD.printf("Congratulations, you have accepted the offer"); 00317 stateTrigger == false; 00318 break; 00319 } 00320 if(key_code == 11 ) //no deal 00321 { 00322 offer=false; 00323 uLCD.cls(); 00324 draw_case_grid(); 00325 stateTrigger == false; 00326 break; 00327 } 00328 }*/ 00329 00330 00331 00332 key_code=0; 00333 int i=0; 00334 int value=mpr121.read(0x00); 00335 value +=mpr121.read(0x01)<<8; 00336 // LED demo mod 00337 // puts key number out to LEDs for demo 00338 for (i=0; i<12; i++) { 00339 if (((value>>i)&0x01)==1) key_code=i; 00340 } 00341 current_value = case_values[key_code]; 00342 led4=key_code & 0x01; 00343 led3=(key_code>>1) & 0x01; 00344 led2=(key_code>>2) & 0x01; 00345 led1=(key_code>>3) & 0x01; 00346 00347 00348 /* if(offer && (key_code == 8) ) //deal 00349 { 00350 uLCD.locate(0,13); 00351 uLCD.printf("Congratulations, you have accepted the offer"); 00352 } 00353 if(offer && (key_code == 11) ) //no deal 00354 { 00355 offer=false; 00356 uLCD.cls(); 00357 draw_case_grid(); 00358 stateTrigger == false; 00359 } 00360 */ 00361 if(round1){ 00362 isCase[key_code] = true; 00363 round1 = false; 00364 myCaseKeyCode = key_code; 00365 } 00366 else { 00367 isOpen[key_code] = true; 00368 draw_grid_info(); 00369 /*wait(0.5); 00370 wave_file=fopen("/sd/case_opened.wav","r"); 00371 waver.play(wave_file); 00372 fclose(wave_file);*/ 00373 update_bank_table(); 00374 } 00375 draw_single_case(key_code+1); 00376 num_cases_to_pick -= 1; 00377 num_cases_picked += 1; 00378 if(num_cases_picked>1 && num_cases_to_pick == 0){ 00379 wait(2); 00380 uLCD.cls(); 00381 uLCD.set_sector_address(0x003B, 0x9041); 00382 uLCD.display_image(0,0); 00383 draw_banker_screen(); 00384 } 00385 00386 //if(num_cases_picked == 1) 00387 // num_cases_to_pick = 4; 00388 if(num_cases_picked == 6) 00389 num_cases_to_pick = 3; 00390 else if(num_cases_picked == 8) 00391 num_cases_to_pick = 2; 00392 else if(num_cases_picked == 10) 00393 num_cases_to_pick = 1; 00394 else if(num_cases_picked == 11) 00395 num_cases_to_pick = 1; 00396 00397 stateTrigger = false; //main is done, release interrupt handler for next button 00398 } 00399 }// while 00400 }// main
Generated on Fri Jul 15 2022 21:19:09 by 1.7.2