updated 7seg controls for new 7 seg boards

Dependencies:   PixelArray WS2812 mbed

Fork of frdm_pong_table_controller by Demo Team

Files at this revision

API Documentation at this revision

Comitter:
DanGibbons
Date:
Tue Jul 11 13:02:44 2017 +0000
Parent:
8:66dac2e00cce
Child:
10:554301a1579b
Commit message:
Improved button behaviour.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Jul 11 08:51:23 2017 +0000
+++ b/main.cpp	Tue Jul 11 13:02:44 2017 +0000
@@ -4,64 +4,24 @@
 {
     Setup();
     
-    pc.printf("\nIDLE");
+    pc.printf("\nSETUP(IDLE)");
 
     while(1) {
         
-        if (idle_flag == 0) { 
-            
-            if (idle_button_pressed == 1) { // button just pressed
+        if (idle_flag == 0) { // IDLE
             
-                pc.printf("\nIDLE");
-                
-                idle_button_pressed = 0;
-                
-                PlayToIdleTransition();
-                            
-            }
-            
-            CircleAnimation(true,true,true,true,1);
-
-            wait(0.02);
+            IdleStateProtocol();
             
         }
         
-        if (idle_flag == 1) {
-            
-            if (idle_button_pressed == 1) { // button just pressed
-                
-                pc.printf("\nPLAY");
-                
-                idle_button_pressed = 0;
-                
-                IdleToPlayTransition();
-
-            }
+        if (idle_flag == 1) { // PLAY
             
-            double rbbValue = robotBreakBeam; // Read Robot Break beam
-            double pbbValue = playerBreakBeam; // Read Player Break beam
-
-            // IF PLAYER HAS SCORED A GOAL
-            if (((prevRbbValue - rbbValue)>0.03)|| (PB1==0)) {
-                //pc.printf("Player has scored a goal \n\r");
-                HandleGoal(false);
-            }
-
-            // IF ROBOT HAS SCORED A GOAL
-            if (((prevPbbValue - pbbValue) > 0.03)|| (PB2==0)) {
-                //pc.printf("Robot has scored a goal \n\r");
-                HandleGoal(true);
-            }
-
-            prevRbbValue = rbbValue;
-            prevPbbValue = pbbValue;
-
-            //pc.printf("PlayerGoal: %f, RobotGoal: %f \r\n",pbbValue,rbbValue);
-            //pc.printf("Player: %i v %i : Robot \r\n",playerScore,robotScore);
-            wait(0.02);
+            PlayStateProtocol();
         
         }
-
+        
+        wait(0.02);
+        
     }
     
 }
@@ -95,14 +55,65 @@
     
 }
 
+void IdleStateProtocol()
+{
+    if (idle_button_pressed == 1) { // button just pressed
+
+        pc.printf("\nIDLE");
+
+        PlayToIdleTransition();
+
+    }
+
+    FigureOf8Animation(true,true,true,true,1);
+    CircleAnimation(true,true,true,true,1);
+    
+}
+
+void PlayStateProtocol()
+{
+    if (idle_button_pressed == 1) { // button just pressed
+
+        pc.printf("\nPLAY");
+
+        IdleToPlayTransition();
+
+    }
+    
+    double rbbValue = robotBreakBeam; // Read Robot Break beam
+    double pbbValue = playerBreakBeam; // Read Player Break beam
+
+    // IF PLAYER HAS SCORED A GOAL
+    if (((prevRbbValue - rbbValue)>0.03)|| (PB1==0)) {
+        //pc.printf("Player has scored a goal \n\r");
+        HandleGoal(false);
+    }
+
+    // IF ROBOT HAS SCORED A GOAL
+    if (((prevPbbValue - pbbValue) > 0.03)|| (PB2==0)) {
+        //pc.printf("Robot has scored a goal \n\r");
+        HandleGoal(true);
+    }
+
+    prevRbbValue = rbbValue;
+    prevPbbValue = pbbValue;
+
+    //pc.printf("PlayerGoal: %f, RobotGoal: %f \r\n",pbbValue,rbbValue);
+    //pc.printf("Player: %i v %i : Robot \r\n",playerScore,robotScore);
+    
+}
+
 void IdleToPlayTransition()
 {
+    // reset scores
     robotScore = 0;
     playerScore = 0;
     
+    // reset array
     memset(mainArray, 0, sizeof mainArray);
     
-    for (int i = 9; i < 115; i++) { // loop to set LEDs around the circle from start of segment A to end of Segment F
+    // form closed loop of LEDs around exterior of display in opposite directions for robot and player scores
+    for (int i = 9; i < 115; i++) { 
 
         if (i < 104) {
             mainArray[0][i] = 1;
@@ -126,29 +137,35 @@
 
     }
     
-    DrainAnimation(true,true,robotScore,true,true,playerScore);
+    // drain closed loop away
+    DrainAnimation(true,true,true,true);
     
     wait(1);
     
+    // flash 0-0 on display
     WriteScores();
     
     idleButton.enable_irq();
     
+    idle_button_pressed = 0;
+
 }
 
 void PlayToIdleTransition()
 {
+    // reset scores and main array
     robotScore = 0;
     playerScore = 0;
     memset(mainArray, 0, sizeof mainArray);
     
-    wait(1);
-    
+    FigureOf8Animation(true,true,true,true,1);
+        
     idleButton.enable_irq();
+        
+    idle_button_pressed = 0;
     
 }
 
-
 // set segment number patterns
 void SetNumberPatterns()
 {
@@ -411,7 +428,7 @@
 {
     GoalAnimation(hasRobotScored);
 
-    // If either player reaches the score limit, then call HandleWin(). If not, then turn goal LEDs off
+    // If either player reaches the score limit, then call HandleWin()
     if(robotScore == scoreLimit || playerScore == scoreLimit) {
         HandleWin();
     } 
@@ -440,6 +457,7 @@
     robotScore = 0;
     playerScore = 0;
     
+    // IDLE state
     idle_flag = 0;
     
     memset(mainArray, 0, sizeof mainArray);
@@ -451,6 +469,7 @@
 {
     if(hasRobotScored == true) {
         
+        // clear current score 
         switch (robotScore) {
             case 0:   
                 ZeroOutAnimation(true,false,false,false);
@@ -466,10 +485,12 @@
             default : 
                 break;   
         }
-
+        
+        // increment score
         robotScore++;
         wait_ms(250);
         
+        // write new score
         switch (robotScore) {
             case 0: 
                 ZeroInAnimation(true,false,false,false);
@@ -481,13 +502,14 @@
                 TwoInAnimation(true,false,false,false);
                 break;
             case 3: 
-                ThreeInAnimation(true,true,false,false);
+                ThreeInAnimation(true,true,false,false); // with random colour pattern
             default : 
                 break;   
         }
         
     } else {
         
+        // clear current score 
         switch (playerScore) {
             case 0: 
                 ZeroOutAnimation(false,false,true,false);
@@ -503,9 +525,12 @@
             default : 
                 break;   
         }
+        
+        // increment score
         playerScore++;
         wait_ms(250);
         
+        // write new score
         switch (playerScore) {
             case 0: 
                 ZeroInAnimation(false,false,true,false);
@@ -517,7 +542,7 @@
                 TwoInAnimation(false,false,true,false);
                 break;
             case 3: 
-                ThreeInAnimation(false,false,true,true);
+                ThreeInAnimation(false,false,true,true); // with random colour pattern
             default : 
                 break;   
         }
@@ -541,7 +566,7 @@
             wait_ms(50);
         }     
         
-        DrainAnimation(true,false,robotScore,true,true,playerScore); // drain both scores away with the player score in random colours
+        DrainAnimation(true,false,true,true); // drain both scores away with the player score in random colours
         
         // reset robot score brightness
         robotScoreLED.setII(0xB0);
@@ -560,7 +585,7 @@
             wait_ms(50);                 
         }
         
-        DrainAnimation(true,true,robotScore,true,false,playerScore); // drain both scores away with the robot score in random colours
+        DrainAnimation(true,true,true,false); // drain both scores away with the robot score in random colours
         
         // reset player score brightness
         playerScoreLED.setII(0xB0);
@@ -571,7 +596,197 @@
     
 } 
 
+// LEDs snake in a figure of 8 pattern in a group of 10
+void FigureOf8Animation(bool robot, bool robotColour, bool player, bool playerColour, int numberOfRepititions)
+{        
+    for (int loops = 0; loops < numberOfRepititions; loops++) {
 
+        for (int i = 0; i < 9; i++) { // loop for LED snake to separate from centre of segment A
+            
+            mainArray[0][9+i] = 1;
+            mainArray[1][8-i] = 1;
+            if (i < 9) {
+                mainArray[0][i] = 0;
+                mainArray[1][17-i] = 0;
+            } 
+            wait_ms(10);
+
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            } 
+        }
+        
+        for (int i = 0; i < 17; i++) { // loop for LED snake to go down segments B and F
+            
+            mainArray[0][18+i] = 1;
+            mainArray[1][103-i] = 1;
+            mainArray[0][9+i] = 0;
+            if (i < 9) {
+                mainArray[1][8-i] = 0;
+            } else {
+                mainArray[1][112-i] = 0;
+            }
+            wait_ms(10);
+            
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+        
+        for (int i = 0; i < 18; i++) { // loop for LED snake to pass through segment G
+            
+            mainArray[0][121-i] = 1;
+            mainArray[1][104+i] = 1;
+            if (i < 9) {
+                mainArray[0][26+i] = 0;
+                mainArray[1][95-i] = 0;
+            } else {
+                mainArray[0][130-i] = 0;
+                mainArray[1][95+i] = 0;
+            }
+           wait_ms(10);
+            
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+        
+        for (int i = 0; i < 17; i++) { // loop for LED snake to pass down through segments E and C
+            
+            mainArray[0][86-i] = 1;
+            mainArray[1][35+i] = 1;
+            if (i < 9) {
+                mainArray[0][112-i] = 0;
+                mainArray[1][113+i] = 0;
+            } else {
+                mainArray[0][95-i] = 0;
+                mainArray[1][26+i] = 0;
+            }
+            wait_ms(10);
+            
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+        
+        for (int i = 0; i < 35; i++) { // loop for LED snake to pass through segments D and E AND D and C
+            
+            mainArray[0][69-i] = 1;
+            mainArray[1][52+i] = 1;
+            mainArray[0][80-i] = 0;
+            mainArray[1][43+i] = 0;
+      
+            wait_ms(10);
+            
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+        
+        for (int i = 0; i < 18; i++) { // loop for LED snake to pass through segment G
+            
+            mainArray[0][121-i] = 1;
+            mainArray[1][104+i] = 1;
+            if (i < 9) { ////////////////
+                mainArray[0][45-i] = 0;
+                mainArray[1][78+i] = 0;
+                if (i == 8) {
+                    mainArray[0][36] = 0;
+                    mainArray[0][35] = 0;
+                }
+            } else {
+                mainArray[0][130-i] = 0;
+                mainArray[1][95+i] = 0;
+            }
+            wait_ms(10);
+            
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+        
+        for (int i = 0; i < 17; i++) { // loop for LED snake to go up segments B and F
+            
+            mainArray[0][87+i] = 1;
+            mainArray[1][34-i] = 1;
+            if (i < 9) {
+                mainArray[0][112-i] = 0;
+                mainArray[1][113+i] = 0;
+            } else {
+                mainArray[0][78+i] = 0;
+                mainArray[1][43-i] = 0;
+            }
+            wait_ms(10);
+            
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+        
+        for (int i = 0; i < 9; i++) { // loop for LED snake to pass through the centre of segment A
+            
+            mainArray[0][i] = 1;
+            mainArray[1][17-i] = 1;
+            if (i < 9) {
+                mainArray[0][95+i] = 0;
+                mainArray[1][26-i] = 0;
+            } else {
+                mainArray[0][i-9] = 0;
+                mainArray[1][26-i] = 0;
+            }
+            wait_ms(10);
+
+            if (player == true) {
+                WritePxAnimation(0,false,playerColour);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            if (robot == true) {
+                WritePxAnimation(1,true,robotColour);
+                robotScoreLED.write(robotScorePx.getBuf());
+            } 
+        }
+        
+        
+    }
+    
+}  
+
+// LEDs snake in a figure of 8 pattern in a group of 10
 void CircleAnimation(bool robot, bool robotColour, bool player, bool playerColour, int numberOfRepititions)
 {        
     for (int loops = 0; loops < numberOfRepititions; loops++) {
@@ -630,11 +845,11 @@
 }  
 
 // animation that drains the display from the top segment A to the bottom segment D
-void DrainAnimation(bool robot, bool robotColour, int robotScore, bool player, bool playerColour, int playerScore)
+void DrainAnimation(bool robot, bool robotColour,bool player, bool playerColour)
 {
     SetNumberPatterns();
     
-    for (int i = 0; i < 10; i++) { // A
+    for (int i = 0; i < 10; i++) { // drain A from the centre of the segment
         mainArray[robotScore][9+i] = 0;
         mainArray[robotScore][9-i] = 0;
         mainArray[playerScore][9+i] = 0;
@@ -649,7 +864,7 @@
         robotScoreLED.write(robotScorePx.getBuf());
         }
     }
-    for (int i = 0; i < 18; i++) { // B and F
+    for (int i = 0; i < 18; i++) { // drain B and F downwards
         mainArray[robotScore][18+i] = 0;
         mainArray[robotScore][103-i] = 0;
         mainArray[playerScore][18+i] = 0;
@@ -666,7 +881,7 @@
     }
     if (robotScore != 0 | playerScore != 0) { // endgame - at least one score is three
 
-        for (int i = 0; i < 18; i++) { // G
+        for (int i = 0; i < 18; i++) { // drain G across
             mainArray[robotScore][104+i] = 0;
             mainArray[playerScore][104+i] = 0;
             if (player == true) {
@@ -679,7 +894,7 @@
             }
         }
     } else { // start of game - both scores are 0
-        for (int i = 0; i < 18; i++) { // G
+        for (int i = 0; i < 18; i++) { // instantly delete G
             mainArray[robotScore][104+i] = 0;
             mainArray[playerScore][104+i] = 0;
         }
@@ -693,7 +908,7 @@
         }
     }
 
-    for (int i = 0; i < 18; i++) { // C and E
+    for (int i = 0; i < 18; i++) { // drain C and E downwards
         mainArray[robotScore][35+i] = 0;
         mainArray[robotScore][86-i] = 0;
         mainArray[playerScore][35+i] = 0;
@@ -708,7 +923,7 @@
         robotScoreLED.write(robotScorePx.getBuf());
         }
     }
-    for (int i = 0; i < 10; i++) { // D
+    for (int i = 0; i < 10; i++) { // drain D from edges to centre
         mainArray[robotScore][52+i] = 0;
         mainArray[robotScore][70-i] = 0;
         mainArray[playerScore][52+i] = 0;
@@ -735,7 +950,7 @@
      
      if (player == true && robot == true) {
 
-        for (int i = 0; i < 10; i++) { // A
+        for (int i = 0; i < 10; i++) { // write A from centre
             mainArray[0][9+i] = 1;
             mainArray[0][9-i] = 1;
             wait_ms(10);
@@ -744,7 +959,7 @@
             WritePxAnimation(robotScore,true,robotColour);
             robotScoreLED.write(robotScorePx.getBuf());
         }
-        for (int i = 0; i < 18; i++) { // B and F
+        for (int i = 0; i < 18; i++) { // write B and F downwards
             mainArray[0][18+i] = 1;
             mainArray[0][103-i] = 1;
             wait_ms(10);
@@ -753,7 +968,7 @@
             WritePxAnimation(robotScore,true,robotColour);
             robotScoreLED.write(robotScorePx.getBuf());
         }
-        for (int i = 0; i < 18; i++) { // C and E
+        for (int i = 0; i < 18; i++) { // write C and E downwards
             mainArray[0][35+i] = 1;
             mainArray[0][86-i] = 1;
             wait_ms(10);
@@ -762,7 +977,7 @@
             WritePxAnimation(robotScore,true,robotColour);
             robotScoreLED.write(robotScorePx.getBuf());
         }
-        for (int i = 0; i < 10; i++) { // D
+        for (int i = 0; i < 10; i++) { // write D from edges to centre
             mainArray[0][52+i] = 1;
             mainArray[0][70-i] = 1;
             wait_ms(10);
@@ -852,10 +1067,7 @@
             robotScoreLED.write(robotScorePx.getBuf());
         }
         
-    }
-
-    SetNumberPatterns();
-    
+    }    
     
 }  
 
@@ -989,10 +1201,7 @@
             robotScoreLED.write(robotScorePx.getBuf());
         }
         
-    }
-
-    SetNumberPatterns();
-    
+    }    
     
 }  
 
@@ -1034,9 +1243,6 @@
         }
         
     }
-
-    SetNumberPatterns();
-    
     
 }   
  
@@ -1076,8 +1282,6 @@
         }
         
     }
-
-    SetNumberPatterns();
     
 }
 
@@ -1159,8 +1363,6 @@
         }
         
     }
-
-    SetNumberPatterns();
     
 }
 
@@ -1240,8 +1442,6 @@
         }
         
     }
-
-    SetNumberPatterns();
     
 }
 
@@ -1326,8 +1526,6 @@
         }
         
     }
