Code for the first mbed for the drum hero project
Dependencies: 4DGL SDFileSystem mbed
Fork of drums2 by
main.cpp@5:02800d96625d, 2017-05-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |