Gatech ECE 4180 Lab 4 Deal or No Deal Game -Alex Ferrara -Luke LeFeve

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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