-
-    SetNumberPatterns();
     
 }
 
@@ -1396,15 +1594,14 @@
         }
         
     }
-
-    SetNumberPatterns();
     
 }
 
 void idleButtonISR()
 {
-    idle_flag = !idle_flag;
-    idle_button_pressed = 1;
-    pc.printf("\nidle flag = %d",idle_flag);
-    idleButton.disable_irq();
+    if (idle_button_pressed == 0) {
+        idle_flag = !idle_flag;
+        idle_button_pressed = 1;
+        idleButton.disable_irq();
+    }
 }
--- a/main.h	Tue Jul 11 08:51:23 2017 +0000
+++ b/main.h	Tue Jul 11 13:02:44 2017 +0000
@@ -68,21 +68,26 @@
 double prevPbbValue; // Previous player break beam value
 
 // FUNCTION DECLERATIONS
-void Setup(); // initial pattern
+void Setup();
 void SetNumberPatterns(); // sets segment patterns for numbers
 void SetLEDArray(int x); // sets segment patterns in mainArray
 void WriteScores(); // writes scores to the LEDs
 void WritePxAnimation(int line_num,bool isRobot,bool colour); // writes mainArray to either LED buffer in blue or random colours
 
+// Protocols for handling goals and whether the player or robot has won
 void HandleGoal(bool hasRobotScored); 
 void HandleWin();
 
