4180 Project Master Code
Dependencies: mbed 4DGL-uLCD-SE
Diff: main.cpp
- Revision:
- 0:65ed62dbfeee
diff -r 000000000000 -r 65ed62dbfeee main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Apr 23 18:51:38 2019 +0000 @@ -0,0 +1,442 @@ +#include "mbed.h" +#include "uLCD_4DGL.h" +#include "questions.h" + +DigitalOut myled1(LED1); // leds for debugging +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut myled4(LED4); + +DigitalOut lidar_enable(p29); //to determine when lidar should operate + +DigitalIn p1_enable(p23); // data from player 1 +BusIn p1_ans(p22, p21); + +DigitalIn p2_enable(p18); // data from player 2 +BusIn p2_ans(p19, p20); + +uLCD_4DGL uLCD(p13, p14, p12); + +Serial pc(USBTX,USBRX); // for teraterm debugging + +PwmOut speaker(p26); + +int msg; +int msg2; +int questionIndex = 0; +string *p; +int player = 0; + +int player1Score = 0; +int player2Score = 0; + +int p1Val = 0; +int p2Val = 0; + +questions arr[30]; + +// Light +class RGBLed +{ +public: + RGBLed(PinName redpin, PinName greenpin)://, PinName bluepin); + _redpin(redpin), _greenpin(greenpin) //, _bluepin(bluepin) + { + //50Hz PWM clock default a bit too low, go to 2000Hz (less flicker) + _redpin.period(0.0005); + } + + void write(float red,float green)//, float blue); + { + _redpin = red; + _greenpin = green; +// _bluepin = blue; + } +private: + PwmOut _redpin; + PwmOut _greenpin; +// PwmOut _bluepin; +}; + + +//class could be moved to include file + + +//Setup RGB led using PWM pins and class +RGBLed myRGBled(p24,p25);//,p21); //RGB PWM pins + +void shuffleQuestions() +{ + for (int i = 0; i < 90; i++) { + int rand1 = rand() % 30; + int rand2 = rand() % 30; + questions temp = arr[rand1]; + arr[rand1] = arr[rand2]; + arr[rand2] = temp; + } +} + +void addQuestions() +{ + questions q1("Which of these\nchess figures is\nclosely related to'Bohemian\nRhapsody?\n","King","Queen","Pawn","Bishop","Queen"); + questions q2("What religion is\nthe most practicedone in India?\n","Sikhism","Islam","Hinduism","Shinto","Hinduism"); + questions q3("What is the name\nof the Jewish New\nYear?\n","Yom Kippur","Kwanzaa","Hanukkah","Rosh Hashanah","Rosh Hashanah"); + questions q4("What funk/soul\nband was Lionel\nRichie a member\nof?\n","Commodores","Amigas","Ataris","Spectrums","Commodores"); + questions q5("Which country\nhosted the Summer\nOlympics in 2016?\n","Greece","Brazil","China","Spain","Brazil"); + questions q6("Which of these\ncities is closest\nto London, UK?\n","Boston, MA","Miami, FL","Atlanta, GA","New York, NY","Boston, MA"); + questions q7("What did Alfred\nNobel Develop?\n","Atomic bomb","Nobelium","Gunpowder","Dynamite","Dynamite"); + questions q8("Which US Presidentis on the far leftof the Mount\nRushmore\nNational\nMemorial?\n","Theodore\n Roosevelt","Thomas\n Jefferson","George\n Washington","Abraham\n Lincoln","George\n Washington"); + questions q9("Which actress\nplays a major\nrole in the TV\nshow 'The Big\nBang Theory'\n","Portia de\n Rossi","Kaley Cuoco","Emily\n Deschanel","Sofia Vergara","Kaley Cuoco"); + questions q10("Which of these\nantagonist\ncharacters was\ncreated by\nnovelist J.K.\nRowling?\n","Professor\n Moriarty","Lord Voldemort","Darth Vader","Lord Farqaad","Lord Voldemort"); + questions q11("Which mammal firstreached Earth's\norbit alive?\n","Monkey","Human","Cat","Dog","Dog"); + questions q12("How many spaces\nare on a standard\nmonopoly board?\n","40","20","80","60","40"); + questions q13("Which actor does\nnot appear in\n'Saving Private\nRyan'?\n","Tom Hanks","Vin Diesel","Giovanni\n Ribisi","Ralph Fiennes","Ralph Fiennes"); + questions q14("Which city's\nlandmard include:\nThe Pantheon, The\nSpanish Steps and\nTrevi Fountain?\n","Rome","Athens","Istanbul","Barcelone","Rome"); + questions q15("How many blue\nstripes does the\nUnited States of\nAmerica national\nflag have?\n","13","6","0","7","0"); + questions q16("Which of these\ncountries was not\na Soviet Republic\nin USSR?\n","Moldova","Serbia","Kyrgyzstan","Azerbaijan","Serbia"); + questions q17("What temperature\nis the same in\nCelsius and\nFahrenheit?\n","0","-40","+100","+40","-40"); + questions q18("What is the name\nof the boxer whoselife story is\ndepicted in the\n1999 movie 'The\nHurricane'?\n","Rubin Carter","Jake LaMotta","Muhammad Ali","Rocky Marciano","Rubin Carter"); + questions q19("Adele performed\nthe theme song to\nwhich James Bond\nfilm?\n","Casino Royale","From Russia\n With Love","Quantum of\n Solace","Skyfall","Skyfall"); + questions q20("What restaurant\nfranchise advises\nyou to 'Eat\nFresh'?\n","Subway","McDonald's","KFC","Taco Bell","Subway"); + questions q21("In which language\nwas the book 'War\nand Peace' originally written?\n", "Russian","English","French","German","Russian"); + questions q22("Which movie was\nthe first to win\n11 Academy\nAwards?\n","Sound of Music","La La Land","Ben-Hur","Titanic","Ben-Hur"); + questions q23("What is the\nlargest country,\nby area, that has\nonly one time\nzone?\n", "China","Russia","Australia","Turkey","China"); + questions q24("Which truck is\nproduced by the\nFord Motor\nCompany?\n", "Silverado 1500","CR-V","F-150","RAV4","F-150"); + questions q25("What is the\nlargest planet in our Solar System?\n","Pluto","Earth","Saturn","Jupiter","Jupiter"); + questions q26("Other than eggs,\nwhat is a primary\ningredient in\nEggs Florentine?\n", "Avocado","Gorgonzola","Spinach","Ham","Spinach"); + questions q27("According to\nPersian folklore,\nwho is the\nstoryteller of\n'One Thousand and\nOne Nights'?\n","Kanaan","Hatshepsut","Homer","Scheherazade","Scheherazade"); + questions q28("Which of these\nNBA franchises\nhas never signed\nLeBron James?\n", "Miami Heat","Los Angeles\n Lakers","Cleveland\n Cavaliers","Boston Celtics","Boston Celtics"); + questions q29("What is the color\nof Donald Duck's\nbowtie?\n","Yellow","Green","Red","Blue","Red"); + questions q30("What was the\nfirst successful\nvaccine developed\nin history?\n","Smallpox","Rabies","Cholera","Scarlet Fever","Smallpox"); + + arr[0] = q1; + arr[1] = q2; + arr[2] = q3; + arr[3] = q4; + arr[4] = q5; + arr[5] = q6; + arr[6] = q7; + arr[7] = q8; + arr[8] = q9; + arr[9] = q10; + arr[10] = q11; + arr[11] = q12; + arr[12] = q13; + arr[13] = q14; + arr[14] = q15; + arr[15] = q16; + arr[16] = q17; + arr[17] = q18; + arr[18] = q19; + arr[19] = q20; + arr[20] = q21; + arr[21] = q22; + arr[22] = q23; + arr[23] = q24; + arr[24] = q25; + arr[25] = q26; + arr[26] = q27; + arr[27] = q28; + arr[28] = q29; + arr[29] = q30; +} + +void readQuestion() +{ + arr[questionIndex].shuffleOptions(); + //uLCD.cls(); + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf(arr[questionIndex].getQuestion().c_str()); + p = arr[questionIndex].getAllOptions(); + uLCD.printf("\n1: "); + uLCD.printf((*(p)).c_str()); + uLCD.printf("\n2: "); + uLCD.printf((*(p+1)).c_str()); + uLCD.printf("\n3: "); + uLCD.printf((*(p+2)).c_str()); + uLCD.printf("\n4: "); + uLCD.printf((*(p+3)).c_str()); +} + +int main() +{ + uLCD.baudrate(3000000); // lcd settings + randomize questions + srand(time(NULL)); + addQuestions(); + shuffleQuestions(); + uLCD.display_control(PORTRAIT); + + while(1) { + if (questionIndex == 30) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); //game over + win screen + uLCD.locate(0,0); + uLCD.printf("The game is over;"); + wait(2); + uLCD.locate(0,2); + uLCD.printf("Player 1: %d", player1Score); + uLCD.locate(0,4); + uLCD.printf("Player 2: %d", player2Score); + wait(3); + // gameover.... + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(1,6); + if (player1Score > player2Score) { + uLCD.printf("PLAYER 1 WINS!!!"); + } else if (player1Score < player2Score) { + uLCD.printf("PLAYER 2 WINS!!!"); + } else { + uLCD.locate(3,6); + uLCD.printf("IT'S A TIE!!!"); + } + } else { + readQuestion(); //print questions + lidar_enable = 1; // tell players that lidar can now work as buzzer + } + while ((!p1Val)&&(!p2Val)) { + msg = -1; + msg2 = -1; + + if (p1_enable) { //if player 1 is ready + p1Val = p1_enable; + myled1 = !myled1; + msg = (p1_ans + 1); //answer from player mbeds + 1 to make it numbers between 1-4 + while (msg < 1); + //checking if answer is right + if (msg == 1) { + if ((*(p)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score++; + p1Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score--; + p1Val = 1; + break; + } + } else if (msg == 2) { + if ((*(p+1)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0);// 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score++; + p1Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score--; + p1Val = 1; + break; + } + } else if (msg == 3) { + if ((*(p+2)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score++; + p1Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score--; + p1Val = 1; + break; + } + } else if (msg == 4) { + if ((*(p+3)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score++; + p1Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player1Score--; + p1Val = 1; + break; + } + } + } else if (p2_enable) { + p2Val = p2_enable; + myled2 = !myled2; + msg2 = (p2_ans + 1); + while (msg2 < 1); + if (msg2 == 1) { + if ((*(p)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + player2Score++; + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + p2Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score--; + p2Val = 1; + break; + } + } else if (msg2 == 2) { + if ((*(p+1)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score++; + p2Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score--; + p2Val = 1; + break; + } + } else if (msg2 == 3) { + if ((*(p+2)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score++; + p2Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score--; + p2Val = 1; + break; + } + } else if (msg2 == 4) { + if ((*(p+3)).compare(arr[questionIndex].getCorrectAnswer()) == 0) { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Correct"); + myRGBled.write(0.0,1.0); + speaker.period(1.0/1000.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score++; + p2Val = 1; + break; + } else { + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Incorrect"); + myRGBled.write(1.0,0.0); + speaker.period(1.0/500.0); // 500hz period + speaker =0.5; + wait(1); + speaker =0.0; + player2Score--; + p2Val = 1; + break; + } + } + } + } + //reset all values + wait(3); + p1Val = 0; + p2Val = 0; + myled1 = 0; + myled2 = 0; + msg = -1; + msg2 = -1; + lidar_enable = 0; + myRGBled.write(0.0,0.0); + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + uLCD.locate(0,0); + uLCD.printf("Player 1: %d", player1Score); + uLCD.locate(0,2); + uLCD.printf("Player 2: %d", player2Score); + wait(2); + uLCD.filled_rectangle(0, 0, 130, 130, BLACK); + questionIndex++; + } +}