A retro gaming programme, designed for use on a portable embedded system. Incorporates power saving techniques.

Dependencies:   ConfigFile N5110 PowerControl beep mbed

Revision:
11:6b8416a8ddb3
Parent:
10:947d35365ab8
Child:
12:eedda6554615
--- a/main.cpp	Thu Apr 16 16:23:42 2015 +0000
+++ b/main.cpp	Thu Apr 16 20:39:57 2015 +0000
@@ -151,74 +151,6 @@
     wait(0.6);
 }
 
-//selection menu///////////////////////////////////////////
-void mainMenu()
-{
-    //bottom border
-    lcd.drawRect(0,47,84,0,1);
-    //top border
-    lcd.drawRect(0,0,84,2,1);
-
-    //print 'Xtreme Tower'
-    lcd.printString("Xtreme",4,25);
-    lcd.printString("Tower",44,25);
-
-    //title outline
-    lcd.drawRect(3,6,77,10,0);
-
-////castle //x, y, w, h, fill//////////////////////
-
-    //castle main bulk
-    lcd.drawRect(59,32,21,8,1);
-
-    //left window bulk
-    lcd.drawRect(59,22,2,10,1);
-    //centre left window bulk
-    lcd.drawRect(65,22,2,10,1);
-    //centre right window bulk
-    lcd.drawRect(72,22,2,10,1);
-    //right window bulk
-    lcd.drawRect(78,22,2,10,1);
-    //central window bulk
-    lcd.drawRect(68,25,3,7,1);
-
-    //central window bulk
-    lcd.drawRect(75,28,0,0,1);
-    lcd.drawRect(77,28,0,0,1);
-    lcd.drawRect(64,28,0,0,1);
-    lcd.drawRect(62,28,0,0,1);
-
-    //above left window bulk
-    lcd.drawRect(62,25,3,2,1);
-    //above right window bulk
-    lcd.drawRect(75,25,2,2,1);
-
-    //lower right line
-    lcd.drawRect(71,42,9,0,1);
-    //upper right line
-    lcd.drawRect(70,41,10,0,1);
-
-    //upper left line
-    lcd.drawRect(59,41,10,0,1);
-    //lower left line
-    lcd.drawRect(59,42,9,0,1);
-
-    //bottom left bulk
-    lcd.drawRect(59,43,8,3,1);
-    //bottom right bulk
-    lcd.drawRect(72,43,8,3,1);
-
-    //option arrows - lower
-    lcd.drawRect(27,42,4,0,1);
-    lcd.drawRect(28,43,2,0,1);
-    lcd.drawRect(29,44,0,0,1);
-
-    //option arrows - higher
-    lcd.drawRect(27,29,4,0,1);
-    lcd.drawRect(28,28,2,0,1);
-    lcd.drawRect(29,27,0,0,1);
-}
-
 // static background
 void backGround()
 {
@@ -413,6 +345,23 @@
     }
 }
 
+//void writeDataToFile(float data, char dataTwo[30])
+//{
+//    leds = 15; // turn on LEDs for feedback
+//    FILE *fp = fopen("/local/datalog.csv", "a"); // open 'log.txt' for appending
+//
+//    time_t seconds = time(NULL); // get current time
+//
+//    // format time into a string (time and date)
+//    strftime(dataTwo, 30 , "%R %x", localtime(&seconds));
+//
+//    // if the file doesn't exist it is created, if it exists, data is appended to the end
+//    fprintf(fp,"%s, %.2f \n",dataTwo,data); // print string to file
+//
+//    fclose(fp); // close file
+//    leds = 0; // turn off LEDs to signify file access has finished
+//}
+
 // clears old pixels and keeps set pixels
 void startrek()
 {
@@ -464,17 +413,19 @@
             }
     lcd.refresh();
 }