+// Animation for scoring a goal and winning the game
 void GoalAnimation(bool hasRobotScored);
 void WinAnimation(bool isRobotWinner);
 
+// Decorative Animations
 void CircleAnimation(bool robot, bool robotColour,bool player, bool playerColour, int numberOfRepitions);
-void DrainAnimation(bool robot, bool robotColour, int robotScore, bool player, bool playerColour, int playerScore);
+void FigureOf8Animation(bool robot, bool robotColour,bool player, bool playerColour, int numberOfRepitions);
+void DrainAnimation(bool robot, bool robotColour, bool player, bool playerColour);
 
+// Animations for writing and deleting displayed numbers
 void ZeroInAnimation(bool robot, bool robotColour,bool player, bool playerColour);
 void ZeroOutAnimation(bool robot, bool robotColour,bool player, bool playerColour);
 void OneInAnimation(bool robot, bool robotColour,bool player, bool playerColour);
@@ -92,6 +97,9 @@
 void ThreeInAnimation(bool robot, bool robotColour,bool player, bool playerColour);
 void ThreeOutAnimation(bool robot, bool robotColour,bool player, bool playerColour);
 
+// Protocol and transition functions for Idle and Play states
+void IdleStateProtocol();
+void PlayStateProtocol();
 void PlayToIdleTransition();
 void IdleToPlayTransition();