Gatech ECE 4180 Lab 4 Deal or No Deal Game -Alex Ferrara -Luke LeFeve
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
main.cpp@5:610461a90e3a, 2016-10-31 (annotated)
- Committer:
- AlexFerrara
- Date:
- Mon Oct 31 09:04:40 2016 +0000
- Revision:
- 5:610461a90e3a
- Parent:
- 4:1c7f2541afc1
- Child:
- 6:a487ee40d30c
-_-
Who changed what in which revision?
User | Revision | Line number | New 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 | 5:610461a90e3a | 161 | bool round1 = true; |
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 | 5:610461a90e3a | 182 | if(round1){ |
AlexFerrara | 5:610461a90e3a | 183 | isCase[key_code] = true; |
AlexFerrara | 5:610461a90e3a | 184 | round1 = false; |
AlexFerrara | 5:610461a90e3a | 185 | } |
AlexFerrara | 5:610461a90e3a | 186 | else { |
AlexFerrara | 5:610461a90e3a | 187 | isOpen[key_code] = true; |
AlexFerrara | 5:610461a90e3a | 188 | } |
AlexFerrara | 5:610461a90e3a | 189 | |
AlexFerrara | 3:0d3cadcd159b | 190 | draw_single_case(key_code+1); |
AlexFerrara | 4:1c7f2541afc1 | 191 | |
AlexFerrara | 4:1c7f2541afc1 | 192 | stateTrigger = false; //main is done, release interrupt handler for next button |
AlexFerrara | 4:1c7f2541afc1 | 193 | } |
AlexFerrara | 4:1c7f2541afc1 | 194 | }// while |
AlexFerrara | 4:1c7f2541afc1 | 195 | }// main |