Ellis Blackford Stroud 201155309

Dependencies:   mbed FATFileSystem

Revision:
12:7f7fadb5c106
Parent:
10:9f54a6366e94
Child:
13:681192091568
--- a/main.cpp	Thu Apr 25 15:16:38 2019 +0000
+++ b/main.cpp	Fri May 03 09:39:24 2019 +0000
@@ -19,70 +19,84 @@
 Gamepad pad;
 Menu menu;
 GolfEngine golf;
+Ticker ticker_frame;
 
 //functions
 void init();
 void inverseFlash();
-//
-int frame_rate;
+void frame_isr();
+
+int frame_rate; //frame rate got from menu class - can be changed in settings
+//flag set in isr 
+volatile int g_frame_flag = 0;
 
 int main()
 {
     init();
     lcd.clear();
-    menu.print_welcome(lcd);
+    menu.print_welcome(lcd); 
     lcd.clear();
     bool start_game = false; 
     
     while(start_game == false) {   //menu loop navigates menu until game started
-        
         menu.menu_screen(pad, lcd); 
         start_game = menu.menu_change(lcd, pad); //changes menu screen to selected screen the returns true when start game 
     }  
+    
     lcd.clear();
     golf.printLevel(lcd); 
     lcd.refresh();
     wait(1);
     frame_rate = menu.get_frame_rate(); //changes frame rate to the value chosen in settings
     golf.init(frame_rate); //resets variables for game and sets frame rate
+    ticker_frame.attach(&frame_isr,1.0f/frame_rate); //calls isr code 
 
-    //game loop to run game
-    
     while(1){ 
+
+        //Game Loop - 
+        if(g_frame_flag) { //Causes game loop code to run at frame rate 
         
-        if(golf.get_hole_flag() == false) { //if ball not in hole
+            g_frame_flag = 0; //reset flag
+        
+            if(golf.get_hole_flag() == false) { //if ball not in hole run game loop
             
-            lcd.clear();
-            golf.read_input(pad);
-            golf.update_ball(pad);
-            golf.drawGame(lcd, pad);     
-            lcd.refresh();
-            wait(1.0f/frame_rate); //time between loops/frames (at lower frame rates ball may be harder to get in hole)
+                lcd.clear();
+                golf.read_input(pad); //reads input from gamepad 
+                golf.update_ball(pad); //moves ball and checks for bounces/shots/holes
+                golf.drawGame(lcd, pad); //draws ball, walls etc.
+                lcd.refresh(); //updates lc display
+                sleep(); //sleeps mcu until ticker wakes it up
             
-        } else if(golf.get_hole_flag() == true) { //if ball goes in hole end level and start new level
+            } else if(golf.get_hole_flag() == true) { //if ball in hole then end level 
             
-            inverseFlash(); //flashes screen pixels on and off
-            inverseFlash();
-            lcd.clear();
-            golf.new_level(); //moves ball to new level position and increments level
-            golf.reset_hole_flag(); //so that the game loop can continue
-            golf.printLevel(lcd); //notifying user of start of new level 
-            lcd.refresh();
-            wait(1);
+                inverseFlash(); //flashes screen pixels on and off to indicate end of level
+                inverseFlash();
+                lcd.clear();
+                golf.new_level(); //moves ball to new level position and increments level
+                golf.reset_hole_flag(); //so that the game loop can continue
+                golf.printLevel(lcd); //prints level number 
+                lcd.refresh();
+                wait(1);
+            }   
         }
     }
 }
 
-void init()
+void frame_isr() //called by ticker at rate of frame rate 
 {
+    g_frame_flag = 1;   // set flag in ISR
+}
+
+void init() //initialises lcd and pad peripherals
+{ 
     lcd.init();
     pad.init();
     menu.init();
-    lcd.setContrast(0.5f);
+    lcd.setContrast(0.5f); //can alter this in settings
 }
 
-void inverseFlash()
-{
+void inverseFlash() // at end of level to indicate ball in hole
+{ 
     lcd.inverseMode();
     lcd.refresh();
     wait(0.25);