Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Revision:
1:94b1ec213686
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/note.cpp	Thu Mar 17 21:12:59 2016 +0000
@@ -0,0 +1,141 @@
+#include "note_private.h"
+extern Serial pc;
+
+NOTE note_record[MAX_NUM_NOTE];
+int note_tick=0;            // Internal note tick, used to make the note move at the appropriate speed
+int note_interval = 25;     // The interval on which notes are created. Higher number is more frequent
+int note_speed = 4;         // The speed at which the notes travel
+
+// See the comments in note_public.h
+void note_generator(void){
+    note_tick++;
+    // only create the notes at certain ticks
+    if((note_tick % note_interval)==0 || note_tick==0){
+        note_create();
+    }
+    
+    // update the notes and draw them
+    note_update_position();
+}
+
+// set note speed (default speed is 4)
+void set_note_speed(int speed){
+    if(speed>=1 && speed<=8){  
+        note_speed = speed;
+    }
+}
+
+// set note interval (default interval is 25)
+void set_note_interval(int interval){
+    if(interval>=1 && interval<=100){
+        note_interval = interval;
+    }
+}
+
+// See the comments in note_public.h
+NOTE note_get_info(int index){
+    return note_record[index];
+}
+
+// See the comments in note_public.h
+void note_set_played(int index){
+    note_record[index].status = NOTE_PLAYED;
+    //pc.printf("Note %i has been changed to played",index); FOR DEBUGGING PURPOSES
+}
+
+// See the comments in note_public.h
+void note_set_missed(int index){
+    note_record[index].status = NOTE_MISSED;
+    //pc.printf("Note %i has been changed to missed",index); FOR DEBUGGING PURPOSES
+}
+
+// See the comments in hote_public.h
+void set_note_color(int index, int color){
+    note_record[index].color = color;
+}
+
+/** This function finds an empty slot of note_record, and actives it.
+*/
+void note_create(void){
+    int i,laneIndex;
+    int startingPoints[3] = {22,65,108};    // The three possibilities for the X coordinate of the center of the note
+    int colors[3] = {0xFFFF00,RED,GREEN};   // The three possibilities for the color of the note
+    for(i=0;i<MAX_NUM_NOTE;i++){
+        if(note_record[i].status == NOTE_DEACTIVE){ // Only create new notes in a space where there is a deactive note
+            laneIndex = (rand() % 3);               // Randomly choose which lane to put the note in
+            note_record[i].y = 0;                   // Initialize the note's Y value
+            //each note has its own tick
+            note_record[i].tick = 0;
+            //set a random source for the note
+            note_record[i].source_x = startingPoints[laneIndex];
+            note_record[i].lane = laneIndex;
+            //pc.printf("Note %i is in lane %i \n\r",i,laneIndex); FOR DEBUGGING PURPOSES
+            //set appropriate color for note
+            note_record[i].color = colors[laneIndex];
+            //the note starts at its source
+            note_record[i].x = note_record[i].source_x;
+            //the note must be set to active
+            note_record[i].status = NOTE_ACTIVE;
+            break;
+        }
+    }
+}
+
+/** This function update the position of all notes and draws them
+*/
+void note_update_position(void){
+    int i;
+    double delta_y;
+    //controls how fast the note will move
+    int rate = note_speed * 25;
+    for(i=0;i<MAX_NUM_NOTE;i++){
+        if(note_record[i].status == NOTE_ACTIVE){
+            // update note position
+            delta_y = 200/rate;
+            note_draw(note_record[i], BLACK);                               // Draw over old location of note
+            note_record[i].y = (int)((delta_y*(note_record[i].tick%rate))); // Update the Y value of the note
+            //pc.printf("Note %i has a y value of %i \n\r",i,note_record[i].y); FOR DEBUGGING PURPOSES
+            note_draw(note_record[i], note_record[i].color);                 // Draw note in its new location
+            //update note's internal tick
+            note_record[i].tick++;
+        }       
+        else if((note_record[i].status == NOTE_PLAYED) || (note_record[i].status == NOTE_MISSED)){  // If the status of the note is not active
+            // clear the note off the screen
+            note_draw(note_record[i], BLACK);
+            // we are done with this note, mark as deactive
+            note_record[i].status = NOTE_DEACTIVE;
+            //resets the note's internal tick
+            note_record[i].tick = 0;
+            //resets the note's y position 
+            note_record[i].y = 128;
+        }
+        
+    }
+}
+
+/** This function draws a note.
+    @param note The note to be drawn
+    @param color The color of the note
+*/
+void note_draw(NOTE note, int color){
+    int current_x,current_y;
+    current_x = note.x;
+    current_y = note.y;
+    if(color != BLACK)              // If we arent erasing a note
+    {
+    uLCD.filled_circle(current_x, current_y,4, WHITE);
+    uLCD.circle(current_x, current_y,10,WHITE);
+    for(int i = 5;i<10;i++)
+        {
+            uLCD.circle(current_x,current_y,i,color);
+        }
+    }
+    else
+    {
+        uLCD.filled_circle(current_x,current_y,10,BLACK);
+        
+        }
+}
+
+
+