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

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Committer:
AlexFerrara
Date:
Mon Oct 31 08:59:30 2016 +0000
Revision:
4:1c7f2541afc1
Parent:
3:0d3cadcd159b
Child:
5:610461a90e3a
starting to live better;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AlexFerrara 4:1c7f2541afc1 1 #include "mbed.h"
AlexFerrara 4:1c7f2541afc1 2 #include "uLCD_4DGL.h"
AlexFerrara 3:0d3cadcd159b 3 #include <mpr121.h>
AlexFerrara 3:0d3cadcd159b 4 DigitalOut led1(LED1);
AlexFerrara 3:0d3cadcd159b 5 DigitalOut led2(LED2);
AlexFerrara 3:0d3cadcd159b 6 DigitalOut led3(LED3);
AlexFerrara 3:0d3cadcd159b 7 DigitalOut led4(LED4);
AlexFerrara 4:1c7f2541afc1 8 volatile bool stateTrigger; // true if hit , false if released
AlexFerrara 4:1c7f2541afc1 9 volatile int buttonValue; // value of the pin touched.
AlexFerrara 0:a9fc9a400a0a 10 void draw_case(int x, int y);
AlexFerrara 0:a9fc9a400a0a 11 void draw_case_grid(void);
AlexFerrara 1:13d194e38ea6 12 void draw_single_case(int caseNum);
AlexFerrara 1:13d194e38ea6 13 void flashCase(int caseNum);
AlexFerrara 1:13d194e38ea6 14 void draw_banker_screen(void);
AlexFerrara 4:1c7f2541afc1 15 uLCD_4DGL uLCD(p28,p27,p30);
AlexFerrara 4:1c7f2541afc1 16 bool isCase[] = {false,false,false,false,false,false,false,false,false,false,false,false};
AlexFerrara 4:1c7f2541afc1 17 bool isOpen[] = {false,false,false,false,false,false,false,false,false,false,false,false};
AlexFerrara 3:0d3cadcd159b 18 // Create the interrupt receiver object on pin 26
AlexFerrara 3:0d3cadcd159b 19 InterruptIn interrupt(p26);
AlexFerrara 3:0d3cadcd159b 20
AlexFerrara 3:0d3cadcd159b 21 // Setup the i2c bus on pins 9 and 10
AlexFerrara 3:0d3cadcd159b 22 I2C i2c(p9, p10);
AlexFerrara 3:0d3cadcd159b 23
AlexFerrara 3:0d3cadcd159b 24 // Setup the Mpr121:
AlexFerrara 3:0d3cadcd159b 25 // constructor(i2c object, i2c address of the mpr121)
AlexFerrara 3:0d3cadcd159b 26 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
AlexFerrara 3:0d3cadcd159b 27
AlexFerrara 4:1c7f2541afc1 28 int G_HANDLE_HEIGHT = 1;
AlexFerrara 4:1c7f2541afc1 29 int G_HANDLE_LENGTH = 2;
AlexFerrara 4:1c7f2541afc1 30 int G_CASE_HEIGHT = 2;
AlexFerrara 4:1c7f2541afc1 31 int G_CASE_LENGTH = 3;
AlexFerrara 1:13d194e38ea6 32 void draw_case(int x, int y, int scale, bool gold, bool open){
AlexFerrara 0:a9fc9a400a0a 33 int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale;
AlexFerrara 0:a9fc9a400a0a 34 int HANDLE_LENGTH = G_HANDLE_LENGTH * scale;
AlexFerrara 0:a9fc9a400a0a 35 int CASE_HEIGHT = G_CASE_HEIGHT * scale;
AlexFerrara 0:a9fc9a400a0a 36 int CASE_LENGTH = G_CASE_LENGTH * scale;
AlexFerrara 0:a9fc9a400a0a 37 int HANDLE_OFFSET = (CASE_LENGTH - HANDLE_LENGTH) /2;
AlexFerrara 1:13d194e38ea6 38 int c1,c2,c3;
AlexFerrara 1:13d194e38ea6 39 (gold) ? (c1=0xfff08c) : (c1=LGREY);
AlexFerrara 1:13d194e38ea6 40 (gold) ? (c2=0xc99700) : (c2=DGREY);
AlexFerrara 1:13d194e38ea6 41 (gold) ? (c3= 0xFFDF00) : (c3=WHITE);
AlexFerrara 0:a9fc9a400a0a 42 //handle
AlexFerrara 1:13d194e38ea6 43 uLCD.rectangle(x+HANDLE_OFFSET, y, x+HANDLE_OFFSET+HANDLE_LENGTH, y+HANDLE_HEIGHT, c1);
AlexFerrara 0:a9fc9a400a0a 44 //main section
AlexFerrara 1:13d194e38ea6 45 uLCD.filled_rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c3);
AlexFerrara 1:13d194e38ea6 46 uLCD.rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c2);
AlexFerrara 0:a9fc9a400a0a 47 //uLCD.printf("%d, %d",x+HANDLE_HEIGHT+(CASE_HEIGHT/2), y+CASE_LENGTH/2);
AlexFerrara 1:13d194e38ea6 48 if(open){
AlexFerrara 1:13d194e38ea6 49 uLCD.line(x,y,x+CASE_LENGTH,y+HANDLE_HEIGHT+CASE_HEIGHT,RED);
AlexFerrara 1:13d194e38ea6 50 uLCD.line(x+1,y,x+CASE_LENGTH+1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED);
AlexFerrara 1:13d194e38ea6 51 uLCD.line(x-1,y,x+CASE_LENGTH-1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED);
AlexFerrara 0:a9fc9a400a0a 52
AlexFerrara 1:13d194e38ea6 53 uLCD.line(x,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH,y,RED);
AlexFerrara 1:13d194e38ea6 54 uLCD.line(x+1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH+1,y,RED);
AlexFerrara 1:13d194e38ea6 55 uLCD.line(x-1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH-1,y,RED);
AlexFerrara 1:13d194e38ea6 56 }
AlexFerrara 0:a9fc9a400a0a 57 }
AlexFerrara 4:1c7f2541afc1 58
AlexFerrara 1:13d194e38ea6 59 int text_offset_x = 7;
AlexFerrara 1:13d194e38ea6 60 int text_offset_y = 4;
AlexFerrara 1:13d194e38ea6 61 int xPos[] = {0,33,66,99};//,0,33,66,99,0,33,66,99};
AlexFerrara 1:13d194e38ea6 62 int yPos[] = {0,33,66};//0,0,0,33,33,33,33,66,66,66,66};
AlexFerrara 1:13d194e38ea6 63 char* caseLabel[] = {"1"," 2"," 3","4","5"," 6"," 7","8","9","10","11","12"};
AlexFerrara 1:13d194e38ea6 64 int labelCol[] = {2,6,11,16};//,2,6,11,16,2,6,11,16};
AlexFerrara 1:13d194e38ea6 65 int labelRow[] = {2,6,10};//2,2,2,6,6,6,6,10,10,10,10};
AlexFerrara 1:13d194e38ea6 66 void draw_case_grid(void){
AlexFerrara 1:13d194e38ea6 67 //draw 12 case grid
AlexFerrara 1:13d194e38ea6 68 for(int i=0; i<12; i++){
AlexFerrara 1:13d194e38ea6 69 uLCD.text_mode(TRANSPARENT);
AlexFerrara 1:13d194e38ea6 70 draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]);
AlexFerrara 1:13d194e38ea6 71 uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK);
AlexFerrara 1:13d194e38ea6 72 }
AlexFerrara 1:13d194e38ea6 73 uLCD.text_mode(OPAQUE);
AlexFerrara 1:13d194e38ea6 74 draw_case(60,100,9, false, false);
AlexFerrara 1:13d194e38ea6 75 uLCD.locate(9,14);
AlexFerrara 1:13d194e38ea6 76 uLCD.textbackground_color(WHITE);
AlexFerrara 1:13d194e38ea6 77 uLCD.printf("%d",12);
AlexFerrara 1:13d194e38ea6 78 uLCD.textbackground_color(BLACK);
AlexFerrara 1:13d194e38ea6 79 uLCD.color(GREEN);
AlexFerrara 1:13d194e38ea6 80 uLCD.locate(0,13);
AlexFerrara 4:1c7f2541afc1 81 uLCD.printf("%d cases",3);
AlexFerrara 1:13d194e38ea6 82 uLCD.locate(0,14);
AlexFerrara 1:13d194e38ea6 83 uLCD.printf("left in");
AlexFerrara 1:13d194e38ea6 84 uLCD.locate(0,15);
AlexFerrara 1:13d194e38ea6 85 uLCD.printf("round");
AlexFerrara 1:13d194e38ea6 86 uLCD.locate(10,15);
AlexFerrara 4:1c7f2541afc1 87 uLCD.printf("$%d",1000);
AlexFerrara 1:13d194e38ea6 88 }
AlexFerrara 1:13d194e38ea6 89 void flashCase(int caseNum){
AlexFerrara 1:13d194e38ea6 90 int i = caseNum - 1;
AlexFerrara 1:13d194e38ea6 91 int scale = 8;
AlexFerrara 1:13d194e38ea6 92 int tempX = xPos[i%4]+text_offset_x-1;
AlexFerrara 1:13d194e38ea6 93 int tempY = yPos[i/4]+text_offset_y-1;
AlexFerrara 1:13d194e38ea6 94 int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale;
AlexFerrara 1:13d194e38ea6 95 int CASE_HEIGHT = G_CASE_HEIGHT * scale;
AlexFerrara 1:13d194e38ea6 96 int CASE_LENGTH = G_CASE_LENGTH * scale;
AlexFerrara 1:13d194e38ea6 97 for(int j=0;j<2;j++){
AlexFerrara 1:13d194e38ea6 98 uLCD.filled_rectangle(tempX,tempY,tempX+CASE_LENGTH+2,tempY+CASE_HEIGHT+HANDLE_HEIGHT+2,BLACK);
AlexFerrara 1:13d194e38ea6 99 wait(0.2);
AlexFerrara 1:13d194e38ea6 100 draw_single_case(i+1);
AlexFerrara 1:13d194e38ea6 101 wait(0.2);
AlexFerrara 1:13d194e38ea6 102 }
AlexFerrara 1:13d194e38ea6 103 }
AlexFerrara 1:13d194e38ea6 104 void draw_single_case(int caseNum){
AlexFerrara 1:13d194e38ea6 105 int i = caseNum-1;
AlexFerrara 1:13d194e38ea6 106 uLCD.text_mode(TRANSPARENT);
AlexFerrara 1:13d194e38ea6 107 draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]);
AlexFerrara 1:13d194e38ea6 108 uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK);
AlexFerrara 1:13d194e38ea6 109 }
AlexFerrara 4:1c7f2541afc1 110
AlexFerrara 4:1c7f2541afc1 111 int values[] = {1,5,10,20,50,100,250,500,1000,2500,5000,10000};
AlexFerrara 4:1c7f2541afc1 112 char* valuesStr[] = {"1","5","10","20","50","100","$ 250","$ 500","$ 1k","$2.5k","$ 5k","$ 10k"};
AlexFerrara 4:1c7f2541afc1 113 bool valueOpen[]= {true,false,true,false,true,false,true,false,false,true,false,false};
AlexFerrara 1:13d194e38ea6 114 void draw_banker_screen(void){
AlexFerrara 1:13d194e38ea6 115 //uLCD.locate(0,0);
AlexFerrara 1:13d194e38ea6 116 //uLCD.printf("test");
AlexFerrara 1:13d194e38ea6 117 for(int i=0;i<6;i++){
AlexFerrara 1:13d194e38ea6 118 uLCD.locate(0,i);
AlexFerrara 1:13d194e38ea6 119 (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN);
AlexFerrara 1:13d194e38ea6 120 uLCD.printf("$%d",values[i]);
AlexFerrara 1:13d194e38ea6 121 }
AlexFerrara 1:13d194e38ea6 122 for(int i=6;i<12;i++){
AlexFerrara 1:13d194e38ea6 123 //int j = ((int) log10((double)values[i]) + 1);
AlexFerrara 1:13d194e38ea6 124 uLCD.locate(13,(i-6));
AlexFerrara 1:13d194e38ea6 125 (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN);
AlexFerrara 1:13d194e38ea6 126 /*char* val;
AlexFerrara 1:13d194e38ea6 127 (values[i]>500) ? val=values[i] : valuesStr[i];*/
AlexFerrara 1:13d194e38ea6 128 uLCD.printf(valuesStr[i]);
AlexFerrara 1:13d194e38ea6 129 }
AlexFerrara 1:13d194e38ea6 130 uLCD.locate(0,8);
AlexFerrara 1:13d194e38ea6 131 uLCD.printf("The banker's");
AlexFerrara 1:13d194e38ea6 132 uLCD.locate(0,9);
AlexFerrara 4:1c7f2541afc1 133 uLCD.printf("offer is: $%d",3784);
AlexFerrara 1:13d194e38ea6 134 }
AlexFerrara 4:1c7f2541afc1 135
AlexFerrara 4:1c7f2541afc1 136 volatile int prevVal = 0;
AlexFerrara 4:1c7f2541afc1 137 // Key hit/release interrupt routine for MPR121
AlexFerrara 4:1c7f2541afc1 138 void fallInterrupt() {
AlexFerrara 3:0d3cadcd159b 139
AlexFerrara 4:1c7f2541afc1 140 //Only read the device when the previous interrupt has been handled by main
AlexFerrara 4:1c7f2541afc1 141
AlexFerrara 4:1c7f2541afc1 142 if (stateTrigger == false) { // test global variable
AlexFerrara 4:1c7f2541afc1 143 prevVal = buttonValue;
AlexFerrara 4:1c7f2541afc1 144 buttonValue = mpr121.read(0x00);
AlexFerrara 4:1c7f2541afc1 145 buttonValue += mpr121.read(0x01)<<8;
AlexFerrara 4:1c7f2541afc1 146 if(((buttonValue != prevVal) && buttonValue != 0) || (buttonValue ==0 && prevVal == 0))
AlexFerrara 4:1c7f2541afc1 147 stateTrigger = true; // set global variable
AlexFerrara 4:1c7f2541afc1 148 }
AlexFerrara 4:1c7f2541afc1 149 }
AlexFerrara 4:1c7f2541afc1 150
AlexFerrara 0:a9fc9a400a0a 151 int main() {
AlexFerrara 4:1c7f2541afc1 152 //uLCD.baudrate(299999);
AlexFerrara 4:1c7f2541afc1 153 //draw_case_grid();
AlexFerrara 4:1c7f2541afc1 154 //wait(2);
AlexFerrara 4:1c7f2541afc1 155 //flashCase(2);
AlexFerrara 4:1c7f2541afc1 156 //draw_banker_screen();
AlexFerrara 0:a9fc9a400a0a 157
AlexFerrara 4:1c7f2541afc1 158 //int main() {
AlexFerrara 4:1c7f2541afc1 159 stateTrigger = false;
AlexFerrara 4:1c7f2541afc1 160 buttonValue = 0;
AlexFerrara 4:1c7f2541afc1 161
AlexFerrara 4:1c7f2541afc1 162 interrupt.mode(PullUp);
AlexFerrara 4:1c7f2541afc1 163 interrupt.fall(&fallInterrupt); // Attach interrupt and its mode respectively.
AlexFerrara 4:1c7f2541afc1 164 draw_case_grid();
AlexFerrara 4:1c7f2541afc1 165 while (1) {
AlexFerrara 4:1c7f2541afc1 166 //Test for state change
AlexFerrara 4:1c7f2541afc1 167 if (stateTrigger == true) {
AlexFerrara 4:1c7f2541afc1 168 int key_code=0;
AlexFerrara 4:1c7f2541afc1 169 int i=0;
AlexFerrara 4:1c7f2541afc1 170 int value=mpr121.read(0x00);
AlexFerrara 4:1c7f2541afc1 171 value +=mpr121.read(0x01)<<8;
AlexFerrara 4:1c7f2541afc1 172 // LED demo mod
AlexFerrara 4:1c7f2541afc1 173 // puts key number out to LEDs for demo
AlexFerrara 4:1c7f2541afc1 174 for (i=0; i<12; i++) {
AlexFerrara 4:1c7f2541afc1 175 if (((value>>i)&0x01)==1) key_code=i;
AlexFerrara 4:1c7f2541afc1 176 }
AlexFerrara 4:1c7f2541afc1 177 led4=key_code & 0x01;
AlexFerrara 4:1c7f2541afc1 178 led3=(key_code>>1) & 0x01;
AlexFerrara 4:1c7f2541afc1 179 led2=(key_code>>2) & 0x01;
AlexFerrara 4:1c7f2541afc1 180 led1=(key_code>>3) & 0x01;
AlexFerrara 4:1c7f2541afc1 181
AlexFerrara 4:1c7f2541afc1 182 isCase[key_code] = true;
AlexFerrara 3:0d3cadcd159b 183 draw_single_case(key_code+1);
AlexFerrara 4:1c7f2541afc1 184
AlexFerrara 4:1c7f2541afc1 185 stateTrigger = false; //main is done, release interrupt handler for next button
AlexFerrara 4:1c7f2541afc1 186 }
AlexFerrara 4:1c7f2541afc1 187 }// while
AlexFerrara 4:1c7f2541afc1 188 }// main