Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem

Committer:
rushib1
Date:
Mon Apr 27 03:14:16 2020 +0000
Revision:
3:6e41a5ce16c2
Parent:
2:acd4656312d8
Child:
4:c1da839b41b1
Refactor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rushib1 0:5bb514318c64 1 #include "mbed.h"
rushib1 0:5bb514318c64 2 #include "uLCD_4DGL.h"
rushib1 0:5bb514318c64 3 #include "rgb.h"
rushib1 0:5bb514318c64 4 #include "SDFileSystem.h"
rushib1 0:5bb514318c64 5 #include "wave_player.h"
rushib1 0:5bb514318c64 6 #include "rtos.h"
rushib1 0:5bb514318c64 7
rushib1 0:5bb514318c64 8 #include <string>
rushib1 0:5bb514318c64 9 #include <iostream>
rushib1 0:5bb514318c64 10 #include <fstream>
rushib1 2:acd4656312d8 11 #include <algorithm>
rushib1 0:5bb514318c64 12
rushib1 3:6e41a5ce16c2 13 enum DIFF_LEVEL{NA=0, EASY=1, MED=2, HARD=3, SCORE=4};
rushib1 3:6e41a5ce16c2 14 enum SIGN{PLUS=0, MINUS=1, MULT=2};
rushib1 3:6e41a5ce16c2 15
rushib1 3:6e41a5ce16c2 16 struct Gen_Question{
rushib1 3:6e41a5ce16c2 17 int num1;
rushib1 3:6e41a5ce16c2 18 int num2;
rushib1 3:6e41a5ce16c2 19 int sign;
rushib1 3:6e41a5ce16c2 20 int corr_ans;
rushib1 3:6e41a5ce16c2 21 int ans[4];
rushib1 3:6e41a5ce16c2 22 };
rushib1 3:6e41a5ce16c2 23
rushib1 3:6e41a5ce16c2 24 struct Game_Difficulty{
rushib1 3:6e41a5ce16c2 25 bool is_selected;
rushib1 3:6e41a5ce16c2 26 enum DIFF_LEVEL level;
rushib1 3:6e41a5ce16c2 27 int ans_time;
rushib1 3:6e41a5ce16c2 28 int max_num;
rushib1 3:6e41a5ce16c2 29 int num_of_q;
rushib1 3:6e41a5ce16c2 30 int score_mult;
rushib1 3:6e41a5ce16c2 31 };
rushib1 3:6e41a5ce16c2 32
rushib1 3:6e41a5ce16c2 33 struct Game_Settings{
rushib1 3:6e41a5ce16c2 34 Game_Difficulty new_diff;
rushib1 3:6e41a5ce16c2 35 int score;
rushib1 3:6e41a5ce16c2 36 int live_left;
rushib1 3:6e41a5ce16c2 37 int q_on;
rushib1 3:6e41a5ce16c2 38 bool is_timeout;
rushib1 3:6e41a5ce16c2 39 bool is_lose;
rushib1 3:6e41a5ce16c2 40 };
rushib1 3:6e41a5ce16c2 41
rushib1 3:6e41a5ce16c2 42
rushib1 3:6e41a5ce16c2 43 Game_Settings new_game = {.q_on=1, .live_left = 3, .new_diff.is_selected=false, .is_timeout=true, .is_lose =false};
rushib1 3:6e41a5ce16c2 44
rushib1 3:6e41a5ce16c2 45
rushib1 3:6e41a5ce16c2 46 void print_high_score();
rushib1 3:6e41a5ce16c2 47 int* read_high_score();
rushib1 0:5bb514318c64 48
rushib1 0:5bb514318c64 49 /*
rushib1 0:5bb514318c64 50 ------------------CONSTS
rushib1 0:5bb514318c64 51 */
rushib1 3:6e41a5ce16c2 52 //const int EASY_TIME =20;
rushib1 3:6e41a5ce16c2 53 //const int MED_TIME =15;
rushib1 3:6e41a5ce16c2 54 //const int HARD_TIME =10;
rushib1 0:5bb514318c64 55
rushib1 0:5bb514318c64 56 volatile bool homescreen = true;
rushib1 0:5bb514318c64 57 volatile bool boot_vid = true;
rushib1 0:5bb514318c64 58
rushib1 0:5bb514318c64 59 /*
rushib1 0:5bb514318c64 60 ------------------I/O VARS
rushib1 0:5bb514318c64 61 */
rushib1 0:5bb514318c64 62 SDFileSystem sd(p5, p6, p7, p8, "sd");
rushib1 0:5bb514318c64 63 RawSerial bluemod(p28, p27);
rushib1 0:5bb514318c64 64 Serial pc(USBTX, USBRX);
rushib1 0:5bb514318c64 65 uLCD_4DGL uLCD(p9, p10, p11);
rushib1 0:5bb514318c64 66 DigitalIn pb(p12);
rushib1 0:5bb514318c64 67
rushib1 0:5bb514318c64 68 /*
rushib1 0:5bb514318c64 69 ------------------LED VARS
rushib1 0:5bb514318c64 70 */
rushib1 2:acd4656312d8 71
rushib1 2:acd4656312d8 72 DigitalOut life[] = {(p16), (p19), (p20)};
rushib1 0:5bb514318c64 73 RGBLed myRGBled(p21, p24, p23);
rushib1 0:5bb514318c64 74 DigitalOut onboard_led(LED1);
rushib1 0:5bb514318c64 75
rushib1 0:5bb514318c64 76 /*
rushib1 0:5bb514318c64 77 ------------------AUDIO VARS
rushib1 0:5bb514318c64 78 */
rushib1 0:5bb514318c64 79
rushib1 0:5bb514318c64 80 FILE *wave_file;
rushib1 0:5bb514318c64 81 AnalogOut DACount(p18);
rushib1 0:5bb514318c64 82 wave_player waver(&DACount);
rushib1 0:5bb514318c64 83
rushib1 0:5bb514318c64 84 /*
rushib1 0:5bb514318c64 85 ------------------GENERAL VARS
rushib1 0:5bb514318c64 86 */
rushib1 3:6e41a5ce16c2 87 volatile char bnum = '0';
rushib1 3:6e41a5ce16c2 88
rushib1 0:5bb514318c64 89
rushib1 0:5bb514318c64 90 Mutex lcd_mutex;
rushib1 0:5bb514318c64 91 Mutex blue_mutex;
rushib1 0:5bb514318c64 92 Thread thread1, thread2, thread3;
rushib1 0:5bb514318c64 93
rushib1 0:5bb514318c64 94 void main_screen()
rushib1 0:5bb514318c64 95 {
rushib1 3:6e41a5ce16c2 96 //pc.printf("MAIN_SCREEN\r\n");
rushib1 0:5bb514318c64 97 uLCD.cls();
rushib1 3:6e41a5ce16c2 98 uLCD.text_height(1);
rushib1 3:6e41a5ce16c2 99 uLCD.text_width(1);
rushib1 3:6e41a5ce16c2 100 uLCD.color(0xF0F6F7);
rushib1 0:5bb514318c64 101 uLCD.locate(6, 1);
rushib1 0:5bb514318c64 102 uLCD.printf("MATH FUN");
rushib1 0:5bb514318c64 103 uLCD.locate(1, 4);
rushib1 0:5bb514318c64 104 uLCD.printf("Difficulty");
rushib1 3:6e41a5ce16c2 105 uLCD.text_height(1);
rushib1 3:6e41a5ce16c2 106 uLCD.text_width(1);
rushib1 0:5bb514318c64 107 uLCD.locate(3, 6);
rushib1 0:5bb514318c64 108 uLCD.color(GREEN);
rushib1 0:5bb514318c64 109 uLCD.printf("1) Easy");
rushib1 0:5bb514318c64 110 uLCD.locate(3, 8);
rushib1 0:5bb514318c64 111 uLCD.color(0xFFFF00);
rushib1 0:5bb514318c64 112 uLCD.printf("2) Not as Easy");
rushib1 0:5bb514318c64 113 uLCD.locate(3, 10);
rushib1 0:5bb514318c64 114 uLCD.color(RED);
rushib1 0:5bb514318c64 115 uLCD.printf("3) Very Uneasy");
rushib1 3:6e41a5ce16c2 116 uLCD.color(0x669DB2);
rushib1 0:5bb514318c64 117 uLCD.locate(1, 13);
rushib1 0:5bb514318c64 118 uLCD.printf("4) High Scores");
rushib1 3:6e41a5ce16c2 119 uLCD.rectangle(0, 0, 127, 127, 0xA89C94);
rushib1 0:5bb514318c64 120 homescreen = false;
rushib1 0:5bb514318c64 121 }
rushib1 0:5bb514318c64 122
rushib1 2:acd4656312d8 123 bool count_distinct(int arr[], int n)
rushib1 2:acd4656312d8 124 {
rushib1 2:acd4656312d8 125 int res = 1;
rushib1 2:acd4656312d8 126 // Pick all elements one by one
rushib1 2:acd4656312d8 127 for (int i = 1; i < n; i++)
rushib1 2:acd4656312d8 128 {
rushib1 2:acd4656312d8 129 int j = 0;
rushib1 2:acd4656312d8 130 for (j = 0; j < i; j++)
rushib1 2:acd4656312d8 131 if (arr[i] == arr[j])
rushib1 2:acd4656312d8 132 break;
rushib1 3:6e41a5ce16c2 133 // If not printed earlier, then print it
rushib1 2:acd4656312d8 134 if (i == j)
rushib1 2:acd4656312d8 135 res++;
rushib1 0:5bb514318c64 136 }
rushib1 2:acd4656312d8 137 if (res == 4)
rushib1 2:acd4656312d8 138 {
rushib1 2:acd4656312d8 139 return false;
rushib1 2:acd4656312d8 140 }
rushib1 2:acd4656312d8 141 else
rushib1 2:acd4656312d8 142 {
rushib1 2:acd4656312d8 143 return true;
rushib1 2:acd4656312d8 144 }
rushib1 2:acd4656312d8 145 }
rushib1 0:5bb514318c64 146
rushib1 3:6e41a5ce16c2 147 void gen_ans(Gen_Question *gen_new_q)
rushib1 2:acd4656312d8 148 {
rushib1 3:6e41a5ce16c2 149 //rand()%(max-min + 1) + min;
rushib1 3:6e41a5ce16c2 150 gen_new_q->num1 = rand() % (new_game.new_diff.max_num + 1 - 0) + 0;
rushib1 3:6e41a5ce16c2 151 gen_new_q->num2 = rand() % (new_game.new_diff.max_num + 1 - 1) + 1;
rushib1 3:6e41a5ce16c2 152 gen_new_q->sign = rand() % (3 + 1 - 1) + 1;
rushib1 3:6e41a5ce16c2 153
rushib1 3:6e41a5ce16c2 154 switch (gen_new_q->sign)
rushib1 2:acd4656312d8 155 {
rushib1 2:acd4656312d8 156 case 1:
rushib1 3:6e41a5ce16c2 157 gen_new_q->sign = '*';
rushib1 3:6e41a5ce16c2 158 gen_new_q->ans[0] = gen_new_q->num1 * gen_new_q->num2;
rushib1 3:6e41a5ce16c2 159 gen_new_q->ans[1] = (gen_new_q->num1 + (rand() % (10 + 1 - 1) + 1)) * gen_new_q->num2;
rushib1 3:6e41a5ce16c2 160 gen_new_q->ans[2] = (gen_new_q->num1 * gen_new_q->num2) + (rand() % (20 + 1 - 1) + 1);
rushib1 3:6e41a5ce16c2 161 gen_new_q->ans[3] = (gen_new_q->num1 * gen_new_q->num2) + (rand() % (20 + 1 - 1) + 1);
rushib1 2:acd4656312d8 162 break;
rushib1 2:acd4656312d8 163 case 2:
rushib1 3:6e41a5ce16c2 164 gen_new_q->sign = '+';
rushib1 3:6e41a5ce16c2 165 gen_new_q->ans[0] = gen_new_q->num1 + gen_new_q->num2;
rushib1 3:6e41a5ce16c2 166 gen_new_q->ans[1] = (gen_new_q->num1 + (rand() % (10 + 1 - 1) + 1)) + gen_new_q->num2;
rushib1 3:6e41a5ce16c2 167 gen_new_q->ans[2] = (gen_new_q->num1 + gen_new_q->num2) - (rand() % ((gen_new_q->num1 + gen_new_q->num2) + 1 - 1) + 1);
rushib1 3:6e41a5ce16c2 168 gen_new_q->ans[3] = (gen_new_q->num1 * gen_new_q->num2) + (rand() % (10 + 1 - 1) + 1);
rushib1 2:acd4656312d8 169 break;
rushib1 2:acd4656312d8 170 case 3:
rushib1 3:6e41a5ce16c2 171 gen_new_q->sign = '-';
rushib1 3:6e41a5ce16c2 172 while (gen_new_q->num1 == gen_new_q->num2)
rushib1 2:acd4656312d8 173 {
rushib1 3:6e41a5ce16c2 174 gen_new_q->num1 = (rand() % ((gen_new_q->num1 + 2) - 1 + 1) + 1);
rushib1 0:5bb514318c64 175 }
rushib1 3:6e41a5ce16c2 176 gen_new_q->ans[0] = gen_new_q->num1 - gen_new_q->num2;
rushib1 3:6e41a5ce16c2 177 gen_new_q->ans[1] = (gen_new_q->num1 - gen_new_q->num2) * -1 + (rand() % (10 + 1 - 1) + 1);
rushib1 3:6e41a5ce16c2 178 gen_new_q->ans[2] = gen_new_q->num1 + gen_new_q->num2 - (rand() % (10 + 1 - 1) + 1);
rushib1 3:6e41a5ce16c2 179 gen_new_q->ans[3] = gen_new_q->num1 * gen_new_q->num2 - (rand() % (20 + 1 - 1) + 1);
rushib1 2:acd4656312d8 180 break;
rushib1 2:acd4656312d8 181 }
rushib1 0:5bb514318c64 182 }
rushib1 0:5bb514318c64 183
rushib1 3:6e41a5ce16c2 184 void game_questions(Gen_Question *gen_new_q)
rushib1 0:5bb514318c64 185 {
rushib1 3:6e41a5ce16c2 186 gen_ans(gen_new_q);
rushib1 3:6e41a5ce16c2 187 bool reroll = count_distinct(gen_new_q->ans, 4);
rushib1 2:acd4656312d8 188 while (reroll)
rushib1 2:acd4656312d8 189 {
rushib1 3:6e41a5ce16c2 190 gen_ans(gen_new_q);
rushib1 3:6e41a5ce16c2 191 reroll = count_distinct(gen_new_q->ans, 4);
rushib1 2:acd4656312d8 192 //pc.printf("reroll\r\n");
rushib1 0:5bb514318c64 193 }
rushib1 2:acd4656312d8 194
rushib1 3:6e41a5ce16c2 195 gen_new_q->corr_ans = gen_new_q->ans[0];
rushib1 3:6e41a5ce16c2 196 //pc.printf("%i\r\n", gen_new_q->ans[0]);
rushib1 3:6e41a5ce16c2 197 //pc.printf("%i\r\n", gen_new_q->corr_ans);
rushib1 3:6e41a5ce16c2 198 random_shuffle(&(gen_new_q->ans[0]), &(gen_new_q->ans[3]));
rushib1 0:5bb514318c64 199 uLCD.cls();
rushib1 0:5bb514318c64 200 uLCD.locate(2, 1);
rushib1 0:5bb514318c64 201 uLCD.text_height(2);
rushib1 0:5bb514318c64 202 uLCD.text_width(2);
rushib1 0:5bb514318c64 203 uLCD.color(0xFC766A);
rushib1 3:6e41a5ce16c2 204 uLCD.printf("Q%i",new_game.q_on);
rushib1 0:5bb514318c64 205 uLCD.text_height(1);
rushib1 0:5bb514318c64 206 uLCD.text_width(1);
rushib1 0:5bb514318c64 207
rushib1 2:acd4656312d8 208 uLCD.locate(9, 1);
rushib1 2:acd4656312d8 209 uLCD.printf("TIME:");
rushib1 2:acd4656312d8 210 uLCD.line(55, 0, 55, 27, 0xA89C94);
rushib1 2:acd4656312d8 211
rushib1 0:5bb514318c64 212 uLCD.rectangle(0, 0, 127, 127, 0xA89C94);
rushib1 0:5bb514318c64 213 uLCD.line(0, 27, 127, 27, 0xA89C94);
rushib1 2:acd4656312d8 214 uLCD.line(0, 50, 127, 50, 0xA89C94);
rushib1 0:5bb514318c64 215
rushib1 0:5bb514318c64 216 uLCD.color(0x669DB2);
rushib1 0:5bb514318c64 217 uLCD.locate(2, 4);
rushib1 0:5bb514318c64 218 uLCD.text_height(2);
rushib1 0:5bb514318c64 219 uLCD.text_width(2);
rushib1 3:6e41a5ce16c2 220 uLCD.printf("%i%c%i=", gen_new_q->num1, gen_new_q->sign, gen_new_q->num2);
rushib1 0:5bb514318c64 221 uLCD.text_height(1);
rushib1 0:5bb514318c64 222 uLCD.text_width(1);
rushib1 0:5bb514318c64 223
rushib1 0:5bb514318c64 224 uLCD.color(0xFC766A);
rushib1 2:acd4656312d8 225 uLCD.locate(2, 7);
rushib1 0:5bb514318c64 226 uLCD.printf("1)");
rushib1 0:5bb514318c64 227
rushib1 0:5bb514318c64 228 uLCD.color(0x669DB2);
rushib1 2:acd4656312d8 229 uLCD.locate(8, 7);
rushib1 3:6e41a5ce16c2 230 uLCD.printf("%i", gen_new_q->ans[0]);
rushib1 0:5bb514318c64 231
rushib1 0:5bb514318c64 232 uLCD.color(0xFC766A);
rushib1 2:acd4656312d8 233 uLCD.locate(2, 9);
rushib1 0:5bb514318c64 234 uLCD.printf("2)");
rushib1 0:5bb514318c64 235
rushib1 0:5bb514318c64 236 uLCD.color(0x669DB2);
rushib1 2:acd4656312d8 237 uLCD.locate(8, 9);
rushib1 3:6e41a5ce16c2 238 uLCD.printf("%i", gen_new_q->ans[1]);
rushib1 0:5bb514318c64 239
rushib1 0:5bb514318c64 240 uLCD.color(0xFC766A);
rushib1 2:acd4656312d8 241 uLCD.locate(2, 11);
rushib1 0:5bb514318c64 242 uLCD.printf("3)");
rushib1 0:5bb514318c64 243
rushib1 0:5bb514318c64 244 uLCD.color(0x669DB2);
rushib1 2:acd4656312d8 245 uLCD.locate(8, 11);
rushib1 3:6e41a5ce16c2 246 uLCD.printf("%i", gen_new_q->ans[2]);
rushib1 0:5bb514318c64 247
rushib1 0:5bb514318c64 248 uLCD.color(0xFC766A);
rushib1 2:acd4656312d8 249 uLCD.locate(2, 13);
rushib1 0:5bb514318c64 250 uLCD.printf("4)");
rushib1 0:5bb514318c64 251
rushib1 0:5bb514318c64 252 uLCD.color(0x669DB2);
rushib1 2:acd4656312d8 253 uLCD.locate(8, 13);
rushib1 3:6e41a5ce16c2 254 uLCD.printf("%i", gen_new_q->ans[3]);
rushib1 0:5bb514318c64 255
rushib1 2:acd4656312d8 256 uLCD.line(0, 115, 127, 115, 0xA89C94);
rushib1 2:acd4656312d8 257 }
rushib1 3:6e41a5ce16c2 258
rushib1 2:acd4656312d8 259 void game_over()
rushib1 2:acd4656312d8 260 {
rushib1 2:acd4656312d8 261 uLCD.cls();
rushib1 2:acd4656312d8 262 uLCD.locate(0, 7);
rushib1 2:acd4656312d8 263 uLCD.text_height(2);
rushib1 2:acd4656312d8 264 uLCD.text_width(2);
rushib1 2:acd4656312d8 265 uLCD.color(0xFC776A);
rushib1 2:acd4656312d8 266 uLCD.printf("GAME OVER");
rushib1 3:6e41a5ce16c2 267 uLCD.rectangle(0, 0, 127, 127, 0xA89C94);
rushib1 3:6e41a5ce16c2 268 }
rushib1 3:6e41a5ce16c2 269
rushib1 3:6e41a5ce16c2 270 void win_game()
rushib1 3:6e41a5ce16c2 271 {
rushib1 3:6e41a5ce16c2 272 uLCD.cls();
rushib1 3:6e41a5ce16c2 273 uLCD.locate(2, 7);
rushib1 3:6e41a5ce16c2 274 uLCD.text_height(2);
rushib1 3:6e41a5ce16c2 275 uLCD.text_width(2);
rushib1 3:6e41a5ce16c2 276 uLCD.color(GREEN);
rushib1 3:6e41a5ce16c2 277 uLCD.printf("YOU WIN");
rushib1 3:6e41a5ce16c2 278 uLCD.rectangle(0, 0, 127, 127, 0xA89C94);
rushib1 3:6e41a5ce16c2 279
rushib1 3:6e41a5ce16c2 280 }
rushib1 3:6e41a5ce16c2 281
rushib1 3:6e41a5ce16c2 282 void score_game()
rushib1 3:6e41a5ce16c2 283 {
rushib1 3:6e41a5ce16c2 284 uLCD.cls();
rushib1 3:6e41a5ce16c2 285 uLCD.locate(1, 3);
rushib1 3:6e41a5ce16c2 286 uLCD.text_height(2);
rushib1 3:6e41a5ce16c2 287 uLCD.text_width(2);
rushib1 3:6e41a5ce16c2 288 uLCD.color(GREEN);
rushib1 3:6e41a5ce16c2 289 uLCD.printf("SCORE");
rushib1 3:6e41a5ce16c2 290 uLCD.rectangle(0, 0, 127, 127, 0xA89C94);
rushib1 3:6e41a5ce16c2 291 uLCD.text_height(1);
rushib1 3:6e41a5ce16c2 292 uLCD.text_width(1);
rushib1 3:6e41a5ce16c2 293 uLCD.locate(7, 7);
rushib1 3:6e41a5ce16c2 294 uLCD.printf("%i",new_game.score);
rushib1 2:acd4656312d8 295 }
rushib1 2:acd4656312d8 296
rushib1 2:acd4656312d8 297 void life_count_check()
rushib1 2:acd4656312d8 298 {
rushib1 2:acd4656312d8 299 life[0] = 0;
rushib1 2:acd4656312d8 300 life[1] = 0;
rushib1 2:acd4656312d8 301 life[2] = 0;
rushib1 2:acd4656312d8 302
rushib1 3:6e41a5ce16c2 303 for (int i = 0; i < new_game.live_left; i++)
rushib1 2:acd4656312d8 304 {
rushib1 2:acd4656312d8 305 life[i] = 1;
rushib1 2:acd4656312d8 306 }
rushib1 3:6e41a5ce16c2 307 if (new_game.live_left == 0)
rushib1 2:acd4656312d8 308 {
rushib1 3:6e41a5ce16c2 309 new_game.is_lose = true;
rushib1 3:6e41a5ce16c2 310
rushib1 2:acd4656312d8 311 }
rushib1 0:5bb514318c64 312 }
rushib1 0:5bb514318c64 313
rushib1 3:6e41a5ce16c2 314 void check_correct_ans(Gen_Question check_new_q)
rushib1 0:5bb514318c64 315 {
rushib1 3:6e41a5ce16c2 316 if (new_game.is_timeout)
rushib1 0:5bb514318c64 317 {
rushib1 2:acd4656312d8 318 //pc.printf("TIMEOUT\r\n");
rushib1 2:acd4656312d8 319 uLCD.cls();
rushib1 2:acd4656312d8 320 uLCD.locate(5, 7);
rushib1 2:acd4656312d8 321 uLCD.text_height(2);
rushib1 2:acd4656312d8 322 uLCD.text_width(2);
rushib1 2:acd4656312d8 323 uLCD.color(0xF0F6F7);
rushib1 2:acd4656312d8 324 uLCD.printf("TIME");
rushib1 3:6e41a5ce16c2 325 new_game.live_left--;
rushib1 2:acd4656312d8 326 //wait(2);
rushib1 2:acd4656312d8 327 }
rushib1 2:acd4656312d8 328 else
rushib1 2:acd4656312d8 329 {
rushib1 2:acd4656312d8 330 //pc.printf("%i\r\n", corr_ans);
rushib1 2:acd4656312d8 331 //pc.printf("%i\r\n", ans[(bnum-'0' -1)]);
rushib1 2:acd4656312d8 332
rushib1 3:6e41a5ce16c2 333 if (check_new_q.corr_ans == check_new_q.ans[(bnum - '0') - 1])
rushib1 0:5bb514318c64 334 {
rushib1 0:5bb514318c64 335
rushib1 2:acd4656312d8 336 uLCD.cls();
rushib1 2:acd4656312d8 337 uLCD.locate(2, 7);
rushib1 2:acd4656312d8 338 uLCD.text_height(2);
rushib1 2:acd4656312d8 339 uLCD.text_width(2);
rushib1 2:acd4656312d8 340 uLCD.color(GREEN);
rushib1 2:acd4656312d8 341 uLCD.printf("CORRECT");
rushib1 3:6e41a5ce16c2 342 new_game.score = new_game.score + new_game.new_diff.score_mult;
rushib1 2:acd4656312d8 343 //wait(2);
rushib1 2:acd4656312d8 344 //pc.printf("CORRECT\r\n");
rushib1 2:acd4656312d8 345 }
rushib1 2:acd4656312d8 346 else
rushib1 2:acd4656312d8 347 {
rushib1 2:acd4656312d8 348 //pc.printf("INCORRECT\r\n");
rushib1 2:acd4656312d8 349 uLCD.cls();
rushib1 2:acd4656312d8 350 uLCD.locate(0, 7);
rushib1 2:acd4656312d8 351 uLCD.text_height(2);
rushib1 2:acd4656312d8 352 uLCD.text_width(2);
rushib1 2:acd4656312d8 353 uLCD.color(RED);
rushib1 2:acd4656312d8 354 uLCD.printf("INCORRECT");
rushib1 3:6e41a5ce16c2 355 new_game.live_left--;
rushib1 2:acd4656312d8 356 //wait(2);
rushib1 2:acd4656312d8 357 }
rushib1 2:acd4656312d8 358 }
rushib1 2:acd4656312d8 359 }
rushib1 2:acd4656312d8 360
rushib1 2:acd4656312d8 361
rushib1 2:acd4656312d8 362 bool get_bluetooth_button()
rushib1 2:acd4656312d8 363 {
rushib1 3:6e41a5ce16c2 364 //pc.printf("BLUETOOTH\r\n");
rushib1 3:6e41a5ce16c2 365 bnum = '0';
rushib1 3:6e41a5ce16c2 366 //blue_mutex.lock();
rushib1 2:acd4656312d8 367 if (bluemod.getc() == '!')
rushib1 2:acd4656312d8 368 {
rushib1 2:acd4656312d8 369 if (bluemod.getc() == 'B')
rushib1 2:acd4656312d8 370 {
rushib1 2:acd4656312d8 371 //button number
rushib1 2:acd4656312d8 372 bnum = bluemod.getc();
rushib1 2:acd4656312d8 373 //button data
rushib1 2:acd4656312d8 374 char bhit = bluemod.getc();
rushib1 2:acd4656312d8 375 if (bluemod.getc() == char(~('!' + 'B' + bnum + bhit)))
rushib1 0:5bb514318c64 376 {
rushib1 2:acd4656312d8 377 if (bhit == '1')
rushib1 0:5bb514318c64 378 {
rushib1 3:6e41a5ce16c2 379 //pc.printf("%c\r\n", bnum);
rushib1 2:acd4656312d8 380 blue_mutex.unlock();
rushib1 2:acd4656312d8 381 return false;
rushib1 0:5bb514318c64 382 }
rushib1 2:acd4656312d8 383 }
rushib1 2:acd4656312d8 384 }
rushib1 2:acd4656312d8 385 }
rushib1 3:6e41a5ce16c2 386 //blue_mutex.unlock();
rushib1 2:acd4656312d8 387 return true;
rushib1 2:acd4656312d8 388 }
rushib1 2:acd4656312d8 389
rushib1 2:acd4656312d8 390 void get_button()
rushib1 2:acd4656312d8 391 {
rushib1 3:6e41a5ce16c2 392 int timer = new_game.new_diff.ans_time;
rushib1 3:6e41a5ce16c2 393 new_game.is_timeout = true;
rushib1 2:acd4656312d8 394 while (timer != 0)
rushib1 2:acd4656312d8 395 {
rushib1 2:acd4656312d8 396 uLCD.locate(15, 1);
rushib1 2:acd4656312d8 397 uLCD.color(0xF0F6F7);
rushib1 2:acd4656312d8 398 uLCD.printf("%i", timer);
rushib1 2:acd4656312d8 399 if (bluemod.readable())
rushib1 2:acd4656312d8 400 {
rushib1 3:6e41a5ce16c2 401 new_game.is_timeout = get_bluetooth_button();
rushib1 3:6e41a5ce16c2 402 if(new_game.is_timeout == false){
rushib1 2:acd4656312d8 403 break;
rushib1 0:5bb514318c64 404 }
rushib1 0:5bb514318c64 405 }
rushib1 2:acd4656312d8 406 wait(1);
rushib1 2:acd4656312d8 407 uLCD.locate(15, 1);
rushib1 2:acd4656312d8 408 uLCD.color(BLACK);
rushib1 2:acd4656312d8 409 uLCD.printf("%i", timer);
rushib1 2:acd4656312d8 410 timer = timer - 1;
rushib1 3:6e41a5ce16c2 411
rushib1 2:acd4656312d8 412 }
rushib1 2:acd4656312d8 413 }
rushib1 2:acd4656312d8 414
rushib1 2:acd4656312d8 415 void bluetooth_thread()
rushib1 2:acd4656312d8 416 {
rushib1 2:acd4656312d8 417 while (true)
rushib1 2:acd4656312d8 418 {
rushib1 2:acd4656312d8 419 if (bluemod.readable())
rushib1 2:acd4656312d8 420 {
rushib1 2:acd4656312d8 421 bool n_timeout = get_bluetooth_button();
rushib1 2:acd4656312d8 422 }
rushib1 2:acd4656312d8 423 else
rushib1 2:acd4656312d8 424 {
rushib1 2:acd4656312d8 425 Thread::yield();
rushib1 2:acd4656312d8 426 }
rushib1 2:acd4656312d8 427 Thread::wait(100);
rushib1 0:5bb514318c64 428 }
rushib1 0:5bb514318c64 429 }
rushib1 0:5bb514318c64 430
rushib1 0:5bb514318c64 431 void rgb_led_difficulty()
rushib1 0:5bb514318c64 432 {
rushib1 3:6e41a5ce16c2 433 //pc.printf("%i\r\n",bnum - 48);
rushib1 3:6e41a5ce16c2 434 new_game.new_diff.level = static_cast<DIFF_LEVEL>(bnum - 48);
rushib1 3:6e41a5ce16c2 435 //pc.printf("%i\r\n",new_game.new_diff.level);
rushib1 3:6e41a5ce16c2 436 if (new_game.new_diff.level == EASY)
rushib1 0:5bb514318c64 437 {
rushib1 0:5bb514318c64 438 myRGBled.write(0.0, 1.0, 0.0); //green
rushib1 3:6e41a5ce16c2 439 new_game.new_diff.is_selected = true;
rushib1 3:6e41a5ce16c2 440 new_game.new_diff.ans_time = 20;
rushib1 3:6e41a5ce16c2 441 new_game.new_diff.max_num = 10;
rushib1 3:6e41a5ce16c2 442 new_game.new_diff.num_of_q = 7; // 7
rushib1 3:6e41a5ce16c2 443 new_game.score = 50;
rushib1 3:6e41a5ce16c2 444 new_game.new_diff.score_mult = 10;
rushib1 0:5bb514318c64 445 }
rushib1 3:6e41a5ce16c2 446 else if (new_game.new_diff.level == MED)
rushib1 0:5bb514318c64 447 {
rushib1 0:5bb514318c64 448 myRGBled.write(1.0, 0.2, 0.0); //yellow = red + some green
rushib1 3:6e41a5ce16c2 449 new_game.new_diff.is_selected = true;
rushib1 3:6e41a5ce16c2 450 new_game.new_diff.ans_time = 15;
rushib1 3:6e41a5ce16c2 451 new_game.new_diff.max_num = 15;
rushib1 3:6e41a5ce16c2 452 new_game.new_diff.num_of_q = 10;
rushib1 3:6e41a5ce16c2 453 new_game.score = 200;
rushib1 3:6e41a5ce16c2 454 new_game.new_diff.score_mult = 50;
rushib1 0:5bb514318c64 455 }
rushib1 3:6e41a5ce16c2 456 else if (new_game.new_diff.level == HARD)
rushib1 0:5bb514318c64 457 {
rushib1 0:5bb514318c64 458 myRGBled.write(1.0, 0.0, 0.0); //red
rushib1 3:6e41a5ce16c2 459 new_game.new_diff.is_selected = true;
rushib1 3:6e41a5ce16c2 460 new_game.new_diff.ans_time = 10;
rushib1 3:6e41a5ce16c2 461 new_game.new_diff.max_num = 10;
rushib1 3:6e41a5ce16c2 462 new_game.new_diff.num_of_q = 15;
rushib1 3:6e41a5ce16c2 463 new_game.score = 300;
rushib1 3:6e41a5ce16c2 464 new_game.new_diff.score_mult = 100;
rushib1 3:6e41a5ce16c2 465 }
rushib1 3:6e41a5ce16c2 466 else if (new_game.new_diff.level == SCORE)
rushib1 3:6e41a5ce16c2 467 {
rushib1 3:6e41a5ce16c2 468 myRGBled.write(0.5, 0.5, 0.5);
rushib1 3:6e41a5ce16c2 469 new_game.new_diff.is_selected = true;
rushib1 3:6e41a5ce16c2 470 print_high_score();
rushib1 0:5bb514318c64 471 }
rushib1 0:5bb514318c64 472 }
rushib1 0:5bb514318c64 473
rushib1 0:5bb514318c64 474 void wav_thread()
rushib1 0:5bb514318c64 475 {
rushib1 0:5bb514318c64 476 while (true)
rushib1 0:5bb514318c64 477 {
rushib1 3:6e41a5ce16c2 478 //pc.printf("AUDIO\r\n");
rushib1 0:5bb514318c64 479 wave_file = fopen("/sd/audio/intro.wav", "r");
rushib1 0:5bb514318c64 480 waver.play(wave_file);
rushib1 0:5bb514318c64 481 fclose(wave_file);
rushib1 0:5bb514318c64 482 }
rushib1 0:5bb514318c64 483 }
rushib1 0:5bb514318c64 484
rushib1 0:5bb514318c64 485 void boot_video_thread()
rushib1 0:5bb514318c64 486 {
rushib1 0:5bb514318c64 487 while (true)
rushib1 0:5bb514318c64 488 {
rushib1 2:acd4656312d8 489 //pc.printf("BootVID\r\n");
rushib1 0:5bb514318c64 490 //PLAY VIDEO BOOT
rushib1 0:5bb514318c64 491 if (boot_vid)
rushib1 0:5bb514318c64 492 {
rushib1 0:5bb514318c64 493 //lcd_mutex.lock();
rushib1 0:5bb514318c64 494 uLCD.media_init();
rushib1 0:5bb514318c64 495 uLCD.set_sector_address(0x0, 0x0);
rushib1 0:5bb514318c64 496 uLCD.display_video(0, 0);
rushib1 0:5bb514318c64 497 boot_vid = false;
rushib1 0:5bb514318c64 498 //lcd_mutex.unlock();
rushib1 0:5bb514318c64 499 }
rushib1 0:5bb514318c64 500 else
rushib1 0:5bb514318c64 501 {
rushib1 0:5bb514318c64 502 Thread::yield();
rushib1 0:5bb514318c64 503 }
rushib1 0:5bb514318c64 504 }
rushib1 0:5bb514318c64 505 }
rushib1 0:5bb514318c64 506
rushib1 3:6e41a5ce16c2 507 void write_high_score(int* score_arr){
rushib1 3:6e41a5ce16c2 508 std::ofstream score_file;
rushib1 3:6e41a5ce16c2 509 score_file.open("/sd/score/score.txt");
rushib1 3:6e41a5ce16c2 510 if (score_file.is_open())
rushib1 3:6e41a5ce16c2 511 {
rushib1 3:6e41a5ce16c2 512 //score_file << "300\n200\n100\n";
rushib1 3:6e41a5ce16c2 513 score_file << score_arr[0] << "\n" << score_arr[1] << "\n" << score_arr[2] << "\n";
rushib1 3:6e41a5ce16c2 514 score_file.close();
rushib1 3:6e41a5ce16c2 515 }
rushib1 3:6e41a5ce16c2 516 }
rushib1 3:6e41a5ce16c2 517
rushib1 3:6e41a5ce16c2 518
rushib1 3:6e41a5ce16c2 519 int* read_high_score()
rushib1 3:6e41a5ce16c2 520 {
rushib1 3:6e41a5ce16c2 521 int* score_val = new int[3];
rushib1 3:6e41a5ce16c2 522 //printf("read_high_score\n\r");
rushib1 3:6e41a5ce16c2 523 std::ifstream infile("/sd/score/score.txt");
rushib1 3:6e41a5ce16c2 524 wait(0.2);
rushib1 3:6e41a5ce16c2 525 if (infile.is_open())
rushib1 3:6e41a5ce16c2 526 {
rushib1 3:6e41a5ce16c2 527 std::string line;
rushib1 3:6e41a5ce16c2 528 int i = 0;
rushib1 3:6e41a5ce16c2 529 while (std::getline(infile, line)) {
rushib1 3:6e41a5ce16c2 530 // using printf() in all tests for consistency
rushib1 3:6e41a5ce16c2 531 //printf("%s", line.c_str());
rushib1 3:6e41a5ce16c2 532 score_val[i] = atoi(line.c_str());
rushib1 3:6e41a5ce16c2 533 i++;
rushib1 3:6e41a5ce16c2 534 }
rushib1 3:6e41a5ce16c2 535 infile.close();
rushib1 3:6e41a5ce16c2 536 }
rushib1 3:6e41a5ce16c2 537 pc.printf("%i \n\r", score_val[0]);
rushib1 3:6e41a5ce16c2 538 pc.printf("%i \n\r", score_val[1]);
rushib1 3:6e41a5ce16c2 539 pc.printf("%i \n\r", score_val[2]);
rushib1 3:6e41a5ce16c2 540
rushib1 3:6e41a5ce16c2 541 return score_val;
rushib1 3:6e41a5ce16c2 542 }
rushib1 3:6e41a5ce16c2 543
rushib1 3:6e41a5ce16c2 544 void print_high_score(){
rushib1 3:6e41a5ce16c2 545
rushib1 3:6e41a5ce16c2 546 int* score_arr= read_high_score();
rushib1 3:6e41a5ce16c2 547
rushib1 3:6e41a5ce16c2 548 uLCD.cls();
rushib1 3:6e41a5ce16c2 549 uLCD.text_height(1);
rushib1 3:6e41a5ce16c2 550 uLCD.text_width(1);
rushib1 3:6e41a5ce16c2 551 uLCD.color(0xF0F6F7);
rushib1 3:6e41a5ce16c2 552 uLCD.locate(4, 1);
rushib1 3:6e41a5ce16c2 553 uLCD.printf("HIGH SCORES");
rushib1 3:6e41a5ce16c2 554 uLCD.locate(3, 6);
rushib1 3:6e41a5ce16c2 555 uLCD.color(0xFC776A);
rushib1 3:6e41a5ce16c2 556 uLCD.printf("1) %i", score_arr[0]);
rushib1 3:6e41a5ce16c2 557 uLCD.locate(3, 8);
rushib1 3:6e41a5ce16c2 558 uLCD.color(0x669DB2);
rushib1 3:6e41a5ce16c2 559 uLCD.printf("2) %i", score_arr[1]);
rushib1 3:6e41a5ce16c2 560 uLCD.locate(3, 10);
rushib1 3:6e41a5ce16c2 561 uLCD.color(0xFC776A);
rushib1 3:6e41a5ce16c2 562 uLCD.printf("3) %i", score_arr[2]);
rushib1 3:6e41a5ce16c2 563 uLCD.rectangle(0, 0, 127, 127, 0xA89C94);
rushib1 3:6e41a5ce16c2 564 delete[] score_arr;
rushib1 3:6e41a5ce16c2 565 }
rushib1 3:6e41a5ce16c2 566
rushib1 3:6e41a5ce16c2 567 void check_new_highscore(){
rushib1 3:6e41a5ce16c2 568 int* new_score_arr = read_high_score();
rushib1 3:6e41a5ce16c2 569 for (int i = 0; i < 3; i++)
rushib1 3:6e41a5ce16c2 570 {
rushib1 3:6e41a5ce16c2 571 if (new_score_arr[i]< new_game.score){
rushib1 3:6e41a5ce16c2 572 int j = i;
rushib1 3:6e41a5ce16c2 573 while(j<2){
rushib1 3:6e41a5ce16c2 574 new_score_arr[j+1] = new_score_arr[j];
rushib1 3:6e41a5ce16c2 575 j++;
rushib1 3:6e41a5ce16c2 576 }
rushib1 3:6e41a5ce16c2 577 new_score_arr[i] = new_game.score;
rushib1 3:6e41a5ce16c2 578 pc.printf("high score found");
rushib1 3:6e41a5ce16c2 579 write_high_score(new_score_arr);
rushib1 3:6e41a5ce16c2 580 break;
rushib1 3:6e41a5ce16c2 581 }
rushib1 3:6e41a5ce16c2 582 }
rushib1 3:6e41a5ce16c2 583 delete[] new_score_arr;
rushib1 3:6e41a5ce16c2 584 }
rushib1 3:6e41a5ce16c2 585
rushib1 3:6e41a5ce16c2 586 void reset_scores(){
rushib1 3:6e41a5ce16c2 587 mkdir("/sd/score", 0777);
rushib1 3:6e41a5ce16c2 588 std::ofstream score_file;
rushib1 3:6e41a5ce16c2 589 score_file.open("/sd/score/score.txt");
rushib1 3:6e41a5ce16c2 590 if (score_file.is_open())
rushib1 3:6e41a5ce16c2 591 {
rushib1 3:6e41a5ce16c2 592 score_file << "0\n0\n0\n";
rushib1 3:6e41a5ce16c2 593 score_file.close();
rushib1 3:6e41a5ce16c2 594 }
rushib1 3:6e41a5ce16c2 595 }
rushib1 3:6e41a5ce16c2 596
rushib1 2:acd4656312d8 597 void init()
rushib1 2:acd4656312d8 598 {
rushib1 3:6e41a5ce16c2 599 // while(1){
rushib1 3:6e41a5ce16c2 600 // reset_scores();
rushib1 3:6e41a5ce16c2 601 // wait(2);
rushib1 3:6e41a5ce16c2 602 // }
rushib1 2:acd4656312d8 603 uLCD.baudrate(3000000);
rushib1 2:acd4656312d8 604 srand(time(NULL));
rushib1 2:acd4656312d8 605 life[0] = 1;
rushib1 2:acd4656312d8 606 life[1] = 1;
rushib1 2:acd4656312d8 607 life[2] = 1;
rushib1 3:6e41a5ce16c2 608 //thread1.start(boot_video_thread);
rushib1 3:6e41a5ce16c2 609 boot_vid = false;
rushib1 2:acd4656312d8 610 }
rushib1 2:acd4656312d8 611
rushib1 3:6e41a5ce16c2 612
rushib1 0:5bb514318c64 613 int main()
rushib1 0:5bb514318c64 614 {
rushib1 2:acd4656312d8 615 init();
rushib1 3:6e41a5ce16c2 616 // pc.printf("MAIN_INIT\r\n\n");
rushib1 0:5bb514318c64 617 thread2.start(wav_thread);
rushib1 0:5bb514318c64 618 while (true)
rushib1 0:5bb514318c64 619 {
rushib1 0:5bb514318c64 620 //pc.printf("MAIN_LOOP\r\n");
rushib1 0:5bb514318c64 621 //ONCE VIDEO STOPS PLAYING
rushib1 0:5bb514318c64 622 if (boot_vid == false)
rushib1 0:5bb514318c64 623 {
rushib1 0:5bb514318c64 624 thread1.terminate();
rushib1 0:5bb514318c64 625 //IF HOMESCREEN PRINTED ONCE DONT PRINT AGAIN
rushib1 0:5bb514318c64 626 if (homescreen)
rushib1 0:5bb514318c64 627 {
rushib1 0:5bb514318c64 628 main_screen();
rushib1 0:5bb514318c64 629 }
rushib1 0:5bb514318c64 630 //pc.printf("MAIN_PRINT\r\n");
rushib1 3:6e41a5ce16c2 631 if (new_game.new_diff.is_selected == false)
rushib1 0:5bb514318c64 632 {
rushib1 2:acd4656312d8 633 thread3.start(bluetooth_thread);
rushib1 0:5bb514318c64 634 rgb_led_difficulty();
rushib1 0:5bb514318c64 635 }
rushib1 2:acd4656312d8 636 else
rushib1 2:acd4656312d8 637 {
rushib1 0:5bb514318c64 638 thread3.terminate();
rushib1 2:acd4656312d8 639 break;
rushib1 0:5bb514318c64 640 }
rushib1 0:5bb514318c64 641 }
rushib1 3:6e41a5ce16c2 642 Thread::wait(100);
rushib1 0:5bb514318c64 643 }
rushib1 3:6e41a5ce16c2 644 if(new_game.new_diff.level != SCORE){
rushib1 3:6e41a5ce16c2 645 while (new_game.q_on <= new_game.new_diff.num_of_q)
rushib1 3:6e41a5ce16c2 646 {
rushib1 3:6e41a5ce16c2 647 thread3.terminate();
rushib1 3:6e41a5ce16c2 648 Gen_Question new_q;
rushib1 3:6e41a5ce16c2 649 game_questions(&new_q);
rushib1 3:6e41a5ce16c2 650 get_button();
rushib1 3:6e41a5ce16c2 651 check_correct_ans(new_q);
rushib1 3:6e41a5ce16c2 652 new_game.q_on++;
rushib1 3:6e41a5ce16c2 653 wait(2.2);
rushib1 3:6e41a5ce16c2 654 life_count_check();
rushib1 3:6e41a5ce16c2 655 if(new_game.is_lose == true){
rushib1 3:6e41a5ce16c2 656 game_over();
rushib1 3:6e41a5ce16c2 657 break;
rushib1 3:6e41a5ce16c2 658 }
rushib1 3:6e41a5ce16c2 659 }
rushib1 3:6e41a5ce16c2 660 if(new_game.is_lose == false){
rushib1 3:6e41a5ce16c2 661 win_game();
rushib1 3:6e41a5ce16c2 662 }
rushib1 3:6e41a5ce16c2 663 wait(2.5);
rushib1 3:6e41a5ce16c2 664 new_game.score = new_game.score + new_game.live_left * 100;
rushib1 3:6e41a5ce16c2 665 score_game();
rushib1 2:acd4656312d8 666 wait(2);
rushib1 3:6e41a5ce16c2 667 check_new_highscore();
rushib1 3:6e41a5ce16c2 668 wait(0.5);
rushib1 3:6e41a5ce16c2 669 print_high_score();
rushib1 2:acd4656312d8 670 }
rushib1 2:acd4656312d8 671 }