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

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Revision:
6:a487ee40d30c
Parent:
5:610461a90e3a
--- a/main.cpp	Mon Oct 31 09:04:40 2016 +0000
+++ b/main.cpp	Mon Oct 31 18:33:46 2016 +0000
@@ -1,20 +1,41 @@
 #include "mbed.h"
 #include "uLCD_4DGL.h"
+#include "SDFileSystem.h"
+#include "wave_player.h"
 #include <mpr121.h>
+#include <algorithm>
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 DigitalOut led4(LED4);
+DigitalIn pb1(p11);
+DigitalIn pb2(p12);
+FILE *wave_file;
+SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+bool offer;
+int myCaseKeyCode = 0;
 volatile bool stateTrigger;       // true if hit , false if released
 volatile int buttonValue;         // value of the pin touched.
+int key_code;
 void draw_case(int x, int y);
 void draw_case_grid(void);
+void draw_grid_info(void);
 void draw_single_case(int caseNum);
 void flashCase(int caseNum);
 void draw_banker_screen(void);
+void Case_Init(void);
+void start_screen(void);
+int bankOfferGen(void);
 uLCD_4DGL uLCD(p28,p27,p30);
 bool isCase[] = {false,false,false,false,false,false,false,false,false,false,false,false};
 bool isOpen[] = {false,false,false,false,false,false,false,false,false,false,false,false};
+int case_values[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+int prizes[] = {0, 5, 10, 20, 50, 100, 250, 500, 1000, 2500, 5000, 10000};
+int current_value = 4;
+int num_cases_picked = 0;
+int num_cases_to_pick = 6;
 // Create the interrupt receiver object on pin 26
 InterruptIn interrupt(p26);
 
@@ -25,6 +46,23 @@
 // constructor(i2c object, i2c address of the mpr121)
 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
 
+void start_screen(){
+    uLCD.media_init();
+    uLCD.set_sector_address(0x003B, 0x9000);
+    uLCD.display_image(0,0);
+    uLCD.locate(1, 12);
+    uLCD.text_mode(TRANSPARENT);
+    uLCD.printf("Press Deal Button      to Start");
+    wave_file=fopen("/sd/theme.wav","r");
+    waver.play(wave_file);
+    fclose(wave_file);
+    while(pb1 == 1){};
+    uLCD.cls();
+    uLCD.set_sector_address(0x003B, 0x9041);
+    uLCD.display_image(0,0);
+    uLCD.text_mode(OPAQUE);
+}
+
 int G_HANDLE_HEIGHT = 1;
 int G_HANDLE_LENGTH = 2;
 int G_CASE_HEIGHT   = 2;
@@ -72,19 +110,19 @@
     }     
     uLCD.text_mode(OPAQUE);
     draw_case(60,100,9, false, false);
-    uLCD.locate(9,14);
+    /*uLCD.locate(9,14);
     uLCD.textbackground_color(WHITE);
-    uLCD.printf("%d",12);
+    uLCD.printf("%d",12);*/
     uLCD.textbackground_color(BLACK);
     uLCD.color(GREEN);
     uLCD.locate(0,13);
-    uLCD.printf("%d cases",3);
+    uLCD.printf("%d cases",num_cases_to_pick-1);
     uLCD.locate(0,14);
-    uLCD.printf("left in");
+    uLCD.printf("left to");
     uLCD.locate(0,15);
