updated 7seg controls for new 7 seg boards

Dependencies:   PixelArray WS2812 mbed

Fork of frdm_pong_table_controller by Demo Team

Revision:
5:2d439ccefc7d
Parent:
4:2e80bd814f57
Child:
6:5e8e2645cd93
--- a/main.cpp	Wed Jul 05 15:23:44 2017 +0000
+++ b/main.cpp	Thu Jul 06 16:16:36 2017 +0000
@@ -42,28 +42,23 @@
     playerScoreLED.setII(0xB0);
     playerScoreLED.useII(WS2812::GLOBAL);
     
-    SetFigureOf8Pattern();
-    
-    FigureOf8Animation();
-    
-    // Fills 2D main array with data
-    SetNumberPatterns();
-    
     // Set scores to 0
     robotScore = 0;
     playerScore = 0;
     numFlashes = 0;
-
-    // Set LEDS to start values
+    
+    FigureOf8Animation(true,true,2); // run animation 2 times for both robot and player scores
+    DrainAnimation(true,true,robotScore,true,true,playerScore); // run animation for both scores with random colour pattern 
+    
+    SetNumberPatterns();
+    
     WriteScores();
 
-    wait(1);
-
     // Turn off green LED
     led_green = 1;
 }
 
-// Set segment variables
+// set segment number patterns
 void SetNumberPatterns()
 {
     for (int num = 0; num < 11; num++) {
@@ -222,6 +217,7 @@
 
 }
 
+// segment pattern for figure of 8 animation
 void SetFigureOf8Pattern()
 {
     for(int seg = 0; seg < 8; seg++) {
@@ -333,12 +329,100 @@
 
 }
 
+// Segment Pattern for circle animation
+void SetCirclePattern()
+{
+    for(int seg = 0; seg < 6; seg++) {
+
+        switch (seg) {
+            case 0 :
+                seg1A = 1;
+                seg1B = 0;
+                seg1C = 0;
+                seg1D = 0;
+                seg1E = 0;
+                seg1F = 0;
+                seg1G = 0;
+
+                SetLEDArray(0);
+                break;
+
+            case 1 :
+                seg1A = 0;
+                seg1B = 1;
+                seg1C = 0;
+                seg1D = 0;
+                seg1E = 0;
+                seg1F = 0;
+                seg1G = 0;
+
+                SetLEDArray(1);
+                break;
+
+            case 2 :
+                seg1A = 0;
+                seg1B = 0;
+                seg1C = 1;
+                seg1D = 0;
+                seg1E = 0;
+                seg1F = 0;
+                seg1G = 0;
+
+                SetLEDArray(2);
+                break;
+
+            case 3 :
+                seg1A = 0;
+                seg1B = 0;
+                seg1C = 0;
+                seg1D = 1;
+                seg1E = 0;
+                seg1F = 0;
+                seg1G = 0;
+
+                SetLEDArray(3);
+                break;
+
+            case 4:
+                seg1A = 0;
+                seg1B = 0;
+                seg1C = 0;
+                seg1D = 0;
+                seg1E = 1;
+                seg1F = 0;
+                seg1G = 0;
+
+                SetLEDArray(4);
+                break;
+
+            case 5:
+                seg1A = 0;
+                seg1B = 0;
+                seg1C = 0;
+                seg1D = 0;
+                seg1E = 0;
+                seg1F = 1;
+                seg1G = 0;
+
+                SetLEDArray(5);
+                break;
+
+            default :
+
+                break;
+
+        }
+        
+    }
+
+}
+
 // Write segment config to main array
 void SetLEDArray(int x)
 {
     for (int i = 0; i < WS2812_BUF; i++) {
         if (i < 18) {
-            mainArray[x][i] = seg1A;
+            mainArray[x][i] = seg1A; 
         }
 
         if ( i >= 18 && i < 35) {
@@ -377,7 +461,7 @@
     robotScoreLED.write(robotScorePx.getBuf());
 }
 
-// Write pixel array
+// Write pixel array for Numbers (drawing animation
 void WritePxScores(int line_num,bool isRobot)
 {
     if(isRobot == true) {
@@ -389,6 +473,64 @@
 
             if (mainArray[line_num][i] == 1) {
                 robotScorePx.Set(i,BLUE);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+    } else {
+        for (int i = 0; i < WS2812_BUF; i++) {
+            if (mainArray[line_num][i] == 0) {
+                playerScorePx.Set(i,OFF);
+            }
+
+            if (mainArray[line_num][i] == 1) {
+                playerScorePx.Set(i,BLUE);
+                robotScoreLED.write(robotScorePx.getBuf());
+            }
+        }
+    }
+
+}
+
+// Write Pixel array with random colour pattern
+void WritePxScoresRandomColours(int line_num,bool isRobot)
+{
+    if(isRobot == true) {
+
+        for (int i = 0; i < WS2812_BUF; i++) {
+            if (mainArray[line_num][i] == 0) {
+                robotScorePx.Set(i,OFF);
+            }
+
+            if (mainArray[line_num][i] == 1) {
+                robotScorePx.Set(i,rand_colors[rand() % 10]);
+            }
+        }
+    } else {
+        for (int i = 0; i < WS2812_BUF; i++) {
+            if (mainArray[line_num][i] == 0) {
+                playerScorePx.Set(i,OFF);
+            }
+
+            if (mainArray[line_num][i] == 1) {
+                playerScorePx.Set(i,rand_colors[rand() % 10]);
+            }
+        }
+    }
+
+}
+
+// Write Pixel array with standard colour 
+void WritePxAnimation(int line_num,bool isRobot)
+{
+    if(isRobot == true) {
+
+        for (int i = 0; i < WS2812_BUF; i++) {
+            if (mainArray[line_num][i] == 0) {
+                robotScorePx.Set(i,OFF);
+            }
+
+            if (mainArray[line_num][i] == 1) {
+                robotScorePx.Set(i,BLUE);
             }
         }
     } else {
@@ -405,12 +547,7 @@
 
 }
 
-// Write the goal LEDs and score LEDs when a goal is recorded. Also check to see if the goal being scored
-// is the final point of the game and the game is over.
-// INPUTS: hasRobotScored
-//      
-//      hasRobotScored - true if the goal being recorded is from the playerside goal, meaning the robot has scored a point
-//
+// Handle behaviour for when a goal scored event
 void HandleGoal(bool hasRobotScored)
 {
     GoalAnimation(hasRobotScored);
@@ -446,59 +583,272 @@
     // Reset scores then write to LEDs
     robotScore = 0;
     playerScore = 0;
+    
+    FigureOf8Animation(true,true,2);
+    DrainAnimation(true,true,0,true,true,0);
+    
     WriteScores();
 }
 
+// animation for when a goal is scored
 void GoalAnimation(bool hasRobotScored)
 {
     if(hasRobotScored == true) {
         robotScore++;
-        wait(0.5);
-        WriteScores();
-        wait(0.5);
         robotScorePx.SetAll(0);
         robotScoreLED.write(robotScorePx.getBuf());
-        wait(0.5);
+        wait_ms(250);
+        FigureOf8Animation(true,false,1);
         WriteScores();
         
     } else {
         playerScore++;
-        wait(0.5);
-        WriteScores();
-        wait(0.5);
         playerScorePx.SetAll(0);
         playerScoreLED.write(playerScorePx.getBuf());
-        wait(0.5);
+        wait_ms(250);
+        FigureOf8Animation(false,true,1);
         WriteScores();
     }
     
 }
 
+// animation when player or robot win the game
 void WinAnimation(bool isRobotWinner)
 {
     if(isRobotWinner == false) {
         
-
-
+        //robotScoreLED.setII(0x10);
+        
+        for (int i = 0; i < 80; i++) { // A
+            WritePxScoresRandomColours(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+            wait_ms(50);            
+        }     
+        
+        DrainAnimation(true,false,robotScore,true,true,playerScore);
+    
     } else {
+         
+        //playerScoreLED.setII(0x10);
         
+        for (int i = 0; i < 80; i++) { // A
+            WritePxScoresRandomColours(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+            wait_ms(50);            
+        }
         
-
+        DrainAnimation(true,true,robotScore,true,false,playerScore);
     }
     
+    
+    wait(2);
+    
+    playerScorePx.SetAll(0);
+    playerScoreLED.write(playerScorePx.getBuf());
+    robotScorePx.SetAll(0);
+    robotScoreLED.write(robotScorePx.getBuf());
+    
+    wait(3);
+    
 } 
 
-void FigureOf8Animation()
+// figure of 8 animation
+void FigureOf8Animation(bool robot, bool player, int numberOfRepetitions)
 {
-    for (int i = 0; i < 3; i++) {
+    SetFigureOf8Pattern();
+    
+    for (int i = 0; i < numberOfRepetitions; i++) {
+        
         for (int j = 0; j < 8; j++) {
+            
+            if(robot == true && player == true) {
+                WritePxAnimation(j,false);
+                playerScoreLED.write(playerScorePx.getBuf());
+                WritePxAnimation(j,true);
+                robotScoreLED.write(robotScorePx.getBuf());
+            } else if(robot == true && player == false) {
+                WritePxAnimation(j,true);
+                robotScoreLED.write(robotScorePx.getBuf());
+            } else if(robot == false && player == true) {
+                WritePxAnimation(j,false);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            
+            wait_ms(20);
 
-            WritePxScores(j,false);
-            playerScoreLED.write(playerScorePx.getBuf());
-            WritePxScores(j,true);
-            robotScoreLED.write(robotScorePx.getBuf());
-            wait_ms(100);
+        }
+    }
+    
+    SetNumberPatterns();
+    
+}  
+
+// circle animation
+void CircleAnimation(bool robot, bool player, int numberOfRepetitions)
+{
+    SetCirclePattern();
+    
+    for (int i = 0; i < numberOfRepetitions; i++) {
+        
+        for (int j = 0; j < 6; j++) {
+            
+            if(robot == true && player == true) {
+                WritePxScores(j,false);
+                playerScoreLED.write(playerScorePx.getBuf());
+                WritePxScores(j,true);
+                robotScoreLED.write(robotScorePx.getBuf());
+            } else if(robot == true && player == false) {
+                WritePxScores(j,true);
+                robotScoreLED.write(robotScorePx.getBuf());
+            } else if(robot == false && player == true) {
+                WritePxScores(j,false);
+                playerScoreLED.write(playerScorePx.getBuf());
+            }
+            
+            wait_ms(10);
 
         }
     }
-}    
\ No newline at end of file
+    
+    SetNumberPatterns();
+    
+}
+
+// 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)
+{
+    if (player == true && robot == true) {
+        for (int i = 0; i < 10; i++) { // A
+            mainArray[robotScore][9+i] = 0;
+            mainArray[robotScore][9-i] = 0;
+            mainArray[playerScore][9+i] = 0;
+            mainArray[playerScore][9-i] = 0;
+            wait_ms(30);
+            WritePxScoresRandomColours(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+            WritePxScoresRandomColours(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }
+        for (int i = 0; i < 18; i++) { // B and F
+            mainArray[robotScore][18+i] = 0;
+            mainArray[robotScore][103-i] = 0;
+            mainArray[playerScore][18+i] = 0;
+            mainArray[playerScore][103-i] = 0;
+            wait_ms(30);
+            WritePxScoresRandomColours(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+            WritePxScoresRandomColours(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }  
+        for (int i = 0; i < 18; i++) { // G
+            mainArray[robotScore][104+i] = 0;
+            mainArray[playerScore][104+i] = 0;
+        }    
+        
+        WritePxScoresRandomColours(playerScore,false);
+        playerScoreLED.write(playerScorePx.getBuf());
+        WritePxScoresRandomColours(robotScore,true);
+        robotScoreLED.write(robotScorePx.getBuf());
+        
+        for (int i = 0; i < 18; i++) { // C and E
+            mainArray[robotScore][35+i] = 0;
+            mainArray[robotScore][86-i] = 0;
+            mainArray[playerScore][35+i] = 0;
+            mainArray[playerScore][86-i] = 0;
+            wait_ms(30);
+            WritePxScoresRandomColours(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+            WritePxScoresRandomColours(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }   
+        for (int i = 0; i < 10; i++) { // D
+            mainArray[robotScore][52+i] = 0;
+            mainArray[robotScore][70-i] = 0;
+            mainArray[playerScore][52+i] = 0;
+            mainArray[playerScore][70-i] = 0;
+            wait_ms(30);
+            WritePxScoresRandomColours(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+            WritePxScoresRandomColours(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }     
+    }  
+    
+    if (player == true && robot == false) {
+        for (int i = 0; i < 10; i++) { // A
+            mainArray[playerScore][9+i] = 0;
+            mainArray[playerScore][9-i] = 0;
+            wait_ms(30);
+            WritePxScores(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+        }
+        for (int i = 0; i < 18; i++) { // B and F
+            mainArray[playerScore][18+i] = 0;
+            mainArray[playerScore][103-i] = 0;
+            wait_ms(30);
+            WritePxScores(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+        }  
+        for (int i = 0; i < 18; i++) { // G
+            mainArray[playerScore][104+i] = 0;
+            wait_ms(30);
+            WritePxScores(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+        }    
+        for (int i = 0; i < 18; i++) { // C and E
+            mainArray[playerScore][35+i] = 0;
+            mainArray[playerScore][86-i] = 0;
+            wait_ms(30);
+            WritePxScores(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+        }   
+        for (int i = 0; i < 10; i++) { // D
+            mainArray[playerScore][52+i] = 0;
+            mainArray[playerScore][70-i] = 0;
+            wait_ms(30);
+            WritePxScores(playerScore,false);
+            playerScoreLED.write(playerScorePx.getBuf());
+        }     
+    }  
+    
+    if (player == false && robot == true) {
+        for (int i = 0; i < 10; i++) { // A
+            mainArray[robotScore][9+i] = 0;
+            mainArray[robotScore][9-i] = 0;
+            wait_ms(30);
+            WritePxScores(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }
+        for (int i = 0; i < 18; i++) { // B and F
+            mainArray[robotScore][18+i] = 0;
+            mainArray[robotScore][103-i] = 0;
+            wait_ms(30);
+            WritePxScores(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }  
+        for (int i = 0; i < 18; i++) { // G
+            mainArray[robotScore][104+i] = 0;
+            wait_ms(30);
+            WritePxScores(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }    
+        for (int i = 0; i < 18; i++) { // C and E
+            mainArray[robotScore][35+i] = 0;
+            mainArray[robotScore][86-i] = 0;
+            wait_ms(30);
+            WritePxScores(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }   
+        for (int i = 0; i < 10; i++) { // D
+            mainArray[robotScore][52+i] = 0;
+            mainArray[robotScore][70-i] = 0;
+            wait_ms(30);
+            WritePxScores(robotScore,true);
+            robotScoreLED.write(robotScorePx.getBuf());
+        }     
+    }  
+    
+    SetNumberPatterns();
+    
+} 
+   
\ No newline at end of file