Miniproject of ECE4180
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
main.cpp
- Committer:
- lzzcd001
- Date:
- 2015-03-11
- Revision:
- 2:346250dedcb6
- Parent:
- 1:9465d72db54f
File content as of revision 2:346250dedcb6:
#include "mbed.h"
#include "rtos.h"
#include "uLCD_4DGL.h"
#include <vector>
#include <stdlib.h>
#include <time.h>
DigitalIn yes(p5);
DigitalIn no(p6);
uLCD_4DGL lcd(p28, p27, p30);
Mutex mutex;
LocalFileSystem local("local");
void setup()
{
lcd.baudrate(3000000);
lcd.background_color(0);
lcd.cls();
lcd.text_width(3); //4X size text
lcd.text_height(3);
//lcd.printf("Initializing...");
lcd.text_string("Initializing...", 0,0,FONT_8X12,BLUE);
}
void timer(void const *in) {
int* timeNo = (int*) in;
lcd.filled_rectangle(0,90,100,95,RED);
for (int i = 10; i>=0; i--) {
mutex.lock();
lcd.locate(8,10);
lcd.printf("00:%02d", i);
lcd.filled_rectangle(i*10,90,(i+1)*10,95,BLACK);
mutex.unlock();
Thread::wait(1000);
}
*timeNo = 0;
}
int main() {
yes.mode(PullUp);
no.mode(PullUp);
lcd.baudrate(3000000);
lcd.background_color(0);
lcd.cls();
lcd.color(WHITE);
lcd.printf("Initializing...");
int answer = 1;
bool flag = false;
int response = -1;
int score = 0;
int time_count;
int* timePointer = &time_count;
int question_no = 0;
bool endFlag = false;
char* question = (char*) malloc(sizeof(char) * 150+1);;
char* answerStr = (char*) malloc(sizeof(char)+1);;
wait(2);
lcd.cls();
lcd.printf("press to start");
while (yes == true && no == true) {}
lcd.cls();
lcd.printf("Quiz starts");
wait(2);
lcd.cls();
lcd.printf("Ready");
wait(2);
//===========================
int total_no_questions = 10;
vector<int> question_inds(total_no_questions);
for (int i=0; i<total_no_questions; i++) {
question_inds[i] = i;
}
int randind;
int rand_no;
int max_question_no = 5; // maximum_number; assert it smaller than total_no_questions!!!
//============================
while (!endFlag) {
if (question_no == max_question_no) {
lcd.cls();
lcd.printf("Quiz ends");
wait(2);
endFlag = true;
break;
}
srand(time(NULL));
randind = (rand() % total_no_questions);
total_no_questions--;
rand_no = question_inds[randind];
question_inds.erase(question_inds.begin() + randind);
char file_name[100];
char no_str[1];
char txt[4];
sprintf(no_str, "%d",rand_no);
sprintf(txt, "%s", ".txt");
strcpy(file_name, "/local/test");
strncat(file_name, no_str,10);
strncat(file_name, txt,10);
FILE *f = fopen(file_name , "r");
fgets(question, 150, f);
fgets(answerStr, 150, f);
char buffer[1];
sprintf(buffer, "%s", answerStr);
fclose(f);
lcd.cls();
lcd.printf("Next Question");
wait(2);
question_no++;
if (buffer[0] == 't') {
answer = 1;
} else {
answer = 0;
}
for (int i = 3; i > 0; i--) {
lcd.cls();
//lcd.text_char(i, 12, 12, RED);
lcd.printf("%d",i);
Thread::wait(1000);
}
lcd.color(WHITE);
lcd.cls();
lcd.locate(1,1);
lcd.printf(question); // to be corrected
lcd.locate(2,14);
lcd.printf("Yes");
lcd.locate(14,14);
lcd.printf("No");
lcd.locate(0,8);
lcd.printf("%02d out of %02d", question_no, max_question_no);
time_count = 10;
Thread timerr(timer, (void *) timePointer);
wait(0.1);
while (time_count >= 0 && flag == false) {
if (yes == true && no == true) {}
else if (yes == true) {
flag = true;
response = 1;
} else if (no == true) {
flag = true;
response = 0;
}
if (time_count == 0) {flag = true; response = -1;}
}
timerr.terminate();
if (response == 1) {
lcd.locate(2,14);
if (response == answer) {
lcd.textbackground_color(GREEN);
lcd.printf("Yes");
score++;
} else {
lcd.textbackground_color(RED);
lcd.printf("Yes");
}
} else if (response == 0) {
lcd.locate(14,14);
if (response == answer) {
lcd.textbackground_color(GREEN);
lcd.printf("No");
score++;
} else {
lcd.textbackground_color(RED);
lcd.printf("No");
}
} else if (response == -1) {
lcd.textbackground_color(RED);
lcd.locate(2,14);
lcd.printf("Yes");
lcd.locate(14,14);
lcd.printf("No");
};
wait(2);
lcd.cls();
lcd.locate(0,0);
lcd.textbackground_color(BLACK);
response = -2;
flag = false;
}
lcd.cls();
lcd.printf("Total Score: %2.2f", score/(question_no+0.0) * 100);
while (true) {}
}