Miniproject of ECE4180
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
main.cpp@2:346250dedcb6, 2015-03-11 (annotated)
- Committer:
- lzzcd001
- Date:
- Wed Mar 11 21:11:38 2015 +0000
- Revision:
- 2:346250dedcb6
- Parent:
- 1:9465d72db54f
random seed based on time
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lzzcd001 | 0:9e4f9c949728 | 1 | #include "mbed.h" |
lzzcd001 | 0:9e4f9c949728 | 2 | #include "rtos.h" |
lzzcd001 | 0:9e4f9c949728 | 3 | #include "uLCD_4DGL.h" |
lzzcd001 | 1:9465d72db54f | 4 | #include <vector> |
lzzcd001 | 2:346250dedcb6 | 5 | #include <stdlib.h> |
lzzcd001 | 2:346250dedcb6 | 6 | #include <time.h> |
lzzcd001 | 0:9e4f9c949728 | 7 | |
lzzcd001 | 0:9e4f9c949728 | 8 | DigitalIn yes(p5); |
lzzcd001 | 0:9e4f9c949728 | 9 | DigitalIn no(p6); |
lzzcd001 | 0:9e4f9c949728 | 10 | uLCD_4DGL lcd(p28, p27, p30); |
lzzcd001 | 0:9e4f9c949728 | 11 | Mutex mutex; |
lzzcd001 | 0:9e4f9c949728 | 12 | LocalFileSystem local("local"); |
lzzcd001 | 0:9e4f9c949728 | 13 | |
lzzcd001 | 0:9e4f9c949728 | 14 | void setup() |
lzzcd001 | 0:9e4f9c949728 | 15 | { |
lzzcd001 | 0:9e4f9c949728 | 16 | lcd.baudrate(3000000); |
lzzcd001 | 0:9e4f9c949728 | 17 | lcd.background_color(0); |
lzzcd001 | 0:9e4f9c949728 | 18 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 19 | lcd.text_width(3); //4X size text |
lzzcd001 | 0:9e4f9c949728 | 20 | lcd.text_height(3); |
lzzcd001 | 0:9e4f9c949728 | 21 | //lcd.printf("Initializing..."); |
lzzcd001 | 0:9e4f9c949728 | 22 | lcd.text_string("Initializing...", 0,0,FONT_8X12,BLUE); |
lzzcd001 | 0:9e4f9c949728 | 23 | } |
lzzcd001 | 0:9e4f9c949728 | 24 | |
lzzcd001 | 0:9e4f9c949728 | 25 | void timer(void const *in) { |
lzzcd001 | 0:9e4f9c949728 | 26 | int* timeNo = (int*) in; |
lzzcd001 | 0:9e4f9c949728 | 27 | lcd.filled_rectangle(0,90,100,95,RED); |
lzzcd001 | 0:9e4f9c949728 | 28 | for (int i = 10; i>=0; i--) { |
lzzcd001 | 0:9e4f9c949728 | 29 | mutex.lock(); |
lzzcd001 | 1:9465d72db54f | 30 | lcd.locate(8,10); |
lzzcd001 | 0:9e4f9c949728 | 31 | lcd.printf("00:%02d", i); |
lzzcd001 | 0:9e4f9c949728 | 32 | lcd.filled_rectangle(i*10,90,(i+1)*10,95,BLACK); |
lzzcd001 | 0:9e4f9c949728 | 33 | mutex.unlock(); |
lzzcd001 | 0:9e4f9c949728 | 34 | Thread::wait(1000); |
lzzcd001 | 0:9e4f9c949728 | 35 | } |
lzzcd001 | 0:9e4f9c949728 | 36 | *timeNo = 0; |
lzzcd001 | 0:9e4f9c949728 | 37 | } |
lzzcd001 | 0:9e4f9c949728 | 38 | |
lzzcd001 | 0:9e4f9c949728 | 39 | int main() { |
lzzcd001 | 0:9e4f9c949728 | 40 | yes.mode(PullUp); |
lzzcd001 | 0:9e4f9c949728 | 41 | no.mode(PullUp); |
lzzcd001 | 0:9e4f9c949728 | 42 | lcd.baudrate(3000000); |
lzzcd001 | 0:9e4f9c949728 | 43 | lcd.background_color(0); |
lzzcd001 | 0:9e4f9c949728 | 44 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 45 | lcd.color(WHITE); |
lzzcd001 | 0:9e4f9c949728 | 46 | |
lzzcd001 | 0:9e4f9c949728 | 47 | lcd.printf("Initializing..."); |
lzzcd001 | 0:9e4f9c949728 | 48 | int answer = 1; |
lzzcd001 | 0:9e4f9c949728 | 49 | bool flag = false; |
lzzcd001 | 0:9e4f9c949728 | 50 | int response = -1; |
lzzcd001 | 0:9e4f9c949728 | 51 | int score = 0; |
lzzcd001 | 2:346250dedcb6 | 52 | int time_count; |
lzzcd001 | 2:346250dedcb6 | 53 | int* timePointer = &time_count; |
lzzcd001 | 0:9e4f9c949728 | 54 | int question_no = 0; |
lzzcd001 | 0:9e4f9c949728 | 55 | bool endFlag = false; |
lzzcd001 | 0:9e4f9c949728 | 56 | char* question = (char*) malloc(sizeof(char) * 150+1);; |
lzzcd001 | 0:9e4f9c949728 | 57 | char* answerStr = (char*) malloc(sizeof(char)+1);; |
lzzcd001 | 0:9e4f9c949728 | 58 | wait(2); |
lzzcd001 | 0:9e4f9c949728 | 59 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 60 | lcd.printf("press to start"); |
lzzcd001 | 0:9e4f9c949728 | 61 | while (yes == true && no == true) {} |
lzzcd001 | 0:9e4f9c949728 | 62 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 63 | lcd.printf("Quiz starts"); |
lzzcd001 | 0:9e4f9c949728 | 64 | wait(2); |
lzzcd001 | 0:9e4f9c949728 | 65 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 66 | lcd.printf("Ready"); |
lzzcd001 | 0:9e4f9c949728 | 67 | wait(2); |
lzzcd001 | 1:9465d72db54f | 68 | //=========================== |
lzzcd001 | 1:9465d72db54f | 69 | int total_no_questions = 10; |
lzzcd001 | 1:9465d72db54f | 70 | vector<int> question_inds(total_no_questions); |
lzzcd001 | 1:9465d72db54f | 71 | for (int i=0; i<total_no_questions; i++) { |
lzzcd001 | 1:9465d72db54f | 72 | question_inds[i] = i; |
lzzcd001 | 0:9e4f9c949728 | 73 | } |
lzzcd001 | 1:9465d72db54f | 74 | int randind; |
lzzcd001 | 1:9465d72db54f | 75 | int rand_no; |
lzzcd001 | 1:9465d72db54f | 76 | |
lzzcd001 | 1:9465d72db54f | 77 | int max_question_no = 5; // maximum_number; assert it smaller than total_no_questions!!! |
lzzcd001 | 1:9465d72db54f | 78 | //============================ |
lzzcd001 | 0:9e4f9c949728 | 79 | while (!endFlag) { |
lzzcd001 | 1:9465d72db54f | 80 | if (question_no == max_question_no) { |
lzzcd001 | 0:9e4f9c949728 | 81 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 82 | lcd.printf("Quiz ends"); |
lzzcd001 | 0:9e4f9c949728 | 83 | wait(2); |
lzzcd001 | 0:9e4f9c949728 | 84 | endFlag = true; |
lzzcd001 | 0:9e4f9c949728 | 85 | break; |
lzzcd001 | 0:9e4f9c949728 | 86 | } |
lzzcd001 | 2:346250dedcb6 | 87 | srand(time(NULL)); |
lzzcd001 | 1:9465d72db54f | 88 | randind = (rand() % total_no_questions); |
lzzcd001 | 1:9465d72db54f | 89 | total_no_questions--; |
lzzcd001 | 1:9465d72db54f | 90 | rand_no = question_inds[randind]; |
lzzcd001 | 1:9465d72db54f | 91 | question_inds.erase(question_inds.begin() + randind); |
lzzcd001 | 1:9465d72db54f | 92 | char file_name[100]; |
lzzcd001 | 1:9465d72db54f | 93 | char no_str[1]; |
lzzcd001 | 1:9465d72db54f | 94 | char txt[4]; |
lzzcd001 | 1:9465d72db54f | 95 | sprintf(no_str, "%d",rand_no); |
lzzcd001 | 1:9465d72db54f | 96 | sprintf(txt, "%s", ".txt"); |
lzzcd001 | 1:9465d72db54f | 97 | strcpy(file_name, "/local/test"); |
lzzcd001 | 1:9465d72db54f | 98 | strncat(file_name, no_str,10); |
lzzcd001 | 1:9465d72db54f | 99 | strncat(file_name, txt,10); |
lzzcd001 | 1:9465d72db54f | 100 | FILE *f = fopen(file_name , "r"); |
lzzcd001 | 1:9465d72db54f | 101 | fgets(question, 150, f); |
lzzcd001 | 1:9465d72db54f | 102 | fgets(answerStr, 150, f); |
lzzcd001 | 1:9465d72db54f | 103 | char buffer[1]; |
lzzcd001 | 1:9465d72db54f | 104 | sprintf(buffer, "%s", answerStr); |
lzzcd001 | 1:9465d72db54f | 105 | fclose(f); |
lzzcd001 | 0:9e4f9c949728 | 106 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 107 | lcd.printf("Next Question"); |
lzzcd001 | 0:9e4f9c949728 | 108 | wait(2); |
lzzcd001 | 0:9e4f9c949728 | 109 | question_no++; |
lzzcd001 | 0:9e4f9c949728 | 110 | if (buffer[0] == 't') { |
lzzcd001 | 0:9e4f9c949728 | 111 | answer = 1; |
lzzcd001 | 0:9e4f9c949728 | 112 | } else { |
lzzcd001 | 0:9e4f9c949728 | 113 | answer = 0; |
lzzcd001 | 0:9e4f9c949728 | 114 | } |
lzzcd001 | 0:9e4f9c949728 | 115 | for (int i = 3; i > 0; i--) { |
lzzcd001 | 0:9e4f9c949728 | 116 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 117 | //lcd.text_char(i, 12, 12, RED); |
lzzcd001 | 0:9e4f9c949728 | 118 | lcd.printf("%d",i); |
lzzcd001 | 0:9e4f9c949728 | 119 | Thread::wait(1000); |
lzzcd001 | 0:9e4f9c949728 | 120 | } |
lzzcd001 | 0:9e4f9c949728 | 121 | lcd.color(WHITE); |
lzzcd001 | 0:9e4f9c949728 | 122 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 123 | lcd.locate(1,1); |
lzzcd001 | 0:9e4f9c949728 | 124 | lcd.printf(question); // to be corrected |
lzzcd001 | 0:9e4f9c949728 | 125 | lcd.locate(2,14); |
lzzcd001 | 0:9e4f9c949728 | 126 | lcd.printf("Yes"); |
lzzcd001 | 0:9e4f9c949728 | 127 | lcd.locate(14,14); |
lzzcd001 | 0:9e4f9c949728 | 128 | lcd.printf("No"); |
lzzcd001 | 1:9465d72db54f | 129 | lcd.locate(0,8); |
lzzcd001 | 1:9465d72db54f | 130 | lcd.printf("%02d out of %02d", question_no, max_question_no); |
lzzcd001 | 2:346250dedcb6 | 131 | time_count = 10; |
lzzcd001 | 0:9e4f9c949728 | 132 | Thread timerr(timer, (void *) timePointer); |
lzzcd001 | 0:9e4f9c949728 | 133 | wait(0.1); |
lzzcd001 | 2:346250dedcb6 | 134 | while (time_count >= 0 && flag == false) { |
lzzcd001 | 0:9e4f9c949728 | 135 | if (yes == true && no == true) {} |
lzzcd001 | 0:9e4f9c949728 | 136 | else if (yes == true) { |
lzzcd001 | 0:9e4f9c949728 | 137 | flag = true; |
lzzcd001 | 0:9e4f9c949728 | 138 | response = 1; |
lzzcd001 | 0:9e4f9c949728 | 139 | } else if (no == true) { |
lzzcd001 | 0:9e4f9c949728 | 140 | flag = true; |
lzzcd001 | 0:9e4f9c949728 | 141 | response = 0; |
lzzcd001 | 0:9e4f9c949728 | 142 | } |
lzzcd001 | 2:346250dedcb6 | 143 | if (time_count == 0) {flag = true; response = -1;} |
lzzcd001 | 0:9e4f9c949728 | 144 | } |
lzzcd001 | 0:9e4f9c949728 | 145 | timerr.terminate(); |
lzzcd001 | 0:9e4f9c949728 | 146 | if (response == 1) { |
lzzcd001 | 0:9e4f9c949728 | 147 | lcd.locate(2,14); |
lzzcd001 | 0:9e4f9c949728 | 148 | if (response == answer) { |
lzzcd001 | 0:9e4f9c949728 | 149 | lcd.textbackground_color(GREEN); |
lzzcd001 | 0:9e4f9c949728 | 150 | lcd.printf("Yes"); |
lzzcd001 | 0:9e4f9c949728 | 151 | score++; |
lzzcd001 | 0:9e4f9c949728 | 152 | } else { |
lzzcd001 | 0:9e4f9c949728 | 153 | lcd.textbackground_color(RED); |
lzzcd001 | 0:9e4f9c949728 | 154 | lcd.printf("Yes"); |
lzzcd001 | 0:9e4f9c949728 | 155 | } |
lzzcd001 | 0:9e4f9c949728 | 156 | } else if (response == 0) { |
lzzcd001 | 0:9e4f9c949728 | 157 | lcd.locate(14,14); |
lzzcd001 | 0:9e4f9c949728 | 158 | if (response == answer) { |
lzzcd001 | 0:9e4f9c949728 | 159 | lcd.textbackground_color(GREEN); |
lzzcd001 | 0:9e4f9c949728 | 160 | lcd.printf("No"); |
lzzcd001 | 0:9e4f9c949728 | 161 | score++; |
lzzcd001 | 0:9e4f9c949728 | 162 | } else { |
lzzcd001 | 0:9e4f9c949728 | 163 | lcd.textbackground_color(RED); |
lzzcd001 | 0:9e4f9c949728 | 164 | lcd.printf("No"); |
lzzcd001 | 0:9e4f9c949728 | 165 | } |
lzzcd001 | 0:9e4f9c949728 | 166 | } else if (response == -1) { |
lzzcd001 | 0:9e4f9c949728 | 167 | lcd.textbackground_color(RED); |
lzzcd001 | 0:9e4f9c949728 | 168 | lcd.locate(2,14); |
lzzcd001 | 0:9e4f9c949728 | 169 | lcd.printf("Yes"); |
lzzcd001 | 0:9e4f9c949728 | 170 | lcd.locate(14,14); |
lzzcd001 | 0:9e4f9c949728 | 171 | lcd.printf("No"); |
lzzcd001 | 0:9e4f9c949728 | 172 | }; |
lzzcd001 | 0:9e4f9c949728 | 173 | wait(2); |
lzzcd001 | 0:9e4f9c949728 | 174 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 175 | lcd.locate(0,0); |
lzzcd001 | 0:9e4f9c949728 | 176 | lcd.textbackground_color(BLACK); |
lzzcd001 | 0:9e4f9c949728 | 177 | response = -2; |
lzzcd001 | 0:9e4f9c949728 | 178 | flag = false; |
lzzcd001 | 0:9e4f9c949728 | 179 | } |
lzzcd001 | 0:9e4f9c949728 | 180 | lcd.cls(); |
lzzcd001 | 0:9e4f9c949728 | 181 | lcd.printf("Total Score: %2.2f", score/(question_no+0.0) * 100); |
lzzcd001 | 0:9e4f9c949728 | 182 | while (true) {} |
lzzcd001 | 0:9e4f9c949728 | 183 | } |