Code for the first mbed for the drum hero project

Dependencies:   4DGL SDFileSystem mbed

Fork of drums2 by Yusuf Kuris

Committer:
ckabuloglu
Date:
Mon May 01 11:05:52 2017 +0000
Revision:
5:02800d96625d
Parent:
4:d135d66c55e2
final push

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ckabuloglu 3:54d4226a7d5e 1 #include "mbed.h"
ckabuloglu 3:54d4226a7d5e 2 #include "TFT_4DGL.h"
ckabuloglu 3:54d4226a7d5e 3 #include "note.h"
ckabuloglu 3:54d4226a7d5e 4 #include "song.h"
ckabuloglu 3:54d4226a7d5e 5 #include <vector>
ckabuloglu 3:54d4226a7d5e 6
ckabuloglu 3:54d4226a7d5e 7 // Define all the ports
ckabuloglu 3:54d4226a7d5e 8 // Serial pc(USBTX, USBRX);
ckabuloglu 3:54d4226a7d5e 9 TFT_4DGL screen(p9,p10,p11); // serial tx, serial rx, reset pin;
ckabuloglu 5:02800d96625d 10 AnalogIn drum1(p18);
ckabuloglu 5:02800d96625d 11 AnalogIn drum2(p19);
ckabuloglu 5:02800d96625d 12 AnalogIn drum3(p20);
ckabuloglu 3:54d4226a7d5e 13 DigitalOut musicOn(p22);
ckabuloglu 3:54d4226a7d5e 14 DigitalIn button(p21);
ckabuloglu 3:54d4226a7d5e 15
ckabuloglu 3:54d4226a7d5e 16 // Define objects
ckabuloglu 5:02800d96625d 17 Ticker t1;
ckabuloglu 3:54d4226a7d5e 18 DigitalOut led1(LED1);
ckabuloglu 3:54d4226a7d5e 19 DigitalOut led2(LED2);
ckabuloglu 3:54d4226a7d5e 20 DigitalOut led3(LED3);
ckabuloglu 3:54d4226a7d5e 21
ckabuloglu 3:54d4226a7d5e 22 // Define and initiate global variables
ckabuloglu 3:54d4226a7d5e 23 std::vector<Note> noteArr;
ckabuloglu 3:54d4226a7d5e 24 int beatNumber = 0;
ckabuloglu 3:54d4226a7d5e 25 char buffer[2];
ckabuloglu 3:54d4226a7d5e 26 int skipped = 0;
ckabuloglu 3:54d4226a7d5e 27 int temp;
ckabuloglu 3:54d4226a7d5e 28 int score = 0;
ckabuloglu 3:54d4226a7d5e 29 Song s = Song(1);
ckabuloglu 3:54d4226a7d5e 30
ckabuloglu 5:02800d96625d 31 // Define the drum variables
ckabuloglu 5:02800d96625d 32 volatile int r1;
ckabuloglu 5:02800d96625d 33 volatile int r2;
ckabuloglu 5:02800d96625d 34 volatile int r3;
ckabuloglu 5:02800d96625d 35 volatile int r11;
ckabuloglu 5:02800d96625d 36 volatile int r22;
ckabuloglu 5:02800d96625d 37 volatile int r33;
ckabuloglu 5:02800d96625d 38
ckabuloglu 5:02800d96625d 39 // Function that draws the initial game frame
ckabuloglu 3:54d4226a7d5e 40 void initiateScreen() {
ckabuloglu 3:54d4226a7d5e 41 // Initiate the screen and the background
ckabuloglu 3:54d4226a7d5e 42 screen.baudrate(3000000);
ckabuloglu 3:54d4226a7d5e 43 screen.display_control(0x0c, 0x01);
ckabuloglu 3:54d4226a7d5e 44 screen.background_color(0x000000);
ckabuloglu 3:54d4226a7d5e 45
ckabuloglu 3:54d4226a7d5e 46 // Draw the frame
ckabuloglu 3:54d4226a7d5e 47 screen.rectangle(192, 120, 447, 450, 0xD38A41);
ckabuloglu 3:54d4226a7d5e 48 screen.line(256, 120, 192, 450, 0x96411F);
ckabuloglu 3:54d4226a7d5e 49 screen.line(296, 120, 277, 450, 0x96411F);
ckabuloglu 3:54d4226a7d5e 50 screen.line(332, 120, 362, 450, 0x96411F);
ckabuloglu 3:54d4226a7d5e 51 screen.line(372, 120, 447, 450, 0x96411F);
ckabuloglu 3:54d4226a7d5e 52 screen.triangle(192, 120, 192, 450, 256, 120, 0x000000);
ckabuloglu 3:54d4226a7d5e 53 screen.triangle(372, 120, 447, 450, 447, 120, 0x000000);
ckabuloglu 3:54d4226a7d5e 54 screen.rectangle(447, 120, 450, 450, 0x000000);
ckabuloglu 3:54d4226a7d5e 55
ckabuloglu 3:54d4226a7d5e 56 screen.rectangle(256, 100, 296, 120, 0xFF0000);
ckabuloglu 3:54d4226a7d5e 57 screen.rectangle(296, 100, 332, 120, 0x00FF00);
ckabuloglu 3:54d4226a7d5e 58 screen.rectangle(332, 100, 372, 120, 0x0000FF);
ckabuloglu 3:54d4226a7d5e 59
ckabuloglu 3:54d4226a7d5e 60 // Define the points
ckabuloglu 3:54d4226a7d5e 61 screen.graphic_string("POINTS:", 30, 100, FONT_8X8, WHITE, 2, 2);
ckabuloglu 3:54d4226a7d5e 62
ckabuloglu 5:02800d96625d 63 screen.graphic_string("OB-LA-DI", 430, 100, FONT_8X8, WHITE, 2, 2);
ckabuloglu 3:54d4226a7d5e 64 }
ckabuloglu 3:54d4226a7d5e 65
ckabuloglu 5:02800d96625d 66 // The function that the ticker will be running, it checks if the piezo sensors
ckabuloglu 5:02800d96625d 67 // sense a hit two cycles (0.002 sec) in a row. Checking for two consecutive
ckabuloglu 5:02800d96625d 68 // high values discards the noise in the piezo sensors.
ckabuloglu 5:02800d96625d 69 void checkDrums() {
ckabuloglu 5:02800d96625d 70 if (drum1 == 1) {
ckabuloglu 5:02800d96625d 71 if (r1 == 1) {
ckabuloglu 5:02800d96625d 72 r11 = 1;
ckabuloglu 5:02800d96625d 73 } else {
ckabuloglu 5:02800d96625d 74 r1 = 1;
ckabuloglu 5:02800d96625d 75 };
ckabuloglu 5:02800d96625d 76 } else if (drum2 == 1) {
ckabuloglu 5:02800d96625d 77 if (r2 == 1) {
ckabuloglu 5:02800d96625d 78 r22 = 1;
ckabuloglu 5:02800d96625d 79 } else {
ckabuloglu 5:02800d96625d 80 r2 = 1;
ckabuloglu 5:02800d96625d 81 };
ckabuloglu 5:02800d96625d 82 } else if (drum3 == 1) {
ckabuloglu 5:02800d96625d 83 if (r3 == 1) {
ckabuloglu 5:02800d96625d 84 r33 = 1;
ckabuloglu 5:02800d96625d 85 } else {
ckabuloglu 5:02800d96625d 86 r3 = 1;
ckabuloglu 5:02800d96625d 87 };
ckabuloglu 5:02800d96625d 88 }
ckabuloglu 5:02800d96625d 89 }
ykuris3 4:d135d66c55e2 90
ckabuloglu 5:02800d96625d 91 // Main methods that runs the main loop that checks the drums hits and draws the
ckabuloglu 5:02800d96625d 92 // next set of notes on the board.
ykuris3 4:d135d66c55e2 93 int main() {
ykuris3 4:d135d66c55e2 94 button.mode(PullDown);
ykuris3 4:d135d66c55e2 95 screen.text_string("DRUM HERO 1.0", 15, 8, FONT_8X8, WHITE);
ykuris3 4:d135d66c55e2 96 screen.text_string("PRESS THE BUTTON", 14, 16, FONT_8X8, WHITE);
ykuris3 4:d135d66c55e2 97 screen.text_string("TO START", 18, 19, FONT_8X8, WHITE);
ckabuloglu 5:02800d96625d 98
ykuris3 4:d135d66c55e2 99 musicOn = 0;
ykuris3 4:d135d66c55e2 100 while(!musicOn) {
ykuris3 4:d135d66c55e2 101 if(button) {
ykuris3 4:d135d66c55e2 102 musicOn = 1;
ykuris3 4:d135d66c55e2 103 }
ckabuloglu 5:02800d96625d 104 }
ckabuloglu 5:02800d96625d 105
ykuris3 4:d135d66c55e2 106 // Initiate the screen and the main graphics
ckabuloglu 5:02800d96625d 107 initiateScreen();
ckabuloglu 5:02800d96625d 108
ckabuloglu 5:02800d96625d 109 t1.attach(&checkDrums, 0.001);
ckabuloglu 5:02800d96625d 110
ykuris3 4:d135d66c55e2 111 while (true) {
ckabuloglu 3:54d4226a7d5e 112 // Check if the song is ended
ckabuloglu 3:54d4226a7d5e 113 if (beatNumber < s.length) {
ckabuloglu 5:02800d96625d 114 // Check if the drum ticker sensed any hits
ckabuloglu 5:02800d96625d 115 if (r11) {
ckabuloglu 5:02800d96625d 116 // Draw hit drums for user feedback
ykuris3 4:d135d66c55e2 117 screen.rectangle(192,450,277,470,0xFF0000);
ykuris3 4:d135d66c55e2 118 led1 = 1;
ckabuloglu 5:02800d96625d 119 // Notes move down 5 times, check the note array in the index of
ckabuloglu 5:02800d96625d 120 // 5 notes before and see if it matches with the right drum
ckabuloglu 5:02800d96625d 121 if (s.notes[beatNumber - 5] == 1) {
ckabuloglu 5:02800d96625d 122 score++;
ckabuloglu 5:02800d96625d 123 }
ckabuloglu 5:02800d96625d 124 r1 = 0;
ckabuloglu 5:02800d96625d 125 r11 = 0;
ckabuloglu 5:02800d96625d 126 } else if (r22) {
ykuris3 4:d135d66c55e2 127 screen.rectangle(277,450,362,470,0x00FF00);
ykuris3 4:d135d66c55e2 128 led2 = 1;
ckabuloglu 5:02800d96625d 129 if (s.notes[beatNumber - 5] == 2) {
ckabuloglu 5:02800d96625d 130 score++;
ckabuloglu 5:02800d96625d 131 }
ckabuloglu 5:02800d96625d 132 r2 = 0;
ckabuloglu 5:02800d96625d 133 r22 = 0;
ckabuloglu 5:02800d96625d 134 } else if (r33) {
ykuris3 4:d135d66c55e2 135 screen.rectangle(362,450,447,470,0x0000FF);
ykuris3 4:d135d66c55e2 136 led3 = 1;
ckabuloglu 5:02800d96625d 137 if (s.notes[beatNumber - 5] == 3) {
ckabuloglu 5:02800d96625d 138 score++;
ckabuloglu 5:02800d96625d 139 }
ckabuloglu 5:02800d96625d 140 r3 = 0;
ckabuloglu 5:02800d96625d 141 r33 = 0;
ykuris3 4:d135d66c55e2 142 } else {
ykuris3 4:d135d66c55e2 143 screen.rectangle(192,450,447,470,0x000000);
ykuris3 4:d135d66c55e2 144 led1 = 0;
ykuris3 4:d135d66c55e2 145 led2 = 0;
ykuris3 4:d135d66c55e2 146 led3 = 0;
ykuris3 4:d135d66c55e2 147 }
ckabuloglu 5:02800d96625d 148
ckabuloglu 3:54d4226a7d5e 149 // Read the next beat (0,1,2,3)
ckabuloglu 3:54d4226a7d5e 150 temp = s.notes[beatNumber++];
ckabuloglu 3:54d4226a7d5e 151 // Check if there's a beat/note (not 0)
ckabuloglu 3:54d4226a7d5e 152 if (temp) {
ckabuloglu 3:54d4226a7d5e 153 // If beat/note exists, create the object for it and push
ckabuloglu 3:54d4226a7d5e 154 // it to the array of current notes on the screen
ckabuloglu 3:54d4226a7d5e 155 Note n1 = Note(temp);
ckabuloglu 3:54d4226a7d5e 156 noteArr.push_back(n1);
ckabuloglu 3:54d4226a7d5e 157 }
ckabuloglu 5:02800d96625d 158
ykuris3 4:d135d66c55e2 159 for (int i = skipped; i < noteArr.size(); i++) {
ckabuloglu 3:54d4226a7d5e 160 if (noteArr[i].consumed) {
ckabuloglu 3:54d4226a7d5e 161 skipped += 1;
ckabuloglu 3:54d4226a7d5e 162 } else {
ckabuloglu 3:54d4226a7d5e 163 noteArr[i].drawNote();
ckabuloglu 3:54d4226a7d5e 164 }
ckabuloglu 3:54d4226a7d5e 165 }
ckabuloglu 3:54d4226a7d5e 166 } else {
ckabuloglu 5:02800d96625d 167 // Game over screen
ckabuloglu 3:54d4226a7d5e 168 screen.rectangle(0,0,640,480,0x000000);
ckabuloglu 5:02800d96625d 169 screen.graphic_string("GAME OVER", 240, 170, FONT_8X8, WHITE, 2, 2);
ckabuloglu 5:02800d96625d 170 screen.graphic_string("YOUR SCORE IS:", 210, 230, FONT_8X8, WHITE, 2, 2);
ckabuloglu 5:02800d96625d 171 screen.graphic_string(buffer, 290, 260, FONT_8X8, WHITE, 2, 2);
ykuris3 4:d135d66c55e2 172 wait(30);
ykuris3 2:5daa4d35a676 173 }
ckabuloglu 5:02800d96625d 174 // Update the score after each iteration
ckabuloglu 3:54d4226a7d5e 175 sprintf(buffer,"%d",score);
ckabuloglu 5:02800d96625d 176 screen.graphic_string(buffer, 30, 120, FONT_8X8, WHITE, 2, 2);
ckabuloglu 3:54d4226a7d5e 177 }
4180_1 0:cfcf73272647 178 }