-    uLCD.printf("round");
-    uLCD.locate(10,15);
-    uLCD.printf("$%d",1000);
+    uLCD.printf("pick");
+    /*uLCD.locate(10,15);
+    uLCD.printf("$%d",current_value);*/
 }
 void flashCase(int caseNum){
     int i = caseNum - 1;
@@ -107,13 +145,41 @@
     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_grid_info(){
+    //update case #, amount, cases left
+    uLCD.text_mode(OPAQUE);
+    uLCD.locate(10,15);
+    uLCD.printf("        ");
+    draw_case(60,100,9, false, false);
+    uLCD.locate(9,14);
+    uLCD.textbackground_color(WHITE);
+    uLCD.printf("%d",key_code+1);
+    uLCD.textbackground_color(BLACK);
+    uLCD.color(GREEN);
+    uLCD.locate(0,13);
+    uLCD.printf("%d cases",num_cases_to_pick);
+    uLCD.locate(0,14);
+    uLCD.printf("left to");
+    uLCD.locate(0,15);
+    uLCD.printf("pick");
+    uLCD.locate(10,15);
+    uLCD.printf("$%d",case_values[key_code]);
+}
 
-int values[] = {1,5,10,20,50,100,250,500,1000,2500,5000,10000};
-char* valuesStr[] = {"1","5","10","20","50","100","$ 250","$ 500","$  1k","$2.5k","$  5k","$ 10k"};
-bool valueOpen[]= {true,false,true,false,true,false,true,false,false,true,false,false};
+int values[] = {0,5,10,20,50,100,250,500,1000,2500,5000,10000};
+char* valuesStr[] = {"0","5","10","20","50","100","$ 250","$ 500","$  1k","$2.5k","$  5k","$ 10k"};
+bool valueOpen[]= {false,false,false,false,false,false,false,false,false,false,false,false};
+void update_bank_table(void){
+    for(int i=0;i<12;i++){
+        if(case_values[key_code] == values[i]){
+        valueOpen[i] = true;
+        break;}    
+    }    
+}
 void draw_banker_screen(void){
     //uLCD.locate(0,0);
     //uLCD.printf("test");
+    offer = true;
     for(int i=0;i<6;i++){
         uLCD.locate(0,i);
         (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN);
@@ -127,10 +193,59 @@
         (values[i]>500) ? val=values[i] : valuesStr[i];*/
         uLCD.printf(valuesStr[i]);
     }
+    wave_file=fopen("/sd/banker_calling.wav","r");
+    waver.play(wave_file);
+    fclose(wave_file);
+    uLCD.color(GREEN);
     uLCD.locate(0,8);
     uLCD.printf("The banker's");
     uLCD.locate(0,9);
-    uLCD.printf("offer is: $%d",3784);
+    uLCD.printf("offer is:");
+    wait(1);
+    wave_file=fopen("/sd/case_opened.wav","r");
+    waver.play(wave_file);
+    fclose(wave_file);
+    uLCD.printf("$%d",bankOfferGen());
+    
+}
+
+//initialize case values
+void Case_Init()
+{
+    int A[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+    srand(time(0));
+    random_shuffle(&A[0], &A[12]);
+    
+ /*   num = rand() % 12 + 1;
+    num = rand() % 12 + 1;
+    uLCD.locate(0,0);
+    uLCD.printf("%d", num);*/
+    
+    for(int i=0; i<12; i++)
+        case_values[i] = prizes[A[i]];
+        
+}
+
+int bankOfferGen(){
+    float multiplier;
+    int offer = 0;
+    if(num_cases_picked == 6)
+        multiplier = .36;
+    else if(num_cases_picked == 8)
+        multiplier = .28;
+    else if(num_cases_picked == 10)
+        multiplier = .36;
+    else if(num_cases_picked == 11)
+        multiplier = .42;
+        
+    for(int i=0; i<12; i++){
+        if(!isOpen[i])
+            offer += case_values[i];
+    }
+    
+    offer = multiplier * (offer/(12 - num_cases_picked));
+    
+    return offer;
 }
 
 volatile int prevVal = 0;
@@ -138,7 +253,7 @@
 void fallInterrupt() {
  
 //Only read the device when the previous interrupt has been handled by main
- 
+  //led1=led2=led3=led4=0;
   if (stateTrigger == false) {   // test global variable
     prevVal = buttonValue;
     buttonValue = mpr121.read(0x00);    
@@ -154,8 +269,9 @@
     //wait(2);
     //flashCase(2);    
     //draw_banker_screen();
-    
-//int main() {
+    pb1.mode(PullUp); pb2.mode(PullUp);
+    start_screen();
+    Case_Init();
     stateTrigger = false;   
     buttonValue = 0;             
     bool round1 = true;
@@ -163,9 +279,57 @@
     interrupt.fall(&fallInterrupt);            // Attach interrupt and its mode respectively.
     draw_case_grid(); 
     while (1) {
+        if(pb1 == 0)
+            led1 = !led1;
+        if(pb2 == 0)
+            led2 = !led2;
+            
+        while(offer){
+            //wait for pb to update state as deal or no deal
+            if(pb1 == 0 ) //deal
+            {
+                uLCD.locate(0,12);
+                uLCD.printf("Congratulations,  you have accepted the offer!");   
+            }
+            if(pb2 == 0 ) //no deal
+            {
+                offer=false;
+                uLCD.locate(0,12);
+                uLCD.printf("Offer declined.   You won $%d",case_values[myCaseKeyCode]);
+                uLCD.locate(0,14);
+                uLCD.printf("from your case.");   
+                /*draw_case_grid();
+                stateTrigger == false; */
+            }
+        } 
     //Test for state change
+    //led1=led2=1;
+    //led3=led4=0;
     if (stateTrigger == true) {
-        int key_code=0;
+        led1=led2=led3=led4=1;
+        
+    /*while(offer){
+        //wait for pb to update state as deal or no deal
+        if(key_code == 8) //deal
+        {
+            uLCD.locate(0,13);
+            uLCD.printf("Congratulations,  you have accepted the offer");
+            stateTrigger == false;
+            break;   
+        }
+        if(key_code == 11 ) //no deal
+        {
+            offer=false;
+            uLCD.cls();
+            draw_case_grid();
+            stateTrigger == false;
+            break;
+        }
+    }*/  
+        
+        
+        
+        key_code=0;
         int i=0;
         int value=mpr121.read(0x00);
         value +=mpr121.read(0x01)<<8;
@@ -174,21 +338,62 @@
         for (i=0; i<12; i++) {
             if (((value>>i)&0x01)==1) key_code=i;
         }
+        current_value = case_values[key_code];
         led4=key_code & 0x01;
         led3=(key_code>>1) & 0x01;
         led2=(key_code>>2) & 0x01;
         led1=(key_code>>3) & 0x01;
         
+
+ /*       if(offer && (key_code == 8) ) //deal
+        {
+            uLCD.locate(0,13);
+            uLCD.printf("Congratulations,  you have accepted the offer");   
+        }
+        if(offer && (key_code == 11) ) //no deal
+        {
+            offer=false;
+            uLCD.cls();
+            draw_case_grid();
+            stateTrigger == false;  
+        }
+ */       
         if(round1){
             isCase[key_code] = true;
             round1 = false;
+            myCaseKeyCode = key_code;
         }
         else {
             isOpen[key_code] = true;
+            draw_grid_info();
+            /*wait(0.5);
+            wave_file=fopen("/sd/case_opened.wav","r");
+            waver.play(wave_file);
+            fclose(wave_file);*/
+            update_bank_table();
+        }
+        draw_single_case(key_code+1);
+        num_cases_to_pick -= 1;
+        num_cases_picked += 1;
+        if(num_cases_picked>1 && num_cases_to_pick == 0){
+            wait(2);
+            uLCD.cls();
+            uLCD.set_sector_address(0x003B, 0x9041);
+            uLCD.display_image(0,0);
+            draw_banker_screen(); 
         }
         
-        draw_single_case(key_code+1);
-            
+        //if(num_cases_picked == 1)
+        //    num_cases_to_pick = 4;
+        if(num_cases_picked == 6)
+            num_cases_to_pick = 3;
+        else if(num_cases_picked == 8)
+            num_cases_to_pick = 2;
+        else if(num_cases_picked == 10)
+            num_cases_to_pick = 1;
+        else if(num_cases_picked == 11)
+            num_cases_to_pick = 1;
+        
         stateTrigger = false; //main is done, release interrupt handler for next button
         }
     }// while