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:
Thu Jul 06 16:16:36 2017 +0000
Parent:
4:2e80bd814f57
Child:
6:5e8e2645cd93
Commit message:
Random Colour added; Drain animation added; Drawing animation added for numbers

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	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
--- a/main.h	Wed Jul 05 15:23:44 2017 +0000
+++ b/main.h	Thu Jul 06 16:16:36 2017 +0000
@@ -1,3 +1,6 @@
+#ifndef MAIN_H
+#define MAIN_H
+
 #include "mbed.h"
 #include "WS2812.h"
 #include "PixelArray.h"
@@ -46,6 +49,7 @@
 bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G;
 //int seg1Array[122];
 int mainArray[11][122];
+int rand_colors[] = {0x00FF00, 0x7FFF00, 0xFFFF00, 0xFF7F00, 0xFF0000, 0xFE00FF, 0x7F00FF, 0x0000FF, 0x007FFF, 0x00FFFE, 0x00FF7F};
 
 // Score counters
 int robotScore;
@@ -63,12 +67,19 @@
 void Setup();
 void SetNumberPatterns();
 void SetFigureOf8Pattern();
+void SetCirclePattern();
 void SetLEDArray(int x);
 void WriteScores();
 void HandleGoal(bool hasRobotScored);
 void WritePxScores(int line_num, bool isRobot);
+void WritePxAnimation(int line_num,bool isRobot);
+void WritePxScoresRandomColours(int line_num,bool isRobot);
 void WritePxGoal(unsigned int colour,bool isRobot);
 void HandleWin();
 void GoalAnimation(bool hasRobotScored);
 void WinAnimation(bool isRobotWinner);
-void FigureOf8Animation();
\ No newline at end of file
+void FigureOf8Animation(bool robot, bool player, int numberOfRepitions);
+void CircleAnimation(bool robot, bool player, int numberOfRepitions);
+void DrainAnimation(bool robot, bool robotColour, int robotScore, bool player, bool playerColour, int playerScore);
+
+#endif
\ No newline at end of file