Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:1de5b1ab5880, 2019-03-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |