updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
Diff: main.cpp
- 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