Leonardo Sarra / Mbed OS iot_exercise_1
Committer:
LithiumSR
Date:
Fri Mar 01 00:34:27 2019 +0000
Revision:
3:1de5b1ab5880
Parent:
2:293f6bc54643
Child:
4:979929c6d0b7
Prevent illegal access of memory

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:66a70b507959 1 #include "main.h"
marcozecchini 0:66a70b507959 2 /*
marcozecchini 0:66a70b507959 3 * Auxiliary functions
marcozecchini 0:66a70b507959 4 */
LithiumSR 2:293f6bc54643 5 using namespace std;
LithiumSR 2:293f6bc54643 6 Serial pc(SERIAL_TX, SERIAL_RX);
LithiumSR 2:293f6bc54643 7 Thread thread;
LithiumSR 2:293f6bc54643 8 DigitalOut led1(LED1);
LithiumSR 2:293f6bc54643 9 InterruptIn mybutton(USER_BUTTON);
LithiumSR 2:293f6bc54643 10 Timeout timeout;
LithiumSR 2:293f6bc54643 11 bool running = false;
LithiumSR 2:293f6bc54643 12 bool game_progress = false;
LithiumSR 2:293f6bc54643 13 bool timeout_triggered = false;
LithiumSR 2:293f6bc54643 14
LithiumSR 2:293f6bc54643 15
LithiumSR 2:293f6bc54643 16 void led1_thread() {
LithiumSR 2:293f6bc54643 17 while (running) {
LithiumSR 2:293f6bc54643 18 while(game_progress) {
LithiumSR 2:293f6bc54643 19 led1 = !led1;
LithiumSR 2:293f6bc54643 20 wait(1);
LithiumSR 2:293f6bc54643 21 }
LithiumSR 2:293f6bc54643 22 }
LithiumSR 2:293f6bc54643 23 }
LithiumSR 2:293f6bc54643 24
LithiumSR 2:293f6bc54643 25 void time_expired(){
LithiumSR 2:293f6bc54643 26 timeout_triggered = true;
LithiumSR 2:293f6bc54643 27 timeout.detach();
LithiumSR 2:293f6bc54643 28 }
LithiumSR 2:293f6bc54643 29
LithiumSR 2:293f6bc54643 30 int _get_number_users(string received) {
LithiumSR 2:293f6bc54643 31 if (received[received.length()-1] == '!') {
LithiumSR 2:293f6bc54643 32 char* tmp = &received[received.find("!")-1];
LithiumSR 2:293f6bc54643 33 return atoi(tmp);
LithiumSR 2:293f6bc54643 34 }
LithiumSR 2:293f6bc54643 35 return -1;
LithiumSR 2:293f6bc54643 36 }
LithiumSR 2:293f6bc54643 37
LithiumSR 2:293f6bc54643 38 int get_number_users(){
LithiumSR 2:293f6bc54643 39 int response = -1;
LithiumSR 2:293f6bc54643 40 string stash = "";
LithiumSR 2:293f6bc54643 41 while(1){
LithiumSR 2:293f6bc54643 42 // Get number of players
LithiumSR 2:293f6bc54643 43 if (pc.readable()){
LithiumSR 2:293f6bc54643 44 char got=pc.getc();
LithiumSR 2:293f6bc54643 45 stash = stash + got;
LithiumSR 2:293f6bc54643 46 response = _get_number_users(stash);
LithiumSR 2:293f6bc54643 47 if (response != -1) {
LithiumSR 2:293f6bc54643 48 pc.printf("Starting match with %d users\n", response);
LithiumSR 2:293f6bc54643 49 return response;
LithiumSR 2:293f6bc54643 50 }
LithiumSR 2:293f6bc54643 51 }
LithiumSR 2:293f6bc54643 52 }
LithiumSR 2:293f6bc54643 53 }
LithiumSR 2:293f6bc54643 54
LithiumSR 2:293f6bc54643 55 int get_answer(){
LithiumSR 2:293f6bc54643 56 while(1){
LithiumSR 2:293f6bc54643 57 if (pc.readable()){
LithiumSR 2:293f6bc54643 58 timeout_triggered = false;
LithiumSR 2:293f6bc54643 59 return pc.getc();
LithiumSR 2:293f6bc54643 60 } else if (timeout_triggered) {
LithiumSR 2:293f6bc54643 61 timeout_triggered = false;
LithiumSR 2:293f6bc54643 62 return 0;
LithiumSR 2:293f6bc54643 63 }
LithiumSR 2:293f6bc54643 64 }
LithiumSR 2:293f6bc54643 65 }
LithiumSR 2:293f6bc54643 66
marcozecchini 0:66a70b507959 67 string readline_questions(){
marcozecchini 0:66a70b507959 68 size_t pos = questions.find("!");
marcozecchini 0:66a70b507959 69 string buffer = questions.substr(0, pos);
marcozecchini 0:66a70b507959 70 read_questions += buffer;
marcozecchini 0:66a70b507959 71 questions = questions.substr(pos+1);
LithiumSR 2:293f6bc54643 72 return buffer;
LithiumSR 2:293f6bc54643 73 }
LithiumSR 2:293f6bc54643 74
LithiumSR 2:293f6bc54643 75
LithiumSR 2:293f6bc54643 76 void delay(){
LithiumSR 2:293f6bc54643 77 printf("Timeout!");
LithiumSR 2:293f6bc54643 78 wait(30);
LithiumSR 2:293f6bc54643 79 }
marcozecchini 0:66a70b507959 80
LithiumSR 2:293f6bc54643 81
LithiumSR 2:293f6bc54643 82
LithiumSR 2:293f6bc54643 83 vector<string> get_answers_vector(string question){
LithiumSR 2:293f6bc54643 84 char buf[question.length()+1];
LithiumSR 2:293f6bc54643 85 sprintf(buf, "%s", question.c_str());
LithiumSR 2:293f6bc54643 86 vector <string> answers;
LithiumSR 2:293f6bc54643 87 char * pch = strtok(buf, ";");
LithiumSR 2:293f6bc54643 88 while (pch != NULL) {
LithiumSR 2:293f6bc54643 89 answers.push_back(std::string(pch));
LithiumSR 2:293f6bc54643 90 pch = strtok(NULL, ";");
LithiumSR 2:293f6bc54643 91 }
LithiumSR 2:293f6bc54643 92 return answers;
LithiumSR 2:293f6bc54643 93 }
LithiumSR 2:293f6bc54643 94
LithiumSR 2:293f6bc54643 95 void print_score(std::map<int, int> map){
LithiumSR 2:293f6bc54643 96 for(std::map<int,int>::iterator it = map.begin(); it != map.end(); ++it) printf("User %d - Score: %d\n",it->first, it->second);
marcozecchini 0:66a70b507959 97 }
marcozecchini 0:66a70b507959 98
LithiumSR 2:293f6bc54643 99 void start_game(){
LithiumSR 2:293f6bc54643 100 int users = -1, user=0;
LithiumSR 2:293f6bc54643 101 int round = 0;
LithiumSR 2:293f6bc54643 102 std::map<int, int> map;
LithiumSR 2:293f6bc54643 103 string stash = "";
LithiumSR 2:293f6bc54643 104 while(1){
LithiumSR 2:293f6bc54643 105 mybutton.fall(&delay);
LithiumSR 2:293f6bc54643 106 if (users == -1) users = get_number_users();
LithiumSR 2:293f6bc54643 107 // Propose questions
LithiumSR 2:293f6bc54643 108 else{
LithiumSR 2:293f6bc54643 109 map[user];
LithiumSR 2:293f6bc54643 110 mybutton.fall(NULL);
LithiumSR 2:293f6bc54643 111 string domanda = readline_questions();
LithiumSR 2:293f6bc54643 112 if(domanda=="\0") {
LithiumSR 2:293f6bc54643 113 printf("No questions avaialable!\n");
LithiumSR 2:293f6bc54643 114 print_score(map);
LithiumSR 2:293f6bc54643 115 break;
LithiumSR 2:293f6bc54643 116 }
LithiumSR 2:293f6bc54643 117 game_progress = true;
LithiumSR 2:293f6bc54643 118 vector<string> ret = get_answers_vector(domanda);
LithiumSR 2:293f6bc54643 119 printf("%s\n",ret.at(0).c_str());
LithiumSR 2:293f6bc54643 120 string correct_answer = ret.at(1);
LithiumSR 2:293f6bc54643 121 ret.erase(ret.begin());
LithiumSR 2:293f6bc54643 122 std::random_shuffle(ret.begin(),ret.end());
LithiumSR 2:293f6bc54643 123
LithiumSR 2:293f6bc54643 124 // Print shuffled answers
LithiumSR 2:293f6bc54643 125 for (std::vector<string>::const_iterator i = ret.begin(); i != ret.end(); ++i) printf("%s",(*i).c_str());
LithiumSR 2:293f6bc54643 126 printf("\n");
LithiumSR 2:293f6bc54643 127 timeout.attach(&time_expired, 10.0);
LithiumSR 2:293f6bc54643 128 int answer = get_answer();
LithiumSR 3:1de5b1ab5880 129 if (answer!=0 && ret.size()<answer) answer = 0;
LithiumSR 2:293f6bc54643 130 printf("Your answer: %d\n",answer);
LithiumSR 2:293f6bc54643 131 if (answer!=0 && ret.at(--answer)==correct_answer) {
LithiumSR 2:293f6bc54643 132 printf("CORRECT!\n");
LithiumSR 2:293f6bc54643 133 map[user]++;
LithiumSR 2:293f6bc54643 134 }
LithiumSR 2:293f6bc54643 135 else printf("WRONG!\n");
LithiumSR 2:293f6bc54643 136 game_progress = false;
LithiumSR 2:293f6bc54643 137 user++;
LithiumSR 2:293f6bc54643 138 if (user == users) {
LithiumSR 2:293f6bc54643 139 user=0;
LithiumSR 2:293f6bc54643 140 round++;
LithiumSR 2:293f6bc54643 141 }
LithiumSR 2:293f6bc54643 142 }
marcozecchini 0:66a70b507959 143
LithiumSR 2:293f6bc54643 144 // Check if game has ended
LithiumSR 2:293f6bc54643 145 if(round==TURN){
LithiumSR 2:293f6bc54643 146 printf("Game has ended\n");
LithiumSR 2:293f6bc54643 147 print_score(map);
LithiumSR 2:293f6bc54643 148 break;
LithiumSR 2:293f6bc54643 149 }
LithiumSR 2:293f6bc54643 150 }
LithiumSR 2:293f6bc54643 151 }
LithiumSR 2:293f6bc54643 152
marcozecchini 0:66a70b507959 153 int main()
marcozecchini 0:66a70b507959 154 {
LithiumSR 2:293f6bc54643 155 running = true;
LithiumSR 2:293f6bc54643 156 printf("Insert number of users (using ASCII)\n");
LithiumSR 2:293f6bc54643 157 thread.start(led1_thread);
LithiumSR 2:293f6bc54643 158 start_game();
LithiumSR 2:293f6bc54643 159 running = false;
LithiumSR 2:293f6bc54643 160 }