Gatech ECE 4180 Lab 4 Deal or No Deal Game -Alex Ferrara -Luke LeFeve
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
main.cpp@6:a487ee40d30c, 2016-10-31 (annotated)
- Committer:
- AlexFerrara
- Date:
- Mon Oct 31 18:33:46 2016 +0000
- Revision:
- 6:a487ee40d30c
- Parent:
- 5:610461a90e3a
Gatech ECE 4180 Lab 4 Deal or No Deal Game; -Alex Ferrara; -Luke LeFeve
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 | 6:a487ee40d30c | 3 | #include "SDFileSystem.h" |
AlexFerrara | 6:a487ee40d30c | 4 | #include "wave_player.h" |
AlexFerrara | 3:0d3cadcd159b | 5 | #include <mpr121.h> |
AlexFerrara | 6:a487ee40d30c | 6 | #include <algorithm> |
AlexFerrara | 3:0d3cadcd159b | 7 | DigitalOut led1(LED1); |
AlexFerrara | 3:0d3cadcd159b | 8 | DigitalOut led2(LED2); |
AlexFerrara | 3:0d3cadcd159b | 9 | DigitalOut led3(LED3); |
AlexFerrara | 3:0d3cadcd159b | 10 | DigitalOut led4(LED4); |
AlexFerrara | 6:a487ee40d30c | 11 | DigitalIn pb1(p11); |
AlexFerrara | 6:a487ee40d30c | 12 | DigitalIn pb2(p12); |
AlexFerrara | 6:a487ee40d30c | 13 | FILE *wave_file; |
AlexFerrara | 6:a487ee40d30c | 14 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card |
AlexFerrara | 6:a487ee40d30c | 15 | AnalogOut DACout(p18); |
AlexFerrara | 6:a487ee40d30c | 16 | wave_player waver(&DACout); |
AlexFerrara | 6:a487ee40d30c | 17 | bool offer; |
AlexFerrara | 6:a487ee40d30c | 18 | int myCaseKeyCode = 0; |
AlexFerrara | 4:1c7f2541afc1 | 19 | volatile bool stateTrigger; // true if hit , false if released |
AlexFerrara | 4:1c7f2541afc1 | 20 | volatile int buttonValue; // value of the pin touched. |
AlexFerrara | 6:a487ee40d30c | 21 | int key_code; |
AlexFerrara | 0:a9fc9a400a0a | 22 | void draw_case(int x, int y); |
AlexFerrara | 0:a9fc9a400a0a | 23 | void draw_case_grid(void); |
AlexFerrara | 6:a487ee40d30c | 24 | void draw_grid_info(void); |
AlexFerrara | 1:13d194e38ea6 | 25 | void draw_single_case(int caseNum); |
AlexFerrara | 1:13d194e38ea6 | 26 | void flashCase(int caseNum); |
AlexFerrara | 1:13d194e38ea6 | 27 | void draw_banker_screen(void); |
AlexFerrara | 6:a487ee40d30c | 28 | void Case_Init(void); |
AlexFerrara | 6:a487ee40d30c | 29 | void start_screen(void); |
AlexFerrara | 6:a487ee40d30c | 30 | int bankOfferGen(void); |
AlexFerrara | 4:1c7f2541afc1 | 31 | uLCD_4DGL uLCD(p28,p27,p30); |
AlexFerrara | 4:1c7f2541afc1 | 32 | bool isCase[] = {false,false,false,false,false,false,false,false,false,false,false,false}; |
AlexFerrara | 4:1c7f2541afc1 | 33 | bool isOpen[] = {false,false,false,false,false,false,false,false,false,false,false,false}; |
AlexFerrara | 6:a487ee40d30c | 34 | int case_values[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
AlexFerrara | 6:a487ee40d30c | 35 | int prizes[] = {0, 5, 10, 20, 50, 100, 250, 500, 1000, 2500, 5000, 10000}; |
AlexFerrara | 6:a487ee40d30c | 36 | int current_value = 4; |
AlexFerrara | 6:a487ee40d30c | 37 | int num_cases_picked = 0; |
AlexFerrara | 6:a487ee40d30c | 38 | int num_cases_to_pick = 6; |
AlexFerrara | 3:0d3cadcd159b | 39 | // Create the interrupt receiver object on pin 26 |
AlexFerrara | 3:0d3cadcd159b | 40 | InterruptIn interrupt(p26); |
AlexFerrara | 3:0d3cadcd159b | 41 | |
AlexFerrara | 3:0d3cadcd159b | 42 | // Setup the i2c bus on pins 9 and 10 |
AlexFerrara | 3:0d3cadcd159b | 43 | I2C i2c(p9, p10); |
AlexFerrara | 3:0d3cadcd159b | 44 | |
AlexFerrara | 3:0d3cadcd159b | 45 | // Setup the Mpr121: |
AlexFerrara | 3:0d3cadcd159b | 46 | // constructor(i2c object, i2c address of the mpr121) |
AlexFerrara | 3:0d3cadcd159b | 47 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
AlexFerrara | 3:0d3cadcd159b | 48 | |
AlexFerrara | 6:a487ee40d30c | 49 | void start_screen(){ |
AlexFerrara | 6:a487ee40d30c | 50 | uLCD.media_init(); |
AlexFerrara | 6:a487ee40d30c | 51 | uLCD.set_sector_address(0x003B, 0x9000); |
AlexFerrara | 6:a487ee40d30c | 52 | uLCD.display_image(0,0); |
AlexFerrara | 6:a487ee40d30c | 53 | uLCD.locate(1, 12); |
AlexFerrara | 6:a487ee40d30c | 54 | uLCD.text_mode(TRANSPARENT); |
AlexFerrara | 6:a487ee40d30c | 55 | uLCD.printf("Press Deal Button to Start"); |
AlexFerrara | 6:a487ee40d30c | 56 | wave_file=fopen("/sd/theme.wav","r"); |
AlexFerrara | 6:a487ee40d30c | 57 | waver.play(wave_file); |
AlexFerrara | 6:a487ee40d30c | 58 | fclose(wave_file); |
AlexFerrara | 6:a487ee40d30c | 59 | while(pb1 == 1){}; |
AlexFerrara | 6:a487ee40d30c | 60 | uLCD.cls(); |
AlexFerrara | 6:a487ee40d30c | 61 | uLCD.set_sector_address(0x003B, 0x9041); |
AlexFerrara | 6:a487ee40d30c | 62 | uLCD.display_image(0,0); |
AlexFerrara | 6:a487ee40d30c | 63 | uLCD.text_mode(OPAQUE); |
AlexFerrara | 6:a487ee40d30c | 64 | } |
AlexFerrara | 6:a487ee40d30c | 65 | |
AlexFerrara | 4:1c7f2541afc1 | 66 | int G_HANDLE_HEIGHT = 1; |
AlexFerrara | 4:1c7f2541afc1 | 67 | int G_HANDLE_LENGTH = 2; |
AlexFerrara | 4:1c7f2541afc1 | 68 | int G_CASE_HEIGHT = 2; |
AlexFerrara | 4:1c7f2541afc1 | 69 | int G_CASE_LENGTH = 3; |
AlexFerrara | 1:13d194e38ea6 | 70 | void draw_case(int x, int y, int scale, bool gold, bool open){ |
AlexFerrara | 0:a9fc9a400a0a | 71 | int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale; |
AlexFerrara | 0:a9fc9a400a0a | 72 | int HANDLE_LENGTH = G_HANDLE_LENGTH * scale; |
AlexFerrara | 0:a9fc9a400a0a | 73 | int CASE_HEIGHT = G_CASE_HEIGHT * scale; |
AlexFerrara | 0:a9fc9a400a0a | 74 | int CASE_LENGTH = G_CASE_LENGTH * scale; |
AlexFerrara | 0:a9fc9a400a0a | 75 | int HANDLE_OFFSET = (CASE_LENGTH - HANDLE_LENGTH) /2; |
AlexFerrara | 1:13d194e38ea6 | 76 | int c1,c2,c3; |
AlexFerrara | 1:13d194e38ea6 | 77 | (gold) ? (c1=0xfff08c) : (c1=LGREY); |
AlexFerrara | 1:13d194e38ea6 | 78 | (gold) ? (c2=0xc99700) : (c2=DGREY); |
AlexFerrara | 1:13d194e38ea6 | 79 | (gold) ? (c3= 0xFFDF00) : (c3=WHITE); |
AlexFerrara | 0:a9fc9a400a0a | 80 | //handle |
AlexFerrara | 1:13d194e38ea6 | 81 | uLCD.rectangle(x+HANDLE_OFFSET, y, x+HANDLE_OFFSET+HANDLE_LENGTH, y+HANDLE_HEIGHT, c1); |
AlexFerrara | 0:a9fc9a400a0a | 82 | //main section |
AlexFerrara | 1:13d194e38ea6 | 83 | uLCD.filled_rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c3); |
AlexFerrara | 1:13d194e38ea6 | 84 | uLCD.rectangle(x, y+HANDLE_HEIGHT, x+CASE_LENGTH, y+HANDLE_HEIGHT+CASE_HEIGHT, c2); |
AlexFerrara | 0:a9fc9a400a0a | 85 | //uLCD.printf("%d, %d",x+HANDLE_HEIGHT+(CASE_HEIGHT/2), y+CASE_LENGTH/2); |
AlexFerrara | 1:13d194e38ea6 | 86 | if(open){ |
AlexFerrara | 1:13d194e38ea6 | 87 | uLCD.line(x,y,x+CASE_LENGTH,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); |
AlexFerrara | 1:13d194e38ea6 | 88 | uLCD.line(x+1,y,x+CASE_LENGTH+1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); |
AlexFerrara | 1:13d194e38ea6 | 89 | uLCD.line(x-1,y,x+CASE_LENGTH-1,y+HANDLE_HEIGHT+CASE_HEIGHT,RED); |
AlexFerrara | 0:a9fc9a400a0a | 90 | |
AlexFerrara | 1:13d194e38ea6 | 91 | uLCD.line(x,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH,y,RED); |
AlexFerrara | 1:13d194e38ea6 | 92 | uLCD.line(x+1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH+1,y,RED); |
AlexFerrara | 1:13d194e38ea6 | 93 | uLCD.line(x-1,y+HANDLE_HEIGHT+CASE_HEIGHT,x+CASE_LENGTH-1,y,RED); |
AlexFerrara | 1:13d194e38ea6 | 94 | } |
AlexFerrara | 0:a9fc9a400a0a | 95 | } |
AlexFerrara | 4:1c7f2541afc1 | 96 | |
AlexFerrara | 1:13d194e38ea6 | 97 | int text_offset_x = 7; |
AlexFerrara | 1:13d194e38ea6 | 98 | int text_offset_y = 4; |
AlexFerrara | 1:13d194e38ea6 | 99 | int xPos[] = {0,33,66,99};//,0,33,66,99,0,33,66,99}; |
AlexFerrara | 1:13d194e38ea6 | 100 | int yPos[] = {0,33,66};//0,0,0,33,33,33,33,66,66,66,66}; |
AlexFerrara | 1:13d194e38ea6 | 101 | char* caseLabel[] = {"1"," 2"," 3","4","5"," 6"," 7","8","9","10","11","12"}; |
AlexFerrara | 1:13d194e38ea6 | 102 | int labelCol[] = {2,6,11,16};//,2,6,11,16,2,6,11,16}; |
AlexFerrara | 1:13d194e38ea6 | 103 | int labelRow[] = {2,6,10};//2,2,2,6,6,6,6,10,10,10,10}; |
AlexFerrara | 1:13d194e38ea6 | 104 | void draw_case_grid(void){ |
AlexFerrara | 1:13d194e38ea6 | 105 | //draw 12 case grid |
AlexFerrara | 1:13d194e38ea6 | 106 | for(int i=0; i<12; i++){ |
AlexFerrara | 1:13d194e38ea6 | 107 | uLCD.text_mode(TRANSPARENT); |
AlexFerrara | 1:13d194e38ea6 | 108 | draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]); |
AlexFerrara | 1:13d194e38ea6 | 109 | uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK); |
AlexFerrara | 1:13d194e38ea6 | 110 | } |
AlexFerrara | 1:13d194e38ea6 | 111 | uLCD.text_mode(OPAQUE); |
AlexFerrara | 1:13d194e38ea6 | 112 | draw_case(60,100,9, false, false); |
AlexFerrara | 6:a487ee40d30c | 113 | /*uLCD.locate(9,14); |
AlexFerrara | 1:13d194e38ea6 | 114 | uLCD.textbackground_color(WHITE); |
AlexFerrara | 6:a487ee40d30c | 115 | uLCD.printf("%d",12);*/ |
AlexFerrara | 1:13d194e38ea6 | 116 | uLCD.textbackground_color(BLACK); |
AlexFerrara | 1:13d194e38ea6 | 117 | uLCD.color(GREEN); |
AlexFerrara | 1:13d194e38ea6 | 118 | uLCD.locate(0,13); |
AlexFerrara | 6:a487ee40d30c | 119 | uLCD.printf("%d cases",num_cases_to_pick-1); |
AlexFerrara | 1:13d194e38ea6 | 120 | uLCD.locate(0,14); |
AlexFerrara | 6:a487ee40d30c | 121 | uLCD.printf("left to"); |
AlexFerrara | 1:13d194e38ea6 | 122 | uLCD.locate(0,15); |
AlexFerrara | 6:a487ee40d30c | 123 | uLCD.printf("pick"); |
AlexFerrara | 6:a487ee40d30c | 124 | /*uLCD.locate(10,15); |
AlexFerrara | 6:a487ee40d30c | 125 | uLCD.printf("$%d",current_value);*/ |
AlexFerrara | 1:13d194e38ea6 | 126 | } |
AlexFerrara | 1:13d194e38ea6 | 127 | void flashCase(int caseNum){ |
AlexFerrara | 1:13d194e38ea6 | 128 | int i = caseNum - 1; |
AlexFerrara | 1:13d194e38ea6 | 129 | int scale = 8; |
AlexFerrara | 1:13d194e38ea6 | 130 | int tempX = xPos[i%4]+text_offset_x-1; |
AlexFerrara | 1:13d194e38ea6 | 131 | int tempY = yPos[i/4]+text_offset_y-1; |
AlexFerrara | 1:13d194e38ea6 | 132 | int HANDLE_HEIGHT = G_HANDLE_HEIGHT * scale; |
AlexFerrara | 1:13d194e38ea6 | 133 | int CASE_HEIGHT = G_CASE_HEIGHT * scale; |
AlexFerrara | 1:13d194e38ea6 | 134 | int CASE_LENGTH = G_CASE_LENGTH * scale; |
AlexFerrara | 1:13d194e38ea6 | 135 | for(int j=0;j<2;j++){ |
AlexFerrara | 1:13d194e38ea6 | 136 | uLCD.filled_rectangle(tempX,tempY,tempX+CASE_LENGTH+2,tempY+CASE_HEIGHT+HANDLE_HEIGHT+2,BLACK); |
AlexFerrara | 1:13d194e38ea6 | 137 | wait(0.2); |
AlexFerrara | 1:13d194e38ea6 | 138 | draw_single_case(i+1); |
AlexFerrara | 1:13d194e38ea6 | 139 | wait(0.2); |
AlexFerrara | 1:13d194e38ea6 | 140 | } |
AlexFerrara | 1:13d194e38ea6 | 141 | } |
AlexFerrara | 1:13d194e38ea6 | 142 | void draw_single_case(int caseNum){ |
AlexFerrara | 1:13d194e38ea6 | 143 | int i = caseNum-1; |
AlexFerrara | 1:13d194e38ea6 | 144 | uLCD.text_mode(TRANSPARENT); |
AlexFerrara | 1:13d194e38ea6 | 145 | draw_case(xPos[i%4]+text_offset_x,yPos[i/4]+text_offset_y,7,isCase[i],isOpen[i]); |
AlexFerrara | 1:13d194e38ea6 | 146 | uLCD.text_string(caseLabel[i],labelCol[i%4],labelRow[i/4], NULL, BLACK); |
AlexFerrara | 1:13d194e38ea6 | 147 | } |
AlexFerrara | 6:a487ee40d30c | 148 | void draw_grid_info(){ |
AlexFerrara | 6:a487ee40d30c | 149 | //update case #, amount, cases left |
AlexFerrara | 6:a487ee40d30c | 150 | uLCD.text_mode(OPAQUE); |
AlexFerrara | 6:a487ee40d30c | 151 | uLCD.locate(10,15); |
AlexFerrara | 6:a487ee40d30c | 152 | uLCD.printf(" "); |
AlexFerrara | 6:a487ee40d30c | 153 | draw_case(60,100,9, false, false); |
AlexFerrara | 6:a487ee40d30c | 154 | uLCD.locate(9,14); |
AlexFerrara | 6:a487ee40d30c | 155 | uLCD.textbackground_color(WHITE); |
AlexFerrara | 6:a487ee40d30c | 156 | uLCD.printf("%d",key_code+1); |
AlexFerrara | 6:a487ee40d30c | 157 | uLCD.textbackground_color(BLACK); |
AlexFerrara | 6:a487ee40d30c | 158 | uLCD.color(GREEN); |
AlexFerrara | 6:a487ee40d30c | 159 | uLCD.locate(0,13); |
AlexFerrara | 6:a487ee40d30c | 160 | uLCD.printf("%d cases",num_cases_to_pick); |
AlexFerrara | 6:a487ee40d30c | 161 | uLCD.locate(0,14); |
AlexFerrara | 6:a487ee40d30c | 162 | uLCD.printf("left to"); |
AlexFerrara | 6:a487ee40d30c | 163 | uLCD.locate(0,15); |
AlexFerrara | 6:a487ee40d30c | 164 | uLCD.printf("pick"); |
AlexFerrara | 6:a487ee40d30c | 165 | uLCD.locate(10,15); |
AlexFerrara | 6:a487ee40d30c | 166 | uLCD.printf("$%d",case_values[key_code]); |
AlexFerrara | 6:a487ee40d30c | 167 | } |
AlexFerrara | 4:1c7f2541afc1 | 168 | |
AlexFerrara | 6:a487ee40d30c | 169 | int values[] = {0,5,10,20,50,100,250,500,1000,2500,5000,10000}; |
AlexFerrara | 6:a487ee40d30c | 170 | char* valuesStr[] = {"0","5","10","20","50","100","$ 250","$ 500","$ 1k","$2.5k","$ 5k","$ 10k"}; |
AlexFerrara | 6:a487ee40d30c | 171 | bool valueOpen[]= {false,false,false,false,false,false,false,false,false,false,false,false}; |
AlexFerrara | 6:a487ee40d30c | 172 | void update_bank_table(void){ |
AlexFerrara | 6:a487ee40d30c | 173 | for(int i=0;i<12;i++){ |
AlexFerrara | 6:a487ee40d30c | 174 | if(case_values[key_code] == values[i]){ |
AlexFerrara | 6:a487ee40d30c | 175 | valueOpen[i] = true; |
AlexFerrara | 6:a487ee40d30c | 176 | break;} |
AlexFerrara | 6:a487ee40d30c | 177 | } |
AlexFerrara | 6:a487ee40d30c | 178 | } |
AlexFerrara | 1:13d194e38ea6 | 179 | void draw_banker_screen(void){ |
AlexFerrara | 1:13d194e38ea6 | 180 | //uLCD.locate(0,0); |
AlexFerrara | 1:13d194e38ea6 | 181 | //uLCD.printf("test"); |
AlexFerrara | 6:a487ee40d30c | 182 | offer = true; |
AlexFerrara | 1:13d194e38ea6 | 183 | for(int i=0;i<6;i++){ |
AlexFerrara | 1:13d194e38ea6 | 184 | uLCD.locate(0,i); |
AlexFerrara | 1:13d194e38ea6 | 185 | (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN); |
AlexFerrara | 1:13d194e38ea6 | 186 | uLCD.printf("$%d",values[i]); |
AlexFerrara | 1:13d194e38ea6 | 187 | } |
AlexFerrara | 1:13d194e38ea6 | 188 | for(int i=6;i<12;i++){ |
AlexFerrara | 1:13d194e38ea6 | 189 | //int j = ((int) log10((double)values[i]) + 1); |
AlexFerrara | 1:13d194e38ea6 | 190 | uLCD.locate(13,(i-6)); |
AlexFerrara | 1:13d194e38ea6 | 191 | (valueOpen[i]) ? uLCD.color(RED) : uLCD.color(GREEN); |
AlexFerrara | 1:13d194e38ea6 | 192 | /*char* val; |
AlexFerrara | 1:13d194e38ea6 | 193 | (values[i]>500) ? val=values[i] : valuesStr[i];*/ |
AlexFerrara | 1:13d194e38ea6 | 194 | uLCD.printf(valuesStr[i]); |
AlexFerrara | 1:13d194e38ea6 | 195 | } |
AlexFerrara | 6:a487ee40d30c | 196 | wave_file=fopen("/sd/banker_calling.wav","r"); |
AlexFerrara | 6:a487ee40d30c | 197 | waver.play(wave_file); |
AlexFerrara | 6:a487ee40d30c | 198 | fclose(wave_file); |
AlexFerrara | 6:a487ee40d30c | 199 | uLCD.color(GREEN); |
AlexFerrara | 1:13d194e38ea6 | 200 | uLCD.locate(0,8); |
AlexFerrara | 1:13d194e38ea6 | 201 | uLCD.printf("The banker's"); |
AlexFerrara | 1:13d194e38ea6 | 202 | uLCD.locate(0,9); |
AlexFerrara | 6:a487ee40d30c | 203 | uLCD.printf("offer is:"); |
AlexFerrara | 6:a487ee40d30c | 204 | wait(1); |
AlexFerrara | 6:a487ee40d30c | 205 | wave_file=fopen("/sd/case_opened.wav","r"); |
AlexFerrara | 6:a487ee40d30c | 206 | waver.play(wave_file); |
AlexFerrara | 6:a487ee40d30c | 207 | fclose(wave_file); |
AlexFerrara | 6:a487ee40d30c | 208 | uLCD.printf("$%d",bankOfferGen()); |
AlexFerrara | 6:a487ee40d30c | 209 | |
AlexFerrara | 6:a487ee40d30c | 210 | } |
AlexFerrara | 6:a487ee40d30c | 211 | |
AlexFerrara | 6:a487ee40d30c | 212 | //initialize case values |
AlexFerrara | 6:a487ee40d30c | 213 | void Case_Init() |
AlexFerrara | 6:a487ee40d30c | 214 | { |
AlexFerrara | 6:a487ee40d30c | 215 | int A[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; |
AlexFerrara | 6:a487ee40d30c | 216 | srand(time(0)); |
AlexFerrara | 6:a487ee40d30c | 217 | random_shuffle(&A[0], &A[12]); |
AlexFerrara | 6:a487ee40d30c | 218 | |
AlexFerrara | 6:a487ee40d30c | 219 | /* num = rand() % 12 + 1; |
AlexFerrara | 6:a487ee40d30c | 220 | num = rand() % 12 + 1; |
AlexFerrara | 6:a487ee40d30c | 221 | uLCD.locate(0,0); |
AlexFerrara | 6:a487ee40d30c | 222 | uLCD.printf("%d", num);*/ |
AlexFerrara | 6:a487ee40d30c | 223 | |
AlexFerrara | 6:a487ee40d30c | 224 | for(int i=0; i<12; i++) |
AlexFerrara | 6:a487ee40d30c | 225 | case_values[i] = prizes[A[i]]; |
AlexFerrara | 6:a487ee40d30c | 226 | |
AlexFerrara | 6:a487ee40d30c | 227 | } |
AlexFerrara | 6:a487ee40d30c | 228 | |
AlexFerrara | 6:a487ee40d30c | 229 | int bankOfferGen(){ |
AlexFerrara | 6:a487ee40d30c | 230 | float multiplier; |
AlexFerrara | 6:a487ee40d30c | 231 | int offer = 0; |
AlexFerrara | 6:a487ee40d30c | 232 | if(num_cases_picked == 6) |
AlexFerrara | 6:a487ee40d30c | 233 | multiplier = .36; |
AlexFerrara | 6:a487ee40d30c | 234 | else if(num_cases_picked == 8) |
AlexFerrara | 6:a487ee40d30c | 235 | multiplier = .28; |
AlexFerrara | 6:a487ee40d30c | 236 | else if(num_cases_picked == 10) |
AlexFerrara | 6:a487ee40d30c | 237 | multiplier = .36; |
AlexFerrara | 6:a487ee40d30c | 238 | else if(num_cases_picked == 11) |
AlexFerrara | 6:a487ee40d30c | 239 | multiplier = .42; |
AlexFerrara | 6:a487ee40d30c | 240 | |
AlexFerrara | 6:a487ee40d30c | 241 | for(int i=0; i<12; i++){ |
AlexFerrara | 6:a487ee40d30c | 242 | if(!isOpen[i]) |
AlexFerrara | 6:a487ee40d30c | 243 | offer += case_values[i]; |
AlexFerrara | 6:a487ee40d30c | 244 | } |
AlexFerrara | 6:a487ee40d30c | 245 | |
AlexFerrara | 6:a487ee40d30c | 246 | offer = multiplier * (offer/(12 - num_cases_picked)); |
AlexFerrara | 6:a487ee40d30c | 247 | |
AlexFerrara | 6:a487ee40d30c | 248 | return offer; |
AlexFerrara | 1:13d194e38ea6 | 249 | } |
AlexFerrara | 4:1c7f2541afc1 | 250 | |
AlexFerrara | 4:1c7f2541afc1 | 251 | volatile int prevVal = 0; |
AlexFerrara | 4:1c7f2541afc1 | 252 | // Key hit/release interrupt routine for MPR121 |
AlexFerrara | 4:1c7f2541afc1 | 253 | void fallInterrupt() { |
AlexFerrara | 3:0d3cadcd159b | 254 | |
AlexFerrara | 4:1c7f2541afc1 | 255 | //Only read the device when the previous interrupt has been handled by main |
AlexFerrara | 6:a487ee40d30c | 256 | //led1=led2=led3=led4=0; |
AlexFerrara | 4:1c7f2541afc1 | 257 | if (stateTrigger == false) { // test global variable |
AlexFerrara | 4:1c7f2541afc1 | 258 | prevVal = buttonValue; |
AlexFerrara | 4:1c7f2541afc1 | 259 | buttonValue = mpr121.read(0x00); |
AlexFerrara | 4:1c7f2541afc1 | 260 | buttonValue += mpr121.read(0x01)<<8; |
AlexFerrara | 4:1c7f2541afc1 | 261 | if(((buttonValue != prevVal) && buttonValue != 0) || (buttonValue ==0 && prevVal == 0)) |
AlexFerrara | 4:1c7f2541afc1 | 262 | stateTrigger = true; // set global variable |
AlexFerrara | 4:1c7f2541afc1 | 263 | } |
AlexFerrara | 4:1c7f2541afc1 | 264 | } |
AlexFerrara | 4:1c7f2541afc1 | 265 | |
AlexFerrara | 0:a9fc9a400a0a | 266 | int main() { |
AlexFerrara | 4:1c7f2541afc1 | 267 | //uLCD.baudrate(299999); |
AlexFerrara | 4:1c7f2541afc1 | 268 | //draw_case_grid(); |
AlexFerrara | 4:1c7f2541afc1 | 269 | //wait(2); |
AlexFerrara | 4:1c7f2541afc1 | 270 | //flashCase(2); |
AlexFerrara | 4:1c7f2541afc1 | 271 | //draw_banker_screen(); |
AlexFerrara | 6:a487ee40d30c | 272 | pb1.mode(PullUp); pb2.mode(PullUp); |
AlexFerrara | 6:a487ee40d30c | 273 | start_screen(); |
AlexFerrara | 6:a487ee40d30c | 274 | Case_Init(); |
AlexFerrara | 4:1c7f2541afc1 | 275 | stateTrigger = false; |
AlexFerrara | 4:1c7f2541afc1 | 276 | buttonValue = 0; |
AlexFerrara | 5:610461a90e3a | 277 | bool round1 = true; |
AlexFerrara | 4:1c7f2541afc1 | 278 | interrupt.mode(PullUp); |
AlexFerrara | 4:1c7f2541afc1 | 279 | interrupt.fall(&fallInterrupt); // Attach interrupt and its mode respectively. |
AlexFerrara | 4:1c7f2541afc1 | 280 | draw_case_grid(); |
AlexFerrara | 4:1c7f2541afc1 | 281 | while (1) { |
AlexFerrara | 6:a487ee40d30c | 282 | if(pb1 == 0) |
AlexFerrara | 6:a487ee40d30c | 283 | led1 = !led1; |
AlexFerrara | 6:a487ee40d30c | 284 | if(pb2 == 0) |
AlexFerrara | 6:a487ee40d30c | 285 | led2 = !led2; |
AlexFerrara | 6:a487ee40d30c | 286 | |
AlexFerrara | 6:a487ee40d30c | 287 | while(offer){ |
AlexFerrara | 6:a487ee40d30c | 288 | //wait for pb to update state as deal or no deal |
AlexFerrara | 6:a487ee40d30c | 289 | if(pb1 == 0 ) //deal |
AlexFerrara | 6:a487ee40d30c | 290 | { |
AlexFerrara | 6:a487ee40d30c | 291 | uLCD.locate(0,12); |
AlexFerrara | 6:a487ee40d30c | 292 | uLCD.printf("Congratulations, you have accepted the offer!"); |
AlexFerrara | 6:a487ee40d30c | 293 | } |
AlexFerrara | 6:a487ee40d30c | 294 | if(pb2 == 0 ) //no deal |
AlexFerrara | 6:a487ee40d30c | 295 | { |
AlexFerrara | 6:a487ee40d30c | 296 | offer=false; |
AlexFerrara | 6:a487ee40d30c | 297 | uLCD.locate(0,12); |
AlexFerrara | 6:a487ee40d30c | 298 | uLCD.printf("Offer declined. You won $%d",case_values[myCaseKeyCode]); |
AlexFerrara | 6:a487ee40d30c | 299 | uLCD.locate(0,14); |
AlexFerrara | 6:a487ee40d30c | 300 | uLCD.printf("from your case."); |
AlexFerrara | 6:a487ee40d30c | 301 | /*draw_case_grid(); |
AlexFerrara | 6:a487ee40d30c | 302 | stateTrigger == false; */ |
AlexFerrara | 6:a487ee40d30c | 303 | } |
AlexFerrara | 6:a487ee40d30c | 304 | } |
AlexFerrara | 4:1c7f2541afc1 | 305 | //Test for state change |
AlexFerrara | 6:a487ee40d30c | 306 | //led1=led2=1; |
AlexFerrara | 6:a487ee40d30c | 307 | //led3=led4=0; |
AlexFerrara | 4:1c7f2541afc1 | 308 | if (stateTrigger == true) { |
AlexFerrara | 6:a487ee40d30c | 309 | led1=led2=led3=led4=1; |
AlexFerrara | 6:a487ee40d30c | 310 | |
AlexFerrara | 6:a487ee40d30c | 311 | /*while(offer){ |
AlexFerrara | 6:a487ee40d30c | 312 | //wait for pb to update state as deal or no deal |
AlexFerrara | 6:a487ee40d30c | 313 | if(key_code == 8) //deal |
AlexFerrara | 6:a487ee40d30c | 314 | { |
AlexFerrara | 6:a487ee40d30c | 315 | uLCD.locate(0,13); |
AlexFerrara | 6:a487ee40d30c | 316 | uLCD.printf("Congratulations, you have accepted the offer"); |
AlexFerrara | 6:a487ee40d30c | 317 | stateTrigger == false; |
AlexFerrara | 6:a487ee40d30c | 318 | break; |
AlexFerrara | 6:a487ee40d30c | 319 | } |
AlexFerrara | 6:a487ee40d30c | 320 | if(key_code == 11 ) //no deal |
AlexFerrara | 6:a487ee40d30c | 321 | { |
AlexFerrara | 6:a487ee40d30c | 322 | offer=false; |
AlexFerrara | 6:a487ee40d30c | 323 | uLCD.cls(); |
AlexFerrara | 6:a487ee40d30c | 324 | draw_case_grid(); |
AlexFerrara | 6:a487ee40d30c | 325 | stateTrigger == false; |
AlexFerrara | 6:a487ee40d30c | 326 | break; |
AlexFerrara | 6:a487ee40d30c | 327 | } |
AlexFerrara | 6:a487ee40d30c | 328 | }*/ |
AlexFerrara | 6:a487ee40d30c | 329 | |
AlexFerrara | 6:a487ee40d30c | 330 | |
AlexFerrara | 6:a487ee40d30c | 331 | |
AlexFerrara | 6:a487ee40d30c | 332 | key_code=0; |
AlexFerrara | 4:1c7f2541afc1 | 333 | int i=0; |
AlexFerrara | 4:1c7f2541afc1 | 334 | int value=mpr121.read(0x00); |
AlexFerrara | 4:1c7f2541afc1 | 335 | value +=mpr121.read(0x01)<<8; |
AlexFerrara | 4:1c7f2541afc1 | 336 | // LED demo mod |
AlexFerrara | 4:1c7f2541afc1 | 337 | // puts key number out to LEDs for demo |
AlexFerrara | 4:1c7f2541afc1 | 338 | for (i=0; i<12; i++) { |
AlexFerrara | 4:1c7f2541afc1 | 339 | if (((value>>i)&0x01)==1) key_code=i; |
AlexFerrara | 4:1c7f2541afc1 | 340 | } |
AlexFerrara | 6:a487ee40d30c | 341 | current_value = case_values[key_code]; |
AlexFerrara | 4:1c7f2541afc1 | 342 | led4=key_code & 0x01; |
AlexFerrara | 4:1c7f2541afc1 | 343 | led3=(key_code>>1) & 0x01; |
AlexFerrara | 4:1c7f2541afc1 | 344 | led2=(key_code>>2) & 0x01; |
AlexFerrara | 4:1c7f2541afc1 | 345 | led1=(key_code>>3) & 0x01; |
AlexFerrara | 4:1c7f2541afc1 | 346 | |
AlexFerrara | 6:a487ee40d30c | 347 | |
AlexFerrara | 6:a487ee40d30c | 348 | /* if(offer && (key_code == 8) ) //deal |
AlexFerrara | 6:a487ee40d30c | 349 | { |
AlexFerrara | 6:a487ee40d30c | 350 | uLCD.locate(0,13); |
AlexFerrara | 6:a487ee40d30c | 351 | uLCD.printf("Congratulations, you have accepted the offer"); |
AlexFerrara | 6:a487ee40d30c | 352 | } |
AlexFerrara | 6:a487ee40d30c | 353 | if(offer && (key_code == 11) ) //no deal |
AlexFerrara | 6:a487ee40d30c | 354 | { |
AlexFerrara | 6:a487ee40d30c | 355 | offer=false; |
AlexFerrara | 6:a487ee40d30c | 356 | uLCD.cls(); |
AlexFerrara | 6:a487ee40d30c | 357 | draw_case_grid(); |
AlexFerrara | 6:a487ee40d30c | 358 | stateTrigger == false; |
AlexFerrara | 6:a487ee40d30c | 359 | } |
AlexFerrara | 6:a487ee40d30c | 360 | */ |
AlexFerrara | 5:610461a90e3a | 361 | if(round1){ |
AlexFerrara | 5:610461a90e3a | 362 | isCase[key_code] = true; |
AlexFerrara | 5:610461a90e3a | 363 | round1 = false; |
AlexFerrara | 6:a487ee40d30c | 364 | myCaseKeyCode = key_code; |
AlexFerrara | 5:610461a90e3a | 365 | } |
AlexFerrara | 5:610461a90e3a | 366 | else { |
AlexFerrara | 5:610461a90e3a | 367 | isOpen[key_code] = true; |
AlexFerrara | 6:a487ee40d30c | 368 | draw_grid_info(); |
AlexFerrara | 6:a487ee40d30c | 369 | /*wait(0.5); |
AlexFerrara | 6:a487ee40d30c | 370 | wave_file=fopen("/sd/case_opened.wav","r"); |
AlexFerrara | 6:a487ee40d30c | 371 | waver.play(wave_file); |
AlexFerrara | 6:a487ee40d30c | 372 | fclose(wave_file);*/ |
AlexFerrara | 6:a487ee40d30c | 373 | update_bank_table(); |
AlexFerrara | 6:a487ee40d30c | 374 | } |
AlexFerrara | 6:a487ee40d30c | 375 | draw_single_case(key_code+1); |
AlexFerrara | 6:a487ee40d30c | 376 | num_cases_to_pick -= 1; |
AlexFerrara | 6:a487ee40d30c | 377 | num_cases_picked += 1; |
AlexFerrara | 6:a487ee40d30c | 378 | if(num_cases_picked>1 && num_cases_to_pick == 0){ |
AlexFerrara | 6:a487ee40d30c | 379 | wait(2); |
AlexFerrara | 6:a487ee40d30c | 380 | uLCD.cls(); |
AlexFerrara | 6:a487ee40d30c | 381 | uLCD.set_sector_address(0x003B, 0x9041); |
AlexFerrara | 6:a487ee40d30c | 382 | uLCD.display_image(0,0); |
AlexFerrara | 6:a487ee40d30c | 383 | draw_banker_screen(); |
AlexFerrara | 5:610461a90e3a | 384 | } |
AlexFerrara | 5:610461a90e3a | 385 | |
AlexFerrara | 6:a487ee40d30c | 386 | //if(num_cases_picked == 1) |
AlexFerrara | 6:a487ee40d30c | 387 | // num_cases_to_pick = 4; |
AlexFerrara | 6:a487ee40d30c | 388 | if(num_cases_picked == 6) |
AlexFerrara | 6:a487ee40d30c | 389 | num_cases_to_pick = 3; |
AlexFerrara | 6:a487ee40d30c | 390 | else if(num_cases_picked == 8) |
AlexFerrara | 6:a487ee40d30c | 391 | num_cases_to_pick = 2; |
AlexFerrara | 6:a487ee40d30c | 392 | else if(num_cases_picked == 10) |
AlexFerrara | 6:a487ee40d30c | 393 | num_cases_to_pick = 1; |
AlexFerrara | 6:a487ee40d30c | 394 | else if(num_cases_picked == 11) |
AlexFerrara | 6:a487ee40d30c | 395 | num_cases_to_pick = 1; |
AlexFerrara | 6:a487ee40d30c | 396 | |
AlexFerrara | 4:1c7f2541afc1 | 397 | stateTrigger = false; //main is done, release interrupt handler for next button |
AlexFerrara | 4:1c7f2541afc1 | 398 | } |
AlexFerrara | 4:1c7f2541afc1 | 399 | }// while |
AlexFerrara | 4:1c7f2541afc1 | 400 | }// main |