updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
Revision 5:2d439ccefc7d, committed 2017-07-06
- 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
