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

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Revision:
3:0d3cadcd159b
Parent:
1:13d194e38ea6
Child:
4:1c7f2541afc1
--- a/main.cpp	Mon Oct 31 06:54:08 2016 +0000
+++ b/main.cpp	Mon Oct 31 08:07:57 2016 +0000
@@ -1,19 +1,116 @@
-#include "mbed.h"
+#include <mbed.h>
+#include <mpr121.h>
 #include "uLCD_4DGL.h"
-#include <math.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);
-uLCD_4DGL uLCD(p28,p27,p30);
-bool isCase[] = {false,false,false,true,false,false,false,false,false,false,false,false};
-bool isOpen[] = {false,true,false,false,false,true,false,false,false,true,false,false};
+
+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;
@@ -40,7 +137,6 @@
         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};
@@ -63,13 +159,13 @@
     uLCD.textbackground_color(BLACK);
     uLCD.color(GREEN);
     uLCD.locate(0,13);
-    uLCD.printf("%d cases",3);
+    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",1000);
+    uLCD.printf("$%d",current_val);
 }
 void flashCase(int caseNum){
     int i = caseNum - 1;
@@ -92,10 +188,6 @@
     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);
 }
-
-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};
 void draw_banker_screen(void){
     //uLCD.locate(0,0);
     //uLCD.printf("test");
@@ -115,15 +207,107 @@
     uLCD.locate(0,8);
     uLCD.printf("The banker's");
     uLCD.locate(0,9);
-    uLCD.printf("offer is: $%d",3784);
+    uLCD.printf("offer is: $%d",bankOfferGen());
 }
-
+ 
 int main() {
-    //uLCD.baudrate(299999);
-    //draw_case_grid();
-    //wait(2);
-    //flashCase(2);    
+    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;
     
-    
-    draw_banker_screen();
-}
+    //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;
+    }
+}
\ No newline at end of file