+
 // sound / light when buttonA is closed
 void actionButton()
 {
     buttonA.mode(PullDown);
     if (buttonA == 1) {
         ledY = 1;
-        buzzer.beep(1000,0.2);//frequeny/duration
-        
-        serial.printf("buttonA\n");//for debugging 
+        //buzzer.beep(1000,0.2);//frequeny/duration
+
+        serial.printf("buttonA\n");//for debugging
     } else {
-        ledY = 0;}
+        ledY = 0;
+    }
 }
 
 // sound / light when buttonB is closed
@@ -483,27 +434,236 @@
     buttonB.mode(PullDown);
     if (buttonB == 1) {
         ledY = 1;
-        buzzer.beep(400,0.2);//frequency/duration
-        
+        //buzzer.beep(400,0.2);//frequency/duration
+
         serial.printf("buttonB\n");//for debugging
     } else {
-        ledY = 0;}
+        ledY = 0;
+    }
+}
+
+// presents main menu options
+void mainMenu(int& mainOption)
+{
+    actionButton();//set audible/light for button
+
+    // joystick selection
+    if (printFlag) {  //if flag set, clear flag and print joystick values to serial port
+        printFlag = 0;
+
+        // option up
+        if (joystick.direction == UP) {
+            serial.printf(" UP\n");
+            mainOption = mainOption--;
+            if (mainOption < 0)mainOption = 0;
+        }
+        // option down
+        if (joystick.direction == DOWN) {
+            serial.printf(" DOWN\n");
+            mainOption = mainOption++;
+            if (mainOption > 2)mainOption = 2;
+        }
+        // Centre / Unknown orientation
+        if (joystick.direction == CENTRE)
+            serial.printf(" CENTRE\n");
+        if (joystick.direction == UNKNOWN)
+            serial.printf(" Unsupported direction\n");
+
+        // 'Play Game' option 1
+        if (mainOption == 0) {
+            lcd.printString("Play Game",3,4);
+        }
+        // 'High Scores' option 2
+        if (mainOption == 1) {
+            lcd.printString("  Scores ",3,4);
+        }
+        // 'Options' option 3
+        if (mainOption == 2) {
+            lcd.printString(" Options ",3,4);
+        }
+    }
+}
+
+// draws main menu
+void drawMainMenu()
+{
+    //bottom border
+    lcd.drawRect(0,47,84,0,1);
+    //top border
+    lcd.drawRect(0,0,84,2,1);
+
+    //print 'Xtreme Tower'
+    lcd.printString("Xtreme",4,25);
+    lcd.printString("Tower",44,25);
+
+    //title outline
+    lcd.drawRect(3,6,77,10,0);
+
+////castle //x, y, w, h, fill//////////////////////
+
+    //castle main bulk
+    lcd.drawRect(59,32,21,8,1);
+
+    //left window bulk
+    lcd.drawRect(59,22,2,10,1);
+    //centre left window bulk
+    lcd.drawRect(65,22,2,10,1);
+    //centre right window bulk
+    lcd.drawRect(72,22,2,10,1);
+    //right window bulk
+    lcd.drawRect(78,22,2,10,1);
+    //central window bulk
+    lcd.drawRect(68,25,3,7,1);
+
+    //central window bulk
+    lcd.drawRect(75,28,0,0,1);
+    lcd.drawRect(77,28,0,0,1);
+    lcd.drawRect(64,28,0,0,1);
+    lcd.drawRect(62,28,0,0,1);
+
+    //above left window bulk
+    lcd.drawRect(62,25,3,2,1);
+    //above right window bulk
+    lcd.drawRect(75,25,2,2,1);
+
+    //lower right line
+    lcd.drawRect(71,42,9,0,1);
+    //upper right line
+    lcd.drawRect(70,41,10,0,1);
+
+    //upper left line
+    lcd.drawRect(59,41,10,0,1);
+    //lower left line
+    lcd.drawRect(59,42,9,0,1);
+
+    //bottom left bulk
+    lcd.drawRect(59,43,8,3,1);
+    //bottom right bulk
+    lcd.drawRect(72,43,8,3,1);
+
+    //option arrows - lower
+    lcd.drawRect(27,42,4,0,1);
+    lcd.drawRect(28,43,2,0,1);
+    lcd.drawRect(29,44,0,0,1);
+
+    //option arrows - higher
+    lcd.drawRect(27,29,4,0,1);
+    lcd.drawRect(28,28,2,0,1);
+    lcd.drawRect(29,27,0,0,1);
+}
+
+// presents exit menu options
+void exitMenu(int& exitOption)
+{
+
+    if (printFlag) {  //if flag set, clear flag and print joystick values to serial port
+        printFlag = 0;
+
+        // check joystick direction
+        if (joystick.direction == LEFT) {
+            serial.printf(" LEFT\n");
+            exitOption--;
+            if(exitOption < 0)exitOption = 0;
+        }
+        if (joystick.direction == RIGHT) {
+            serial.printf(" RIGHT\n");
+            exitOption++;
+            if(exitOption > 1)exitOption = 1;
+        }
+        if (joystick.direction == CENTRE)
+            serial.printf(" CENTRE\n");
+        if (joystick.direction == UNKNOWN)
+            serial.printf(" Unsupported direction\n");
+    }
+    // draws option cursor
+    if(exitOption == 0) {
+        lcd.printString("YES",29,27);
+    }
+    if(exitOption == 1) {
+        lcd.printString(" NO",29,27);
+    }
+}
+
+// draws exit menu
+void drawExitMenu()
+{
+    // set exit menu
+    lcd.clear();
+    lcd.drawRect(8,6,70,30,0);//title outline
+    lcd.printString("Exit Game?",10,25);
+    backGround();
+
+    // option arrow - right
+    lcd.drawRect(55,25,0,4,1);
+    lcd.drawRect(56,26,0,2,1);
+    lcd.drawRect(57,27,0,0,1);
+
+    // option arrow - left
+    lcd.drawRect(27,25,0,4,1);
+    lcd.drawRect(26,26,0,2,1);
+    lcd.drawRect(25,27,0,0,1);
+}
+
+void optionsMenu(int& option)
+{
+    // joystick selection
+    if (printFlag) {  //if flag set, clear flag and print joystick values to serial port
+        printFlag = 0;
+
+        // option up
+        if (joystick.direction == UP) {
+            serial.printf(" UP\n");
+            option = option--;
+            if (option < 0)option = 0;
+        }
+        // option down
+        if (joystick.direction == DOWN) {
+            serial.printf(" DOWN\n");
+            option = option++;
+            if (option > 1)option = 1;
+        }
+        // Centre / Unknown orientation
+        if (joystick.direction == CENTRE)
+            serial.printf(" CENTRE\n");
+        if (joystick.direction == UNKNOWN)
+            serial.printf(" Unsupported direction\n");
+
+        // 'Difficulty' option 1
+        if (option == 0) {
+            lcd.drawCircle(72,27,2,1);
+            refreshCursor3();
+        }
+        // 'Sound FX' option 2
+        if (option == 1) {
+            lcd.drawCircle(72,35,2,1);
+            refreshCursor2();
+        }
+    }
+}
+
+void drawOptionsMenu()
+{
+    lcd.clear();//clear screen
+    backGround();
+    lcd.drawRect(3,6,77,10,0);//title outline
+    lcd.drawRect(0,47,84,0,1);//bottom border
+    lcd.drawRect(0,0,84,2,1);//top border
+    lcd.printString("Options",20,7);//title
+    lcd.printString("Difficulty",3,9);
+    lcd.printString("Sound FX",3,10);
 }
 
 int main()
 {
-    // Power indicator - RED LED
-    ledR = 1;
+    ledR = 1;//power LED on
 
-    // helps return exit menu to main menu loop
-    int exitFlag = 0;
+    int exitFlag = 0;//exit flag
 
-    // initialize time seed for psuedo randomaisation
-    srand (time(NULL));
+    srand (time(NULL));//initial seed for randomisation
 
-    // generate random x co-ordinates for falling hazards
-    // (initial values only)
-    // value between 3 and 76
+    // initial random x co-ordinates
+    // for falling hazards
+    // (values between 3 and 76)
     randX1 = rand() % 74 + 5;
     randX2 = rand() % 74 + 5;
     randX3 = rand() % 74 + 5;
@@ -514,7 +674,6 @@
     calibrateJoystick();//get centred values of joystick
     pollJoystick.attach(&updateJoystick,1.0/10.0);//read joystick 10 times per second
 
-    // initialise menu
     lcd.init();//initialise screen
     welcome();//welcome screen
     lcd.clear();//clear pixels
@@ -525,58 +684,19 @@
     int option = 0;//counter for options menu
     int subOption = 0;//counter for sub options menu
 
-    // loop 1 - Main menu
+    // loop 1 - mainMenu
     while(1) {
 
-        mainMenu();
-        actionButton();
+        drawMainMenu();//draws main menu
+        mainMenu(mainOption);//presents main menu options
 
-        // joystick selection
-        if (printFlag) {  //if flag set, clear flag and print joystick values to serial port
-            printFlag = 0;
-  
-            // option up
-            if (joystick.direction == UP) {
-                serial.printf(" UP\n");
-                mainOption = mainOption--;
-                if (mainOption < 0)mainOption = 0;
-            }
-            // option down
-            if (joystick.direction == DOWN) {
-                serial.printf(" DOWN\n");
-                mainOption = mainOption++;
-                if (mainOption > 2)mainOption = 2;
-            }
-            // Centre / Unknown orientation
-            if (joystick.direction == CENTRE)
-                serial.printf(" CENTRE\n");
-            if (joystick.direction == UNKNOWN)
-                serial.printf(" Unsupported direction\n");
-
-            // 'Play Game' option 1
-            if (mainOption == 0) {
-                lcd.printString("Play Game",3,4);
-            }
-            // 'High Scores' option 2
-            if (mainOption == 1) {
-                lcd.printString("  Scores ",3,4);
-            }
-            // 'Options' option 3
-            if (mainOption == 2) {
-                lcd.printString(" Options ",3,4);
-            }
-        }
-
-//////////// Game Loop /////////////////////////////////////////////////////////////
-
-        // 'Play Game' selected
+        // if 'Play Game' selected
         if ((mainOption == 0)&&(buttonA == 1)) {
 
-            lcd.clear();
-
             actionButton();
             backButton();
-            backGround();
+            lcd.clear();//clears screen
+            backGround();//draw background
 
             // loop 3 - Game loop
             while(1) {
@@ -589,7 +709,6 @@
 
                 actionButton();
                 backButton();
-
                 pixelNinja();//set character
                 hazards();//initiates hazards
                 hazardFall();//increments hazards towards floor
@@ -662,50 +781,11 @@
 
                     if(buttonB == 1) {
 
-                        // set exit menu
-                        lcd.clear();
-                        lcd.drawRect(8,6,70,30,0);//title outline
-                        lcd.printString("Exit Game?",10,25);
-                        backGround();
-
-                        // option arrow - right
-                        lcd.drawRect(55,25,0,4,1);
-                        lcd.drawRect(56,26,0,2,1);
-                        lcd.drawRect(57,27,0,0,1);
-
-                        // option arrow - left
-                        lcd.drawRect(27,25,0,4,1);
-                        lcd.drawRect(26,26,0,2,1);
-                        lcd.drawRect(25,27,0,0,1);
+                        drawExitMenu();//draws the escape menu
 
                         while(1) {
 
-                            if (printFlag) {  //if flag set, clear flag and print joystick values to serial port
-                                printFlag = 0;
-
-                                // check joystick direction
-                                if (joystick.direction == LEFT) {
-                                    serial.printf(" LEFT\n");
-                                    exitOption--;
-                                    if(exitOption < 0)exitOption = 0;
-                                }
-                                if (joystick.direction == RIGHT) {
-                                    serial.printf(" RIGHT\n");
-                                    exitOption++;
-                                    if(exitOption > 1)exitOption = 1;
-                                }
-                                if (joystick.direction == CENTRE)
-                                    serial.printf(" CENTRE\n");
-                                if (joystick.direction == UNKNOWN)
-                                    serial.printf(" Unsupported direction\n");
-                            }
-                            // draws option cursor
-                            if(exitOption == 0) {
-                                lcd.printString("YES",29,27);
-                            }
-                            if(exitOption == 1) {
-                                lcd.printString(" NO",29,27);
-                            }
+                            exitMenu(exitOption);//presents exit options
 
                             // 'exit' option YES
                             if((buttonA == 1)&&(exitOption == 0)) { //returns to menu
@@ -778,145 +858,105 @@
 
             actionButton();
             backButton();
-
-            lcd.clear();//clear screen
-
-            backGround();
-            lcd.drawRect(3,6,77,10,0);//title outline
-            lcd.drawRect(0,47,84,0,1);//bottom border
-            lcd.drawRect(0,0,84,2,1);//top border
-            lcd.printString("Options",20,7);//title
-            lcd.printString("Difficulty",3,9);
-            lcd.printString("Sound FX",3,10);
+            drawOptionsMenu();//draws options menu
 
             while(1) {
 
                 actionButton();
                 backButton();
-                // refreshCursor();
-
-                // joystick selection
-                if (printFlag) {  //if flag set, clear flag and print joystick values to serial port
-                    printFlag = 0;
-
-                    // option up
-                    if (joystick.direction == UP) {
-                        serial.printf(" UP\n");
-                        option = option--;
-                        if (option < 0)option = 0;
-                    }
-                    // option down
-                    if (joystick.direction == DOWN) {
-                        serial.printf(" DOWN\n");
-                        option = option++;
-                        if (option > 1)option = 1;
-                    }
-                    // Centre / Unknown orientation
-                    if (joystick.direction == CENTRE)
-                        serial.printf(" CENTRE\n");
-                    if (joystick.direction == UNKNOWN)
-                        serial.printf(" Unsupported direction\n");
-
-                    // 'Difficulty' option 1
-                    if (option == 0) {
-                        lcd.drawCircle(72,27,2,1);
-                        refreshCursor3();
-                    }
-                    // 'Sound FX' option 2
-                    if (option == 1) {
-                        lcd.drawCircle(72,35,2,1);
-                        refreshCursor2();
-                    }
+                optionsMenu(option);//presents options
 
 ////////////////////// difficulty settings ////////////////////////////////////
-                    if ((option == 0)&&(buttonA == 1)) {
+                if ((option == 0)&&(buttonA == 1)) {
+
+                    actionButton();
+                    backButton();
+
+                    lcd.clear();
+                    backGround();
+                    lcd.drawRect(0,47,84,0,1);//bottom border
+                    lcd.drawRect(0,0,84,2,1);//top border
+                    lcd.printString("*Difficulty*",5,7);//title
+                    lcd.printString("Easy",5,8);//title
+                    lcd.printString("Normal",5,9);//title
+                    lcd.printString("Forget It",5,10);//title
+
+                    while(1) {
 
                         actionButton();
                         backButton();
 
-                        lcd.clear();
-                        backGround();
-                        lcd.drawRect(0,47,84,0,1);//bottom border
-                        lcd.drawRect(0,0,84,2,1);//top border
-                        lcd.printString("*Difficulty*",5,7);//title
-                        lcd.printString("Easy",5,8);//title
-                        lcd.printString("Normal",5,9);//title
-                        lcd.printString("Forget It",5,10);//title
-
-
-                        while(1) {
-
-                            actionButton();
-                            backButton();
+                        // joystick selection
+                        if (printFlag) {//if flag set, clear flag,print joystick values
+                            printFlag = 0;
 
-                            // joystick selection
-                            if (printFlag) {//if flag set, clear flag,print joystick values
-                                printFlag = 0;
+                            // option up
+                            if (joystick.direction == UP) {
+                                serial.printf(" UP\n");
+                                subOption = subOption--;
+                                if (subOption < 0)subOption = 0;
+                            }
+                            // option down
+                            if (joystick.direction == DOWN) {
+                                serial.printf(" DOWN\n");
+                                subOption = subOption++;
+                                if (subOption > 2)subOption = 2;
+                            }
+                            // Centre / Unknown orientation
+                            if (joystick.direction == CENTRE)
+                                serial.printf(" CENTRE\n");
+                            if (joystick.direction == UNKNOWN)
+                                serial.printf(" Unsupported direction\n");
 
-                                // option up
-                                if (joystick.direction == UP) {
-                                    serial.printf(" UP\n");
-                                    subOption = subOption--;
-                                    if (subOption < 0)subOption = 0;
-                                }
-                                // option down
-                                if (joystick.direction == DOWN) {
-                                    serial.printf(" DOWN\n");
-                                    subOption = subOption++;
-                                    if (subOption > 2)subOption = 2;
+                            // 'Easy' option 1
+                            if (subOption == 0) {
+                                lcd.drawCircle(72,19,2,1);
+                                refreshCursor2();
+                                refreshCursor3();
+                                if(buttonA ==1) { //select easy
+                                    fall = 1;
                                 }
-                                // Centre / Unknown orientation
-                                if (joystick.direction == CENTRE)
-                                    serial.printf(" CENTRE\n");
-                                if (joystick.direction == UNKNOWN)
-                                    serial.printf(" Unsupported direction\n");
+                            }
+                            // 'Normal' option 2
+                            if (subOption == 1) {
+                                lcd.drawCircle(72,27,2,1);
+                                refreshCursor1();
+                                refreshCursor3();
 
-                                // 'Easy' option 1
-                                if (subOption == 0) {
-                                    lcd.drawCircle(72,19,2,1);
-                                    refreshCursor2();
-                                    refreshCursor3();
-                                    if(buttonA ==1){//select easy
-                                        fall = 1;}
+                                if(buttonA == 1) { //select normal
+                                    fall = 2;
                                 }
-                                // 'Normal' option 2
-                                if (subOption == 1) {
-                                    lcd.drawCircle(72,27,2,1);
-                                    refreshCursor1();
-                                    refreshCursor3();
-                                    
-                                    if(buttonA == 1){//select normal
-                                        fall = 2;}
+                            }
+                            // 'Forget It' option 3
+                            if (subOption == 2) {
+                                lcd.drawCircle(72,35,2,1);
+                                refreshCursor1();
+                                refreshCursor2();
+
+                                if(buttonA == 1) { //select difficult
+                                    fall = 3;
                                 }
-                                // 'Forget It' option 3
-                                if (subOption == 2) {
-                                    lcd.drawCircle(72,35,2,1);
-                                    refreshCursor1();
-                                    refreshCursor2();
-                                    
-                                    if(buttonA == 1){//select difficult
-                                        fall = 3;}
-                                
-                                }
-                                if(buttonB == 1) {
-                                    lcd.clear();
-                                    break;
-                                }
+
+                            }
+                            if(buttonB == 1) {
+                                lcd.clear();
+                                break;
                             }
                         }
                     }
+                }
 
-                    // back to menu
-                    if(buttonB == 1) {
-                        lcd.clear();
-                        break;
-                    }
+                // back to menu
+                if(buttonB == 1) {
+                    lcd.clear();
+                    break;
                 }
             }
         }
     }
 }
 
+
 // read default positions of the joystick to calibrate later readings
 void calibrateJoystick()
 {