Hugo Hu / Mbed 2 deprecated BRAVEHEART

Dependencies:   mbed N5110 ShiftReg PinDetect

Revision:
6:edb48de563a9
Parent:
5:100d960fc6d5
Child:
7:678873947b29
--- a/MainMenu.cpp	Fri May 01 09:10:23 2015 +0000
+++ b/MainMenu.cpp	Fri May 01 09:44:38 2015 +0000
@@ -1,8 +1,40 @@
 #include "MainMenu.h"
 
+enum MenuState {SELECT_PLAY, SELECT_HIGHSCORES, SELECT_CONTROLS, LOAD_GAME, HIGHSCORES, CONTROLS};
+// Static variables for internal fsm
+const int MainMenu::MENU_FSM[6][3] = {
+    {LOAD_GAME, SELECT_PLAY, SELECT_HIGHSCORES},            // State: SELECT_PLAY
+    {HIGHSCORES, SELECT_HIGHSCORES, SELECT_CONTROLS},       // State: SELECT_HIGHSCORES
+    {CONTROLS, SELECT_CONTROLS, SELECT_PLAY},               // State: SELECT_CONTROLS
+    {LOAD_GAME, LOAD_GAME, LOAD_GAME},                      // State: LOAD_GAME
+    {SELECT_HIGHSCORES, SELECT_HIGHSCORES, HIGHSCORES},     // State: HIGHSCORES
+    {SELECT_CONTROLS, SELECT_CONTROLS, CONTROLS}            // State: CONTROLS
+};
+
+int MainMenu::currentState;
+
+// Callback functions (needs to be static)
+void MainMenu::btnAPress()
+{
+    currentState = MENU_FSM[currentState][0];
+}
+
+void MainMenu::btnBPress()
+{
+    currentState = MENU_FSM[currentState][1];
+}
+
+void MainMenu::btnCPress()
+{
+    currentState = MENU_FSM[currentState][2];
+}
+
 void MainMenu::init()
 {
-    
+    MainMenu::currentState = SELECT_PLAY;
+    input->addBtnPressInterrupt(input->btnA, &btnAPress);
+    input->addBtnPressInterrupt(input->btnB, &btnBPress);
+    input->addBtnPressInterrupt(input->btnC, &btnCPress);
 }
 
 void MainMenu::update(time_t dt)
@@ -12,5 +44,49 @@
 
 void MainMenu::render()
 {
-    lcd->printString("Main Menu", 10, 1);
+    switch (currentState)
+    {        
+        case SELECT_PLAY:
+            lcd->printString(">Play", 10, 1);
+            lcd->printString("High Scores", 10, 2);
+            lcd->printString("Controls", 10, 3);
+        break;
+        
+        case SELECT_HIGHSCORES:
+            lcd->printString("Play", 10, 1);
+            lcd->printString(">High Scores", 10, 2);
+            lcd->printString("Controls", 10, 3);
+        break;
+        
+        case SELECT_CONTROLS:
+            lcd->printString("Play", 10, 1);
+            lcd->printString("High Scores", 10, 2);
+            lcd->printString(">Controls", 10, 3);
+        break;
+        
+        case HIGHSCORES:
+        // Placeholder TODO: Actually high scores
+            lcd->printString("High Scores", 10, 0);
+            lcd->printString("AND 1000000", 10, 1);
+            lcd->printString("AND  500000", 10, 2);
+            lcd->printString("AND     100", 10, 3);
+            lcd->printString(">Back", 10, 4);
+        break;
+        
+        case CONTROLS:
+            lcd->printString("Controls", 10, 0);
+            lcd->printString("A: Jump", 10, 1);
+            lcd->printString("B: Shoot", 10, 2);
+            lcd->printString("C: Pause", 10, 3);
+            lcd->printString(">Back", 10, 4);
+        break;
+        
+        case LOAD_GAME:
+            lcd->printString("Loading...", 10, 2);
+        break;
+        
+        default:
+            error("MainMenu: Invalid internal state");
+            
+    }
 }
\ No newline at end of file