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.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
rhythm.cpp
- Committer:
- spoda
- Date:
- 2016-11-01
- Revision:
- 1:4136709c77f4
- Parent:
- 0:40c6dc4c379b
File content as of revision 1:4136709c77f4:
#include "mbed.h"
#include "uLCD_4DGL.h"
#include <stdlib.h>
#include "rhythm.h"
#include "SDFileSystem.h"
#include "wave_player.h"
Rhythm::Rhythm()
{
sd = new SDFileSystem(p5, p6, p7, p8, "sd");
DACout = new AnalogOut(p18);
waver = new wave_player(DACout);
uLCD = new uLCD_4DGL(p13,p14,p12);
Up = new DigitalIn(p24);
Left = new DigitalIn(p26);
Right = new DigitalIn(p28);
Center = new DigitalIn(p25);
Down = new DigitalIn(p27);
up = false;
down = false;
left = false;
right = false;
center = false;
score = 0;
endloop = 0;
random_number = 0;
shape_color = 0;
average_reaction_time = 0;
}
void Rhythm::drawBorder() {
//Left side 1
uLCD->line(0, 0, 10, 16, RED);
uLCD->line(10, 16, 0, 32, GREEN);
uLCD->line(0, 32, 10, 48, BLUE);
uLCD->line(10, 48, 0, 64, RED);
uLCD->line(0, 64, 10, 80, GREEN);
uLCD->line(10, 80, 0, 96, BLUE);
uLCD->line(0, 96, 10, 112, RED);
uLCD->line(10, 112, 0, 128, GREEN);
//Left side 2
uLCD->line(10, 0, 0, 16, GREEN);
uLCD->line(0, 16, 10, 32, BLUE);
uLCD->line(10, 32, 0, 48, RED);
uLCD->line(0, 48, 10, 64, GREEN);
uLCD->line(10, 64, 0, 80, BLUE);
uLCD->line(0, 80, 10, 96, RED);
uLCD->line(10, 96, 0, 112, GREEN);
uLCD->line(0, 112, 10, 128, BLUE);
//Bottom 1
uLCD->line(0, 128, 16, 118, BLUE);
uLCD->line(16, 118, 32, 128, RED);
uLCD->line(32, 128, 48, 118, GREEN);
uLCD->line(48, 118, 64, 128, BLUE);
uLCD->line(64, 128, 80, 118, RED);
uLCD->line(80, 118, 96, 128, GREEN);
uLCD->line(96, 128, 112, 118, BLUE);
uLCD->line(112, 118, 128, 128, RED);
//Bottom 2
uLCD->line(0, 118, 16, 128, RED);
uLCD->line(16, 128, 32, 118, GREEN);
uLCD->line(32, 118, 48, 128, BLUE);
uLCD->line(48, 128, 64, 118, RED);
uLCD->line(64, 118, 80, 128, GREEN);
uLCD->line(80, 128, 96, 118, BLUE);
uLCD->line(96, 118, 112, 128, RED);
uLCD->line(112, 128, 128, 118, GREEN);
//Right side 1
uLCD->line(128, 128, 118, 112, GREEN);
uLCD->line(118, 112, 128, 96, BLUE);
uLCD->line(128, 96, 118, 80, RED);
uLCD->line(118, 80, 128, 64, GREEN);
uLCD->line(128, 64, 118, 48, BLUE);
uLCD->line(118, 48, 128, 32, RED);
uLCD->line(128, 32, 118, 16, GREEN);
uLCD->line(118, 16, 128, 0, BLUE);
//Right side 2
uLCD->line(118, 128, 128, 112, BLUE);
uLCD->line(128, 112, 118, 96, RED);
uLCD->line(118, 96, 128, 80, GREEN);
uLCD->line(128, 80, 118, 64, BLUE);
uLCD->line(118, 64, 128, 48, RED);
uLCD->line(128, 48, 118, 32, GREEN);
uLCD->line(118, 32, 128, 16, BLUE);
uLCD->line(128, 16, 118, 0, RED);
//Top 1
uLCD->line(128, 0, 112, 10, RED);
uLCD->line(112, 10, 96, 0, GREEN);
uLCD->line(96, 0, 80, 10, BLUE);
uLCD->line(80, 10, 64, 0, RED);
uLCD->line(64, 0, 48, 10, GREEN);
uLCD->line(48, 10, 32, 0, BLUE);
uLCD->line(32, 0, 16, 10, RED);
uLCD->line(16, 10, 0, 0, GREEN);
//Top 2
uLCD->line(128, 10, 112, 0, GREEN);
uLCD->line(112, 0, 96, 10, BLUE);
uLCD->line(96, 10, 80, 0, RED);
uLCD->line(80, 0, 64, 10, GREEN);
uLCD->line(64, 10, 48, 0, BLUE);
uLCD->line(48, 0, 32, 10, RED);
uLCD->line(32, 10, 16, 0, GREEN);
uLCD->line(16, 0, 0, 10, BLUE);
}
void Rhythm::drawLevel1Screen() {
uLCD->cls();
drawBorder();
uLCD->text_string("Level 1", 6, 6, FONT_7X8, BLUE);
}
void Rhythm::drawLevel2Screen() {
uLCD->cls();
drawBorder();
uLCD->text_string("Level 2", 6, 6, FONT_7X8, GREEN);
}
void Rhythm::drawLevel3Screen() {
uLCD->cls();
drawBorder();
uLCD->text_string("Level 3", 6, 6, FONT_7X8, RED);
}
void Rhythm::drawEndScreen() {
uLCD->cls();
drawBorder();
uLCD->text_string("Thank You", 5, 7, FONT_7X8, 0xFFFF00);
uLCD->text_string("For Playing", 4, 9, FONT_7X8, 0xFFFF00);
for (int i = 0; i < 3; i++) {
playMusicEnd();
}
}
void Rhythm::generateRandomColor() {
random_number = rand() % 6;
if (random_number == 0) {
shape_color = 0xFF0000;
} else if (random_number == 1) {
shape_color = 0x00FF00;
} else if (random_number == 2) {
shape_color = 0x0000FF;
} else if (random_number == 3) {
shape_color = 0xFFFF00;
} else if (random_number == 4) {
shape_color = 0x00FFFF;
} else if (random_number == 5) {
shape_color = 0xFF00FF;
}
}
void Rhythm::drawUpArrow() {
uLCD->cls();
generateRandomColor();
uLCD->filled_rectangle(60, 52, 68, 76, shape_color);
for (int n = 0; n < 9; n++) {
uLCD->line(56 + n, 52 - n, 72 - n, 52 - n, shape_color);
}
up = true;
down = false;
left = false;
right = false;
center = false;
}
void Rhythm::drawDownArrow() {
uLCD->cls();
generateRandomColor();
uLCD->filled_rectangle(60, 52, 68, 76, shape_color);
for (int n = 0; n < 9; n++) {
uLCD->line(56 + n, 76 + n, 72 - n, 76 + n, shape_color);
}
up = false;
down = true;
left = false;
right = false;
center = false;
}
void Rhythm::drawLeftArrow() {
uLCD->cls();
generateRandomColor();
uLCD->filled_rectangle(52, 60, 76, 68, shape_color);
for (int n = 0; n < 9; n++) {
uLCD->line(52 - n, 56 + n, 52 - n, 72 - n, shape_color);
}
up = false;
down = false;
left = true;
right = false;
center = false;
}
void Rhythm::drawRightArrow() {
uLCD->cls();
generateRandomColor();
uLCD->filled_rectangle(52, 60, 76, 68, shape_color);
for (int n = 0; n < 9; n++) {
uLCD->line(76 + n, 56 + n, 76 + n, 72 - n, shape_color);
}
up = false;
down = false;
left = false;
right = true;
center = false;
}
void Rhythm::drawCenterCircle() {
uLCD->cls();
generateRandomColor();
uLCD->filled_circle(64, 64, 15, shape_color);
up = false;
down = false;
left = false;
right = false;
center = true;
}
void Rhythm::getArrowDirection()
{
int randgen = rand() % 5;
if(randgen == 0)
{
drawUpArrow();
}
else if(randgen == 1)
{
drawDownArrow();
}
else if(randgen == 2)
{
drawLeftArrow();
}
else if(randgen == 3)
{
drawRightArrow();
}
else if(randgen == 4)
{
drawCenterCircle();
}
t.start();
endloop++;
}
void Rhythm::level1()
{
drawLevel1Screen();
wait(2.0);
getArrowDirection();
while(endloop <= 10)
{
if(up && Up->read() == 0 && t.read() <= 3.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(down && Down->read() == 0 && t.read() <= 3.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(left && Left->read() == 0 && t.read() <= 3.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(right && Right->read() == 0 && t.read() <= 3.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(center && Center->read() == 0 && t.read() <= 3.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (up && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (down && (Up->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (left && (Down->read() == 0 || Up->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (right && (Down->read() == 0 || Left->read() == 0 || Up->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (center && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Up->read() == 0) && t.read() < 3.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if( t.read() >= 3.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
if (endloop == 10) {break;}
getArrowDirection();
}
}
endloop = 0;
computeAverageReactionTime();
drawResultsScreen();
}
void Rhythm::level2()
{
drawLevel2Screen();
wait(2.0);
getArrowDirection();
while(endloop <= 10)
{
if(up && Up->read() == 0 && t.read() <= 2.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(down && Down->read() == 0 && t.read() <= 2.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(left && Left->read() == 0 && t.read() <= 2.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(right && Right->read() == 0 && t.read() <= 2.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(center && Center->read() == 0 && t.read() <= 2.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (up && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (down && (Up->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (left && (Down->read() == 0 || Up->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (right && (Down->read() == 0 || Left->read() == 0 || Up->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (center && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Up->read() == 0) && t.read() < 2.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if( t.read() >= 2.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
if (endloop == 10) {break;}
getArrowDirection();
}
}
endloop = 0;
computeAverageReactionTime();
drawResultsScreen();
}
void Rhythm::level3()
{
drawLevel3Screen();
wait(2.0);
getArrowDirection();
while(endloop <= 10)
{
if(up && Up->read() == 0 && t.read() <= 1.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(down && Down->read() == 0 && t.read() <= 1.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(left && Left->read() == 0 && t.read() <= 1.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(right && Right->read() == 0 && t.read() <= 1.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if(center && Center->read() == 0 && t.read() <= 1.0)
{
reaction_times[endloop - 1] = t.read();
score++;
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (up && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (down && (Up->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (left && (Down->read() == 0 || Up->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (right && (Down->read() == 0 || Left->read() == 0 || Up->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if (center && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Up->read() == 0) && t.read() < 1.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
wait(0.3);
if (endloop == 10) {break;}
getArrowDirection();
}
else if( t.read() >= 1.0)
{
reaction_times[endloop - 1] = t.read();
t.stop();
t.reset();
if (endloop == 10) {break;}
getArrowDirection();
}
}
endloop = 0;
computeAverageReactionTime();
drawResultsScreen();
}
void Rhythm::drawTitleScreen() {
uLCD->cls();
uLCD->background_color(BLACK);
uLCD->text_bold(ON);
uLCD->text_string("MBED Rhythm", 2, 4, FONT_7X8, WHITE);
uLCD->text_string("Down - Level 1", 2, 6, FONT_7X8, BLUE);
uLCD->text_string("Up - Level 2", 2, 8, FONT_7X8, GREEN);
uLCD->text_string("Right - Level 3", 2, 10, FONT_7X8, RED);
playMusicIntro();
while(1)
{
if (Down->read() == 0) {
level1();
break;
} else if (Up->read() == 0) {
level2();
break;
} else if (Right->read() == 0) {
level3();
break;
}
}
}
void Rhythm::computeAverageReactionTime() {
float sum = 0;
for (int i = 0; i < 10; i++) {
sum = sum + reaction_times[i];
}
average_reaction_time = sum / 10.0;
}
void Rhythm::drawResultsScreen() {
uLCD->cls();
uLCD->text_string("Results", 1, 1, FONT_7X8, WHITE);
uLCD->set_font(FONT_7X8);
uLCD->locate(1, 3);
uLCD->color(GREEN);
uLCD->printf("Score: %d", score);
uLCD->locate(1, 5);
uLCD->color(0xFFCA00);
uLCD->printf("Average Reaction Time: %1.3f sec", average_reaction_time);
uLCD->locate(1, 8);
uLCD->color(0xFF00FF);
uLCD->printf("Would you like to play again?");
uLCD->locate(1, 11);
uLCD->color(BLUE);
uLCD->printf("Up - Yes");
uLCD->locate(1, 13);
uLCD->color(RED);
uLCD->printf("Down - No");
score = 0;
for (int i = 0; i < 10; i++) {
reaction_times[i] = 0;
}
average_reaction_time = 0;
playMusicResults();
while (1) {
if (Up->read() == 0) {
drawTitleScreen();
} else if (Down->read() == 0) {
drawEndScreen();
}
}
}
void Rhythm::playMusicIntro()
{
FILE *wave_file;
wave_file = fopen("/sd/wavfiles/WW_PressStart.wav","r");
waver->play(wave_file);
fclose(wave_file);
}
void Rhythm::playMusicEnd()
{
FILE *wave_file;
wave_file = fopen("/sd/wavfiles/WW_Get_Rupee_Red.wav","r");
waver->play(wave_file);
fclose(wave_file);
}
void Rhythm::playMusicResults()
{
FILE *wave_file;
wave_file = fopen("/sd/wavfiles/WW_ChuChu_Wobble.wav","r");
waver->play(wave_file);
fclose(wave_file);
}